X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;ds=sidebyside;f=cinelerra-5.1%2Fguicast%2Fbcwindowbase.C;h=9f3e2123c843c7e0f336ae1d4c53105b03b04a71;hb=b89feee3b26be17a08bf1598618d4d7709a73cb9;hp=137b6790b5b8b68c2bb4120eb265054563b1f945;hpb=c8ada3e79b5bf9b8282bdcc8fe858f24c6ac0715;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/guicast/bcwindowbase.C b/cinelerra-5.1/guicast/bcwindowbase.C index 137b6790..9f3e2123 100644 --- a/cinelerra-5.1/guicast/bcwindowbase.C +++ b/cinelerra-5.1/guicast/bcwindowbase.C @@ -224,6 +224,7 @@ BC_WindowBase::~BC_WindowBase() } resize_history.remove_all_objects(); + delete grab_lock; #ifndef SINGLE_THREAD common_events.remove_all_objects(); @@ -346,6 +347,7 @@ int BC_WindowBase::initialize() event_condition = new Condition(0, "BC_WindowBase::event_condition"); init_lock = new Condition(0, "BC_WindowBase::init_lock"); #endif + grab_lock = new Mutex("BC_WindowBase::grab_lock"); cursor_timer = new Timer; event_thread = 0; @@ -959,10 +961,15 @@ if( debug && event->type != ClientMessage ) { } if( active_grab ) { + grab_lock->lock("BC_WindowBase::dispatch_event 3"); unlock_window(); - active_grab->lock_window("BC_WindowBase::dispatch_event 3"); - result = active_grab->grab_event(event); - active_grab->unlock_window(); + result = 0; + if( active_grab ) { + active_grab->lock_window("BC_WindowBase::dispatch_event 3"); + result = active_grab->grab_event(event); + active_grab->unlock_window(); + } + grab_lock->unlock(); if( result ) return result; lock_window("BC_WindowBase::dispatch_event 4"); } @@ -3415,28 +3422,36 @@ void BC_WindowBase::close(int return_value) int BC_WindowBase::grab(BC_WindowBase *window) { - int ret = 1; - if( window->active_grab ) { + int ret = 0; + BC_WindowBase *grab_window = window->active_grab; + if( grab_window ) { int locked = get_window_lock(); if( locked ) unlock_window(); - BC_WindowBase *active_grab = window->active_grab; - active_grab->lock_window("BC_WindowBase::grab(BC_WindowBase"); - ret = active_grab->handle_ungrab(); - active_grab->unlock_window(); + grab_window->lock_window("BC_WindowBase::grab(BC_WindowBase"); + grab_window->handle_ungrab(); + grab_window->unlock_window(); if( locked ) lock_window("BC_WindowBase::grab(BC_WindowBase"); } - if( ret ) { + window->grab_lock->lock("BC_WindowBase::grab"); + if( !window->active_grab ) { window->active_grab = this; this->grab_active = window; + ret = 1; } + window->grab_lock->unlock(); return ret; } int BC_WindowBase::ungrab(BC_WindowBase *window) { - if( this != window->active_grab ) return 0; - window->active_grab = 0; - this->grab_active = 0; - return 1; + int ret = 0; + window->grab_lock->lock("BC_WindowBase::ungrab"); + if( this == window->active_grab ) { + window->active_grab = 0; + this->grab_active = 0; + ret = 1; + } + window->grab_lock->unlock(); + return ret; } int BC_WindowBase::grab_event_count() {