X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcsynchronous.C;h=0bc4f104c3efb543381e7f79952895c6e0c3a55d;hb=HEAD;hp=a8eccf2356298c07765b52a5419f39a2f7ad8302;hpb=50a589b1decdd353a984d8a710e064ebaf8b4f7b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bcsynchronous.C b/cinelerra-5.1/guicast/bcsynchronous.C index a8eccf23..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(); @@ -473,13 +475,12 @@ void BC_Synchronous::put_pbuffer(int w, int h, 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); @@ -488,10 +489,7 @@ void BC_Synchronous::put_pbuffer(int w, int 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++) { @@ -500,7 +498,6 @@ GLXPbuffer BC_Synchronous::get_pbuffer(int w, 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; @@ -515,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; } } @@ -525,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();