MacOS: implemented cut/copy/past.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1895 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Matthias Melcher 2001-12-22 09:30:07 +00:00
parent d0bdfe300d
commit c868f3d886
3 changed files with 61 additions and 100 deletions

View File

@ -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

View File

@ -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).

View File

@ -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;
static char *selection_buffer = 0L;
static int selection_length = 0;
static int selection_buffer_length = 0;
static ScrapRef myScrap = 0;
extern Fl_Widget *fl_selection_requestor; // widget doing request_paste()
static int selection_xevent_handler(int) {
switch (fl_xevent->type) {
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;
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;
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 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);
/**
* 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;
}
// 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;
}
*/
}
////////////////////////////////////////////////////////////////
// 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) {
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 $".
//