diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2001-12-22 09:30:07 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2001-12-22 09:30:07 +0000 |
| commit | c868f3d88640b9d3edd2026bf879e70e34829893 (patch) | |
| tree | 4a13e1117c64ac1d8a3c612a7ab99e5d93c0f903 | |
| parent | d0bdfe300dd636322dedfdc98b9edea2c5f06566 (diff) | |
MacOS: implemented cut/copy/past.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1895 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | CHANGES | 1 | ||||
| -rw-r--r-- | README.mac | 1 | ||||
| -rw-r--r-- | src/Fl_cutpaste_mac.cxx | 157 |
3 files changed, 60 insertions, 99 deletions
@@ -1,5 +1,6 @@ CHANGES IN FLTK 1.1.0b8 + - MacOS: implemented cut/copy/paste. - MacOS: improved keyboard handling, fixed keyboard focus handling, fixed get_key, modified 'keyboard' demo to show second mouse wheel and additional keys diff --git a/README.mac b/README.mac index 6b9f3a192..60c32ee8b 100644 --- a/README.mac +++ b/README.mac @@ -89,7 +89,6 @@ KNOWN MacFLTK BUGS - File handles (Fl::add_fd) are not implemented. - Line styles are not fully implemented. - - Cut, copy, and paste are not implemented. - Sub-sub-subwindow not tested. - Image transparency is not implemented. - The 'shiny' demo needs work (flush/aglFlush). diff --git a/src/Fl_cutpaste_mac.cxx b/src/Fl_cutpaste_mac.cxx index 98c7be24e..4819c7931 100644 --- a/src/Fl_cutpaste_mac.cxx +++ b/src/Fl_cutpaste_mac.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl_cutpaste_mac.cxx,v 1.1.2.1 2001/11/27 17:44:06 easysw Exp $" +// "$Id: Fl_cutpaste_mac.cxx,v 1.1.2.2 2001/12/22 09:30:07 matthiaswm Exp $" // // MacOS cut/paste code for the Fast Light Tool Kit (FLTK). // @@ -29,120 +29,81 @@ #include <FL/mac.H> #include <FL/Fl_Window.H> #include <string.h> -/* -static char *selection_buffer; -static int selection_length; -static int selection_buffer_length; -static char beenhere; -extern Fl_Widget *fl_selection_requestor; // widget doing request_paste() - -static int selection_xevent_handler(int) { +static char *selection_buffer = 0L; +static int selection_length = 0; +static int selection_buffer_length = 0; - switch (fl_xevent->type) { +static ScrapRef myScrap = 0; - case SelectionNotify: { - if (!fl_selection_requestor) return 0; - static char *pastebuffer; - if (pastebuffer) {XFree(pastebuffer); pastebuffer = 0;} - if (fl_xevent->xselection.property != 0) { - Atom a; int f; unsigned long n,b; - if (!XGetWindowProperty(fl_display, - fl_xevent->xselection.requestor, - fl_xevent->xselection.property, - 0,100000,1,0,&a,&f,&n,&b, - (unsigned char**)&pastebuffer)) { - Fl::e_text = pastebuffer; - Fl::e_length = int(n); - fl_selection_requestor->handle(FL_PASTE); - } - }} - return 1; - - case SelectionClear: - Fl::selection_owner(0); - return 1; +extern Fl_Widget *fl_selection_requestor; // widget doing request_paste() - case SelectionRequest: { - XSelectionEvent e; - e.type = SelectionNotify; - e.display = fl_display; - e.requestor = fl_xevent->xselectionrequest.requestor; - 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; +/** + * call this to retrieve the current slection + * receiver: widget receiving the selection + * Fl::e_text: pointer to selection + * Fl::e_length: size of election + */ +void Fl::paste( Fl_Widget &receiver ) +{ + ScrapRef scrap = 0; + OSStatus ret = GetCurrentScrap( &scrap ); + if ( ( scrap != myScrap ) && ( ret == noErr ) ) + { + Size len; + ret = GetScrapFlavorSize( scrap, kScrapFlavorTypeText, &len ); + if ( ret != noErr ) return; + if ( len > selection_buffer_length ) + { + selection_buffer_length = len + 32; + delete[] selection_buffer; + selection_buffer = new char[len]; + selection_buffer_length = len; } - if (e.property) { - XChangeProperty(fl_display, e.requestor, e.property, - XA_STRING, 8, 0, (unsigned char *)selection_buffer, - selection_length); - } - XSendEvent(fl_display, e.requestor, 0, 0, (XEvent *)&e);} - return 1; - - default: - return 0; - } -} -*/ -//////////////////////////////////////////////////////////////// - -// Call this when a "paste" operation happens: -void Fl::paste(Fl_Widget &/*receiver*/) { -/* //++ - if (selection_owner()) { - // We already have it, do it quickly without window server. - // Notice that the text is clobbered if set_selection is - // called in response to FL_PASTE! - Fl::e_text = selection_buffer; - Fl::e_length = selection_length; - receiver.handle(FL_PASTE); - return; - } - // otherwise get the window server to return it: - 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; + GetScrapFlavorData( scrap, kScrapFlavorTypeText, &len, selection_buffer ); + selection_length = len; } - */ + for ( char *s = selection_buffer+selection_length; s >= selection_buffer; s-- ) // this will fail on PC line endings (CR+LF) + if ( *s == 0x0d ) *s = 0x0a; + Fl::e_text = selection_buffer; + Fl::e_length = selection_length; + receiver.handle( FL_PASTE ); + return; } -//////////////////////////////////////////////////////////////// -// call this when you create a selection: -void Fl::selection(Fl_Widget &/*owner*/, const char */*stuff*/, int /*len*/) { -/* //++ - if (!stuff || len<0) return; - if (len+1 > selection_buffer_length) { +/** + * create a selection + * owner: widget that created the selection + * stuff: pointer to selected data + * size of selected data + */ +void Fl::selection( Fl_Widget &owner, const char *stuff, int len ) { + if ( !stuff || len<0 ) + return; + if ( len+1 > selection_buffer_length ) { delete[] selection_buffer; selection_buffer = new char[len+100]; selection_buffer_length = len+100; } - memcpy(selection_buffer, stuff, len); - selection_buffer[len] = 0; // needed for direct paste + memcpy( selection_buffer, stuff, len ); + for ( char *s = selection_buffer+len; s >= selection_buffer; s-- ) // this will fail on PC line endings (CR+LF) + if ( *s == 0x0a ) *s = 0x0d; + selection_buffer[len] = 0; selection_length = len; - selection_owner(&owner); - static Window selxid; // window X thinks selection belongs to - if (!selxid) selxid = - XCreateSimpleWindow(fl_display, - 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; + selection_owner( &owner ); + + ClearCurrentScrap(); + OSStatus ret = GetCurrentScrap( &myScrap ); + if ( ret != noErr ) + { + myScrap = 0; + return; } - */ + PutScrapFlavor( myScrap, kScrapFlavorTypeText, 0, selection_length, selection_buffer ); } // -// End of "$Id: Fl_cutpaste_mac.cxx,v 1.1.2.1 2001/11/27 17:44:06 easysw Exp $". +// End of "$Id: Fl_cutpaste_mac.cxx,v 1.1.2.2 2001/12/22 09:30:07 matthiaswm Exp $". // |
