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.40 by pcg, Mon Feb 9 22:45:29 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
1397#ifdef TEXT_BLINK 1387#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:
1403 if (ev->xproperty.atom == xa[XA_VT_SELECTION])
1404 {
1405 if (ev->xproperty.state == PropertyNewValue)
1406 selection_property (ev->xproperty.window,
1407 ev->xproperty.atom);
1408 break;
1409 }
1410#ifdef TRANSPARENT 1392#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: 1393 case ReparentNotify:
1422 if ((Options & Opt_transparent) && check_our_parents ()) 1394 rootwin_cb (ev);
1423 { 1395 break;
1424 if (am_transparent)
1425 want_full_refresh = 1;
1426 }
1427#endif /* TRANSPARENT */ 1396#endif /* TRANSPARENT */
1428 break;
1429 1397
1430 case GraphicsExpose: 1398 case GraphicsExpose:
1431 case Expose: 1399 case Expose:
1432 if (ev->xany.window == TermWin.vt) 1400 if (ev.xany.window == TermWin.vt)
1433 { 1401 {
1434#ifdef NO_SLOW_LINK_SUPPORT 1402#ifdef NO_SLOW_LINK_SUPPORT
1435 scr_expose (ev->xexpose.x, ev->xexpose.y, 1403 scr_expose (ev.xexpose.x, ev.xexpose.y,
1436 ev->xexpose.width, ev->xexpose.height, False); 1404 ev.xexpose.width, ev.xexpose.height, False);
1437#else 1405#else
1438 // don't understand this, so commented it out 1406 // don't understand this, so commented it out
1439 scr_expose (ev->xexpose.x, ev->xexpose.y, 1407 scr_expose (ev.xexpose.x, ev.xexpose.y,
1440 ev->xexpose.width, ev->xexpose.height, False); 1408 ev.xexpose.width, ev.xexpose.height, False);
1441 //scr_expose (ev->xexpose.x, 0, 1409 //scr_expose (ev.xexpose.x, 0,
1442 // ev->xexpose.width, TermWin.height, False); 1410 // ev.xexpose.width, TermWin.height, False);
1443#endif 1411#endif
1444 want_refresh = 1; 1412 want_refresh = 1;
1445 } 1413 }
1446 else 1414 else
1447 { 1415 {
1448 XEvent unused_xevent; 1416 XEvent unused_event;
1449 1417
1450 while (XCheckTypedWindowEvent(Xdisplay, ev->xany.window, 1418 while (XCheckTypedWindowEvent(display->display, ev.xany.window,
1451 Expose, 1419 Expose,
1452 &unused_xevent)) ; 1420 &unused_event)) ;
1453 while (XCheckTypedWindowEvent(Xdisplay, ev->xany.window, 1421 while (XCheckTypedWindowEvent(display->display, ev.xany.window,
1454 GraphicsExpose, 1422 GraphicsExpose,
1455 &unused_xevent)) ; 1423 &unused_event)) ;
1456 if (isScrollbarWindow(ev->xany.window)) 1424 if (isScrollbarWindow(ev.xany.window))
1457 { 1425 {
1458 scrollBar.setIdle(); 1426 scrollBar.setIdle();
1459 scrollbar_show (0); 1427 scrollbar_show (0);
1460 } 1428 }
1461#ifdef MENUBAR 1429#ifdef MENUBAR
1462 if (menubar_visible () && isMenuBarWindow(ev->xany.window)) 1430 if (menubar_visible () && isMenuBarWindow(ev.xany.window))
1463 menubar_expose (); 1431 menubar_expose ();
1464#endif 1432#endif
1465#ifdef RXVT_GRAPHICS 1433#ifdef RXVT_GRAPHICS
1466 Gr_expose (ev->xany.window); 1434 Gr_expose (ev.xany.window);
1467#endif 1435#endif
1468 1436
1469 } 1437 }
1470 break; 1438 break;
1471 1439
1473#ifdef POINTER_BLANK 1441#ifdef POINTER_BLANK
1474 if (hidden_pointer) 1442 if (hidden_pointer)
1475 pointer_unblank (); 1443 pointer_unblank ();
1476#endif 1444#endif
1477#if MENUBAR 1445#if MENUBAR
1478 if (isMenuBarWindow(ev->xany.window)) 1446 if (isMenuBarWindow(ev.xany.window))
1479 { 1447 {
1480 menubar_control (&(ev->xbutton)); 1448 menubar_control (&(ev.xbutton));
1481 break; 1449 break;
1482 } 1450 }
1483#endif 1451#endif
1484 if ((PrivateModes & PrivMode_mouse_report) && !(bypass_keystate)) 1452 if ((PrivateModes & PrivMode_mouse_report) && !(bypass_keystate))
1485 break; 1453 break;
1486 1454
1487 if (ev->xany.window == TermWin.vt) 1455 if (ev.xany.window == TermWin.vt)
1488 { 1456 {
1489 if ((ev->xbutton.state & (Button1Mask | Button3Mask))) 1457 if ((ev.xbutton.state & (Button1Mask | Button3Mask)))
1490 { 1458 {
1491 while (XCheckTypedWindowEvent(Xdisplay, TermWin.vt, 1459 while (XCheckTypedWindowEvent (display->display, TermWin.vt, MotionNotify, &ev))
1492 MotionNotify, ev)) ; 1460 ;
1461
1493 XQueryPointer(Xdisplay, TermWin.vt, 1462 XQueryPointer(display->display, TermWin.vt,
1494 &unused_root, &unused_child, 1463 &unused_root, &unused_child,
1495 &unused_root_x, &unused_root_y, 1464 &unused_root_x, &unused_root_y,
1496 &(ev->xbutton.x), &(ev->xbutton.y), 1465 &(ev.xbutton.x), &(ev.xbutton.y),
1497 &unused_mask); 1466 &unused_mask);
1498#ifdef MOUSE_THRESHOLD 1467#ifdef MOUSE_THRESHOLD
1499 /* deal with a `jumpy' mouse */ 1468 /* deal with a `jumpy' mouse */
1500 if ((ev->xmotion.time - MEvent.time) > MOUSE_THRESHOLD) 1469 if ((ev.xmotion.time - MEvent.time) > MOUSE_THRESHOLD)
1501 { 1470 {
1502#endif 1471#endif
1503 selection_extend ((ev->xbutton.x), (ev->xbutton.y), 1472 selection_extend ((ev.xbutton.x), (ev.xbutton.y),
1504 (ev->xbutton.state & Button3Mask) ? 2 : 0); 1473 (ev.xbutton.state & Button3Mask) ? 2 : 0);
1505#ifdef SELECTION_SCROLLING 1474#ifdef SELECTION_SCROLLING
1506 if (ev->xbutton.y < TermWin.int_bwidth 1475 if (ev.xbutton.y < TermWin.int_bwidth
1507 || Pixel2Row(ev->xbutton.y) > (TermWin.nrow-1)) 1476 || Pixel2Row(ev.xbutton.y) > (TermWin.nrow-1))
1508 { 1477 {
1509 int dist; 1478 int dist;
1510 1479
1511 pending_scroll_selection=1; 1480 pending_scroll_selection=1;
1512 1481
1517 scroll_selection_delay=SCROLLBAR_CONTINUOUS_DELAY; 1486 scroll_selection_delay=SCROLLBAR_CONTINUOUS_DELAY;
1518 1487
1519 /* save the event params so we can highlight 1488 /* save the event params so we can highlight
1520 * the selection in the pending-scroll loop 1489 * the selection in the pending-scroll loop
1521 */ 1490 */
1522 selection_save_x=ev->xbutton.x; 1491 selection_save_x=ev.xbutton.x;
1523 selection_save_y=ev->xbutton.y; 1492 selection_save_y=ev.xbutton.y;
1524 selection_save_state= 1493 selection_save_state=
1525 (ev->xbutton.state & Button3Mask) ? 2 : 0; 1494 (ev.xbutton.state & Button3Mask) ? 2 : 0;
1526 1495
1527 /* calc number of lines to scroll */ 1496 /* calc number of lines to scroll */
1528 if (ev->xbutton.y<TermWin.int_bwidth) 1497 if (ev.xbutton.y<TermWin.int_bwidth)
1529 { 1498 {
1530 scroll_selection_dir = UP; 1499 scroll_selection_dir = UP;
1531 dist = TermWin.int_bwidth - ev->xbutton.y; 1500 dist = TermWin.int_bwidth - ev.xbutton.y;
1532 } 1501 }
1533 else 1502 else
1534 { 1503 {
1535 scroll_selection_dir = DN; 1504 scroll_selection_dir = DN;
1536 dist = ev->xbutton.y - 1505 dist = ev.xbutton.y -
1537 (TermWin.int_bwidth + TermWin.height); 1506 (TermWin.int_bwidth + TermWin.height);
1538 } 1507 }
1539 scroll_selection_lines=(Pixel2Height(dist)/ 1508 scroll_selection_lines=(Pixel2Height(dist)/
1540 SELECTION_SCROLL_LINE_SPEEDUP)+1; 1509 SELECTION_SCROLL_LINE_SPEEDUP)+1;
1541 MIN_IT(scroll_selection_lines, 1510 MIN_IT(scroll_selection_lines,
1554 } 1523 }
1555#endif 1524#endif
1556 1525
1557 } 1526 }
1558 } 1527 }
1559 else if (isScrollbarWindow(ev->xany.window) && scrollbar_isMotion()) 1528 else if (isScrollbarWindow(ev.xany.window) && scrollbar_isMotion())
1560 { 1529 {
1561 while (XCheckTypedWindowEvent(Xdisplay, scrollBar.win, 1530 while (XCheckTypedWindowEvent(display->display, scrollBar.win,
1562 MotionNotify, ev)) ; 1531 MotionNotify, &ev)) ;
1563 XQueryPointer(Xdisplay, scrollBar.win, 1532 XQueryPointer(display->display, scrollBar.win,
1564 &unused_root, &unused_child, 1533 &unused_root, &unused_child,
1565 &unused_root_x, &unused_root_y, 1534 &unused_root_x, &unused_root_y,
1566 &(ev->xbutton.x), &(ev->xbutton.y), 1535 &(ev.xbutton.x), &(ev.xbutton.y),
1567 &unused_mask); 1536 &unused_mask);
1568 scr_move_to (scrollbar_position(ev->xbutton.y) - csrO, 1537 scr_move_to (scrollbar_position(ev.xbutton.y) - csrO,
1569 scrollbar_size()); 1538 scrollbar_size());
1570 scr_refresh (refresh_type); 1539 scr_refresh (refresh_type);
1571 refresh_limit = 0; 1540 refresh_limit = 0;
1572 scrollbar_show (1); 1541 scrollbar_show (1);
1573 } 1542 }
1574 break; 1543 break;
1575 } 1544 }
1576} 1545}
1577 1546
1578void 1547void
1548rxvt_term::rootwin_cb (XEvent &ev)
1549{
1550 SET_R (this);
1551 SET_LOCALE (locale);
1552
1553 switch (ev.type)
1554 {
1555 case PropertyNotify:
1556 if (ev.xproperty.atom == xa[XA_VT_SELECTION])
1557 {
1558 if (ev.xproperty.state == PropertyNewValue)
1559 selection_property (ev.xproperty.window, ev.xproperty.atom);
1560 break;
1561 }
1562#ifdef TRANSPARENT
1563 else
1564 {
1565 /*
1566 * if user used some Esetroot compatible prog to set the root bg,
1567 * use the property to determine the pixmap. We use it later on.
1568 */
1569 if (xa[XA_XROOTPMAPID] == 0)
1570 xa[XA_XROOTPMAPID] = XInternAtom(display->display, "_XROOTPMAP_ID", False);
1571
1572 if (ev.xproperty.atom != xa[XA_XROOTPMAPID])
1573 return;
1574 }
1575
1576 /* FALLTHROUGH */
1577 case ReparentNotify:
1578 if ((Options & Opt_transparent) && check_our_parents ())
1579 if (am_transparent)
1580 want_full_refresh = 1;
1581 break;
1582#endif
1583 }
1584}
1585
1586void
1579rxvt_term::button_press (XButtonEvent *ev) 1587rxvt_term::button_press (const XButtonEvent &ev)
1580{ 1588{
1581 int reportmode = 0, clickintime; 1589 int reportmode = 0, clickintime;
1582 1590
1583 bypass_keystate = ev->state & (ModMetaMask | ShiftMask); 1591 bypass_keystate = ev.state & (ModMetaMask | ShiftMask);
1584 if (!bypass_keystate) 1592 if (!bypass_keystate)
1585 reportmode = !!(PrivateModes & PrivMode_mouse_report); 1593 reportmode = !!(PrivateModes & PrivMode_mouse_report);
1586 /* 1594 /*
1587 * VT window processing of button press 1595 * VT window processing of button press
1588 */ 1596 */
1589 if (ev->window == TermWin.vt) 1597 if (ev.window == TermWin.vt)
1590 { 1598 {
1591#if RXVT_GRAPHICS 1599#if RXVT_GRAPHICS
1592 if (ev->subwindow != None) 1600 if (ev.subwindow != None)
1593 rxvt_Gr_ButtonPress (ev->x, ev->y); 1601 rxvt_Gr_ButtonPress (ev.x, ev.y);
1594 else 1602 else
1595#endif 1603#endif
1596 1604
1597 { 1605 {
1598 clickintime = ev->time - MEvent.time < MULTICLICK_TIME; 1606 clickintime = ev.time - MEvent.time < MULTICLICK_TIME;
1599 if (reportmode) 1607 if (reportmode)
1600 { 1608 {
1601 /* mouse report from vt window */ 1609 /* mouse report from vt window */
1602 /* save the xbutton state (for ButtonRelease) */ 1610 /* save the xbutton state (for ButtonRelease) */
1603 MEvent.state = ev->state; 1611 MEvent.state = ev.state;
1604#ifdef MOUSE_REPORT_DOUBLECLICK 1612#ifdef MOUSE_REPORT_DOUBLECLICK
1605 if (ev->button == MEvent.button && clickintime) 1613 if (ev.button == MEvent.button && clickintime)
1606 { 1614 {
1607 /* same button, within alloted time */ 1615 /* same button, within alloted time */
1608 MEvent.clicks++; 1616 MEvent.clicks++;
1609 if (MEvent.clicks > 1) 1617 if (MEvent.clicks > 1)
1610 { 1618 {
1619 } 1627 }
1620 else 1628 else
1621 { 1629 {
1622 /* different button, or time expired */ 1630 /* different button, or time expired */
1623 MEvent.clicks = 1; 1631 MEvent.clicks = 1;
1624 MEvent.button = ev->button; 1632 MEvent.button = ev.button;
1625 mouse_report (ev); 1633 mouse_report (ev);
1626 } 1634 }
1627#else 1635#else
1628 MEvent.button = ev->button; 1636 MEvent.button = ev.button;
1629 mouse_report (ev); 1637 mouse_report (ev);
1630#endif /* MOUSE_REPORT_DOUBLECLICK */ 1638#endif /* MOUSE_REPORT_DOUBLECLICK */
1631 1639
1632 } 1640 }
1633 else 1641 else
1634 { 1642 {
1635 if (ev->button != MEvent.button) 1643 if (ev.button != MEvent.button)
1636 MEvent.clicks = 0; 1644 MEvent.clicks = 0;
1637 switch (ev->button) 1645 switch (ev.button)
1638 { 1646 {
1639 case Button1: 1647 case Button1:
1640 /* allow shift+left click to extend selection */ 1648 /* allow shift+left click to extend selection */
1641 if (ev->state & ShiftMask && !(PrivateModes & PrivMode_mouse_report)) 1649 if (ev.state & ShiftMask && !(PrivateModes & PrivMode_mouse_report))
1642 { 1650 {
1643 if (MEvent.button == Button1 && clickintime) 1651 if (MEvent.button == Button1 && clickintime)
1644 selection_rotate (ev->x, ev->y); 1652 selection_rotate (ev.x, ev.y);
1645 else 1653 else
1646 selection_extend (ev->x, ev->y, 1); 1654 selection_extend (ev.x, ev.y, 1);
1647 } 1655 }
1648 else 1656 else
1649 { 1657 {
1650 if (MEvent.button == Button1 && clickintime) 1658 if (MEvent.button == Button1 && clickintime)
1651 MEvent.clicks++; 1659 MEvent.clicks++;
1652 else 1660 else
1653 MEvent.clicks = 1; 1661 MEvent.clicks = 1;
1654 1662
1655 selection_click (MEvent.clicks, ev->x, ev->y); 1663 selection_click (MEvent.clicks, ev.x, ev.y);
1656 } 1664 }
1657 1665
1658 MEvent.button = Button1; 1666 MEvent.button = Button1;
1659 break; 1667 break;
1660 1668
1661 case Button3: 1669 case Button3:
1662 if (MEvent.button == Button3 && clickintime) 1670 if (MEvent.button == Button3 && clickintime)
1663 selection_rotate (ev->x, ev->y); 1671 selection_rotate (ev.x, ev.y);
1664 else 1672 else
1665 selection_extend (ev->x, ev->y, 1); 1673 selection_extend (ev.x, ev.y, 1);
1666 MEvent.button = Button3; 1674 MEvent.button = Button3;
1667 break; 1675 break;
1668 } 1676 }
1669 } 1677 }
1670 MEvent.time = ev->time; 1678 MEvent.time = ev.time;
1671 return; 1679 return;
1672 } 1680 }
1673 } 1681 }
1674 1682
1675 /* 1683 /*
1676 * Scrollbar window processing of button press 1684 * Scrollbar window processing of button press
1677 */ 1685 */
1678 if (isScrollbarWindow(ev->window)) 1686 if (isScrollbarWindow(ev.window))
1679 { 1687 {
1680 scrollBar.setIdle (); 1688 scrollBar.setIdle ();
1681 /* 1689 /*
1682 * Rxvt-style scrollbar: 1690 * Rxvt-style scrollbar:
1683 * move up if mouse is above slider 1691 * move up if mouse is above slider
1695 * Mouse report disabled scrollbar: 1703 * Mouse report disabled scrollbar:
1696 * arrow buttons - send up/down 1704 * arrow buttons - send up/down
1697 * click on scrollbar - send pageup/down 1705 * click on scrollbar - send pageup/down
1698 */ 1706 */
1699 if ((scrollBar.style == R_SB_NEXT 1707 if ((scrollBar.style == R_SB_NEXT
1700 && scrollbarnext_upButton(ev->y)) 1708 && scrollbarnext_upButton(ev.y))
1701 || (scrollBar.style == R_SB_RXVT 1709 || (scrollBar.style == R_SB_RXVT
1702 && scrollbarrxvt_upButton(ev->y))) 1710 && scrollbarrxvt_upButton(ev.y)))
1703 tt_printf("\033[A"); 1711 tt_printf("\033[A");
1704 else if ((scrollBar.style == R_SB_NEXT 1712 else if ((scrollBar.style == R_SB_NEXT
1705 && scrollbarnext_dnButton(ev->y)) 1713 && scrollbarnext_dnButton(ev.y))
1706 || (scrollBar.style == R_SB_RXVT 1714 || (scrollBar.style == R_SB_RXVT
1707 && scrollbarrxvt_dnButton(ev->y))) 1715 && scrollbarrxvt_dnButton(ev.y)))
1708 tt_printf("\033[B"); 1716 tt_printf("\033[B");
1709 else 1717 else
1710 switch (ev->button) 1718 switch (ev.button)
1711 { 1719 {
1712 case Button2: 1720 case Button2:
1713 tt_printf("\014"); 1721 tt_printf("\014");
1714 break; 1722 break;
1715 case Button1: 1723 case Button1:
1726 { 1734 {
1727 char upordown = 0; 1735 char upordown = 0;
1728 1736
1729 if (scrollBar.style == R_SB_NEXT) 1737 if (scrollBar.style == R_SB_NEXT)
1730 { 1738 {
1731 if (scrollbarnext_upButton(ev->y)) 1739 if (scrollbarnext_upButton(ev.y))
1732 upordown = -1; /* up */ 1740 upordown = -1; /* up */
1733 else if (scrollbarnext_dnButton(ev->y)) 1741 else if (scrollbarnext_dnButton(ev.y))
1734 upordown = 1; /* down */ 1742 upordown = 1; /* down */
1735 } 1743 }
1736 else if (scrollBar.style == R_SB_RXVT) 1744 else if (scrollBar.style == R_SB_RXVT)
1737 { 1745 {
1738 if (scrollbarrxvt_upButton(ev->y)) 1746 if (scrollbarrxvt_upButton(ev.y))
1739 upordown = -1; /* up */ 1747 upordown = -1; /* up */
1740 else if (scrollbarrxvt_dnButton(ev->y)) 1748 else if (scrollbarrxvt_dnButton(ev.y))
1741 upordown = 1; /* down */ 1749 upordown = 1; /* down */
1742 } 1750 }
1743 if (upordown) 1751 if (upordown)
1744 { 1752 {
1745#ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING 1753#ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING
1752 else 1760 else
1753 scrollBar.setDn (); 1761 scrollBar.setDn ();
1754 } 1762 }
1755 } 1763 }
1756 else 1764 else
1757 switch (ev->button) 1765 switch (ev.button)
1758 { 1766 {
1759 case Button2: 1767 case Button2:
1760 switch (scrollbar_align) 1768 switch (scrollbar_align)
1761 { 1769 {
1762 case R_SB_ALIGN_TOP: 1770 case R_SB_ALIGN_TOP:
1768 case R_SB_ALIGN_BOTTOM: 1776 case R_SB_ALIGN_BOTTOM:
1769 csrO = scrollBar.bot - scrollBar.top; 1777 csrO = scrollBar.bot - scrollBar.top;
1770 break; 1778 break;
1771 } 1779 }
1772 if (scrollBar.style == R_SB_XTERM 1780 if (scrollBar.style == R_SB_XTERM
1773 || scrollbar_above_slider(ev->y) 1781 || scrollbar_above_slider(ev.y)
1774 || scrollbar_below_slider(ev->y)) 1782 || scrollbar_below_slider(ev.y))
1775 scr_move_to ( scrollbar_position(ev->y) - csrO, 1783 scr_move_to ( scrollbar_position(ev.y) - csrO,
1776 scrollbar_size()); 1784 scrollbar_size());
1777 scrollBar.setMotion (); 1785 scrollBar.setMotion ();
1778 break; 1786 break;
1779 1787
1780 case Button1: 1788 case Button1:
1781 if (scrollbar_align == R_SB_ALIGN_CENTRE) 1789 if (scrollbar_align == R_SB_ALIGN_CENTRE)
1782 csrO = ev->y - scrollBar.top; 1790 csrO = ev.y - scrollBar.top;
1783 /* FALLTHROUGH */ 1791 /* FALLTHROUGH */
1784 1792
1785 case Button3: 1793 case Button3:
1786 if (scrollBar.style != R_SB_XTERM) 1794 if (scrollBar.style != R_SB_XTERM)
1787 { 1795 {
1788 if (scrollbar_above_slider(ev->y)) 1796 if (scrollbar_above_slider(ev.y))
1789# ifdef RXVT_SCROLL_FULL 1797# ifdef RXVT_SCROLL_FULL
1790 scr_page (UP, TermWin.nrow - 1); 1798 scr_page (UP, TermWin.nrow - 1);
1791# else 1799# else
1792 scr_page (UP, TermWin.nrow / 4); 1800 scr_page (UP, TermWin.nrow / 4);
1793# endif 1801# endif
1794 else if (scrollbar_below_slider(ev->y)) 1802 else if (scrollbar_below_slider(ev.y))
1795# ifdef RXVT_SCROLL_FULL 1803# ifdef RXVT_SCROLL_FULL
1796 scr_page (DN, TermWin.nrow - 1); 1804 scr_page (DN, TermWin.nrow - 1);
1797# else 1805# else
1798 scr_page (DN, TermWin.nrow / 4); 1806 scr_page (DN, TermWin.nrow / 4);
1799# endif 1807# endif
1800 else 1808 else
1801 scrollBar.setMotion (); 1809 scrollBar.setMotion ();
1802 } 1810 }
1803 else 1811 else
1804 { 1812 {
1805 scr_page ((ev->button == Button1 ? DN : UP), 1813 scr_page ((ev.button == Button1 ? DN : UP),
1806 (TermWin.nrow 1814 (TermWin.nrow
1807 * scrollbar_position(ev->y) 1815 * scrollbar_position(ev.y)
1808 / scrollbar_size())); 1816 / scrollbar_size()));
1809 } 1817 }
1810 break; 1818 break;
1811 } 1819 }
1812 } 1820 }
1814 } 1822 }
1815#if MENUBAR 1823#if MENUBAR
1816 /* 1824 /*
1817 * Menubar window processing of button press 1825 * Menubar window processing of button press
1818 */ 1826 */
1819 if (isMenuBarWindow(ev->window)) 1827 if (isMenuBarWindow(ev.window))
1820 menubar_control (ev); 1828 menubar_control (ev);
1821#endif 1829#endif
1822} 1830}
1823 1831
1824void 1832void
1825rxvt_term::button_release (XButtonEvent *ev) 1833rxvt_term::button_release (const XButtonEvent &ev)
1826{ 1834{
1827 int reportmode = 0; 1835 int reportmode = 0;
1828 1836
1829 csrO = 0; /* reset csr Offset */ 1837 csrO = 0; /* reset csr Offset */
1830 if (!bypass_keystate) 1838 if (!bypass_keystate)
1831 reportmode = !!(PrivateModes & PrivMode_mouse_report); 1839 reportmode = !!(PrivateModes & PrivMode_mouse_report);
1832 1840
1840 1848
1841 } 1849 }
1842#ifdef SELECTION_SCROLLING 1850#ifdef SELECTION_SCROLLING
1843 pending_scroll_selection=0; 1851 pending_scroll_selection=0;
1844#endif 1852#endif
1845 if (ev->window == TermWin.vt) 1853 if (ev.window == TermWin.vt)
1846 { 1854 {
1847#ifdef RXVT_GRAPHICS 1855#ifdef RXVT_GRAPHICS
1848 if (ev->subwindow != None) 1856 if (ev.subwindow != None)
1849 rxvt_Gr_ButtonRelease(ev->x, ev->y); 1857 rxvt_Gr_ButtonRelease(ev.x, ev.y);
1850 else 1858 else
1851#endif 1859#endif
1852 1860
1853 { 1861 {
1854 if (reportmode) 1862 if (reportmode)
1855 { 1863 {
1856 /* mouse report from vt window */ 1864 /* mouse report from vt window */
1857 /* don't report release of wheel "buttons" */ 1865 /* don't report release of wheel "buttons" */
1858 if (ev->button >= 4) 1866 if (ev.button >= 4)
1859 return; 1867 return;
1860#ifdef MOUSE_REPORT_DOUBLECLICK 1868#ifdef MOUSE_REPORT_DOUBLECLICK
1861 /* only report the release of 'slow' single clicks */ 1869 /* only report the release of 'slow' single clicks */
1862 if (MEvent.button != AnyButton 1870 if (MEvent.button != AnyButton
1863 && (ev->button != MEvent.button 1871 && (ev.button != MEvent.button
1864 || (ev->time - MEvent.time 1872 || (ev.time - MEvent.time
1865 > MULTICLICK_TIME / 2))) 1873 > MULTICLICK_TIME / 2)))
1866 { 1874 {
1867 MEvent.clicks = 0; 1875 MEvent.clicks = 0;
1868 MEvent.button = AnyButton; 1876 MEvent.button = AnyButton;
1869 mouse_report (ev); 1877 mouse_report (ev);
1878 * dumb hack to compensate for the failure of click-and-drag 1886 * dumb hack to compensate for the failure of click-and-drag
1879 * when overriding mouse reporting 1887 * when overriding mouse reporting
1880 */ 1888 */
1881 if (PrivateModes & PrivMode_mouse_report 1889 if (PrivateModes & PrivMode_mouse_report
1882 && bypass_keystate 1890 && bypass_keystate
1883 && ev->button == Button1 && MEvent.clicks <= 1) 1891 && ev.button == Button1 && MEvent.clicks <= 1)
1884 selection_extend (ev->x, ev->y, 0); 1892 selection_extend (ev.x, ev.y, 0);
1885 1893
1886 switch (ev->button) 1894 switch (ev.button)
1887 { 1895 {
1888 case Button1: 1896 case Button1:
1889 case Button3: 1897 case Button3:
1890 selection_make (ev->time); 1898 selection_make (ev.time);
1891 break; 1899 break;
1892 case Button2: 1900 case Button2:
1893 selection_request (ev->time, ev->x, ev->y); 1901 selection_request (ev.time, ev.x, ev.y);
1894 break; 1902 break;
1895#ifdef MOUSE_WHEEL 1903#ifdef MOUSE_WHEEL
1896 case Button4: 1904 case Button4:
1897 case Button5: 1905 case Button5:
1898 { 1906 {
1899 int i; 1907 int i;
1900 page_dirn v; 1908 page_dirn v;
1901 1909
1902 v = (ev->button == Button4) ? UP : DN; 1910 v = (ev.button == Button4) ? UP : DN;
1903 if (ev->state & ShiftMask) 1911 if (ev.state & ShiftMask)
1904 i = 1; 1912 i = 1;
1905 else if ((Options & Opt_mouseWheelScrollPage)) 1913 else if ((Options & Opt_mouseWheelScrollPage))
1906 i = TermWin.nrow - 1; 1914 i = TermWin.nrow - 1;
1907 else 1915 else
1908 i = 5; 1916 i = 5;
1909# ifdef MOUSE_SLIP_WHEELING 1917# ifdef MOUSE_SLIP_WHEELING
1910 if (ev->state & ControlMask) 1918 if (ev.state & ControlMask)
1911 { 1919 {
1912 mouse_slip_wheel_speed += (v ? -1 : 1); 1920 mouse_slip_wheel_speed += (v ? -1 : 1);
1913 mouse_slip_wheel_delay = SCROLLBAR_CONTINUOUS_DELAY; 1921 mouse_slip_wheel_delay = SCROLLBAR_CONTINUOUS_DELAY;
1914 } 1922 }
1915# endif 1923# endif
1932 1940
1933 } 1941 }
1934 } 1942 }
1935 } 1943 }
1936#ifdef MENUBAR 1944#ifdef MENUBAR
1937 else if (isMenuBarWindow(ev->window)) 1945 else if (isMenuBarWindow(ev.window))
1938 menubar_control (ev); 1946 menubar_control (ev);
1939#endif 1947#endif
1940} 1948}
1941 1949
1942 1950
1959 pchanged = 0; 1967 pchanged = 0;
1960 1968
1961 if (!(Options & Opt_transparent)) 1969 if (!(Options & Opt_transparent))
1962 return pchanged; /* Don't try any more */ 1970 return pchanged; /* Don't try any more */
1963 1971
1964 XGetWindowAttributes(Xdisplay, Xroot, &wrootattr); 1972 XGetWindowAttributes(display->display, display->root, &wrootattr);
1965 rootdepth = wrootattr.depth; 1973 rootdepth = wrootattr.depth;
1966 1974
1967 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 1975 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
1968 if (rootdepth != wattr.depth) 1976 if (rootdepth != wattr.depth)
1969 { 1977 {
1970 if (am_transparent) 1978 if (am_transparent)
1971 { 1979 {
1972 pchanged = 1; 1980 pchanged = 1;
1973 XSetWindowBackground(Xdisplay, TermWin.vt, 1981 XSetWindowBackground(display->display, TermWin.vt,
1974 PixColors[Color_bg]); 1982 PixColors[Color_bg]);
1975 am_transparent = am_pixmap_trans = 0; 1983 am_transparent = am_pixmap_trans = 0;
1976 } 1984 }
1977 return pchanged; /* Don't try any more */ 1985 return pchanged; /* Don't try any more */
1978 } 1986 }
1979 1987
1980 /* Get all X ops out of the queue so that our information is up-to-date. */ 1988 /* Get all X ops out of the queue so that our information is up-to-date. */
1981 XSync(Xdisplay, False); 1989 XSync(display->display, False);
1982 1990
1983 /* 1991 /*
1984 * Make the frame window set by the window manager have 1992 * Make the frame window set by the window manager have
1985 * the root background. Some window managers put multiple nested frame 1993 * the root background. Some window managers put multiple nested frame
1986 * windows for each client, so we have to take care about that. 1994 * windows for each client, so we have to take care about that.
1987 */ 1995 */
1988 i = (xa[XA_XROOTPMAPID] != 0 1996 i = (xa[XA_XROOTPMAPID] != 0
1989 && (XGetWindowProperty(Xdisplay, Xroot, xa[XA_XROOTPMAPID], 1997 && (XGetWindowProperty(display->display, display->root, xa[XA_XROOTPMAPID],
1990 0L, 1L, False, XA_PIXMAP, &atype, &aformat, 1998 0L, 1L, False, XA_PIXMAP, &atype, &aformat,
1991 &nitems, &bytes_after, &prop) == Success)); 1999 &nitems, &bytes_after, &prop) == Success));
1992 if (!i || prop == NULL) 2000 if (!i || prop == NULL)
1993 have_pixmap = 0; 2001 have_pixmap = 0;
1994 else 2002 else
1998 XFree(prop); 2006 XFree(prop);
1999 } 2007 }
2000 if (have_pixmap) 2008 if (have_pixmap)
2001 { 2009 {
2002 /* 2010 /*
2003 * Copy Xroot pixmap transparency 2011 * Copy display->root pixmap transparency
2004 */ 2012 */
2005 int sx, sy, nx, ny; 2013 int sx, sy, nx, ny;
2006 unsigned int nw, nh; 2014 unsigned int nw, nh;
2007 Window cr; 2015 Window cr;
2008 XImage *image; 2016 XImage *image;
2009 GC gc; 2017 GC gc;
2010 XGCValues gcvalue; 2018 XGCValues gcvalue;
2011 2019
2012 XTranslateCoordinates(Xdisplay, TermWin.parent[0], Xroot, 2020 XTranslateCoordinates(display->display, TermWin.parent[0], display->root,
2013 0, 0, &sx, &sy, &cr); 2021 0, 0, &sx, &sy, &cr);
2014 nw = (unsigned int)szHint.width; 2022 nw = (unsigned int)szHint.width;
2015 nh = (unsigned int)szHint.height; 2023 nh = (unsigned int)szHint.height;
2016 nx = ny = 0; 2024 nx = ny = 0;
2017 if (sx < 0) 2025 if (sx < 0)
2027 sy = 0; 2035 sy = 0;
2028 } 2036 }
2029 MIN_IT(nw, (unsigned int)(wrootattr.width - sx)); 2037 MIN_IT(nw, (unsigned int)(wrootattr.width - sx));
2030 MIN_IT(nh, (unsigned int)(wrootattr.height - sy)); 2038 MIN_IT(nh, (unsigned int)(wrootattr.height - sy));
2031 allowedxerror = -1; 2039 allowedxerror = -1;
2032 image = XGetImage(Xdisplay, rootpixmap, sx, sy, nw, nh, AllPlanes, 2040 image = XGetImage(display->display, rootpixmap, sx, sy, nw, nh, AllPlanes,
2033 ZPixmap); 2041 ZPixmap);
2034 /* XXX: handle BadMatch - usually because we're outside the pixmap */ 2042 /* XXX: handle BadMatch - usually because we're outside the pixmap */
2035 /* XXX: may need a delay here? */ 2043 /* XXX: may need a delay here? */
2036 allowedxerror = 0; 2044 allowedxerror = 0;
2037 if (image == NULL) 2045 if (image == NULL)
2039 if (am_transparent && am_pixmap_trans) 2047 if (am_transparent && am_pixmap_trans)
2040 { 2048 {
2041 pchanged = 1; 2049 pchanged = 1;
2042 if (TermWin.pixmap != None) 2050 if (TermWin.pixmap != None)
2043 { 2051 {
2044 XFreePixmap(Xdisplay, TermWin.pixmap); 2052 XFreePixmap(display->display, TermWin.pixmap);
2045 TermWin.pixmap = None; 2053 TermWin.pixmap = None;
2046 } 2054 }
2047 } 2055 }
2048 am_pixmap_trans = 0; 2056 am_pixmap_trans = 0;
2049 } 2057 }
2050 else 2058 else
2051 { 2059 {
2052 if (TermWin.pixmap != None) 2060 if (TermWin.pixmap != None)
2053 XFreePixmap(Xdisplay, TermWin.pixmap); 2061 XFreePixmap(display->display, TermWin.pixmap);
2054 TermWin.pixmap = XCreatePixmap(Xdisplay, TermWin.vt, 2062 TermWin.pixmap = XCreatePixmap(display->display, TermWin.vt,
2055 (unsigned int)szHint.width, 2063 (unsigned int)szHint.width,
2056 (unsigned int)szHint.height, 2064 (unsigned int)szHint.height,
2057 (unsigned int)image->depth); 2065 (unsigned int)image->depth);
2058 gc = XCreateGC(Xdisplay, TermWin.vt, 0UL, &gcvalue); 2066 gc = XCreateGC(display->display, TermWin.vt, 0UL, &gcvalue);
2059 XPutImage(Xdisplay, TermWin.pixmap, gc, image, 0, 0, 2067 XPutImage(display->display, TermWin.pixmap, gc, image, 0, 0,
2060 nx, ny, (unsigned int)image->width, 2068 nx, ny, (unsigned int)image->width,
2061 (unsigned int)image->height); 2069 (unsigned int)image->height);
2062 XFreeGC(Xdisplay, gc); 2070 XFreeGC(display->display, gc);
2063 XDestroyImage(image); 2071 XDestroyImage(image);
2064 XSetWindowBackgroundPixmap(Xdisplay, TermWin.vt, 2072 XSetWindowBackgroundPixmap(display->display, TermWin.vt,
2065 TermWin.pixmap); 2073 TermWin.pixmap);
2066 if (!am_transparent || !am_pixmap_trans) 2074 if (!am_transparent || !am_pixmap_trans)
2067 pchanged = 1; 2075 pchanged = 1;
2068 am_transparent = am_pixmap_trans = 1; 2076 am_transparent = am_pixmap_trans = 1;
2069 } 2077 }
2072 { 2080 {
2073 unsigned int n; 2081 unsigned int n;
2074 /* 2082 /*
2075 * InheritPixmap transparency 2083 * InheritPixmap transparency
2076 */ 2084 */
2077 D_X((stderr, "InheritPixmap Seeking to %08lx", Xroot)); 2085 D_X((stderr, "InheritPixmap Seeking to %08lx", display->root));
2078 for (i = 1; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); 2086 for (i = 1; i < (int)(sizeof(TermWin.parent) / sizeof(Window));
2079 i++) 2087 i++)
2080 { 2088 {
2081 oldp = TermWin.parent[i]; 2089 oldp = TermWin.parent[i];
2082 XQueryTree(Xdisplay, TermWin.parent[i - 1], &root, 2090 XQueryTree(display->display, TermWin.parent[i - 1], &root,
2083 &TermWin.parent[i], &list, &n); 2091 &TermWin.parent[i], &list, &n);
2084 XFree(list); 2092 XFree(list);
2085 D_X((stderr, "InheritPixmap Parent[%d] = %08lx", i, TermWin.parent[i])); 2093 D_X((stderr, "InheritPixmap Parent[%d] = %08lx", i, TermWin.parent[i]));
2086 if (TermWin.parent[i] == Xroot) 2094 if (TermWin.parent[i] == display->root)
2087 { 2095 {
2088 if (oldp != None) 2096 if (oldp != None)
2089 pchanged = 1; 2097 pchanged = 1;
2090 break; 2098 break;
2091 } 2099 }
2095 n = 0; 2103 n = 0;
2096 if (pchanged) 2104 if (pchanged)
2097 { 2105 {
2098 for (; n < (unsigned int)i; n++) 2106 for (; n < (unsigned int)i; n++)
2099 { 2107 {
2100 XGetWindowAttributes(Xdisplay, TermWin.parent[n], &wattr); 2108 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")); 2109 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) 2110 if (wattr.depth != rootdepth || wattr.c_class == InputOnly)
2103 { 2111 {
2104 n = (int)(sizeof(TermWin.parent) / sizeof(Window)) + 1; 2112 n = (int)(sizeof(TermWin.parent) / sizeof(Window)) + 1;
2105 break; 2113 break;
2108 } 2116 }
2109 if (n > (int)(sizeof(TermWin.parent) 2117 if (n > (int)(sizeof(TermWin.parent)
2110 / sizeof(TermWin.parent[0]))) 2118 / sizeof(TermWin.parent[0])))
2111 { 2119 {
2112 D_X((stderr, "InheritPixmap Turning off")); 2120 D_X((stderr, "InheritPixmap Turning off"));
2113 XSetWindowBackground(Xdisplay, TermWin.parent[0], 2121 XSetWindowBackground(display->display, TermWin.parent[0],
2114 PixColors[Color_fg]); 2122 PixColors[Color_fg]);
2115 XSetWindowBackground(Xdisplay, TermWin.vt, 2123 XSetWindowBackground(display->display, TermWin.vt,
2116 PixColors[Color_bg]); 2124 PixColors[Color_bg]);
2117 am_transparent = 0; 2125 am_transparent = 0;
2118 /* XXX: also turn off Opt_transparent? */ 2126 /* XXX: also turn off Opt_transparent? */
2119 } 2127 }
2120 else 2128 else
2130# else 2138# else
2131 sleep(1); 2139 sleep(1);
2132# endif 2140# endif
2133 D_X((stderr, "InheritPixmap Turning on (%d parents)", i - 1)); 2141 D_X((stderr, "InheritPixmap Turning on (%d parents)", i - 1));
2134 for (n = 0; n < (unsigned int)i; n++) 2142 for (n = 0; n < (unsigned int)i; n++)
2135 XSetWindowBackgroundPixmap(Xdisplay, TermWin.parent[n], 2143 XSetWindowBackgroundPixmap(display->display, TermWin.parent[n],
2136 ParentRelative); 2144 ParentRelative);
2137 XSetWindowBackgroundPixmap(Xdisplay, TermWin.vt, 2145 XSetWindowBackgroundPixmap(display->display, TermWin.vt,
2138 ParentRelative); 2146 ParentRelative);
2139 am_transparent = 1; 2147 am_transparent = 1;
2140 } 2148 }
2141 for (; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); i++) 2149 for (; i < (int)(sizeof(TermWin.parent) / sizeof(Window)); i++)
2142 TermWin.parent[i] = None; 2150 TermWin.parent[i] = None;
2834 { 2842 {
2835 /* 2843 /*
2836 * commands 2844 * commands
2837 */ 2845 */
2838 case 1: /* deiconify window */ 2846 case 1: /* deiconify window */
2839 XMapWindow(Xdisplay, TermWin.parent[0]); 2847 XMapWindow(display->display, TermWin.parent[0]);
2840 break; 2848 break;
2841 case 2: /* iconify window */ 2849 case 2: /* iconify window */
2842 XIconifyWindow(Xdisplay, TermWin.parent[0], 2850 XIconifyWindow(display->display, TermWin.parent[0],
2843 DefaultScreen(Xdisplay)); 2851 DefaultScreen(display->display));
2844 break; 2852 break;
2845 case 3: /* set position (pixels) */ 2853 case 3: /* set position (pixels) */
2846 XMoveWindow(Xdisplay, TermWin.parent[0], args[1], args[2]); 2854 XMoveWindow(display->display, TermWin.parent[0], args[1], args[2]);
2847 break; 2855 break;
2848 case 4: /* set size (pixels) */ 2856 case 4: /* set size (pixels) */
2849 set_widthheight ((unsigned int)args[2], (unsigned int)args[1]); 2857 set_widthheight ((unsigned int)args[2], (unsigned int)args[1]);
2850 break; 2858 break;
2851 case 5: /* raise window */ 2859 case 5: /* raise window */
2852 XRaiseWindow(Xdisplay, TermWin.parent[0]); 2860 XRaiseWindow(display->display, TermWin.parent[0]);
2853 break; 2861 break;
2854 case 6: /* lower window */ 2862 case 6: /* lower window */
2855 XLowerWindow(Xdisplay, TermWin.parent[0]); 2863 XLowerWindow(display->display, TermWin.parent[0]);
2856 break; 2864 break;
2857 case 7: /* refresh window */ 2865 case 7: /* refresh window */
2858 scr_touch (true); 2866 scr_touch (true);
2859 break; 2867 break;
2860 case 8: /* set size (chars) */ 2868 case 8: /* set size (chars) */
2868 break; 2876 break;
2869 /* 2877 /*
2870 * reports - some output format copied from XTerm 2878 * reports - some output format copied from XTerm
2871 */ 2879 */
2872 case 11: /* report window state */ 2880 case 11: /* report window state */
2873 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2881 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2874 tt_printf("\033[%dt", wattr.map_state == IsViewable ? 1 : 2); 2882 tt_printf("\033[%dt", wattr.map_state == IsViewable ? 1 : 2);
2875 break; 2883 break;
2876 case 13: /* report window position */ 2884 case 13: /* report window position */
2877 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2885 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2878 XTranslateCoordinates(Xdisplay, TermWin.parent[0], wattr.root, 2886 XTranslateCoordinates(display->display, TermWin.parent[0], wattr.root,
2879 -wattr.border_width, -wattr.border_width, 2887 -wattr.border_width, -wattr.border_width,
2880 &x, &y, &wdummy); 2888 &x, &y, &wdummy);
2881 tt_printf("\033[3;%d;%dt", x, y); 2889 tt_printf("\033[3;%d;%dt", x, y);
2882 break; 2890 break;
2883 case 14: /* report window size (pixels) */ 2891 case 14: /* report window size (pixels) */
2884 XGetWindowAttributes(Xdisplay, TermWin.parent[0], &wattr); 2892 XGetWindowAttributes(display->display, TermWin.parent[0], &wattr);
2885 tt_printf("\033[4;%d;%dt", wattr.height, wattr.width); 2893 tt_printf("\033[4;%d;%dt", wattr.height, wattr.width);
2886 break; 2894 break;
2887 case 18: /* report window size (chars) */ 2895 case 18: /* report window size (chars) */
2888 tt_printf("\033[8;%d;%dt", TermWin.nrow, TermWin.ncol); 2896 tt_printf("\033[8;%d;%dt", TermWin.nrow, TermWin.ncol);
2889 break; 2897 break;
2890#if 0 /* XXX: currently disabled due to security concerns */ 2898#if 0 /* XXX: currently disabled due to security concerns */
2891 case 20: /* report icon label */ 2899 case 20: /* report icon label */
2892 XGetIconName(Xdisplay, TermWin.parent[0], &s); 2900 XGetIconName(display->display, TermWin.parent[0], &s);
2893 tt_printf("\033]L%-.200s\234", s ? s : ""); /* 8bit ST */ 2901 tt_printf("\033]L%-.200s\234", s ? s : ""); /* 8bit ST */
2894 break; 2902 break;
2895 case 21: /* report window title */ 2903 case 21: /* report window title */
2896 XFetchName(Xdisplay, TermWin.parent[0], &s); 2904 XFetchName(display->display, TermWin.parent[0], &s);
2897 tt_printf("\033]l%-.200s\234", s ? s : ""); /* 8bit ST */ 2905 tt_printf("\033]l%-.200s\234", s ? s : ""); /* 8bit ST */
2898 break; 2906 break;
2899#endif 2907#endif
2900 2908
2901 } 2909 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines