diff --git a/uppsrc/CtrlCore/GtkWnd.cpp b/uppsrc/CtrlCore/GtkWnd.cpp index 148b1db3d..88acdbdd6 100644 --- a/uppsrc/CtrlCore/GtkWnd.cpp +++ b/uppsrc/CtrlCore/GtkWnd.cpp @@ -228,7 +228,15 @@ void Ctrl::SetAlpha(byte alpha) Rect Ctrl::GetWorkArea() const { GuiLock __; - return GetWorkArea(GetRect().TopLeft()); + static Array rc; + if(rc.IsEmpty()) + GetWorkArea(rc); + + Point pt = GetScreenRect().TopLeft(); + for (int i = 0; i < rc.GetCount(); i++) + if(rc[i].Contains(pt)) + return rc[i]; + return GetPrimaryWorkArea(); } void Ctrl::GetWorkArea(Array& rc) @@ -261,8 +269,9 @@ void Ctrl::GetWorkArea(Array& rc) Rect Ctrl::GetWorkArea(Point pt) { - Array rc; - GetWorkArea(rc); + static Array rc; + if(rc.IsEmpty()) + GetWorkArea(rc); for(int i = 0; i < rc.GetCount(); i++) if(rc[i].Contains(pt)) return rc[i]; @@ -271,30 +280,46 @@ Rect Ctrl::GetWorkArea(Point pt) Rect Ctrl::GetVirtualWorkArea() { - Rect out = GetPrimaryWorkArea(); - Array rc; - GetWorkArea(rc); - for(int i = 0; i < rc.GetCount(); i++) - out |= rc[i]; - return out; + GuiLock __; + static Rect r; + if(r.right == 0) { + r = GetPrimaryWorkArea(); + Array rc; + GetWorkArea(rc); + for(int i = 0; i < rc.GetCount(); i++) + r |= rc[i]; + } + return r; } Rect Ctrl::GetVirtualScreenArea() { GuiLock __; - gint x, y, width, height; - gdk_window_get_geometry(gdk_screen_get_root_window(gdk_screen_get_default()), - &x, &y, &width, &height, NULL); - return RectC(x, y, width, height); + static Rect r; + if(r.right == 0) { + gint x, y, width, height; + gdk_window_get_geometry(gdk_screen_get_root_window(gdk_screen_get_default()), + &x, &y, &width, &height, NULL); + r = RectC(x, y, width, height); + } + return r; } Rect Ctrl::GetPrimaryWorkArea() { GuiLock __; - int primary = gdk_screen_get_primary_monitor(gdk_screen_get_default()); - Array rc; - GetWorkArea(rc); - return primary >= 0 && primary < rc.GetCount() ? rc[primary] : GetVirtualScreenArea(); + static Rect r; + if (r.right == 0) { + Array rc; + GetWorkArea(rc); +#if GTK_CHECK_VERSION(2, 20, 0) + int primary = gdk_screen_get_primary_monitor(gdk_screen_get_default()); +#else + int primary = 0; +#endif + primary >= 0 && primary < rc.GetCount() ? r = rc[primary] : r = GetVirtualScreenArea(); + } + return r; } Rect Ctrl::GetPrimaryScreenArea() diff --git a/uppsrc/CtrlCore/X11App.cpp b/uppsrc/CtrlCore/X11App.cpp index 2e67adfa1..24ff799bc 100644 --- a/uppsrc/CtrlCore/X11App.cpp +++ b/uppsrc/CtrlCore/X11App.cpp @@ -489,7 +489,6 @@ Vector FindScreensStruts() Rect Ctrl::GetDefaultWindowRect() { GuiLock __; - static int width = 0; static int height = 0; static int left = 0; @@ -543,7 +542,7 @@ Rect Ctrl::GetWorkArea() const if (rc.IsEmpty()) GetWorkArea(rc); - Point pt = GetMousePos(); + Point pt = GetScreenRect().TopLeft(); for (int i = 0; i < rc.GetCount(); i++) if(rc[i].Contains(pt)) return rc[i]; @@ -564,7 +563,6 @@ Rect Ctrl::GetWorkArea(Point pt) Rect Ctrl::GetVirtualWorkArea() { GuiLock __; - static Rect r; if(r.right == 0) { Vector x = GetPropertyInts(Xroot, XAtom("_NET_WORKAREA")); @@ -584,12 +582,10 @@ Rect Ctrl::GetVirtualScreenArea() Rect Ctrl::GetPrimaryWorkArea() { GuiLock __; - static Rect r; if(r.right == 0) { - static Array rc; - if (rc.IsEmpty()) - GetWorkArea(rc); + Array rc; + GetWorkArea(rc); rc.GetCount() ? r = rc[0] : r = GetVirtualScreenArea(); } return r; @@ -598,7 +594,6 @@ Rect Ctrl::GetPrimaryWorkArea() Rect Ctrl::GetPrimaryScreenArea() { GuiLock __; - static Rect r; if(r.right == 0) { Vector screens = FindScreensResolutions();