several bug fixes and minor feature changes:
[goodguy/history.git] / cinelerra-5.0 / guicast / bcdialog.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
5  * 
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * 
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  * 
20  */
21
22 #include "bcdialog.h"
23 #include "bcsignals.h"
24 #include "condition.h"
25 #include "mutex.h"
26
27
28
29
30
31 BC_DialogThread::BC_DialogThread()
32  : Thread(0, 0, 0)
33 {
34         gui = 0;
35         startup_lock = new Condition(1, "BC_DialogThread::startup_lock");
36         window_lock = new Mutex("BC_DialogThread::window_lock");
37 }
38
39 BC_DialogThread::~BC_DialogThread()
40 {
41         startup_lock->lock("BC_DialogThread::~BC_DialogThread");
42         if(gui)
43         {
44                 gui->lock_window();
45                 gui->set_done(1);
46                 gui->unlock_window();
47         }
48         startup_lock->unlock();
49         cancel();
50         join();
51
52         delete startup_lock;
53         delete window_lock;
54 }
55
56 void BC_DialogThread::lock_window(const char *location)
57 {
58         window_lock->lock(location);
59 }
60
61 void BC_DialogThread::unlock_window()
62 {
63         window_lock->unlock();
64 }
65
66 int BC_DialogThread::is_running()
67 {
68         return Thread::running();
69 }
70
71 void BC_DialogThread::start()
72 {
73         if(Thread::running())
74         {
75                 window_lock->lock("BC_DialogThread::start");
76                 if(gui)
77                 {
78                         gui->lock_window("BC_DialogThread::start");
79                         gui->raise_window(1);
80                         gui->unlock_window();
81                 }
82                 window_lock->unlock();
83                 return;
84         }
85
86 // Don't allow anyone else to create the window
87         startup_lock->lock("BC_DialogThread::start");
88         Thread::start();
89
90 // Wait for startup
91         startup_lock->lock("BC_DialogThread::start");
92         startup_lock->unlock();
93         gui->init_wait();
94 }
95
96 void BC_DialogThread::run()
97 {
98         gui = new_gui();
99         startup_lock->unlock();
100         int result = gui->run_window();
101
102         handle_done_event(result);
103
104         window_lock->lock("BC_DialogThread::run");
105         delete gui;
106         gui = 0;
107         window_lock->unlock();
108
109         handle_close_event(result);
110 }
111
112 void BC_DialogThread::lock_gui(const char *location)
113 {
114         window_lock->lock(location);
115 }
116
117 void BC_DialogThread::unlock_gui()
118 {
119         window_lock->unlock();
120 }
121
122
123 BC_Window* BC_DialogThread::new_gui()
124 {
125         printf("BC_DialogThread::new_gui called\n");
126         return 0;
127 }
128
129 BC_Window* BC_DialogThread::get_gui()
130 {
131         return gui;
132 }
133
134 void BC_DialogThread::handle_done_event(int result)
135 {
136 }
137
138 void BC_DialogThread::handle_close_event(int result)
139 {
140 }
141
142 void BC_DialogThread::close_window()
143 {
144         lock_window("BC_DialogThread::close_window");
145         if(gui)
146         {
147                 gui->lock_window("BC_DialogThread::close_window");
148                 gui->set_done(1);
149                 gui->unlock_window();
150         }
151         unlock_window();
152 }
153
154
155
156