You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

11-str2860-fltk-1.3.x-multihead.patch 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. diff -urp fltk-1.3.2.org/FL/Fl_Window.H fltk-1.3.2/FL/Fl_Window.H
  2. --- fltk-1.3.2.org/FL/Fl_Window.H 2013-01-16 10:52:33.017228122 +0100
  3. +++ fltk-1.3.2/FL/Fl_Window.H 2013-01-16 10:52:47.876478968 +0100
  4. @@ -54,7 +54,7 @@ class Fl_RGB_Image;
  5. class FL_EXPORT Fl_Window : public Fl_Group {
  6. static char *default_xclass_;
  7. - // Note: we must use separate statements for each of the following 4 variables,
  8. + // Note: we must use separate statements for each of the following 8 variables,
  9. // with the static attribute, otherwise MS VC++ 2008/2010 complains :-(
  10. // AlbrechtS 04/2012
  11. #if FLTK_ABI_VERSION < 10301
  12. @@ -73,6 +73,22 @@ class FL_EXPORT Fl_Window : public Fl_Gr
  13. static // when these members are static, ABI compatibility with 1.3.0 is respected
  14. #endif
  15. int no_fullscreen_h;
  16. +#if FLTK_ABI_VERSION < 10302
  17. + static // when these members are static, ABI compatibility with 1.3.0 is respected
  18. +#endif
  19. + int fullscreen_screen_top;
  20. +#if FLTK_ABI_VERSION < 10302
  21. + static // when these members are static, ABI compatibility with 1.3.0 is respected
  22. +#endif
  23. + int fullscreen_screen_bottom;
  24. +#if FLTK_ABI_VERSION < 10302
  25. + static // when these members are static, ABI compatibility with 1.3.0 is respected
  26. +#endif
  27. + int fullscreen_screen_left;
  28. +#if FLTK_ABI_VERSION < 10302
  29. + static // when these members are static, ABI compatibility with 1.3.0 is respected
  30. +#endif
  31. + int fullscreen_screen_right;
  32. friend class Fl_X;
  33. Fl_X *i; // points at the system-specific stuff
  34. @@ -430,13 +446,15 @@ public:
  35. */
  36. void show(int argc, char **argv);
  37. /**
  38. - Makes the window completely fill the screen, without any window
  39. - manager border visible. You must use fullscreen_off() to undo
  40. - this.
  41. + Makes the window completely fill one or more screens, without any
  42. + window manager border visible. You must use fullscreen_off() to
  43. + undo this.
  44. \note On some platforms, this can result in the keyboard being
  45. grabbed. The window may also be recreated, meaning hide() and
  46. show() will be called.
  47. +
  48. + \see void Fl_Window::fullscreen_screens()
  49. */
  50. void fullscreen();
  51. /**
  52. @@ -453,6 +471,17 @@ public:
  53. */
  54. unsigned int fullscreen_active() const { return flags() & FULLSCREEN; }
  55. /**
  56. + Sets which screens should be used when this window is in fullscreen
  57. + mode. The window will be resized to the top of the screen with index
  58. + \p top, the bottom of the screen with index \p bottom, etc.
  59. +
  60. + If this method is never called, or if any argument is < 0, then the
  61. + window will be resized to fill the screen it is currently on.
  62. +
  63. + \see void Fl_Window::fullscreen()
  64. + */
  65. + void fullscreen_screens(int top, int bottom, int left, int right);
  66. + /**
  67. Iconifies the window. If you call this when shown() is false
  68. it will show() it as an icon. If the window is already
  69. iconified this does nothing.
  70. diff -urp fltk-1.3.2.org/FL/win32.H fltk-1.3.2/FL/win32.H
  71. --- fltk-1.3.2.org/FL/win32.H 2013-01-16 10:52:33.017228122 +0100
  72. +++ fltk-1.3.2/FL/win32.H 2013-01-16 10:52:47.876478968 +0100
  73. @@ -80,6 +80,7 @@ public:
  74. static Fl_X* i(const Fl_Window* w) {return w->i;}
  75. static int fake_X_wm(const Fl_Window* w,int &X, int &Y,
  76. int &bt,int &bx,int &by);
  77. + void make_fullscreen(int X, int Y, int W, int H);
  78. void setwindow(Fl_Window* wi) {w=wi; wi->i=this;}
  79. void flush() {w->flush();}
  80. void set_minmax(LPMINMAXINFO minmax);
  81. diff -urp fltk-1.3.2.org/src/Fl_cocoa.mm fltk-1.3.2/src/Fl_cocoa.mm
  82. --- fltk-1.3.2.org/src/Fl_cocoa.mm 2013-01-16 10:52:33.014229574 +0100
  83. +++ fltk-1.3.2/src/Fl_cocoa.mm 2013-01-16 10:52:47.877480606 +0100
  84. @@ -2438,9 +2438,32 @@ void Fl_X::make(Fl_Window* w)
  85. NSRect crect;
  86. if (w->fullscreen_active()) {
  87. - int sx, sy, sw, sh;
  88. - Fl::screen_xywh(sx, sy, sw, sh, w->x(), w->y(), w->w(), w->h());
  89. - w->resize(sx, sy, sw, sh);
  90. + int top, bottom, left, right;
  91. + int sx, sy, sw, sh, X, Y, W, H;
  92. +
  93. + top = w->fullscreen_screen_top;
  94. + bottom = w->fullscreen_screen_bottom;
  95. + left = w->fullscreen_screen_left;
  96. + right = w->fullscreen_screen_right;
  97. +
  98. + if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
  99. + top = Fl::screen_num(w->x(), w->y(), w->w(), w->h());
  100. + bottom = top;
  101. + left = top;
  102. + right = top;
  103. + }
  104. +
  105. + Fl::screen_xywh(sx, sy, sw, sh, top);
  106. + Y = sy;
  107. + Fl::screen_xywh(sx, sy, sw, sh, bottom);
  108. + H = sy + sh - Y;
  109. + Fl::screen_xywh(sx, sy, sw, sh, left);
  110. + X = sx;
  111. + Fl::screen_xywh(sx, sy, sw, sh, right);
  112. + W = sx + sw - X;
  113. +
  114. + w->resize(X, Y, W, H);
  115. +
  116. winstyle = NSBorderlessWindowMask;
  117. winlevel = NSStatusWindowLevel;
  118. }
  119. diff -urp fltk-1.3.2.org/src/Fl_win32.cxx fltk-1.3.2/src/Fl_win32.cxx
  120. --- fltk-1.3.2.org/src/Fl_win32.cxx 2013-01-16 10:52:33.019230734 +0100
  121. +++ fltk-1.3.2/src/Fl_win32.cxx 2013-01-16 10:52:47.878480504 +0100
  122. @@ -1493,7 +1493,6 @@ int Fl_X::fake_X_wm(const Fl_Window* w,i
  123. Y+=yoff;
  124. if (w->fullscreen_active()) {
  125. - X = Y = 0;
  126. bx = by = bt = 0;
  127. }
  128. @@ -1547,19 +1546,42 @@ void Fl_Window::resize(int X,int Y,int W
  129. }
  130. }
  131. -static void make_fullscreen(Fl_Window *w, Window xid, int X, int Y, int W, int H) {
  132. +void Fl_X::make_fullscreen(int X, int Y, int W, int H) {
  133. + int top, bottom, left, right;
  134. int sx, sy, sw, sh;
  135. - Fl::screen_xywh(sx, sy, sw, sh, X, Y, W, H);
  136. +
  137. + top = w->fullscreen_screen_top;
  138. + bottom = w->fullscreen_screen_bottom;
  139. + left = w->fullscreen_screen_left;
  140. + right = w->fullscreen_screen_right;
  141. +
  142. + if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
  143. + top = Fl::screen_num(X, Y, W, H);
  144. + bottom = top;
  145. + left = top;
  146. + right = top;
  147. + }
  148. +
  149. + Fl::screen_xywh(sx, sy, sw, sh, top);
  150. + Y = sy;
  151. + Fl::screen_xywh(sx, sy, sw, sh, bottom);
  152. + H = sy + sh - Y;
  153. + Fl::screen_xywh(sx, sy, sw, sh, left);
  154. + X = sx;
  155. + Fl::screen_xywh(sx, sy, sw, sh, right);
  156. + W = sx + sw - X;
  157. +
  158. DWORD flags = GetWindowLong(xid, GWL_STYLE);
  159. flags = flags & ~(WS_THICKFRAME|WS_CAPTION);
  160. SetWindowLong(xid, GWL_STYLE, flags);
  161. +
  162. // SWP_NOSENDCHANGING is so that we can override size limits
  163. - SetWindowPos(xid, HWND_TOP, sx, sy, sw, sh, SWP_NOSENDCHANGING | SWP_FRAMECHANGED);
  164. + SetWindowPos(xid, HWND_TOP, X, Y, W, H, SWP_NOSENDCHANGING | SWP_FRAMECHANGED);
  165. }
  166. void Fl_Window::fullscreen_x() {
  167. _set_fullscreen();
  168. - make_fullscreen(this, fl_xid(this), x(), y(), w(), h());
  169. + i->make_fullscreen(x(), y(), w(), h());
  170. Fl::handle(FL_FULLSCREEN, this);
  171. }
  172. @@ -1814,8 +1836,8 @@ Fl_X* Fl_X::make(Fl_Window* w) {
  173. monitor the window was placed on. */
  174. RECT rect;
  175. GetWindowRect(x->xid, &rect);
  176. - make_fullscreen(w, x->xid, rect.left, rect.top,
  177. - rect.right - rect.left, rect.bottom - rect.top);
  178. + x->make_fullscreen(rect.left, rect.top,
  179. + rect.right - rect.left, rect.bottom - rect.top);
  180. }
  181. x->next = Fl_X::first;
  182. diff -urp fltk-1.3.2.org/src/Fl_Window_fullscreen.cxx fltk-1.3.2/src/Fl_Window_fullscreen.cxx
  183. --- fltk-1.3.2.org/src/Fl_Window_fullscreen.cxx 2012-11-06 21:46:14.000000000 +0100
  184. +++ fltk-1.3.2/src/Fl_Window_fullscreen.cxx 2013-01-16 10:52:47.879480608 +0100
  185. @@ -36,6 +36,10 @@ int Fl_Window::no_fullscreen_x = 0;
  186. int Fl_Window::no_fullscreen_y = 0;
  187. int Fl_Window::no_fullscreen_w = 0;
  188. int Fl_Window::no_fullscreen_h = 0;
  189. +int Fl_Window::fullscreen_screen_top = -1;
  190. +int Fl_Window::fullscreen_screen_bottom = -1;
  191. +int Fl_Window::fullscreen_screen_left = -1;
  192. +int Fl_Window::fullscreen_screen_right = -1;
  193. #endif
  194. void Fl_Window::border(int b) {
  195. @@ -95,6 +99,23 @@ void Fl_Window::fullscreen_off() {
  196. fullscreen_off(no_fullscreen_x, no_fullscreen_y, no_fullscreen_w, no_fullscreen_h);
  197. }
  198. +void Fl_Window::fullscreen_screens(int top, int bottom, int left, int right) {
  199. + if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
  200. + fullscreen_screen_top = -1;
  201. + fullscreen_screen_bottom = -1;
  202. + fullscreen_screen_left = -1;
  203. + fullscreen_screen_right = -1;
  204. + } else {
  205. + fullscreen_screen_top = top;
  206. + fullscreen_screen_bottom = bottom;
  207. + fullscreen_screen_left = left;
  208. + fullscreen_screen_right = right;
  209. + }
  210. +
  211. + if (shown() && (flags() & Fl_Widget::FULLSCREEN))
  212. + fullscreen_x();
  213. +}
  214. +
  215. //
  216. // End of "$Id: Fl_Window_fullscreen.cxx 9706 2012-11-06 20:46:14Z matt $".
  217. diff -urp fltk-1.3.2.org/src/Fl_x.cxx fltk-1.3.2/src/Fl_x.cxx
  218. --- fltk-1.3.2.org/src/Fl_x.cxx 2013-01-16 10:52:33.020228202 +0100
  219. +++ fltk-1.3.2/src/Fl_x.cxx 2013-01-16 10:52:47.880480556 +0100
  220. @@ -344,6 +344,7 @@ Atom fl_NET_WM_ICON_NAME; // utf8 aware
  221. Atom fl_NET_SUPPORTING_WM_CHECK;
  222. Atom fl_NET_WM_STATE;
  223. Atom fl_NET_WM_STATE_FULLSCREEN;
  224. +Atom fl_NET_WM_FULLSCREEN_MONITORS;
  225. Atom fl_NET_WORKAREA;
  226. Atom fl_NET_WM_ICON;
  227. @@ -709,6 +710,7 @@ void fl_open_display(Display* d) {
  228. fl_NET_SUPPORTING_WM_CHECK = XInternAtom(d, "_NET_SUPPORTING_WM_CHECK", 0);
  229. fl_NET_WM_STATE = XInternAtom(d, "_NET_WM_STATE", 0);
  230. fl_NET_WM_STATE_FULLSCREEN = XInternAtom(d, "_NET_WM_STATE_FULLSCREEN", 0);
  231. + fl_NET_WM_FULLSCREEN_MONITORS = XInternAtom(d, "_NET_WM_FULLSCREEN_MONITORS", 0);
  232. fl_NET_WORKAREA = XInternAtom(d, "_NET_WORKAREA", 0);
  233. fl_NET_WM_ICON = XInternAtom(d, "_NET_WM_ICON", 0);
  234. @@ -1872,22 +1874,30 @@ void Fl_Window::resize(int X,int Y,int W
  235. #define _NET_WM_STATE_ADD 1 /* add/set property */
  236. #define _NET_WM_STATE_TOGGLE 2 /* toggle property */
  237. -static void send_wm_state_event(Window wnd, int add, Atom prop) {
  238. +static void send_wm_event(Window wnd, Atom message,
  239. + unsigned long d0, unsigned long d1=0,
  240. + unsigned long d2=0, unsigned long d3=0,
  241. + unsigned long d4=0) {
  242. XEvent e;
  243. e.xany.type = ClientMessage;
  244. e.xany.window = wnd;
  245. - e.xclient.message_type = fl_NET_WM_STATE;
  246. + e.xclient.message_type = message;
  247. e.xclient.format = 32;
  248. - e.xclient.data.l[0] = add ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE;
  249. - e.xclient.data.l[1] = prop;
  250. - e.xclient.data.l[2] = 0;
  251. - e.xclient.data.l[3] = 0;
  252. - e.xclient.data.l[4] = 0;
  253. + e.xclient.data.l[0] = d0;
  254. + e.xclient.data.l[1] = d1;
  255. + e.xclient.data.l[2] = d2;
  256. + e.xclient.data.l[3] = d3;
  257. + e.xclient.data.l[4] = d4;
  258. XSendEvent(fl_display, RootWindow(fl_display, fl_screen),
  259. 0, SubstructureNotifyMask | SubstructureRedirectMask,
  260. &e);
  261. }
  262. +static void send_wm_state_event(Window wnd, int add, Atom prop) {
  263. + send_wm_event(wnd, fl_NET_WM_STATE,
  264. + add ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE, prop);
  265. +}
  266. +
  267. int Fl_X::ewmh_supported() {
  268. static int result = -1;
  269. @@ -1911,6 +1921,22 @@ int Fl_X::ewmh_supported() {
  270. /* Change an existing window to fullscreen */
  271. void Fl_Window::fullscreen_x() {
  272. if (Fl_X::ewmh_supported()) {
  273. + int top, bottom, left, right;
  274. +
  275. + top = fullscreen_screen_top;
  276. + bottom = fullscreen_screen_bottom;
  277. + left = fullscreen_screen_left;
  278. + right = fullscreen_screen_right;
  279. +
  280. + if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
  281. + top = Fl::screen_num(x(), y(), w(), h());
  282. + bottom = top;
  283. + left = top;
  284. + right = top;
  285. + }
  286. +
  287. + send_wm_event(fl_xid(this), fl_NET_WM_FULLSCREEN_MONITORS,
  288. + top, bottom, left, right);
  289. send_wm_state_event(fl_xid(this), 1, fl_NET_WM_STATE_FULLSCREEN);
  290. } else {
  291. _set_fullscreen();
  292. @@ -1997,7 +2023,7 @@ void Fl_X::make_xid(Fl_Window* win, XVis
  293. // force the window to be on-screen. Usually the X window manager
  294. // does this, but a few don't, so we do it here for consistency:
  295. int scr_x, scr_y, scr_w, scr_h;
  296. - Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h, X, Y);
  297. + Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h, X, Y, W, H);
  298. if (win->border()) {
  299. // ensure border is on screen:
  300. @@ -2026,6 +2052,23 @@ void Fl_X::make_xid(Fl_Window* win, XVis
  301. return;
  302. }
  303. + // Compute which screen(s) we should be on if we want to go fullscreen
  304. + int fullscreen_top, fullscreen_bottom, fullscreen_left, fullscreen_right;
  305. +
  306. + fullscreen_top = win->fullscreen_screen_top;
  307. + fullscreen_bottom = win->fullscreen_screen_bottom;
  308. + fullscreen_left = win->fullscreen_screen_left;
  309. + fullscreen_right = win->fullscreen_screen_right;
  310. +
  311. + if ((fullscreen_top < 0) || (fullscreen_bottom < 0) ||
  312. + (fullscreen_left < 0) || (fullscreen_right < 0)) {
  313. + fullscreen_top = Fl::screen_num(X, Y, W, H);
  314. + fullscreen_bottom = fullscreen_top;
  315. + fullscreen_left = fullscreen_top;
  316. + fullscreen_right = fullscreen_top;
  317. + }
  318. +
  319. +
  320. ulong root = win->parent() ?
  321. fl_xid(win->window()) : RootWindow(fl_display, fl_screen);
  322. @@ -2049,9 +2092,17 @@ void Fl_X::make_xid(Fl_Window* win, XVis
  323. // border, and cannot grab without an existing window. Besides,
  324. // there is no clear_override().
  325. if (win->flags() & Fl_Widget::FULLSCREEN && !Fl_X::ewmh_supported()) {
  326. + int sx, sy, sw, sh;
  327. attr.override_redirect = 1;
  328. mask |= CWOverrideRedirect;
  329. - Fl::screen_xywh(X, Y, W, H, X, Y, W, H);
  330. + Fl::screen_xywh(sx, sy, sw, sh, fullscreen_left);
  331. + X = sx;
  332. + Fl::screen_xywh(sx, sy, sw, sh, fullscreen_right);
  333. + W = sx + sw - X;
  334. + Fl::screen_xywh(sx, sy, sw, sh, fullscreen_top);
  335. + Y = sy;
  336. + Fl::screen_xywh(sx, sy, sw, sh, fullscreen_bottom);
  337. + H = sy + sh - Y;
  338. }
  339. if (fl_background_pixel >= 0) {
  340. @@ -2122,6 +2173,13 @@ void Fl_X::make_xid(Fl_Window* win, XVis
  341. // If asked for, create fullscreen
  342. if (win->flags() & Fl_Widget::FULLSCREEN && Fl_X::ewmh_supported()) {
  343. + unsigned long data[4];
  344. + data[0] = fullscreen_top;
  345. + data[1] = fullscreen_bottom;
  346. + data[2] = fullscreen_left;
  347. + data[3] = fullscreen_right;
  348. + XChangeProperty (fl_display, xp->xid, fl_NET_WM_FULLSCREEN_MONITORS, XA_ATOM, 32,
  349. + PropModeReplace, (unsigned char*) data, 4);
  350. XChangeProperty (fl_display, xp->xid, fl_NET_WM_STATE, XA_ATOM, 32,
  351. PropModeAppend, (unsigned char*) &fl_NET_WM_STATE_FULLSCREEN, 1);
  352. }
  353. diff -urp fltk-1.3.2.org/test/fullscreen.cxx fltk-1.3.2/test/fullscreen.cxx
  354. --- fltk-1.3.2.org/test/fullscreen.cxx 2012-06-14 17:09:46.000000000 +0200
  355. +++ fltk-1.3.2/test/fullscreen.cxx 2013-01-16 10:52:47.881104801 +0100
  356. @@ -127,7 +127,7 @@ class fullscreen_window : public Fl_Sing
  357. fullscreen_window(int W, int H, const char *t=0);
  358. int handle (int e);
  359. Fl_Toggle_Light_Button *b3;
  360. -
  361. + Fl_Toggle_Light_Button *b4;
  362. };
  363. fullscreen_window::fullscreen_window(int W, int H, const char *t) : Fl_Single_Window(W, H, t) {
  364. @@ -170,23 +170,54 @@ void border_cb(Fl_Widget *o, void *p) {
  365. #endif
  366. }
  367. -int px,py,pw,ph;
  368. Fl_Button *border_button;
  369. void fullscreen_cb(Fl_Widget *o, void *p) {
  370. Fl_Window *w = (Fl_Window *)p;
  371. int d = ((Fl_Button *)o)->value();
  372. if (d) {
  373. - px = w->x();
  374. - py = w->y();
  375. - pw = w->w();
  376. - ph = w->h();
  377. + if (((fullscreen_window*)w)->b4->value()) {
  378. + int top, bottom, left, right;
  379. + int top_y, bottom_y, left_x, right_x;
  380. +
  381. + int sx, sy, sw, sh;
  382. +
  383. + top = bottom = left = right = 0;
  384. +
  385. + Fl::screen_xywh(sx, sy, sw, sh, 0);
  386. + top_y = sy;
  387. + bottom_y = sy + sh;
  388. + left_x = sx;
  389. + right_x = sx + sw;
  390. +
  391. + for (int i = 1;i < Fl::screen_count();i++) {
  392. + Fl::screen_xywh(sx, sy, sw, sh, i);
  393. + if (sy < top_y) {
  394. + top = i;
  395. + top_y = sy;
  396. + }
  397. + if ((sy + sh) > bottom_y) {
  398. + bottom = i;
  399. + bottom_y = sy + sh;
  400. + }
  401. + if (sx < left_x) {
  402. + left = i;
  403. + left_x = sx;
  404. + }
  405. + if ((sx + sw) > right_x) {
  406. + right = i;
  407. + right_x = sx + sw;
  408. + }
  409. + }
  410. +
  411. + w->fullscreen_screens(top, bottom, left, right);
  412. + } else {
  413. + w->fullscreen_screens(-1, -1, -1, -1);
  414. + }
  415. w->fullscreen();
  416. - w->override();
  417. #ifndef WIN32 // update our border state in case border was turned off
  418. border_button->value(w->border());
  419. #endif
  420. } else {
  421. - //w->fullscreen_off(px,py,pw,ph);
  422. w->fullscreen_off();
  423. }
  424. }
  425. @@ -219,7 +250,7 @@ void exit_cb(Fl_Widget *, void *) {
  426. exit(0);
  427. }
  428. -#define NUMB 7
  429. +#define NUMB 8
  430. int twowindow = 0;
  431. int initfull = 0;
  432. @@ -284,6 +315,9 @@ int main(int argc, char **argv) {
  433. window.b3->callback(fullscreen_cb,w);
  434. y+=30;
  435. + window.b4 = new Fl_Toggle_Light_Button(50,y,window.w()-60,30,"All Screens");
  436. + y+=30;
  437. +
  438. Fl_Button eb(50,y,window.w()-60,30,"Exit");
  439. eb.callback(exit_cb);
  440. y+=30;