Mercurial > hg > xemacs-beta
diff src/event-Xt.c @ 282:c42ec1d1cded r21-0b39
Import from CVS: tag r21-0b39
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:33:18 +0200 |
parents | c5d627a313b1 |
children | 558f606b08ae |
line wrap: on
line diff
--- a/src/event-Xt.c Mon Aug 13 10:32:23 2007 +0200 +++ b/src/event-Xt.c Mon Aug 13 10:33:18 2007 +0200 @@ -58,7 +58,11 @@ #include "file-coding.h" #endif -#ifdef HAVE_OFFIX_DND +#ifdef HAVE_DRAGNDROP +#include "dragdrop.h" +#endif + +#if defined (HAVE_OFFIX_DND) #include "offix.h" #endif @@ -1123,11 +1127,11 @@ return 0; /* not for us */ XSETFRAME (emacs_event->channel, frame); - emacs_event->event_type = dnd_drop_event; + emacs_event->event_type = misc_user_event; emacs_event->timestamp = DEVICE_X_LAST_SERVER_TIMESTAMP (d); state=DndDragButtons(x_event); - + if (state & ShiftMask) modifiers |= MOD_SHIFT; if (state & ControlMask) modifiers |= MOD_CONTROL; if (state & xd->MetaMask) modifiers |= MOD_META; @@ -1141,12 +1145,12 @@ if (state & Button2Mask) button = Button2; if (state & Button1Mask) button = Button1; - emacs_event->event.dnd_drop.modifiers = modifiers; - emacs_event->event.dnd_drop.button = button; + emacs_event->event.misc.modifiers = modifiers; + emacs_event->event.misc.button = button; DndDropCoordinates(FRAME_X_TEXT_WIDGET(frame), x_event, - &(emacs_event->event.dnd_drop.x), - &(emacs_event->event.dnd_drop.y) ); + &(emacs_event->event.misc.x), + &(emacs_event->event.misc.y) ); DndGetData(x_event,&data,&size); @@ -1156,40 +1160,72 @@ case DndFiles: /* null terminated strings, end null */ { int len; + char *hurl = NULL; + while (*data) { - len = strlen ((char*) data); - l_item = make_ext_string (data, len, - FORMAT_FILENAME); - /* order is irrelevant */ + len = strlen ((char*)data); + hurl = dnd_url_hexify_string ((char *)data, "file:"); + l_item = make_string (hurl, strlen (hurl)); l_dndlist = Fcons (l_item, l_dndlist); - data += len+1; + data += len + 1; + xfree (hurl); } + l_type = Qdragdrop_URL; } break; case DndText: + l_type = Qdragdrop_MIME; + l_dndlist = list1 ( list3 ( make_string ("text/plain", 10), + make_string ("8bit", 4), + make_ext_string (data, + strlen((char *)data), + FORMAT_CTEXT) ) ); + break; case DndMIME: - /* is there a better way to format this ? */ - l_dndlist = make_ext_string (data, strlen((char *)data), - FORMAT_BINARY); + /* we have to parse this in some way to extract + content-type and params (in the tm way) and + content encoding. + OR: if data is string, let tm do the job + if data is list[2], give the first two + to tm... + */ + l_type = Qdragdrop_MIME; + l_dndlist = list1 ( make_ext_string (data, strlen((char *)data), + FORMAT_BINARY) ); break; case DndFile: case DndDir: case DndLink: case DndExe: - case DndURL: /* this could also break with FORMAT_FILENAME */ - l_dndlist = make_ext_string (data, strlen((char *)data), - FORMAT_FILENAME); + { + char *hurl = dnd_url_hexify_string (data, "file:"); + + l_dndlist = list1 ( make_string (hurl, strlen (hurl)) ); + l_type = Qdragdrop_URL; + + xfree (hurl); + } + break; + case DndURL: + /* as it is a real URL it should already be escaped + and escaping again will break them (cause % is unsave) */ + l_dndlist = list1 ( make_ext_string ((char *)data, + strlen ((char *)data), + FORMAT_FILENAME) ); + l_type = Qdragdrop_URL; break; default: /* Unknown, RawData and any other type */ - l_dndlist = make_ext_string (data, size, - FORMAT_BINARY); + l_dndlist = list1 ( list3 ( make_string ("application/octet-stream", 24), + make_string ("8bit", 4), + make_ext_string ((char *)data, size, + FORMAT_BINARY) ) ); + l_type = Qdragdrop_MIME; break; } - l_type=make_int(dtype); - - emacs_event->event.dnd_drop.data = Fcons (l_type, Fcons (l_dndlist, Qnil)); + emacs_event->event.misc.function = Qdragdrop_drop_dispatch; + emacs_event->event.misc.object = Fcons (l_type, l_dndlist); UNGCPRO;