X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcwindowbase.C;h=137b6790b5b8b68c2bb4120eb265054563b1f945;hp=a2cccd2cf4da8abac6f37276c0af1ce4516aeabf;hb=c8ada3e79b5bf9b8282bdcc8fe858f24c6ac0715;hpb=3a7f190f52e534135f81fa84ec7be5a5beac257b diff --git a/cinelerra-5.1/guicast/bcwindowbase.C b/cinelerra-5.1/guicast/bcwindowbase.C index a2cccd2c..137b6790 100644 --- a/cinelerra-5.1/guicast/bcwindowbase.C +++ b/cinelerra-5.1/guicast/bcwindowbase.C @@ -3415,14 +3415,25 @@ void BC_WindowBase::close(int return_value) int BC_WindowBase::grab(BC_WindowBase *window) { - if( window->active_grab && this != window->active_grab ) return 0; - window->active_grab = this; - this->grab_active = window; - return 1; + int ret = 1; + if( window->active_grab ) { + 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(); + if( locked ) lock_window("BC_WindowBase::grab(BC_WindowBase"); + } + if( ret ) { + window->active_grab = this; + this->grab_active = window; + } + return ret; } int BC_WindowBase::ungrab(BC_WindowBase *window) { - if( window->active_grab && this != window->active_grab ) return 0; + if( this != window->active_grab ) return 0; window->active_grab = 0; this->grab_active = 0; return 1;