xref: /haiku/src/libs/print/libprint/DialogWindow.cpp (revision 21258e2674226d6aa732321b6f8494841895af5f)
1 /*
2  * DialogWindow.h
3  * Copyright 2004 Michael Pfeiffer. All Rights Reserved.
4  */
5 
6 #include "DialogWindow.h"
7 
8 #include <Messenger.h>
9 
10 DialogWindow::DialogWindow(BRect frame,
11 			const char *title,
12 			window_type type,
13 			uint32 flags,
14 			uint32 workspace)
15 	: BWindow(frame, title, type, flags, workspace)
16 	, fPreviousResult(B_OK)
17 	, fResult(NULL)
18 {
19 	// nothing to do
20 }
21 
22 DialogWindow::DialogWindow(BRect frame,
23 			const char *title,
24 			window_look look,
25 			window_feel feel,
26 			uint32 flags,
27 			uint32 workspace)
28 	: BWindow(frame, title, look, feel, flags, workspace)
29 	, fPreviousResult(B_OK)
30 	, fResult(NULL)
31 {
32 	// nothing to do
33 }
34 
35 void DialogWindow::MessageReceived(BMessage *msg)
36 {
37 	if (msg->what == kGetThreadId) {
38 		BMessage reply;
39 		reply.AddInt32("thread_id", Thread());
40 		msg->SendReply(&reply);
41 		return;
42 	}
43 	BWindow::MessageReceived(msg);
44 }
45 
46 status_t DialogWindow::Go()
47 {
48 	BMessenger messenger(this, this);
49 	// store result in local variable and
50 	// initialize it with previous result
51 	volatile status_t result = fPreviousResult;
52 	// new results are stored on the stack
53 	fResult = &result;
54 
55 	// show the window
56 	Show();
57 	// at this point we must not access member variables,
58 	// because this object (the window) could already be deleted.
59 
60 	// get thread id of window thread
61 	BMessage reply;
62 	if (messenger.SendMessage(kGetThreadId, &reply) != B_OK) {
63 		return B_ERROR;
64 	}
65 	thread_id windowThread;
66 	if (reply.FindInt32("thread_id", &windowThread) != B_OK) {
67 		return B_ERROR;
68 	}
69 
70 	// wait for window thread to die
71 	// The window thread will crash if the image holding the
72 	// code used by the window thread is unloaded while the thread is
73 	// still running!!!
74 	status_t status = B_ERROR;
75 	wait_for_thread(windowThread, &status);
76 
77 	return result;
78 }
79 
80 void DialogWindow::SetResult(status_t result)
81 {
82 	if (fResult != NULL) {
83 		*fResult = result;
84 	} else {
85 		fPreviousResult = result;
86 	}
87 }
88 
89