summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES1
-rw-r--r--README.mac1
-rw-r--r--src/Fl_cutpaste_mac.cxx157
3 files changed, 60 insertions, 99 deletions
diff --git a/CHANGES b/CHANGES
index 88da65b47..7720a5fdb 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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 $".
//