- if( window->active_grab && this != window->active_grab ) return 0;
- window->active_grab = this;
- this->grab_active = window;
- return 1;
+ int ret = 0;
+ BC_WindowBase *grab_window = window->active_grab;
+ if( grab_window ) {
+ int locked = get_window_lock();
+ if( locked ) 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");
+ }
+ 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;