diff options
| author | Bill Spitzak <spitzak@gmail.com> | 2000-07-13 08:51:22 +0000 |
|---|---|---|
| committer | Bill Spitzak <spitzak@gmail.com> | 2000-07-13 08:51:22 +0000 |
| commit | 97a234ff4a5dd5a068a45b11532a8d0ccd46d17d (patch) | |
| tree | 22cc1b93dc296c09839da0eee74b8ef40a028918 /src | |
| parent | ba1d83cf47b115df9121b5427f2472287fe1c511 (diff) | |
While looking at Xdnd I discoverd that jx (or at least their demo program)
cannot paste from fltk programs. This appears to be because JX barfs if
the pasting program does not respond correctly to the TARGETS XConvertSelection.
I added a response that fltk only can do text and this seems to make it
work.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@1253 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_cutpaste.cxx | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/src/Fl_cutpaste.cxx b/src/Fl_cutpaste.cxx index e1ab7e74f..18665e49f 100644 --- a/src/Fl_cutpaste.cxx +++ b/src/Fl_cutpaste.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl_cutpaste.cxx,v 1.6.2.2 2000/06/05 21:21:00 mike Exp $" +// "$Id: Fl_cutpaste.cxx,v 1.6.2.3 2000/07/13 08:51:22 spitzak Exp $" // // Cut/paste code for the Fast Light Tool Kit (FLTK). // @@ -42,6 +42,7 @@ static char *selection_buffer; static int selection_length; static int selection_buffer_length; static char beenhere; +static Atom TARGETS; extern Fl_Widget *fl_selection_requestor; // widget doing request_paste() @@ -79,15 +80,21 @@ static int selection_xevent_handler(int) { e.selection = fl_xevent->xselectionrequest.selection; e.target = fl_xevent->xselectionrequest.target; e.time = fl_xevent->xselectionrequest.time; - if (fl_xevent->xselectionrequest.target != XA_STRING || !selection_length) { - e.property = 0; - } else { - e.property = fl_xevent->xselectionrequest.property; - } - if (e.property) { + e.property = fl_xevent->xselectionrequest.property; + if (e.target == TARGETS) { + Atom a = XA_STRING; + XChangeProperty(fl_display, e.requestor, e.property, + XA_ATOM, sizeof(Atom)*8, 0, (unsigned char*)&a, + sizeof(Atom)); + } else if (e.target == XA_STRING && selection_length) { XChangeProperty(fl_display, e.requestor, e.property, XA_STRING, 8, 0, (unsigned char *)selection_buffer, selection_length); + } else { +// char* x = XGetAtomName(fl_display,e.target); +// fprintf(stderr,"selection request of %s\n",x); +// XFree(x); + e.property = 0; } XSendEvent(fl_display, e.requestor, 0, 0, (XEvent *)&e);} return 1; @@ -99,6 +106,14 @@ static int selection_xevent_handler(int) { //////////////////////////////////////////////////////////////// +static void setup_crap() { + if (!beenhere) { + beenhere = 1; + TARGETS = XInternAtom(fl_display, "TARGETS", 0); + Fl::add_handler(selection_xevent_handler); + } +} + // Call this when a "paste" operation happens: void Fl::paste(Fl_Widget &receiver) { if (selection_owner()) { @@ -114,10 +129,7 @@ void Fl::paste(Fl_Widget &receiver) { fl_selection_requestor = &receiver; XConvertSelection(fl_display, XA_PRIMARY, XA_STRING, XA_PRIMARY, fl_xid(Fl::first_window()), fl_event_time); - if (!beenhere) { - Fl::add_handler(selection_xevent_handler); - beenhere = 1; - } + setup_crap(); } //////////////////////////////////////////////////////////////// @@ -140,14 +152,11 @@ void Fl::selection(Fl_Widget &owner, const char *stuff, int len) { RootWindow(fl_display, fl_screen), 0,0,1,1,0,0,0); XSetSelectionOwner(fl_display, XA_PRIMARY, selxid, fl_event_time); - if (!beenhere) { - Fl::add_handler(selection_xevent_handler); - beenhere = 1; - } + setup_crap(); } #endif // -// End of "$Id: Fl_cutpaste.cxx,v 1.6.2.2 2000/06/05 21:21:00 mike Exp $". +// End of "$Id: Fl_cutpaste.cxx,v 1.6.2.3 2000/07/13 08:51:22 spitzak Exp $". // |
