123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468 |
- diff -urp fltk-1.3.2.org/FL/Fl_Window.H fltk-1.3.2/FL/Fl_Window.H
- --- fltk-1.3.2.org/FL/Fl_Window.H 2013-01-16 10:52:33.017228122 +0100
- +++ fltk-1.3.2/FL/Fl_Window.H 2013-01-16 10:52:47.876478968 +0100
- @@ -54,7 +54,7 @@ class Fl_RGB_Image;
- class FL_EXPORT Fl_Window : public Fl_Group {
-
- static char *default_xclass_;
- - // Note: we must use separate statements for each of the following 4 variables,
- + // Note: we must use separate statements for each of the following 8 variables,
- // with the static attribute, otherwise MS VC++ 2008/2010 complains :-(
- // AlbrechtS 04/2012
- #if FLTK_ABI_VERSION < 10301
- @@ -73,6 +73,22 @@ class FL_EXPORT Fl_Window : public Fl_Gr
- static // when these members are static, ABI compatibility with 1.3.0 is respected
- #endif
- int no_fullscreen_h;
- +#if FLTK_ABI_VERSION < 10302
- + static // when these members are static, ABI compatibility with 1.3.0 is respected
- +#endif
- + int fullscreen_screen_top;
- +#if FLTK_ABI_VERSION < 10302
- + static // when these members are static, ABI compatibility with 1.3.0 is respected
- +#endif
- + int fullscreen_screen_bottom;
- +#if FLTK_ABI_VERSION < 10302
- + static // when these members are static, ABI compatibility with 1.3.0 is respected
- +#endif
- + int fullscreen_screen_left;
- +#if FLTK_ABI_VERSION < 10302
- + static // when these members are static, ABI compatibility with 1.3.0 is respected
- +#endif
- + int fullscreen_screen_right;
-
- friend class Fl_X;
- Fl_X *i; // points at the system-specific stuff
- @@ -430,13 +446,15 @@ public:
- */
- void show(int argc, char **argv);
- /**
- - Makes the window completely fill the screen, without any window
- - manager border visible. You must use fullscreen_off() to undo
- - this.
- + Makes the window completely fill one or more screens, without any
- + window manager border visible. You must use fullscreen_off() to
- + undo this.
-
- \note On some platforms, this can result in the keyboard being
- grabbed. The window may also be recreated, meaning hide() and
- show() will be called.
- +
- + \see void Fl_Window::fullscreen_screens()
- */
- void fullscreen();
- /**
- @@ -453,6 +471,17 @@ public:
- */
- unsigned int fullscreen_active() const { return flags() & FULLSCREEN; }
- /**
- + Sets which screens should be used when this window is in fullscreen
- + mode. The window will be resized to the top of the screen with index
- + \p top, the bottom of the screen with index \p bottom, etc.
- +
- + If this method is never called, or if any argument is < 0, then the
- + window will be resized to fill the screen it is currently on.
- +
- + \see void Fl_Window::fullscreen()
- + */
- + void fullscreen_screens(int top, int bottom, int left, int right);
- + /**
- Iconifies the window. If you call this when shown() is false
- it will show() it as an icon. If the window is already
- iconified this does nothing.
- diff -urp fltk-1.3.2.org/FL/win32.H fltk-1.3.2/FL/win32.H
- --- fltk-1.3.2.org/FL/win32.H 2013-01-16 10:52:33.017228122 +0100
- +++ fltk-1.3.2/FL/win32.H 2013-01-16 10:52:47.876478968 +0100
- @@ -80,6 +80,7 @@ public:
- static Fl_X* i(const Fl_Window* w) {return w->i;}
- static int fake_X_wm(const Fl_Window* w,int &X, int &Y,
- int &bt,int &bx,int &by);
- + void make_fullscreen(int X, int Y, int W, int H);
- void setwindow(Fl_Window* wi) {w=wi; wi->i=this;}
- void flush() {w->flush();}
- void set_minmax(LPMINMAXINFO minmax);
- diff -urp fltk-1.3.2.org/src/Fl_cocoa.mm fltk-1.3.2/src/Fl_cocoa.mm
- --- fltk-1.3.2.org/src/Fl_cocoa.mm 2013-01-16 10:52:33.014229574 +0100
- +++ fltk-1.3.2/src/Fl_cocoa.mm 2013-01-16 10:52:47.877480606 +0100
- @@ -2438,9 +2438,32 @@ void Fl_X::make(Fl_Window* w)
-
- NSRect crect;
- if (w->fullscreen_active()) {
- - int sx, sy, sw, sh;
- - Fl::screen_xywh(sx, sy, sw, sh, w->x(), w->y(), w->w(), w->h());
- - w->resize(sx, sy, sw, sh);
- + int top, bottom, left, right;
- + int sx, sy, sw, sh, X, Y, W, H;
- +
- + top = w->fullscreen_screen_top;
- + bottom = w->fullscreen_screen_bottom;
- + left = w->fullscreen_screen_left;
- + right = w->fullscreen_screen_right;
- +
- + if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
- + top = Fl::screen_num(w->x(), w->y(), w->w(), w->h());
- + bottom = top;
- + left = top;
- + right = top;
- + }
- +
- + Fl::screen_xywh(sx, sy, sw, sh, top);
- + Y = sy;
- + Fl::screen_xywh(sx, sy, sw, sh, bottom);
- + H = sy + sh - Y;
- + Fl::screen_xywh(sx, sy, sw, sh, left);
- + X = sx;
- + Fl::screen_xywh(sx, sy, sw, sh, right);
- + W = sx + sw - X;
- +
- + w->resize(X, Y, W, H);
- +
- winstyle = NSBorderlessWindowMask;
- winlevel = NSStatusWindowLevel;
- }
- diff -urp fltk-1.3.2.org/src/Fl_win32.cxx fltk-1.3.2/src/Fl_win32.cxx
- --- fltk-1.3.2.org/src/Fl_win32.cxx 2013-01-16 10:52:33.019230734 +0100
- +++ fltk-1.3.2/src/Fl_win32.cxx 2013-01-16 10:52:47.878480504 +0100
- @@ -1493,7 +1493,6 @@ int Fl_X::fake_X_wm(const Fl_Window* w,i
- Y+=yoff;
-
- if (w->fullscreen_active()) {
- - X = Y = 0;
- bx = by = bt = 0;
- }
-
- @@ -1547,19 +1546,42 @@ void Fl_Window::resize(int X,int Y,int W
- }
- }
-
- -static void make_fullscreen(Fl_Window *w, Window xid, int X, int Y, int W, int H) {
- +void Fl_X::make_fullscreen(int X, int Y, int W, int H) {
- + int top, bottom, left, right;
- int sx, sy, sw, sh;
- - Fl::screen_xywh(sx, sy, sw, sh, X, Y, W, H);
- +
- + top = w->fullscreen_screen_top;
- + bottom = w->fullscreen_screen_bottom;
- + left = w->fullscreen_screen_left;
- + right = w->fullscreen_screen_right;
- +
- + if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
- + top = Fl::screen_num(X, Y, W, H);
- + bottom = top;
- + left = top;
- + right = top;
- + }
- +
- + Fl::screen_xywh(sx, sy, sw, sh, top);
- + Y = sy;
- + Fl::screen_xywh(sx, sy, sw, sh, bottom);
- + H = sy + sh - Y;
- + Fl::screen_xywh(sx, sy, sw, sh, left);
- + X = sx;
- + Fl::screen_xywh(sx, sy, sw, sh, right);
- + W = sx + sw - X;
- +
- DWORD flags = GetWindowLong(xid, GWL_STYLE);
- flags = flags & ~(WS_THICKFRAME|WS_CAPTION);
- SetWindowLong(xid, GWL_STYLE, flags);
- +
- // SWP_NOSENDCHANGING is so that we can override size limits
- - SetWindowPos(xid, HWND_TOP, sx, sy, sw, sh, SWP_NOSENDCHANGING | SWP_FRAMECHANGED);
- + SetWindowPos(xid, HWND_TOP, X, Y, W, H, SWP_NOSENDCHANGING | SWP_FRAMECHANGED);
- }
-
- void Fl_Window::fullscreen_x() {
- _set_fullscreen();
- - make_fullscreen(this, fl_xid(this), x(), y(), w(), h());
- + i->make_fullscreen(x(), y(), w(), h());
- Fl::handle(FL_FULLSCREEN, this);
- }
-
- @@ -1814,8 +1836,8 @@ Fl_X* Fl_X::make(Fl_Window* w) {
- monitor the window was placed on. */
- RECT rect;
- GetWindowRect(x->xid, &rect);
- - make_fullscreen(w, x->xid, rect.left, rect.top,
- - rect.right - rect.left, rect.bottom - rect.top);
- + x->make_fullscreen(rect.left, rect.top,
- + rect.right - rect.left, rect.bottom - rect.top);
- }
-
- x->next = Fl_X::first;
- diff -urp fltk-1.3.2.org/src/Fl_Window_fullscreen.cxx fltk-1.3.2/src/Fl_Window_fullscreen.cxx
- --- fltk-1.3.2.org/src/Fl_Window_fullscreen.cxx 2012-11-06 21:46:14.000000000 +0100
- +++ fltk-1.3.2/src/Fl_Window_fullscreen.cxx 2013-01-16 10:52:47.879480608 +0100
- @@ -36,6 +36,10 @@ int Fl_Window::no_fullscreen_x = 0;
- int Fl_Window::no_fullscreen_y = 0;
- int Fl_Window::no_fullscreen_w = 0;
- int Fl_Window::no_fullscreen_h = 0;
- +int Fl_Window::fullscreen_screen_top = -1;
- +int Fl_Window::fullscreen_screen_bottom = -1;
- +int Fl_Window::fullscreen_screen_left = -1;
- +int Fl_Window::fullscreen_screen_right = -1;
- #endif
-
- void Fl_Window::border(int b) {
- @@ -95,6 +99,23 @@ void Fl_Window::fullscreen_off() {
- fullscreen_off(no_fullscreen_x, no_fullscreen_y, no_fullscreen_w, no_fullscreen_h);
- }
-
- +void Fl_Window::fullscreen_screens(int top, int bottom, int left, int right) {
- + if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
- + fullscreen_screen_top = -1;
- + fullscreen_screen_bottom = -1;
- + fullscreen_screen_left = -1;
- + fullscreen_screen_right = -1;
- + } else {
- + fullscreen_screen_top = top;
- + fullscreen_screen_bottom = bottom;
- + fullscreen_screen_left = left;
- + fullscreen_screen_right = right;
- + }
- +
- + if (shown() && (flags() & Fl_Widget::FULLSCREEN))
- + fullscreen_x();
- +}
- +
-
- //
- // End of "$Id: Fl_Window_fullscreen.cxx 9706 2012-11-06 20:46:14Z matt $".
- diff -urp fltk-1.3.2.org/src/Fl_x.cxx fltk-1.3.2/src/Fl_x.cxx
- --- fltk-1.3.2.org/src/Fl_x.cxx 2013-01-16 10:52:33.020228202 +0100
- +++ fltk-1.3.2/src/Fl_x.cxx 2013-01-16 10:52:47.880480556 +0100
- @@ -344,6 +344,7 @@ Atom fl_NET_WM_ICON_NAME; // utf8 aware
- Atom fl_NET_SUPPORTING_WM_CHECK;
- Atom fl_NET_WM_STATE;
- Atom fl_NET_WM_STATE_FULLSCREEN;
- +Atom fl_NET_WM_FULLSCREEN_MONITORS;
- Atom fl_NET_WORKAREA;
- Atom fl_NET_WM_ICON;
-
- @@ -709,6 +710,7 @@ void fl_open_display(Display* d) {
- fl_NET_SUPPORTING_WM_CHECK = XInternAtom(d, "_NET_SUPPORTING_WM_CHECK", 0);
- fl_NET_WM_STATE = XInternAtom(d, "_NET_WM_STATE", 0);
- fl_NET_WM_STATE_FULLSCREEN = XInternAtom(d, "_NET_WM_STATE_FULLSCREEN", 0);
- + fl_NET_WM_FULLSCREEN_MONITORS = XInternAtom(d, "_NET_WM_FULLSCREEN_MONITORS", 0);
- fl_NET_WORKAREA = XInternAtom(d, "_NET_WORKAREA", 0);
- fl_NET_WM_ICON = XInternAtom(d, "_NET_WM_ICON", 0);
-
- @@ -1872,22 +1874,30 @@ void Fl_Window::resize(int X,int Y,int W
- #define _NET_WM_STATE_ADD 1 /* add/set property */
- #define _NET_WM_STATE_TOGGLE 2 /* toggle property */
-
- -static void send_wm_state_event(Window wnd, int add, Atom prop) {
- +static void send_wm_event(Window wnd, Atom message,
- + unsigned long d0, unsigned long d1=0,
- + unsigned long d2=0, unsigned long d3=0,
- + unsigned long d4=0) {
- XEvent e;
- e.xany.type = ClientMessage;
- e.xany.window = wnd;
- - e.xclient.message_type = fl_NET_WM_STATE;
- + e.xclient.message_type = message;
- e.xclient.format = 32;
- - e.xclient.data.l[0] = add ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE;
- - e.xclient.data.l[1] = prop;
- - e.xclient.data.l[2] = 0;
- - e.xclient.data.l[3] = 0;
- - e.xclient.data.l[4] = 0;
- + e.xclient.data.l[0] = d0;
- + e.xclient.data.l[1] = d1;
- + e.xclient.data.l[2] = d2;
- + e.xclient.data.l[3] = d3;
- + e.xclient.data.l[4] = d4;
- XSendEvent(fl_display, RootWindow(fl_display, fl_screen),
- 0, SubstructureNotifyMask | SubstructureRedirectMask,
- &e);
- }
-
- +static void send_wm_state_event(Window wnd, int add, Atom prop) {
- + send_wm_event(wnd, fl_NET_WM_STATE,
- + add ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE, prop);
- +}
- +
- int Fl_X::ewmh_supported() {
- static int result = -1;
-
- @@ -1911,6 +1921,22 @@ int Fl_X::ewmh_supported() {
- /* Change an existing window to fullscreen */
- void Fl_Window::fullscreen_x() {
- if (Fl_X::ewmh_supported()) {
- + int top, bottom, left, right;
- +
- + top = fullscreen_screen_top;
- + bottom = fullscreen_screen_bottom;
- + left = fullscreen_screen_left;
- + right = fullscreen_screen_right;
- +
- + if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
- + top = Fl::screen_num(x(), y(), w(), h());
- + bottom = top;
- + left = top;
- + right = top;
- + }
- +
- + send_wm_event(fl_xid(this), fl_NET_WM_FULLSCREEN_MONITORS,
- + top, bottom, left, right);
- send_wm_state_event(fl_xid(this), 1, fl_NET_WM_STATE_FULLSCREEN);
- } else {
- _set_fullscreen();
- @@ -1997,7 +2023,7 @@ void Fl_X::make_xid(Fl_Window* win, XVis
- // force the window to be on-screen. Usually the X window manager
- // does this, but a few don't, so we do it here for consistency:
- int scr_x, scr_y, scr_w, scr_h;
- - Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h, X, Y);
- + Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h, X, Y, W, H);
-
- if (win->border()) {
- // ensure border is on screen:
- @@ -2026,6 +2052,23 @@ void Fl_X::make_xid(Fl_Window* win, XVis
- return;
- }
-
- + // Compute which screen(s) we should be on if we want to go fullscreen
- + int fullscreen_top, fullscreen_bottom, fullscreen_left, fullscreen_right;
- +
- + fullscreen_top = win->fullscreen_screen_top;
- + fullscreen_bottom = win->fullscreen_screen_bottom;
- + fullscreen_left = win->fullscreen_screen_left;
- + fullscreen_right = win->fullscreen_screen_right;
- +
- + if ((fullscreen_top < 0) || (fullscreen_bottom < 0) ||
- + (fullscreen_left < 0) || (fullscreen_right < 0)) {
- + fullscreen_top = Fl::screen_num(X, Y, W, H);
- + fullscreen_bottom = fullscreen_top;
- + fullscreen_left = fullscreen_top;
- + fullscreen_right = fullscreen_top;
- + }
- +
- +
- ulong root = win->parent() ?
- fl_xid(win->window()) : RootWindow(fl_display, fl_screen);
-
- @@ -2049,9 +2092,17 @@ void Fl_X::make_xid(Fl_Window* win, XVis
- // border, and cannot grab without an existing window. Besides,
- // there is no clear_override().
- if (win->flags() & Fl_Widget::FULLSCREEN && !Fl_X::ewmh_supported()) {
- + int sx, sy, sw, sh;
- attr.override_redirect = 1;
- mask |= CWOverrideRedirect;
- - Fl::screen_xywh(X, Y, W, H, X, Y, W, H);
- + Fl::screen_xywh(sx, sy, sw, sh, fullscreen_left);
- + X = sx;
- + Fl::screen_xywh(sx, sy, sw, sh, fullscreen_right);
- + W = sx + sw - X;
- + Fl::screen_xywh(sx, sy, sw, sh, fullscreen_top);
- + Y = sy;
- + Fl::screen_xywh(sx, sy, sw, sh, fullscreen_bottom);
- + H = sy + sh - Y;
- }
-
- if (fl_background_pixel >= 0) {
- @@ -2122,6 +2173,13 @@ void Fl_X::make_xid(Fl_Window* win, XVis
-
- // If asked for, create fullscreen
- if (win->flags() & Fl_Widget::FULLSCREEN && Fl_X::ewmh_supported()) {
- + unsigned long data[4];
- + data[0] = fullscreen_top;
- + data[1] = fullscreen_bottom;
- + data[2] = fullscreen_left;
- + data[3] = fullscreen_right;
- + XChangeProperty (fl_display, xp->xid, fl_NET_WM_FULLSCREEN_MONITORS, XA_ATOM, 32,
- + PropModeReplace, (unsigned char*) data, 4);
- XChangeProperty (fl_display, xp->xid, fl_NET_WM_STATE, XA_ATOM, 32,
- PropModeAppend, (unsigned char*) &fl_NET_WM_STATE_FULLSCREEN, 1);
- }
- diff -urp fltk-1.3.2.org/test/fullscreen.cxx fltk-1.3.2/test/fullscreen.cxx
- --- fltk-1.3.2.org/test/fullscreen.cxx 2012-06-14 17:09:46.000000000 +0200
- +++ fltk-1.3.2/test/fullscreen.cxx 2013-01-16 10:52:47.881104801 +0100
- @@ -127,7 +127,7 @@ class fullscreen_window : public Fl_Sing
- fullscreen_window(int W, int H, const char *t=0);
- int handle (int e);
- Fl_Toggle_Light_Button *b3;
- -
- + Fl_Toggle_Light_Button *b4;
- };
-
- fullscreen_window::fullscreen_window(int W, int H, const char *t) : Fl_Single_Window(W, H, t) {
- @@ -170,23 +170,54 @@ void border_cb(Fl_Widget *o, void *p) {
- #endif
- }
-
- -int px,py,pw,ph;
- Fl_Button *border_button;
- void fullscreen_cb(Fl_Widget *o, void *p) {
- Fl_Window *w = (Fl_Window *)p;
- int d = ((Fl_Button *)o)->value();
- if (d) {
- - px = w->x();
- - py = w->y();
- - pw = w->w();
- - ph = w->h();
- + if (((fullscreen_window*)w)->b4->value()) {
- + int top, bottom, left, right;
- + int top_y, bottom_y, left_x, right_x;
- +
- + int sx, sy, sw, sh;
- +
- + top = bottom = left = right = 0;
- +
- + Fl::screen_xywh(sx, sy, sw, sh, 0);
- + top_y = sy;
- + bottom_y = sy + sh;
- + left_x = sx;
- + right_x = sx + sw;
- +
- + for (int i = 1;i < Fl::screen_count();i++) {
- + Fl::screen_xywh(sx, sy, sw, sh, i);
- + if (sy < top_y) {
- + top = i;
- + top_y = sy;
- + }
- + if ((sy + sh) > bottom_y) {
- + bottom = i;
- + bottom_y = sy + sh;
- + }
- + if (sx < left_x) {
- + left = i;
- + left_x = sx;
- + }
- + if ((sx + sw) > right_x) {
- + right = i;
- + right_x = sx + sw;
- + }
- + }
- +
- + w->fullscreen_screens(top, bottom, left, right);
- + } else {
- + w->fullscreen_screens(-1, -1, -1, -1);
- + }
- w->fullscreen();
- - w->override();
- #ifndef WIN32 // update our border state in case border was turned off
- border_button->value(w->border());
- #endif
- } else {
- - //w->fullscreen_off(px,py,pw,ph);
- w->fullscreen_off();
- }
- }
- @@ -219,7 +250,7 @@ void exit_cb(Fl_Widget *, void *) {
- exit(0);
- }
-
- -#define NUMB 7
- +#define NUMB 8
-
- int twowindow = 0;
- int initfull = 0;
- @@ -284,6 +315,9 @@ int main(int argc, char **argv) {
- window.b3->callback(fullscreen_cb,w);
- y+=30;
-
- + window.b4 = new Fl_Toggle_Light_Button(50,y,window.w()-60,30,"All Screens");
- + y+=30;
- +
- Fl_Button eb(50,y,window.w()-60,30,"Exit");
- eb.callback(exit_cb);
- y+=30;
|