diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2024-02-01 17:11:48 +0300 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2024-02-03 16:09:35 +0300 |
commit | 722582c552e5a2c9c37e713a711b31788c28b833 (patch) | |
tree | 82ba3467478e9145896c9c724a69e38218518e76 | |
parent | 1b61390375255529635d627397d3f759357d8613 (diff) | |
download | st-fork-722582c552e5a2c9c37e713a711b31788c28b833.tar.gz |
Embedder: This respects the embedded window's name/title
Imports gettextprop() from tabbed.c.
-rw-r--r-- | x.c | 45 |
1 files changed, 45 insertions, 0 deletions
@@ -195,6 +195,8 @@ static int match(uint, uint); static void createnotify(XEvent *e); static void destroynotify(XEvent *e); static void sendxembed(long msg, long detail, long d1, long d2); +static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); +static void updatetitle(Window win); static void run(void); static void usage(void); @@ -529,6 +531,9 @@ propnotify(XEvent *e) (xpev->atom == XA_PRIMARY || xpev->atom == clipboard)) { selnotify(e); + } else if (xpev->state != PropertyDelete && xpev->atom == XA_WM_NAME && + embed == xpev->window) { + updatetitle(embed); } } @@ -772,6 +777,8 @@ createnotify(XEvent *e) XReparentWindow(xw.dpy, embed, xw.win, 0, 0); XSelectInput(xw.dpy, embed, PropertyChangeMask | StructureNotifyMask | EnterWindowMask); + updatetitle(embed); + XMapWindow(xw.dpy, embed); sendxembed(XEMBED_EMBEDDED_NOTIFY, 0, xw.win, 0); @@ -808,6 +815,44 @@ sendxembed(long msg, long detail, long d1, long d2) XSendEvent(xw.dpy, embed, False, NoEventMask, &e); } +Bool +gettextprop(Window w, Atom atom, char *text, unsigned int size) +{ + char **list = NULL; + int n; + XTextProperty name; + + if (!text || size == 0) + return False; + + text[0] = '\0'; + XGetTextProperty(xw.dpy, w, &name, atom); + if (!name.nitems) + return False; + + if (name.encoding == XA_STRING) { + strncpy(text, (char *)name.value, size - 1); + } else if (XmbTextPropertyToTextList(xw.dpy, &name, &list, &n) >= Success + && n > 0 && *list) { + strncpy(text, *list, size - 1); + XFreeStringList(list); + } + text[size - 1] = '\0'; + XFree(name.value); + + return True; +} + +void +updatetitle(Window win) +{ + char name[256]; + + if (!gettextprop(win, xw.netwmname, name, sizeof(name))) + gettextprop(win, XA_WM_NAME, name, sizeof(name)); + xsettitle(name); +} + void xresize(int col, int row) { |