ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/command.C
(Generate patch)

Comparing rxvt-unicode/src/command.C (file contents):
Revision 1.37 by pcg, Sun Feb 1 20:12:53 2004 UTC vs.
Revision 1.38 by pcg, Mon Feb 9 07:11:49 2004 UTC

53 53
54/*----------------------------------------------------------------------*/ 54/*----------------------------------------------------------------------*/
55 55
56/*{{{ Convert the keypress event into a string */ 56/*{{{ Convert the keypress event into a string */
57void 57void
58rxvt_term::lookup_key (XKeyEvent *ev) 58rxvt_term::lookup_key (XKeyEvent &ev)
59{ 59{
60 int ctrl, meta, shft, len; 60 int ctrl, meta, shft, len;
61 unsigned int newlen; 61 unsigned int newlen;
62 KeySym keysym; 62 KeySym keysym;
63#ifdef DEBUG_CMD 63#ifdef DEBUG_CMD
70 * use Num_Lock to toggle Keypad on/off. If Num_Lock is off, allow an 70 * use Num_Lock to toggle Keypad on/off. If Num_Lock is off, allow an
71 * escape sequence to toggle the Keypad. 71 * escape sequence to toggle the Keypad.
72 * 72 *
73 * Always permit `shift' to override the current setting 73 * Always permit `shift' to override the current setting
74 */ 74 */
75 shft = (ev->state & ShiftMask); 75 shft = (ev.state & ShiftMask);
76 ctrl = (ev->state & ControlMask); 76 ctrl = (ev.state & ControlMask);
77 meta = (ev->state & ModMetaMask); 77 meta = (ev.state & ModMetaMask);
78 78
79 if (numlock_state || (ev->state & ModNumLockMask)) 79 if (numlock_state || (ev.state & ModNumLockMask))
80 { 80 {
81 numlock_state = (ev->state & ModNumLockMask); 81 numlock_state = (ev.state & ModNumLockMask);
82 PrivMode((!numlock_state), PrivMode_aplKP); 82 PrivMode((!numlock_state), PrivMode_aplKP);
83 } 83 }
84 84
85 kbuf[0] = 0; 85 kbuf[0] = 0;
86 86
89 { 89 {
90 Status status_return; 90 Status status_return;
91 91
92#ifdef X_HAVE_UTF8_STRING 92#ifdef X_HAVE_UTF8_STRING
93 if (enc_utf8 && 0) 93 if (enc_utf8 && 0)
94 len = Xutf8LookupString (Input_Context, ev, (char *)kbuf, 94 len = Xutf8LookupString (Input_Context, &ev, (char *)kbuf,
95 KBUFSZ, &keysym, &status_return); 95 KBUFSZ, &keysym, &status_return);
96 else 96 else
97#endif 97#endif
98 98
99 { 99 {
102 // the XOpenIM manpage lies about hardcoding the locale 102 // the XOpenIM manpage lies about hardcoding the locale
103 // at the point of XOpenIM, so temporarily switch locales 103 // at the point of XOpenIM, so temporarily switch locales
104 if (rs[Rs_imLocale]) 104 if (rs[Rs_imLocale])
105 SET_LOCALE (rs[Rs_imLocale]); 105 SET_LOCALE (rs[Rs_imLocale]);
106 // assume wchar_t == unicode or better 106 // assume wchar_t == unicode or better
107 len = XwcLookupString (Input_Context, ev, wkbuf, 107 len = XwcLookupString (Input_Context, &ev, wkbuf,
108 KBUFSZ, &keysym, &status_return); 108 KBUFSZ, &keysym, &status_return);
109 if (rs[Rs_imLocale]) 109 if (rs[Rs_imLocale])
110 SET_LOCALE (locale); 110 SET_LOCALE (locale);
111 111
112 if (status_return == XLookupChars 112 if (status_return == XLookupChars
126 } 126 }
127 else 127 else
128#endif 128#endif
129 129
130 { 130 {
131 len = XLookupString (ev, (char *)kbuf, KBUFSZ, &keysym, &compose); 131 len = XLookupString (&ev, (char *)kbuf, KBUFSZ, &keysym, &compose);
132 valid_keysym = !len; 132 valid_keysym = !len;
133 } 133 }
134 134
135 if (valid_keysym) 135 if (valid_keysym)
136 { 136 {
227 { 227 {
228 switch (keysym) 228 switch (keysym)
229 { 229 {
230 /* normal XTerm key bindings */ 230 /* normal XTerm key bindings */
231 case XK_Insert: /* Shift+Insert = paste mouse selection */ 231 case XK_Insert: /* Shift+Insert = paste mouse selection */
232 selection_request (ev->time, 0, 0); 232 selection_request (ev.time, 0, 0);
233 return; 233 return;
234 /* rxvt extras */ 234 /* rxvt extras */
235 case XK_KP_Add: /* Shift+KP_Add = bigger font */ 235 case XK_KP_Add: /* Shift+KP_Add = bigger font */
236 change_font (0, FONT_UP); 236 change_font (0, FONT_UP);
237 return; 237 return;
342#ifdef CTRL_TAB_MAKES_META 342#ifdef CTRL_TAB_MAKES_META
343 if (ctrl) 343 if (ctrl)
344 meta = 1; 344 meta = 1;
345#endif 345#endif
346#ifdef MOD4_TAB_MAKES_META 346#ifdef MOD4_TAB_MAKES_META
347 if (ev->state & Mod4Mask) 347 if (ev.state & Mod4Mask)
348 meta = 1; 348 meta = 1;
349#endif 349#endif
350 newlen = 0; 350 newlen = 0;
351 } 351 }
352 break; 352 break;
753 IMSendSpot (); 753 IMSendSpot ();
754#endif 754#endif
755 755
756 } 756 }
757 757
758 XFlush (Xdisplay); 758 XFlush (display->display);
759} 759}
760 760
761void 761void
762rxvt_term::check_cb (check_watcher &w) 762rxvt_term::check_cb (check_watcher &w)
763{ 763{
764 SET_R (this); 764 SET_R (this);
765 SET_LOCALE (locale); 765 SET_LOCALE (locale);
766 766
767 flush (); 767 flush ();
768}
769
770void
771rxvt_term::process_x_events ()
772{
773 do
774 {
775 XEvent xev;
776
777 XNextEvent (Xdisplay, &xev);
778
779#if defined(CURSOR_BLINK)
780 if ((Options & Opt_cursorBlink) && xev.type == KeyPress)
781 {
782 if (hidden_cursor)
783 {
784 hidden_cursor = 0;
785 want_refresh = 1;
786 }
787
788 cursor_blink_ev.start (NOW + BLINK_INTERVAL);
789 }
790#endif
791
792#if defined(POINTER_BLANK)
793 if ((Options & Opt_pointerBlank) && pointerBlankDelay > 0)
794 {
795 if (xev.type == MotionNotify
796 || xev.type == ButtonPress
797 || xev.type == ButtonRelease)
798 if (hidden_pointer)
799 pointer_unblank ();
800
801 if (xev.type == KeyPress && hidden_pointer == 0)
802 pointer_blank ();
803 }
804#endif
805
806#ifdef USE_XIM
807 if (!XFilterEvent (&xev, xev.xany.window))
808#endif
809 process_x_event (&xev);
810 }
811 while (XPending (Xdisplay));
812} 768}
813 769
814#ifdef CURSOR_BLINK 770#ifdef CURSOR_BLINK
815void 771void
816rxvt_term::cursor_blink_cb (time_watcher &w) 772rxvt_term::cursor_blink_cb (time_watcher &w)
832 want_refresh = 1; 788 want_refresh = 1;
833 w.start (w.at + TEXT_BLINK_INTERVAL); 789 w.start (w.at + TEXT_BLINK_INTERVAL);
834 } 790 }
835} 791}
836#endif 792#endif
837
838void
839rxvt_term::x_cb (io_watcher &w, short revents)
840{
841 SET_R (this);
842 SET_LOCALE (locale);
843
844 process_x_events ();
845}
846 793
847bool 794bool
848rxvt_term::pty_fill () 795rxvt_term::pty_fill ()
849{ 796{
850 ssize_t n = cmdbuf_endp - cmdbuf_ptr; 797 ssize_t n = cmdbuf_endp - cmdbuf_ptr;
1042 989
1043#ifdef POINTER_BLANK 990#ifdef POINTER_BLANK
1044void 991void
1045rxvt_term::pointer_unblank () 992rxvt_term::pointer_unblank ()
1046{ 993{
1047 XDefineCursor (Xdisplay, TermWin.vt, TermWin_cursor); 994 XDefineCursor (display->display, TermWin.vt, TermWin_cursor);
1048 recolour_cursor (); 995 recolour_cursor ();
1049 996
1050 hidden_pointer = 0; 997 hidden_pointer = 0;
1051 998
1052 if (Options & Opt_pointerBlank) 999 if (Options & Opt_pointerBlank)
1057rxvt_term::pointer_blank () 1004rxvt_term::pointer_blank ()
1058{ 1005{
1059 if (!(Options & Opt_pointerBlank)) 1006 if (!(Options & Opt_pointerBlank))
1060 return; 1007 return;
1061 1008
1062 XDefineCursor (Xdisplay, TermWin.vt, blank_cursor); 1009 XDefineCursor (display->display, TermWin.vt, blank_cursor);
1063 XFlush (Xdisplay); 1010 XFlush (display->display);
1064 1011
1065 hidden_pointer = 1; 1012 hidden_pointer = 1;
1066} 1013}
1067 1014
1068void 1015void
1074 pointer_blank (); 1021 pointer_blank ();
1075} 1022}
1076#endif 1023#endif
1077 1024
1078void 1025void
1079rxvt_term::mouse_report (const XButtonEvent *ev) 1026rxvt_term::mouse_report (const XButtonEvent &ev)
1080{ 1027{
1081 int button_number, key_state = 0; 1028 int button_number, key_state = 0;
1082 int x, y; 1029 int x, y;
1083 1030
1084 x = ev->x; 1031 x = ev.x;
1085 y = ev->y; 1032 y = ev.y;
1086 pixel_position (&x, &y); 1033 pixel_position (&x, &y);
1087 1034
1088 if (MEvent.button == AnyButton) 1035 if (MEvent.button == AnyButton)
1089 { 1036 {
1090 button_number = 3; 1037 button_number = 3;
1149 1096
1150#ifdef USING_W11LIB 1097#ifdef USING_W11LIB
1151void 1098void
1152rxvt_W11_process_x_event(XEvent *ev) 1099rxvt_W11_process_x_event(XEvent *ev)
1153{ 1100{
1154 rxvt_t *r = rxvt_get_r(); 1101 rxvt_t *r = rxvt_get_r();
1155 1102
1156 process_x_event (ev); 1103 x_cb (*ev);
1157} 1104}
1158#endif 1105#endif
1159 1106
1160/*{{{ process an X event */ 1107/*{{{ process an X event */
1161void 1108void
1162rxvt_term::process_x_event (XEvent *ev) 1109rxvt_term::x_cb (XEvent &ev)
1163{ 1110{
1111 SET_R (this);
1112 SET_LOCALE (locale);
1113
1114#if defined(CURSOR_BLINK)
1115 if ((Options & Opt_cursorBlink) && ev.type == KeyPress)
1116 {
1117 if (hidden_cursor)
1118 {
1119 hidden_cursor = 0;
1120 want_refresh = 1;
1121 }
1122
1123 cursor_blink_ev.start (NOW + BLINK_INTERVAL);
1124 }
1125#endif
1126
1127#if defined(POINTER_BLANK)
1128 if ((Options & Opt_pointerBlank) && pointerBlankDelay > 0)
1129 {
1130 if (ev.type == MotionNotify
1131 || ev.type == ButtonPress
1132 || ev.type == ButtonRelease)
1133 if (hidden_pointer)
1134 pointer_unblank ();
1135
1136 if (ev.type == KeyPress && hidden_pointer == 0)
1137 pointer_blank ();
1138 }
1139#endif
1140
1141#ifdef USE_XIM
1142 if (XFilterEvent (&ev, None))
1143 return;
1144#endif
1145
1164 Window unused_root, unused_child; 1146 Window unused_root, unused_child;
1165 int unused_root_x, unused_root_y; 1147 int unused_root_x, unused_root_y;
1166 unsigned int unused_mask; 1148 unsigned int unused_mask;
1167 1149
1168#ifdef DEBUG_X 1150#ifdef DEBUG_X
1209#ifdef DEBUG_X 1191#ifdef DEBUG_X
1210 struct timeval tp; 1192 struct timeval tp;
1211 struct tm *ltt; 1193 struct tm *ltt;
1212 (void)gettimeofday(&tp, NULL); 1194 (void)gettimeofday(&tp, NULL);
1213 ltt = localtime(&(tp.tv_sec)); 1195 ltt = localtime(&(tp.tv_sec));
1214 D_X((stderr, "Event: %-16s %-7s %08lx (%4d-%02d-%02d %02d:%02d:%02d.%.6ld) %s %lu", eventnames[ev->type], (ev->xany.window == TermWin.parent[0] ? "parent" : (ev->xany.window == TermWin.vt ? "vt" : (ev->xany.window == scrollBar.win ? "scroll" : (ev->xany.window == menuBar.win ? "menubar" : "UNKNOWN")))), (ev->xany.window == TermWin.parent[0] ? TermWin.parent[0] : (ev->xany.window == TermWin.vt ? TermWin.vt : (ev->xany.window == scrollBar.win ? scrollBar.win : (ev->xany.window == menuBar.win ? menuBar.win : 0)))), ltt->tm_year + 1900, ltt->tm_mon + 1, ltt->tm_mday, ltt->tm_hour, ltt->tm_min, ltt->tm_sec, tp.tv_usec, ev->xany.send_event ? "S" : " ", ev->xany.serial)); 1196 D_X((stderr, "Event: %-16s %-7s %08lx (%4d-%02d-%02d %02d:%02d:%02d.%.6ld) %s %lu", eventnames[ev.type], (ev.xany.window == TermWin.parent[0] ? "parent" : (ev.xany.window == TermWin.vt ? "vt" : (ev.xany.window == scrollBar.win ? "scroll" : (ev.xany.window == menuBar.win ? "menubar" : "UNKNOWN")))), (ev.xany.window == TermWin.parent[0] ? TermWin.parent[0] : (ev.xany.window == TermWin.vt ? TermWin.vt : (ev.xany.window == scrollBar.win ? scrollBar.win : (ev.xany.window == menuBar.win ? menuBar.win : 0)))), ltt->tm_year + 1900, ltt->tm_mon + 1, ltt->tm_mday, ltt->tm_hour, ltt->tm_min, ltt->tm_sec, tp.tv_usec, ev.xany.send_event ? "S" : " ", ev.xany.serial));
1215#endif 1197#endif
1216 1198
1217 switch (ev->type) 1199 switch (ev.type)
1218 { 1200 {
1219 case KeyPress: 1201 case KeyPress:
1220 lookup_key ((XKeyEvent *)ev); 1202 lookup_key (ev.xkey);
1221 break; 1203 break;
1222 1204
1223#if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING) 1205#if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING)
1224 case KeyRelease: 1206 case KeyRelease:
1225 { 1207 {
1226 if (!(ev->xkey.state & ControlMask)) 1208 if (!(ev.xkey.state & ControlMask))
1227 mouse_slip_wheel_speed = 0; 1209 mouse_slip_wheel_speed = 0;
1228 else 1210 else
1229 { 1211 {
1230 KeySym ks; 1212 KeySym ks;
1231 1213
1232 ks = XKeycodeToKeysym(Xdisplay, ev->xkey.keycode, 0); 1214 ks = XKeycodeToKeysym(display->display, ev.xkey.keycode, 0);
1233 if (ks == XK_Control_L || ks == XK_Control_R) 1215 if (ks == XK_Control_L || ks == XK_Control_R)
1234 mouse_slip_wheel_speed = 0; 1216 mouse_slip_wheel_speed = 0;
1235 } 1217 }
1236 break; 1218 break;
1237 } 1219 }
1238#endif 1220#endif
1239 1221
1240 case ButtonPress: 1222 case ButtonPress:
1241 button_press ((XButtonEvent *)ev); 1223 button_press (ev.xbutton);
1242 break; 1224 break;
1243 1225
1244 case ButtonRelease: 1226 case ButtonRelease:
1245 button_release ((XButtonEvent *)ev); 1227 button_release (ev.xbutton);
1246 break; 1228 break;
1247 1229
1248 case ClientMessage: 1230 case ClientMessage:
1249 if (ev->xclient.format == 32 1231 if (ev.xclient.format == 32
1250 && (Atom)ev->xclient.data.l[0] == xa[XA_WMDELETEWINDOW]) 1232 && (Atom)ev.xclient.data.l[0] == xa[XA_WMDELETEWINDOW])
1251 destroy (); 1233 destroy ();
1252#ifdef OFFIX_DND 1234#ifdef OFFIX_DND
1253 /* OffiX Dnd (drag 'n' drop) protocol */ 1235 /* OffiX Dnd (drag 'n' drop) protocol */
1254 else if (ev->xclient.message_type == xa[XA_DNDPROTOCOL] 1236 else if (ev.xclient.message_type == xa[XA_DNDPROTOCOL]
1255 && (ev->xclient.data.l[0] == DndFile 1237 && (ev.xclient.data.l[0] == DndFile
1256 || ev->xclient.data.l[0] == DndDir 1238 || ev.xclient.data.l[0] == DndDir
1257 || ev->xclient.data.l[0] == DndLink)) 1239 || ev.xclient.data.l[0] == DndLink))
1258 { 1240 {
1259 /* Get Dnd data */ 1241 /* Get Dnd data */
1260 Atom ActualType; 1242 Atom ActualType;
1261 int ActualFormat; 1243 int ActualFormat;
1262 unsigned char *data; 1244 unsigned char *data;
1263 unsigned long Size, RemainingBytes; 1245 unsigned long Size, RemainingBytes;
1264 1246
1265 XGetWindowProperty(Xdisplay, Xroot, 1247 XGetWindowProperty(display->display, display->root,
1266 xa[XA_DNDSELECTION], 1248 xa[XA_DNDSELECTION],
1267 0L, 1000000L, 1249 0L, 1000000L,
1268 False, AnyPropertyType, 1250 False, AnyPropertyType,
1269 &ActualType, &ActualFormat, 1251 &ActualType, &ActualFormat,
1270 &Size, &RemainingBytes, 1252 &Size, &RemainingBytes,
1271 &data); 1253 &data);
1272 XChangeProperty(Xdisplay, Xroot, 1254 XChangeProperty(display->display, display->root,
1273 XA_CUT_BUFFER0, XA_STRING, 1255 XA_CUT_BUFFER0, XA_STRING,
1274 8, PropModeReplace, 1256 8, PropModeReplace,
1275 data, STRLEN(data)); 1257 data, STRLEN(data));
1276 selection_paste (Xroot, XA_CUT_BUFFER0, True); 1258 selection_paste (display->root, XA_CUT_BUFFER0, True);
1277 XSetInputFocus(Xdisplay, Xroot, RevertToNone, CurrentTime); 1259 XSetInputFocus(display->display, display->root, RevertToNone, CurrentTime);
1278 } 1260 }
1279#endif /* OFFIX_DND */ 1261#endif /* OFFIX_DND */
1280 break; 1262 break;
1281 1263
1282 case MappingNotify: 1264 case MappingNotify:
1283 XRefreshKeyboardMapping(&(ev->xmapping)); 1265 XRefreshKeyboardMapping(&(ev.xmapping));
1284 break; 1266 break;
1285 1267
1286 /* 1268 /*
1287 * XXX: this is not the _current_ arrangement 1269 * XXX: this is not the _current_ arrangement
1288 * Here's my conclusion: 1270 * Here's my conclusion:
1292 * in the GraphicsExpose parts, which means that after each refresh, 1274 * in the GraphicsExpose parts, which means that after each refresh,
1293 * we need to wait for the graphics expose or Noexpose events, 1275 * we need to wait for the graphics expose or Noexpose events,
1294 * which ought to make things real slow! 1276 * which ought to make things real slow!
1295 */ 1277 */
1296 case VisibilityNotify: 1278 case VisibilityNotify:
1297 switch (ev->xvisibility.state) 1279 switch (ev.xvisibility.state)
1298 { 1280 {
1299 case VisibilityUnobscured: 1281 case VisibilityUnobscured:
1300 refresh_type = FAST_REFRESH; 1282 refresh_type = FAST_REFRESH;
1301 break; 1283 break;
1302 case VisibilityPartiallyObscured: 1284 case VisibilityPartiallyObscured:
1342 1324
1343 } 1325 }
1344 break; 1326 break;
1345 1327
1346 case ConfigureNotify: 1328 case ConfigureNotify:
1347 if (ev->xconfigure.window == TermWin.parent[0]) 1329 if (ev.xconfigure.window == TermWin.parent[0])
1348 { 1330 {
1349 int height, width; 1331 int height, width;
1350 1332
1351 do 1333 do
1352 { /* Wrap lots of configures into one */ 1334 { /* Wrap lots of configures into one */
1353 width = ev->xconfigure.width; 1335 width = ev.xconfigure.width;
1354 height = ev->xconfigure.height; 1336 height = ev.xconfigure.height;
1355 D_SIZE((stderr, "Size: ConfigureNotify: %4d x %4d", width, height)); 1337 D_SIZE((stderr, "Size: ConfigureNotify: %4d x %4d", width, height));
1356 } 1338 }
1357 while (XCheckTypedWindowEvent(Xdisplay, ev->xconfigure.window, 1339 while (XCheckTypedWindowEvent(display->display, ev.xconfigure.window, ConfigureNotify, &ev));
1358 ConfigureNotify, ev)); 1340
1359 if (szHint.width != width || szHint.height != height) 1341 if (szHint.width != width || szHint.height != height)
1360 { 1342 {
1361 D_SIZE((stderr, "Size: Resizing from: %4d x %4d", szHint.width, szHint.height)); 1343 D_SIZE((stderr, "Size: Resizing from: %4d x %4d", szHint.width, szHint.height));
1362 resize_all_windows (width, height, 1); 1344 resize_all_windows (width, height, 1);
1363 } 1345 }
1383 selection_clear (); 1365 selection_clear ();
1384 break; 1366 break;
1385 1367
1386 case SelectionNotify: 1368 case SelectionNotify:
1387 if (selection_wait == Sel_normal) 1369 if (selection_wait == Sel_normal)
1388 selection_paste (ev->xselection.requestor, 1370 selection_paste (ev.xselection.requestor,
1389 ev->xselection.property, True); 1371 ev.xselection.property, True);
1390 break; 1372 break;
1391 1373
1392 case SelectionRequest: 1374 case SelectionRequest:
1393 selection_send (&(ev->xselectionrequest)); 1375 selection_send (ev.xselectionrequest);
1394 break; 1376 break;
1395 1377
1396 case UnmapNotify: 1378 case UnmapNotify:
1397 TermWin.mapped = 0; 1379 TermWin.mapped = 0;
1398#ifdef TEXT_BLINK 1380#ifdef TEXT_BLINK
1406 text_blink_ev.start (NOW + TEXT_BLINK_INTERVAL); 1388 text_blink_ev.start (NOW + TEXT_BLINK_INTERVAL);
1407#endif 1389#endif
1408 break; 1390 break;
1409 1391
1410 case PropertyNotify: 1392 case PropertyNotify:
1411 if (ev->xproperty.atom == xa[XA_VT_SELECTION]) 1393 if (ev.xproperty.atom == xa[XA_VT_SELECTION])
1412 {
1413 if (ev->xproperty.state == PropertyNewValue) 1394 if (ev.xproperty.state == PropertyNewValue)
1414 selection_property (ev->xproperty.window, 1395 selection_property (ev.xproperty.window, ev.xproperty.atom);
1415 ev->xproperty.atom);
1416 break; 1396 break;
1417 } 1397
1418#ifdef TRANSPARENT 1398#ifdef TRANSPARENT
1419 /*
1420 * if user used some Esetroot compatible prog to set the root bg,
1421 * use the property to determine the pixmap. We use it later on.
1422 */
1423 if (xa[XA_XROOTPMAPID] == 0)
1424 xa[XA_XROOTPMAPID] = XInternAtom(Xdisplay,
1425 "_XROOTPMAP_ID", False);
1426 if (ev->xproperty.atom != xa[XA_XROOTPMAPID])
1427 break;
1428 /* FALLTHROUGH */
1429 case ReparentNotify: 1399 case ReparentNotify:
1430 if ((Options & Opt_transparent) && check_our_parents ()) 1400 rootwin_cb (ev);
1431 { 1401 break;
1432 if (am_transparent)
1433 want_full_refresh = 1;
1434 }
1435#endif /* TRANSPARENT */ 1402#endif /* TRANSPARENT */
1436 break;
1437 1403
1438 case GraphicsExpose: 1404 case GraphicsExpose:
1439 case Expose: 1405 case Expose:
1440 if (ev->xany.window == TermWin.vt) 1406 if (ev.xany.window == TermWin.vt)
1441 { 1407 {
1442#ifdef NO_SLOW_LINK_SUPPORT 1408#ifdef NO_SLOW_LINK_SUPPORT
1443 scr_expose (ev->xexpose.x, ev->xexpose.y, 1409 scr_expose (ev.xexpose.x, ev.xexpose.y,
1444 ev->xexpose.width, ev->xexpose.height, False); 1410 ev.xexpose.width, ev.xexpose.height, False);
1445#else 1411#else
1446 // don't understand this, so commented it out 1412 // don't understand this, so commented it out
1447 scr_expose (ev->xexpose.x, ev->xexpose.y, 1413 scr_expose (ev.xexpose.x, ev.xexpose.y,
1448 ev->xexpose.width, ev->xexpose.height, False); 1414 ev.xexpose.width, ev.xexpose.height, False);
1449 //scr_expose (ev->xexpose.x, 0, 1415 //scr_expose (ev.xexpose.x, 0,
1450 // ev->xexpose.width, TermWin.height, False); 1416 // ev.xexpose.width, TermWin.height, False);
1451#endif 1417#endif
1452 want_refresh = 1; 1418 want_refresh = 1;
1453 } 1419 }
1454 else 1420 else
1455 { 1421 {
1456 XEvent unused_xevent; 1422 XEvent unused_event;
1457 1423
1458 while (XCheckTypedWindowEvent(Xdisplay, ev->xany.window, 1424 while (XCheckTypedWindowEvent(display->display, ev.xany.window,
1459 Expose, 1425 Expose,
1460 &unused_xevent)) ; 1426 &unused_event)) ;
1461 while (XCheckTypedWindowEvent(Xdisplay, ev->xany.window, 1427 while (XCheckTypedWindowEvent(display->display, ev.xany.window,
1462 GraphicsExpose, 1428 GraphicsExpose,
1463 &unused_xevent)) ; 1429 &unused_event)) ;
1464 if (isScrollbarWindow(ev->xany.window)) 1430 if (isScrollbarWindow(ev.xany.window))
1465 { 1431 {
1466 scrollBar.setIdle(); 1432 scrollBar.setIdle();
1467 scrollbar_show (0); 1433 scrollbar_show (0);
1468 } 1434 }
1469#ifdef MENUBAR 1435#ifdef MENUBAR
1470 if (menubar_visible () && isMenuBarWindow(ev->xany.window)) 1436 if (menubar_visible () && isMenuBarWindow(ev.xany.window))
1471 menubar_expose (); 1437 menubar_expose ();
1472#endif 1438#endif
1473#ifdef RXVT_GRAPHICS 1439#ifdef RXVT_GRAPHICS
1474 Gr_expose (ev->xany.window); 1440 Gr_expose (ev.xany.window);
1475#endif 1441#endif
1476 1442
1477 } 1443 }
1478 break; 1444 break;
1479 1445
1481#ifdef POINTER_BLANK 1447#ifdef POINTER_BLANK
1482 if (hidden_pointer) 1448 if (hidden_pointer)
1483 pointer_unblank (); 1449 pointer_unblank ();
1484#endif 1450#endif
1485#if MENUBAR 1451#if MENUBAR
1486 if (isMenuBarWindow(ev->xany.window)) 1452 if (isMenuBarWindow(ev.xany.window))
1487 { 1453 {
1488 menubar_control (&(ev->xbutton)); 1454 menubar_control (&(ev.xbutton));
1489 break; 1455 break;
1490 } 1456 }
1491#endif 1457#endif
1492 if ((PrivateModes & PrivMode_mouse_report) && !(bypass_keystate)) 1458 if ((PrivateModes & PrivMode_mouse_report) && !(bypass_keystate))
1493 break; 1459 break;
1494 1460
1495 if (ev->xany.window == TermWin.vt) 1461 if (ev.xany.window == TermWin.vt)
1496 { 1462 {
1497 if ((ev->xbutton.state & (Button1Mask | Button3Mask))) 1463 if ((ev.xbutton.state & (Button1Mask | Button3Mask)))
1498 { 1464 {
1499 while (XCheckTypedWindowEvent(Xdisplay, TermWin.vt, 1465 while (XCheckTypedWindowEvent (display->display, TermWin.vt, MotionNotify, &ev))
1500 MotionNotify, ev)) ; 1466 ;
1467
1501 XQueryPointer(Xdisplay, TermWin.vt, 1468 XQueryPointer(display->display, TermWin.vt,
1502 &unused_root, &unused_child, 1469 &unused_root, &unused_child,
1503 &unused_root_x, &unused_root_y, 1470 &unused_root_x, &unused_root_y,
1504 &(ev->xbutton.x), &(ev->xbutton.y), 1471 &(ev.xbutton.x), &(ev.xbutton.y),
1505 &unused_mask); 1472 &unused_mask);
1506#ifdef MOUSE_THRESHOLD 1473#ifdef MOUSE_THRESHOLD
1507 /* deal with a `jumpy' mouse */ 1474 /* deal with a `jumpy' mouse */
1508 if ((ev->xmotion.time - MEvent.time) > MOUSE_THRESHOLD) 1475 if ((ev.xmotion.time - MEvent.time) > MOUSE_THRESHOLD)
1509 { 1476 {
1510#endif 1477#endif
1511 selection_extend ((ev->xbutton.x), (ev->xbutton.y), 1478 selection_extend ((ev.xbutton.x), (ev.xbutton.y),
1512 (ev->xbutton.state & Button3Mask) ? 2 : 0); 1479 (ev.xbutton.state & Button3Mask) ? 2 : 0);
1513#ifdef SELECTION_SCROLLING 1480#ifdef SELECTION_SCROLLING
1514 if (ev->xbutton.y < TermWin.int_bwidth 1481 if (ev.xbutton.y < TermWin.int_bwidth
1515 || Pixel2Row(ev->xbutton.y) > (TermWin.nrow-1)) 1482 || Pixel2Row(ev.xbutton.y) > (TermWin.nrow-1))
1516 { 1483 {
1517 int dist; 1484 int dist;
1518 1485
1519 pending_scroll_selection=1; 1486 pending_scroll_selection=1;
1520 1487
1525 scroll_selection_delay=SCROLLBAR_CONTINUOUS_DELAY; 1492 scroll_selection_delay=SCROLLBAR_CONTINUOUS_DELAY;
1526 1493
1527 /* save the event params so we can highlight 1494 /* save the event params so we can highlight
1528 * the selection in the pending-scroll loop 1495 * the selection in the pending-scroll loop
1529 */ 1496 */
1530 selection_save_x=ev->xbutton.x; 1497 selection_save_x=ev.xbutton.x;
1531 selection_save_y=ev->xbutton.y; 1498 selection_save_y=ev.xbutton.y;
1532 selection_save_state= 1499 selection_save_state=
1533 (ev->xbutton.state & Button3Mask) ? 2 : 0; 1500 (ev.xbutton.state & Button3Mask) ? 2 : 0;
1534 1501
1535 /* calc number of lines to scroll */ 1502 /* calc number of lines to scroll */
1536 if (ev->xbutton.y<TermWin.int_bwidth) 1503 if (ev.xbutton.y<TermWin.int_bwidth)
1537 { 1504 {
1538 scroll_selection_dir = UP; 1505 scroll_selection_dir = UP;
1539 dist = TermWin.int_bwidth - ev->xbutton.y; 1506 dist = TermWin.int_bwidth - ev.xbutton.y;
1540 } 1507 }
1541 else 1508 else
1542 { 1509 {
1543 scroll_selection_dir = DN; 1510 scroll_selection_dir = DN;
1544 dist = ev->xbutton.y - 1511 dist = ev.xbutton.y -
1545 (TermWin.int_bwidth + TermWin.height); 1512 (TermWin.int_bwidth + TermWin.height);
1546 } 1513 }
1547 scroll_selection_lines=(Pixel2Height(dist)/ 1514 scroll_selection_lines=(Pixel2Height(dist)/
1548 SELECTION_SCROLL_LINE_SPEEDUP)+1; 1515 SELECTION_SCROLL_LINE_SPEEDUP)+1;
1549 MIN_IT(scroll_selection_lines, 1516 MIN_IT(scroll_selection_lines,
1562 } 1529 }
1563#endif 1530#endif
1564 1531
1565 } 1532 }
1566 } 1533 }
1567 else if (isScrollbarWindow(ev->xany.window) && scrollbar_isMotion()) 1534 else if (isScrollbarWindow(ev.xany.window) && scrollbar_isMotion())
1568 { 1535 {
1569 while (XCheckTypedWindowEvent(Xdisplay, scrollBar.win, 1536 while (XCheckTypedWindowEvent(display->display, scrollBar.win,
1570 MotionNotify, ev)) ; 1537 MotionNotify, &ev)) ;
1571 XQueryPointer(Xdisplay, scrollBar.win, 1538 XQueryPointer(display->display, scrollBar.win,
1572 &unused_root, &unused_child, 1539 &unused_root, &unused_child,
1573 &unused_root_x, &unused_root_y, 1540 &unused_root_x, &unused_root_y,
1574 &(ev->xbutton.x), &(ev->xbutton.y), 1541 &(ev.xbutton.x), &(ev.xbutton.y),
1575 &unused_mask); 1542 &unused_mask);
1576 scr_move_to (scrollbar_position(ev->xbutton.y) - csrO, 1543 scr_move_to (scrollbar_position(ev.xbutton.y) - csrO,
1577 scrollbar_size()); 1544 scrollbar_size());
1578 scr_refresh (refresh_type); 1545 scr_refresh (refresh_type);
1579 refresh_limit = 0; 1546 refresh_limit = 0;
1580 scrollbar_show (1); 1547 scrollbar_show (1);
1581 } 1548 }
1582 break; 1549 break;
1583 } 1550 }
1584} 1551}
1585 1552
1586void 1553void
1554rxvt_term::rootwin_cb (XEvent &ev)
1555{
1556 SET_R (this);
1557 SET_LOCALE (locale);
1558
1559 if (ev.type == PropertyNotify)
1560 {
1561 /*
1562 * if user used some Esetroot compatible prog to set the root bg,
1563 * use the property to determine the pixmap. We use it later on.
1564 */
1565 if (xa[XA_XROOTPMAPID] == 0)
1566 xa[XA_XROOTPMAPID] = XInternAtom(display->display, "_XROOTPMAP_ID", False);
1567
1568 if (ev.xproperty.atom != xa[XA_XROOTPMAPID])
1569 return;
1570 }
1571
1572 if ((Options & Opt_transparent) && check_our_parents ())
1573 {
1574 if (am_transparent)
1575 want_full_refresh = 1;
1576 }
1577}
1578
1579void
1587rxvt_term::button_press (XButtonEvent *ev) 1580rxvt_term::button_press (const XButtonEvent &ev)
1588{ 1581{
1589 int reportmode = 0, clickintime; 1582 int reportmode = 0, clickintime;
1590 1583
1591 bypass_keystate = ev->state & (ModMetaMask | ShiftMask); 1584 bypass_keystate = ev.state & (ModMetaMask | ShiftMask);
1592 if (!bypass_keystate) 1585 if (!bypass_keystate)
1593 reportmode = !!(PrivateModes & PrivMode_mouse_report); 1586 reportmode = !!(PrivateModes & PrivMode_mouse_report);
1594 /* 1587 /*
1595 * VT window processing of button press 1588 * VT window processing of button press
1596 */ 1589 */
1597 if (ev->window == TermWin.vt) 1590 if (ev.window == TermWin.vt)
1598 { 1591 {
1599#if RXVT_GRAPHICS 1592#if RXVT_GRAPHICS
1600 if (ev->subwindow != None) 1593 if (ev.subwindow != None)
1601 rxvt_Gr_ButtonPress (ev->x, ev->y); 1594 rxvt_Gr_ButtonPress (ev.x, ev.y);
1602 else 1595 else
1603#endif 1596#endif
1604 1597
1605 { 1598 {
1606 clickintime = ev->time - MEvent.time < MULTICLICK_TIME; 1599 clickintime = ev.time - MEvent.time < MULTICLICK_TIME;
1607 if (reportmode) 1600 if (reportmode)
1608 { 1601 {
1609 /* mouse report from vt window */ 1602 /* mouse report from vt window */
1610 /* save the xbutton state (for ButtonRelease) */ 1603 /* save the xbutton state (for ButtonRelease) */
1611 MEvent.state = ev->state; 1604 MEvent.state = ev.state;
1612#ifdef MOUSE_REPORT_DOUBLECLICK 1605#ifdef MOUSE_REPORT_DOUBLECLICK
1613 if (ev->button == MEvent.button && clickintime) 1606 if (ev.button == MEvent.button && clickintime)
1614 { 1607 {
1615 /* same button, within alloted time */ 1608 /* same button, within alloted time */
1616 MEvent.clicks++; 1609 MEvent.clicks++;
1617 if (MEvent.clicks > 1) 1610 if (MEvent.clicks > 1)
1618 { 1611 {
1627 } 1620 }
1628 else 1621 else
1629 { 1622 {
1630 /* different button, or time expired */ 1623 /* different button, or time expired */
1631 MEvent.clicks = 1; 1624 MEvent.clicks = 1;
1632 MEvent.button = ev->button; 1625 MEvent.button = ev.button;
1633 mouse_report (ev); 1626 mouse_report (ev);
1634 } 1627 }
1635#else 1628#else
1636 MEvent.button = ev->button; 1629 MEvent.button = ev.button;
1637 mouse_report (ev); 1630 mouse_report (ev);
1638#endif /* MOUSE_REPORT_DOUBLECLICK */ 1631#endif /* MOUSE_REPORT_DOUBLECLICK */
1639 1632
1640 } 1633 }
1641 else 1634 else
1642 { 1635 {
1643 if (ev->button != MEvent.button) 1636 if (ev.button != MEvent.button)
1644 MEvent.clicks = 0; 1637 MEvent.clicks = 0;
1645 switch (ev->button) 1638 switch (ev.button)
1646 { 1639 {
1647 case Button1: 1640 case Button1:
1648 /* allow shift+left click to extend selection */ 1641 /* allow shift+left click to extend selection */
1649 if (ev->state & ShiftMask && !(PrivateModes & PrivMode_mouse_report)) 1642 if (ev.state & ShiftMask && !(PrivateModes & PrivMode_mouse_report))
1650 { 1643 {
1651 if (MEvent.button == Button1 && clickintime) 1644 if (MEvent.button == Button1 && clickintime)
1652 selection_rotate (ev->x, ev->y); 1645 selection_rotate (ev.x, ev.y);
1653 else 1646 else
1654 selection_extend (ev->x, ev->y, 1); 1647 selection_extend (ev.x, ev.y, 1);
1655 } 1648 }
1656 else 1649 else
1657 { 1650 {
1658 if (MEvent.button == Button1 && clickintime) 1651 if (MEvent.button == Button1 && clickintime)
1659 MEvent.clicks++; 1652 MEvent.clicks++;
1660 else 1653 else
1661 MEvent.clicks = 1; 1654 MEvent.clicks = 1;
1662 1655
1663 selection_click (MEvent.clicks, ev->x, ev->y); 1656 selection_click (MEvent.clicks, ev.x, ev.y);
1664 } 1657 }
1665 1658
1666 MEvent.button = Button1; 1659 MEvent.button = Button1;
1667 break; 1660 break;
1668 1661
1669 case Button3: 1662 case Button3:
1670 if (MEvent.button == Button3 && clickintime) 1663 if (MEvent.button == Button3 && clickintime)
1671 selection_rotate (ev->x, ev->y); 1664 selection_rotate (ev.x, ev.y);
1672 else 1665 else
1673 selection_extend (ev->x, ev->y, 1); 1666 selection_extend (ev.x, ev.y, 1);
1674 MEvent.button = Button3; 1667 MEvent.button = Button3;
1675 break; 1668 break;
1676 } 1669 }
1677 } 1670 }
1678 MEvent.time = ev->time; 1671 MEvent.time = ev.time;
1679 return; 1672 return;
1680 } 1673 }
1681 } 1674 }
1682 1675
1683 /* 1676 /*
1684 * Scrollbar window processing of button press 1677 * Scrollbar window processing of button press
1685 */ 1678 */
1686 if (isScrollbarWindow(ev->window)) 1679 if (isScrollbarWindow(ev.window))
1687 { 1680 {
1688 scrollBar.setIdle (); 1681 scrollBar.setIdle ();
1689 /* 1682 /*
1690 * Rxvt-style scrollbar: 1683 * Rxvt-style scrollbar:
1691 * move up if mouse is above slider 1684 * move up if mouse is above slider
1703 * Mouse report disabled scrollbar: 1696 * Mouse report disabled scrollbar:
1704 * arrow buttons - send up/down 1697 * arrow buttons - send up/down
1705 * click on scrollbar - send pageup/down 1698 * click on scrollbar - send pageup/down
1706 */ 1699 */
1707 if ((scrollBar.style == R_SB_NEXT 1700 if ((scrollBar.style == R_SB_NEXT
1708 && scrollbarnext_upButton(ev->y)) 1701 && scrollbarnext_upButton(ev.y))
1709 || (scrollBar.style == R_SB_RXVT 1702 || (scrollBar.style == R_SB_RXVT
1710 && scrollbarrxvt_upButton(ev->y))) 1703 && scrollbarrxvt_upButton(ev.y)))
1711 tt_printf("\033[A"); 1704 tt_printf("\033[A");
1712 else if ((scrollBar.style == R_SB_NEXT 1705 else if ((scrollBar.style == R_SB_NEXT
1713 && scrollbarnext_dnButton(ev->y)) 1706 && scrollbarnext_dnButton(ev.y))
1714 || (scrollBar.style == R_SB_RXVT 1707 || (scrollBar.style == R_SB_RXVT
1715 && scrollbarrxvt_dnButton(ev->y))) 1708 && scrollbarrxvt_dnButton(ev.y)))
1716 tt_printf("\033[B"); 1709 tt_printf("\033[B");
1717 else 1710 else
1718 switch (ev->button) 1711 switch (ev.button)
1719 { 1712 {
1720 case Button2: 1713 case Button2:
1721 tt_printf("\014"); 1714 tt_printf("\014");
1722 break; 1715 break;
1723 case Button1: 1716 case Button1:
1734 { 1727 {
1735 char upordown = 0; 1728 char upordown = 0;
1736 1729
1737 if (scrollBar.style == R_SB_NEXT) 1730 if (scrollBar.style == R_SB_NEXT)
1738 { 1731 {
1739 if (scrollbarnext_upButton(ev->y)) 1732 if (scrollbarnext_upButton(ev.y))
1740 upordown = -1; /* up */ 1733 upordown = -1; /* up */
1741 else if (scrollbarnext_dnButton(ev->y)) 1734 else if (scrollbarnext_dnButton(ev.y))
1742 upordown = 1; /* down */ 1735 upordown = 1; /* down */
1743 } 1736 }
1744 else if (scrollBar.style == R_SB_RXVT) 1737 else if (scrollBar.style == R_SB_RXVT)
1745 { 1738 {
1746 if (scrollbarrxvt_upButton(ev->y)) 1739 if (scrollbarrxvt_upButton(ev.y))
1747 upordown = -1; /* up */ 1740 upordown = -1; /* up */
1748 else if (scrollbarrxvt_dnButton(ev->y)) 1741 else if (scrollbarrxvt_dnButton(ev.y))
1749 upordown = 1; /* down */ 1742 upordown = 1; /* down */
1750 } 1743 }
1751 if (upordown) 1744 if (upordown)
1752 { 1745 {
1753#ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING 1746#ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING
1760 else 1753 else
1761 scrollBar.setDn (); 1754 scrollBar.setDn ();
1762 } 1755 }
1763 } 1756 }
1764 else 1757 else
1765 switch (ev->button) 1758 switch (ev.button)
1766 { 1759 {
1767 case Button2: 1760 case Button2:
1768 switch (scrollbar_align) 1761 switch (scrollbar_align)
1769 { 1762 {
1770 case R_SB_ALIGN_TOP: 1763 case R_SB_ALIGN_TOP:
1776 case R_SB_ALIGN_BOTTOM: 1769 case R_SB_ALIGN_BOTTOM:
1777 csrO = scrollBar.bot - scrollBar.top; 1770 csrO = scrollBar.bot - scrollBar.top;
1778 break; 1771 break;
1779 } 1772 }
1780 if (scrollBar.style == R_SB_XTERM 1773 if (scrollBar.style == R_SB_XTERM
1781 || scrollbar_above_slider(ev->y) 1774 || scrollbar_above_slider(ev.y)
1782 || scrollbar_below_slider(ev->y)) 1775 || scrollbar_below_slider(ev.y))
1783 scr_move_to ( scrollbar_position(ev->y) - csrO, 1776 scr_move_to ( scrollbar_position(ev.y) - csrO,
1784 scrollbar_size()); 1777 scrollbar_size());
1785 scrollBar.setMotion (); 1778 scrollBar.setMotion ();
1786 break; 1779 break;
1787 1780
1788 case Button1: 1781 case Button1:
1789 if (scrollbar_align == R_SB_ALIGN_CENTRE) 1782 if (scrollbar_align == R_SB_ALIGN_CENTRE)
1790 csrO = ev->y - scrollBar.top; 1783 csrO = ev.y - scrollBar.top;
1791 /* FALLTHROUGH */ 1784 /* FALLTHROUGH */
1792 1785
1793 case Button3: 1786 case Button3:
1794 if (scrollBar.style != R_SB_XTERM) 1787 if (scrollBar.style != R_SB_XTERM)
1795 { 1788 {
1796 if (scrollbar_above_slider(ev->y)) 1789 if (scrollbar_above_slider(ev.y))
1797# ifdef RXVT_SCROLL_FULL 1790# ifdef RXVT_SCROLL_FULL
1798 scr_page (UP, TermWin.nrow - 1); 1791 scr_page (UP, TermWin.nrow - 1);
1799# else 1792# else
1800 scr_page (UP, TermWin.nrow / 4); 1793 scr_page (UP, TermWin.nrow / 4);
1801# endif 1794# endif
1802 else if (scrollbar_below_slider(ev->y)) 1795 else if (scrollbar_below_slider(ev.y))
1803# ifdef RXVT_SCROLL_FULL 1796# ifdef RXVT_SCROLL_FULL
1804 scr_page (DN, TermWin.nrow - 1); 1797 scr_page (DN, TermWin.nrow - 1);
1805# else 1798# else
1806 scr_page (DN, TermWin.nrow / 4); 1799 scr_page (DN, TermWin.nrow / 4);
1807# endif 1800# endif
1808 else 1801 else
1809 scrollBar.setMotion (); 1802 scrollBar.setMotion ();
1810 } 1803 }
1811 else 1804 else
1812 { 1805 {
1813 scr_page ((ev->button == Button1 ? DN : UP), 1806 scr_page ((ev.button == Button1 ? DN : UP),
1814 (TermWin.nrow 1807 (TermWin.nrow
1815 * scrollbar_position(ev->y) 1808 * scrollbar_position(ev.y)
1816 / scrollbar_size())); 1809 / scrollbar_size()));
1817 } 1810 }
1818 break; 1811 break;
1819 } 1812 }
1820 } 1813 }
1822 } 1815 }
1823#if MENUBAR 1816#if MENUBAR
1824 /* 1817 /*
1825 * Menubar window processing of button press 1818 * Menubar window processing of button press
1826 */ 1819 */
1827 if (isMenuBarWindow(ev->window)) 1820 if (isMenuBarWindow(ev.window))
1828 menubar_control (ev); 1821 menubar_control (ev);
1829#endif 1822#endif
1830} 1823}
1831 1824
1832void 1825void
1833rxvt_term::button_release (XButtonEvent *ev) 1826rxvt_term::button_release (const XButtonEvent &ev)
1834{ 1827{
1835 int reportmode = 0; 1828 int reportmode = 0;
1836 1829
1837 csrO = 0; /* reset csr Offset */ 1830 csrO = 0; /* reset csr Offset */
1838 if (!bypass_keystate) 1831 if (!bypass_keystate)
1839 reportmode = !!(PrivateModes & PrivMode_mouse_report); 1832 reportmode = !!(PrivateModes & PrivMode_mouse_report);
1840 1833
1848 1841
1849 } 1842 }
1850#ifdef SELECTION_SCROLLING 1843#ifdef SELECTION_SCROLLING
1851 pending_scroll_selection=0; 1844 pending_scroll_selection=0;
1852#endif 1845#endif
1853 if (ev->window == TermWin.vt) 1846 if (ev.window == TermWin.vt)
1854 { 1847 {
1855#ifdef RXVT_GRAPHICS 1848#ifdef RXVT_GRAPHICS
1856 if (ev->subwindow != None) 1849 if (ev.subwindow != None)
1857 rxvt_Gr_ButtonRelease(ev->x, ev->y); 1850 rxvt_Gr_ButtonRelease(ev.x, ev.y);
1858 else 1851 else
1859#endif 1852#endif
1860 1853
1861 { 1854 {
1862 if (reportmode) 1855 if (reportmode)
1863 { 1856 {
1864 /* mouse report from vt window */ 1857 /* mouse report from vt window */
1865 /* don't report release of wheel "buttons" */ 1858 /* don't report release of wheel "buttons" */
1866 if (ev->button >= 4) 1859 if (ev.button >= 4)
1867 return; 1860 return;
1868#ifdef MOUSE_REPORT_DOUBLECLICK 1861#ifdef MOUSE_REPORT_DOUBLECLICK
1869 /* only report the release of 'slow' single clicks */ 1862 /* only report the release of 'slow' single clicks */
1870 if (MEvent.button != AnyButton 1863 if (MEvent.button != AnyButton
1871 && (ev->button != MEvent.button 1864 && (ev.button != MEvent.button
1872 || (ev->time - MEvent.time 1865 || (ev.time - MEvent.time
1873 > MULTICLICK_TIME / 2))) 1866 > MULTICLICK_TIME / 2)))
1874 { 1867 {
1875 MEvent.clicks = 0; 1868 MEvent.clicks = 0;
1876 MEvent.button = AnyButton; 1869 MEvent.button = AnyButton;
1877 mouse_report (ev); 1870 mouse_report (ev);
1886 * dumb hack to compensate for the failure of click-and-drag 1879 * dumb hack to compensate for the failure of click-and-drag
1887 * when overriding mouse reporting 1880 * when overriding mouse reporting
1888 */ 1881 */
1889 if (PrivateModes & PrivMode_mouse_report 1882 if (PrivateModes & PrivMode_mouse_report
1890 && bypass_keystate 1883 && bypass_keystate
1891 && ev->button == Button1 && MEvent.clicks <= 1) 1884 && ev.button == Button1 && MEvent.clicks <= 1)
1892 selection_extend (ev->x, ev->y, 0); 1885 selection_extend (ev.x, ev.y, 0);
1893 1886
1894 switch (ev->button) 1887 switch (ev.button)
1895 { 1888 {
1896 case Button1: 1889 case Button1:
1897 case Button3: 1890 case Button3:
1898 selection_make (ev->time); 1891 selection_make (ev.time);
1899 break; 1892 break;
1900 case Button2: 1893 case Button2:
1901 selection_request (ev->time, ev->x, ev->y); 1894 selection_request (ev.time, ev.x, ev.y);
1902 break; 1895 break;
1903#ifdef MOUSE_WHEEL 1896#ifdef MOUSE_WHEEL
1904 case Button4: 1897 case Button4:
1905 case Button5: 1898 case Button5:
1906 { 1899 {
1907 int i; 1900 int i;
1908 page_dirn v; 1901 page_dirn v;
1909 1902
1910 v = (ev->button == Button4) ? UP : DN; 1903 v = (ev.button == Button4) ? UP : DN;
1911 if (ev->state & ShiftMask) 1904 if (ev.state & ShiftMask)
1912 i = 1; 1905 i = 1;
1913 else if ((Options & Opt_mouseWheelScrollPage)) 1906 else if ((Options & Opt_mouseWheelScrollPage))
1914 i = TermWin.nrow - 1; 1907 i = TermWin.nrow - 1;
1915 else 1908 else
1916 i = 5; 1909 i = 5;
1917# ifdef MOUSE_SLIP_WHEELING 1910# ifdef MOUSE_SLIP_WHEELING
1918 if (ev->state & ControlMask) 1911 if (ev.state & ControlMask)
1919 { 1912 {
1920 mouse_slip_wheel_speed += (v ? -1 : 1); 1913 mouse_slip_wheel_speed += (v ? -1 : 1);
1921 mouse_slip_wheel_delay = SCROLLBAR_CONTINUOUS_DELAY; 1914 mouse_slip_wheel_delay = SCROLLBAR_CONTINUOUS_DELAY;
1922 } 1915 }
1923# endif 1916# endif
1940 1933
1941 } 1934 }
1942 } 1935 }
1943 } 1936 }
1944#ifdef MENUBAR 1937#ifdef MENUBAR
1945 else if (isMenuBarWindow(ev->window)) 1938 else if (isMenuBarWindow(ev.window))
1946 menubar_control (ev); 1939 menubar_control (ev);
1947#endif 1940#endif
1948} 1941}
1949 1942
1950 1943
1967 pchanged = 0; 1960 pchanged = 0;
1968 1961
1969 if (!(Options & Opt_transparent)) 1962 if (!(Options & Opt_transparent))
1970 return pchanged; /* Don't try any more */ 1963 return pchanged; /* Don't try any more */
1971 1964
1972 XGetWindowAttributes(Xdisplay, Xroot, &wrootattr); 1965 XGetWindowAttributes(display->display, display->root, &wrootattr);
1973 rootdepth = wrootattr.depth; 1966 rootdepth = wrootattr.depth;
1974 1967
1975 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 1968 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
1976 if (rootdepth != wattr.depth) 1969 if (rootdepth != wattr.depth)
1977 { 1970 {
1978 if (am_transparent) 1971 if (am_transparent)
1979 { 1972 {
1980 pchanged = 1; 1973 pchanged = 1;
1981 XSetWindowBackground(Xdisplay, TermWin.vt, 1974 XSetWindowBackground(display->display, TermWin.vt,
1982 PixColors[Color_bg]); 1975 PixColors[Color_bg]);
1983 am_transparent = am_pixmap_trans = 0; 1976 am_transparent = am_pixmap_trans = 0;
1984 } 1977 }
1985 return pchanged; /* Don't try any more */ 1978 return pchanged; /* Don't try any more */
1986 } 1979 }
1987 1980
1988 /* Get all X ops out of the queue so that our information is up-to-date. */ 1981 /* Get all X ops out of the queue so that our information is up-to-date. */
1989 XSync(Xdisplay, False); 1982 XSync(display->display, False);
1990 1983
1991 /* 1984 /*
1992 * Make the frame window set by the window manager have 1985 * Make the frame window set by the window manager have
1993 * the root background. Some window managers put multiple nested frame 1986 * the root background. Some window managers put multiple nested frame
1994 * windows for each client, so we have to take care about that. 1987 * windows for each client, so we have to take care about that.
1995 */ 1988 */
1996 i = (xa[XA_XROOTPMAPID] != 0 1989 i = (xa[XA_XROOTPMAPID] != 0
1997 && (XGetWindowProperty(Xdisplay, Xroot, xa[XA_XROOTPMAPID], 1990 && (XGetWindowProperty(display->display, display->root, xa[XA_XROOTPMAPID],
1998 0L, 1L, False, XA_PIXMAP, &atype, &aformat, 1991 0L, 1L, False, XA_PIXMAP, &atype, &aformat,
1999 &nitems, &bytes_after, &prop) == Success)); 1992 &nitems, &bytes_after, &prop) == Success));
2000 if (!i || prop == NULL) 1993 if (!i || prop == NULL)
2001 have_pixmap = 0; 1994 have_pixmap = 0;
2002 else 1995 else
2006 XFree(prop); 1999 XFree(prop);
2007 } 2000 }
2008 if (have_pixmap) 2001 if (have_pixmap)
2009 { 2002 {
2010 /* 2003 /*
2011 * Copy Xroot pixmap transparency 2004 * Copy display->root pixmap transparency
2012 */ 2005 */
2013 int sx, sy, nx, ny; 2006 int sx, sy, nx, ny;
2014 unsigned int nw, nh; 2007 unsigned int nw, nh;
2015 Window cr; 2008 Window cr;
2016 XImage *image; 2009 XImage *image;
2017 GC gc; 2010 GC gc;
2018 XGCValues gcvalue; 2011 XGCValues gcvalue;
2019 2012
2020 XTranslateCoordinates(Xdisplay, TermWin.parent[0], Xroot, 2013 XTranslateCoordinates(display->display, TermWin.parent[0], display->root,
2021 0, 0, &sx, &sy, &cr); 2014 0, 0, &sx, &sy, &cr);
2022 nw = (unsigned int)szHint.width; 2015 nw = (unsigned int)szHint.width;
2023 nh = (unsigned int)szHint.height; 2016 nh = (unsigned int)szHint.height;
2024 nx = ny = 0; 2017 nx = ny = 0;
2025 if (sx < 0) 2018 if (sx < 0)
2035 sy = 0; 2028 sy = 0;
2036 } 2029 }
2037 MIN_IT(nw, (unsigned int)(wrootattr.width - sx)); 2030 MIN_IT(nw, (unsigned int)(wrootattr.width - sx));
2038 MIN_IT(nh, (unsigned int)(wrootattr.height - sy)); 2031 MIN_IT(nh, (unsigned int)(wrootattr.height - sy));
2039 allowedxerror = -1; 2032 allowedxerror = -1;
2040 image = XGetImage(Xdisplay, rootpixmap, sx, sy, nw, nh, AllPlanes, 2033 image = XGetImage(display->display, rootpixmap, sx, sy, nw, nh, AllPlanes,
2041 ZPixmap); 2034 ZPixmap);
2042 /* XXX: handle BadMatch - usually because we're outside the pixmap */ 2035 /* XXX: handle BadMatch - usually because we're outside the pixmap */
2043 /* XXX: may need a delay here? */ 2036 /* XXX: may need a delay here? */
2044 allowedxerror = 0; 2037 allowedxerror = 0;
2045 if (image == NULL) 2038 if (image == NULL)
2047 if (am_transparent && am_pixmap_trans) 2040 if (am_transparent && am_pixmap_trans)
2048 { 2041 {
2049 pchanged = 1; 2042 pchanged = 1;
2050 if (TermWin.pixmap != None) 2043 if (TermWin.pixmap != None)
2051 { 2044 {
2052 XFreePixmap(Xdisplay, TermWin.pixmap); 2045 XFreePixmap(display->display, TermWin.pixmap);
2053 TermWin.pixmap = None; 2046 TermWin.pixmap = None;
2054 } 2047 }
2055 } 2048 }
2056 am_pixmap_trans = 0; 2049 am_pixmap_trans = 0;
2057 } 2050 }
2058 else 2051 else
2059 { 2052 {
2060 if (TermWin.pixmap != None) 2053 if (TermWin.pixmap != None)
2061 XFreePixmap(Xdisplay, TermWin.pixmap); 2054 XFreePixmap(display->display, TermWin.pixmap);
2062 TermWin.pixmap = XCreatePixmap(Xdisplay, TermWin.vt, 2055 TermWin.pixmap = XCreatePixmap(display->display, TermWin.vt,
2063 (unsigned int)szHint.width, 2056 (unsigned int)szHint.width,
2064 (unsigned int)szHint.height, 2057 (unsigned int)szHint.height,
2065 (unsigned int)image->depth); 2058 (unsigned int)image->depth);
2066 gc = XCreateGC(Xdisplay, TermWin.vt, 0UL, &gcvalue); 2059 gc = XCreateGC(display->display, TermWin.vt, 0UL, &gcvalue);
2067 XPutImage(Xdisplay, TermWin.pixmap, gc, image, 0, 0, 2060 XPutImage(display->display, TermWin.pixmap, gc, image, 0, 0,
2068 nx, ny, (unsigned int)image->width, 2061 nx, ny, (unsigned int)image->width,
2069 (unsigned int)image->height); 2062 (unsigned int)image->height);
2070 XFreeGC(Xdisplay, gc); 2063 XFreeGC(display->display, gc);
2071 XDestroyImage(image); 2064 XDestroyImage(image);
2072 XSetWindowBackgroundPixmap(Xdisplay, TermWin.vt, 2065 XSetWindowBackgroundPixmap(display->display, TermWin.vt,
2073 TermWin.pixmap); 2066 TermWin.pixmap);
2074 if (!am_transparent || !am_pixmap_trans) 2067 if (!am_transparent || !am_pixmap_trans)
2075 pchanged = 1; 2068 pchanged = 1;
2076 am_transparent = am_pixmap_trans = 1; 2069 am_transparent = am_pixmap_trans = 1;
2077 } 2070 }
2080 { 2073 {
2081 unsigned int n; 2074 unsigned int n;
2082 /* 2075 /*
2083 * InheritPixmap transparency 2076 * InheritPixmap transparency
2084 */ 2077 */
2085 D_X((stderr, "InheritPixmap Seeking to %08lx", Xroot)); 2078 D_X((stderr, "InheritPixmap Seeking to %08lx", display->root));
2086 for (i = 1; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); 2079 for (i = 1; i < (int)(sizeof(TermWin.parent) / sizeof(Window));
2087 i++) 2080 i++)
2088 { 2081 {
2089 oldp = TermWin.parent[i]; 2082 oldp = TermWin.parent[i];
2090 XQueryTree(Xdisplay, TermWin.parent[i - 1], &root, 2083 XQueryTree(display->display, TermWin.parent[i - 1], &root,
2091 &TermWin.parent[i], &list, &n); 2084 &TermWin.parent[i], &list, &n);
2092 XFree(list); 2085 XFree(list);
2093 D_X((stderr, "InheritPixmap Parent[%d] = %08lx", i, TermWin.parent[i])); 2086 D_X((stderr, "InheritPixmap Parent[%d] = %08lx", i, TermWin.parent[i]));
2094 if (TermWin.parent[i] == Xroot) 2087 if (TermWin.parent[i] == display->root)
2095 { 2088 {
2096 if (oldp != None) 2089 if (oldp != None)
2097 pchanged = 1; 2090 pchanged = 1;
2098 break; 2091 break;
2099 } 2092 }
2103 n = 0; 2096 n = 0;
2104 if (pchanged) 2097 if (pchanged)
2105 { 2098 {
2106 for (; n < (unsigned int)i; n++) 2099 for (; n < (unsigned int)i; n++)
2107 { 2100 {
2108 XGetWindowAttributes(Xdisplay, TermWin.parent[n], &wattr); 2101 XGetWindowAttributes(display->display, TermWin.parent[n], &wattr);
2109 D_X((stderr, "InheritPixmap Checking Parent[%d]: %s", n, (wattr.depth == rootdepth && wattr.class != InputOnly) ? "OK" : "FAIL")); 2102 D_X((stderr, "InheritPixmap Checking Parent[%d]: %s", n, (wattr.depth == rootdepth && wattr.class != InputOnly) ? "OK" : "FAIL"));
2110 if (wattr.depth != rootdepth || wattr.c_class == InputOnly) 2103 if (wattr.depth != rootdepth || wattr.c_class == InputOnly)
2111 { 2104 {
2112 n = (int)(sizeof(TermWin.parent) / sizeof(Window)) + 1; 2105 n = (int)(sizeof(TermWin.parent) / sizeof(Window)) + 1;
2113 break; 2106 break;
2116 } 2109 }
2117 if (n > (int)(sizeof(TermWin.parent) 2110 if (n > (int)(sizeof(TermWin.parent)
2118 / sizeof(TermWin.parent[0]))) 2111 / sizeof(TermWin.parent[0])))
2119 { 2112 {
2120 D_X((stderr, "InheritPixmap Turning off")); 2113 D_X((stderr, "InheritPixmap Turning off"));
2121 XSetWindowBackground(Xdisplay, TermWin.parent[0], 2114 XSetWindowBackground(display->display, TermWin.parent[0],
2122 PixColors[Color_fg]); 2115 PixColors[Color_fg]);
2123 XSetWindowBackground(Xdisplay, TermWin.vt, 2116 XSetWindowBackground(display->display, TermWin.vt,
2124 PixColors[Color_bg]); 2117 PixColors[Color_bg]);
2125 am_transparent = 0; 2118 am_transparent = 0;
2126 /* XXX: also turn off Opt_transparent? */ 2119 /* XXX: also turn off Opt_transparent? */
2127 } 2120 }
2128 else 2121 else
2138# else 2131# else
2139 sleep(1); 2132 sleep(1);
2140# endif 2133# endif
2141 D_X((stderr, "InheritPixmap Turning on (%d parents)", i - 1)); 2134 D_X((stderr, "InheritPixmap Turning on (%d parents)", i - 1));
2142 for (n = 0; n < (unsigned int)i; n++) 2135 for (n = 0; n < (unsigned int)i; n++)
2143 XSetWindowBackgroundPixmap(Xdisplay, TermWin.parent[n], 2136 XSetWindowBackgroundPixmap(display->display, TermWin.parent[n],
2144 ParentRelative); 2137 ParentRelative);
2145 XSetWindowBackgroundPixmap(Xdisplay, TermWin.vt, 2138 XSetWindowBackgroundPixmap(display->display, TermWin.vt,
2146 ParentRelative); 2139 ParentRelative);
2147 am_transparent = 1; 2140 am_transparent = 1;
2148 } 2141 }
2149 for (; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); i++) 2142 for (; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); i++)
2150 TermWin.parent[i] = None; 2143 TermWin.parent[i] = None;
2842 { 2835 {
2843 /* 2836 /*
2844 * commands 2837 * commands
2845 */ 2838 */
2846 case 1: /* deiconify window */ 2839 case 1: /* deiconify window */
2847 XMapWindow(Xdisplay, TermWin.parent[0]); 2840 XMapWindow(display->display, TermWin.parent[0]);
2848 break; 2841 break;
2849 case 2: /* iconify window */ 2842 case 2: /* iconify window */
2850 XIconifyWindow(Xdisplay, TermWin.parent[0], 2843 XIconifyWindow(display->display, TermWin.parent[0],
2851 DefaultScreen(Xdisplay)); 2844 DefaultScreen(display->display));
2852 break; 2845 break;
2853 case 3: /* set position (pixels) */ 2846 case 3: /* set position (pixels) */
2854 XMoveWindow(Xdisplay, TermWin.parent[0], args[1], args[2]); 2847 XMoveWindow(display->display, TermWin.parent[0], args[1], args[2]);
2855 break; 2848 break;
2856 case 4: /* set size (pixels) */ 2849 case 4: /* set size (pixels) */
2857 set_widthheight ((unsigned int)args[2], (unsigned int)args[1]); 2850 set_widthheight ((unsigned int)args[2], (unsigned int)args[1]);
2858 break; 2851 break;
2859 case 5: /* raise window */ 2852 case 5: /* raise window */
2860 XRaiseWindow(Xdisplay, TermWin.parent[0]); 2853 XRaiseWindow(display->display, TermWin.parent[0]);
2861 break; 2854 break;
2862 case 6: /* lower window */ 2855 case 6: /* lower window */
2863 XLowerWindow(Xdisplay, TermWin.parent[0]); 2856 XLowerWindow(display->display, TermWin.parent[0]);
2864 break; 2857 break;
2865 case 7: /* refresh window */ 2858 case 7: /* refresh window */
2866 scr_touch (true); 2859 scr_touch (true);
2867 break; 2860 break;
2868 case 8: /* set size (chars) */ 2861 case 8: /* set size (chars) */
2876 break; 2869 break;
2877 /* 2870 /*
2878 * reports - some output format copied from XTerm 2871 * reports - some output format copied from XTerm
2879 */ 2872 */
2880 case 11: /* report window state */ 2873 case 11: /* report window state */
2881 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2874 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2882 tt_printf("\033[%dt", wattr.map_state == IsViewable ? 1 : 2); 2875 tt_printf("\033[%dt", wattr.map_state == IsViewable ? 1 : 2);
2883 break; 2876 break;
2884 case 13: /* report window position */ 2877 case 13: /* report window position */
2885 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2878 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2886 XTranslateCoordinates(Xdisplay, TermWin.parent[0], wattr.root, 2879 XTranslateCoordinates(display->display, TermWin.parent[0], wattr.root,
2887 -wattr.border_width, -wattr.border_width, 2880 -wattr.border_width, -wattr.border_width,
2888 &x, &y, &wdummy); 2881 &x, &y, &wdummy);
2889 tt_printf("\033[3;%d;%dt", x, y); 2882 tt_printf("\033[3;%d;%dt", x, y);
2890 break; 2883 break;
2891 case 14: /* report window size (pixels) */ 2884 case 14: /* report window size (pixels) */
2892 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2885 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2893 tt_printf("\033[4;%d;%dt", wattr.height, wattr.width); 2886 tt_printf("\033[4;%d;%dt", wattr.height, wattr.width);
2894 break; 2887 break;
2895 case 18: /* report window size (chars) */ 2888 case 18: /* report window size (chars) */
2896 tt_printf("\033[8;%d;%dt", TermWin.nrow, TermWin.ncol); 2889 tt_printf("\033[8;%d;%dt", TermWin.nrow, TermWin.ncol);
2897 break; 2890 break;
2898#if 0 /* XXX: currently disabled due to security concerns */ 2891#if 0 /* XXX: currently disabled due to security concerns */
2899 case 20: /* report icon label */ 2892 case 20: /* report icon label */
2900 XGetIconName(Xdisplay, TermWin.parent[0], &s); 2893 XGetIconName(display->display, TermWin.parent[0], &s);
2901 tt_printf("\033]L%-.200s\234", s ? s : ""); /* 8bit ST */ 2894 tt_printf("\033]L%-.200s\234", s ? s : ""); /* 8bit ST */
2902 break; 2895 break;
2903 case 21: /* report window title */ 2896 case 21: /* report window title */
2904 XFetchName(Xdisplay, TermWin.parent[0], &s); 2897 XFetchName(display->display, TermWin.parent[0], &s);
2905 tt_printf("\033]l%-.200s\234", s ? s : ""); /* 8bit ST */ 2898 tt_printf("\033]l%-.200s\234", s ? s : ""); /* 8bit ST */
2906 break; 2899 break;
2907#endif 2900#endif
2908 2901
2909 } 2902 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines