You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			469 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Diff
		
	
			
		
		
	
	
			469 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Diff
		
	
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;
 |