comparison src/event-Xt.c @ 197:acd284d43ca1 r20-3b25

Import from CVS: tag r20-3b25
author cvs
date Mon, 13 Aug 2007 10:00:02 +0200
parents 489f57a838ef
children e45d5e7c476e
comparison
equal deleted inserted replaced
196:58e0786448ca 197:acd284d43ca1
52 #ifdef XIM_MOTIF 52 #ifdef XIM_MOTIF
53 #include <Xm/Xm.h> 53 #include <Xm/Xm.h>
54 #endif 54 #endif
55 #include "lstream.h" 55 #include "lstream.h"
56 #include "mule-coding.h" 56 #include "mule-coding.h"
57 #endif
58
59 #ifdef HAVE_OFFIX_DND
60 #include "offix.h"
57 #endif 61 #endif
58 62
59 #ifdef WINDOWSNT 63 #ifdef WINDOWSNT
60 /* Hmm, under unix we want X modifiers, under NT we want X modifiers if 64 /* Hmm, under unix we want X modifiers, under NT we want X modifiers if
61 we are running X and Windows modifiers otherwise. 65 we are running X and Windows modifiers otherwise.
1034 emacs_event->event.button.modifiers = modifiers; 1038 emacs_event->event.button.modifiers = modifiers;
1035 emacs_event->timestamp = ev->time; 1039 emacs_event->timestamp = ev->time;
1036 emacs_event->event.button.button = ev->button; 1040 emacs_event->event.button.button = ev->button;
1037 emacs_event->event.button.x = ev->x; 1041 emacs_event->event.button.x = ev->x;
1038 emacs_event->event.button.y = ev->y; 1042 emacs_event->event.button.y = ev->y;
1043
1039 } 1044 }
1040 } 1045 }
1041 break; 1046 break;
1042 1047
1043 case MotionNotify: 1048 case MotionNotify:
1089 { 1094 {
1090 /* Patch bogus TAKE_FOCUS messages from MWM; CurrentTime is 1095 /* Patch bogus TAKE_FOCUS messages from MWM; CurrentTime is
1091 passed as the timestamp of the TAKE_FOCUS, which the ICCCM 1096 passed as the timestamp of the TAKE_FOCUS, which the ICCCM
1092 explicitly prohibits. */ 1097 explicitly prohibits. */
1093 XClientMessageEvent *ev = &x_event->xclient; 1098 XClientMessageEvent *ev = &x_event->xclient;
1099 #ifdef HAVE_OFFIX_DND
1100 if (DndIsDropMessage(x_event))
1101 {
1102 unsigned int state, modifiers = 0, button=0;
1103 struct frame *frame = x_any_window_to_frame (d, ev->window);
1104 unsigned char *data;
1105 unsigned long size, dtype;
1106 Lisp_Object l_type = Qnil, l_data = Qnil;
1107 Lisp_Object l_dndlist = Qnil, l_item = Qnil;
1108 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1109
1110 GCPRO4 (l_type, l_data, l_dndlist, l_item);
1111
1112 if (! frame)
1113 return 0; /* not for us */
1114 XSETFRAME (emacs_event->channel, frame);
1115
1116 emacs_event->event_type = dnd_drop_event;
1117 emacs_event->timestamp = DEVICE_X_LAST_SERVER_TIMESTAMP (d);
1118
1119 state=DndDragButtons(x_event);
1120
1121 if (state & ShiftMask) modifiers |= MOD_SHIFT;
1122 if (state & ControlMask) modifiers |= MOD_CONTROL;
1123 if (state & xd->MetaMask) modifiers |= MOD_META;
1124 if (state & xd->SuperMask) modifiers |= MOD_SUPER;
1125 if (state & xd->HyperMask) modifiers |= MOD_HYPER;
1126 if (state & xd->AltMask) modifiers |= MOD_ALT;
1127
1128 if (state & Button5Mask) button = Button5;
1129 if (state & Button4Mask) button = Button4;
1130 if (state & Button3Mask) button = Button3;
1131 if (state & Button2Mask) button = Button2;
1132 if (state & Button1Mask) button = Button1;
1133
1134 emacs_event->event.dnd_drop.modifiers = modifiers;
1135 emacs_event->event.dnd_drop.button = button;
1136
1137 DndDropCoordinates(FRAME_X_TEXT_WIDGET(frame), x_event,
1138 &(emacs_event->event.dnd_drop.x),
1139 &(emacs_event->event.dnd_drop.y) );
1140
1141 DndGetData(x_event,&data,&size);
1142
1143 dtype=DndDataType(x_event);
1144 switch (dtype)
1145 {
1146 case DndFiles: /* null terminated strings, end null */
1147 {
1148 int len;
1149 while (*data)
1150 {
1151 len = strlen ((char*) data);
1152 l_item = make_ext_string ((char*) data, len,
1153 FORMAT_FILENAME);
1154 /* order is irrelevant */
1155 l_dndlist = Fcons (l_item, l_dndlist);
1156 data += len+1;
1157 }
1158 }
1159 break;
1160 case DndText:
1161 case DndMIME:
1162 /* is there a better way to format this ? */
1163 l_dndlist = make_ext_string ((char*) data, strlen(data),
1164 FORMAT_BINARY);
1165 break;
1166 case DndFile:
1167 case DndDir:
1168 case DndLink:
1169 case DndExe:
1170 case DndURL: /* this could also break with FORMAT_FILENAME */
1171 l_dndlist = make_ext_string ((char*) data, strlen(data),
1172 FORMAT_FILENAME);
1173 break;
1174 default: /* Unknown, RawData and any other type */
1175 l_dndlist = make_ext_string ((char*) data, size,
1176 FORMAT_BINARY);
1177 break;
1178 }
1179
1180 l_type=make_int(dtype);
1181
1182 emacs_event->event.dnd_drop.data = Fcons (l_type, Fcons (l_dndlist, Qnil));
1183
1184 UNGCPRO;
1185
1186 break;
1187 }
1188 #endif
1094 if (ev->message_type == DEVICE_XATOM_WM_PROTOCOLS (d) 1189 if (ev->message_type == DEVICE_XATOM_WM_PROTOCOLS (d)
1095 && ev->data.l[0] == DEVICE_XATOM_WM_TAKE_FOCUS (d) 1190 && ev->data.l[0] == DEVICE_XATOM_WM_TAKE_FOCUS (d)
1096 && ev->data.l[1] == 0) 1191 && ev->data.l[1] == 0)
1097 { 1192 {
1098 ev->data.l[1] = DEVICE_X_LAST_SERVER_TIMESTAMP (d); 1193 ev->data.l[1] = DEVICE_X_LAST_SERVER_TIMESTAMP (d);
1102 1197
1103 default: /* it's a magic event */ 1198 default: /* it's a magic event */
1104 { 1199 {
1105 struct frame *frame; 1200 struct frame *frame;
1106 Window w; 1201 Window w;
1107 size_t event_size;
1108 XEvent *x_event_copy = &emacs_event->event.magic.underlying_x_event; 1202 XEvent *x_event_copy = &emacs_event->event.magic.underlying_x_event;
1109 1203
1110 #define FROB(event_member, window_member) \ 1204 #define FROB(event_member, window_member) \
1111 x_event_copy->event_member = x_event->event_member; \ 1205 x_event_copy->event_member = x_event->event_member; \
1112 w = x_event->event_member.window_member 1206 w = x_event->event_member.window_member