aboutsummaryrefslogtreecommitdiffstats
path: root/x.c
diff options
context:
space:
mode:
authorDevin J. Pohly <djpohly@gmail.com>2018-02-23 14:16:52 -0600
committerDevin J. Pohly <djpohly@gmail.com>2018-02-25 21:56:26 -0600
commit05c66cb37d9ff278a3e0c45682c4b5e7945deb42 (patch)
tree273ee88089e86784a261c5564dd51e9489bcd09e /x.c
parent33201ac65f74e45b4fa60822ba9a538c3cfa9b25 (diff)
downloadst-05c66cb37d9ff278a3e0c45682c4b5e7945deb42.tar.gz
Split mode bits between Term and TermWindow
Moves the mode bits used by x.c from Term to TermWindow, absorbing UI/input-related mode bits (visible/focused/numlock) along the way. This is gradually reducing external references to Term. Since TermWindow is already internal to x.c, we add xsetmode() to allow st to modify window bits in accordance with escape sequences. IS_SET() is redefined accordingly (term.mode in st.c, win.mode in x.c). Signed-off-by: Devin J. Pohly <djpohly@gmail.com>
Diffstat (limited to 'x.c')
-rw-r--r--x.c50
1 files changed, 31 insertions, 19 deletions
diff --git a/x.c b/x.c
index 76fb910..c5826cf 100644
--- a/x.c
+++ b/x.c
@@ -51,6 +51,7 @@ typedef struct {
/* function definitions used in config.h */
static void clipcopy(const Arg *);
static void clippaste(const Arg *);
+static void numlock(const Arg *);
static void selpaste(const Arg *);
static void zoom(const Arg *);
static void zoomabs(const Arg *);
@@ -64,6 +65,7 @@ static void zoomreset(const Arg *);
#define XEMBED_FOCUS_OUT 5
/* macros */
+#define IS_SET(flag) ((win.mode & (flag)) != 0)
#define TRUERED(x) (((x) & 0xff0000) >> 8)
#define TRUEGREEN(x) (((x) & 0xff00))
#define TRUEBLUE(x) (((x) & 0xff) << 8)
@@ -196,11 +198,6 @@ static XWindow xw;
static XSelection xsel;
static TermWindow win;
-enum window_state {
- WIN_VISIBLE = 1,
- WIN_FOCUSED = 2
-};
-
/* Font Ring Cache */
enum {
FRC_NORMAL,
@@ -264,6 +261,12 @@ selpaste(const Arg *dummy)
}
void
+numlock(const Arg *dummy)
+{
+ win.mode ^= MODE_NUMLOCK;
+}
+
+void
zoom(const Arg *arg)
{
Arg larg;
@@ -1090,6 +1093,7 @@ xinit(void)
XChangeProperty(xw.dpy, xw.win, xw.netwmpid, XA_CARDINAL, 32,
PropModeReplace, (uchar *)&thispid, 1);
+ win.mode = MODE_NUMLOCK;
resettitle();
XMapWindow(xw.dpy, xw.win);
xhints();
@@ -1319,14 +1323,13 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
fg = &revfg;
}
-
if (base.mode & ATTR_REVERSE) {
temp = fg;
fg = bg;
bg = temp;
}
- if (base.mode & ATTR_BLINK && term.mode & MODE_BLINK)
+ if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK)
fg = bg;
if (base.mode & ATTR_INVISIBLE)
@@ -1440,7 +1443,7 @@ xdrawcursor(void)
return;
/* draw the new one */
- if (win.state & WIN_FOCUSED) {
+ if (IS_SET(MODE_FOCUSED)) {
switch (win.cursor) {
case 7: /* st extension: snowman */
utf8decode("☃", &g.u, UTF_SIZ);
@@ -1527,7 +1530,7 @@ drawregion(int x1, int y1, int x2, int y2)
Glyph base, new;
XftGlyphFontSpec *specs;
- if (!(win.state & WIN_VISIBLE))
+ if (!(IS_SET(MODE_VISIBLE)))
return;
for (y = y1; y < y2; y++) {
@@ -1575,13 +1578,13 @@ visibility(XEvent *ev)
{
XVisibilityEvent *e = &ev->xvisibility;
- MODBIT(win.state, e->state != VisibilityFullyObscured, WIN_VISIBLE);
+ MODBIT(win.mode, e->state != VisibilityFullyObscured, MODE_VISIBLE);
}
void
unmap(XEvent *ev)
{
- win.state &= ~WIN_VISIBLE;
+ win.mode &= ~MODE_VISIBLE;
}
void
@@ -1591,6 +1594,15 @@ xsetpointermotion(int set)
XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs);
}
+void
+xsetmode(int set, unsigned int flags)
+{
+ int mode = win.mode;
+ MODBIT(win.mode, set, flags);
+ if ((win.mode & MODE_REVERSE) != (mode & MODE_REVERSE))
+ redraw();
+}
+
int
xsetcursor(int cursor)
{
@@ -1614,7 +1626,7 @@ xseturgency(int add)
void
xbell(void)
{
- if (!(win.state & WIN_FOCUSED))
+ if (!(IS_SET(MODE_FOCUSED)))
xseturgency(1);
if (bellvolume)
XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL);
@@ -1630,13 +1642,13 @@ focus(XEvent *ev)
if (ev->type == FocusIn) {
XSetICFocus(xw.xic);
- win.state |= WIN_FOCUSED;
+ win.mode |= MODE_FOCUSED;
xseturgency(0);
if (IS_SET(MODE_FOCUS))
ttywrite("\033[I", 3, 0);
} else {
XUnsetICFocus(xw.xic);
- win.state &= ~WIN_FOCUSED;
+ win.mode &= ~MODE_FOCUSED;
if (IS_SET(MODE_FOCUS))
ttywrite("\033[O", 3, 0);
}
@@ -1673,7 +1685,7 @@ kmap(KeySym k, uint state)
if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0)
continue;
- if (term.numlock && kp->appkey == 2)
+ if (IS_SET(MODE_NUMLOCK) && kp->appkey == 2)
continue;
if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0)
@@ -1742,10 +1754,10 @@ cmessage(XEvent *e)
*/
if (e->xclient.message_type == xw.xembed && e->xclient.format == 32) {
if (e->xclient.data.l[1] == XEMBED_FOCUS_IN) {
- win.state |= WIN_FOCUSED;
+ win.mode |= MODE_FOCUSED;
xseturgency(0);
} else if (e->xclient.data.l[1] == XEMBED_FOCUS_OUT) {
- win.state &= ~WIN_FOCUSED;
+ win.mode &= ~MODE_FOCUSED;
}
} else if (e->xclient.data.l[0] == xw.wmdeletewin) {
/* Send SIGHUP to shell */
@@ -1810,7 +1822,7 @@ run(void)
if (blinktimeout) {
blinkset = tattrset(ATTR_BLINK);
if (!blinkset)
- MODBIT(term.mode, 0, MODE_BLINK);
+ MODBIT(win.mode, 0, MODE_BLINK);
}
}
@@ -1825,7 +1837,7 @@ run(void)
dodraw = 0;
if (blinktimeout && TIMEDIFF(now, lastblink) > blinktimeout) {
tsetdirtattr(ATTR_BLINK);
- term.mode ^= MODE_BLINK;
+ win.mode ^= MODE_BLINK;
lastblink = now;
dodraw = 1;
}
remember that computers suck.