Mercurial > hg > xemacs-beta
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 |