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.39 by pcg, Mon Feb 9 07:15:46 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
1553#ifdef TRANSPARENT
1578void 1554void
1555rxvt_term::rootwin_cb (XEvent &ev)
1556{
1557 SET_R (this);
1558 SET_LOCALE (locale);
1559
1560 if (ev.type == PropertyNotify)
1561 {
1562 /*
1563 * if user used some Esetroot compatible prog to set the root bg,
1564 * use the property to determine the pixmap. We use it later on.
1565 */
1566 if (xa[XA_XROOTPMAPID] == 0)
1567 xa[XA_XROOTPMAPID] = XInternAtom(display->display, "_XROOTPMAP_ID", False);
1568
1569 if (ev.xproperty.atom != xa[XA_XROOTPMAPID])
1570 return;
1571 }
1572
1573 if ((Options & Opt_transparent) && check_our_parents ())
1574 {
1575 if (am_transparent)
1576 want_full_refresh = 1;
1577 }
1578}
1579#endif
1580
1581void
1579rxvt_term::button_press (XButtonEvent *ev) 1582rxvt_term::button_press (const XButtonEvent &ev)
1580{ 1583{
1581 int reportmode = 0, clickintime; 1584 int reportmode = 0, clickintime;
1582 1585
1583 bypass_keystate = ev->state & (ModMetaMask | ShiftMask); 1586 bypass_keystate = ev.state & (ModMetaMask | ShiftMask);
1584 if (!bypass_keystate) 1587 if (!bypass_keystate)
1585 reportmode = !!(PrivateModes & PrivMode_mouse_report); 1588 reportmode = !!(PrivateModes & PrivMode_mouse_report);
1586 /* 1589 /*
1587 * VT window processing of button press 1590 * VT window processing of button press
1588 */ 1591 */
1589 if (ev->window == TermWin.vt) 1592 if (ev.window == TermWin.vt)
1590 { 1593 {
1591#if RXVT_GRAPHICS 1594#if RXVT_GRAPHICS
1592 if (ev->subwindow != None) 1595 if (ev.subwindow != None)
1593 rxvt_Gr_ButtonPress (ev->x, ev->y); 1596 rxvt_Gr_ButtonPress (ev.x, ev.y);
1594 else 1597 else
1595#endif 1598#endif
1596 1599
1597 { 1600 {
1598 clickintime = ev->time - MEvent.time < MULTICLICK_TIME; 1601 clickintime = ev.time - MEvent.time < MULTICLICK_TIME;
1599 if (reportmode) 1602 if (reportmode)
1600 { 1603 {
1601 /* mouse report from vt window */ 1604 /* mouse report from vt window */
1602 /* save the xbutton state (for ButtonRelease) */ 1605 /* save the xbutton state (for ButtonRelease) */
1603 MEvent.state = ev->state; 1606 MEvent.state = ev.state;
1604#ifdef MOUSE_REPORT_DOUBLECLICK 1607#ifdef MOUSE_REPORT_DOUBLECLICK
1605 if (ev->button == MEvent.button && clickintime) 1608 if (ev.button == MEvent.button && clickintime)
1606 { 1609 {
1607 /* same button, within alloted time */ 1610 /* same button, within alloted time */
1608 MEvent.clicks++; 1611 MEvent.clicks++;
1609 if (MEvent.clicks > 1) 1612 if (MEvent.clicks > 1)
1610 { 1613 {
1619 } 1622 }
1620 else 1623 else
1621 { 1624 {
1622 /* different button, or time expired */ 1625 /* different button, or time expired */
1623 MEvent.clicks = 1; 1626 MEvent.clicks = 1;
1624 MEvent.button = ev->button; 1627 MEvent.button = ev.button;
1625 mouse_report (ev); 1628 mouse_report (ev);
1626 } 1629 }
1627#else 1630#else
1628 MEvent.button = ev->button; 1631 MEvent.button = ev.button;
1629 mouse_report (ev); 1632 mouse_report (ev);
1630#endif /* MOUSE_REPORT_DOUBLECLICK */ 1633#endif /* MOUSE_REPORT_DOUBLECLICK */
1631 1634
1632 } 1635 }
1633 else 1636 else
1634 { 1637 {
1635 if (ev->button != MEvent.button) 1638 if (ev.button != MEvent.button)
1636 MEvent.clicks = 0; 1639 MEvent.clicks = 0;
1637 switch (ev->button) 1640 switch (ev.button)
1638 { 1641 {
1639 case Button1: 1642 case Button1:
1640 /* allow shift+left click to extend selection */ 1643 /* allow shift+left click to extend selection */
1641 if (ev->state & ShiftMask && !(PrivateModes & PrivMode_mouse_report)) 1644 if (ev.state & ShiftMask && !(PrivateModes & PrivMode_mouse_report))
1642 { 1645 {
1643 if (MEvent.button == Button1 && clickintime) 1646 if (MEvent.button == Button1 && clickintime)
1644 selection_rotate (ev->x, ev->y); 1647 selection_rotate (ev.x, ev.y);
1645 else 1648 else
1646 selection_extend (ev->x, ev->y, 1); 1649 selection_extend (ev.x, ev.y, 1);
1647 } 1650 }
1648 else 1651 else
1649 { 1652 {
1650 if (MEvent.button == Button1 && clickintime) 1653 if (MEvent.button == Button1 && clickintime)
1651 MEvent.clicks++; 1654 MEvent.clicks++;
1652 else 1655 else
1653 MEvent.clicks = 1; 1656 MEvent.clicks = 1;
1654 1657
1655 selection_click (MEvent.clicks, ev->x, ev->y); 1658 selection_click (MEvent.clicks, ev.x, ev.y);
1656 } 1659 }
1657 1660
1658 MEvent.button = Button1; 1661 MEvent.button = Button1;
1659 break; 1662 break;
1660 1663
1661 case Button3: 1664 case Button3:
1662 if (MEvent.button == Button3 && clickintime) 1665 if (MEvent.button == Button3 && clickintime)
1663 selection_rotate (ev->x, ev->y); 1666 selection_rotate (ev.x, ev.y);
1664 else 1667 else
1665 selection_extend (ev->x, ev->y, 1); 1668 selection_extend (ev.x, ev.y, 1);
1666 MEvent.button = Button3; 1669 MEvent.button = Button3;
1667 break; 1670 break;
1668 } 1671 }
1669 } 1672 }
1670 MEvent.time = ev->time; 1673 MEvent.time = ev.time;
1671 return; 1674 return;
1672 } 1675 }
1673 } 1676 }
1674 1677
1675 /* 1678 /*
1676 * Scrollbar window processing of button press 1679 * Scrollbar window processing of button press
1677 */ 1680 */
1678 if (isScrollbarWindow(ev->window)) 1681 if (isScrollbarWindow(ev.window))
1679 { 1682 {
1680 scrollBar.setIdle (); 1683 scrollBar.setIdle ();
1681 /* 1684 /*
1682 * Rxvt-style scrollbar: 1685 * Rxvt-style scrollbar:
1683 * move up if mouse is above slider 1686 * move up if mouse is above slider
1695 * Mouse report disabled scrollbar: 1698 * Mouse report disabled scrollbar:
1696 * arrow buttons - send up/down 1699 * arrow buttons - send up/down
1697 * click on scrollbar - send pageup/down 1700 * click on scrollbar - send pageup/down
1698 */ 1701 */
1699 if ((scrollBar.style == R_SB_NEXT 1702 if ((scrollBar.style == R_SB_NEXT
1700 && scrollbarnext_upButton(ev->y)) 1703 && scrollbarnext_upButton(ev.y))
1701 || (scrollBar.style == R_SB_RXVT 1704 || (scrollBar.style == R_SB_RXVT
1702 && scrollbarrxvt_upButton(ev->y))) 1705 && scrollbarrxvt_upButton(ev.y)))
1703 tt_printf("\033[A"); 1706 tt_printf("\033[A");
1704 else if ((scrollBar.style == R_SB_NEXT 1707 else if ((scrollBar.style == R_SB_NEXT
1705 && scrollbarnext_dnButton(ev->y)) 1708 && scrollbarnext_dnButton(ev.y))
1706 || (scrollBar.style == R_SB_RXVT 1709 || (scrollBar.style == R_SB_RXVT
1707 && scrollbarrxvt_dnButton(ev->y))) 1710 && scrollbarrxvt_dnButton(ev.y)))
1708 tt_printf("\033[B"); 1711 tt_printf("\033[B");
1709 else 1712 else
1710 switch (ev->button) 1713 switch (ev.button)
1711 { 1714 {
1712 case Button2: 1715 case Button2:
1713 tt_printf("\014"); 1716 tt_printf("\014");
1714 break; 1717 break;
1715 case Button1: 1718 case Button1:
1726 { 1729 {
1727 char upordown = 0; 1730 char upordown = 0;
1728 1731
1729 if (scrollBar.style == R_SB_NEXT) 1732 if (scrollBar.style == R_SB_NEXT)
1730 { 1733 {
1731 if (scrollbarnext_upButton(ev->y)) 1734 if (scrollbarnext_upButton(ev.y))
1732 upordown = -1; /* up */ 1735 upordown = -1; /* up */
1733 else if (scrollbarnext_dnButton(ev->y)) 1736 else if (scrollbarnext_dnButton(ev.y))
1734 upordown = 1; /* down */ 1737 upordown = 1; /* down */
1735 } 1738 }
1736 else if (scrollBar.style == R_SB_RXVT) 1739 else if (scrollBar.style == R_SB_RXVT)
1737 { 1740 {
1738 if (scrollbarrxvt_upButton(ev->y)) 1741 if (scrollbarrxvt_upButton(ev.y))
1739 upordown = -1; /* up */ 1742 upordown = -1; /* up */
1740 else if (scrollbarrxvt_dnButton(ev->y)) 1743 else if (scrollbarrxvt_dnButton(ev.y))
1741 upordown = 1; /* down */ 1744 upordown = 1; /* down */
1742 } 1745 }
1743 if (upordown) 1746 if (upordown)
1744 { 1747 {
1745#ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING 1748#ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING
1752 else 1755 else
1753 scrollBar.setDn (); 1756 scrollBar.setDn ();
1754 } 1757 }
1755 } 1758 }
1756 else 1759 else
1757 switch (ev->button) 1760 switch (ev.button)
1758 { 1761 {
1759 case Button2: 1762 case Button2:
1760 switch (scrollbar_align) 1763 switch (scrollbar_align)
1761 { 1764 {
1762 case R_SB_ALIGN_TOP: 1765 case R_SB_ALIGN_TOP:
1768 case R_SB_ALIGN_BOTTOM: 1771 case R_SB_ALIGN_BOTTOM:
1769 csrO = scrollBar.bot - scrollBar.top; 1772 csrO = scrollBar.bot - scrollBar.top;
1770 break; 1773 break;
1771 } 1774 }
1772 if (scrollBar.style == R_SB_XTERM 1775 if (scrollBar.style == R_SB_XTERM
1773 || scrollbar_above_slider(ev->y) 1776 || scrollbar_above_slider(ev.y)
1774 || scrollbar_below_slider(ev->y)) 1777 || scrollbar_below_slider(ev.y))
1775 scr_move_to ( scrollbar_position(ev->y) - csrO, 1778 scr_move_to ( scrollbar_position(ev.y) - csrO,
1776 scrollbar_size()); 1779 scrollbar_size());
1777 scrollBar.setMotion (); 1780 scrollBar.setMotion ();
1778 break; 1781 break;
1779 1782
1780 case Button1: 1783 case Button1:
1781 if (scrollbar_align == R_SB_ALIGN_CENTRE) 1784 if (scrollbar_align == R_SB_ALIGN_CENTRE)
1782 csrO = ev->y - scrollBar.top; 1785 csrO = ev.y - scrollBar.top;
1783 /* FALLTHROUGH */ 1786 /* FALLTHROUGH */
1784 1787
1785 case Button3: 1788 case Button3:
1786 if (scrollBar.style != R_SB_XTERM) 1789 if (scrollBar.style != R_SB_XTERM)
1787 { 1790 {
1788 if (scrollbar_above_slider(ev->y)) 1791 if (scrollbar_above_slider(ev.y))
1789# ifdef RXVT_SCROLL_FULL 1792# ifdef RXVT_SCROLL_FULL
1790 scr_page (UP, TermWin.nrow - 1); 1793 scr_page (UP, TermWin.nrow - 1);
1791# else 1794# else
1792 scr_page (UP, TermWin.nrow / 4); 1795 scr_page (UP, TermWin.nrow / 4);
1793# endif 1796# endif
1794 else if (scrollbar_below_slider(ev->y)) 1797 else if (scrollbar_below_slider(ev.y))
1795# ifdef RXVT_SCROLL_FULL 1798# ifdef RXVT_SCROLL_FULL
1796 scr_page (DN, TermWin.nrow - 1); 1799 scr_page (DN, TermWin.nrow - 1);
1797# else 1800# else
1798 scr_page (DN, TermWin.nrow / 4); 1801 scr_page (DN, TermWin.nrow / 4);
1799# endif 1802# endif
1800 else 1803 else
1801 scrollBar.setMotion (); 1804 scrollBar.setMotion ();
1802 } 1805 }
1803 else 1806 else
1804 { 1807 {
1805 scr_page ((ev->button == Button1 ? DN : UP), 1808 scr_page ((ev.button == Button1 ? DN : UP),
1806 (TermWin.nrow 1809 (TermWin.nrow
1807 * scrollbar_position(ev->y) 1810 * scrollbar_position(ev.y)
1808 / scrollbar_size())); 1811 / scrollbar_size()));
1809 } 1812 }
1810 break; 1813 break;
1811 } 1814 }
1812 } 1815 }
1814 } 1817 }
1815#if MENUBAR 1818#if MENUBAR
1816 /* 1819 /*
1817 * Menubar window processing of button press 1820 * Menubar window processing of button press
1818 */ 1821 */
1819 if (isMenuBarWindow(ev->window)) 1822 if (isMenuBarWindow(ev.window))
1820 menubar_control (ev); 1823 menubar_control (ev);
1821#endif 1824#endif
1822} 1825}
1823 1826
1824void 1827void
1825rxvt_term::button_release (XButtonEvent *ev) 1828rxvt_term::button_release (const XButtonEvent &ev)
1826{ 1829{
1827 int reportmode = 0; 1830 int reportmode = 0;
1828 1831
1829 csrO = 0; /* reset csr Offset */ 1832 csrO = 0; /* reset csr Offset */
1830 if (!bypass_keystate) 1833 if (!bypass_keystate)
1831 reportmode = !!(PrivateModes & PrivMode_mouse_report); 1834 reportmode = !!(PrivateModes & PrivMode_mouse_report);
1832 1835
1840 1843
1841 } 1844 }
1842#ifdef SELECTION_SCROLLING 1845#ifdef SELECTION_SCROLLING
1843 pending_scroll_selection=0; 1846 pending_scroll_selection=0;
1844#endif 1847#endif
1845 if (ev->window == TermWin.vt) 1848 if (ev.window == TermWin.vt)
1846 { 1849 {
1847#ifdef RXVT_GRAPHICS 1850#ifdef RXVT_GRAPHICS
1848 if (ev->subwindow != None) 1851 if (ev.subwindow != None)
1849 rxvt_Gr_ButtonRelease(ev->x, ev->y); 1852 rxvt_Gr_ButtonRelease(ev.x, ev.y);
1850 else 1853 else
1851#endif 1854#endif
1852 1855
1853 { 1856 {
1854 if (reportmode) 1857 if (reportmode)
1855 { 1858 {
1856 /* mouse report from vt window */ 1859 /* mouse report from vt window */
1857 /* don't report release of wheel "buttons" */ 1860 /* don't report release of wheel "buttons" */
1858 if (ev->button >= 4) 1861 if (ev.button >= 4)
1859 return; 1862 return;
1860#ifdef MOUSE_REPORT_DOUBLECLICK 1863#ifdef MOUSE_REPORT_DOUBLECLICK
1861 /* only report the release of 'slow' single clicks */ 1864 /* only report the release of 'slow' single clicks */
1862 if (MEvent.button != AnyButton 1865 if (MEvent.button != AnyButton
1863 && (ev->button != MEvent.button 1866 && (ev.button != MEvent.button
1864 || (ev->time - MEvent.time 1867 || (ev.time - MEvent.time
1865 > MULTICLICK_TIME / 2))) 1868 > MULTICLICK_TIME / 2)))
1866 { 1869 {
1867 MEvent.clicks = 0; 1870 MEvent.clicks = 0;
1868 MEvent.button = AnyButton; 1871 MEvent.button = AnyButton;
1869 mouse_report (ev); 1872 mouse_report (ev);
1878 * dumb hack to compensate for the failure of click-and-drag 1881 * dumb hack to compensate for the failure of click-and-drag
1879 * when overriding mouse reporting 1882 * when overriding mouse reporting
1880 */ 1883 */
1881 if (PrivateModes & PrivMode_mouse_report 1884 if (PrivateModes & PrivMode_mouse_report
1882 && bypass_keystate 1885 && bypass_keystate
1883 && ev->button == Button1 && MEvent.clicks <= 1) 1886 && ev.button == Button1 && MEvent.clicks <= 1)
1884 selection_extend (ev->x, ev->y, 0); 1887 selection_extend (ev.x, ev.y, 0);
1885 1888
1886 switch (ev->button) 1889 switch (ev.button)
1887 { 1890 {
1888 case Button1: 1891 case Button1:
1889 case Button3: 1892 case Button3:
1890 selection_make (ev->time); 1893 selection_make (ev.time);
1891 break; 1894 break;
1892 case Button2: 1895 case Button2:
1893 selection_request (ev->time, ev->x, ev->y); 1896 selection_request (ev.time, ev.x, ev.y);
1894 break; 1897 break;
1895#ifdef MOUSE_WHEEL 1898#ifdef MOUSE_WHEEL
1896 case Button4: 1899 case Button4:
1897 case Button5: 1900 case Button5:
1898 { 1901 {
1899 int i; 1902 int i;
1900 page_dirn v; 1903 page_dirn v;
1901 1904
1902 v = (ev->button == Button4) ? UP : DN; 1905 v = (ev.button == Button4) ? UP : DN;
1903 if (ev->state & ShiftMask) 1906 if (ev.state & ShiftMask)
1904 i = 1; 1907 i = 1;
1905 else if ((Options & Opt_mouseWheelScrollPage)) 1908 else if ((Options & Opt_mouseWheelScrollPage))
1906 i = TermWin.nrow - 1; 1909 i = TermWin.nrow - 1;
1907 else 1910 else
1908 i = 5; 1911 i = 5;
1909# ifdef MOUSE_SLIP_WHEELING 1912# ifdef MOUSE_SLIP_WHEELING
1910 if (ev->state & ControlMask) 1913 if (ev.state & ControlMask)
1911 { 1914 {
1912 mouse_slip_wheel_speed += (v ? -1 : 1); 1915 mouse_slip_wheel_speed += (v ? -1 : 1);
1913 mouse_slip_wheel_delay = SCROLLBAR_CONTINUOUS_DELAY; 1916 mouse_slip_wheel_delay = SCROLLBAR_CONTINUOUS_DELAY;
1914 } 1917 }
1915# endif 1918# endif
1932 1935
1933 } 1936 }
1934 } 1937 }
1935 } 1938 }
1936#ifdef MENUBAR 1939#ifdef MENUBAR
1937 else if (isMenuBarWindow(ev->window)) 1940 else if (isMenuBarWindow(ev.window))
1938 menubar_control (ev); 1941 menubar_control (ev);
1939#endif 1942#endif
1940} 1943}
1941 1944
1942 1945
1959 pchanged = 0; 1962 pchanged = 0;
1960 1963
1961 if (!(Options & Opt_transparent)) 1964 if (!(Options & Opt_transparent))
1962 return pchanged; /* Don't try any more */ 1965 return pchanged; /* Don't try any more */
1963 1966
1964 XGetWindowAttributes(Xdisplay, Xroot, &wrootattr); 1967 XGetWindowAttributes(display->display, display->root, &wrootattr);
1965 rootdepth = wrootattr.depth; 1968 rootdepth = wrootattr.depth;
1966 1969
1967 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 1970 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
1968 if (rootdepth != wattr.depth) 1971 if (rootdepth != wattr.depth)
1969 { 1972 {
1970 if (am_transparent) 1973 if (am_transparent)
1971 { 1974 {
1972 pchanged = 1; 1975 pchanged = 1;
1973 XSetWindowBackground(Xdisplay, TermWin.vt, 1976 XSetWindowBackground(display->display, TermWin.vt,
1974 PixColors[Color_bg]); 1977 PixColors[Color_bg]);
1975 am_transparent = am_pixmap_trans = 0; 1978 am_transparent = am_pixmap_trans = 0;
1976 } 1979 }
1977 return pchanged; /* Don't try any more */ 1980 return pchanged; /* Don't try any more */
1978 } 1981 }
1979 1982
1980 /* Get all X ops out of the queue so that our information is up-to-date. */ 1983 /* Get all X ops out of the queue so that our information is up-to-date. */
1981 XSync(Xdisplay, False); 1984 XSync(display->display, False);
1982 1985
1983 /* 1986 /*
1984 * Make the frame window set by the window manager have 1987 * Make the frame window set by the window manager have
1985 * the root background. Some window managers put multiple nested frame 1988 * the root background. Some window managers put multiple nested frame
1986 * windows for each client, so we have to take care about that. 1989 * windows for each client, so we have to take care about that.
1987 */ 1990 */
1988 i = (xa[XA_XROOTPMAPID] != 0 1991 i = (xa[XA_XROOTPMAPID] != 0
1989 && (XGetWindowProperty(Xdisplay, Xroot, xa[XA_XROOTPMAPID], 1992 && (XGetWindowProperty(display->display, display->root, xa[XA_XROOTPMAPID],
1990 0L, 1L, False, XA_PIXMAP, &atype, &aformat, 1993 0L, 1L, False, XA_PIXMAP, &atype, &aformat,
1991 &nitems, &bytes_after, &prop) == Success)); 1994 &nitems, &bytes_after, &prop) == Success));
1992 if (!i || prop == NULL) 1995 if (!i || prop == NULL)
1993 have_pixmap = 0; 1996 have_pixmap = 0;
1994 else 1997 else
1998 XFree(prop); 2001 XFree(prop);
1999 } 2002 }
2000 if (have_pixmap) 2003 if (have_pixmap)
2001 { 2004 {
2002 /* 2005 /*
2003 * Copy Xroot pixmap transparency 2006 * Copy display->root pixmap transparency
2004 */ 2007 */
2005 int sx, sy, nx, ny; 2008 int sx, sy, nx, ny;
2006 unsigned int nw, nh; 2009 unsigned int nw, nh;
2007 Window cr; 2010 Window cr;
2008 XImage *image; 2011 XImage *image;
2009 GC gc; 2012 GC gc;
2010 XGCValues gcvalue; 2013 XGCValues gcvalue;
2011 2014
2012 XTranslateCoordinates(Xdisplay, TermWin.parent[0], Xroot, 2015 XTranslateCoordinates(display->display, TermWin.parent[0], display->root,
2013 0, 0, &sx, &sy, &cr); 2016 0, 0, &sx, &sy, &cr);
2014 nw = (unsigned int)szHint.width; 2017 nw = (unsigned int)szHint.width;
2015 nh = (unsigned int)szHint.height; 2018 nh = (unsigned int)szHint.height;
2016 nx = ny = 0; 2019 nx = ny = 0;
2017 if (sx < 0) 2020 if (sx < 0)
2027 sy = 0; 2030 sy = 0;
2028 } 2031 }
2029 MIN_IT(nw, (unsigned int)(wrootattr.width - sx)); 2032 MIN_IT(nw, (unsigned int)(wrootattr.width - sx));
2030 MIN_IT(nh, (unsigned int)(wrootattr.height - sy)); 2033 MIN_IT(nh, (unsigned int)(wrootattr.height - sy));
2031 allowedxerror = -1; 2034 allowedxerror = -1;
2032 image = XGetImage(Xdisplay, rootpixmap, sx, sy, nw, nh, AllPlanes, 2035 image = XGetImage(display->display, rootpixmap, sx, sy, nw, nh, AllPlanes,
2033 ZPixmap); 2036 ZPixmap);
2034 /* XXX: handle BadMatch - usually because we're outside the pixmap */ 2037 /* XXX: handle BadMatch - usually because we're outside the pixmap */
2035 /* XXX: may need a delay here? */ 2038 /* XXX: may need a delay here? */
2036 allowedxerror = 0; 2039 allowedxerror = 0;
2037 if (image == NULL) 2040 if (image == NULL)
2039 if (am_transparent && am_pixmap_trans) 2042 if (am_transparent && am_pixmap_trans)
2040 { 2043 {
2041 pchanged = 1; 2044 pchanged = 1;
2042 if (TermWin.pixmap != None) 2045 if (TermWin.pixmap != None)
2043 { 2046 {
2044 XFreePixmap(Xdisplay, TermWin.pixmap); 2047 XFreePixmap(display->display, TermWin.pixmap);
2045 TermWin.pixmap = None; 2048 TermWin.pixmap = None;
2046 } 2049 }
2047 } 2050 }
2048 am_pixmap_trans = 0; 2051 am_pixmap_trans = 0;
2049 } 2052 }
2050 else 2053 else
2051 { 2054 {
2052 if (TermWin.pixmap != None) 2055 if (TermWin.pixmap != None)
2053 XFreePixmap(Xdisplay, TermWin.pixmap); 2056 XFreePixmap(display->display, TermWin.pixmap);
2054 TermWin.pixmap = XCreatePixmap(Xdisplay, TermWin.vt, 2057 TermWin.pixmap = XCreatePixmap(display->display, TermWin.vt,
2055 (unsigned int)szHint.width, 2058 (unsigned int)szHint.width,
2056 (unsigned int)szHint.height, 2059 (unsigned int)szHint.height,
2057 (unsigned int)image->depth); 2060 (unsigned int)image->depth);
2058 gc = XCreateGC(Xdisplay, TermWin.vt, 0UL, &gcvalue); 2061 gc = XCreateGC(display->display, TermWin.vt, 0UL, &gcvalue);
2059 XPutImage(Xdisplay, TermWin.pixmap, gc, image, 0, 0, 2062 XPutImage(display->display, TermWin.pixmap, gc, image, 0, 0,
2060 nx, ny, (unsigned int)image->width, 2063 nx, ny, (unsigned int)image->width,
2061 (unsigned int)image->height); 2064 (unsigned int)image->height);
2062 XFreeGC(Xdisplay, gc); 2065 XFreeGC(display->display, gc);
2063 XDestroyImage(image); 2066 XDestroyImage(image);
2064 XSetWindowBackgroundPixmap(Xdisplay, TermWin.vt, 2067 XSetWindowBackgroundPixmap(display->display, TermWin.vt,
2065 TermWin.pixmap); 2068 TermWin.pixmap);
2066 if (!am_transparent || !am_pixmap_trans) 2069 if (!am_transparent || !am_pixmap_trans)
2067 pchanged = 1; 2070 pchanged = 1;
2068 am_transparent = am_pixmap_trans = 1; 2071 am_transparent = am_pixmap_trans = 1;
2069 } 2072 }
2072 { 2075 {
2073 unsigned int n; 2076 unsigned int n;
2074 /* 2077 /*
2075 * InheritPixmap transparency 2078 * InheritPixmap transparency
2076 */ 2079 */
2077 D_X((stderr, "InheritPixmap Seeking to %08lx", Xroot)); 2080 D_X((stderr, "InheritPixmap Seeking to %08lx", display->root));
2078 for (i = 1; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); 2081 for (i = 1; i < (int)(sizeof(TermWin.parent) / sizeof(Window));
2079 i++) 2082 i++)
2080 { 2083 {
2081 oldp = TermWin.parent[i]; 2084 oldp = TermWin.parent[i];
2082 XQueryTree(Xdisplay, TermWin.parent[i - 1], &root, 2085 XQueryTree(display->display, TermWin.parent[i - 1], &root,
2083 &TermWin.parent[i], &list, &n); 2086 &TermWin.parent[i], &list, &n);
2084 XFree(list); 2087 XFree(list);
2085 D_X((stderr, "InheritPixmap Parent[%d] = %08lx", i, TermWin.parent[i])); 2088 D_X((stderr, "InheritPixmap Parent[%d] = %08lx", i, TermWin.parent[i]));
2086 if (TermWin.parent[i] == Xroot) 2089 if (TermWin.parent[i] == display->root)
2087 { 2090 {
2088 if (oldp != None) 2091 if (oldp != None)
2089 pchanged = 1; 2092 pchanged = 1;
2090 break; 2093 break;
2091 } 2094 }
2095 n = 0; 2098 n = 0;
2096 if (pchanged) 2099 if (pchanged)
2097 { 2100 {
2098 for (; n < (unsigned int)i; n++) 2101 for (; n < (unsigned int)i; n++)
2099 { 2102 {
2100 XGetWindowAttributes(Xdisplay, TermWin.parent[n], &wattr); 2103 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")); 2104 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) 2105 if (wattr.depth != rootdepth || wattr.c_class == InputOnly)
2103 { 2106 {
2104 n = (int)(sizeof(TermWin.parent) / sizeof(Window)) + 1; 2107 n = (int)(sizeof(TermWin.parent) / sizeof(Window)) + 1;
2105 break; 2108 break;
2108 } 2111 }
2109 if (n > (int)(sizeof(TermWin.parent) 2112 if (n > (int)(sizeof(TermWin.parent)
2110 / sizeof(TermWin.parent[0]))) 2113 / sizeof(TermWin.parent[0])))
2111 { 2114 {
2112 D_X((stderr, "InheritPixmap Turning off")); 2115 D_X((stderr, "InheritPixmap Turning off"));
2113 XSetWindowBackground(Xdisplay, TermWin.parent[0], 2116 XSetWindowBackground(display->display, TermWin.parent[0],
2114 PixColors[Color_fg]); 2117 PixColors[Color_fg]);
2115 XSetWindowBackground(Xdisplay, TermWin.vt, 2118 XSetWindowBackground(display->display, TermWin.vt,
2116 PixColors[Color_bg]); 2119 PixColors[Color_bg]);
2117 am_transparent = 0; 2120 am_transparent = 0;
2118 /* XXX: also turn off Opt_transparent? */ 2121 /* XXX: also turn off Opt_transparent? */
2119 } 2122 }
2120 else 2123 else
2130# else 2133# else
2131 sleep(1); 2134 sleep(1);
2132# endif 2135# endif
2133 D_X((stderr, "InheritPixmap Turning on (%d parents)", i - 1)); 2136 D_X((stderr, "InheritPixmap Turning on (%d parents)", i - 1));
2134 for (n = 0; n < (unsigned int)i; n++) 2137 for (n = 0; n < (unsigned int)i; n++)
2135 XSetWindowBackgroundPixmap(Xdisplay, TermWin.parent[n], 2138 XSetWindowBackgroundPixmap(display->display, TermWin.parent[n],
2136 ParentRelative); 2139 ParentRelative);
2137 XSetWindowBackgroundPixmap(Xdisplay, TermWin.vt, 2140 XSetWindowBackgroundPixmap(display->display, TermWin.vt,
2138 ParentRelative); 2141 ParentRelative);
2139 am_transparent = 1; 2142 am_transparent = 1;
2140 } 2143 }
2141 for (; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); i++) 2144 for (; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); i++)
2142 TermWin.parent[i] = None; 2145 TermWin.parent[i] = None;
2834 { 2837 {
2835 /* 2838 /*
2836 * commands 2839 * commands
2837 */ 2840 */
2838 case 1: /* deiconify window */ 2841 case 1: /* deiconify window */
2839 XMapWindow(Xdisplay, TermWin.parent[0]); 2842 XMapWindow(display->display, TermWin.parent[0]);
2840 break; 2843 break;
2841 case 2: /* iconify window */ 2844 case 2: /* iconify window */
2842 XIconifyWindow(Xdisplay, TermWin.parent[0], 2845 XIconifyWindow(display->display, TermWin.parent[0],
2843 DefaultScreen(Xdisplay)); 2846 DefaultScreen(display->display));
2844 break; 2847 break;
2845 case 3: /* set position (pixels) */ 2848 case 3: /* set position (pixels) */
2846 XMoveWindow(Xdisplay, TermWin.parent[0], args[1], args[2]); 2849 XMoveWindow(display->display, TermWin.parent[0], args[1], args[2]);
2847 break; 2850 break;
2848 case 4: /* set size (pixels) */ 2851 case 4: /* set size (pixels) */
2849 set_widthheight ((unsigned int)args[2], (unsigned int)args[1]); 2852 set_widthheight ((unsigned int)args[2], (unsigned int)args[1]);
2850 break; 2853 break;
2851 case 5: /* raise window */ 2854 case 5: /* raise window */
2852 XRaiseWindow(Xdisplay, TermWin.parent[0]); 2855 XRaiseWindow(display->display, TermWin.parent[0]);
2853 break; 2856 break;
2854 case 6: /* lower window */ 2857 case 6: /* lower window */
2855 XLowerWindow(Xdisplay, TermWin.parent[0]); 2858 XLowerWindow(display->display, TermWin.parent[0]);
2856 break; 2859 break;
2857 case 7: /* refresh window */ 2860 case 7: /* refresh window */
2858 scr_touch (true); 2861 scr_touch (true);
2859 break; 2862 break;
2860 case 8: /* set size (chars) */ 2863 case 8: /* set size (chars) */
2868 break; 2871 break;
2869 /* 2872 /*
2870 * reports - some output format copied from XTerm 2873 * reports - some output format copied from XTerm
2871 */ 2874 */
2872 case 11: /* report window state */ 2875 case 11: /* report window state */
2873 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2876 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2874 tt_printf("\033[%dt", wattr.map_state == IsViewable ? 1 : 2); 2877 tt_printf("\033[%dt", wattr.map_state == IsViewable ? 1 : 2);
2875 break; 2878 break;
2876 case 13: /* report window position */ 2879 case 13: /* report window position */
2877 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2880 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2878 XTranslateCoordinates(Xdisplay, TermWin.parent[0], wattr.root, 2881 XTranslateCoordinates(display->display, TermWin.parent[0], wattr.root,
2879 -wattr.border_width, -wattr.border_width, 2882 -wattr.border_width, -wattr.border_width,
2880 &x, &y, &wdummy); 2883 &x, &y, &wdummy);
2881 tt_printf("\033[3;%d;%dt", x, y); 2884 tt_printf("\033[3;%d;%dt", x, y);
2882 break; 2885 break;
2883 case 14: /* report window size (pixels) */ 2886 case 14: /* report window size (pixels) */
2884 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2887 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2885 tt_printf("\033[4;%d;%dt", wattr.height, wattr.width); 2888 tt_printf("\033[4;%d;%dt", wattr.height, wattr.width);
2886 break; 2889 break;
2887 case 18: /* report window size (chars) */ 2890 case 18: /* report window size (chars) */
2888 tt_printf("\033[8;%d;%dt", TermWin.nrow, TermWin.ncol); 2891 tt_printf("\033[8;%d;%dt", TermWin.nrow, TermWin.ncol);
2889 break; 2892 break;
2890#if 0 /* XXX: currently disabled due to security concerns */ 2893#if 0 /* XXX: currently disabled due to security concerns */
2891 case 20: /* report icon label */ 2894 case 20: /* report icon label */
2892 XGetIconName(Xdisplay, TermWin.parent[0], &s); 2895 XGetIconName(display->display, TermWin.parent[0], &s);
2893 tt_printf("\033]L%-.200s\234", s ? s : ""); /* 8bit ST */ 2896 tt_printf("\033]L%-.200s\234", s ? s : ""); /* 8bit ST */
2894 break; 2897 break;
2895 case 21: /* report window title */ 2898 case 21: /* report window title */
2896 XFetchName(Xdisplay, TermWin.parent[0], &s); 2899 XFetchName(display->display, TermWin.parent[0], &s);
2897 tt_printf("\033]l%-.200s\234", s ? s : ""); /* 8bit ST */ 2900 tt_printf("\033]l%-.200s\234", s ? s : ""); /* 8bit ST */
2898 break; 2901 break;
2899#endif 2902#endif
2900 2903
2901 } 2904 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines