improve delays created by vicon drawing locks, reset_cache segv fix, gang track toolt...
[goodguy/cinelerra.git] / cinelerra-5.1 / guicast / bcwindowbase.C
index a35645ad05d707ecac9c1d2b68b33d8c86530a3e..137b6790b5b8b68c2bb4120eb265054563b1f945 100644 (file)
@@ -1022,8 +1022,8 @@ if( debug && event->type != ClientMessage ) {
 
 //printf("BC_WindowBase::dispatch_event %d %d\n", __LINE__, button_number);
                event_win = event->xany.window;
-               if (button_number < 6) {
-                       if(button_number < 4)
+               if( button_number < 6 ) {
+                       if( button_number < 4 )
                                button_down = 1;
                        button_pressed = event->xbutton.button;
                        button_time1 = button_time2;
@@ -1036,23 +1036,20 @@ if( debug && event->type != ClientMessage ) {
                        drag_x2 = cursor_x + get_resources()->drag_radius;
                        drag_y1 = cursor_y - get_resources()->drag_radius;
                        drag_y2 = cursor_y + get_resources()->drag_radius;
-
-                       if((long)(button_time3 - button_time1) < resources->double_click * 2)
-                       {
-                               triple_click = 1;
-                               button_time3 = button_time2 = button_time1 = 0;
-                       }
-                       if((long)(button_time3 - button_time2) < resources->double_click)
-                       {
-                               double_click = 1;
-//                             button_time3 = button_time2 = button_time1 = 0;
-                       }
-                       else
-                       {
-                               triple_click = 0;
-                               double_click = 0;
+                       if( button_number < 4 ) {
+                               if((long)(button_time3 - button_time1) < resources->double_click * 2) {
+                                       triple_click = 1;
+                                       button_time3 = button_time2 = button_time1 = 0;
+                               }
+                               if((long)(button_time3 - button_time2) < resources->double_click) {
+                                       double_click = 1;
+//                                     button_time3 = button_time2 = button_time1 = 0;
+                               }
+                               else {
+                                       triple_click = 0;
+                                       double_click = 0;
+                               }
                        }
-
                        dispatch_button_press();
                }
                break;
@@ -3418,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;
@@ -3910,9 +3918,9 @@ void BC_WindowBase::get_pop_cursor(int &px, int &py, int lock_window)
        get_abs_cursor(px, py, lock_window);
        if( px < xmargin ) px = xmargin;
        if( py < ymargin ) py = ymargin;
-       int wd = get_screen_w(lock_window,-1) - xmargin;
+       int wd = get_screen_x(lock_window,-1) + get_screen_w(lock_window,-1) - xmargin;
        if( px > wd ) px = wd;
-       int ht = get_screen_h(lock_window,-1) - ymargin;
+       int ht = get_screen_y(lock_window,-1) + get_screen_h(lock_window,-1) - ymargin;
        if( py > ht ) py = ht;
 }
 int BC_WindowBase::get_pop_cursor_x(int lock_window)
@@ -4360,6 +4368,10 @@ void BC_WindowBase::init_resources(float scale)
                int wx, wy, ww, wh;
                int cins = info.xinerama_big_screen();
                if( !info.xinerama_geometry(cins, wx, wy, ww, wh) ) {
+                       int sh = ww * 9 / 16;
+                       int sw = wh * 16 / 9;
+                       if( sw < ww ) ww = sw;
+                       if( sh < wh ) wh = sh;
                        if( (x_scale = ww/1920.) < 1 ) x_scale = 1;
                        if( (y_scale = wh/1080.) < 1 ) y_scale = 1;
                }