aboutsummaryrefslogtreecommitdiffstats
path: root/fltk
diff options
context:
space:
mode:
authorDRC <dcommander@users.sourceforge.net>2011-07-28 09:27:57 +0000
committerDRC <dcommander@users.sourceforge.net>2011-07-28 09:27:57 +0000
commite483f949092f59047ec1908bcdd3510a30db8765 (patch)
tree357b364dadbe2ff3c3a9c42e95d0549f88a36fd2 /fltk
parent685f17ec83083ad4ada1181110419f616f1ba6fb (diff)
downloadtigervnc-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/README3
-rw-r--r--fltk/extensions.patch4180
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();