Xinqi Bao's Git
projects
/
st.git
/ blobdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
inline
| side by side
Fix overtyping wide characters.
[st.git]
/
x.c
diff --git
a/x.c
b/x.c
index
cbbd11f
..
8a16faa
100644
(file)
--- a/
x.c
+++ b/
x.c
@@
-48,7
+48,7
@@
typedef struct {
/* X modifiers */
#define XK_ANY_MOD UINT_MAX
#define XK_NO_MOD 0
/* X modifiers */
#define XK_ANY_MOD UINT_MAX
#define XK_NO_MOD 0
-#define XK_SWITCH_MOD (1<<13)
+#define XK_SWITCH_MOD (1<<13
|1<<14
)
/* function definitions used in config.h */
static void clipcopy(const Arg *);
/* function definitions used in config.h */
static void clipcopy(const Arg *);
@@
-93,7
+93,7
@@
typedef struct {
Window win;
Drawable buf;
GlyphFontSpec *specbuf; /* font spec buffer used for rendering */
Window win;
Drawable buf;
GlyphFontSpec *specbuf; /* font spec buffer used for rendering */
- Atom xembed, wmdeletewin, netwmname, netwmpid;
+ Atom xembed, wmdeletewin, netwmname, netwm
iconname, netwm
pid;
struct {
XIM xim;
XIC xic;
struct {
XIM xim;
XIC xic;
@@
-156,7
+156,7
@@
static void xresize(int, int);
static void xhints(void);
static int xloadcolor(int, const char *, Color *);
static int xloadfont(Font *, FcPattern *);
static void xhints(void);
static int xloadcolor(int, const char *, Color *);
static int xloadfont(Font *, FcPattern *);
-static void xloadfonts(char *, double);
+static void xloadfonts(c
onst c
har *, double);
static void xunloadfont(Font *);
static void xunloadfonts(void);
static void xsetenv(void);
static void xunloadfont(Font *);
static void xunloadfonts(void);
static void xsetenv(void);
@@
-387,7
+387,9
@@
mousereport(XEvent *e)
button = 3;
} else {
button -= Button1;
button = 3;
} else {
button -= Button1;
- if (button >= 3)
+ if (button >= 7)
+ button += 128 - 7;
+ else if (button >= 3)
button += 64 - 3;
}
if (e->xbutton.type == ButtonPress) {
button += 64 - 3;
}
if (e->xbutton.type == ButtonPress) {
@@
-797,6
+799,19
@@
xloadcols(void)
loaded = 1;
}
loaded = 1;
}
+int
+xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b)
+{
+ if (!BETWEEN(x, 0, dc.collen))
+ return 1;
+
+ *r = dc.col[x].color.red >> 8;
+ *g = dc.col[x].color.green >> 8;
+ *b = dc.col[x].color.blue >> 8;
+
+ return 0;
+}
+
int
xsetcolorname(int x, const char *name)
{
int
xsetcolorname(int x, const char *name)
{
@@
-950,7
+965,7
@@
xloadfont(Font *f, FcPattern *pattern)
}
void
}
void
-xloadfonts(char *fontstr, double fontsize)
+xloadfonts(c
onst c
har *fontstr, double fontsize)
{
FcPattern *pattern;
double fontval;
{
FcPattern *pattern;
double fontval;
@@
-958,7
+973,7
@@
xloadfonts(char *fontstr, double fontsize)
if (fontstr[0] == '-')
pattern = XftXlfdParse(fontstr, False, False);
else
if (fontstr[0] == '-')
pattern = XftXlfdParse(fontstr, False, False);
else
- pattern = FcNameParse((FcChar8 *)fontstr);
+ pattern = FcNameParse((
const
FcChar8 *)fontstr);
if (!pattern)
die("can't open font %s\n", fontstr);
if (!pattern)
die("can't open font %s\n", fontstr);
@@
-1186,6
+1201,7
@@
xinit(int cols, int rows)
xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
xw.netwmname = XInternAtom(xw.dpy, "_NET_WM_NAME", False);
xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
xw.netwmname = XInternAtom(xw.dpy, "_NET_WM_NAME", False);
+ xw.netwmiconname = XInternAtom(xw.dpy, "_NET_WM_ICON_NAME", False);
XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1);
xw.netwmpid = XInternAtom(xw.dpy, "_NET_WM_PID", False);
XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1);
xw.netwmpid = XInternAtom(xw.dpy, "_NET_WM_PID", False);
@@
-1526,8
+1542,9
@@
xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
/* draw the new one */
if (IS_SET(MODE_FOCUSED)) {
switch (win.cursor) {
/* draw the new one */
if (IS_SET(MODE_FOCUSED)) {
switch (win.cursor) {
- case 7: /* st extension: snowman (U+2603) */
- g.u = 0x2603;
+ case 7: /* st extension */
+ g.u = 0x2603; /* snowman (U+2603) */
+ /* FALLTHROUGH */
case 0: /* Blinking Block */
case 1: /* Blinking Block (Default) */
case 2: /* Steady Block */
case 0: /* Blinking Block */
case 1: /* Blinking Block (Default) */
case 2: /* Steady Block */
@@
-1578,14
+1595,29
@@
xsetenv(void)
setenv("WINDOWID", buf, 1);
}
setenv("WINDOWID", buf, 1);
}
+void
+xseticontitle(char *p)
+{
+ XTextProperty prop;
+ DEFAULT(p, opt_title);
+
+ if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
+ &prop) != Success)
+ return;
+ XSetWMIconName(xw.dpy, xw.win, &prop);
+ XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmiconname);
+ XFree(prop.value);
+}
+
void
xsettitle(char *p)
{
XTextProperty prop;
DEFAULT(p, opt_title);
void
xsettitle(char *p)
{
XTextProperty prop;
DEFAULT(p, opt_title);
- Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
- &prop);
+ if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
+ &prop) != Success)
+ return;
XSetWMName(xw.dpy, xw.win, &prop);
XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname);
XFree(prop.value);
XSetWMName(xw.dpy, xw.win, &prop);
XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname);
XFree(prop.value);
@@
-1689,8
+1721,7
@@
xsetmode(int set, unsigned int flags)
int
xsetcursor(int cursor)
{
int
xsetcursor(int cursor)
{
- DEFAULT(cursor, 1);
- if (!BETWEEN(cursor, 0, 6))
+ if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */
return 1;
win.cursor = cursor;
return 0;
return 1;
win.cursor = cursor;
return 0;
@@
-1927,7
+1958,7
@@
run(void)
* triggers drawing, we first wait a bit to ensure we got
* everything, and if nothing new arrives - we draw.
* We start with trying to wait minlatency ms. If more content
* triggers drawing, we first wait a bit to ensure we got
* everything, and if nothing new arrives - we draw.
* We start with trying to wait minlatency ms. If more content
- * arrives sooner, we retry with shorter and shorter p
re
iods,
+ * arrives sooner, we retry with shorter and shorter p
er
iods,
* and eventually draw even without idle after maxlatency ms.
* Typically this results in low latency while interacting,
* maximum latency intervals during `cat huge.txt`, and perfect
* and eventually draw even without idle after maxlatency ms.
* Typically this results in low latency while interacting,
* maximum latency intervals during `cat huge.txt`, and perfect
@@
-1982,7
+2013,7
@@
main(int argc, char *argv[])
{
xw.l = xw.t = 0;
xw.isfixed = False;
{
xw.l = xw.t = 0;
xw.isfixed = False;
-
win.cursor = cursorshape
;
+
xsetcursor(cursorshape)
;
ARGBEGIN {
case 'a':
ARGBEGIN {
case 'a':