fix for wm that use borders with non-zero widths
[goodguy/history.git] / cinelerra-5.1 / guicast / bcwindowbase.C
index b970cffde9d28366683f0fcd86b5ba5b80a6ff0d..f9eb98f20b18ee5d22609326afcc0382f7283125 100644 (file)
@@ -85,9 +85,8 @@ Window XGroupLeader = 0;
 Mutex BC_KeyboardHandlerLock::keyboard_listener_mutex("keyboard_listener",0);
 ArrayList<BC_KeyboardHandler*> BC_KeyboardHandler::listeners;
 
-BC_WindowBase::BC_WindowBase(int opts)
+BC_WindowBase::BC_WindowBase()
 {
-       this->options = opts;
 //printf("BC_WindowBase::BC_WindowBase 1\n");
        BC_WindowBase::initialize();
 }
@@ -147,13 +146,13 @@ BC_WindowBase::~BC_WindowBase()
 
        delete pixmap;
 
+//printf("delete glx=%08x, win=%08x %s\n", (unsigned)glx_win, (unsigned)win, title);
 #ifdef HAVE_GL
-       if( get_resources()->get_synchronous() &&
-               (top_level->options & GLX_WINDOW) && glx_win != 0 )
+       if( get_resources()->get_synchronous() && glx_win != 0 ) {
                get_resources()->get_synchronous()->delete_window(this);
-       else
+       }
 #endif
-               XDestroyWindow(top_level->display, win);
+       XDestroyWindow(top_level->display, win);
 
        if(bg_pixmap && !shared_bg_pixmap) delete bg_pixmap;
        if(icon_pixmap) delete icon_pixmap;
@@ -213,28 +212,15 @@ BC_WindowBase::~BC_WindowBase()
                        XvUngrabPort(display, xvideo_port_id, CurrentTime);
 
                unlock_window();
-// Can't close display if another thread is waiting for events.
-// Synchronous thread must delete display it owns a GLX_WINDOW
 // Must be last reference to display.
-#ifndef SINGLE_THREAD
-#ifdef HAVE_GL
-               if( (options & GLX_DISPLAY) != 0 && get_resources()->get_synchronous() ) {
-                       printf(_("BC_WindowBase::~BC_WindowBase window deleted but opengl deletion is not\n"
-                               "implemented for BC_Pixmap.\n"));
-                       get_resources()->get_synchronous()->delete_display(this);
-               }
-               else
-#endif
-               {
 // _XftDisplayInfo needs a lock.
-                       get_resources()->create_window_lock->lock("BC_WindowBase::~BC_WindowBase");
-                       XCloseDisplay(display);
-                       get_resources()->create_window_lock->unlock();
-               }
+               get_resources()->create_window_lock->lock("BC_WindowBase::~BC_WindowBase");
+               XCloseDisplay(display);
+               get_resources()->create_window_lock->unlock();
+
 // clipboard uses a different display connection
                clipboard->stop_clipboard();
                delete clipboard;
-#endif // SINGLE_THREAD
        }
 
        resize_history.remove_all_objects();
@@ -431,7 +417,7 @@ int BC_WindowBase::create_window(BC_WindowBase *parent_window, const char *title
        else
                this->display_name[0] = 0;
 
-       put_title(_(title));
+       put_title(title);
        if(bg_pixmap) shared_bg_pixmap = 1;
 
        subwindows = new BC_SubWindowList;
@@ -1033,6 +1019,10 @@ locking_message = event->xclient.message_type;
                break;
 
        case ButtonPress:
+               if(motion_events)
+               {
+                       dispatch_motion_event();
+               }
                get_key_masks(event->xbutton.state);
                cursor_x = event->xbutton.x;
                cursor_y = event->xbutton.y;
@@ -1077,6 +1067,10 @@ locking_message = event->xclient.message_type;
                break;
 
        case ButtonRelease:
+               if(motion_events)
+               {
+                       dispatch_motion_event();
+               }
                get_key_masks(event->xbutton.state);
                button_number = event->xbutton.button;
                event_win = event->xany.window;
@@ -2344,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) :
@@ -2413,6 +2410,7 @@ void BC_WindowBase::init_xft()
        }
 // _XftDisplayInfo needs a lock.
        XftDefaultHasRender(display);
+xft_init_lock.unlock();
 #endif // HAVE_XFT
 }
 
@@ -3363,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);
@@ -3425,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;
@@ -3833,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()
@@ -4140,7 +4155,7 @@ void BC_WindowBase::put_title(const char *text)
 void BC_WindowBase::set_title(const char *text, int utf8)
 {
 // utf8>0: wm + net_wm, utf8=0: wm only,  utf<0: net_wm only
-       put_title(_(text));
+       put_title(text);
        const unsigned char *wm_title = (const unsigned char *)title;
        int title_len = strlen((const char *)title);
        if( utf8 >= 0 ) {
@@ -4250,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;
 }
@@ -4277,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;
 }