123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355 |
- diff -up fltk-1.3.2/CMakeLists.txt.clp-x11 fltk-1.3.2/CMakeLists.txt
- --- fltk-1.3.2/CMakeLists.txt.clp-x11 2012-09-13 16:19:01.000000000 +0200
- +++ fltk-1.3.2/CMakeLists.txt 2013-01-30 15:56:25.810663430 +0100
- @@ -515,6 +515,20 @@ else()
- endif(OPTION_USE_XINERAMA)
-
- #######################################################################
- +if(X11_Xfixes_FOUND)
- + option(OPTION_USE_XFIXES "use lib XFIXES" ON)
- +endif(X11_Xfixes_FOUND)
- +
- +if(OPTION_USE_XFIXES)
- + set(HAVE_XFIXES ${X11_Xfixes_FOUND})
- + include_directories(${X11_Xfixes_INCLUDE_PATH})
- + list(APPEND FLTK_LDLIBS -lXfixes)
- + set(FLTK_XFIXES_FOUND TRUE)
- +else()
- + set(FLTK_XFIXES_FOUND FALSE)
- +endif(OPTION_USE_XFIXES)
- +
- +#######################################################################
- if(X11_Xft_FOUND)
- option(OPTION_USE_XFT "use lib Xft" ON)
- endif(X11_Xft_FOUND)
- diff -up fltk-1.3.2/configh.cmake.in.clp-x11 fltk-1.3.2/configh.cmake.in
- --- fltk-1.3.2/configh.cmake.in.clp-x11 2011-07-19 06:49:30.000000000 +0200
- +++ fltk-1.3.2/configh.cmake.in 2013-01-30 15:56:25.810663430 +0100
- @@ -108,6 +108,14 @@
- #define USE_XDBE HAVE_XDBE
-
- /*
- + * HAVE_XFIXES:
- + *
- + * Do we have the X fixes extension?
- + */
- +
- +#cmakedefine01 HAVE_XFIXES
- +
- +/*
- * __APPLE_QUARTZ__:
- *
- * If __APPLE_QUARTZ__ is defined, FLTK will be
- diff -up fltk-1.3.2/configh.in.clp-x11 fltk-1.3.2/configh.in
- --- fltk-1.3.2/configh.in.clp-x11 2011-10-04 11:21:47.000000000 +0200
- +++ fltk-1.3.2/configh.in 2013-01-30 15:56:25.810663430 +0100
- @@ -108,6 +108,14 @@
- #define USE_XDBE HAVE_XDBE
-
- /*
- + * HAVE_XFIXES:
- + *
- + * Do we have the X fixes extension?
- + */
- +
- +#define HAVE_XFIXES 0
- +
- +/*
- * __APPLE_QUARTZ__:
- *
- * All Apple implementations are now based on Quartz and Cocoa,
- diff -up fltk-1.3.2/configure.in.clp-x11 fltk-1.3.2/configure.in
- --- fltk-1.3.2/configure.in.clp-x11 2013-01-30 15:56:25.802663573 +0100
- +++ fltk-1.3.2/configure.in 2013-01-30 15:56:25.810663430 +0100
- @@ -999,6 +999,16 @@ case $uname_GUI in
- LIBS="-lXext $LIBS")
- 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 overlay visuals...
- AC_PATH_PROG(XPROP, xprop)
- AC_CACHE_CHECK(for X overlay visuals, ac_cv_have_overlay,
- diff -up fltk-1.3.2/fluid/CMakeLists.txt.clp-x11 fltk-1.3.2/fluid/CMakeLists.txt
- diff -up fltk-1.3.2/src/CMakeLists.txt.clp-x11 fltk-1.3.2/src/CMakeLists.txt
- --- fltk-1.3.2/src/CMakeLists.txt.clp-x11 2013-01-30 16:06:00.785430590 +0100
- +++ fltk-1.3.2/src/CMakeLists.txt 2013-01-30 16:06:17.883126642 +0100
- @@ -243,6 +243,10 @@ if(HAVE_XINERAMA)
- target_link_libraries(fltk ${X11_Xinerama_LIB})
- endif(HAVE_XINERAMA)
-
- +if(HAVE_XFIXES)
- + target_link_libraries(fltk ${X11_Xfixes_LIB})
- +endif(HAVE_XFIXES)
- +
- if(USE_XFT)
- target_link_libraries(fltk ${X11_Xft_LIB})
- endif(USE_XFT)
- diff -up fltk-1.3.2/src/Fl_x.cxx.clp-x11 fltk-1.3.2/src/Fl_x.cxx
- --- fltk-1.3.2/src/Fl_x.cxx.clp-x11 2013-01-30 15:56:25.793663733 +0100
- +++ fltk-1.3.2/src/Fl_x.cxx 2013-01-30 16:03:37.355981103 +0100
- @@ -53,6 +53,12 @@ static XRRUpdateConfiguration_type XRRUp
- static int randrEventBase; // base of RandR-defined events
- #endif
-
- +# if HAVE_XFIXES
- +# include <X11/extensions/Xfixes.h>
- +static int xfixes_event_base = 0;
- +static bool have_xfixes = false;
- +# endif
- +
- static Fl_Xlib_Graphics_Driver fl_xlib_driver;
- static Fl_Display_Device fl_xlib_display(&fl_xlib_driver);
- Fl_Display_Device *Fl_Display_Device::_display = &fl_xlib_display;// the platform display
- @@ -307,6 +313,9 @@ static Atom WM_PROTOCOLS;
- static Atom fl_MOTIF_WM_HINTS;
- static Atom TARGETS;
- static Atom CLIPBOARD;
- +static Atom TIMESTAMP;
- +static Atom PRIMARY_TIMESTAMP;
- +static Atom CLIPBOARD_TIMESTAMP;
- Atom fl_XdndAware;
- Atom fl_XdndSelection;
- Atom fl_XdndEnter;
- @@ -667,6 +676,9 @@ void fl_open_display(Display* d) {
- fl_MOTIF_WM_HINTS = XInternAtom(d, "_MOTIF_WM_HINTS", 0);
- 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);
- fl_XdndEnter = XInternAtom(d, "XdndEnter", 0);
- @@ -713,6 +725,15 @@ void fl_open_display(Display* d) {
- #if !USE_COLORMAP
- Fl::visual(FL_RGB);
- #endif
- +
- +#if HAVE_XFIXES
- + int error_base;
- + if (XFixesQueryExtension(fl_display, &xfixes_event_base, &error_base))
- + have_xfixes = true;
- + else
- + have_xfixes = false;
- +#endif
- +
- #if USE_XRANDR
- void *libxrandr_addr = dlopen("libXrandr.so.2", RTLD_LAZY);
- if (!libxrandr_addr) libxrandr_addr = dlopen("libXrandr.so", RTLD_LAZY);
- @@ -901,6 +922,107 @@ void Fl::copy(const char *stuff, int len
- }
-
- ////////////////////////////////////////////////////////////////
- +// 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;
- +
- +#if HAVE_XFIXES
- + // No polling needed with Xfixes
- + if (have_xfixes)
- + return;
- +#endif
- +
- + // 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
- + if (!have_xfixes)
- +#endif
- + {
- + // Initial scan, just store the value
- + if (*timestamp == (Time)-1) {
- + *timestamp = time;
- + return;
- + }
- + }
- +
- + // Same selection
- + if (time == *timestamp)
- + return;
- +
- + *timestamp = time;
- +
- + // The clipboard change is the event that caused us to request
- + // the clipboard data, so use that time as the latest event.
- + if (time > fl_event_time)
- + fl_event_time = 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
- + if (!have_xfixes)
- +#endif
- + {
- + poll_clipboard_owner();
- +
- + if (!Fl::has_timeout(clipboard_timeout))
- + Fl::add_timeout(0.5, clipboard_timeout);
- + }
- + }
- +}
- +
- +////////////////////////////////////////////////////////////////
-
- const XEvent* fl_xevent; // the current x event
- ulong fl_event_time; // the last timestamp from an x event
- @@ -1024,7 +1141,6 @@ int fl_handle(const XEvent& thisevent)
- return 0;
-
- case SelectionNotify: {
- - if (!fl_selection_requestor) return 0;
- static unsigned char* buffer = 0;
- if (buffer) {XFree(buffer); buffer = 0;}
- long bytesread = 0;
- @@ -1040,6 +1156,19 @@ int fl_handle(const XEvent& thisevent)
- bytesread/4, 65536, 1, 0,
- &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;
- for (unsigned i = 0; i<count; i++) {
- @@ -1076,6 +1205,9 @@ int fl_handle(const XEvent& thisevent)
- buffer[bytesread] = 0;
- convert_crlf(buffer, bytesread);
- }
- +
- + if (!fl_selection_requestor) return 0;
- +
- Fl::e_text = buffer ? (char*)buffer : (char *)"";
- Fl::e_length = bytesread;
- int old_event = Fl::e_number;
- @@ -1096,6 +1228,7 @@ int fl_handle(const XEvent& thisevent)
- case SelectionClear: {
- int clipboard = fl_xevent->xselectionclear.selection == CLIPBOARD;
- fl_i_own_selection[clipboard] = 0;
- + poll_clipboard_owner();
- return 1;}
-
- case SelectionRequest: {
- @@ -1308,6 +1441,9 @@ int fl_handle(const XEvent& thisevent)
- case FocusIn:
- 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;
-
- case FocusOut:
- @@ -1676,6 +1812,25 @@ int fl_handle(const XEvent& thisevent)
- }
- }
-
- +#if 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);
- }
-
- @@ -1995,6 +2150,16 @@ void Fl_X::make_xid(Fl_Window* win, XVis
- XChangeProperty(fl_display, xp->xid, net_wm_type, XA_ATOM, 32, PropModeReplace, (unsigned char*)&net_wm_type_kind, 1);
- }
-
- +#if 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) {
- win->set_visible();
- diff -up fltk-1.3.2/test/CMakeLists.txt.clp-x11 fltk-1.3.2/test/CMakeLists.txt
|