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.36 by pcg, Sun Feb 1 01:34:41 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;
929 { 876 {
930 refreshnow = true; 877 refreshnow = true;
931 flag = false; 878 flag = false;
932 ch = NOCHAR; 879 ch = NOCHAR;
933 break; 880 break;
881 }
882
883 // scr_add_lines only works for nlines < TermWin.nrow - 1.
884 if (nlines >= TermWin.nrow - 1)
885 {
886 scr_add_lines (buf, nlines, str - buf);
887 nlines = 0;
888 str = buf;
934 } 889 }
935 } 890 }
936 891
937 if (str >= buf + BUFSIZ) 892 if (str >= buf + BUFSIZ)
938 { 893 {
1034 989
1035#ifdef POINTER_BLANK 990#ifdef POINTER_BLANK
1036void 991void
1037rxvt_term::pointer_unblank () 992rxvt_term::pointer_unblank ()
1038{ 993{
1039 XDefineCursor (Xdisplay, TermWin.vt, TermWin_cursor); 994 XDefineCursor (display->display, TermWin.vt, TermWin_cursor);
1040 recolour_cursor (); 995 recolour_cursor ();
1041 996
1042 hidden_pointer = 0; 997 hidden_pointer = 0;
1043 998
1044 if (Options & Opt_pointerBlank) 999 if (Options & Opt_pointerBlank)
1049rxvt_term::pointer_blank () 1004rxvt_term::pointer_blank ()
1050{ 1005{
1051 if (!(Options & Opt_pointerBlank)) 1006 if (!(Options & Opt_pointerBlank))
1052 return; 1007 return;
1053 1008
1054 XDefineCursor (Xdisplay, TermWin.vt, blank_cursor); 1009 XDefineCursor (display->display, TermWin.vt, blank_cursor);
1055 XFlush (Xdisplay); 1010 XFlush (display->display);
1056 1011
1057 hidden_pointer = 1; 1012 hidden_pointer = 1;
1058} 1013}
1059 1014
1060void 1015void
1066 pointer_blank (); 1021 pointer_blank ();
1067} 1022}
1068#endif 1023#endif
1069 1024
1070void 1025void
1071rxvt_term::mouse_report (const XButtonEvent *ev) 1026rxvt_term::mouse_report (const XButtonEvent &ev)
1072{ 1027{
1073 int button_number, key_state = 0; 1028 int button_number, key_state = 0;
1074 int x, y; 1029 int x, y;
1075 1030
1076 x = ev->x; 1031 x = ev.x;
1077 y = ev->y; 1032 y = ev.y;
1078 pixel_position (&x, &y); 1033 pixel_position (&x, &y);
1079 1034
1080 if (MEvent.button == AnyButton) 1035 if (MEvent.button == AnyButton)
1081 { 1036 {
1082 button_number = 3; 1037 button_number = 3;
1141 1096
1142#ifdef USING_W11LIB 1097#ifdef USING_W11LIB
1143void 1098void
1144rxvt_W11_process_x_event(XEvent *ev) 1099rxvt_W11_process_x_event(XEvent *ev)
1145{ 1100{
1146 rxvt_t *r = rxvt_get_r(); 1101 rxvt_t *r = rxvt_get_r();
1147 1102
1148 process_x_event (ev); 1103 x_cb (*ev);
1149} 1104}
1150#endif 1105#endif
1151 1106
1152/*{{{ process an X event */ 1107/*{{{ process an X event */
1153void 1108void
1154rxvt_term::process_x_event (XEvent *ev) 1109rxvt_term::x_cb (XEvent &ev)
1155{ 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
1156 Window unused_root, unused_child; 1146 Window unused_root, unused_child;
1157 int unused_root_x, unused_root_y; 1147 int unused_root_x, unused_root_y;
1158 unsigned int unused_mask; 1148 unsigned int unused_mask;
1159 1149
1160#ifdef DEBUG_X 1150#ifdef DEBUG_X
1201#ifdef DEBUG_X 1191#ifdef DEBUG_X
1202 struct timeval tp; 1192 struct timeval tp;
1203 struct tm *ltt; 1193 struct tm *ltt;
1204 (void)gettimeofday(&tp, NULL); 1194 (void)gettimeofday(&tp, NULL);
1205 ltt = localtime(&(tp.tv_sec)); 1195 ltt = localtime(&(tp.tv_sec));
1206 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));
1207#endif 1197#endif
1208 1198
1209 switch (ev->type) 1199 switch (ev.type)
1210 { 1200 {
1211 case KeyPress: 1201 case KeyPress:
1212 lookup_key ((XKeyEvent *)ev); 1202 lookup_key (ev.xkey);
1213 break; 1203 break;
1214 1204
1215#if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING) 1205#if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING)
1216 case KeyRelease: 1206 case KeyRelease:
1217 { 1207 {
1218 if (!(ev->xkey.state & ControlMask)) 1208 if (!(ev.xkey.state & ControlMask))
1219 mouse_slip_wheel_speed = 0; 1209 mouse_slip_wheel_speed = 0;
1220 else 1210 else
1221 { 1211 {
1222 KeySym ks; 1212 KeySym ks;
1223 1213
1224 ks = XKeycodeToKeysym(Xdisplay, ev->xkey.keycode, 0); 1214 ks = XKeycodeToKeysym(display->display, ev.xkey.keycode, 0);
1225 if (ks == XK_Control_L || ks == XK_Control_R) 1215 if (ks == XK_Control_L || ks == XK_Control_R)
1226 mouse_slip_wheel_speed = 0; 1216 mouse_slip_wheel_speed = 0;
1227 } 1217 }
1228 break; 1218 break;
1229 } 1219 }
1230#endif 1220#endif
1231 1221
1232 case ButtonPress: 1222 case ButtonPress:
1233 button_press ((XButtonEvent *)ev); 1223 button_press (ev.xbutton);
1234 break; 1224 break;
1235 1225
1236 case ButtonRelease: 1226 case ButtonRelease:
1237 button_release ((XButtonEvent *)ev); 1227 button_release (ev.xbutton);
1238 break; 1228 break;
1239 1229
1240 case ClientMessage: 1230 case ClientMessage:
1241 if (ev->xclient.format == 32 1231 if (ev.xclient.format == 32
1242 && (Atom)ev->xclient.data.l[0] == xa[XA_WMDELETEWINDOW]) 1232 && (Atom)ev.xclient.data.l[0] == xa[XA_WMDELETEWINDOW])
1243 destroy (); 1233 destroy ();
1244#ifdef OFFIX_DND 1234#ifdef OFFIX_DND
1245 /* OffiX Dnd (drag 'n' drop) protocol */ 1235 /* OffiX Dnd (drag 'n' drop) protocol */
1246 else if (ev->xclient.message_type == xa[XA_DNDPROTOCOL] 1236 else if (ev.xclient.message_type == xa[XA_DNDPROTOCOL]
1247 && (ev->xclient.data.l[0] == DndFile 1237 && (ev.xclient.data.l[0] == DndFile
1248 || ev->xclient.data.l[0] == DndDir 1238 || ev.xclient.data.l[0] == DndDir
1249 || ev->xclient.data.l[0] == DndLink)) 1239 || ev.xclient.data.l[0] == DndLink))
1250 { 1240 {
1251 /* Get Dnd data */ 1241 /* Get Dnd data */
1252 Atom ActualType; 1242 Atom ActualType;
1253 int ActualFormat; 1243 int ActualFormat;
1254 unsigned char *data; 1244 unsigned char *data;
1255 unsigned long Size, RemainingBytes; 1245 unsigned long Size, RemainingBytes;
1256 1246
1257 XGetWindowProperty(Xdisplay, Xroot, 1247 XGetWindowProperty(display->display, display->root,
1258 xa[XA_DNDSELECTION], 1248 xa[XA_DNDSELECTION],
1259 0L, 1000000L, 1249 0L, 1000000L,
1260 False, AnyPropertyType, 1250 False, AnyPropertyType,
1261 &ActualType, &ActualFormat, 1251 &ActualType, &ActualFormat,
1262 &Size, &RemainingBytes, 1252 &Size, &RemainingBytes,
1263 &data); 1253 &data);
1264 XChangeProperty(Xdisplay, Xroot, 1254 XChangeProperty(display->display, display->root,
1265 XA_CUT_BUFFER0, XA_STRING, 1255 XA_CUT_BUFFER0, XA_STRING,
1266 8, PropModeReplace, 1256 8, PropModeReplace,
1267 data, STRLEN(data)); 1257 data, STRLEN(data));
1268 selection_paste (Xroot, XA_CUT_BUFFER0, True); 1258 selection_paste (display->root, XA_CUT_BUFFER0, True);
1269 XSetInputFocus(Xdisplay, Xroot, RevertToNone, CurrentTime); 1259 XSetInputFocus(display->display, display->root, RevertToNone, CurrentTime);
1270 } 1260 }
1271#endif /* OFFIX_DND */ 1261#endif /* OFFIX_DND */
1272 break; 1262 break;
1273 1263
1274 case MappingNotify: 1264 case MappingNotify:
1275 XRefreshKeyboardMapping(&(ev->xmapping)); 1265 XRefreshKeyboardMapping(&(ev.xmapping));
1276 break; 1266 break;
1277 1267
1278 /* 1268 /*
1279 * XXX: this is not the _current_ arrangement 1269 * XXX: this is not the _current_ arrangement
1280 * Here's my conclusion: 1270 * Here's my conclusion:
1284 * in the GraphicsExpose parts, which means that after each refresh, 1274 * in the GraphicsExpose parts, which means that after each refresh,
1285 * we need to wait for the graphics expose or Noexpose events, 1275 * we need to wait for the graphics expose or Noexpose events,
1286 * which ought to make things real slow! 1276 * which ought to make things real slow!
1287 */ 1277 */
1288 case VisibilityNotify: 1278 case VisibilityNotify:
1289 switch (ev->xvisibility.state) 1279 switch (ev.xvisibility.state)
1290 { 1280 {
1291 case VisibilityUnobscured: 1281 case VisibilityUnobscured:
1292 refresh_type = FAST_REFRESH; 1282 refresh_type = FAST_REFRESH;
1293 break; 1283 break;
1294 case VisibilityPartiallyObscured: 1284 case VisibilityPartiallyObscured:
1334 1324
1335 } 1325 }
1336 break; 1326 break;
1337 1327
1338 case ConfigureNotify: 1328 case ConfigureNotify:
1339 if (ev->xconfigure.window == TermWin.parent[0]) 1329 if (ev.xconfigure.window == TermWin.parent[0])
1340 { 1330 {
1341 int height, width; 1331 int height, width;
1342 1332
1343 do 1333 do
1344 { /* Wrap lots of configures into one */ 1334 { /* Wrap lots of configures into one */
1345 width = ev->xconfigure.width; 1335 width = ev.xconfigure.width;
1346 height = ev->xconfigure.height; 1336 height = ev.xconfigure.height;
1347 D_SIZE((stderr, "Size: ConfigureNotify: %4d x %4d", width, height)); 1337 D_SIZE((stderr, "Size: ConfigureNotify: %4d x %4d", width, height));
1348 } 1338 }
1349 while (XCheckTypedWindowEvent(Xdisplay, ev->xconfigure.window, 1339 while (XCheckTypedWindowEvent(display->display, ev.xconfigure.window, ConfigureNotify, &ev));
1350 ConfigureNotify, ev)); 1340
1351 if (szHint.width != width || szHint.height != height) 1341 if (szHint.width != width || szHint.height != height)
1352 { 1342 {
1353 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));
1354 resize_all_windows (width, height, 1); 1344 resize_all_windows (width, height, 1);
1355 } 1345 }
1375 selection_clear (); 1365 selection_clear ();
1376 break; 1366 break;
1377 1367
1378 case SelectionNotify: 1368 case SelectionNotify:
1379 if (selection_wait == Sel_normal) 1369 if (selection_wait == Sel_normal)
1380 selection_paste (ev->xselection.requestor, 1370 selection_paste (ev.xselection.requestor,
1381 ev->xselection.property, True); 1371 ev.xselection.property, True);
1382 break; 1372 break;
1383 1373
1384 case SelectionRequest: 1374 case SelectionRequest:
1385 selection_send (&(ev->xselectionrequest)); 1375 selection_send (ev.xselectionrequest);
1386 break; 1376 break;
1387 1377
1388 case UnmapNotify: 1378 case UnmapNotify:
1389 TermWin.mapped = 0; 1379 TermWin.mapped = 0;
1390#ifdef TEXT_BLINK 1380#ifdef TEXT_BLINK
1398 text_blink_ev.start (NOW + TEXT_BLINK_INTERVAL); 1388 text_blink_ev.start (NOW + TEXT_BLINK_INTERVAL);
1399#endif 1389#endif
1400 break; 1390 break;
1401 1391
1402 case PropertyNotify: 1392 case PropertyNotify:
1403 if (ev->xproperty.atom == xa[XA_VT_SELECTION]) 1393 if (ev.xproperty.atom == xa[XA_VT_SELECTION])
1404 {
1405 if (ev->xproperty.state == PropertyNewValue) 1394 if (ev.xproperty.state == PropertyNewValue)
1406 selection_property (ev->xproperty.window, 1395 selection_property (ev.xproperty.window, ev.xproperty.atom);
1407 ev->xproperty.atom);
1408 break; 1396 break;
1409 } 1397
1410#ifdef TRANSPARENT 1398#ifdef TRANSPARENT
1411 /*
1412 * if user used some Esetroot compatible prog to set the root bg,
1413 * use the property to determine the pixmap. We use it later on.
1414 */
1415 if (xa[XA_XROOTPMAPID] == 0)
1416 xa[XA_XROOTPMAPID] = XInternAtom(Xdisplay,
1417 "_XROOTPMAP_ID", False);
1418 if (ev->xproperty.atom != xa[XA_XROOTPMAPID])
1419 break;
1420 /* FALLTHROUGH */
1421 case ReparentNotify: 1399 case ReparentNotify:
1422 if ((Options & Opt_transparent) && check_our_parents ()) 1400 rootwin_cb (ev);
1423 { 1401 break;
1424 if (am_transparent)
1425 want_full_refresh = 1;
1426 }
1427#endif /* TRANSPARENT */ 1402#endif /* TRANSPARENT */
1428 break;
1429 1403
1430 case GraphicsExpose: 1404 case GraphicsExpose:
1431 case Expose: 1405 case Expose:
1432 if (ev->xany.window == TermWin.vt) 1406 if (ev.xany.window == TermWin.vt)
1433 { 1407 {
1434#ifdef NO_SLOW_LINK_SUPPORT 1408#ifdef NO_SLOW_LINK_SUPPORT
1435 scr_expose (ev->xexpose.x, ev->xexpose.y, 1409 scr_expose (ev.xexpose.x, ev.xexpose.y,
1436 ev->xexpose.width, ev->xexpose.height, False); 1410 ev.xexpose.width, ev.xexpose.height, False);
1437#else 1411#else
1438 // don't understand this, so commented it out 1412 // don't understand this, so commented it out
1439 scr_expose (ev->xexpose.x, ev->xexpose.y, 1413 scr_expose (ev.xexpose.x, ev.xexpose.y,
1440 ev->xexpose.width, ev->xexpose.height, False); 1414 ev.xexpose.width, ev.xexpose.height, False);
1441 //scr_expose (ev->xexpose.x, 0, 1415 //scr_expose (ev.xexpose.x, 0,
1442 // ev->xexpose.width, TermWin.height, False); 1416 // ev.xexpose.width, TermWin.height, False);
1443#endif 1417#endif
1444 want_refresh = 1; 1418 want_refresh = 1;
1445 } 1419 }
1446 else 1420 else
1447 { 1421 {
1448 XEvent unused_xevent; 1422 XEvent unused_event;
1449 1423
1450 while (XCheckTypedWindowEvent(Xdisplay, ev->xany.window, 1424 while (XCheckTypedWindowEvent(display->display, ev.xany.window,
1451 Expose, 1425 Expose,
1452 &unused_xevent)) ; 1426 &unused_event)) ;
1453 while (XCheckTypedWindowEvent(Xdisplay, ev->xany.window, 1427 while (XCheckTypedWindowEvent(display->display, ev.xany.window,
1454 GraphicsExpose, 1428 GraphicsExpose,
1455 &unused_xevent)) ; 1429 &unused_event)) ;
1456 if (isScrollbarWindow(ev->xany.window)) 1430 if (isScrollbarWindow(ev.xany.window))
1457 { 1431 {
1458 scrollBar.setIdle(); 1432 scrollBar.setIdle();
1459 scrollbar_show (0); 1433 scrollbar_show (0);
1460 } 1434 }
1461#ifdef MENUBAR 1435#ifdef MENUBAR
1462 if (menubar_visible () && isMenuBarWindow(ev->xany.window)) 1436 if (menubar_visible () && isMenuBarWindow(ev.xany.window))
1463 menubar_expose (); 1437 menubar_expose ();
1464#endif 1438#endif
1465#ifdef RXVT_GRAPHICS 1439#ifdef RXVT_GRAPHICS
1466 Gr_expose (ev->xany.window); 1440 Gr_expose (ev.xany.window);
1467#endif 1441#endif
1468 1442
1469 } 1443 }
1470 break; 1444 break;
1471 1445
1473#ifdef POINTER_BLANK 1447#ifdef POINTER_BLANK
1474 if (hidden_pointer) 1448 if (hidden_pointer)
1475 pointer_unblank (); 1449 pointer_unblank ();
1476#endif 1450#endif
1477#if MENUBAR 1451#if MENUBAR
1478 if (isMenuBarWindow(ev->xany.window)) 1452 if (isMenuBarWindow(ev.xany.window))
1479 { 1453 {
1480 menubar_control (&(ev->xbutton)); 1454 menubar_control (&(ev.xbutton));
1481 break; 1455 break;
1482 } 1456 }
1483#endif 1457#endif
1484 if ((PrivateModes & PrivMode_mouse_report) && !(bypass_keystate)) 1458 if ((PrivateModes & PrivMode_mouse_report) && !(bypass_keystate))
1485 break; 1459 break;
1486 1460
1487 if (ev->xany.window == TermWin.vt) 1461 if (ev.xany.window == TermWin.vt)
1488 { 1462 {
1489 if ((ev->xbutton.state & (Button1Mask | Button3Mask))) 1463 if ((ev.xbutton.state & (Button1Mask | Button3Mask)))
1490 { 1464 {
1491 while (XCheckTypedWindowEvent(Xdisplay, TermWin.vt, 1465 while (XCheckTypedWindowEvent (display->display, TermWin.vt, MotionNotify, &ev))
1492 MotionNotify, ev)) ; 1466 ;
1467
1493 XQueryPointer(Xdisplay, TermWin.vt, 1468 XQueryPointer(display->display, TermWin.vt,
1494 &unused_root, &unused_child, 1469 &unused_root, &unused_child,
1495 &unused_root_x, &unused_root_y, 1470 &unused_root_x, &unused_root_y,
1496 &(ev->xbutton.x), &(ev->xbutton.y), 1471 &(ev.xbutton.x), &(ev.xbutton.y),
1497 &unused_mask); 1472 &unused_mask);
1498#ifdef MOUSE_THRESHOLD 1473#ifdef MOUSE_THRESHOLD
1499 /* deal with a `jumpy' mouse */ 1474 /* deal with a `jumpy' mouse */
1500 if ((ev->xmotion.time - MEvent.time) > MOUSE_THRESHOLD) 1475 if ((ev.xmotion.time - MEvent.time) > MOUSE_THRESHOLD)
1501 { 1476 {
1502#endif 1477#endif
1503 selection_extend ((ev->xbutton.x), (ev->xbutton.y), 1478 selection_extend ((ev.xbutton.x), (ev.xbutton.y),
1504 (ev->xbutton.state & Button3Mask) ? 2 : 0); 1479 (ev.xbutton.state & Button3Mask) ? 2 : 0);
1505#ifdef SELECTION_SCROLLING 1480#ifdef SELECTION_SCROLLING
1506 if (ev->xbutton.y < TermWin.int_bwidth 1481 if (ev.xbutton.y < TermWin.int_bwidth
1507 || Pixel2Row(ev->xbutton.y) > (TermWin.nrow-1)) 1482 || Pixel2Row(ev.xbutton.y) > (TermWin.nrow-1))
1508 { 1483 {
1509 int dist; 1484 int dist;
1510 1485
1511 pending_scroll_selection=1; 1486 pending_scroll_selection=1;
1512 1487
1517 scroll_selection_delay=SCROLLBAR_CONTINUOUS_DELAY; 1492 scroll_selection_delay=SCROLLBAR_CONTINUOUS_DELAY;
1518 1493
1519 /* save the event params so we can highlight 1494 /* save the event params so we can highlight
1520 * the selection in the pending-scroll loop 1495 * the selection in the pending-scroll loop
1521 */ 1496 */
1522 selection_save_x=ev->xbutton.x; 1497 selection_save_x=ev.xbutton.x;
1523 selection_save_y=ev->xbutton.y; 1498 selection_save_y=ev.xbutton.y;
1524 selection_save_state= 1499 selection_save_state=
1525 (ev->xbutton.state & Button3Mask) ? 2 : 0; 1500 (ev.xbutton.state & Button3Mask) ? 2 : 0;
1526 1501
1527 /* calc number of lines to scroll */ 1502 /* calc number of lines to scroll */
1528 if (ev->xbutton.y<TermWin.int_bwidth) 1503 if (ev.xbutton.y<TermWin.int_bwidth)
1529 { 1504 {
1530 scroll_selection_dir = UP; 1505 scroll_selection_dir = UP;
1531 dist = TermWin.int_bwidth - ev->xbutton.y; 1506 dist = TermWin.int_bwidth - ev.xbutton.y;
1532 } 1507 }
1533 else 1508 else
1534 { 1509 {
1535 scroll_selection_dir = DN; 1510 scroll_selection_dir = DN;
1536 dist = ev->xbutton.y - 1511 dist = ev.xbutton.y -
1537 (TermWin.int_bwidth + TermWin.height); 1512 (TermWin.int_bwidth + TermWin.height);
1538 } 1513 }
1539 scroll_selection_lines=(Pixel2Height(dist)/ 1514 scroll_selection_lines=(Pixel2Height(dist)/
1540 SELECTION_SCROLL_LINE_SPEEDUP)+1; 1515 SELECTION_SCROLL_LINE_SPEEDUP)+1;
1541 MIN_IT(scroll_selection_lines, 1516 MIN_IT(scroll_selection_lines,
1554 } 1529 }
1555#endif 1530#endif
1556 1531
1557 } 1532 }
1558 } 1533 }
1559 else if (isScrollbarWindow(ev->xany.window) && scrollbar_isMotion()) 1534 else if (isScrollbarWindow(ev.xany.window) && scrollbar_isMotion())
1560 { 1535 {
1561 while (XCheckTypedWindowEvent(Xdisplay, scrollBar.win, 1536 while (XCheckTypedWindowEvent(display->display, scrollBar.win,
1562 MotionNotify, ev)) ; 1537 MotionNotify, &ev)) ;
1563 XQueryPointer(Xdisplay, scrollBar.win, 1538 XQueryPointer(display->display, scrollBar.win,
1564 &unused_root, &unused_child, 1539 &unused_root, &unused_child,
1565 &unused_root_x, &unused_root_y, 1540 &unused_root_x, &unused_root_y,
1566 &(ev->xbutton.x), &(ev->xbutton.y), 1541 &(ev.xbutton.x), &(ev.xbutton.y),
1567 &unused_mask); 1542 &unused_mask);
1568 scr_move_to (scrollbar_position(ev->xbutton.y) - csrO, 1543 scr_move_to (scrollbar_position(ev.xbutton.y) - csrO,
1569 scrollbar_size()); 1544 scrollbar_size());
1570 scr_refresh (refresh_type); 1545 scr_refresh (refresh_type);
1571 refresh_limit = 0; 1546 refresh_limit = 0;
1572 scrollbar_show (1); 1547 scrollbar_show (1);
1573 } 1548 }
1574 break; 1549 break;
1575 } 1550 }
1576} 1551}
1577 1552
1578void 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
1579rxvt_term::button_press (XButtonEvent *ev) 1580rxvt_term::button_press (const XButtonEvent &ev)
1580{ 1581{
1581 int reportmode = 0, clickintime; 1582 int reportmode = 0, clickintime;
1582 1583
1583 bypass_keystate = ev->state & (ModMetaMask | ShiftMask); 1584 bypass_keystate = ev.state & (ModMetaMask | ShiftMask);
1584 if (!bypass_keystate) 1585 if (!bypass_keystate)
1585 reportmode = !!(PrivateModes & PrivMode_mouse_report); 1586 reportmode = !!(PrivateModes & PrivMode_mouse_report);
1586 /* 1587 /*
1587 * VT window processing of button press 1588 * VT window processing of button press
1588 */ 1589 */
1589 if (ev->window == TermWin.vt) 1590 if (ev.window == TermWin.vt)
1590 { 1591 {
1591#if RXVT_GRAPHICS 1592#if RXVT_GRAPHICS
1592 if (ev->subwindow != None) 1593 if (ev.subwindow != None)
1593 rxvt_Gr_ButtonPress (ev->x, ev->y); 1594 rxvt_Gr_ButtonPress (ev.x, ev.y);
1594 else 1595 else
1595#endif 1596#endif
1596 1597
1597 { 1598 {
1598 clickintime = ev->time - MEvent.time < MULTICLICK_TIME; 1599 clickintime = ev.time - MEvent.time < MULTICLICK_TIME;
1599 if (reportmode) 1600 if (reportmode)
1600 { 1601 {
1601 /* mouse report from vt window */ 1602 /* mouse report from vt window */
1602 /* save the xbutton state (for ButtonRelease) */ 1603 /* save the xbutton state (for ButtonRelease) */
1603 MEvent.state = ev->state; 1604 MEvent.state = ev.state;
1604#ifdef MOUSE_REPORT_DOUBLECLICK 1605#ifdef MOUSE_REPORT_DOUBLECLICK
1605 if (ev->button == MEvent.button && clickintime) 1606 if (ev.button == MEvent.button && clickintime)
1606 { 1607 {
1607 /* same button, within alloted time */ 1608 /* same button, within alloted time */
1608 MEvent.clicks++; 1609 MEvent.clicks++;
1609 if (MEvent.clicks > 1) 1610 if (MEvent.clicks > 1)
1610 { 1611 {
1619 } 1620 }
1620 else 1621 else
1621 { 1622 {
1622 /* different button, or time expired */ 1623 /* different button, or time expired */
1623 MEvent.clicks = 1; 1624 MEvent.clicks = 1;
1624 MEvent.button = ev->button; 1625 MEvent.button = ev.button;
1625 mouse_report (ev); 1626 mouse_report (ev);
1626 } 1627 }
1627#else 1628#else
1628 MEvent.button = ev->button; 1629 MEvent.button = ev.button;
1629 mouse_report (ev); 1630 mouse_report (ev);
1630#endif /* MOUSE_REPORT_DOUBLECLICK */ 1631#endif /* MOUSE_REPORT_DOUBLECLICK */
1631 1632
1632 } 1633 }
1633 else 1634 else
1634 { 1635 {
1635 if (ev->button != MEvent.button) 1636 if (ev.button != MEvent.button)
1636 MEvent.clicks = 0; 1637 MEvent.clicks = 0;
1637 switch (ev->button) 1638 switch (ev.button)
1638 { 1639 {
1639 case Button1: 1640 case Button1:
1640 /* allow shift+left click to extend selection */ 1641 /* allow shift+left click to extend selection */
1641 if (ev->state & ShiftMask && !(PrivateModes & PrivMode_mouse_report)) 1642 if (ev.state & ShiftMask && !(PrivateModes & PrivMode_mouse_report))
1642 { 1643 {
1643 if (MEvent.button == Button1 && clickintime) 1644 if (MEvent.button == Button1 && clickintime)
1644 selection_rotate (ev->x, ev->y); 1645 selection_rotate (ev.x, ev.y);
1645 else 1646 else
1646 selection_extend (ev->x, ev->y, 1); 1647 selection_extend (ev.x, ev.y, 1);
1647 } 1648 }
1648 else 1649 else
1649 { 1650 {
1650 if (MEvent.button == Button1 && clickintime) 1651 if (MEvent.button == Button1 && clickintime)
1651 MEvent.clicks++; 1652 MEvent.clicks++;
1652 else 1653 else
1653 MEvent.clicks = 1; 1654 MEvent.clicks = 1;
1654 1655
1655 selection_click (MEvent.clicks, ev->x, ev->y); 1656 selection_click (MEvent.clicks, ev.x, ev.y);
1656 } 1657 }
1657 1658
1658 MEvent.button = Button1; 1659 MEvent.button = Button1;
1659 break; 1660 break;
1660 1661
1661 case Button3: 1662 case Button3:
1662 if (MEvent.button == Button3 && clickintime) 1663 if (MEvent.button == Button3 && clickintime)
1663 selection_rotate (ev->x, ev->y); 1664 selection_rotate (ev.x, ev.y);
1664 else 1665 else
1665 selection_extend (ev->x, ev->y, 1); 1666 selection_extend (ev.x, ev.y, 1);
1666 MEvent.button = Button3; 1667 MEvent.button = Button3;
1667 break; 1668 break;
1668 } 1669 }
1669 } 1670 }
1670 MEvent.time = ev->time; 1671 MEvent.time = ev.time;
1671 return; 1672 return;
1672 } 1673 }
1673 } 1674 }
1674 1675
1675 /* 1676 /*
1676 * Scrollbar window processing of button press 1677 * Scrollbar window processing of button press
1677 */ 1678 */
1678 if (isScrollbarWindow(ev->window)) 1679 if (isScrollbarWindow(ev.window))
1679 { 1680 {
1680 scrollBar.setIdle (); 1681 scrollBar.setIdle ();
1681 /* 1682 /*
1682 * Rxvt-style scrollbar: 1683 * Rxvt-style scrollbar:
1683 * move up if mouse is above slider 1684 * move up if mouse is above slider
1695 * Mouse report disabled scrollbar: 1696 * Mouse report disabled scrollbar:
1696 * arrow buttons - send up/down 1697 * arrow buttons - send up/down
1697 * click on scrollbar - send pageup/down 1698 * click on scrollbar - send pageup/down
1698 */ 1699 */
1699 if ((scrollBar.style == R_SB_NEXT 1700 if ((scrollBar.style == R_SB_NEXT
1700 && scrollbarnext_upButton(ev->y)) 1701 && scrollbarnext_upButton(ev.y))
1701 || (scrollBar.style == R_SB_RXVT 1702 || (scrollBar.style == R_SB_RXVT
1702 && scrollbarrxvt_upButton(ev->y))) 1703 && scrollbarrxvt_upButton(ev.y)))
1703 tt_printf("\033[A"); 1704 tt_printf("\033[A");
1704 else if ((scrollBar.style == R_SB_NEXT 1705 else if ((scrollBar.style == R_SB_NEXT
1705 && scrollbarnext_dnButton(ev->y)) 1706 && scrollbarnext_dnButton(ev.y))
1706 || (scrollBar.style == R_SB_RXVT 1707 || (scrollBar.style == R_SB_RXVT
1707 && scrollbarrxvt_dnButton(ev->y))) 1708 && scrollbarrxvt_dnButton(ev.y)))
1708 tt_printf("\033[B"); 1709 tt_printf("\033[B");
1709 else 1710 else
1710 switch (ev->button) 1711 switch (ev.button)
1711 { 1712 {
1712 case Button2: 1713 case Button2:
1713 tt_printf("\014"); 1714 tt_printf("\014");
1714 break; 1715 break;
1715 case Button1: 1716 case Button1:
1726 { 1727 {
1727 char upordown = 0; 1728 char upordown = 0;
1728 1729
1729 if (scrollBar.style == R_SB_NEXT) 1730 if (scrollBar.style == R_SB_NEXT)
1730 { 1731 {
1731 if (scrollbarnext_upButton(ev->y)) 1732 if (scrollbarnext_upButton(ev.y))
1732 upordown = -1; /* up */ 1733 upordown = -1; /* up */
1733 else if (scrollbarnext_dnButton(ev->y)) 1734 else if (scrollbarnext_dnButton(ev.y))
1734 upordown = 1; /* down */ 1735 upordown = 1; /* down */
1735 } 1736 }
1736 else if (scrollBar.style == R_SB_RXVT) 1737 else if (scrollBar.style == R_SB_RXVT)
1737 { 1738 {
1738 if (scrollbarrxvt_upButton(ev->y)) 1739 if (scrollbarrxvt_upButton(ev.y))
1739 upordown = -1; /* up */ 1740 upordown = -1; /* up */
1740 else if (scrollbarrxvt_dnButton(ev->y)) 1741 else if (scrollbarrxvt_dnButton(ev.y))
1741 upordown = 1; /* down */ 1742 upordown = 1; /* down */
1742 } 1743 }
1743 if (upordown) 1744 if (upordown)
1744 { 1745 {
1745#ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING 1746#ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING
1752 else 1753 else
1753 scrollBar.setDn (); 1754 scrollBar.setDn ();
1754 } 1755 }
1755 } 1756 }
1756 else 1757 else
1757 switch (ev->button) 1758 switch (ev.button)
1758 { 1759 {
1759 case Button2: 1760 case Button2:
1760 switch (scrollbar_align) 1761 switch (scrollbar_align)
1761 { 1762 {
1762 case R_SB_ALIGN_TOP: 1763 case R_SB_ALIGN_TOP:
1768 case R_SB_ALIGN_BOTTOM: 1769 case R_SB_ALIGN_BOTTOM:
1769 csrO = scrollBar.bot - scrollBar.top; 1770 csrO = scrollBar.bot - scrollBar.top;
1770 break; 1771 break;
1771 } 1772 }
1772 if (scrollBar.style == R_SB_XTERM 1773 if (scrollBar.style == R_SB_XTERM
1773 || scrollbar_above_slider(ev->y) 1774 || scrollbar_above_slider(ev.y)
1774 || scrollbar_below_slider(ev->y)) 1775 || scrollbar_below_slider(ev.y))
1775 scr_move_to ( scrollbar_position(ev->y) - csrO, 1776 scr_move_to ( scrollbar_position(ev.y) - csrO,
1776 scrollbar_size()); 1777 scrollbar_size());
1777 scrollBar.setMotion (); 1778 scrollBar.setMotion ();
1778 break; 1779 break;
1779 1780
1780 case Button1: 1781 case Button1:
1781 if (scrollbar_align == R_SB_ALIGN_CENTRE) 1782 if (scrollbar_align == R_SB_ALIGN_CENTRE)
1782 csrO = ev->y - scrollBar.top; 1783 csrO = ev.y - scrollBar.top;
1783 /* FALLTHROUGH */ 1784 /* FALLTHROUGH */
1784 1785
1785 case Button3: 1786 case Button3:
1786 if (scrollBar.style != R_SB_XTERM) 1787 if (scrollBar.style != R_SB_XTERM)
1787 { 1788 {
1788 if (scrollbar_above_slider(ev->y)) 1789 if (scrollbar_above_slider(ev.y))
1789# ifdef RXVT_SCROLL_FULL 1790# ifdef RXVT_SCROLL_FULL
1790 scr_page (UP, TermWin.nrow - 1); 1791 scr_page (UP, TermWin.nrow - 1);
1791# else 1792# else
1792 scr_page (UP, TermWin.nrow / 4); 1793 scr_page (UP, TermWin.nrow / 4);
1793# endif 1794# endif
1794 else if (scrollbar_below_slider(ev->y)) 1795 else if (scrollbar_below_slider(ev.y))
1795# ifdef RXVT_SCROLL_FULL 1796# ifdef RXVT_SCROLL_FULL
1796 scr_page (DN, TermWin.nrow - 1); 1797 scr_page (DN, TermWin.nrow - 1);
1797# else 1798# else
1798 scr_page (DN, TermWin.nrow / 4); 1799 scr_page (DN, TermWin.nrow / 4);
1799# endif 1800# endif
1800 else 1801 else
1801 scrollBar.setMotion (); 1802 scrollBar.setMotion ();
1802 } 1803 }
1803 else 1804 else
1804 { 1805 {
1805 scr_page ((ev->button == Button1 ? DN : UP), 1806 scr_page ((ev.button == Button1 ? DN : UP),
1806 (TermWin.nrow 1807 (TermWin.nrow
1807 * scrollbar_position(ev->y) 1808 * scrollbar_position(ev.y)
1808 / scrollbar_size())); 1809 / scrollbar_size()));
1809 } 1810 }
1810 break; 1811 break;
1811 } 1812 }
1812 } 1813 }
1814 } 1815 }
1815#if MENUBAR 1816#if MENUBAR
1816 /* 1817 /*
1817 * Menubar window processing of button press 1818 * Menubar window processing of button press
1818 */ 1819 */
1819 if (isMenuBarWindow(ev->window)) 1820 if (isMenuBarWindow(ev.window))
1820 menubar_control (ev); 1821 menubar_control (ev);
1821#endif 1822#endif
1822} 1823}
1823 1824
1824void 1825void
1825rxvt_term::button_release (XButtonEvent *ev) 1826rxvt_term::button_release (const XButtonEvent &ev)
1826{ 1827{
1827 int reportmode = 0; 1828 int reportmode = 0;
1828 1829
1829 csrO = 0; /* reset csr Offset */ 1830 csrO = 0; /* reset csr Offset */
1830 if (!bypass_keystate) 1831 if (!bypass_keystate)
1831 reportmode = !!(PrivateModes & PrivMode_mouse_report); 1832 reportmode = !!(PrivateModes & PrivMode_mouse_report);
1832 1833
1840 1841
1841 } 1842 }
1842#ifdef SELECTION_SCROLLING 1843#ifdef SELECTION_SCROLLING
1843 pending_scroll_selection=0; 1844 pending_scroll_selection=0;
1844#endif 1845#endif
1845 if (ev->window == TermWin.vt) 1846 if (ev.window == TermWin.vt)
1846 { 1847 {
1847#ifdef RXVT_GRAPHICS 1848#ifdef RXVT_GRAPHICS
1848 if (ev->subwindow != None) 1849 if (ev.subwindow != None)
1849 rxvt_Gr_ButtonRelease(ev->x, ev->y); 1850 rxvt_Gr_ButtonRelease(ev.x, ev.y);
1850 else 1851 else
1851#endif 1852#endif
1852 1853
1853 { 1854 {
1854 if (reportmode) 1855 if (reportmode)
1855 { 1856 {
1856 /* mouse report from vt window */ 1857 /* mouse report from vt window */
1857 /* don't report release of wheel "buttons" */ 1858 /* don't report release of wheel "buttons" */
1858 if (ev->button >= 4) 1859 if (ev.button >= 4)
1859 return; 1860 return;
1860#ifdef MOUSE_REPORT_DOUBLECLICK 1861#ifdef MOUSE_REPORT_DOUBLECLICK
1861 /* only report the release of 'slow' single clicks */ 1862 /* only report the release of 'slow' single clicks */
1862 if (MEvent.button != AnyButton 1863 if (MEvent.button != AnyButton
1863 && (ev->button != MEvent.button 1864 && (ev.button != MEvent.button
1864 || (ev->time - MEvent.time 1865 || (ev.time - MEvent.time
1865 > MULTICLICK_TIME / 2))) 1866 > MULTICLICK_TIME / 2)))
1866 { 1867 {
1867 MEvent.clicks = 0; 1868 MEvent.clicks = 0;
1868 MEvent.button = AnyButton; 1869 MEvent.button = AnyButton;
1869 mouse_report (ev); 1870 mouse_report (ev);
1878 * dumb hack to compensate for the failure of click-and-drag 1879 * dumb hack to compensate for the failure of click-and-drag
1879 * when overriding mouse reporting 1880 * when overriding mouse reporting
1880 */ 1881 */
1881 if (PrivateModes & PrivMode_mouse_report 1882 if (PrivateModes & PrivMode_mouse_report
1882 && bypass_keystate 1883 && bypass_keystate
1883 && ev->button == Button1 && MEvent.clicks <= 1) 1884 && ev.button == Button1 && MEvent.clicks <= 1)
1884 selection_extend (ev->x, ev->y, 0); 1885 selection_extend (ev.x, ev.y, 0);
1885 1886
1886 switch (ev->button) 1887 switch (ev.button)
1887 { 1888 {
1888 case Button1: 1889 case Button1:
1889 case Button3: 1890 case Button3:
1890 selection_make (ev->time); 1891 selection_make (ev.time);
1891 break; 1892 break;
1892 case Button2: 1893 case Button2:
1893 selection_request (ev->time, ev->x, ev->y); 1894 selection_request (ev.time, ev.x, ev.y);
1894 break; 1895 break;
1895#ifdef MOUSE_WHEEL 1896#ifdef MOUSE_WHEEL
1896 case Button4: 1897 case Button4:
1897 case Button5: 1898 case Button5:
1898 { 1899 {
1899 int i; 1900 int i;
1900 page_dirn v; 1901 page_dirn v;
1901 1902
1902 v = (ev->button == Button4) ? UP : DN; 1903 v = (ev.button == Button4) ? UP : DN;
1903 if (ev->state & ShiftMask) 1904 if (ev.state & ShiftMask)
1904 i = 1; 1905 i = 1;
1905 else if ((Options & Opt_mouseWheelScrollPage)) 1906 else if ((Options & Opt_mouseWheelScrollPage))
1906 i = TermWin.nrow - 1; 1907 i = TermWin.nrow - 1;
1907 else 1908 else
1908 i = 5; 1909 i = 5;
1909# ifdef MOUSE_SLIP_WHEELING 1910# ifdef MOUSE_SLIP_WHEELING
1910 if (ev->state & ControlMask) 1911 if (ev.state & ControlMask)
1911 { 1912 {
1912 mouse_slip_wheel_speed += (v ? -1 : 1); 1913 mouse_slip_wheel_speed += (v ? -1 : 1);
1913 mouse_slip_wheel_delay = SCROLLBAR_CONTINUOUS_DELAY; 1914 mouse_slip_wheel_delay = SCROLLBAR_CONTINUOUS_DELAY;
1914 } 1915 }
1915# endif 1916# endif
1932 1933
1933 } 1934 }
1934 } 1935 }
1935 } 1936 }
1936#ifdef MENUBAR 1937#ifdef MENUBAR
1937 else if (isMenuBarWindow(ev->window)) 1938 else if (isMenuBarWindow(ev.window))
1938 menubar_control (ev); 1939 menubar_control (ev);
1939#endif 1940#endif
1940} 1941}
1941 1942
1942 1943
1959 pchanged = 0; 1960 pchanged = 0;
1960 1961
1961 if (!(Options & Opt_transparent)) 1962 if (!(Options & Opt_transparent))
1962 return pchanged; /* Don't try any more */ 1963 return pchanged; /* Don't try any more */
1963 1964
1964 XGetWindowAttributes(Xdisplay, Xroot, &wrootattr); 1965 XGetWindowAttributes(display->display, display->root, &wrootattr);
1965 rootdepth = wrootattr.depth; 1966 rootdepth = wrootattr.depth;
1966 1967
1967 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 1968 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
1968 if (rootdepth != wattr.depth) 1969 if (rootdepth != wattr.depth)
1969 { 1970 {
1970 if (am_transparent) 1971 if (am_transparent)
1971 { 1972 {
1972 pchanged = 1; 1973 pchanged = 1;
1973 XSetWindowBackground(Xdisplay, TermWin.vt, 1974 XSetWindowBackground(display->display, TermWin.vt,
1974 PixColors[Color_bg]); 1975 PixColors[Color_bg]);
1975 am_transparent = am_pixmap_trans = 0; 1976 am_transparent = am_pixmap_trans = 0;
1976 } 1977 }
1977 return pchanged; /* Don't try any more */ 1978 return pchanged; /* Don't try any more */
1978 } 1979 }
1979 1980
1980 /* 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. */
1981 XSync(Xdisplay, False); 1982 XSync(display->display, False);
1982 1983
1983 /* 1984 /*
1984 * Make the frame window set by the window manager have 1985 * Make the frame window set by the window manager have
1985 * the root background. Some window managers put multiple nested frame 1986 * the root background. Some window managers put multiple nested frame
1986 * 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.
1987 */ 1988 */
1988 i = (xa[XA_XROOTPMAPID] != 0 1989 i = (xa[XA_XROOTPMAPID] != 0
1989 && (XGetWindowProperty(Xdisplay, Xroot, xa[XA_XROOTPMAPID], 1990 && (XGetWindowProperty(display->display, display->root, xa[XA_XROOTPMAPID],
1990 0L, 1L, False, XA_PIXMAP, &atype, &aformat, 1991 0L, 1L, False, XA_PIXMAP, &atype, &aformat,
1991 &nitems, &bytes_after, &prop) == Success)); 1992 &nitems, &bytes_after, &prop) == Success));
1992 if (!i || prop == NULL) 1993 if (!i || prop == NULL)
1993 have_pixmap = 0; 1994 have_pixmap = 0;
1994 else 1995 else
1998 XFree(prop); 1999 XFree(prop);
1999 } 2000 }
2000 if (have_pixmap) 2001 if (have_pixmap)
2001 { 2002 {
2002 /* 2003 /*
2003 * Copy Xroot pixmap transparency 2004 * Copy display->root pixmap transparency
2004 */ 2005 */
2005 int sx, sy, nx, ny; 2006 int sx, sy, nx, ny;
2006 unsigned int nw, nh; 2007 unsigned int nw, nh;
2007 Window cr; 2008 Window cr;
2008 XImage *image; 2009 XImage *image;
2009 GC gc; 2010 GC gc;
2010 XGCValues gcvalue; 2011 XGCValues gcvalue;
2011 2012
2012 XTranslateCoordinates(Xdisplay, TermWin.parent[0], Xroot, 2013 XTranslateCoordinates(display->display, TermWin.parent[0], display->root,
2013 0, 0, &sx, &sy, &cr); 2014 0, 0, &sx, &sy, &cr);
2014 nw = (unsigned int)szHint.width; 2015 nw = (unsigned int)szHint.width;
2015 nh = (unsigned int)szHint.height; 2016 nh = (unsigned int)szHint.height;
2016 nx = ny = 0; 2017 nx = ny = 0;
2017 if (sx < 0) 2018 if (sx < 0)
2027 sy = 0; 2028 sy = 0;
2028 } 2029 }
2029 MIN_IT(nw, (unsigned int)(wrootattr.width - sx)); 2030 MIN_IT(nw, (unsigned int)(wrootattr.width - sx));
2030 MIN_IT(nh, (unsigned int)(wrootattr.height - sy)); 2031 MIN_IT(nh, (unsigned int)(wrootattr.height - sy));
2031 allowedxerror = -1; 2032 allowedxerror = -1;
2032 image = XGetImage(Xdisplay, rootpixmap, sx, sy, nw, nh, AllPlanes, 2033 image = XGetImage(display->display, rootpixmap, sx, sy, nw, nh, AllPlanes,
2033 ZPixmap); 2034 ZPixmap);
2034 /* XXX: handle BadMatch - usually because we're outside the pixmap */ 2035 /* XXX: handle BadMatch - usually because we're outside the pixmap */
2035 /* XXX: may need a delay here? */ 2036 /* XXX: may need a delay here? */
2036 allowedxerror = 0; 2037 allowedxerror = 0;
2037 if (image == NULL) 2038 if (image == NULL)
2039 if (am_transparent && am_pixmap_trans) 2040 if (am_transparent && am_pixmap_trans)
2040 { 2041 {
2041 pchanged = 1; 2042 pchanged = 1;
2042 if (TermWin.pixmap != None) 2043 if (TermWin.pixmap != None)
2043 { 2044 {
2044 XFreePixmap(Xdisplay, TermWin.pixmap); 2045 XFreePixmap(display->display, TermWin.pixmap);
2045 TermWin.pixmap = None; 2046 TermWin.pixmap = None;
2046 } 2047 }
2047 } 2048 }
2048 am_pixmap_trans = 0; 2049 am_pixmap_trans = 0;
2049 } 2050 }
2050 else 2051 else
2051 { 2052 {
2052 if (TermWin.pixmap != None) 2053 if (TermWin.pixmap != None)
2053 XFreePixmap(Xdisplay, TermWin.pixmap); 2054 XFreePixmap(display->display, TermWin.pixmap);
2054 TermWin.pixmap = XCreatePixmap(Xdisplay, TermWin.vt, 2055 TermWin.pixmap = XCreatePixmap(display->display, TermWin.vt,
2055 (unsigned int)szHint.width, 2056 (unsigned int)szHint.width,
2056 (unsigned int)szHint.height, 2057 (unsigned int)szHint.height,
2057 (unsigned int)image->depth); 2058 (unsigned int)image->depth);
2058 gc = XCreateGC(Xdisplay, TermWin.vt, 0UL, &gcvalue); 2059 gc = XCreateGC(display->display, TermWin.vt, 0UL, &gcvalue);
2059 XPutImage(Xdisplay, TermWin.pixmap, gc, image, 0, 0, 2060 XPutImage(display->display, TermWin.pixmap, gc, image, 0, 0,
2060 nx, ny, (unsigned int)image->width, 2061 nx, ny, (unsigned int)image->width,
2061 (unsigned int)image->height); 2062 (unsigned int)image->height);
2062 XFreeGC(Xdisplay, gc); 2063 XFreeGC(display->display, gc);
2063 XDestroyImage(image); 2064 XDestroyImage(image);
2064 XSetWindowBackgroundPixmap(Xdisplay, TermWin.vt, 2065 XSetWindowBackgroundPixmap(display->display, TermWin.vt,
2065 TermWin.pixmap); 2066 TermWin.pixmap);
2066 if (!am_transparent || !am_pixmap_trans) 2067 if (!am_transparent || !am_pixmap_trans)
2067 pchanged = 1; 2068 pchanged = 1;
2068 am_transparent = am_pixmap_trans = 1; 2069 am_transparent = am_pixmap_trans = 1;
2069 } 2070 }
2072 { 2073 {
2073 unsigned int n; 2074 unsigned int n;
2074 /* 2075 /*
2075 * InheritPixmap transparency 2076 * InheritPixmap transparency
2076 */ 2077 */
2077 D_X((stderr, "InheritPixmap Seeking to %08lx", Xroot)); 2078 D_X((stderr, "InheritPixmap Seeking to %08lx", display->root));
2078 for (i = 1; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); 2079 for (i = 1; i < (int)(sizeof(TermWin.parent) / sizeof(Window));
2079 i++) 2080 i++)
2080 { 2081 {
2081 oldp = TermWin.parent[i]; 2082 oldp = TermWin.parent[i];
2082 XQueryTree(Xdisplay, TermWin.parent[i - 1], &root, 2083 XQueryTree(display->display, TermWin.parent[i - 1], &root,
2083 &TermWin.parent[i], &list, &n); 2084 &TermWin.parent[i], &list, &n);
2084 XFree(list); 2085 XFree(list);
2085 D_X((stderr, "InheritPixmap Parent[%d] = %08lx", i, TermWin.parent[i])); 2086 D_X((stderr, "InheritPixmap Parent[%d] = %08lx", i, TermWin.parent[i]));
2086 if (TermWin.parent[i] == Xroot) 2087 if (TermWin.parent[i] == display->root)
2087 { 2088 {
2088 if (oldp != None) 2089 if (oldp != None)
2089 pchanged = 1; 2090 pchanged = 1;
2090 break; 2091 break;
2091 } 2092 }
2095 n = 0; 2096 n = 0;
2096 if (pchanged) 2097 if (pchanged)
2097 { 2098 {
2098 for (; n < (unsigned int)i; n++) 2099 for (; n < (unsigned int)i; n++)
2099 { 2100 {
2100 XGetWindowAttributes(Xdisplay, TermWin.parent[n], &wattr); 2101 XGetWindowAttributes(display->display, TermWin.parent[n], &wattr);
2101 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"));
2102 if (wattr.depth != rootdepth || wattr.c_class == InputOnly) 2103 if (wattr.depth != rootdepth || wattr.c_class == InputOnly)
2103 { 2104 {
2104 n = (int)(sizeof(TermWin.parent) / sizeof(Window)) + 1; 2105 n = (int)(sizeof(TermWin.parent) / sizeof(Window)) + 1;
2105 break; 2106 break;
2108 } 2109 }
2109 if (n > (int)(sizeof(TermWin.parent) 2110 if (n > (int)(sizeof(TermWin.parent)
2110 / sizeof(TermWin.parent[0]))) 2111 / sizeof(TermWin.parent[0])))
2111 { 2112 {
2112 D_X((stderr, "InheritPixmap Turning off")); 2113 D_X((stderr, "InheritPixmap Turning off"));
2113 XSetWindowBackground(Xdisplay, TermWin.parent[0], 2114 XSetWindowBackground(display->display, TermWin.parent[0],
2114 PixColors[Color_fg]); 2115 PixColors[Color_fg]);
2115 XSetWindowBackground(Xdisplay, TermWin.vt, 2116 XSetWindowBackground(display->display, TermWin.vt,
2116 PixColors[Color_bg]); 2117 PixColors[Color_bg]);
2117 am_transparent = 0; 2118 am_transparent = 0;
2118 /* XXX: also turn off Opt_transparent? */ 2119 /* XXX: also turn off Opt_transparent? */
2119 } 2120 }
2120 else 2121 else
2130# else 2131# else
2131 sleep(1); 2132 sleep(1);
2132# endif 2133# endif
2133 D_X((stderr, "InheritPixmap Turning on (%d parents)", i - 1)); 2134 D_X((stderr, "InheritPixmap Turning on (%d parents)", i - 1));
2134 for (n = 0; n < (unsigned int)i; n++) 2135 for (n = 0; n < (unsigned int)i; n++)
2135 XSetWindowBackgroundPixmap(Xdisplay, TermWin.parent[n], 2136 XSetWindowBackgroundPixmap(display->display, TermWin.parent[n],
2136 ParentRelative); 2137 ParentRelative);
2137 XSetWindowBackgroundPixmap(Xdisplay, TermWin.vt, 2138 XSetWindowBackgroundPixmap(display->display, TermWin.vt,
2138 ParentRelative); 2139 ParentRelative);
2139 am_transparent = 1; 2140 am_transparent = 1;
2140 } 2141 }
2141 for (; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); i++) 2142 for (; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); i++)
2142 TermWin.parent[i] = None; 2143 TermWin.parent[i] = None;
2834 { 2835 {
2835 /* 2836 /*
2836 * commands 2837 * commands
2837 */ 2838 */
2838 case 1: /* deiconify window */ 2839 case 1: /* deiconify window */
2839 XMapWindow(Xdisplay, TermWin.parent[0]); 2840 XMapWindow(display->display, TermWin.parent[0]);
2840 break; 2841 break;
2841 case 2: /* iconify window */ 2842 case 2: /* iconify window */
2842 XIconifyWindow(Xdisplay, TermWin.parent[0], 2843 XIconifyWindow(display->display, TermWin.parent[0],
2843 DefaultScreen(Xdisplay)); 2844 DefaultScreen(display->display));
2844 break; 2845 break;
2845 case 3: /* set position (pixels) */ 2846 case 3: /* set position (pixels) */
2846 XMoveWindow(Xdisplay, TermWin.parent[0], args[1], args[2]); 2847 XMoveWindow(display->display, TermWin.parent[0], args[1], args[2]);
2847 break; 2848 break;
2848 case 4: /* set size (pixels) */ 2849 case 4: /* set size (pixels) */
2849 set_widthheight ((unsigned int)args[2], (unsigned int)args[1]); 2850 set_widthheight ((unsigned int)args[2], (unsigned int)args[1]);
2850 break; 2851 break;
2851 case 5: /* raise window */ 2852 case 5: /* raise window */
2852 XRaiseWindow(Xdisplay, TermWin.parent[0]); 2853 XRaiseWindow(display->display, TermWin.parent[0]);
2853 break; 2854 break;
2854 case 6: /* lower window */ 2855 case 6: /* lower window */
2855 XLowerWindow(Xdisplay, TermWin.parent[0]); 2856 XLowerWindow(display->display, TermWin.parent[0]);
2856 break; 2857 break;
2857 case 7: /* refresh window */ 2858 case 7: /* refresh window */
2858 scr_touch (true); 2859 scr_touch (true);
2859 break; 2860 break;
2860 case 8: /* set size (chars) */ 2861 case 8: /* set size (chars) */
2868 break; 2869 break;
2869 /* 2870 /*
2870 * reports - some output format copied from XTerm 2871 * reports - some output format copied from XTerm
2871 */ 2872 */
2872 case 11: /* report window state */ 2873 case 11: /* report window state */
2873 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2874 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2874 tt_printf("\033[%dt", wattr.map_state == IsViewable ? 1 : 2); 2875 tt_printf("\033[%dt", wattr.map_state == IsViewable ? 1 : 2);
2875 break; 2876 break;
2876 case 13: /* report window position */ 2877 case 13: /* report window position */
2877 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2878 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2878 XTranslateCoordinates(Xdisplay, TermWin.parent[0], wattr.root, 2879 XTranslateCoordinates(display->display, TermWin.parent[0], wattr.root,
2879 -wattr.border_width, -wattr.border_width, 2880 -wattr.border_width, -wattr.border_width,
2880 &x, &y, &wdummy); 2881 &x, &y, &wdummy);
2881 tt_printf("\033[3;%d;%dt", x, y); 2882 tt_printf("\033[3;%d;%dt", x, y);
2882 break; 2883 break;
2883 case 14: /* report window size (pixels) */ 2884 case 14: /* report window size (pixels) */
2884 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2885 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2885 tt_printf("\033[4;%d;%dt", wattr.height, wattr.width); 2886 tt_printf("\033[4;%d;%dt", wattr.height, wattr.width);
2886 break; 2887 break;
2887 case 18: /* report window size (chars) */ 2888 case 18: /* report window size (chars) */
2888 tt_printf("\033[8;%d;%dt", TermWin.nrow, TermWin.ncol); 2889 tt_printf("\033[8;%d;%dt", TermWin.nrow, TermWin.ncol);
2889 break; 2890 break;
2890#if 0 /* XXX: currently disabled due to security concerns */ 2891#if 0 /* XXX: currently disabled due to security concerns */
2891 case 20: /* report icon label */ 2892 case 20: /* report icon label */
2892 XGetIconName(Xdisplay, TermWin.parent[0], &s); 2893 XGetIconName(display->display, TermWin.parent[0], &s);
2893 tt_printf("\033]L%-.200s\234", s ? s : ""); /* 8bit ST */ 2894 tt_printf("\033]L%-.200s\234", s ? s : ""); /* 8bit ST */
2894 break; 2895 break;
2895 case 21: /* report window title */ 2896 case 21: /* report window title */
2896 XFetchName(Xdisplay, TermWin.parent[0], &s); 2897 XFetchName(display->display, TermWin.parent[0], &s);
2897 tt_printf("\033]l%-.200s\234", s ? s : ""); /* 8bit ST */ 2898 tt_printf("\033]l%-.200s\234", s ? s : ""); /* 8bit ST */
2898 break; 2899 break;
2899#endif 2900#endif
2900 2901
2901 } 2902 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines