X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcsynchronous.C;h=0bc4f104c3efb543381e7f79952895c6e0c3a55d;hp=35d4a1c1b03abe6c60c14f95c4edb8b6e43ca488;hb=8bd72f90925843be9ab9182c89761ee0640e7873;hpb=b3ab80e6d0aff2c9971b7837d6bea590f78c3189 diff --git a/cinelerra-5.1/guicast/bcsynchronous.C b/cinelerra-5.1/guicast/bcsynchronous.C index 35d4a1c1..0bc4f104 100644 --- a/cinelerra-5.1/guicast/bcsynchronous.C +++ b/cinelerra-5.1/guicast/bcsynchronous.C @@ -119,8 +119,8 @@ BC_Synchronous::~BC_Synchronous() { if( running() ) { quit(); - join(); } + join(); commands.remove_all_objects(); delete lock_sync; delete next_command; @@ -158,12 +158,9 @@ void BC_Synchronous::quit() { 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; } @@ -218,7 +215,8 @@ void BC_Synchronous::handle_command_base(BC_SynchronousCommand *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); @@ -367,7 +365,7 @@ void BC_Synchronous::dump_shader(unsigned int handle) 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(); @@ -376,6 +374,8 @@ void BC_Synchronous::delete_window(BC_WindowBase *window) command->glx_context = window->glx_win_context; send_garbage(command); + command->command_done->lock("BC_Synchronous::quit"); + delete command; #endif } @@ -384,7 +384,7 @@ void BC_Synchronous::delete_window_sync(BC_SynchronousCommand *command) #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); @@ -435,10 +435,12 @@ void BC_Synchronous::delete_window_sync(BC_SynchronousCommand *command) 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 } @@ -446,7 +448,7 @@ void BC_Synchronous::delete_window_sync(BC_SynchronousCommand *command) 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(); @@ -510,7 +512,8 @@ void BC_Synchronous::release_pbuffer(int window_id, GLXPbuffer pbuffer) 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->glx_pbuffer == pbuffer ) { ptr->in_use = 0; } } @@ -520,7 +523,7 @@ void BC_Synchronous::release_pbuffer(int window_id, GLXPbuffer pbuffer) 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();