From 7aa48e19b9971c6ce902002c1421223a84a1a447 Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Sat, 12 Mar 2011 21:36:21 +0000 Subject: Fix STR #2575: use the screen that intersects most of the window when made fullscreen. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@8515 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- FL/Fl.H | 3 ++- src/Fl_Window_fullscreen.cxx | 5 ++++- src/screen_xywh.cxx | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/FL/Fl.H b/FL/Fl.H index 8194ee655..99ed4c044 100644 --- a/FL/Fl.H +++ b/FL/Fl.H @@ -784,7 +784,8 @@ public: screen_xywh(X, Y, W, H, e_x_root, e_y_root); } static void screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my); - static void screen_xywh(int &X, int &Y, int &W, int &H, int n); + static void screen_xywh(int &X, int &Y, int &W, int &H, int n); + static void screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my, int mw, int mh); static void screen_dpi(float &h, float &v, int n=0); /** @} */ diff --git a/src/Fl_Window_fullscreen.cxx b/src/Fl_Window_fullscreen.cxx index 90a2fc924..629dd7e33 100644 --- a/src/Fl_Window_fullscreen.cxx +++ b/src/Fl_Window_fullscreen.cxx @@ -68,13 +68,16 @@ void Fl_Window::fullscreen() { #endif #if defined(__APPLE__) || defined(WIN32) || defined(USE_X11) int sx, sy, sw, sh; - Fl::screen_xywh(sx, sy, sw, sh, x()+w()/2, y()+h()/2); + Fl::screen_xywh(sx, sy, sw, sh, x(), y(), w(), h()); // if we are on the main screen, we will leave the system menu bar unobstructed if (Fl::x()>=sx && Fl::y()>=sy && Fl::x()+Fl::w()<=sx+sw && Fl::y()+Fl::h()<=sy+sh) { sx = Fl::x(); sy = Fl::y(); sw = Fl::w(); sh = Fl::h(); } if (x()==sx) x(sx+1); // make sure that we actually execute the resize +#if defined(USE_X11) + resize(0, 0, w(), h()); // work around some quirks in X11 +#endif resize(sx, sy, sw, sh); #else if (!x()) x(1); // make sure that we actually execute the resize diff --git a/src/screen_xywh.cxx b/src/screen_xywh.cxx index 9ed788d0b..3cac43fbb 100644 --- a/src/screen_xywh.cxx +++ b/src/screen_xywh.cxx @@ -284,6 +284,41 @@ void Fl::screen_xywh(int &X, int &Y, int &W, int &H, int n) { H = Fl::h(); } +static inline float fl_intersection(int x1, int y1, int w1, int h1, + int x2, int y2, int w2, int h2) { + if(x1+w1 < x2 || x2+w2 < x1 || y1+h1 < y2 || y2+h2 < y1) + return 0.; + int int_left = x1 > x2 ? x1 : x2; + int int_right = x1+w1 > x2+w2 ? x2+w2 : x1+w1; + int int_top = y1 > y2 ? y1 : y2; + int int_bottom = y1+h1 > y2+h2 ? y2+h2 : y1+h1; + return (float)(int_right - int_left) * (int_bottom - int_top); +} + +/** + Gets the screen bounding rect for the screen + which intersects the most with the rectangle + defined by \p mx, \p my, \p mw, \p mh. + \param[out] X,Y,W,H the corresponding screen bounding box + \param[in] mx, my, mw, mh the rectangle to search for intersection with + \see void screen_xywh(int &X, int &Y, int &W, int &H, int n) + */ +void Fl::screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my, int mw, int mh) { + int best_screen = 0; + float best_intersection = 0.; + for(int i = 0; i < Fl::screen_count(); i++) { + int sx, sy, sw, sh; + Fl::screen_xywh(sx, sy, sw, sh, i); + float sintersection = fl_intersection(mx, my, mw, mh, sx, sy, sw, sh); + if(sintersection > best_intersection) { + best_screen = i; + best_intersection = sintersection; + } + } + screen_xywh(X, Y, W, H, best_screen); +} + + /** Gets the screen resolution in dots-per-inch for the given screen. -- cgit v1.2.3