fix for wm that use borders with non-zero widths
[goodguy/history.git] / cinelerra-5.1 / guicast / bcwindowbase.C
index a3719e59b1fab9160bf3da3a98a9e7bd652ebabe..f9eb98f20b18ee5d22609326afcc0382f7283125 100644 (file)
@@ -2338,6 +2338,9 @@ void BC_WindowBase::init_xft()
 {
 #ifdef HAVE_XFT
        if( !get_resources()->use_xft ) return;
+// apparently, xft is not reentrant, more than this is needed
+static Mutex xft_init_lock("BC_WindowBase::xft_init_lock", 0);
+xft_init_lock.lock("BC_WindowBase::init_xft");
        if(!(smallfont_xft =
                (resources.small_font_xft[0] == '-' ?
                        XftFontOpenXlfd(display, screen, resources.small_font_xft) :
@@ -2407,6 +2410,7 @@ void BC_WindowBase::init_xft()
        }
 // _XftDisplayInfo needs a lock.
        XftDefaultHasRender(display);
+xft_init_lock.unlock();
 #endif // HAVE_XFT
 }
 
@@ -3357,6 +3361,14 @@ int BC_WindowBase::ungrab(BC_WindowBase *window)
        this->grab_active = 0;
        return 1;
 }
+int BC_WindowBase::grab_event_count()
+{
+       int result = 0;
+#ifndef SINGLE_THREAD
+       result = grab_active->get_event_count();
+#endif
+       return result;
+}
 int BC_WindowBase::grab_buttons()
 {
        XSync(top_level->display, False);
@@ -3419,6 +3431,8 @@ BC_WindowBase::get_xinerama_info(int screen)
                return 0;
        }
        int top_x = get_x(), top_y = get_y();
+       if(  BC_DisplayInfo::left_border >= 0 ) top_x +=  BC_DisplayInfo::left_border;
+       if(  BC_DisplayInfo::top_border >= 0 ) top_y +=  BC_DisplayInfo::top_border;
        for( int i=0; i<xinerama_screens; ++i ) {
                int scr_y = top_y - xinerama_info[i].y_org;
                if( scr_y < 0 || scr_y >= xinerama_info[i].height ) continue;
@@ -3827,21 +3841,28 @@ int BC_WindowBase::match_window(Window win)
 
 int BC_WindowBase::get_cursor_over_window()
 {
-       if(top_level != this) return top_level->get_cursor_over_window();
-
        int abs_x, abs_y, win_x, win_y;
-       unsigned int temp_mask;
+       unsigned int mask_return;
        Window root_return, child_return;
 
-       int ret = XQueryPointer(display, win,
+       int ret = XQueryPointer(top_level->display, top_level->rootwin,
                &root_return, &child_return, &abs_x, &abs_y,
-               &win_x, &win_y, &temp_mask);
-//printf("BC_WindowBase::get_cursor_over_window %d %s 0x%x %d 0x%x\n",
-//  __LINE__, title, win, ret, child_return);
-
-       int result = !ret || child_return == None ? 0 :
-               match_window(child_return);
-       return result;
+               &win_x, &win_y, &mask_return);
+       if( ret && child_return == None ) ret = 0;
+       if( ret && win != child_return )
+               ret = top_level->match_window(child_return);
+// query pointer can return a window manager window with this top_level as a child
+//  for kde this can be two levels deep
+       unsigned int nchildren_return = 0;
+       Window parent_return, *children_return = 0;
+       Window top_win = top_level->win;
+       while( !ret && top_win != top_level->rootwin && top_win != root_return &&
+               XQueryTree(top_level->display, top_win, &root_return,
+                       &parent_return, &children_return, &nchildren_return) ) {
+               if( children_return ) XFree(children_return);
+               if( (top_win=parent_return) == child_return ) ret = 1;
+       }
+       return ret;
 }
 
 int BC_WindowBase::cursor_above()
@@ -4244,6 +4265,7 @@ int BC_WindowBase::load_defaults(BC_Hash *defaults)
        resources->filebox_columnwidth[1] = defaults->get("FILEBOX_WIDTH1", resources->filebox_columnwidth[1]);
        resources->filebox_columnwidth[2] = defaults->get("FILEBOX_WIDTH2", resources->filebox_columnwidth[2]);
        resources->filebox_columnwidth[3] = defaults->get("FILEBOX_WIDTH3", resources->filebox_columnwidth[3]);
+       resources->filebox_size_format = defaults->get("FILEBOX_SIZE_FORMAT", get_resources()->filebox_size_format);
        defaults->get("FILEBOX_FILTER", resources->filebox_filter);
        return 0;
 }
@@ -4271,6 +4293,7 @@ int BC_WindowBase::save_defaults(BC_Hash *defaults)
        defaults->update("FILEBOX_WIDTH2", resources->filebox_columnwidth[2]);
        defaults->update("FILEBOX_WIDTH3", resources->filebox_columnwidth[3]);
        defaults->update("FILEBOX_FILTER", resources->filebox_filter);
+       defaults->update("FILEBOX_SIZE_FORMAT", get_resources()->filebox_size_format);
        return 0;
 }