diff options
-rw-r--r-- | st.c | 64 | ||||
-rw-r--r-- | st.h | 33 | ||||
-rw-r--r-- | win.h | 24 | ||||
-rw-r--r-- | x.c | 50 |
4 files changed, 88 insertions, 83 deletions
@@ -42,6 +42,7 @@ | |||
42 | #define STR_ARG_SIZ ESC_ARG_SIZ | 42 | #define STR_ARG_SIZ ESC_ARG_SIZ |
43 | 43 | ||
44 | /* macros */ | 44 | /* macros */ |
45 | #define IS_SET(flag) ((term.mode & (flag)) != 0) | ||
45 | #define NUMMAXLEN(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1) | 46 | #define NUMMAXLEN(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1) |
46 | #define ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == '\177') | 47 | #define ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == '\177') |
47 | #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) | 48 | #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) |
@@ -51,6 +52,17 @@ | |||
51 | /* constants */ | 52 | /* constants */ |
52 | #define ISO14755CMD "dmenu -w \"$WINDOWID\" -p codepoint: </dev/null" | 53 | #define ISO14755CMD "dmenu -w \"$WINDOWID\" -p codepoint: </dev/null" |
53 | 54 | ||
55 | enum term_mode { | ||
56 | MODE_WRAP = 1 << 0, | ||
57 | MODE_INSERT = 1 << 1, | ||
58 | MODE_ALTSCREEN = 1 << 2, | ||
59 | MODE_CRLF = 1 << 3, | ||
60 | MODE_ECHO = 1 << 4, | ||
61 | MODE_PRINT = 1 << 5, | ||
62 | MODE_UTF8 = 1 << 6, | ||
63 | MODE_SIXEL = 1 << 7, | ||
64 | }; | ||
65 | |||
54 | enum cursor_movement { | 66 | enum cursor_movement { |
55 | CURSOR_SAVE, | 67 | CURSOR_SAVE, |
56 | CURSOR_LOAD | 68 | CURSOR_LOAD |
@@ -977,8 +989,6 @@ tnew(int col, int row) | |||
977 | { | 989 | { |
978 | term = (Term){ .c = { .attr = { .fg = defaultfg, .bg = defaultbg } } }; | 990 | term = (Term){ .c = { .attr = { .fg = defaultfg, .bg = defaultbg } } }; |
979 | tresize(col, row); | 991 | tresize(col, row); |
980 | term.numlock = 1; | ||
981 | |||
982 | treset(); | 992 | treset(); |
983 | } | 993 | } |
984 | 994 | ||
@@ -1414,20 +1424,16 @@ tsetscroll(int t, int b) | |||
1414 | void | 1424 | void |
1415 | tsetmode(int priv, int set, int *args, int narg) | 1425 | tsetmode(int priv, int set, int *args, int narg) |
1416 | { | 1426 | { |
1417 | int *lim, mode; | 1427 | int alt, *lim; |
1418 | int alt; | ||
1419 | 1428 | ||
1420 | for (lim = args + narg; args < lim; ++args) { | 1429 | for (lim = args + narg; args < lim; ++args) { |
1421 | if (priv) { | 1430 | if (priv) { |
1422 | switch (*args) { | 1431 | switch (*args) { |
1423 | case 1: /* DECCKM -- Cursor key */ | 1432 | case 1: /* DECCKM -- Cursor key */ |
1424 | MODBIT(term.mode, set, MODE_APPCURSOR); | 1433 | xsetmode(set, MODE_APPCURSOR); |
1425 | break; | 1434 | break; |
1426 | case 5: /* DECSCNM -- Reverse video */ | 1435 | case 5: /* DECSCNM -- Reverse video */ |
1427 | mode = term.mode; | 1436 | xsetmode(set, MODE_REVERSE); |
1428 | MODBIT(term.mode, set, MODE_REVERSE); | ||
1429 | if (mode != term.mode) | ||
1430 | redraw(); | ||
1431 | break; | 1437 | break; |
1432 | case 6: /* DECOM -- Origin */ | 1438 | case 6: /* DECOM -- Origin */ |
1433 | MODBIT(term.c.state, set, CURSOR_ORIGIN); | 1439 | MODBIT(term.c.state, set, CURSOR_ORIGIN); |
@@ -1447,36 +1453,36 @@ tsetmode(int priv, int set, int *args, int narg) | |||
1447 | case 12: /* att610 -- Start blinking cursor (IGNORED) */ | 1453 | case 12: /* att610 -- Start blinking cursor (IGNORED) */ |
1448 | break; | 1454 | break; |
1449 | case 25: /* DECTCEM -- Text Cursor Enable Mode */ | 1455 | case 25: /* DECTCEM -- Text Cursor Enable Mode */ |
1450 | MODBIT(term.mode, !set, MODE_HIDE); | 1456 | xsetmode(!set, MODE_HIDE); |
1451 | break; | 1457 | break; |
1452 | case 9: /* X10 mouse compatibility mode */ | 1458 | case 9: /* X10 mouse compatibility mode */ |
1453 | xsetpointermotion(0); | 1459 | xsetpointermotion(0); |
1454 | MODBIT(term.mode, 0, MODE_MOUSE); | 1460 | xsetmode(0, MODE_MOUSE); |
1455 | MODBIT(term.mode, set, MODE_MOUSEX10); | 1461 | xsetmode(set, MODE_MOUSEX10); |
1456 | break; | 1462 | break; |
1457 | case 1000: /* 1000: report button press */ | 1463 | case 1000: /* 1000: report button press */ |
1458 | xsetpointermotion(0); | 1464 | xsetpointermotion(0); |
1459 | MODBIT(term.mode, 0, MODE_MOUSE); | 1465 | xsetmode(0, MODE_MOUSE); |
1460 | MODBIT(term.mode, set, MODE_MOUSEBTN); | 1466 | xsetmode(set, MODE_MOUSEBTN); |
1461 | break; | 1467 | break; |
1462 | case 1002: /* 1002: report motion on button press */ | 1468 | case 1002: /* 1002: report motion on button press */ |
1463 | xsetpointermotion(0); | 1469 | xsetpointermotion(0); |
1464 | MODBIT(term.mode, 0, MODE_MOUSE); | 1470 | xsetmode(0, MODE_MOUSE); |
1465 | MODBIT(term.mode, set, MODE_MOUSEMOTION); | 1471 | xsetmode(set, MODE_MOUSEMOTION); |
1466 | break; | 1472 | break; |
1467 | case 1003: /* 1003: enable all mouse motions */ | 1473 | case 1003: /* 1003: enable all mouse motions */ |
1468 | xsetpointermotion(set); | 1474 | xsetpointermotion(set); |
1469 | MODBIT(term.mode, 0, MODE_MOUSE); | 1475 | xsetmode(0, MODE_MOUSE); |
1470 | MODBIT(term.mode, set, MODE_MOUSEMANY); | 1476 | xsetmode(set, MODE_MOUSEMANY); |
1471 | break; | 1477 | break; |
1472 | case 1004: /* 1004: send focus events to tty */ | 1478 | case 1004: /* 1004: send focus events to tty */ |
1473 | MODBIT(term.mode, set, MODE_FOCUS); | 1479 | xsetmode(set, MODE_FOCUS); |
1474 | break; | 1480 | break; |
1475 | case 1006: /* 1006: extended reporting mode */ | 1481 | case 1006: /* 1006: extended reporting mode */ |
1476 | MODBIT(term.mode, set, MODE_MOUSESGR); | 1482 | xsetmode(set, MODE_MOUSESGR); |
1477 | break; | 1483 | break; |
1478 | case 1034: | 1484 | case 1034: |
1479 | MODBIT(term.mode, set, MODE_8BIT); | 1485 | xsetmode(set, MODE_8BIT); |
1480 | break; | 1486 | break; |
1481 | case 1049: /* swap screen & set/restore cursor as xterm */ | 1487 | case 1049: /* swap screen & set/restore cursor as xterm */ |
1482 | if (!allowaltscreen) | 1488 | if (!allowaltscreen) |
@@ -1501,7 +1507,7 @@ tsetmode(int priv, int set, int *args, int narg) | |||
1501 | tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD); | 1507 | tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD); |
1502 | break; | 1508 | break; |
1503 | case 2004: /* 2004: bracketed paste mode */ | 1509 | case 2004: /* 2004: bracketed paste mode */ |
1504 | MODBIT(term.mode, set, MODE_BRCKTPASTE); | 1510 | xsetmode(set, MODE_BRCKTPASTE); |
1505 | break; | 1511 | break; |
1506 | /* Not implemented mouse modes. See comments there. */ | 1512 | /* Not implemented mouse modes. See comments there. */ |
1507 | case 1001: /* mouse highlight mode; can hang the | 1513 | case 1001: /* mouse highlight mode; can hang the |
@@ -1522,8 +1528,8 @@ tsetmode(int priv, int set, int *args, int narg) | |||
1522 | switch (*args) { | 1528 | switch (*args) { |
1523 | case 0: /* Error (IGNORED) */ | 1529 | case 0: /* Error (IGNORED) */ |
1524 | break; | 1530 | break; |
1525 | case 2: /* KAM -- keyboard action */ | 1531 | case 2: |
1526 | MODBIT(term.mode, set, MODE_KBDLOCK); | 1532 | xsetmode(set, MODE_KBDLOCK); |
1527 | break; | 1533 | break; |
1528 | case 4: /* IRM -- Insertion-replacement */ | 1534 | case 4: /* IRM -- Insertion-replacement */ |
1529 | MODBIT(term.mode, set, MODE_INSERT); | 1535 | MODBIT(term.mode, set, MODE_INSERT); |
@@ -2230,10 +2236,10 @@ eschandle(uchar ascii) | |||
2230 | xloadcols(); | 2236 | xloadcols(); |
2231 | break; | 2237 | break; |
2232 | case '=': /* DECPAM -- Application keypad */ | 2238 | case '=': /* DECPAM -- Application keypad */ |
2233 | term.mode |= MODE_APPKEYPAD; | 2239 | xsetmode(1, MODE_APPKEYPAD); |
2234 | break; | 2240 | break; |
2235 | case '>': /* DECPNM -- Normal keypad */ | 2241 | case '>': /* DECPNM -- Normal keypad */ |
2236 | term.mode &= ~MODE_APPKEYPAD; | 2242 | xsetmode(0, MODE_APPKEYPAD); |
2237 | break; | 2243 | break; |
2238 | case '7': /* DECSC -- Save Cursor */ | 2244 | case '7': /* DECSC -- Save Cursor */ |
2239 | tcursor(CURSOR_SAVE); | 2245 | tcursor(CURSOR_SAVE); |
@@ -2526,9 +2532,3 @@ redraw(void) | |||
2526 | tfulldirt(); | 2532 | tfulldirt(); |
2527 | draw(); | 2533 | draw(); |
2528 | } | 2534 | } |
2529 | |||
2530 | void | ||
2531 | numlock(const Arg *dummy) | ||
2532 | { | ||
2533 | term.numlock ^= 1; | ||
2534 | } | ||
@@ -13,7 +13,6 @@ | |||
13 | #define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) | 13 | #define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) |
14 | #define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || \ | 14 | #define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || \ |
15 | (a).bg != (b).bg) | 15 | (a).bg != (b).bg) |
16 | #define IS_SET(flag) ((term.mode & (flag)) != 0) | ||
17 | #define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + \ | 16 | #define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + \ |
18 | (t1.tv_nsec-t2.tv_nsec)/1E6) | 17 | (t1.tv_nsec-t2.tv_nsec)/1E6) |
19 | #define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit))) | 18 | #define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit))) |
@@ -37,34 +36,6 @@ enum glyph_attribute { | |||
37 | ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, | 36 | ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, |
38 | }; | 37 | }; |
39 | 38 | ||
40 | enum term_mode { | ||
41 | MODE_WRAP = 1 << 0, | ||
42 | MODE_INSERT = 1 << 1, | ||
43 | MODE_APPKEYPAD = 1 << 2, | ||
44 | MODE_ALTSCREEN = 1 << 3, | ||
45 | MODE_CRLF = 1 << 4, | ||
46 | MODE_MOUSEBTN = 1 << 5, | ||
47 | MODE_MOUSEMOTION = 1 << 6, | ||
48 | MODE_REVERSE = 1 << 7, | ||
49 | MODE_KBDLOCK = 1 << 8, | ||
50 | MODE_HIDE = 1 << 9, | ||
51 | MODE_ECHO = 1 << 10, | ||
52 | MODE_APPCURSOR = 1 << 11, | ||
53 | MODE_MOUSESGR = 1 << 12, | ||
54 | MODE_8BIT = 1 << 13, | ||
55 | MODE_BLINK = 1 << 14, | ||
56 | MODE_FBLINK = 1 << 15, | ||
57 | MODE_FOCUS = 1 << 16, | ||
58 | MODE_MOUSEX10 = 1 << 17, | ||
59 | MODE_MOUSEMANY = 1 << 18, | ||
60 | MODE_BRCKTPASTE = 1 << 19, | ||
61 | MODE_PRINT = 1 << 20, | ||
62 | MODE_UTF8 = 1 << 21, | ||
63 | MODE_SIXEL = 1 << 22, | ||
64 | MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\ | ||
65 | |MODE_MOUSEMANY, | ||
66 | }; | ||
67 | |||
68 | enum selection_mode { | 39 | enum selection_mode { |
69 | SEL_IDLE = 0, | 40 | SEL_IDLE = 0, |
70 | SEL_EMPTY = 1, | 41 | SEL_EMPTY = 1, |
@@ -120,7 +91,6 @@ typedef struct { | |||
120 | char trantbl[4]; /* charset table translation */ | 91 | char trantbl[4]; /* charset table translation */ |
121 | int charset; /* current charset */ | 92 | int charset; /* current charset */ |
122 | int icharset; /* selected charset for sequence */ | 93 | int icharset; /* selected charset for sequence */ |
123 | int numlock; /* lock numbers in keyboard */ | ||
124 | int *tabs; | 94 | int *tabs; |
125 | } Term; | 95 | } Term; |
126 | 96 | ||
@@ -130,7 +100,7 @@ typedef struct { | |||
130 | int w, h; /* window width and height */ | 100 | int w, h; /* window width and height */ |
131 | int ch; /* char height */ | 101 | int ch; /* char height */ |
132 | int cw; /* char width */ | 102 | int cw; /* char width */ |
133 | char state; /* focus, redraw, visible */ | 103 | int mode; /* window state/mode flags */ |
134 | int cursor; /* cursor style */ | 104 | int cursor; /* cursor style */ |
135 | } TermWindow; | 105 | } TermWindow; |
136 | 106 | ||
@@ -163,7 +133,6 @@ void die(const char *, ...); | |||
163 | void redraw(void); | 133 | void redraw(void); |
164 | 134 | ||
165 | void iso14755(const Arg *); | 135 | void iso14755(const Arg *); |
166 | void numlock(const Arg *); | ||
167 | void printscreen(const Arg *); | 136 | void printscreen(const Arg *); |
168 | void printsel(const Arg *); | 137 | void printsel(const Arg *); |
169 | void sendbreak(const Arg *); | 138 | void sendbreak(const Arg *); |
@@ -1,5 +1,28 @@ | |||
1 | /* See LICENSE for license details. */ | 1 | /* See LICENSE for license details. */ |
2 | 2 | ||
3 | enum win_mode { | ||
4 | MODE_VISIBLE = 1 << 0, | ||
5 | MODE_FOCUSED = 1 << 1, | ||
6 | MODE_APPKEYPAD = 1 << 2, | ||
7 | MODE_MOUSEBTN = 1 << 3, | ||
8 | MODE_MOUSEMOTION = 1 << 4, | ||
9 | MODE_REVERSE = 1 << 5, | ||
10 | MODE_KBDLOCK = 1 << 6, | ||
11 | MODE_HIDE = 1 << 7, | ||
12 | MODE_APPCURSOR = 1 << 8, | ||
13 | MODE_MOUSESGR = 1 << 9, | ||
14 | MODE_8BIT = 1 << 10, | ||
15 | MODE_BLINK = 1 << 11, | ||
16 | MODE_FBLINK = 1 << 12, | ||
17 | MODE_FOCUS = 1 << 13, | ||
18 | MODE_MOUSEX10 = 1 << 14, | ||
19 | MODE_MOUSEMANY = 1 << 15, | ||
20 | MODE_BRCKTPASTE = 1 << 16, | ||
21 | MODE_NUMLOCK = 1 << 17, | ||
22 | MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\ | ||
23 | |MODE_MOUSEMANY, | ||
24 | }; | ||
25 | |||
3 | void draw(void); | 26 | void draw(void); |
4 | void drawregion(int, int, int, int); | 27 | void drawregion(int, int, int, int); |
5 | 28 | ||
@@ -10,5 +33,6 @@ void xloadcols(void); | |||
10 | int xsetcolorname(int, const char *); | 33 | int xsetcolorname(int, const char *); |
11 | void xsettitle(char *); | 34 | void xsettitle(char *); |
12 | int xsetcursor(int); | 35 | int xsetcursor(int); |
36 | void xsetmode(int, unsigned int); | ||
13 | void xsetpointermotion(int); | 37 | void xsetpointermotion(int); |
14 | void xsetsel(char *); | 38 | void xsetsel(char *); |
@@ -51,6 +51,7 @@ typedef struct { | |||
51 | /* function definitions used in config.h */ | 51 | /* function definitions used in config.h */ |
52 | static void clipcopy(const Arg *); | 52 | static void clipcopy(const Arg *); |
53 | static void clippaste(const Arg *); | 53 | static void clippaste(const Arg *); |
54 | static void numlock(const Arg *); | ||
54 | static void selpaste(const Arg *); | 55 | static void selpaste(const Arg *); |
55 | static void zoom(const Arg *); | 56 | static void zoom(const Arg *); |
56 | static void zoomabs(const Arg *); | 57 | static void zoomabs(const Arg *); |
@@ -64,6 +65,7 @@ static void zoomreset(const Arg *); | |||
64 | #define XEMBED_FOCUS_OUT 5 | 65 | #define XEMBED_FOCUS_OUT 5 |
65 | 66 | ||
66 | /* macros */ | 67 | /* macros */ |
68 | #define IS_SET(flag) ((win.mode & (flag)) != 0) | ||
67 | #define TRUERED(x) (((x) & 0xff0000) >> 8) | 69 | #define TRUERED(x) (((x) & 0xff0000) >> 8) |
68 | #define TRUEGREEN(x) (((x) & 0xff00)) | 70 | #define TRUEGREEN(x) (((x) & 0xff00)) |
69 | #define TRUEBLUE(x) (((x) & 0xff) << 8) | 71 | #define TRUEBLUE(x) (((x) & 0xff) << 8) |
@@ -196,11 +198,6 @@ static XWindow xw; | |||
196 | static XSelection xsel; | 198 | static XSelection xsel; |
197 | static TermWindow win; | 199 | static TermWindow win; |
198 | 200 | ||
199 | enum window_state { | ||
200 | WIN_VISIBLE = 1, | ||
201 | WIN_FOCUSED = 2 | ||
202 | }; | ||
203 | |||
204 | /* Font Ring Cache */ | 201 | /* Font Ring Cache */ |
205 | enum { | 202 | enum { |
206 | FRC_NORMAL, | 203 | FRC_NORMAL, |
@@ -264,6 +261,12 @@ selpaste(const Arg *dummy) | |||
264 | } | 261 | } |
265 | 262 | ||
266 | void | 263 | void |
264 | numlock(const Arg *dummy) | ||
265 | { | ||
266 | win.mode ^= MODE_NUMLOCK; | ||
267 | } | ||
268 | |||
269 | void | ||
267 | zoom(const Arg *arg) | 270 | zoom(const Arg *arg) |
268 | { | 271 | { |
269 | Arg larg; | 272 | Arg larg; |
@@ -1090,6 +1093,7 @@ xinit(void) | |||
1090 | XChangeProperty(xw.dpy, xw.win, xw.netwmpid, XA_CARDINAL, 32, | 1093 | XChangeProperty(xw.dpy, xw.win, xw.netwmpid, XA_CARDINAL, 32, |
1091 | PropModeReplace, (uchar *)&thispid, 1); | 1094 | PropModeReplace, (uchar *)&thispid, 1); |
1092 | 1095 | ||
1096 | win.mode = MODE_NUMLOCK; | ||
1093 | resettitle(); | 1097 | resettitle(); |
1094 | XMapWindow(xw.dpy, xw.win); | 1098 | XMapWindow(xw.dpy, xw.win); |
1095 | xhints(); | 1099 | xhints(); |
@@ -1319,14 +1323,13 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i | |||
1319 | fg = &revfg; | 1323 | fg = &revfg; |
1320 | } | 1324 | } |
1321 | 1325 | ||
1322 | |||
1323 | if (base.mode & ATTR_REVERSE) { | 1326 | if (base.mode & ATTR_REVERSE) { |
1324 | temp = fg; | 1327 | temp = fg; |
1325 | fg = bg; | 1328 | fg = bg; |
1326 | bg = temp; | 1329 | bg = temp; |
1327 | } | 1330 | } |
1328 | 1331 | ||
1329 | if (base.mode & ATTR_BLINK && term.mode & MODE_BLINK) | 1332 | if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK) |
1330 | fg = bg; | 1333 | fg = bg; |
1331 | 1334 | ||
1332 | if (base.mode & ATTR_INVISIBLE) | 1335 | if (base.mode & ATTR_INVISIBLE) |
@@ -1440,7 +1443,7 @@ xdrawcursor(void) | |||
1440 | return; | 1443 | return; |
1441 | 1444 | ||
1442 | /* draw the new one */ | 1445 | /* draw the new one */ |
1443 | if (win.state & WIN_FOCUSED) { | 1446 | if (IS_SET(MODE_FOCUSED)) { |
1444 | switch (win.cursor) { | 1447 | switch (win.cursor) { |
1445 | case 7: /* st extension: snowman */ | 1448 | case 7: /* st extension: snowman */ |
1446 | utf8decode("☃", &g.u, UTF_SIZ); | 1449 | utf8decode("☃", &g.u, UTF_SIZ); |
@@ -1527,7 +1530,7 @@ drawregion(int x1, int y1, int x2, int y2) | |||
1527 | Glyph base, new; | 1530 | Glyph base, new; |
1528 | XftGlyphFontSpec *specs; | 1531 | XftGlyphFontSpec *specs; |
1529 | 1532 | ||
1530 | if (!(win.state & WIN_VISIBLE)) | 1533 | if (!(IS_SET(MODE_VISIBLE))) |
1531 | return; | 1534 | return; |
1532 | 1535 | ||
1533 | for (y = y1; y < y2; y++) { | 1536 | for (y = y1; y < y2; y++) { |
@@ -1575,13 +1578,13 @@ visibility(XEvent *ev) | |||
1575 | { | 1578 | { |
1576 | XVisibilityEvent *e = &ev->xvisibility; | 1579 | XVisibilityEvent *e = &ev->xvisibility; |
1577 | 1580 | ||
1578 | MODBIT(win.state, e->state != VisibilityFullyObscured, WIN_VISIBLE); | 1581 | MODBIT(win.mode, e->state != VisibilityFullyObscured, MODE_VISIBLE); |
1579 | } | 1582 | } |
1580 | 1583 | ||
1581 | void | 1584 | void |
1582 | unmap(XEvent *ev) | 1585 | unmap(XEvent *ev) |
1583 | { | 1586 | { |
1584 | win.state &= ~WIN_VISIBLE; | 1587 | win.mode &= ~MODE_VISIBLE; |
1585 | } | 1588 | } |
1586 | 1589 | ||
1587 | void | 1590 | void |
@@ -1591,6 +1594,15 @@ xsetpointermotion(int set) | |||
1591 | XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); | 1594 | XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); |
1592 | } | 1595 | } |
1593 | 1596 | ||
1597 | void | ||
1598 | xsetmode(int set, unsigned int flags) | ||
1599 | { | ||
1600 | int mode = win.mode; | ||
1601 | MODBIT(win.mode, set, flags); | ||
1602 | if ((win.mode & MODE_REVERSE) != (mode & MODE_REVERSE)) | ||
1603 | redraw(); | ||
1604 | } | ||
1605 | |||
1594 | int | 1606 | int |
1595 | xsetcursor(int cursor) | 1607 | xsetcursor(int cursor) |
1596 | { | 1608 | { |
@@ -1614,7 +1626,7 @@ xseturgency(int add) | |||
1614 | void | 1626 | void |
1615 | xbell(void) | 1627 | xbell(void) |
1616 | { | 1628 | { |
1617 | if (!(win.state & WIN_FOCUSED)) | 1629 | if (!(IS_SET(MODE_FOCUSED))) |
1618 | xseturgency(1); | 1630 | xseturgency(1); |
1619 | if (bellvolume) | 1631 | if (bellvolume) |
1620 | XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL); | 1632 | XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL); |
@@ -1630,13 +1642,13 @@ focus(XEvent *ev) | |||
1630 | 1642 | ||
1631 | if (ev->type == FocusIn) { | 1643 | if (ev->type == FocusIn) { |
1632 | XSetICFocus(xw.xic); | 1644 | XSetICFocus(xw.xic); |
1633 | win.state |= WIN_FOCUSED; | 1645 | win.mode |= MODE_FOCUSED; |
1634 | xseturgency(0); | 1646 | xseturgency(0); |
1635 | if (IS_SET(MODE_FOCUS)) | 1647 | if (IS_SET(MODE_FOCUS)) |
1636 | ttywrite("\033[I", 3, 0); | 1648 | ttywrite("\033[I", 3, 0); |
1637 | } else { | 1649 | } else { |
1638 | XUnsetICFocus(xw.xic); | 1650 | XUnsetICFocus(xw.xic); |
1639 | win.state &= ~WIN_FOCUSED; | 1651 | win.mode &= ~MODE_FOCUSED; |
1640 | if (IS_SET(MODE_FOCUS)) | 1652 | if (IS_SET(MODE_FOCUS)) |
1641 | ttywrite("\033[O", 3, 0); | 1653 | ttywrite("\033[O", 3, 0); |
1642 | } | 1654 | } |
@@ -1673,7 +1685,7 @@ kmap(KeySym k, uint state) | |||
1673 | 1685 | ||
1674 | if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0) | 1686 | if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0) |
1675 | continue; | 1687 | continue; |
1676 | if (term.numlock && kp->appkey == 2) | 1688 | if (IS_SET(MODE_NUMLOCK) && kp->appkey == 2) |
1677 | continue; | 1689 | continue; |
1678 | 1690 | ||
1679 | if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0) | 1691 | if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0) |
@@ -1742,10 +1754,10 @@ cmessage(XEvent *e) | |||
1742 | */ | 1754 | */ |
1743 | if (e->xclient.message_type == xw.xembed && e->xclient.format == 32) { | 1755 | if (e->xclient.message_type == xw.xembed && e->xclient.format == 32) { |
1744 | if (e->xclient.data.l[1] == XEMBED_FOCUS_IN) { | 1756 | if (e->xclient.data.l[1] == XEMBED_FOCUS_IN) { |
1745 | win.state |= WIN_FOCUSED; | 1757 | win.mode |= MODE_FOCUSED; |
1746 | xseturgency(0); | 1758 | xseturgency(0); |
1747 | } else if (e->xclient.data.l[1] == XEMBED_FOCUS_OUT) { | 1759 | } else if (e->xclient.data.l[1] == XEMBED_FOCUS_OUT) { |
1748 | win.state &= ~WIN_FOCUSED; | 1760 | win.mode &= ~MODE_FOCUSED; |
1749 | } | 1761 | } |
1750 | } else if (e->xclient.data.l[0] == xw.wmdeletewin) { | 1762 | } else if (e->xclient.data.l[0] == xw.wmdeletewin) { |
1751 | /* Send SIGHUP to shell */ | 1763 | /* Send SIGHUP to shell */ |
@@ -1810,7 +1822,7 @@ run(void) | |||
1810 | if (blinktimeout) { | 1822 | if (blinktimeout) { |
1811 | blinkset = tattrset(ATTR_BLINK); | 1823 | blinkset = tattrset(ATTR_BLINK); |
1812 | if (!blinkset) | 1824 | if (!blinkset) |
1813 | MODBIT(term.mode, 0, MODE_BLINK); | 1825 | MODBIT(win.mode, 0, MODE_BLINK); |
1814 | } | 1826 | } |
1815 | } | 1827 | } |
1816 | 1828 | ||
@@ -1825,7 +1837,7 @@ run(void) | |||
1825 | dodraw = 0; | 1837 | dodraw = 0; |
1826 | if (blinktimeout && TIMEDIFF(now, lastblink) > blinktimeout) { | 1838 | if (blinktimeout && TIMEDIFF(now, lastblink) > blinktimeout) { |
1827 | tsetdirtattr(ATTR_BLINK); | 1839 | tsetdirtattr(ATTR_BLINK); |
1828 | term.mode ^= MODE_BLINK; | 1840 | win.mode ^= MODE_BLINK; |
1829 | lastblink = now; | 1841 | lastblink = now; |
1830 | dodraw = 1; | 1842 | dodraw = 1; |
1831 | } | 1843 | } |