{
if( running() ) {
quit();
- join();
}
+ join();
commands.remove_all_objects();
delete lock_sync;
delete next_command;
{
if( !is_started ) return;
is_started = 0;
- BC_SynchronousCommand *command = new_command();
+ BC_SynchronousCommand *command = BC_Synchronous::new_command();
command->command = BC_SynchronousCommand::QUIT;
- command_lock->lock("BC_Synchronous::quit");
- commands.append(command);
- command_lock->unlock();
- next_command->unlock();
+ send_garbage(command);
command->command_done->lock("BC_Synchronous::quit");
delete command;
}
case BC_SynchronousCommand::DELETE_WINDOW:
delete_window_sync(command);
- break;
+ command->command_done->unlock();
+ return;
case BC_SynchronousCommand::DELETE_PIXMAP:
delete_pixmap_sync(command);
void BC_Synchronous::delete_window(BC_WindowBase *window)
{
#ifdef HAVE_GL
- BC_SynchronousCommand *command = new_command();
+ BC_SynchronousCommand *command = BC_Synchronous::new_command();
command->command = BC_SynchronousCommand::DELETE_WINDOW;
command->window_id = window->get_id();
command->display = window->get_display();
command->glx_context = window->glx_win_context;
send_garbage(command);
+ command->command_done->lock("BC_Synchronous::quit");
+ delete command;
#endif
}
#ifdef HAVE_GL
int window_id = command->window_id;
Display *display = command->display;
- Window win = command->win;
+// Window win = command->win;
GLXWindow glx_win = command->glx_win;
GLXContext glx_context = command->glx_context;
XLockDisplay(display);
table_lock->unlock();
- XDestroyWindow(display, win);
+ glXMakeContextCurrent(display, None, None, 0);
if( glx_context )
glXDestroyContext(display, glx_context);
- command->command_done->unlock();
+// causes xerror BadWindow (invalid Window parameter)
+// XDestroyWindow(display, glx_win);
+// win destroyed in bcwindowbase
XUnlockDisplay(display);
#endif
}
void BC_Synchronous::delete_display(BC_WindowBase *window)
{
#ifdef HAVE_GL
- BC_SynchronousCommand *command = new_command();
+ BC_SynchronousCommand *command = BC_Synchronous::new_command();
command->command = BC_SynchronousCommand::DELETE_DISPLAY;
command->display = window->get_display();
Display *display = command->display;
XLockDisplay(display);
XUnlockDisplay(display);
+ glXMakeContextCurrent(display, None, None, 0);
XCloseDisplay(display);
#endif
}
table_lock->lock("BC_Resources::release_textures");
for(int i = 0; i < pbuffer_ids.total; i++) {
PBufferID *ptr = pbuffer_ids.values[i];
- if(ptr->w == w && ptr->h == h && ptr->glx_pbuffer == glx_pbuffer) {
+ if( ptr->w == w && ptr->h == h && ptr->glx_pbuffer == glx_pbuffer ) {
exists = 1;
break;
}
}
-
if(!exists) {
PBufferID *ptr = new PBufferID(current_window->get_id(),
glx_pbuffer, glx_context, w, h);
table_lock->unlock();
}
-GLXPbuffer BC_Synchronous::get_pbuffer(int w,
- int h,
- int *window_id,
- GLXContext *glx_context)
+GLXPbuffer BC_Synchronous::get_pbuffer(int w, int h, GLXContext *glx_context)
{
table_lock->lock("BC_Resources::release_textures");
for(int i = 0; i < pbuffer_ids.total; i++) {
ptr->window_id == current_window->get_id() ) {
GLXPbuffer result = ptr->glx_pbuffer;
*glx_context = ptr->glx_context;
- *window_id = ptr->window_id;
ptr->in_use = 1;
table_lock->unlock();
return result;
table_lock->lock("BC_Resources::release_textures");
for(int i = 0; i < pbuffer_ids.total; i++) {
PBufferID *ptr = pbuffer_ids.values[i];
- if(ptr->window_id == window_id) {
+ if( ptr->window_id == window_id ) {
ptr->in_use = 0;
}
}
void BC_Synchronous::delete_pixmap(BC_WindowBase *window,
GLXPixmap glx_pixmap, GLXContext glx_context)
{
- BC_SynchronousCommand *command = new_command();
+ BC_SynchronousCommand *command = BC_Synchronous::new_command();
command->command = BC_SynchronousCommand::DELETE_PIXMAP;
command->window_id = window->get_id();
command->display = window->get_display();