diff options
author | DRC <dcommander@users.sourceforge.net> | 2011-07-28 09:27:57 +0000 |
---|---|---|
committer | DRC <dcommander@users.sourceforge.net> | 2011-07-28 09:27:57 +0000 |
commit | e483f949092f59047ec1908bcdd3510a30db8765 (patch) | |
tree | 357b364dadbe2ff3c3a9c42e95d0549f88a36fd2 /fltk | |
parent | 685f17ec83083ad4ada1181110419f616f1ba6fb (diff) | |
download | tigervnc-e483f949092f59047ec1908bcdd3510a30db8765.tar.gz tigervnc-e483f949092f59047ec1908bcdd3510a30db8765.zip |
Remove extensions patch. It is no longer being maintained, in favor of an in-tree version of FLTK with the patches applied
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4606 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'fltk')
-rw-r--r-- | fltk/README | 3 | ||||
-rw-r--r-- | fltk/extensions.patch | 4180 |
2 files changed, 0 insertions, 4183 deletions
diff --git a/fltk/README b/fltk/README deleted file mode 100644 index ccf6c729..00000000 --- a/fltk/README +++ /dev/null @@ -1,3 +0,0 @@ -This directory contains a unified patch which, when applied to the FLTK 1.3.0 -source tree, will enable extensions to the FLTK code which are necessary to -build a fully-functional version of the FLTK-based TigerVNC Viewer. diff --git a/fltk/extensions.patch b/fltk/extensions.patch deleted file mode 100644 index edce5f9f..00000000 --- a/fltk/extensions.patch +++ /dev/null @@ -1,4180 +0,0 @@ -*** fltk-1.3.0/CMakeLists.txt 2011-01-06 04:24:58.000000000 -0600 ---- fltk-1.3.0-new/CMakeLists.txt 2011-06-23 21:39:42.000000000 -0500 -*************** -*** 49,52 **** ---- 49,56 ---- - include_directories(${FLTK_BINARY_DIR} ${FLTK_SOURCE_DIR}) - -+ if(NOT CMAKE_BUILD_TYPE) -+ set(CMAKE_BUILD_TYPE Release) -+ endif() -+ - ####################################################################### - # platform dependent information -*************** -*** 62,65 **** ---- 66,70 ---- - set(HAVE_DIRENT_H 1) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Cocoa") -+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Carbon") - endif(APPLE) - -*************** -*** 68,71 **** ---- 73,86 ---- - add_definitions(-DWIN32_LEAN_AND_MEAN) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) -+ -+ # Use the static C library for all build types -+ foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE -+ CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO -+ CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE -+ CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) -+ if(${var} MATCHES "/MD") -+ string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}") -+ endif() -+ endforeach() - endif(MSVC) - if(CMAKE_C_COMPILER_ID STREQUAL GNU) -*** fltk-1.3.0/FL/Enumerations.H 2011-05-21 16:55:59.000000000 -0500 ---- fltk-1.3.0-new/FL/Enumerations.H 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 293,297 **** - following FL_PASTE event. - */ -! FL_DND_RELEASE = 23 - }; - ---- 293,302 ---- - following FL_PASTE event. - */ -! FL_DND_RELEASE = 23, -! -! /** The fullscreen state of the window has changed -! */ -! FL_FULLSCREEN = 24 -! - }; - -*************** -*** 875,907 **** - /** The following constants define the mouse cursors that are available in FLTK. - -! The double-headed arrows are bitmaps provided by FLTK on X, the others -! are provided by system-defined cursors. - - \todo enum Fl_Cursor needs maybe an image. - */ - enum Fl_Cursor { -! FL_CURSOR_DEFAULT = 0, /**< the default cursor, usually an arrow. */ -! FL_CURSOR_ARROW = 35, /**< an arrow pointer. */ -! FL_CURSOR_CROSS = 66, /**< crosshair. */ -! FL_CURSOR_WAIT = 76, /**< watch or hourglass. */ -! FL_CURSOR_INSERT = 77, /**< I-beam. */ -! FL_CURSOR_HAND = 31, /**< hand (uparrow on MSWindows). */ -! FL_CURSOR_HELP = 47, /**< question mark. */ -! FL_CURSOR_MOVE = 27, /**< 4-pointed arrow. */ -! // fltk provides bitmaps for these: -! FL_CURSOR_NS = 78, /**< up/down arrow. */ -! FL_CURSOR_WE = 79, /**< left/right arrow. */ -! FL_CURSOR_NWSE = 80, /**< diagonal arrow. */ -! FL_CURSOR_NESW = 81, /**< diagonal arrow. */ -! FL_CURSOR_NONE =255, /**< invisible. */ -! // for back compatibility (non MSWindows ones): -! FL_CURSOR_N = 70, /**< for back compatibility. */ -! FL_CURSOR_NE = 69, /**< for back compatibility. */ -! FL_CURSOR_E = 49, /**< for back compatibility. */ -! FL_CURSOR_SE = 8, /**< for back compatibility. */ -! FL_CURSOR_S = 9, /**< for back compatibility. */ -! FL_CURSOR_SW = 7, /**< for back compatibility. */ -! FL_CURSOR_W = 36, /**< for back compatibility. */ -! FL_CURSOR_NW = 68 /**< for back compatibility. */ - }; - /*@}*/ // group: Cursors ---- 880,913 ---- - /** The following constants define the mouse cursors that are available in FLTK. - -! Cursors are provided by the system when available, or bitmaps built into -! FLTK as a fallback. - - \todo enum Fl_Cursor needs maybe an image. - */ - enum Fl_Cursor { -! FL_CURSOR_DEFAULT = 0, /**< the default cursor, usually an arrow. */ -! FL_CURSOR_ARROW = 1, /**< an arrow pointer. */ -! FL_CURSOR_CROSS = 2, /**< crosshair. */ -! FL_CURSOR_WAIT = 3, /**< busy indicator (e.g. hourglass). */ -! FL_CURSOR_INSERT = 4, /**< I-beam. */ -! FL_CURSOR_HAND = 5, /**< pointing hand. */ -! FL_CURSOR_HELP = 6, /**< question mark pointer. */ -! FL_CURSOR_MOVE = 7, /**< 4-pointed arrow or hand. */ -! -! /* Resize indicators */ -! FL_CURSOR_NS = 101, /**< up/down resize. */ -! FL_CURSOR_WE = 102, /**< left/right resize. */ -! FL_CURSOR_NWSE = 103, /**< diagonal resize. */ -! FL_CURSOR_NESW = 104, /**< diagonal resize. */ -! FL_CURSOR_NE = 110, /**< upwards, right resize. */ -! FL_CURSOR_N = 111, /**< upwards resize. */ -! FL_CURSOR_NW = 112, /**< upwards, left resize. */ -! FL_CURSOR_E = 113, /**< leftwards resize. */ -! FL_CURSOR_W = 114, /**< rightwards resize. */ -! FL_CURSOR_SE = 115, /**< downwards, right resize. */ -! FL_CURSOR_S = 116, /**< downwards resize. */ -! FL_CURSOR_SW = 117, /**< downwards, left resize. */ -! -! FL_CURSOR_NONE = 255, /**< invisible. */ - }; - /*@}*/ // group: Cursors -*** fltk-1.3.0/FL/Fl.H 2011-05-23 13:01:29.000000000 -0500 ---- fltk-1.3.0-new/FL/Fl.H 2011-06-22 22:35:31.000000000 -0500 -*************** -*** 109,112 **** ---- 109,115 ---- - typedef int (*Fl_Event_Dispatch)(int event, Fl_Window *w); - -+ /** Signature of add_clipboard_notify functions passed as parameters */ -+ typedef void (*Fl_Clipboard_Notify_Handler)(int source, void *data); -+ - /** @} */ /* group callback_functions */ - -*************** -*** 745,748 **** ---- 748,764 ---- - static void paste(Fl_Widget &receiver, int source /*=0*/); // platform dependent - /** -+ FLTK will call the registered callback whenever there is a change to the -+ selection buffer or the clipboard. The source argument indicates which -+ of the two has changed. Only changes by other applications are reported. -+ \note Some systems require polling to monitor the clipboard and may -+ therefore have some delay in detecting changes. -+ */ -+ static void add_clipboard_notify(Fl_Clipboard_Notify_Handler h, void *data); -+ /** -+ Stop calling the specified callback when there are changes to the selection -+ buffer or the clipboard. -+ */ -+ static void remove_clipboard_notify(Fl_Clipboard_Notify_Handler h); -+ /** - Initiate a Drag And Drop operation. The selection buffer should be - filled with relevant data before calling this method. FLTK will -*** fltk-1.3.0/FL/Fl_Image.H 2011-01-30 03:24:40.000000000 -0600 ---- fltk-1.3.0-new/FL/Fl_Image.H 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 35,38 **** ---- 35,39 ---- - - class Fl_Widget; -+ class Fl_Pixmap; - struct Fl_Menu_Item; - struct Fl_Label; -*************** -*** 197,200 **** ---- 198,202 ---- - Fl_RGB_Image(const uchar *bits, int W, int H, int D=3, int LD=0) : - Fl_Image(W,H,D), array(bits), alloc_array(0), id_(0), mask_(0) {data((const char **)&array, 1); ld(LD);} -+ Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg=FL_GRAY); - virtual ~Fl_RGB_Image(); - virtual Fl_Image *copy(int W, int H); -*** fltk-1.3.0/FL/Fl_Widget.H 2011-04-24 12:09:41.000000000 -0500 ---- fltk-1.3.0-new/FL/Fl_Widget.H 2011-06-22 22:41:26.000000000 -0500 -*************** -*** 109,112 **** ---- 109,113 ---- - class FL_EXPORT Fl_Widget { - friend class Fl_Group; -+ friend class Fl_X; - - Fl_Group* parent_; -*************** -*** 180,183 **** ---- 181,186 ---- - GROUP_RELATIVE = 1<<16, ///< position this widget relative to the parent group, not to the window - COPIED_TOOLTIP = 1<<17, ///< the widget tooltip is internally copied, its destruction is handled by the widget -+ SIMPLE_KEYBOARD = 1<<18, ///< the widget wants simple, consistent keypresses and not advanced input (like character composition and CJK input) -+ FULLSCREEN = 1<<19, ///< a fullscreen window (Fl_Window) - // (space for more flags) - USERFLAG3 = 1<<29, ///< reserved for 3rd party extensions -*************** -*** 785,788 **** ---- 788,820 ---- - void clear_changed() {flags_ &= ~CHANGED;} - -+ /** -+ Returns if the widget sees a simplified keyboard model or not. -+ -+ Normally widgets get a full-featured keyboard model that is geared -+ towards text input. This includes support for compose sequences and -+ advanced input methods, commonly used for asian writing system. This -+ system however has downsides in that extra graphic can be presented -+ to the user and that a physical key press doesn't correspond directly -+ to a FLTK event. -+ -+ Widgets that need a direct correspondence between actual key events -+ and those seen by the widget can swith to the simplified keyboard -+ model. -+ -+ \retval 0 if the widget uses the normal keyboard model -+ \see set_changed(), clear_changed() -+ */ -+ unsigned int simple_keyboard() const {return flags_&SIMPLE_KEYBOARD;} -+ -+ /** Marks a widget to use the simple keyboard model. -+ \see changed(), clear_changed() -+ */ -+ void set_simple_keyboard() {flags_ |= SIMPLE_KEYBOARD;} -+ -+ /** Marks a widget to use the normal keyboard model. -+ \see changed(), set_changed() -+ */ -+ void set_normal_keyboard() {flags_ &= ~SIMPLE_KEYBOARD;} -+ - /** Gives the widget the keyboard focus. - Tries to make this widget be the Fl::focus() widget, by first sending -*************** -*** 853,856 **** ---- 885,891 ---- - /* Internal use only. */ - static int test_shortcut(const char*, const bool require_alt = false); -+ /* Internal use only. */ -+ void _set_fullscreen() {flags_ |= FULLSCREEN;} -+ void _clear_fullscreen() {flags_ &= ~FULLSCREEN;} - - /** Checks if w is a child of this widget. -*** fltk-1.3.0/FL/Fl_Window.H 2011-04-15 16:38:05.000000000 -0500 ---- fltk-1.3.0-new/FL/Fl_Window.H 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 38,41 **** ---- 38,42 ---- - - class Fl_X; -+ class Fl_RGB_Image; - - /** -*************** -*** 70,76 **** - int dw, dh, aspect; - uchar size_range_set; - // cursor stuff - Fl_Cursor cursor_default; -- Fl_Color cursor_fg, cursor_bg; - void size_range_(); - void _Fl_Window(); // constructor innards ---- 71,77 ---- - int dw, dh, aspect; - uchar size_range_set; -+ int no_fullscreen_x, no_fullscreen_y, no_fullscreen_w, no_fullscreen_h; - // cursor stuff - Fl_Cursor cursor_default; - void size_range_(); - void _Fl_Window(); // constructor innards -*************** -*** 385,392 **** - Makes the window completely fill the screen, without any window - manager border visible. You must use fullscreen_off() to undo -! this. This may not work with all window managers. - */ - void fullscreen(); - /** - Turns off any side effects of fullscreen() and does - resize(x,y,w,h). ---- 386,401 ---- - Makes the window completely fill the screen, 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. - */ - void fullscreen(); - /** -+ Turns off any side effects of fullscreen() -+ */ -+ void fullscreen_off(); -+ /** - Turns off any side effects of fullscreen() and does - resize(x,y,w,h). -*************** -*** 394,397 **** ---- 403,410 ---- - void fullscreen_off(int,int,int,int); - /** -+ Returns non zero if FULLSCREEN flag is set, 0 otherwise. -+ */ -+ unsigned int fullscreen_active() const { return flags() & FULLSCREEN; } -+ /** - Iconifies the window. If you call this when shown() is false - it will show() it as an icon. If the window is already -*************** -*** 435,446 **** - - The type Fl_Cursor is an enumeration defined in <FL/Enumerations.H>. -- (Under X you can get any XC_cursor value by passing -- Fl_Cursor((XC_foo/2)+1)). The colors only work on X, they are -- not implemented on WIN32. - -! For back compatibility only. - */ -! void cursor(Fl_Cursor, Fl_Color=FL_BLACK, Fl_Color=FL_WHITE); // platform dependent -! void default_cursor(Fl_Cursor, Fl_Color=FL_BLACK, Fl_Color=FL_WHITE); - static void default_callback(Fl_Window*, void* v); - ---- 448,462 ---- - - The type Fl_Cursor is an enumeration defined in <FL/Enumerations.H>. - -! \see cursor(const Fl_RGB_Image*, int, int), default_cursor() - */ -! void cursor(Fl_Cursor); -! void cursor(const Fl_RGB_Image*, int, int); -! void default_cursor(Fl_Cursor); -! -! /* for legacy compatibility */ -! void cursor(Fl_Cursor c, Fl_Color, Fl_Color=FL_WHITE) { cursor(c); }; -! void default_cursor(Fl_Cursor c, Fl_Color, Fl_Color=FL_WHITE) { default_cursor(c); }; -! - static void default_callback(Fl_Window*, void* v); - -*** fltk-1.3.0/FL/fl_draw.H 2011-06-02 03:06:09.000000000 -0500 ---- fltk-1.3.0-new/FL/fl_draw.H 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 758,762 **** - FL_EXPORT void fl_overlay_rect(int x,int y,int w,int h); - FL_EXPORT void fl_overlay_clear(); -! FL_EXPORT void fl_cursor(Fl_Cursor, Fl_Color fg=FL_BLACK, Fl_Color bg=FL_WHITE); - FL_EXPORT const char* fl_expand_text(const char* from, char* buf, int maxbuf, - double maxw, int& n, double &width, ---- 758,763 ---- - FL_EXPORT void fl_overlay_rect(int x,int y,int w,int h); - FL_EXPORT void fl_overlay_clear(); -! FL_EXPORT void fl_cursor(Fl_Cursor); -! FL_EXPORT void fl_cursor(Fl_Cursor, Fl_Color fg, Fl_Color bg=FL_WHITE); - FL_EXPORT const char* fl_expand_text(const char* from, char* buf, int maxbuf, - double maxw, int& n, double &width, -*** fltk-1.3.0/FL/mac.H 2011-05-12 06:50:43.000000000 -0500 ---- fltk-1.3.0-new/FL/mac.H 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 142,146 **** - WindowRef window_ref(void); - void set_key_window(void); -! void set_cursor(Fl_Cursor); - static CGImageRef CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h); - static unsigned char *bitmap_from_window_rect(Fl_Window *win, int x, int y, int w, int h, int *bytesPerPixel); ---- 142,147 ---- - WindowRef window_ref(void); - void set_key_window(void); -! int set_cursor(Fl_Cursor); -! int set_cursor(const Fl_RGB_Image*, int, int); - static CGImageRef CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h); - static unsigned char *bitmap_from_window_rect(Fl_Window *win, int x, int y, int w, int h, int *bytesPerPixel); -*** fltk-1.3.0/FL/names.h 2010-11-28 15:06:39.000000000 -0600 ---- fltk-1.3.0-new/FL/names.h 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 76,79 **** ---- 76,80 ---- - "FL_DND_LEAVE", - "FL_DND_RELEASE", -+ "FL_FULLSCREEN" - }; - -*** fltk-1.3.0/FL/win32.H 2011-05-23 13:32:47.000000000 -0500 ---- fltk-1.3.0-new/FL/win32.H 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 93,96 **** ---- 93,98 ---- - void set_minmax(LPMINMAXINFO minmax); - void mapraise(); -+ int set_cursor(Fl_Cursor); -+ int set_cursor(const Fl_RGB_Image*, int, int); - static Fl_X* make(Fl_Window*); - }; -*** fltk-1.3.0/FL/x.H 2011-05-21 05:05:19.000000000 -0500 ---- fltk-1.3.0-new/FL/x.H 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 164,167 **** ---- 164,169 ---- - void setwindow(Fl_Window* wi) {w=wi; wi->i=this;} - void sendxjunk(); -+ int set_cursor(Fl_Cursor); -+ int set_cursor(const Fl_RGB_Image*, int, int); - static void make_xid(Fl_Window*,XVisualInfo* =fl_visual, Colormap=fl_colormap); - static Fl_X* set_xid(Fl_Window*, Window); -*** fltk-1.3.0/configh.in 2011-06-09 11:21:40.000000000 -0500 ---- fltk-1.3.0-new/configh.in 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 118,121 **** ---- 118,137 ---- - - /* -+ * HAVE_XFIXES: -+ * -+ * Do we have the X fixes extension? -+ */ -+ -+ #define HAVE_XFIXES 0 -+ -+ /* -+ * HAVE_XCURSOR: -+ * -+ * Do we have the X cursor library? -+ */ -+ -+ #define HAVE_XCURSOR 0 -+ -+ /* - * __APPLE_QUARTZ__: - * -*** fltk-1.3.0/configure.in 2011-03-06 10:54:58.000000000 -0600 ---- fltk-1.3.0-new/configure.in 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 875,878 **** ---- 875,880 ---- - # MacOS X uses Cocoa for graphics. - LIBS="$LIBS -framework Cocoa" -+ # And some Carbon for keyboard handling -+ LIBS="$LIBS -framework Carbon" - - if test x$have_pthread = xyes; then -*************** -*** 1007,1010 **** ---- 1009,1032 ---- - fi - -+ dnl Check for the Xfixes extension unless disabled... -+ AC_ARG_ENABLE(xfixes, [ --enable-xfixes turn on Xfixes support [default=yes]]) -+ -+ if test x$enable_xfixes != xno; then -+ AC_CHECK_HEADER(X11/extensions/Xfixes.h, AC_DEFINE(HAVE_XFIXES),, -+ [#include <X11/Xlib.h>]) -+ AC_CHECK_LIB(Xfixes, XFixesQueryExtension, -+ LIBS="-lXfixes $LIBS") -+ fi -+ -+ dnl Check for the Xcursor library unless disabled... -+ AC_ARG_ENABLE(xcursor, [ --enable-xcursor turn on Xcursor support [default=yes]]) -+ -+ if test x$enable_xcursor != xno; then -+ AC_CHECK_HEADER(X11/Xcursor/Xcursor.h, AC_DEFINE(HAVE_XCURSOR),, -+ [#include <X11/Xlib.h>]) -+ AC_CHECK_LIB(Xcursor, XcursorImageCreate, -+ LIBS="-lXcursor $LIBS") -+ fi -+ - dnl Check for overlay visuals... - AC_PATH_PROG(XPROP, xprop) -*** fltk-1.3.0/documentation/src/enumerations.dox 2011-05-11 10:49:30.000000000 -0500 ---- fltk-1.3.0-new/documentation/src/enumerations.dox 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 58,61 **** ---- 58,62 ---- - data. - \li FL_DND_RELEASE - Dragged data is about to be dropped. -+ \li FL_FULLSCREEN - The fullscreen state of the window has changed. - - -*** fltk-1.3.0/documentation/src/events.dox 2011-05-11 10:49:30.000000000 -0500 ---- fltk-1.3.0-new/documentation/src/events.dox 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 301,304 **** ---- 301,311 ---- - the immediately following \p FL_PASTE event. - -+ \subsection events_fl_fullscreen FL_FULLSCREEN -+ -+ The application window has been changed from normal to fullscreen, or -+ from fullscreen to normal. If you are using a X window manager which -+ supports Extended Window Manager Hints, this event will not be -+ delivered until the change has actually happened. -+ - - \section events_event_xxx Fl::event_*() methods -*** fltk-1.3.0/src/Fl.cxx 2011-05-23 11:49:02.000000000 -0500 ---- fltk-1.3.0.new/src/Fl.cxx 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 80,83 **** ---- 80,85 ---- - #endif // WIN32 - -+ extern void fl_update_focus(void); -+ - // - // Globals... -*************** -*** 445,448 **** ---- 447,513 ---- - - //////////////////////////////////////////////////////////////// -+ // Clipboard notifications -+ -+ struct Clipboard_Notify { -+ Fl_Clipboard_Notify_Handler handler; -+ void *data; -+ struct Clipboard_Notify *next; -+ }; -+ -+ static struct Clipboard_Notify *clip_notify_list = NULL; -+ -+ extern void fl_clipboard_notify_change(); // in Fl_<platform>.cxx -+ -+ void Fl::add_clipboard_notify(Fl_Clipboard_Notify_Handler h, void *data) { -+ struct Clipboard_Notify *node; -+ -+ remove_clipboard_notify(h); -+ -+ node = new Clipboard_Notify; -+ -+ node->handler = h; -+ node->data = data; -+ node->next = clip_notify_list; -+ -+ clip_notify_list = node; -+ -+ fl_clipboard_notify_change(); -+ } -+ -+ void Fl::remove_clipboard_notify(Fl_Clipboard_Notify_Handler h) { -+ struct Clipboard_Notify *node, **prev; -+ -+ node = clip_notify_list; -+ prev = &clip_notify_list; -+ while (node != NULL) { -+ if (node->handler == h) { -+ *prev = node->next; -+ delete node; -+ -+ fl_clipboard_notify_change(); -+ -+ return; -+ } -+ -+ prev = &node->next; -+ node = node->next; -+ } -+ } -+ -+ bool fl_clipboard_notify_empty(void) { -+ return clip_notify_list == NULL; -+ } -+ -+ void fl_trigger_clipboard_notify(int source) { -+ struct Clipboard_Notify *node; -+ -+ node = clip_notify_list; -+ while (node != NULL) { -+ node->handler(source, node->data); -+ node = node->next; -+ } -+ } -+ -+ //////////////////////////////////////////////////////////////// - // wait/run/check/ready: - -*************** -*** 881,884 **** ---- 946,951 ---- - } - e_number = old_event; -+ // let the platform code do what it needs -+ fl_update_focus(); - } - } -*************** -*** 1362,1366 **** - // hide() destroys the X window, it does not do unmap! - -! #if !defined(WIN32) && USE_XFT - extern void fl_destroy_xft_draw(Window); - #endif ---- 1429,1436 ---- - // hide() destroys the X window, it does not do unmap! - -! #if defined(WIN32) -! extern void fl_clipboard_notify_untarget(HWND wnd); -! extern void fl_update_clipboard(void); -! #elif USE_XFT - extern void fl_destroy_xft_draw(Window); - #endif -*************** -*** 1409,1420 **** - // this little trick keeps the current clipboard alive, even if we are about - // to destroy the window that owns the selection. -! if (GetClipboardOwner()==ip->xid) { -! Fl_Window *w1 = Fl::first_window(); -! if (w1 && OpenClipboard(fl_xid(w1))) { -! EmptyClipboard(); -! SetClipboardData(CF_TEXT, NULL); -! CloseClipboard(); -! } -! } - // Send a message to myself so that I'll get out of the event loop... - PostMessage(ip->xid, WM_APP, 0, 0); ---- 1479,1486 ---- - // this little trick keeps the current clipboard alive, even if we are about - // to destroy the window that owns the selection. -! if (GetClipboardOwner()==ip->xid) -! fl_update_clipboard(); -! // Make sure we unlink this window from the clipboard chain -! fl_clipboard_notify_untarget(ip->xid); - // Send a message to myself so that I'll get out of the event loop... - PostMessage(ip->xid, WM_APP, 0, 0); -*** fltk-1.3.0/src/Fl_Image.cxx 2011-04-20 09:01:04.000000000 -0500 ---- fltk-1.3.0.new/src/Fl_Image.cxx 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 173,176 **** ---- 173,189 ---- - // RGB image class... - // -+ -+ int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg); -+ -+ /** The constructor creates a new RGBA image from the specified Fl_Pixmap. */ -+ Fl_RGB_Image::Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg): -+ Fl_Image(pxm->w(), pxm->h(), 4), id_(0), mask_(0) -+ { -+ array = new uchar[w() * h() * d()]; -+ alloc_array = 1; -+ fl_convert_pixmap(pxm->data(), (uchar*)array, bg); -+ data((const char **)&array, 1); -+ } -+ - /** The destructor free all memory and server resources that are used by the image. */ - Fl_RGB_Image::~Fl_RGB_Image() { -*** fltk-1.3.0/src/Fl_Window.cxx 2011-02-25 02:44:47.000000000 -0600 ---- fltk-1.3.0.new/src/Fl_Window.cxx 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 60,63 **** ---- 60,67 ---- - size_range_set = 0; - minw = maxw = minh = maxh = 0; -+ no_fullscreen_x = 0; -+ no_fullscreen_y = 0; -+ no_fullscreen_w = w(); -+ no_fullscreen_h = h(); - callback((Fl_Callback*)default_callback); - } -*************** -*** 66,71 **** - : Fl_Group(X, Y, W, H, l) { - cursor_default = FL_CURSOR_DEFAULT; -- cursor_fg = FL_BLACK; -- cursor_bg = FL_WHITE; - - _Fl_Window(); ---- 70,73 ---- -*************** -*** 77,82 **** - : Fl_Group((Fl_Group::current(0),0), 0, W, H, l) { - cursor_default = FL_CURSOR_DEFAULT; -- cursor_fg = FL_BLACK; -- cursor_bg = FL_WHITE; - - _Fl_Window(); ---- 79,82 ---- -*** fltk-1.3.0/src/Fl_Window_fullscreen.cxx 2011-03-12 15:36:21.000000000 -0600 ---- fltk-1.3.0.new/src/Fl_Window_fullscreen.cxx 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 61,97 **** - } - - void Fl_Window::fullscreen() { -! #ifndef WIN32 -! //this would clobber the fake wm, since it relies on the border flags to -! //determine its thickness -! border(0); -! #endif -! #if defined(__APPLE__) || defined(WIN32) || defined(USE_X11) -! int sx, sy, sw, sh; -! 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 -- resize(0,0,Fl::w(),Fl::h()); -- #endif - } - - void Fl_Window::fullscreen_off(int X,int Y,int W,int H) { -! // this order produces less blinking on IRIX: -! resize(X,Y,W,H); -! #ifndef WIN32 -! border(1); -! #endif - } - - // - // End of "$Id: Fl_Window_fullscreen.cxx 8515 2011-03-12 21:36:21Z manolo $". ---- 61,106 ---- - } - -+ void fullscreen_x(Fl_Window *w); -+ void fullscreen_off_x(); -+ void fullscreen_off_x(Fl_Window *w, int X, int Y, int W, int H); -+ -+ /* Note: The previous implementation toggled border(). With this new -+ implementation this is not necessary. Additionally, if we do that, -+ the application may lose focus when switching out of fullscreen -+ mode with some window managers. Besides, the API does not say that -+ the FLTK border state should be toggled; it only says that the -+ borders should not be *visible*. -+ */ - void Fl_Window::fullscreen() { -! if (shown() && !(flags() & Fl_Widget::FULLSCREEN)) { -! no_fullscreen_x = x(); -! no_fullscreen_y = y(); -! no_fullscreen_w = w(); -! no_fullscreen_h = h(); -! fullscreen_x(this); -! } else { -! set_flag(FULLSCREEN); - } - } - - void Fl_Window::fullscreen_off(int X,int Y,int W,int H) { -! if (shown() && (flags() & Fl_Widget::FULLSCREEN)) { -! fullscreen_off_x(this, X, Y, W, H); -! } else { -! clear_flag(FULLSCREEN); -! } -! no_fullscreen_x = no_fullscreen_y = no_fullscreen_w = no_fullscreen_h = 0; -! } -! -! void Fl_Window::fullscreen_off() { -! if (!no_fullscreen_x && !no_fullscreen_y) { -! // Window was initially created fullscreen - default to current monitor -! no_fullscreen_x = x(); -! no_fullscreen_y = y(); -! } -! fullscreen_off(no_fullscreen_x, no_fullscreen_y, no_fullscreen_w, no_fullscreen_h); - } - -+ - // - // End of "$Id: Fl_Window_fullscreen.cxx 8515 2011-03-12 21:36:21Z manolo $". -*** fltk-1.3.0/src/Fl_cocoa.mm 2011-06-16 07:35:32.000000000 -0500 ---- fltk-1.3.0.new/src/Fl_cocoa.mm 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 62,65 **** ---- 62,66 ---- - - #import <Cocoa/Cocoa.h> -+ #import <Carbon/Carbon.h> - - #ifndef NSINTEGER_DEFINED // appears with 10.5 in NSObjCRuntime.h -*************** -*** 108,112 **** - void *fl_system_menu; // this is really a NSMenu* - Fl_Sys_Menu_Bar *fl_sys_menu_bar = 0; -- void *fl_default_cursor; // this is really a NSCursor* - void *fl_capture = 0; // (NSWindow*) we need this to compensate for a missing(?) mouse capture - bool fl_show_iconic; // true if called from iconize() - shows the next created window in collapsed state ---- 109,112 ---- -*************** -*** 125,128 **** ---- 125,130 ---- - #endif - -+ bool use_simple_keyboard = false; -+ - enum { FLTKTimerEvent = 1, FLTKDataReadyEvent }; - -*************** -*** 141,144 **** ---- 143,179 ---- - } - -+ // Undocumented voodoo. Taken from Mozilla. -+ #define ENABLE_ROMAN_KYBDS_ONLY -23 -+ -+ void fl_update_focus(void) -+ { -+ Fl_Widget *focus; -+ -+ focus = Fl::grab(); -+ if (!focus) -+ focus = Fl::focus(); -+ if (!focus) -+ return; -+ -+ if (focus->simple_keyboard()) -+ use_simple_keyboard = true; -+ else -+ use_simple_keyboard = false; -+ -+ // Force a "Roman" or "ASCII" keyboard, which both the Mozilla and -+ // Safari people seem to think implies turning off advanced IME stuff -+ // (see nsTSMManager::SyncKeyScript in Mozilla and enableSecureTextInput -+ // in Safari/Webcore). Should be good enough for us then... -+ #if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) -+ CFArrayRef inputSources = TISCreateASCIICapableInputSourceList(); -+ TSMSetDocumentProperty(TSMGetActiveDocument(), -+ kTSMDocumentEnabledInputSourcesPropertyTag, -+ sizeof(CFArrayRef), &inputSources); -+ CFRelease(inputSources); -+ #else -+ KeyScript(use_simple_keyboard ? ENABLE_ROMAN_KYBDS_ONLY : smKeyEnableKybds); -+ #endif -+ } -+ - /* - * Mac keyboard lookup table -*************** -*** 615,618 **** ---- 650,657 ---- - containsGLsubwindow = contains; - } -+ - (BOOL)canBecomeKeyWindow -+ { -+ return YES; -+ } - @end - -*************** -*** 844,847 **** ---- 883,905 ---- - @end - -+ static const char* cocoaDead2FLTK(const char *in) -+ { -+ if (strcmp(in, "\140") == 0) // GRAVE ACCENT -+ return "\314\200"; // COMBINING GRAVE ACCENT -+ if (strcmp(in, "\302\264") == 0) // ACUTE ACCENT -+ return "\314\201"; // COMBINING ACUTE ACCENT -+ if (strcmp(in, "\136") == 0) // CIRCUMFLEX ACCENT -+ return "\314\202"; // COMBINING CIRCUMFLEX ACCENT -+ if (strcmp(in, "\176") == 0) // TILDE -+ return "\314\203"; // COMBINING TILDE -+ if (strcmp(in, "\302\250") == 0) // DIAERESIS -+ return "\314\210"; // COMBINING DIAERESIS -+ // FIXME: OS X dead key behaviour isn't documented and I don't have -+ // any more keyboards to test with... -+ -+ // hope that OS X gave us something proper to begin with -+ return in; -+ } -+ - /* - Handle cocoa keyboard events -*************** -*** 1034,1037 **** ---- 1092,1099 ---- - FLWindow *nsw = (FLWindow*)[notif object]; - Fl_Window *window = [nsw getFl_Window]; -+ /* Fullscreen windows obscure all other windows so we need to return -+ to a "normal" level when the user switches to another window */ -+ if (window->fullscreen_active()) -+ [nsw setLevel:NSNormalWindowLevel]; - Fl::handle( FL_UNFOCUS, window); - fl_unlock_function(); -*************** -*** 1042,1045 **** ---- 1104,1110 ---- - FLWindow *nsw = (FLWindow*)[notif object]; - Fl_Window *w = [nsw getFl_Window]; -+ /* Restore previous fullscreen level */ -+ if (w->fullscreen_active()) -+ [nsw setLevel:NSStatusWindowLevel]; - if ( w->border() || (!w->modal() && !w->tooltip_window()) ) Fl::handle( FL_FOCUS, w); - fl_unlock_function(); -*************** -*** 1229,1235 **** ---- 1294,1304 ---- - @end - -+ static void clipboard_check(void); -+ - @implementation FLApplication - + (void)sendEvent:(NSEvent *)theEvent - { -+ // update clipboard status -+ clipboard_check(); - NSEventType type = [theEvent type]; - if (type == NSLeftMouseDown) { -*************** -*** 1286,1291 **** - while (ign_event); - -- fl_default_cursor = [NSCursor arrowCursor]; -- - // bring the application into foreground without a 'CARB' resource - Boolean same_psn; ---- 1355,1358 ---- -*************** -*** 1587,1590 **** ---- 1654,1658 ---- - - (BOOL)acceptsFirstResponder; - - (BOOL)acceptsFirstMouse:(NSEvent*)theEvent; -+ - (void)resetCursorRects; - - (BOOL)performKeyEquivalent:(NSEvent*)theEvent; - - (void)mouseUp:(NSEvent *)theEvent; -*************** -*** 1644,1647 **** ---- 1712,1725 ---- - return (first == w || !first->modal()); - } -+ - (void)resetCursorRects { -+ Fl_Window *w = [(FLWindow*)[self window] getFl_Window]; -+ Fl_X *i = Fl_X::i(w); -+ // We have to have at least one cursor rect for invalidateCursorRectsForView -+ // to work, hence the "else" clause. -+ if (i->cursor) -+ [self addCursorRect:[self visibleRect] cursor:(NSCursor*)i->cursor]; -+ else -+ [self addCursorRect:[self visibleRect] cursor:[NSCursor arrowCursor]]; -+ } - - (void)mouseUp:(NSEvent *)theEvent { - cocoaMouseHandler(theEvent); -*************** -*** 1703,1708 **** - } - } - if (!no_text_key && !(Fl::e_state & FL_META) ) { -! // Don't send cmd-<key> to interpretKeyEvents because it beeps. - // Then we can let the OS have a stab at it and see if it thinks it - // should result in some text ---- 1781,1791 ---- - } - } -+ // Don't send cmd-<key> to interpretKeyEvents because it beeps. - if (!no_text_key && !(Fl::e_state & FL_META) ) { -! // The simple keyboard model will ignore insertText, so we need to grab -! // the symbol directly from the event. Note that we still use setMarkedText. -! if (use_simple_keyboard) -! [FLView prepareEtext:[theEvent charactersIgnoringModifiers]]; -! - // Then we can let the OS have a stab at it and see if it thinks it - // should result in some text -*************** -*** 1883,1901 **** - - if (!in_key_event) fl_lock_function(); - [FLView prepareEtext:received]; - // We can get called outside of key events (e.g. from the character -! // palette). Transform such actions to FL_PASTE events. - if (!in_key_event) { - Fl_Window *target = [(FLWindow*)[self window] getFl_Window]; -! Fl::handle(FL_PASTE, target); - // for some reason, the window does not redraw until the next mouse move or button push - // sending a 'redraw()' or 'awake()' does not solve the issue! - Fl::flush(); - } - if (!in_key_event) fl_unlock_function(); - } - - - (void)setMarkedText:(id)aString selectedRange:(NSRange)newSelection { -! NSString *received; - if (newSelection.location == 0) { - [self unmarkText]; ---- 1966,1993 ---- - - if (!in_key_event) fl_lock_function(); -+ -+ // Simple keyboard widgets do not want these side channel inputs. -+ if (use_simple_keyboard) -+ goto end; -+ - [FLView prepareEtext:received]; -+ - // We can get called outside of key events (e.g. from the character -! // palette). We need to fake our own key event at that point. - if (!in_key_event) { - Fl_Window *target = [(FLWindow*)[self window] getFl_Window]; -! Fl::e_keysym = Fl::e_original_keysym = 0; -! Fl::handle(FL_KEYDOWN, target); - // for some reason, the window does not redraw until the next mouse move or button push - // sending a 'redraw()' or 'awake()' does not solve the issue! - Fl::flush(); - } -+ -+ end: - if (!in_key_event) fl_unlock_function(); - } - - - (void)setMarkedText:(id)aString selectedRange:(NSRange)newSelection { -! NSString *received, *current, *aggregate; - if (newSelection.location == 0) { - [self unmarkText]; -*************** -*** 1908,1916 **** - } - //NSLog(@"setMarkedText: %@ %d %d",received,newSelection.location,newSelection.length); - // This code creates the OS X behaviour of seeing dead keys as things - // are being composed. - next_compose_length = newSelection.location; -! [FLView prepareEtext:received]; -! //NSLog(@"Fl::e_text=%@ Fl::e_length=%d next_compose_length=%d", received, Fl::e_length, next_compose_length); - } - ---- 2000,2044 ---- - } - //NSLog(@"setMarkedText: %@ %d %d",received,newSelection.location,newSelection.length); -+ -+ fl_lock_function(); -+ -+ // Simple keyboard widgets generally do not want these side channel -+ // inputs, but we have no other way of getting dead keys so we make -+ // an exception in that case. -+ if (use_simple_keyboard) { -+ if (in_key_event && (Fl::e_length == 0)) { -+ [FLView prepareEtext:received]; -+ -+ Fl::e_text = (char*)cocoaDead2FLTK(Fl::e_text); -+ Fl::e_length = strlen(Fl::e_text); -+ } -+ goto end; -+ } -+ - // This code creates the OS X behaviour of seeing dead keys as things - // are being composed. -+ // -+ // Note: The concatenation thing is because of how OS X deals with -+ // invalid sequences. At that point it will spit out one call -+ // to insertText with the now aborted sequence, and one new -+ // call to setMarkedText with the new sequence. Since we want -+ // both to be visible, we need to concatenate. - next_compose_length = newSelection.location; -! current = [NSString stringWithUTF8String:Fl::e_text]; -! aggregate = [current stringByAppendingString:received]; -! -! [FLView prepareEtext:aggregate]; -! //NSLog(@"Fl::e_text=%@ Fl::e_length=%d next_compose_length=%d", aggregate, Fl::e_length, next_compose_length); -! -! // We can get called outside of key events (e.g. from the character -! // palette). We need to fake our own key event at that point. -! if (!in_key_event) { -! Fl_Window *target = [(FLWindow*)[self window] getFl_Window]; -! Fl::e_keysym = Fl::e_original_keysym = 0; -! Fl::handle(FL_KEYDOWN, target); -! } -! -! end: -! fl_unlock_function(); - } - -*************** -*** 1982,1985 **** ---- 2110,2129 ---- - @end - -+ void fullscreen_x(Fl_Window *w) { -+ w->_set_fullscreen(); -+ /* On OS X < 10.6, it is necessary to recreate the window. This is done -+ with hide+show. */ -+ w->hide(); -+ w->show(); -+ Fl::handle(FL_FULLSCREEN, w); -+ } -+ -+ void fullscreen_off_x(Fl_Window *w, int X, int Y, int W, int H) { -+ w->_clear_fullscreen(); -+ w->hide(); -+ w->resize(X, Y, W, H); -+ w->show(); -+ Fl::handle(FL_FULLSCREEN, w); -+ } - - /* -*************** -*** 1997,2001 **** - x->region = 0; - x->subRegion = 0; -! x->cursor = fl_default_cursor; - x->gc = 0; // stay 0 for Quickdraw; fill with CGContext for Quartz - Fl_Window *win = w->window(); ---- 2141,2145 ---- - x->region = 0; - x->subRegion = 0; -! x->cursor = NULL; - x->gc = 0; // stay 0 for Quickdraw; fill with CGContext for Quartz - Fl_Window *win = w->window(); -*************** -*** 2099,2103 **** - x->region = 0; - x->subRegion = 0; -! x->cursor = fl_default_cursor; - x->xidChildren = 0; - x->xidNext = 0; ---- 2243,2247 ---- - x->region = 0; - x->subRegion = 0; -! x->cursor = NULL; - x->xidChildren = 0; - x->xidNext = 0; -*************** -*** 2105,2108 **** ---- 2249,2259 ---- - - NSRect srect = [[NSScreen mainScreen] frame]; -+ if (w->flags() & Fl_Widget::FULLSCREEN) { -+ 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); -+ winstyle = NSBorderlessWindowMask; -+ winlevel = NSStatusWindowLevel; -+ } - NSRect crect; - crect.origin.x = w->x(); -*************** -*** 2553,2556 **** ---- 2704,2728 ---- - } - -+ extern void fl_trigger_clipboard_notify(int source); -+ -+ void fl_clipboard_notify_change() { -+ // No need to do anything here... -+ } -+ -+ static void clipboard_check(void) -+ { -+ PasteboardSyncFlags flags; -+ -+ allocatePasteboard(); -+ flags = PasteboardSynchronize(myPasteboard); -+ -+ if (!(flags & kPasteboardModified)) -+ return; -+ if (flags & kPasteboardClientIsOwner) -+ return; -+ -+ fl_trigger_clipboard_notify(1); -+ } -+ - void Fl::add_timeout(double time, Fl_Timeout_Handler cb, void* data) - { -*************** -*** 2677,2680 **** ---- 2849,2856 ---- - [(NSWindow *)xid close]; - } -+ if (cursor) { -+ [(NSCursor*)cursor release]; -+ cursor = NULL; -+ } - } - -*************** -*** 2792,2857 **** - } - -! static NSCursor *PrepareCursor(NSCursor *cursor, CGContextRef (*f)() ) - { -! if (cursor == nil) { -! CGContextRef c = f(); -! NSImage *image = CGBitmapContextToNSImage(c); -! fl_delete_offscreen( (Fl_Offscreen)c ); -! NSPoint pt = {[image size].width/2, [image size].height/2}; -! cursor = [[NSCursor alloc] initWithImage:image hotSpot:pt]; - } -- return cursor; -- } - -- void Fl_X::set_cursor(Fl_Cursor c) -- { -- NSCursor *icrsr; - switch (c) { -! case FL_CURSOR_CROSS: icrsr = [NSCursor crosshairCursor]; break; -! case FL_CURSOR_WAIT: -! static NSCursor *watch = nil; -! watch = PrepareCursor(watch, &Fl_X::watch_cursor_image); -! icrsr = watch; -! break; -! case FL_CURSOR_INSERT: icrsr = [NSCursor IBeamCursor]; break; -! case FL_CURSOR_N: icrsr = [NSCursor resizeUpCursor]; break; -! case FL_CURSOR_S: icrsr = [NSCursor resizeDownCursor]; break; -! case FL_CURSOR_NS: icrsr = [NSCursor resizeUpDownCursor]; break; -! case FL_CURSOR_HELP: -! static NSCursor *help = nil; -! help = PrepareCursor(help, &Fl_X::help_cursor_image); -! icrsr = help; -! break; -! case FL_CURSOR_HAND: icrsr = [NSCursor pointingHandCursor]; break; -! case FL_CURSOR_MOVE: icrsr = [NSCursor openHandCursor]; break; -! case FL_CURSOR_NE: -! case FL_CURSOR_SW: -! case FL_CURSOR_NESW: -! static NSCursor *nesw = nil; -! nesw = PrepareCursor(nesw, &Fl_X::nesw_cursor_image); -! icrsr = nesw; -! break; -! case FL_CURSOR_E: icrsr = [NSCursor resizeRightCursor]; break; -! case FL_CURSOR_W: icrsr = [NSCursor resizeLeftCursor]; break; -! case FL_CURSOR_WE: icrsr = [NSCursor resizeLeftRightCursor]; break; -! case FL_CURSOR_SE: -! case FL_CURSOR_NW: -! case FL_CURSOR_NWSE: -! static NSCursor *nwse = nil; -! nwse = PrepareCursor(nwse, &Fl_X::nwse_cursor_image); -! icrsr = nwse; -! break; -! case FL_CURSOR_NONE: -! static NSCursor *none = nil; -! none = PrepareCursor(none, &Fl_X::none_cursor_image); -! icrsr = none; -! break; -! case FL_CURSOR_ARROW: -! case FL_CURSOR_DEFAULT: -! default: icrsr = [NSCursor arrowCursor]; -! break; - } -! [icrsr set]; -! cursor = icrsr; - } - ---- 2968,3071 ---- - } - -! int Fl_X::set_cursor(Fl_Cursor c) - { -! if (cursor) { -! [(NSCursor*)cursor release]; -! cursor = NULL; - } - - switch (c) { -! case FL_CURSOR_ARROW: cursor = [NSCursor arrowCursor]; break; -! case FL_CURSOR_CROSS: cursor = [NSCursor crosshairCursor]; break; -! case FL_CURSOR_INSERT: cursor = [NSCursor IBeamCursor]; break; -! case FL_CURSOR_HAND: cursor = [NSCursor pointingHandCursor]; break; -! case FL_CURSOR_MOVE: cursor = [NSCursor openHandCursor]; break; -! case FL_CURSOR_NS: cursor = [NSCursor resizeUpDownCursor]; break; -! case FL_CURSOR_WE: cursor = [NSCursor resizeLeftRightCursor]; break; -! case FL_CURSOR_N: cursor = [NSCursor resizeUpCursor]; break; -! case FL_CURSOR_E: cursor = [NSCursor resizeRightCursor]; break; -! case FL_CURSOR_W: cursor = [NSCursor resizeLeftCursor]; break; -! case FL_CURSOR_S: cursor = [NSCursor resizeDownCursor]; break; -! default: -! return 0; -! } -! -! [(NSCursor*)cursor retain]; -! -! [(NSWindow*)xid invalidateCursorRectsForView:[(NSWindow*)xid contentView]]; -! -! return 1; -! } -! -! int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) { -! if (cursor) { -! [(NSCursor*)cursor release]; -! cursor = NULL; -! } -! -! if ((hotx < 0) || (hotx >= image->w())) -! return 0; -! if ((hoty < 0) || (hoty >= image->h())) -! return 0; -! -! // OS X >= 10.6 can create a NSImage from a CGImage, but we need to -! // support older versions, hence this pesky handling. -! -! NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] -! initWithBitmapDataPlanes:NULL -! pixelsWide:image->w() -! pixelsHigh:image->h() -! bitsPerSample:8 -! samplesPerPixel:image->d() -! hasAlpha:!(image->d() & 1) -! isPlanar:NO -! colorSpaceName:(image->d()<=2) ? NSDeviceWhiteColorSpace : NSDeviceRGBColorSpace -! bytesPerRow:(image->w() * image->d()) -! bitsPerPixel:(image->d()*8)]; -! -! // Alpha needs to be premultiplied for this format -! -! const uchar *i = (const uchar*)*image->data(); -! unsigned char *o = [bitmap bitmapData]; -! for (int y = 0;y < image->h();y++) { -! if (image->d() & 1) { -! for (int x = 0;x < image->w();x++) { -! unsigned int alpha; -! if (image->d() == 4) { -! alpha = i[3]; -! *o++ = (unsigned char)((unsigned int)*i++ * alpha / 255); -! *o++ = (unsigned char)((unsigned int)*i++ * alpha / 255); -! } -! -! alpha = i[1]; -! *o++ = (unsigned char)((unsigned int)*i++ * alpha / 255); -! *o++ = alpha; -! i++; -! } -! } else { -! // No alpha, so we can just copy everything directly. -! int len = image->w() * image->d(); -! memcpy(o, i, len); -! o += len; -! i += len; -! } -! i += image->ld(); - } -! -! NSImage *nsimage = [[NSImage alloc] -! initWithSize:NSMakeSize(image->w(), image->h())]; -! -! [nsimage addRepresentation:bitmap]; -! -! cursor = [[NSCursor alloc] -! initWithImage:nsimage -! hotSpot:NSMakePoint(hotx, hoty)]; -! -! [(NSWindow*)xid invalidateCursorRectsForView:[(NSWindow*)xid contentView]]; -! -! [bitmap release]; -! [nsimage release]; -! -! return 1; - } - -*** fltk-1.3.0/src/Fl_grab.cxx 2010-12-18 16:31:01.000000000 -0600 ---- fltk-1.3.0.new/src/Fl_grab.cxx 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 39,42 **** ---- 39,43 ---- - - extern void fl_fix_focus(); // in Fl.cxx -+ void fl_update_focus(void); - - #ifdef WIN32 -*************** -*** 51,55 **** ---- 52,68 ---- - #endif - -+ #if !(defined(WIN32) || defined(__APPLE__)) -+ extern int ewmh_supported(); // from Fl_x.cxx -+ #endif -+ - void Fl::grab(Fl_Window* win) { -+ Fl_Window *fullscreen_win = NULL; -+ for (Fl_Window *W = Fl::first_window(); W; W = Fl::next_window(W)) { -+ if (W->fullscreen_active()) { -+ fullscreen_win = W; -+ break; -+ } -+ } -+ - if (win) { - if (!grab_) { -*************** -*** 61,66 **** - Fl_X::i(first_window())->set_key_window(); - #else - XGrabPointer(fl_display, -! fl_xid(first_window()), - 1, - ButtonPressMask|ButtonReleaseMask| ---- 74,80 ---- - Fl_X::i(first_window())->set_key_window(); - #else -+ Window xid = fullscreen_win ? fl_xid(fullscreen_win) : fl_xid(first_window()); - XGrabPointer(fl_display, -! xid, - 1, - ButtonPressMask|ButtonReleaseMask| -*************** -*** 72,76 **** - fl_event_time); - XGrabKeyboard(fl_display, -! fl_xid(first_window()), - 1, - GrabModeAsync, ---- 86,90 ---- - fl_event_time); - XGrabKeyboard(fl_display, -! xid, - 1, - GrabModeAsync, -*************** -*** 80,83 **** ---- 94,98 ---- - } - grab_ = win; -+ fl_update_focus(); - } else { - if (grab_) { -*************** -*** 88,92 **** ---- 103,110 ---- - fl_capture = 0; - #else -+ // We must keep the grab in the non-EWMH fullscreen case -+ if (!fullscreen_win || ewmh_supported()) { - XUngrabKeyboard(fl_display, fl_event_time); -+ } - XUngrabPointer(fl_display, fl_event_time); - // this flush is done in case the picked menu item goes into -*************** -*** 95,98 **** ---- 113,117 ---- - #endif - grab_ = 0; -+ fl_update_focus(); - fl_fix_focus(); - } -*** fltk-1.3.0/src/Fl_win32.cxx 2011-05-30 07:33:51.000000000 -0500 ---- fltk-1.3.0.new/src/Fl_win32.cxx 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 99,102 **** ---- 99,104 ---- - Fl_Display_Device *Fl_Display_Device::_display = &fl_gdi_display; // the platform display - -+ bool use_simple_keyboard = false; -+ - // dynamic wsock dll handling api: - #if defined(__CYGWIN__) && !defined(SOCKET) -*************** -*** 132,135 **** ---- 134,139 ---- - */ - static HMODULE s_imm_module = 0; -+ typedef BOOL (WINAPI* flTypeImmAssociateContextEx)(HWND, HIMC, DWORD); -+ static flTypeImmAssociateContextEx flImmAssociateContextEx = 0; - typedef HIMC (WINAPI* flTypeImmGetContext)(HWND); - static flTypeImmGetContext flImmGetContext = 0; -*************** -*** 147,150 **** ---- 151,155 ---- - Fl::fatal("FLTK Lib Error: IMM32.DLL file not found!\n\n" - "Please check your input method manager library accessibility."); -+ flImmAssociateContextEx = (flTypeImmAssociateContextEx)GetProcAddress(s_imm_module, "ImmAssociateContextEx"); - flImmGetContext = (flTypeImmGetContext)GetProcAddress(s_imm_module, "ImmGetContext"); - flImmSetCompositionWindow = (flTypeImmSetCompositionWindow)GetProcAddress(s_imm_module, "ImmSetCompositionWindow"); -*************** -*** 425,429 **** - } - -! TranslateMessage(&fl_msg); - DispatchMessageW(&fl_msg); - have_message = PeekMessageW(&fl_msg, NULL, 0, 0, PM_REMOVE); ---- 430,439 ---- - } - -! // Don't bother with key to character translation as we do -! // it manually for simpley keyboard widgets. In fact, calling -! // TranslateMessage() just makes it more difficult as it sets -! // a bunch of internal state. -! if (!use_simple_keyboard) -! TranslateMessage(&fl_msg); - DispatchMessageW(&fl_msg); - have_message = PeekMessageW(&fl_msg, NULL, 0, 0, PM_REMOVE); -*************** -*** 543,546 **** ---- 553,586 ---- - }; - -+ void fl_update_clipboard(void) { -+ HWND hwnd = fl_xid(Fl::first_window()); -+ -+ if (!hwnd) -+ return; -+ -+ if (!OpenClipboard(hwnd)) -+ return; -+ -+ EmptyClipboard(); -+ -+ int utf16_len = fl_utf8toUtf16(fl_selection_buffer[1], -+ fl_selection_length[1], 0, 0); -+ -+ HGLOBAL hMem = GlobalAlloc(GHND, utf16_len * 2 + 2); // moveable and zero'ed mem alloc. -+ LPVOID memLock = GlobalLock(hMem); -+ -+ fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1], -+ (unsigned short*) memLock, utf16_len + 1); -+ -+ GlobalUnlock(hMem); -+ SetClipboardData(CF_UNICODETEXT, hMem); -+ -+ CloseClipboard(); -+ -+ // In case Windows managed to lob of a WM_DESTROYCLIPBOARD during -+ // the above. -+ fl_i_own_selection[1] = 1; -+ } -+ - // call this when you create a selection: - void Fl::copy(const char *stuff, int len, int clipboard) { -*************** -*** 560,582 **** - fl_selection_buffer[clipboard][len] = 0; // needed for direct paste - fl_selection_length[clipboard] = len; -! if (clipboard) { -! // set up for "delayed rendering": -! if (OpenClipboard(NULL)) { -! // if the system clipboard works, use it -! int utf16_len = fl_utf8toUtf16(fl_selection_buffer[clipboard], fl_selection_length[clipboard], 0, 0); -! EmptyClipboard(); -! HGLOBAL hMem = GlobalAlloc(GHND, utf16_len * 2 + 2); // moveable and zero'ed mem alloc. -! LPVOID memLock = GlobalLock(hMem); -! fl_utf8toUtf16(fl_selection_buffer[clipboard], fl_selection_length[clipboard], (unsigned short*) memLock, utf16_len + 1); -! GlobalUnlock(hMem); -! SetClipboardData(CF_UNICODETEXT, hMem); -! CloseClipboard(); -! GlobalFree(hMem); -! fl_i_own_selection[clipboard] = 0; -! } else { -! // only if it fails, instruct paste() to use the internal buffers -! fl_i_own_selection[clipboard] = 1; -! } -! } - } - ---- 600,606 ---- - fl_selection_buffer[clipboard][len] = 0; // needed for direct paste - fl_selection_length[clipboard] = len; -! fl_i_own_selection[clipboard] = 1; -! if (clipboard) -! fl_update_clipboard(); - } - -*************** -*** 631,634 **** ---- 655,690 ---- - } - -+ static HWND clipboard_wnd = 0; -+ static HWND next_clipboard_wnd = 0; -+ -+ static bool initial_clipboard = true; -+ -+ void fl_clipboard_notify_change() { -+ // No need to do anything here... -+ } -+ -+ void fl_clipboard_notify_target(HWND wnd) { -+ if (clipboard_wnd) -+ return; -+ -+ // We get one fake WM_DRAWCLIPBOARD immediately, which we therefore -+ // need to ignore. -+ initial_clipboard = true; -+ -+ clipboard_wnd = wnd; -+ next_clipboard_wnd = SetClipboardViewer(wnd); -+ } -+ -+ void fl_clipboard_notify_untarget(HWND wnd) { -+ if (wnd != clipboard_wnd) -+ return; -+ -+ ChangeClipboardChain(wnd, next_clipboard_wnd); -+ clipboard_wnd = next_clipboard_wnd = 0; -+ -+ if (Fl::first_window()) -+ fl_clipboard_notify_target(fl_xid(Fl::first_window())); -+ } -+ - //////////////////////////////////////////////////////////////// - char fl_is_ime = 0; -*************** -*** 650,653 **** ---- 706,752 ---- - } - -+ void fl_update_focus(void) -+ { -+ Fl_Widget *focus; -+ Fl_Window *win; -+ -+ get_imm_module(); -+ -+ focus = Fl::grab(); -+ if (!focus) -+ focus = Fl::focus(); -+ if (!focus) -+ return; -+ -+ // Grabs are special in that events are sent to the first -+ // available window -+ if (focus == Fl::grab()) -+ win = Fl::first_window(); -+ else { -+ win = focus->as_window(); -+ if (!win) -+ win = focus->window(); -+ } -+ -+ if (!win) { -+ Fl::warning("Cannot find window for widget receiving focus"); -+ return; -+ } -+ -+ // No Win32 window created yet -+ if (!Fl_X::i(win) || !fl_xid(win)) -+ return; -+ -+ if (focus->simple_keyboard()) { -+ use_simple_keyboard = true; -+ if (flImmGetContext(fl_xid(win)) != 0) -+ flImmAssociateContextEx(fl_xid(win), 0, 0); -+ } else { -+ use_simple_keyboard = false; -+ if (flImmGetContext(fl_xid(win)) == 0) -+ flImmAssociateContextEx(fl_xid(win), 0, IACE_DEFAULT); -+ } -+ } -+ - HWND fl_capture; - -*************** -*** 797,800 **** ---- 896,920 ---- - } - -+ static xchar msdead2fltk(xchar in) -+ { -+ switch (in) { -+ case 0x0060: // GRAVE ACCENT -+ return 0x0300; // COMBINING GRAVE ACCENT -+ case 0x00b4: // ACUTE ACCENT -+ return 0x0301; // COMBINING ACUTE ACCENT -+ case 0x005e: // CIRCUMFLEX ACCENT -+ return 0x0302; // COMBINING CIRCUMFLEX ACCENT -+ case 0x007e: // TILDE -+ return 0x0303; // COMBINING TILDE -+ case 0x00a8: // DIAERESIS -+ return 0x0308; // COMBINING DIAERESIS -+ // FIXME: Windows dead key behaviour isn't documented and I don't have -+ // any more keyboards to test with... -+ } -+ -+ // hope that Windows gave us something proper to begin with -+ return in; -+ } -+ - #if USE_COLORMAP - extern HPALETTE fl_select_palette(void); // in fl_color_win32.cxx -*************** -*** 858,861 **** ---- 978,983 ---- - //fl_msg.lPrivate = ??? - -+ MSG fl_orig_msg = fl_msg; -+ - Fl_Window *window = fl_find(hWnd); - -*************** -*** 1037,1057 **** - Fl::e_state = state; - static char buffer[1024]; -- if (uMsg == WM_CHAR || uMsg == WM_SYSCHAR) { - - xchar u = (xchar) wParam; - // Fl::e_length = fl_unicode2utf(&u, 1, buffer); - Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1); - buffer[Fl::e_length] = 0; - -! -! } else if (Fl::e_keysym >= FL_KP && Fl::e_keysym <= FL_KP_Last) { -! if (state & FL_NUM_LOCK) { -! // Convert to regular keypress... -! buffer[0] = Fl::e_keysym-FL_KP; -! Fl::e_length = 1; -! } else { -! // Convert to special keypress... -! buffer[0] = 0; -! Fl::e_length = 0; - switch (Fl::e_keysym) { - case FL_KP + '0' : ---- 1159,1238 ---- - Fl::e_state = state; - static char buffer[1024]; - -+ if (use_simple_keyboard) { -+ BYTE keystate[256]; -+ WCHAR wbuf[8]; -+ int ret; -+ -+ // I'm not sure if we ever get WM_CHAR (& friends) without an initial -+ // WM_KEYDOWN (& friends), but if we do then we should not send such -+ // side band events to simple keyboard widgets. -+ if ((fl_orig_msg.message != WM_KEYDOWN) && -+ (fl_orig_msg.message != WM_SYSKEYDOWN) && -+ (fl_orig_msg.message != WM_KEYUP) && -+ (fl_orig_msg.message != WM_SYSKEYUP)) -+ break; -+ -+ GetKeyboardState(keystate); -+ -+ // Pressing Ctrl wreaks havoc with the symbol lookup, so turn that off. -+ // But AltGr shows up as Ctrl+Alt in Windows, so keep Ctrl if Alt is -+ // active. -+ if (!(keystate[VK_MENU] & (1<<31))) -+ keystate[VK_CONTROL] = keystate[VK_LCONTROL] = keystate[VK_RCONTROL] = 0; -+ -+ // We cannot inspect or modify Windows' internal state of the keyboard -+ // so we have to try to infer information from ToUnicode() and wedge -+ // things into a known state. -+ for (int i = 0;i < 2;i++) { -+ ret = ToUnicode(fl_orig_msg.wParam, 0, keystate, wbuf, -+ sizeof(wbuf)/sizeof(wbuf[0]), 0); -+ -+ // No symbol for this key (or unexpected length) -+ if ((ret == 0) || (ret < -1)) { -+ buffer[0] = 0; -+ Fl::e_length = 0; -+ break; -+ } -+ -+ // A dead key. Convert this to a Unicode combining character so -+ // that the application can tell the difference between dead and -+ // normal keys. -+ if (ret == -1) { -+ xchar u = (xchar) msdead2fltk(wbuf[0]); -+ Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1); -+ buffer[Fl::e_length] = 0; -+ break; -+ } -+ -+ // If we have two characters (or more) from ToUnicode(), that's -+ // an invalid sequence. One character chould mean a proper symbol, -+ // or it could mean a composed one. In both cases we need to call -+ // ToUnicode() again to get something sane. -+ if (i == 0) -+ continue; -+ -+ // We should now have something sane. Give whatever we have to the -+ // application. -+ Fl::e_length = fl_utf8fromwc(buffer, 1024, wbuf, ret); -+ buffer[Fl::e_length] = 0; -+ } -+ } else if (uMsg == WM_CHAR || uMsg == WM_SYSCHAR) { - xchar u = (xchar) wParam; - // Fl::e_length = fl_unicode2utf(&u, 1, buffer); - Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1); - buffer[Fl::e_length] = 0; -+ } else { -+ buffer[0] = 0; -+ Fl::e_length = 0; -+ } - -! // The keypad area is a bit odd in that we need to change the keysym -! // to properly indicate what the user meant, unlike other keys where -! // we normally change the text and keep keysym stable. -! if (Fl::e_keysym >= FL_KP && Fl::e_keysym <= FL_KP_Last) { -! // The initial mapping tables give us a keysym that corresponds to -! // numlock being on, so we only do something when it is off. -! if (!(state & FL_NUM_LOCK)) { - switch (Fl::e_keysym) { - case FL_KP + '0' : -*************** -*** 1085,1112 **** - Fl::e_keysym = FL_Delete; - break; -- case FL_KP + '/' : -- case FL_KP + '*' : -- case FL_KP + '-' : -- case FL_KP + '+' : -- buffer[0] = Fl::e_keysym-FL_KP; -- Fl::e_length = 1; -- break; - } - } -- } else if ((lParam & (1<<31))==0) { -- #ifdef FLTK_PREVIEW_DEAD_KEYS -- if ((lParam & (1<<24))==0) { // clear if dead key (always?) -- xchar u = (xchar) wParam; -- Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1); -- buffer[Fl::e_length] = 0; -- } else { // set if "extended key" (never printable?) -- buffer[0] = 0; -- Fl::e_length = 0; -- } -- #else -- buffer[0] = 0; -- Fl::e_length = 0; -- #endif - } - Fl::e_text = buffer; - if (lParam & (1<<31)) { // key up events. ---- 1266,1273 ---- - Fl::e_keysym = FL_Delete; - break; - } - } - } -+ - Fl::e_text = buffer; - if (lParam & (1<<31)) { // key up events. -*************** -*** 1126,1129 **** ---- 1287,1291 ---- - static int delta = 0; // running total of all motion - delta += (SHORT)(HIWORD(wParam)); -+ Fl::e_dx = 0; - Fl::e_dy = -delta / WHEEL_DELTA; - delta += Fl::e_dy * WHEEL_DELTA; -*************** -*** 1132,1135 **** ---- 1294,1312 ---- - } - -+ // This is only defined on Vista and upwards... -+ #ifndef WM_MOUSEHWHEEL -+ #define WM_MOUSEHWHEEL 0x020E -+ #endif -+ -+ case WM_MOUSEHWHEEL: { -+ static int delta = 0; // running total of all motion -+ delta += (SHORT)(HIWORD(wParam)); -+ Fl::e_dy = 0; -+ Fl::e_dx = delta / WHEEL_DELTA; -+ delta -= Fl::e_dx * WHEEL_DELTA; -+ if (Fl::e_dx) Fl::handle(FL_MOUSEWHEEL, window); -+ return 0; -+ } -+ - case WM_GETMINMAXINFO: - Fl_X::i(window)->set_minmax((LPMINMAXINFO)lParam); -*************** -*** 1186,1216 **** - return 1; - -! case WM_RENDERALLFORMATS: -! fl_i_own_selection[1] = 0; -! // Windoze seems unhappy unless I do these two steps. Documentation -! // seems to vary on whether opening the clipboard is necessary or -! // is in fact wrong: -! CloseClipboard(); -! OpenClipboard(NULL); -! // fall through... -! case WM_RENDERFORMAT: { -! HANDLE h; -! -! // int l = fl_utf_nb_char((unsigned char*)fl_selection_buffer[1], fl_selection_length[1]); -! int l = fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1], NULL, 0); // Pass NULL buffer to query length required -! h = GlobalAlloc(GHND, (l+1) * sizeof(unsigned short)); -! if (h) { -! unsigned short *g = (unsigned short*) GlobalLock(h); -! // fl_utf2unicode((unsigned char *)fl_selection_buffer[1], fl_selection_length[1], (xchar*)g); -! l = fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1], g, (l+1)); -! g[l] = 0; -! GlobalUnlock(h); -! SetClipboardData(CF_UNICODETEXT, h); - } - -! // Windoze also seems unhappy if I don't do this. Documentation very -! // unclear on what is correct: -! if (fl_msg.message == WM_RENDERALLFORMATS) CloseClipboard(); -! return 1;} - - default: ---- 1363,1386 ---- - return 1; - -! case WM_CHANGECBCHAIN: -! if ((hWnd == clipboard_wnd) && -! (next_clipboard_wnd == (HWND)wParam)) { -! next_clipboard_wnd = (HWND)lParam; -! return 0; - } -+ break; -+ -+ case WM_DRAWCLIPBOARD: -+ // When the clipboard moves between two FLTK windows, -+ // fl_i_own_selection will temporarily be false as we are -+ // processing this message. Hence the need to use fl_find(). -+ if (!initial_clipboard && !fl_find(GetClipboardOwner())) -+ fl_trigger_clipboard_notify(1); -+ initial_clipboard = false; - -! if (next_clipboard_wnd) -! SendMessage(next_clipboard_wnd, WM_DRAWCLIPBOARD, wParam, lParam); -! -! return 0; - - default: -*************** -*** 1321,1324 **** ---- 1491,1499 ---- - Y+=yoff; - -+ if (w->flags() & Fl_Widget::FULLSCREEN) { -+ X = Y = 0; -+ bx = by = bt = 0; -+ } -+ - return ret; - } -*************** -*** 1371,1374 **** ---- 1546,1601 ---- - } - -+ static void make_fullscreen(Fl_Window *w, Window xid, int X, int Y, int W, int H) { -+ int sx, sy, sw, sh; -+ Fl::screen_xywh(sx, sy, sw, sh, X, Y, W, H); -+ 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); -+ } -+ -+ void fullscreen_x(Fl_Window *w) { -+ w->_set_fullscreen(); -+ make_fullscreen(w, fl_xid(w), w->x(), w->y(), w->w(), w->h()); -+ Fl::handle(FL_FULLSCREEN, w); -+ } -+ -+ void fullscreen_off_x(Fl_Window *w, int X, int Y, int W, int H) { -+ w->_clear_fullscreen(); -+ DWORD style = GetWindowLong(fl_xid(w), GWL_STYLE); -+ // Remove the xid temporarily so that Fl_X::fake_X_wm() behaves like it -+ // does in Fl_X::make(). -+ HWND xid = fl_xid(w); -+ Fl_X::i(w)->xid = NULL; -+ int x, y, bt, bx, by; -+ switch (Fl_X::fake_X_wm(w, x, y, bt, bx, by)) { -+ case 0: -+ break; -+ case 1: -+ style |= WS_CAPTION; -+ break; -+ case 2: -+ if (w->border()) { -+ style |= WS_THICKFRAME | WS_CAPTION; -+ } -+ break; -+ } -+ Fl_X::i(w)->xid = xid; -+ // Adjust for decorations (but not if that puts the decorations -+ // outside the screen) -+ if ((X != w->x()) || (Y != w->y())) { -+ X -= bx; -+ Y -= by+bt; -+ } -+ W += bx*2; -+ H += by*2+bt; -+ SetWindowLong(fl_xid(w), GWL_STYLE, style); -+ SetWindowPos(fl_xid(w), 0, X, Y, W, H, -+ SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED); -+ Fl::handle(FL_FULLSCREEN, w); -+ } -+ -+ - //////////////////////////////////////////////////////////////// - -*************** -*** 1409,1413 **** - char fl_show_iconic; // hack for Fl_Window::iconic() - // int fl_background_pixel = -1; // color to use for background -- HCURSOR fl_default_cursor; - UINT fl_wake_msg = 0; - int fl_disable_transient_for; // secret method of removing TRANSIENT_FOR ---- 1636,1639 ---- -*************** -*** 1457,1461 **** - w->icon((void *)LoadIcon(NULL, IDI_APPLICATION)); - wcw.hIcon = wcw.hIconSm = (HICON)w->icon(); -! wcw.hCursor = fl_default_cursor = LoadCursor(NULL, IDC_ARROW); - //uchar r,g,b; Fl::get_color(FL_GRAY,r,g,b); - //wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(r,g,b)); ---- 1683,1687 ---- - w->icon((void *)LoadIcon(NULL, IDI_APPLICATION)); - wcw.hIcon = wcw.hIconSm = (HICON)w->icon(); -! wcw.hCursor = LoadCursor(NULL, IDC_ARROW); - //uchar r,g,b; Fl::get_color(FL_GRAY,r,g,b); - //wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(r,g,b)); -*************** -*** 1500,1515 **** - switch (fake_X_wm(w, xwm, ywm, bt, bx, by)) { - // No border (used for menus) -! case 0: style |= WS_POPUP; -! styleEx |= WS_EX_TOOLWINDOW; - break; - - // Thin border and title bar -! case 1: style |= WS_DLGFRAME | WS_CAPTION; break; - - // Thick, resizable border and title bar, with maximize button -! case 2: style |= WS_THICKFRAME | WS_MAXIMIZEBOX | WS_CAPTION ; break; - } - if (by+bt) { -- if (!w->modal()) style |= WS_SYSMENU | WS_MINIMIZEBOX; - wp += 2*bx; - hp += 2*by+bt; ---- 1726,1749 ---- - switch (fake_X_wm(w, xwm, ywm, bt, bx, by)) { - // No border (used for menus) -! case 0: -! style |= WS_POPUP; -! styleEx |= WS_EX_TOOLWINDOW; - break; - - // Thin border and title bar -! case 1: -! style |= WS_DLGFRAME | WS_CAPTION; -! if (!w->modal()) -! style |= WS_SYSMENU | WS_MINIMIZEBOX; -! break; - - // Thick, resizable border and title bar, with maximize button -! case 2: -! style |= WS_THICKFRAME | WS_SYSMENU | WS_MAXIMIZEBOX | WS_CAPTION; -! if (!w->modal()) -! style |= WS_MINIMIZEBOX; -! break; - } - if (by+bt) { - wp += 2*bx; - hp += 2*by+bt; -*************** -*** 1541,1545 **** - x->region = 0; - x->private_dc = 0; -! x->cursor = fl_default_cursor; - if (!fl_codepage) fl_get_codepage(); - ---- 1775,1779 ---- - x->region = 0; - x->private_dc = 0; -! x->cursor = LoadCursor(NULL, IDC_ARROW); - if (!fl_codepage) fl_get_codepage(); - -*************** -*** 1567,1573 **** ---- 1801,1821 ---- - if (lab) free(lab); - -+ if (w->flags() & Fl_Widget::FULLSCREEN) { -+ /* We need to make sure that the fullscreen is created on the -+ default monitor, ie the desktop where the shortcut is located -+ etc. This requires that CreateWindow is called with CW_USEDEFAULT -+ for x and y. We can then use GetWindowRect to determine which -+ 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->next = Fl_X::first; - Fl_X::first = x; - -+ fl_clipboard_notify_target(x->xid); -+ - x->wait_for_expose = 1; - if (fl_show_iconic) {showit = 0; fl_show_iconic = 0;} -*************** -*** 1582,1586 **** - // other windows from the code, or we lose the capture. - ShowWindow(x->xid, !showit ? SW_SHOWMINNOACTIVE : -! (Fl::grab() || (style & WS_POPUP)) ? SW_SHOWNOACTIVATE : SW_SHOWNORMAL); - - // Register all windows for potential drag'n'drop operations ---- 1830,1834 ---- - // other windows from the code, or we lose the capture. - ShowWindow(x->xid, !showit ? SW_SHOWMINNOACTIVE : -! (Fl::grab() || (styleEx & WS_EX_TOOLWINDOW)) ? SW_SHOWNOACTIVATE : SW_SHOWNORMAL); - - // Register all windows for potential drag'n'drop operations -*************** -*** 1778,1781 **** ---- 2026,2152 ---- - - //////////////////////////////////////////////////////////////// -+ -+ #ifndef IDC_HAND -+ # define IDC_HAND MAKEINTRESOURCE(32649) -+ #endif // !IDC_HAND -+ -+ int Fl_X::set_cursor(Fl_Cursor c) { -+ LPSTR n; -+ -+ if (c == FL_CURSOR_NONE) -+ cursor = NULL; -+ else { -+ switch (c) { -+ case FL_CURSOR_ARROW: n = IDC_ARROW; break; -+ case FL_CURSOR_CROSS: n = IDC_CROSS; break; -+ case FL_CURSOR_WAIT: n = IDC_WAIT; break; -+ case FL_CURSOR_INSERT: n = IDC_IBEAM; break; -+ case FL_CURSOR_HAND: n = IDC_HAND; break; -+ case FL_CURSOR_HELP: n = IDC_HELP; break; -+ case FL_CURSOR_MOVE: n = IDC_SIZEALL; break; -+ case FL_CURSOR_N: -+ case FL_CURSOR_S: -+ // FIXME: Should probably have fallbacks for these instead -+ case FL_CURSOR_NS: n = IDC_SIZENS; break; -+ case FL_CURSOR_NE: -+ case FL_CURSOR_SW: -+ // FIXME: Dito. -+ case FL_CURSOR_NESW: n = IDC_SIZENESW; break; -+ case FL_CURSOR_E: -+ case FL_CURSOR_W: -+ // FIXME: Dito. -+ case FL_CURSOR_WE: n = IDC_SIZEWE; break; -+ case FL_CURSOR_SE: -+ case FL_CURSOR_NW: -+ // FIXME: Dito. -+ case FL_CURSOR_NWSE: n = IDC_SIZENWSE; break; -+ default: -+ return 0; -+ } -+ -+ cursor = LoadCursor(NULL, n); -+ if (cursor == NULL) -+ return 0; -+ } -+ -+ SetCursor(cursor); -+ -+ return 1; -+ } -+ -+ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) { -+ BITMAPV5HEADER bi; -+ HBITMAP bitmap, mask; -+ DWORD *bits; -+ -+ if ((hotx < 0) || (hotx >= image->w())) -+ return 0; -+ if ((hoty < 0) || (hoty >= image->h())) -+ return 0; -+ -+ memset(&bi, 0, sizeof(BITMAPV5HEADER)); -+ -+ bi.bV5Size = sizeof(BITMAPV5HEADER); -+ bi.bV5Width = image->w(); -+ bi.bV5Height = image->h(); -+ bi.bV5Planes = 1; -+ bi.bV5BitCount = 32; -+ bi.bV5Compression = BI_BITFIELDS; -+ bi.bV5RedMask = 0x00FF0000; -+ bi.bV5GreenMask = 0x0000FF00; -+ bi.bV5BlueMask = 0x000000FF; -+ bi.bV5AlphaMask = 0xFF000000; -+ -+ HDC hdc; -+ -+ hdc = GetDC(NULL); -+ bitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); -+ ReleaseDC(NULL, hdc); -+ -+ const uchar *i = (const uchar*)*image->data(); -+ for (int y = 0;y < image->h();y++) { -+ for (int x = 0;x < image->w();x++) { -+ switch (image->d()) { -+ case 1: -+ *bits = (0xff<<24) | (i[0]<<16) | (i[0]<<8) | i[0]; -+ break; -+ case 2: -+ *bits = (i[1]<<24) | (i[0]<<16) | (i[0]<<8) | i[0]; -+ break; -+ case 3: -+ *bits = (0xff<<24) | (i[0]<<16) | (i[1]<<8) | i[2]; -+ break; -+ case 4: -+ *bits = (i[3]<<24) | (i[0]<<16) | (i[1]<<8) | i[2]; -+ break; -+ } -+ i += image->d(); -+ bits++; -+ } -+ i += image->ld(); -+ } -+ -+ // A mask bitmap is still needed even though it isn't used -+ mask = CreateBitmap(image->w(),image->h(),1,1,NULL); -+ -+ ICONINFO ii; -+ -+ ii.fIcon = FALSE; -+ ii.xHotspot = hotx; -+ ii.yHotspot = hoty; -+ ii.hbmMask = mask; -+ ii.hbmColor = bitmap; -+ -+ cursor = CreateIconIndirect(&ii); -+ -+ DeleteObject(bitmap); -+ DeleteObject(mask); -+ -+ SetCursor(cursor); -+ -+ return 1; -+ } -+ -+ //////////////////////////////////////////////////////////////// - // Implement the virtual functions for the base Fl_Window class: - -*** fltk-1.3.0/src/Fl_x.cxx 2011-05-30 11:47:48.000000000 -0500 ---- fltk-1.3.0.new/src/Fl_x.cxx 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 53,56 **** ---- 53,65 ---- - # include <X11/Xlib.h> - # include <X11/keysym.h> -+ # include <X11/cursorfont.h> -+ -+ # if HAVE_XCURSOR -+ # include <X11/Xcursor/Xcursor.h> -+ # endif -+ -+ # ifdef HAVE_XFIXES -+ # include <X11/extensions/Xfixes.h> -+ # endif - - static Fl_Xlib_Graphics_Driver fl_xlib_driver; -*************** -*** 301,306 **** ---- 310,318 ---- - XIM fl_xim_im = 0; - XIC fl_xim_ic = 0; -+ Window fl_xim_win = 0; - char fl_is_over_the_spot = 0; - static XRectangle status_area; -+ static bool have_xfixes = false; -+ static int xfixes_event_base = 0; - - static Atom WM_DELETE_WINDOW; -*************** -*** 309,312 **** ---- 321,327 ---- - static Atom TARGETS; - static Atom CLIPBOARD; -+ static Atom TIMESTAMP; -+ static Atom PRIMARY_TIMESTAMP; -+ static Atom CLIPBOARD_TIMESTAMP; - Atom fl_XdndAware; - Atom fl_XdndSelection; -*************** -*** 329,332 **** ---- 344,350 ---- - Atom fl_NET_WM_NAME; // utf8 aware window label - Atom fl_NET_WM_ICON_NAME; // utf8 aware window icon name -+ Atom fl_NET_SUPPORTING_WM_CHECK; -+ Atom fl_NET_WM_STATE; -+ Atom fl_NET_WM_STATE_FULLSCREEN; - - /* -*************** -*** 582,585 **** ---- 600,662 ---- - } - -+ void fl_xim_deactivate(void); -+ -+ void fl_xim_activate(Window xid) -+ { -+ if (!fl_xim_im) -+ return; -+ -+ // If the focused window has changed, then use the brute force method -+ // of completely recreating the input context. -+ if (fl_xim_win != xid) { -+ fl_xim_deactivate(); -+ -+ fl_new_ic(); -+ fl_xim_win = xid; -+ -+ XSetICValues(fl_xim_ic, -+ XNFocusWindow, fl_xim_win, -+ XNClientWindow, fl_xim_win, -+ NULL); -+ } -+ -+ fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); -+ } -+ -+ void fl_xim_deactivate(void) -+ { -+ if (!fl_xim_ic) -+ return; -+ -+ XDestroyIC(fl_xim_ic); -+ fl_xim_ic = NULL; -+ -+ fl_xim_win = 0; -+ } -+ -+ extern Fl_Window *fl_xfocus; -+ -+ void fl_update_focus(void) -+ { -+ Fl_Widget *focus; -+ -+ focus = Fl::grab(); -+ if (!focus) -+ focus = Fl::focus(); -+ if (!focus) -+ return; -+ -+ if (focus->simple_keyboard()) { -+ fl_xim_deactivate(); -+ } else { -+ // fl_xfocus should always be set if something has focus, but let's -+ // play it safe -+ if (!fl_xfocus || !fl_xid(fl_xfocus)) -+ return; -+ -+ fl_xim_activate(fl_xid(fl_xfocus)); -+ } -+ } -+ - void fl_open_display() { - if (fl_display) return; -*************** -*** 605,608 **** ---- 682,688 ---- - TARGETS = XInternAtom(d, "TARGETS", 0); - CLIPBOARD = XInternAtom(d, "CLIPBOARD", 0); -+ TIMESTAMP = XInternAtom(d, "TIMESTAMP", 0); -+ PRIMARY_TIMESTAMP = XInternAtom(d, "PRIMARY_TIMESTAMP", 0); -+ CLIPBOARD_TIMESTAMP = XInternAtom(d, "CLIPBOARD_TIMESTAMP", 0); - fl_XdndAware = XInternAtom(d, "XdndAware", 0); - fl_XdndSelection = XInternAtom(d, "XdndSelection", 0); -*************** -*** 626,629 **** ---- 706,712 ---- - fl_NET_WM_NAME = XInternAtom(d, "_NET_WM_NAME", 0); - fl_NET_WM_ICON_NAME = XInternAtom(d, "_NET_WM_ICON_NAME", 0); -+ 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); - - if (sizeof(Atom) < 4) -*************** -*** 647,650 **** ---- 730,741 ---- - Fl::visual(FL_RGB); - #endif -+ -+ #ifdef HAVE_XFIXES -+ int error_base; -+ if (XFixesQueryExtension(d, &xfixes_event_base, &error_base)) -+ have_xfixes = true; -+ else -+ have_xfixes = false; -+ #endif - } - -*************** -*** 769,772 **** ---- 860,888 ---- - } - -+ -+ /* -+ Get window property value (32 bit format) -+ Returns zero on success, -1 on error -+ */ -+ static int get_xwinprop(Window wnd, Atom prop, long max_length, -+ unsigned long *nitems, unsigned long **data) { -+ Atom actual; -+ int format; -+ unsigned long bytes_after; -+ -+ if (Success != XGetWindowProperty(fl_display, wnd, prop, 0, max_length, -+ False, AnyPropertyType, &actual, &format, -+ nitems, &bytes_after, (unsigned char**)data)) { -+ return -1; -+ } -+ -+ if (actual == None || format != 32) { -+ return -1; -+ } -+ -+ return 0; -+ } -+ -+ - //////////////////////////////////////////////////////////////// - // Code for copying to clipboard and DnD out of the program: -*************** -*** 788,791 **** ---- 904,995 ---- - - //////////////////////////////////////////////////////////////// -+ // Code for tracking clipboard changes: -+ -+ static Time primary_timestamp = -1; -+ static Time clipboard_timestamp = -1; -+ -+ extern bool fl_clipboard_notify_empty(void); -+ extern void fl_trigger_clipboard_notify(int source); -+ -+ static void poll_clipboard_owner(void) { -+ Window xid; -+ -+ // No polling needed with Xfixes -+ if (have_xfixes) -+ return; -+ -+ // No one is interested, so no point polling -+ if (fl_clipboard_notify_empty()) -+ return; -+ -+ // We need a window for this to work -+ if (!Fl::first_window()) -+ return; -+ xid = fl_xid(Fl::first_window()); -+ if (!xid) -+ return; -+ -+ // Request an update of the selection time for both the primary and -+ // clipboard selections. Magic continues when we get a SelectionNotify. -+ if (!fl_i_own_selection[0]) -+ XConvertSelection(fl_display, XA_PRIMARY, TIMESTAMP, PRIMARY_TIMESTAMP, -+ xid, fl_event_time); -+ if (!fl_i_own_selection[1]) -+ XConvertSelection(fl_display, CLIPBOARD, TIMESTAMP, CLIPBOARD_TIMESTAMP, -+ xid, fl_event_time); -+ } -+ -+ static void clipboard_timeout(void *data) -+ { -+ // No one is interested, so stop polling -+ if (fl_clipboard_notify_empty()) -+ return; -+ -+ poll_clipboard_owner(); -+ -+ Fl::repeat_timeout(0.5, clipboard_timeout); -+ } -+ -+ static void handle_clipboard_timestamp(int clipboard, Time time) -+ { -+ Time *timestamp; -+ -+ timestamp = clipboard ? &clipboard_timestamp : &primary_timestamp; -+ -+ if (!have_xfixes) { -+ // Initial scan, just store the value -+ if (*timestamp == (Time)-1) { -+ *timestamp = time; -+ return; -+ } -+ } -+ -+ // Same selection -+ if (time == *timestamp) -+ return; -+ -+ *timestamp = time; -+ -+ // Something happened! Let's tell someone! -+ fl_trigger_clipboard_notify(clipboard); -+ } -+ -+ void fl_clipboard_notify_change() { -+ // Reset the timestamps if we've going idle so that you don't -+ // get a bogus immediate trigger next time they're activated. -+ if (fl_clipboard_notify_empty()) { -+ primary_timestamp = -1; -+ clipboard_timestamp = -1; -+ } else { -+ if (!have_xfixes) { -+ poll_clipboard_owner(); -+ -+ if (!Fl::has_timeout(clipboard_timeout)) -+ Fl::add_timeout(0.5, clipboard_timeout); -+ } -+ } -+ } -+ -+ //////////////////////////////////////////////////////////////// - - const XEvent* fl_xevent; // the current x event -*************** -*** 865,872 **** - fl_xevent = &thisevent; - Window xid = xevent.xany.window; -- static Window xim_win = 0; - - if (fl_xim_ic && xevent.type == DestroyNotify && -! xid != xim_win && !fl_find(xid)) - { - XIM xim_im; ---- 1069,1075 ---- - fl_xevent = &thisevent; - Window xid = xevent.xany.window; - - if (fl_xim_ic && xevent.type == DestroyNotify && -! xid != fl_xim_win && !fl_find(xid)) - { - XIM xim_im; -*************** -*** 883,929 **** - } - -! if (fl_xim_ic && (xevent.type == FocusIn)) -! { -! #define POOR_XIM -! #ifdef POOR_XIM -! if (xim_win != xid) -! { -! xim_win = xid; -! XDestroyIC(fl_xim_ic); -! fl_xim_ic = NULL; -! fl_new_ic(); -! XSetICValues(fl_xim_ic, -! XNFocusWindow, xevent.xclient.window, -! XNClientWindow, xid, -! NULL); -! } -! fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); -! #else -! if (Fl::first_window() && Fl::first_window()->modal()) { -! Window x = fl_xid(Fl::first_window()); -! if (x != xim_win) { -! xim_win = x; -! XSetICValues(fl_xim_ic, -! XNFocusWindow, xim_win, -! XNClientWindow, xim_win, -! NULL); -! fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); -! } -! } else if (xim_win != xid && xid) { -! xim_win = xid; -! XSetICValues(fl_xim_ic, -! XNFocusWindow, xevent.xclient.window, -! XNClientWindow, xid, -! //XNFocusWindow, xim_win, -! //XNClientWindow, xim_win, -! NULL); -! fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); -! } -! #endif - } - -- if ( XFilterEvent((XEvent *)&xevent, 0) ) -- return(1); -- - switch (xevent.type) { - ---- 1086,1094 ---- - } - -! if (fl_xim_ic) { -! if (XFilterEvent((XEvent *)&xevent, 0)) -! return 1; - } - - switch (xevent.type) { - -*************** -*** 937,941 **** - - case SelectionNotify: { -- if (!fl_selection_requestor) return 0; - static unsigned char* buffer = 0; - if (buffer) {XFree(buffer); buffer = 0;} ---- 1102,1105 ---- -*************** -*** 953,956 **** ---- 1117,1133 ---- - &actual, &format, &count, &remaining, - &portion)) break; // quit on error -+ -+ if ((fl_xevent->xselection.property == PRIMARY_TIMESTAMP) || -+ (fl_xevent->xselection.property == CLIPBOARD_TIMESTAMP)) { -+ if (portion && format == 32 && count == 1) { -+ Time t = *(unsigned int*)portion; -+ if (fl_xevent->xselection.property == CLIPBOARD_TIMESTAMP) -+ handle_clipboard_timestamp(1, t); -+ else -+ handle_clipboard_timestamp(0, t); -+ } -+ return true; -+ } -+ - if (actual == TARGETS || actual == XA_ATOM) { - Atom type = XA_STRING; -*************** -*** 989,992 **** ---- 1166,1172 ---- - convert_crlf(buffer, bytesread); - } -+ -+ if (!fl_selection_requestor) return 0; -+ - Fl::e_text = buffer ? (char*)buffer : (char *)""; - Fl::e_length = bytesread; -*************** -*** 1009,1012 **** ---- 1189,1193 ---- - int clipboard = fl_xevent->xselectionclear.selection == CLIPBOARD; - fl_i_own_selection[clipboard] = 0; -+ poll_clipboard_owner(); - return 1;} - -*************** -*** 1221,1224 **** ---- 1402,1408 ---- - if (fl_xim_ic) XSetICFocus(fl_xim_ic); - event = FL_FOCUS; -+ // If the user has toggled from another application to this one, -+ // then it's a good time to check for clipboard changes. -+ poll_clipboard_owner(); - break; - -*************** -*** 1261,1273 **** - len = XLookupString((XKeyEvent*)&(xevent.xkey), - buffer, buffer_len, &keysym, 0/*&compose*/); -! if (keysym && keysym < 0x400) { // a character in latin-1,2,3,4 sets -! // force it to type a character (not sure if this ever is needed): -! // if (!len) {buffer[0] = char(keysym); len = 1;} -! len = fl_utf8encode(XKeysymToUcs(keysym), buffer); -! if (len < 1) len = 1; -! // ignore all effects of shift on the keysyms, which makes it a lot -! // easier to program shortcuts and is Windoze-compatible: -! keysym = XKeycodeToKeysym(fl_display, keycode, 0); -! } - } - // MRS: Can't use Fl::event_state(FL_CTRL) since the state is not ---- 1445,1457 ---- - len = XLookupString((XKeyEvent*)&(xevent.xkey), - buffer, buffer_len, &keysym, 0/*&compose*/); -! // XLookupString() is only defined to return Latin-1 (although it -! // often gives you more). To be safe, use our own lookups based on -! // keysym. -! len = fl_utf8encode(XKeysymToUcs(keysym), buffer); -! if (len < 1) -! len = 1; -! // ignore all effects of shift on the keysyms, which makes it a lot -! // easier to program shortcuts and is Windoze-compatable: -! keysym = XKeycodeToKeysym(fl_display, keycode, 0); - } - // MRS: Can't use Fl::event_state(FL_CTRL) since the state is not -*************** -*** 1441,1444 **** ---- 1625,1629 ---- - Fl::e_keysym = FL_Button + xevent.xbutton.button; - set_event_xy(); -+ Fl::e_dx = Fl::e_dy = 0; - if (xevent.xbutton.button == Button4) { - Fl::e_dy = -1; // Up -*************** -*** 1447,1450 **** ---- 1632,1641 ---- - Fl::e_dy = +1; // Down - event = FL_MOUSEWHEEL; -+ } else if (xevent.xbutton.button == 6) { -+ Fl::e_dx = -1; // Left -+ event = FL_MOUSEWHEEL; -+ } else if (xevent.xbutton.button == 7) { -+ Fl::e_dx = +1; // Right -+ event = FL_MOUSEWHEEL; - } else { - Fl::e_state |= (FL_BUTTON1 << (xevent.xbutton.button-1)); -*************** -*** 1457,1460 **** ---- 1648,1676 ---- - break; - -+ case PropertyNotify: -+ if (xevent.xproperty.atom == fl_NET_WM_STATE) { -+ int fullscreen_state = 0; -+ if (xevent.xproperty.state != PropertyDelete) { -+ unsigned long nitems; -+ unsigned long *words = 0; -+ if (0 == get_xwinprop(xid, fl_NET_WM_STATE, 64, &nitems, &words) ) { -+ for (unsigned long item = 0; item < nitems; item++) { -+ if (words[item] == fl_NET_WM_STATE_FULLSCREEN) { -+ fullscreen_state = 1; -+ } -+ } -+ } -+ } -+ if (window->fullscreen_active() && !fullscreen_state) { -+ window->_clear_fullscreen(); -+ event = FL_FULLSCREEN; -+ } -+ if (!window->fullscreen_active() && fullscreen_state) { -+ window->_set_fullscreen(); -+ event = FL_FULLSCREEN; -+ } -+ } -+ break; -+ - case MotionNotify: - set_event_xy(); -*************** -*** 1557,1560 **** ---- 1773,1795 ---- - } - -+ #ifdef HAVE_XFIXES -+ switch (xevent.type - xfixes_event_base) { -+ case XFixesSelectionNotify: { -+ // Someone feeding us bogus events? -+ if (!have_xfixes) -+ return true; -+ -+ XFixesSelectionNotifyEvent *selection_notify = (XFixesSelectionNotifyEvent *)&xevent; -+ -+ if ((selection_notify->selection == XA_PRIMARY) && !fl_i_own_selection[0]) -+ handle_clipboard_timestamp(0, selection_notify->selection_timestamp); -+ else if ((selection_notify->selection == CLIPBOARD) && !fl_i_own_selection[1]) -+ handle_clipboard_timestamp(1, selection_notify->selection_timestamp); -+ -+ return true; -+ } -+ } -+ #endif -+ - return Fl::handle(event, window); - } -*************** -*** 1596,1599 **** ---- 1831,1903 ---- - //////////////////////////////////////////////////////////////// - -+ #define _NET_WM_STATE_REMOVE 0 /* remove/unset property */ -+ #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) { -+ XEvent e; -+ e.xany.type = ClientMessage; -+ e.xany.window = wnd; -+ e.xclient.message_type = fl_NET_WM_STATE; -+ 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; -+ XSendEvent(fl_display, RootWindow(fl_display, fl_screen), -+ 0, SubstructureNotifyMask | SubstructureRedirectMask, -+ &e); -+ } -+ -+ int ewmh_supported() { -+ static int result = -1; -+ -+ if (result == -1) { -+ result = 0; -+ unsigned long nitems; -+ unsigned long *words = 0; -+ if (0 == get_xwinprop(XRootWindow(fl_display, fl_screen), fl_NET_SUPPORTING_WM_CHECK, 64, -+ &nitems, &words) && nitems == 1) { -+ Window child = words[0]; -+ if (0 == get_xwinprop(child, fl_NET_SUPPORTING_WM_CHECK, 64, -+ &nitems, &words) && nitems == 1) { -+ result = (child == words[0]); -+ } -+ } -+ } -+ -+ return result; -+ } -+ -+ /* Change an existing window to fullscreen */ -+ void fullscreen_x(Fl_Window *w) { -+ if (ewmh_supported()) { -+ send_wm_state_event(fl_xid(w), 1, fl_NET_WM_STATE_FULLSCREEN); -+ } else { -+ w->_set_fullscreen(); -+ w->hide(); -+ w->show(); -+ /* We want to grab the window, not a widget, so we cannot use Fl::grab */ -+ XGrabKeyboard(fl_display, fl_xid(w), 1, GrabModeAsync, GrabModeAsync, fl_event_time); -+ Fl::handle(FL_FULLSCREEN, w); -+ } -+ } -+ -+ void fullscreen_off_x(Fl_Window *w, int X, int Y, int W, int H) { -+ if (ewmh_supported()) { -+ send_wm_state_event(fl_xid(w), 0, fl_NET_WM_STATE_FULLSCREEN); -+ } else { -+ w->_clear_fullscreen(); -+ /* The grab will be lost when the window is destroyed */ -+ w->hide(); -+ w->resize(X,Y,W,H); -+ w->show(); -+ Fl::handle(FL_FULLSCREEN, w); -+ } -+ } -+ -+ //////////////////////////////////////////////////////////////// -+ - // A subclass of Fl_Window may call this to associate an X window it - // creates with the Fl_Window: -*************** -*** 1631,1634 **** ---- 1935,1939 ---- - |ButtonPressMask|ButtonReleaseMask - |EnterWindowMask|LeaveWindowMask -+ |PropertyChangeMask - |PointerMotionMask; - -*************** -*** 1702,1705 **** ---- 2007,2020 ---- - if (!win->border()) {attr.override_redirect = 1; mask |= CWOverrideRedirect;} - } -+ // For the non-EWMH fullscreen case, we cannot use the code above, -+ // since we do not want save_under, do not want to turn off the -+ // border, and cannot grab without an existing window. Besides, -+ // there is no clear_override(). -+ if (win->flags() & Fl_Widget::FULLSCREEN && !ewmh_supported()) { -+ attr.override_redirect = 1; -+ mask |= CWOverrideRedirect; -+ Fl::screen_xywh(X, Y, W, H, X, Y, W, H); -+ } -+ - if (fl_background_pixel >= 0) { - attr.background_pixel = fl_background_pixel; -*************** -*** 1761,1764 **** ---- 2076,2085 ---- - } - -+ // If asked for, create fullscreen -+ if (win->flags() & Fl_Widget::FULLSCREEN && ewmh_supported()) { -+ XChangeProperty (fl_display, xp->xid, fl_NET_WM_STATE, XA_ATOM, 32, -+ PropModeAppend, (unsigned char*) &fl_NET_WM_STATE_FULLSCREEN, 1); -+ } -+ - // Make it receptive to DnD: - long version = 4; -*************** -*** 1790,1793 **** ---- 2111,2124 ---- - } - -+ #ifdef HAVE_XFIXES -+ // register for clipboard change notifications -+ if (have_xfixes && !win->parent()) { -+ XFixesSelectSelectionInput(fl_display, xp->xid, XA_PRIMARY, -+ XFixesSetSelectionOwnerNotifyMask); -+ XFixesSelectSelectionInput(fl_display, xp->xid, CLIPBOARD, -+ XFixesSetSelectionOwnerNotifyMask); -+ } -+ #endif -+ - XMapWindow(fl_display, xp->xid); - if (showit) { -*************** -*** 1798,1801 **** ---- 2129,2138 ---- - win->redraw(); - } -+ -+ // non-EWMH fullscreen case, need grab -+ if (win->flags() & Fl_Widget::FULLSCREEN && !ewmh_supported()) { -+ XGrabKeyboard(fl_display, xp->xid, 1, GrabModeAsync, GrabModeAsync, fl_event_time); -+ } -+ - } - -*************** -*** 1884,1887 **** ---- 2221,2312 ---- - //////////////////////////////////////////////////////////////// - -+ int Fl_X::set_cursor(Fl_Cursor c) { -+ unsigned int shape; -+ Cursor xc; -+ -+ switch (c) { -+ case FL_CURSOR_ARROW: shape = XC_left_ptr; break; -+ case FL_CURSOR_CROSS: shape = XC_tcross; break; -+ case FL_CURSOR_WAIT: shape = XC_watch; break; -+ case FL_CURSOR_INSERT: shape = XC_xterm; break; -+ case FL_CURSOR_HAND: shape = XC_hand2; break; -+ case FL_CURSOR_HELP: shape = XC_question_arrow; break; -+ case FL_CURSOR_MOVE: shape = XC_fleur; break; -+ case FL_CURSOR_NS: shape = XC_sb_v_double_arrow; break; -+ case FL_CURSOR_WE: shape = XC_sb_h_double_arrow; break; -+ case FL_CURSOR_NE: shape = XC_top_right_corner; break; -+ case FL_CURSOR_N: shape = XC_top_side; break; -+ case FL_CURSOR_NW: shape = XC_top_left_corner; break; -+ case FL_CURSOR_E: shape = XC_right_side; break; -+ case FL_CURSOR_W: shape = XC_left_side; break; -+ case FL_CURSOR_SE: shape = XC_bottom_right_corner; break; -+ case FL_CURSOR_S: shape = XC_bottom_side; break; -+ case FL_CURSOR_SW: shape = XC_bottom_left_corner; break; -+ default: -+ return 0; -+ } -+ -+ xc = XCreateFontCursor(fl_display, shape); -+ XDefineCursor(fl_display, xid, xc); -+ XFreeCursor(fl_display, xc); -+ -+ return 1; -+ } -+ -+ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) { -+ #if ! HAVE_XCURSOR -+ return 0; -+ #else -+ XcursorImage *cursor; -+ Cursor xc; -+ -+ if ((hotx < 0) || (hotx >= image->w())) -+ return 0; -+ if ((hoty < 0) || (hoty >= image->h())) -+ return 0; -+ -+ cursor = XcursorImageCreate(image->w(), image->h()); -+ if (!cursor) -+ return 0; -+ -+ const uchar *i = (const uchar*)*image->data(); -+ XcursorPixel *o = cursor->pixels; -+ for (int y = 0;y < image->h();y++) { -+ for (int x = 0;x < image->w();x++) { -+ switch (image->d()) { -+ case 1: -+ *o = (0xff<<24) | (i[0]<<16) | (i[0]<<8) | i[0]; -+ break; -+ case 2: -+ *o = (i[1]<<24) | (i[0]<<16) | (i[0]<<8) | i[0]; -+ break; -+ case 3: -+ *o = (0xff<<24) | (i[0]<<16) | (i[1]<<8) | i[2]; -+ break; -+ case 4: -+ *o = (i[3]<<24) | (i[0]<<16) | (i[1]<<8) | i[2]; -+ break; -+ } -+ i += image->d(); -+ o++; -+ } -+ i += image->ld(); -+ } -+ -+ cursor->xhot = hotx; -+ cursor->yhot = hoty; -+ -+ xc = XcursorImageLoadCursor(fl_display, cursor); -+ XDefineCursor(fl_display, xid, xc); -+ XFreeCursor(fl_display, xc); -+ -+ XcursorImageDestroy(cursor); -+ -+ return 1; -+ #endif -+ } -+ -+ //////////////////////////////////////////////////////////////// -+ - // returns pointer to the filename, or null if name ends with '/' - const char *fl_filename_name(const char *name) { -*** fltk-1.3.0/src/fl_cursor.cxx 2010-12-18 16:31:01.000000000 -0600 ---- fltk-1.3.0.new/src/fl_cursor.cxx 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 34,331 **** - #include <FL/Fl.H> - #include <FL/Fl_Window.H> - #include <FL/x.H> -- #if !defined(WIN32) && !defined(__APPLE__) -- # include <X11/cursorfont.h> -- #endif - #include <FL/fl_draw.H> - - /** - Sets the cursor for the current window to the specified shape and colors. - The cursors are defined in the <FL/Enumerations.H> header file. - */ - void fl_cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) { -! if (Fl::first_window()) Fl::first_window()->cursor(c,fg,bg); - } - /** -! Sets the default window cursor as well as its color. - -! For back compatibility only. - */ -! void Fl_Window::default_cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) { -! // if (c == FL_CURSOR_DEFAULT) c = FL_CURSOR_ARROW; -! - cursor_default = c; -! cursor_fg = fg; -! cursor_bg = bg; - -! cursor(c, fg, bg); - } - -- #ifdef WIN32 - -! # ifndef IDC_HAND -! # define IDC_HAND MAKEINTRESOURCE(32649) -! # endif // !IDC_HAND - -- void Fl_Window::cursor(Fl_Cursor c, Fl_Color c1, Fl_Color c2) { -- if (!shown()) return; - // the cursor must be set for the top level window, not for subwindows - Fl_Window *w = window(), *toplevel = this; -! while (w) { toplevel = w; w = w->window(); } -! if (toplevel != this) { toplevel->cursor(c, c1, c2); return; } -! // now set the actual cursor -! if (c == FL_CURSOR_DEFAULT) { -! c = cursor_default; -! } -! if (c > FL_CURSOR_NESW) { -! i->cursor = 0; -! } else if (c == FL_CURSOR_DEFAULT) { -! i->cursor = fl_default_cursor; -! } else { -! LPSTR n; -! switch (c) { -! case FL_CURSOR_ARROW: n = IDC_ARROW; break; -! case FL_CURSOR_CROSS: n = IDC_CROSS; break; -! case FL_CURSOR_WAIT: n = IDC_WAIT; break; -! case FL_CURSOR_INSERT: n = IDC_IBEAM; break; -! case FL_CURSOR_HELP: n = IDC_HELP; break; -! case FL_CURSOR_HAND: { -! OSVERSIONINFO osvi; -! -! // Get the OS version: Windows 98 and 2000 have a standard -! // hand cursor. -! memset(&osvi, 0, sizeof(OSVERSIONINFO)); -! osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); -! GetVersionEx(&osvi); -! -! if (osvi.dwMajorVersion > 4 || -! (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion > 0 && -! osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)) n = IDC_HAND; -! else n = IDC_UPARROW; -! } break; -! case FL_CURSOR_MOVE: n = IDC_SIZEALL; break; -! case FL_CURSOR_N: -! case FL_CURSOR_S: -! case FL_CURSOR_NS: n = IDC_SIZENS; break; -! case FL_CURSOR_NE: -! case FL_CURSOR_SW: -! case FL_CURSOR_NESW: n = IDC_SIZENESW; break; -! case FL_CURSOR_E: -! case FL_CURSOR_W: -! case FL_CURSOR_WE: n = IDC_SIZEWE; break; -! case FL_CURSOR_SE: -! case FL_CURSOR_NW: -! case FL_CURSOR_NWSE: n = IDC_SIZENWSE; break; -! default: n = IDC_NO; break; -! } -! i->cursor = LoadCursor(NULL, n); - } -- SetCursor(i->cursor); -- } - -! #elif defined(__APPLE__) - -! #ifdef __BIG_ENDIAN__ -! # define E(x) x -! #elif defined __LITTLE_ENDIAN__ -! // Don't worry. This will be resolved at compile time -! # define E(x) (x>>8)|((x<<8)&0xff00) -! #else -! # error "Either __LITTLE_ENDIAN__ or __BIG_ENDIAN__ must be defined" -! #endif -! -! extern Fl_Offscreen fl_create_offscreen_with_alpha(int w, int h); -! -! -! CGContextRef Fl_X::help_cursor_image(void) -! { -! int w = 20, h = 20; -! Fl_Offscreen off = fl_create_offscreen_with_alpha(w, h); -! fl_begin_offscreen(off); -! CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0); -! fl_rectf(0,0,w,h); -! fl_color(FL_BLACK); -! fl_font(FL_COURIER_BOLD, 20); -! fl_draw("?", 1, h-1); -! fl_end_offscreen(); -! return (CGContextRef)off; -! } - -! CGContextRef Fl_X::none_cursor_image(void) -! { -! int w = 20, h = 20; -! Fl_Offscreen off = fl_create_offscreen_with_alpha(w, h); -! fl_begin_offscreen(off); -! CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0); -! fl_rectf(0,0,w,h); -! fl_end_offscreen(); -! return (CGContextRef)off; -! } - -! CGContextRef Fl_X::watch_cursor_image(void) -! { -! int w, h, r = 5; -! w = 2*r+6; -! h = 4*r; -! Fl_Offscreen off = fl_create_offscreen_with_alpha(w, h); -! fl_begin_offscreen(off); -! CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0); -! fl_rectf(0,0,w,h); -! CGContextTranslateCTM( (CGContextRef)off, w/2, h/2); -! fl_color(FL_WHITE); -! fl_circle(0, 0, r+1); -! fl_color(FL_BLACK); -! fl_rectf(int(-r*0.7), int(-r*1.7), int(1.4*r), int(3.4*r)); -! fl_rectf(r-1, -1, 3, 3); -! fl_color(FL_WHITE); -! fl_pie(-r, -r, 2*r, 2*r, 0, 360); -! fl_color(FL_BLACK); -! fl_circle(0,0,r); -! fl_xyline(0, 0, int(-r*.7)); -! fl_xyline(0, 0, 0, int(-r*.7)); -! fl_end_offscreen(); -! return (CGContextRef)off; -! } - -! CGContextRef Fl_X::nesw_cursor_image(void) -! { -! int c = 7, r = 2*c; -! int w = r, h = r; -! Fl_Offscreen off = fl_create_offscreen_with_alpha(w, h); -! fl_begin_offscreen(off); -! CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0); -! fl_rectf(0,0,w,h); -! CGContextTranslateCTM( (CGContextRef)off, 0, h); -! CGContextScaleCTM( (CGContextRef)off, 1, -1); -! fl_color(FL_BLACK); -! fl_polygon(0, 0, c, 0, 0, c); -! fl_polygon(r, r, r, r-c, r-c, r); -! fl_line_style(FL_SOLID, 2, 0); -! fl_line(0,1, r,r+1); -! fl_line_style(FL_SOLID, 0, 0); -! fl_end_offscreen(); -! return (CGContextRef)off; - } - -! CGContextRef Fl_X::nwse_cursor_image(void) -! { -! int c = 7, r = 2*c; -! int w = r, h = r; -! Fl_Offscreen off = fl_create_offscreen_with_alpha(w, h); -! fl_begin_offscreen(off); -! CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0); -! fl_rectf(0,0,w,h); -! CGContextTranslateCTM( (CGContextRef)off, 0, h); -! CGContextScaleCTM( (CGContextRef)off, 1, -1); -! fl_color(FL_BLACK); -! fl_polygon(r-1, 0, r-1, c, r-1-c, 0); -! fl_polygon(-1, r, c-1, r, -1, r-c); -! fl_line_style(FL_SOLID, 2, 0); -! fl_line(r-1,1, -1,r+1); -! fl_line_style(FL_SOLID, 0, 0); -! fl_end_offscreen(); -! return (CGContextRef)off; -! } - -! void Fl_Window::cursor(Fl_Cursor c, Fl_Color, Fl_Color) { -! if (c == FL_CURSOR_DEFAULT) { -! c = cursor_default; -! } -! if (i) i->set_cursor(c); -! } - -! #else - -! // I like the MSWindows resize cursors, so I duplicate them here: - -! #define CURSORSIZE 16 -! #define HOTXY 7 -! static struct TableEntry { -! uchar bits[CURSORSIZE*CURSORSIZE/8]; -! uchar mask[CURSORSIZE*CURSORSIZE/8]; -! Cursor cursor; -! } table[] = { -! {{ // FL_CURSOR_NS -! 0x00, 0x00, 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0x80, 0x01, 0x80, 0x01, -! 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, -! 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x00}, -! { -! 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f, 0xc0, 0x03, -! 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xf0, 0x0f, -! 0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01}}, -! {{ // FL_CURSOR_EW -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, -! 0x0c, 0x30, 0xfe, 0x7f, 0xfe, 0x7f, 0x0c, 0x30, 0x08, 0x10, 0x00, 0x00, -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, -! { -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x1c, 0x38, -! 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0x1c, 0x38, 0x18, 0x18, -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, -! {{ // FL_CURSOR_NWSE -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x38, 0x00, 0x78, 0x00, -! 0xe8, 0x00, 0xc0, 0x01, 0x80, 0x03, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x1c, -! 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, -! { -! 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x7c, 0x00, 0xfc, 0x00, -! 0xfc, 0x01, 0xec, 0x03, 0xc0, 0x37, 0x80, 0x3f, 0x00, 0x3f, 0x00, 0x3e, -! 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00}}, -! {{ // FL_CURSOR_NESW -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x1e, -! 0x00, 0x17, 0x80, 0x03, 0xc0, 0x01, 0xe8, 0x00, 0x78, 0x00, 0x38, 0x00, -! 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, -! { -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3f, -! 0x80, 0x3f, 0xc0, 0x37, 0xec, 0x03, 0xfc, 0x01, 0xfc, 0x00, 0x7c, 0x00, -! 0xfc, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00}}, -! {{0}, {0}} // FL_CURSOR_NONE & unknown -! }; -! -! void Fl_Window::cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) { -! if (!shown()) return; -! Cursor xc; -! int deleteit = 0; -! if (c == FL_CURSOR_DEFAULT) { -! c = cursor_default; -! fg = cursor_fg; -! bg = cursor_bg; - } - -! if (!c) { -! xc = None; -! } else { -! if (c >= FL_CURSOR_NS) { -! TableEntry *q = (c > FL_CURSOR_NESW) ? table+4 : table+(c-FL_CURSOR_NS); -! if (!(q->cursor)) { -! XColor dummy = { 0 }; -! Pixmap p = XCreateBitmapFromData(fl_display, -! RootWindow(fl_display, fl_screen), (const char*)(q->bits), -! CURSORSIZE, CURSORSIZE); -! Pixmap m = XCreateBitmapFromData(fl_display, -! RootWindow(fl_display, fl_screen), (const char*)(q->mask), -! CURSORSIZE, CURSORSIZE); -! q->cursor = XCreatePixmapCursor(fl_display, p,m,&dummy, &dummy, -! HOTXY, HOTXY); -! XFreePixmap(fl_display, m); -! XFreePixmap(fl_display, p); -! } -! xc = q->cursor; -! } else { -! xc = XCreateFontCursor(fl_display, (c-1)*2); -! deleteit = 1; -! } -! XColor fgc; -! uchar r,g,b; -! Fl::get_color(fg,r,g,b); -! fgc.red = r<<8; fgc.green = g<<8; fgc.blue = b<<8; -! XColor bgc; -! Fl::get_color(bg,r,g,b); -! bgc.red = r<<8; bgc.green = g<<8; bgc.blue = b<<8; -! XRecolorCursor(fl_display, xc, &fgc, &bgc); - } -- XDefineCursor(fl_display, fl_xid(this), xc); -- if (deleteit) XFreeCursor(fl_display, xc); -- } - -! #endif - - // ---- 34,186 ---- - #include <FL/Fl.H> - #include <FL/Fl_Window.H> -+ #include <FL/Fl_Pixmap.H> -+ #include <FL/Fl_RGB_Image.H> - #include <FL/x.H> - #include <FL/fl_draw.H> - -+ #include "fl_cursor_wait.xpm" -+ #include "fl_cursor_help.xpm" -+ #include "fl_cursor_nwse.xpm" -+ #include "fl_cursor_nesw.xpm" -+ #include "fl_cursor_none.xpm" -+ - /** - Sets the cursor for the current window to the specified shape and colors. - The cursors are defined in the <FL/Enumerations.H> header file. - */ -+ void fl_cursor(Fl_Cursor c) { -+ if (Fl::first_window()) Fl::first_window()->cursor(c); -+ } -+ -+ /* For back compatibility only. */ - void fl_cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) { -! fl_cursor(c); - } -+ -+ - /** -! Sets the default window cursor. This is the cursor that will be used -! after the mouse pointer leaves a widget with a custom cursor set. - -! \see cursor(const Fl_RGB_Image*, int, int), default_cursor() - */ -! void Fl_Window::default_cursor(Fl_Cursor c) { - cursor_default = c; -! cursor(c); -! } -! - -! void fallback_cursor(Fl_Window *w, Fl_Cursor c) { -! const char **xpm; -! int hotx, hoty; -! -! // The standard arrow is our final fallback, so something is broken -! // if we get called back here with that as an argument. -! if (c == FL_CURSOR_ARROW) -! return; -! -! switch (c) { -! case FL_CURSOR_WAIT: -! xpm = (const char**)fl_cursor_wait_xpm; -! hotx = 8; -! hoty = 15; -! break; -! case FL_CURSOR_HELP: -! xpm = (const char**)fl_cursor_help_xpm; -! hotx = 1; -! hoty = 3; -! break; -! case FL_CURSOR_NWSE: -! xpm = (const char**)fl_cursor_nwse_xpm; -! hotx = 7; -! hoty = 7; -! break; -! case FL_CURSOR_NESW: -! xpm = (const char**)fl_cursor_nesw_xpm; -! hotx = 7; -! hoty = 7; -! break; -! case FL_CURSOR_NONE: -! xpm = (const char**)fl_cursor_none_xpm; -! hotx = 0; -! hoty = 0; -! break; -! default: -! w->cursor(FL_CURSOR_ARROW); -! return; -! } -! -! Fl_Pixmap pxm(xpm); -! Fl_RGB_Image image(&pxm); -! -! w->cursor(&image, hotx, hoty); - } - - -! void Fl_Window::cursor(Fl_Cursor c) { -! int ret; - - // the cursor must be set for the top level window, not for subwindows - Fl_Window *w = window(), *toplevel = this; -! -! while (w) { -! toplevel = w; -! w = w->window(); - } - -! if (toplevel != this) { -! toplevel->cursor(c); -! return; -! } - -! if (c == FL_CURSOR_DEFAULT) -! c = cursor_default; - -! if (!i) -! return; - -! ret = i->set_cursor(c); -! if (ret) -! return; - -! fallback_cursor(this, c); - } - -! /** -! Changes the cursor for this window. This always calls the system, if -! you are changing the cursor a lot you may want to keep track of how -! you set it in a static variable and call this only if the new cursor -! is different. - -! The default cursor will be used if the provided image cannot be used -! as a cursor. - -! \see cursor(Fl_Cursor), default_cursor() -! */ -! void Fl_Window::cursor(const Fl_RGB_Image *image, int hotx, int hoty) { -! int ret; - -! // the cursor must be set for the top level window, not for subwindows -! Fl_Window *w = window(), *toplevel = this; - -! while (w) { -! toplevel = w; -! w = w->window(); - } - -! if (toplevel != this) { -! toplevel->cursor(image, hotx, hoty); -! return; - } - -! if (!i) -! return; -! -! ret = i->set_cursor(image, hotx, hoty); -! if (ret) -! return; -! -! cursor(FL_CURSOR_DEFAULT); -! } - - // -*** fltk-1.3.0/src/fl_draw_pixmap.cxx 2011-02-02 12:39:34.000000000 -0600 ---- fltk-1.3.0.new/src/fl_draw_pixmap.cxx 2011-06-22 22:46:30.000000000 -0500 -*************** -*** 68,164 **** - } - -- #ifdef U64 -- -- // The callback from fl_draw_image to get a row of data passes this: -- struct pixmap_data { -- int w, h; -- const uchar*const* data; -- union { -- U64 colors[256]; -- U64* byte1[256]; -- }; -- }; -- -- // callback for 1 byte per pixel: -- static void cb1(void*v, int x, int y, int w, uchar* buf) { -- pixmap_data& d = *(pixmap_data*)v; -- const uchar* p = d.data[y]+x; -- U64* q = (U64*)buf; -- for (int X=w; X>0; X-=2, p += 2) { -- if (X>1) { -- # if WORDS_BIGENDIAN -- *q++ = (d.colors[p[0]]<<32) | d.colors[p[1]]; -- # else -- *q++ = (d.colors[p[1]]<<32) | d.colors[p[0]]; -- # endif -- } else { -- # if WORDS_BIGENDIAN -- *q++ = d.colors[p[0]]<<32; -- # else -- *q++ = d.colors[p[0]]; -- # endif -- } -- } -- } -- -- // callback for 2 bytes per pixel: -- static void cb2(void*v, int x, int y, int w, uchar* buf) { -- pixmap_data& d = *(pixmap_data*)v; -- const uchar* p = d.data[y]+2*x; -- U64* q = (U64*)buf; -- for (int X=w; X>0; X-=2) { -- U64* colors = d.byte1[*p++]; -- int index = *p++; -- if (X>1) { -- U64* colors1 = d.byte1[*p++]; -- int index1 = *p++; -- # if WORDS_BIGENDIAN -- *q++ = (colors[index]<<32) | colors1[index1]; -- # else -- *q++ = (colors1[index1]<<32) | colors[index]; -- # endif -- } else { -- # if WORDS_BIGENDIAN -- *q++ = colors[index]<<32; -- # else -- *q++ = colors[index]; -- # endif -- } -- } -- } -- -- #else // U32 -- -- // The callback from fl_draw_image to get a row of data passes this: -- struct pixmap_data { -- int w, h; -- const uchar*const* data; -- union { -- U32 colors[256]; -- U32* byte1[256]; -- }; -- }; -- -- // callback for 1 byte per pixel: -- static void cb1(void*v, int x, int y, int w, uchar* buf) { -- pixmap_data& d = *(pixmap_data*)v; -- const uchar* p = d.data[y]+x; -- U32* q = (U32*)buf; -- for (int X=w; X--;) *q++ = d.colors[*p++]; -- } -- -- // callback for 2 bytes per pixel: -- static void cb2(void*v, int x, int y, int w, uchar* buf) { -- pixmap_data& d = *(pixmap_data*)v; -- const uchar* p = d.data[y]+2*x; -- U32* q = (U32*)buf; -- for (int X=w; X--;) { -- U32* colors = d.byte1[*p++]; -- *q++ = colors[*p++]; -- } -- } -- -- #endif // U64 else U32 -- - uchar **fl_mask_bitmap; // if non-zero, create bitmap and store pointer here - ---- 68,71 ---- -*************** -*** 210,223 **** - #endif - -! /** -! Draw XPM image data, with the top-left corner at the given position. -! \see fl_draw_pixmap(char* const* data, int x, int y, Fl_Color bg) -! */ -! int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) { -! pixmap_data d; -! if (!fl_measure_pixmap(cdata, d.w, d.h)) return 0; - const uchar*const* data = (const uchar*const*)(cdata+1); - int transparent_index = -1; - uchar *transparent_c = (uchar *)0; // such that transparent_c[0,1,2] are the RGB of the transparent color - #ifdef WIN32 - color_count = 0; ---- 117,134 ---- - #endif - -! int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg) { -! int w, h; - const uchar*const* data = (const uchar*const*)(cdata+1); - int transparent_index = -1; - uchar *transparent_c = (uchar *)0; // such that transparent_c[0,1,2] are the RGB of the transparent color -+ -+ if (!fl_measure_pixmap(cdata, w, h)) -+ return 0; -+ -+ if ((chars_per_pixel < 1) || (chars_per_pixel > 2)) -+ return 0; -+ -+ uchar (*colors)[4] = new uchar [1<<(chars_per_pixel*8)][4]; -+ - #ifdef WIN32 - color_count = 0; -*************** -*** 225,229 **** - #endif - -! if (ncolors < 0) { // FLTK (non standard) compressed colormap - ncolors = -ncolors; - const uchar *p = *data++; ---- 136,141 ---- - #endif - -! if (ncolors < 0) { -! // FLTK (non standard) compressed colormap - ncolors = -ncolors; - const uchar *p = *data++; -*************** -*** 231,241 **** - // it not be transparent): - if (*p == ' ') { -! uchar* c = (uchar*)&d.colors[(int)' ']; -! #ifdef U64 -! *(U64*)c = 0; -! # if WORDS_BIGENDIAN -! c += 4; -! # endif -! #endif - transparent_index = ' '; - Fl::get_color(bg, c[0], c[1], c[2]); c[3] = 0; ---- 143,147 ---- - // it not be transparent): - if (*p == ' ') { -! uchar* c = colors[(int)' ']; - transparent_index = ' '; - Fl::get_color(bg, c[0], c[1], c[2]); c[3] = 0; -*************** -*** 246,256 **** - // read all the rest of the colors: - for (int i=0; i < ncolors; i++) { -! uchar* c = (uchar*)&d.colors[*p++]; -! #ifdef U64 -! *(U64*)c = 0; -! # if WORDS_BIGENDIAN -! c += 4; -! # endif -! #endif - #ifdef WIN32 - used_colors[3*color_count] = *p; ---- 152,156 ---- - // read all the rest of the colors: - for (int i=0; i < ncolors; i++) { -! uchar* c = colors[*p++]; - #ifdef WIN32 - used_colors[3*color_count] = *p; -*************** -*** 262,273 **** - *c++ = *p++; - *c++ = *p++; -- #ifdef __APPLE_QUARTZ__ - *c = 255; -- #else -- *c = 0; -- #endif - } -! } else { // normal XPM colormap with names -! if (chars_per_pixel>1) memset(d.byte1, 0, sizeof(d.byte1)); - for (int i=0; i<ncolors; i++) { - const uchar *p = *data++; ---- 162,169 ---- - *c++ = *p++; - *c++ = *p++; - *c = 255; - } -! } else { -! // normal XPM colormap with names - for (int i=0; i<ncolors; i++) { - const uchar *p = *data++; -*************** -*** 275,334 **** - int ind = *p++; - uchar* c; -! if (chars_per_pixel>1) { -! #ifdef U64 -! U64* colors = d.byte1[ind]; -! if (!colors) colors = d.byte1[ind] = new U64[256]; -! #else -! U32* colors = d.byte1[ind]; -! if (!colors) colors = d.byte1[ind] = new U32[256]; -! #endif -! c = (uchar*)&colors[*p]; -! ind = (ind<<8)|*p++; -! } else { -! c = (uchar *)&d.colors[ind]; -! } - // look for "c word", or last word if none: - const uchar *previous_word = p; - for (;;) { -! while (*p && isspace(*p)) p++; -! uchar what = *p++; -! while (*p && !isspace(*p)) p++; -! while (*p && isspace(*p)) p++; -! if (!*p) {p = previous_word; break;} -! if (what == 'c') break; -! previous_word = p; -! while (*p && !isspace(*p)) p++; - } -- #ifdef U64 -- *(U64*)c = 0; -- # if WORDS_BIGENDIAN -- c += 4; -- # endif -- #endif -- #ifdef __APPLE_QUARTZ__ -- c[3] = 255; -- #endif - int parse = fl_parse_color((const char*)p, c[0], c[1], c[2]); - if (parse) { - #ifdef WIN32 -! used_colors[3*color_count] = c[0]; -! used_colors[3*color_count+1] = c[1]; -! used_colors[3*color_count+2] = c[2]; -! color_count++; - #endif -! } -! else { - // assume "None" or "#transparent" for any errors -! // "bg" should be transparent... -! Fl::get_color(bg, c[0], c[1], c[2]); -! #ifdef __APPLE_QUARTZ__ - c[3] = 0; -! #endif -! transparent_index = ind; -! transparent_c = c; - } - } - } -- d.data = data; - #ifdef WIN32 - if (transparent_c) { ---- 171,208 ---- - int ind = *p++; - uchar* c; -! if (chars_per_pixel>1) -! ind = (ind<<8)|*p++; -! c = colors[ind]; - // look for "c word", or last word if none: - const uchar *previous_word = p; - for (;;) { -! while (*p && isspace(*p)) p++; -! uchar what = *p++; -! while (*p && !isspace(*p)) p++; -! while (*p && isspace(*p)) p++; -! if (!*p) {p = previous_word; break;} -! if (what == 'c') break; -! previous_word = p; -! while (*p && !isspace(*p)) p++; - } - int parse = fl_parse_color((const char*)p, c[0], c[1], c[2]); -+ c[3] = 255; - if (parse) { - #ifdef WIN32 -! used_colors[3*color_count] = c[0]; -! used_colors[3*color_count+1] = c[1]; -! used_colors[3*color_count+2] = c[2]; -! color_count++; - #endif -! } else { - // assume "None" or "#transparent" for any errors -! // "bg" should be transparent... -! Fl::get_color(bg, c[0], c[1], c[2]); - c[3] = 0; -! transparent_index = ind; -! transparent_c = c; - } - } - } - #ifdef WIN32 - if (transparent_c) { -*************** -*** 340,425 **** - } - #endif - - #ifdef __APPLE_QUARTZ__ - if (fl_graphics_driver->class_name() == Fl_Quartz_Graphics_Driver::class_id ) { -- bool transparent = (transparent_index>=0); -- transparent = true; -- U32 *array = new U32[d.w * d.h], *q = array; -- for (int Y = 0; Y < d.h; Y++) { -- const uchar* p = data[Y]; -- if (chars_per_pixel <= 1) { -- for (int X = 0; X < d.w; X++) { -- *q++ = d.colors[*p++]; -- } -- } else { -- for (int X = 0; X < d.w; X++) { -- U32* colors = (U32*)d.byte1[*p++]; -- *q++ = colors[*p++]; -- } -- } -- } - CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); -! CGDataProviderRef src = CGDataProviderCreateWithData( 0L, array, d.w * d.h * 4, 0L); -! CGImageRef img = CGImageCreate(d.w, d.h, 8, 4*8, 4*d.w, -! lut, transparent?kCGImageAlphaLast:kCGImageAlphaNoneSkipLast, -! src, 0L, false, kCGRenderingIntentDefault); - CGColorSpaceRelease(lut); - CGDataProviderRelease(src); -! CGRect rect = { { x, y} , { d.w, d.h } }; -! Fl_X::q_begin_image(rect, 0, 0, d.w, d.h); - CGContextDrawImage(fl_gc, rect, img); - Fl_X::q_end_image(); - CGImageRelease(img); -! delete[] array; -! } -! else { - #endif // __APPLE_QUARTZ__ -- - // build the mask bitmap used by Fl_Pixmap: -! if (fl_mask_bitmap && transparent_index >= 0) { -! int W = (d.w+7)/8; -! uchar* bitmap = new uchar[W * d.h]; - *fl_mask_bitmap = bitmap; -! for (int Y = 0; Y < d.h; Y++) { -! const uchar* p = data[Y]; -! if (chars_per_pixel <= 1) { -! int dw = d.w; -! for (int X = 0; X < W; X++) { -! uchar b = (dw-->0 && *p++ != transparent_index); -! if (dw-->0 && *p++ != transparent_index) b |= 2; -! if (dw-->0 && *p++ != transparent_index) b |= 4; -! if (dw-->0 && *p++ != transparent_index) b |= 8; -! if (dw-->0 && *p++ != transparent_index) b |= 16; -! if (dw-->0 && *p++ != transparent_index) b |= 32; -! if (dw-->0 && *p++ != transparent_index) b |= 64; -! if (dw-->0 && *p++ != transparent_index) b |= 128; -! *bitmap++ = b; -! } -! } else { -! uchar b = 0, bit = 1; -! for (int X = 0; X < d.w; X++) { -! int ind = *p++; -! ind = (ind<<8) | (*p++); -! if (ind != transparent_index) b |= bit; -! -! if (bit < 128) bit <<= 1; -! else { -! *bitmap++ = b; -! b = 0; -! bit = 1; -! } -! } -! -! if (bit > 1) *bitmap++ = b; - } - } - } - -! fl_draw_image(chars_per_pixel==1 ? cb1 : cb2, &d, x, y, d.w, d.h, 4); - #ifdef __APPLE_QUARTZ__ - } - #endif - -! if (chars_per_pixel > 1) for (int i = 0; i < 256; i++) delete[] d.byte1[i]; - return 1; - } ---- 214,300 ---- - } - #endif -+ -+ U32 *q = (U32*)out; -+ for (int Y = 0; Y < h; Y++) { -+ const uchar* p = data[Y]; -+ if (chars_per_pixel <= 1) { -+ for (int X = 0; X < w; X++) -+ memcpy(q++, colors[*p++], 4); -+ } else { -+ for (int X = 0; X < w; X++) { -+ int ind = (*p++)<<8; -+ ind |= *p++; -+ memcpy(q++, colors[ind], 4); -+ } -+ } -+ } - -+ delete [] colors; -+ return 1; -+ } -+ -+ /** -+ Draw XPM image data, with the top-left corner at the given position. -+ \see fl_draw_pixmap(char* const* data, int x, int y, Fl_Color bg) -+ */ -+ int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) { -+ int w, h; -+ -+ if (!fl_measure_pixmap(cdata, w, h)) -+ return 0; -+ -+ uchar *buffer = new uchar[w*h*4]; -+ -+ if (!fl_convert_pixmap(cdata, buffer, bg)) { -+ delete buffer; -+ return 0; -+ } -+ -+ // FIXME: Hack until fl_draw_image() supports alpha properly - #ifdef __APPLE_QUARTZ__ - if (fl_graphics_driver->class_name() == Fl_Quartz_Graphics_Driver::class_id ) { - CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); -! CGDataProviderRef src = CGDataProviderCreateWithData( 0L, buffer, w * h * 4, 0L); -! CGImageRef img = CGImageCreate(w, h, 8, 4*8, 4*w, -! lut, kCGImageAlphaLast, -! src, 0L, false, kCGRenderingIntentDefault); - CGColorSpaceRelease(lut); - CGDataProviderRelease(src); -! CGRect rect = { { x, y }, { w, h } }; -! Fl_X::q_begin_image(rect, 0, 0, w, h); - CGContextDrawImage(fl_gc, rect, img); - Fl_X::q_end_image(); - CGImageRelease(img); -! } else { - #endif // __APPLE_QUARTZ__ - // build the mask bitmap used by Fl_Pixmap: -! if (fl_mask_bitmap) { -! int W = (w+7)/8; -! uchar* bitmap = new uchar[W * h]; - *fl_mask_bitmap = bitmap; -! const uchar *p = &buffer[3]; -! for (int Y = 0; Y < h; Y++) { -! int dw = w; -! for (int X = 0; X < W; X++) { -! uchar b = 0; -! for (int bit = 0x01;bit <= 0x80;bit<<=1) { -! if (dw-- < 0) -! break; -! if (*p > 127) -! b |= bit; -! p += 4; -! } -! *bitmap++ = b; - } - } - } - -! fl_draw_image(buffer, x, y, w, h, 4); -! - #ifdef __APPLE_QUARTZ__ - } - #endif - -! delete buffer; - return 1; - } -*** fltk-1.3.0/src/xutf8/imKStoUCS.c 2009-03-13 17:43:43.000000000 -0500 ---- fltk-1.3.0.new/src/xutf8/imKStoUCS.c 2011-06-22 22:35:31.000000000 -0500 -*************** -*** 267,270 **** ---- 267,276 ---- - }; - -+ static unsigned short const keysym_to_unicode_fe50_fe60[] = { -+ 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0306, 0x0307, 0x0308, /* 0xfe50-0xfe57 */ -+ 0x030a, 0x030b, 0x030c, 0x0327, 0x0328, 0x1da5, 0x3099, 0x309a, /* 0xfe58-0xfe5f */ -+ 0x0323 /* 0xfe60-0xfe67 */ -+ }; -+ - unsigned int - KeySymToUcs4(KeySym keysym) -*************** -*** 316,319 **** ---- 322,327 ---- - else if (keysym > 0x209f && keysym < 0x20ad) - return keysym_to_unicode_20a0_20ac[keysym - 0x20a0]; -+ else if (keysym > 0xfe4f && keysym < 0xfe61) -+ return keysym_to_unicode_fe50_fe60[keysym - 0xfe50]; - else - return 0; -*** fltk-1.3.0/test/cursor.cxx 2010-12-08 08:00:35.000000000 -0600 ---- fltk-1.3.0.new/test/cursor.cxx 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 33,38 **** - #include <FL/Fl_Box.H> - -- Fl_Color fg = FL_BLACK; -- Fl_Color bg = FL_WHITE; - Fl_Cursor cursor = FL_CURSOR_DEFAULT; - ---- 33,36 ---- -*************** -*** 42,46 **** - cursor = (Fl_Cursor)(fl_intptr_t)v; - cursor_slider->value(cursor); -! fl_cursor(cursor,fg,bg); - } - ---- 40,44 ---- - cursor = (Fl_Cursor)(fl_intptr_t)v; - cursor_slider->value(cursor); -! fl_cursor(cursor); - } - -*************** -*** 58,63 **** - {"FL_CURSOR_NWSE",0,choice_cb,(void*)FL_CURSOR_NWSE}, - {"FL_CURSOR_NESW",0,choice_cb,(void*)FL_CURSOR_NESW}, -- {"FL_CURSOR_NONE",0,choice_cb,(void*)FL_CURSOR_NONE}, -- #if 0 - {"FL_CURSOR_N",0,choice_cb,(void*)FL_CURSOR_N}, - {"FL_CURSOR_NE",0,choice_cb,(void*)FL_CURSOR_NE}, ---- 56,59 ---- -*************** -*** 68,72 **** - {"FL_CURSOR_W",0,choice_cb,(void*)FL_CURSOR_W}, - {"FL_CURSOR_NW",0,choice_cb,(void*)FL_CURSOR_NW}, -! #endif - {0} - }; ---- 64,68 ---- - {"FL_CURSOR_W",0,choice_cb,(void*)FL_CURSOR_W}, - {"FL_CURSOR_NW",0,choice_cb,(void*)FL_CURSOR_NW}, -! {"FL_CURSOR_NONE",0,choice_cb,(void*)FL_CURSOR_NONE}, - {0} - }; -*************** -*** 75,91 **** - Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o; - cursor = Fl_Cursor((int)slider->value()); -! fl_cursor(cursor,fg,bg); -! } -! -! void setfg(Fl_Widget *o, void *) { -! Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o; -! fg = Fl_Color((int)slider->value()); -! fl_cursor(cursor,fg,bg); -! } -! -! void setbg(Fl_Widget *o, void *) { -! Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o; -! bg = Fl_Color((int)slider->value()); -! fl_cursor(cursor,fg,bg); - } - ---- 71,75 ---- - Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o; - cursor = Fl_Cursor((int)slider->value()); -! fl_cursor(cursor); - } - -*************** -*** 113,139 **** - slider1.step(1); - slider1.precision(0); -! slider1.bounds(0,100); - slider1.value(0); - slider1.callback(setcursor); - slider1.value(cursor); - -- Fl_Hor_Value_Slider slider2(80,220,310,30,"fgcolor:"); -- slider2.align(FL_ALIGN_LEFT); -- slider2.step(1); -- slider2.precision(0); -- slider2.bounds(0,255); -- slider2.value(0); -- slider2.callback(setfg); -- slider2.value(fg); -- -- Fl_Hor_Value_Slider slider3(80,260,310,30,"bgcolor:"); -- slider3.align(FL_ALIGN_LEFT); -- slider3.step(1); -- slider3.precision(0); -- slider3.bounds(0,255); -- slider3.value(0); -- slider3.callback(setbg); -- slider3.value(bg); -- - #if 0 - // draw the manual's diagram of cursors... ---- 97,105 ---- - slider1.step(1); - slider1.precision(0); -! slider1.bounds(0,255); - slider1.value(0); - slider1.callback(setcursor); - slider1.value(cursor); - - #if 0 - // draw the manual's diagram of cursors... -*** fltk-1.3.0/test/fullscreen.cxx 2010-12-15 06:11:16.000000000 -0600 ---- fltk-1.3.0.new/test/fullscreen.cxx 2011-06-22 22:35:32.000000000 -0500 -*************** -*** 61,66 **** ---- 61,69 ---- - #include <FL/Fl_Single_Window.H> - #include <FL/Fl_Hor_Slider.H> -+ #include <FL/Fl_Input.H> -+ #include <FL/Fl_Menu_Button.H> - #include <FL/Fl_Toggle_Light_Button.H> - #include <FL/math.h> -+ #include <FL/fl_ask.H> - #include <stdio.h> - -*************** -*** 125,128 **** ---- 128,153 ---- - #endif - -+ class fullscreen_window : public Fl_Single_Window { -+ -+ public: -+ fullscreen_window(int W, int H, const char *t=0); -+ int handle (int e); -+ Fl_Toggle_Light_Button *b3; -+ -+ }; -+ -+ fullscreen_window::fullscreen_window(int W, int H, const char *t) : Fl_Single_Window(W, H, t) { -+ -+ } -+ -+ int fullscreen_window::handle(int e) { -+ if (e == FL_FULLSCREEN) { -+ printf("Recieved FL_FULLSCREEN event\n"); -+ b3->value(fullscreen_active()); -+ } -+ if (Fl_Single_Window::handle(e)) return 1; -+ return 0; -+ } -+ - void sides_cb(Fl_Widget *o, void *p) { - shape_window *sw = (shape_window *)p; -*************** -*** 162,172 **** - pw = w->w(); - ph = w->h(); -- #ifndef WIN32//necessary because fullscreen removes border -- border_button->value(0); -- border_button->do_callback(); -- #endif - w->fullscreen(); - } else { -! w->fullscreen_off(px,py,pw,ph); - } - } ---- 187,198 ---- - pw = w->w(); - ph = w->h(); - 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(); - } - } -*************** -*** 178,182 **** - } - -! #define NUMB 5 - - int twowindow = 0; ---- 204,208 ---- - } - -! #define NUMB 6 - - int twowindow = 0; -*************** -*** 194,198 **** - Fl::fatal("Options are:\n -2 = 2 windows\n -f = startup fullscreen\n%s",Fl::help); - -! Fl_Single_Window window(300,300+30*NUMB); window.end(); - - shape_window sw(10,10,window.w()-20,window.h()-30*NUMB-20); ---- 220,224 ---- - Fl::fatal("Options are:\n -2 = 2 windows\n -f = startup fullscreen\n%s",Fl::help); - -! fullscreen_window window(300,300+30*NUMB); window.end(); - - shape_window sw(10,10,window.w()-20,window.h()-30*NUMB-20); -*************** -*** 229,232 **** ---- 255,261 ---- - y+=30; - -+ Fl_Input i1(50,y,window.w()-60,30, "Input"); -+ y+=30; -+ - Fl_Toggle_Light_Button b2(50,y,window.w()-60,30,"Border"); - b2.callback(border_cb,w); -*************** -*** 235,240 **** - y+=30; - -! Fl_Toggle_Light_Button b3(50,y,window.w()-60,30,"FullScreen"); -! b3.callback(fullscreen_cb,w); - y+=30; - ---- 264,269 ---- - y+=30; - -! window.b3 = new Fl_Toggle_Light_Button(50,y,window.w()-60,30,"FullScreen"); -! window.b3->callback(fullscreen_cb,w); - y+=30; - -*************** -*** 243,247 **** - y+=30; - -! if (initfull) {b3.set(); b3.do_callback();} - - window.end(); ---- 272,276 ---- - y+=30; - -! if (initfull) {window.b3->set(); window.b3->do_callback();} - - window.end(); |