Author: bgstack15 Date: 2022-11-09 Version: fluxbox 1.3.5 Source: original Summary: Add "(on $CLIENT)" to titlebar for forwarded windows Message: Inspired by xfwm4's ability to display the remote host running an X11 window. This fails on xfe which somehow lacks the WM_CLIENT_MACHINE property. --- a/src/Xutil.cc +++ b/src/Xutil.cc @@ -43,6 +43,51 @@ using std::endl; namespace Xutil { +FbTk::FbString getWMClientMachine(Window window) { + + if (window == None) + return FbTk::FbString(""); + + Display *display = FbTk::App::instance()->display(); + + XTextProperty text_prop; + text_prop.value = 0; + char **list = 0; + int num = 0; + _FB_USES_NLS; + FbTk::FbString name; + + if (XGetWMClientMachine(display, window, &text_prop)) { + if (text_prop.value && text_prop.nitems > 0) { + if (text_prop.encoding != XA_STRING) { + + text_prop.nitems = strlen((char *) text_prop.value); + XmbTextPropertyToTextList(display, &text_prop, &list, &num); + + if (num > 0 && list != 0) + name = FbTk::FbStringUtil::LocaleStrToFb(static_cast(*list)); + else + name = text_prop.value ? FbTk::FbStringUtil::XStrToFb((char *)text_prop.value) : ""; + + if (list) + XFreeStringList(list); + + } else + name = text_prop.value ? FbTk::FbStringUtil::XStrToFb((char *)text_prop.value) : ""; + + XFree(text_prop.value); + + } else { // default name + name = _FB_XTEXT(Window, Unnamed, "Unnamed", "Default name for a window without a WM_NAME"); + } + } else { + // default name + name = _FB_XTEXT(Window, Unnamed, "Unnamed", "Default name for a window without a WM_NAME"); + } + + return name; +} + FbTk::FbString getWMName(Window window) { if (window == None) --- a/src/Xutil.hh +++ b/src/Xutil.hh @@ -28,6 +28,7 @@ namespace Xutil { +FbTk::FbString getWMClientMachine(Window window); FbTk::FbString getWMName(Window window); FbTk::FbString getWMClassName(Window win); --- a/src/WinClient.cc +++ b/src/WinClient.cc @@ -211,6 +211,10 @@ bool WinClient::getAttrib(XWindowAttribu return XGetWindowAttributes(display(), window(), &attr); } +bool WinClient::getWMClientMachine(XTextProperty &textprop) const { + return XGetWMClientMachine(display(), window(), &textprop); +} + bool WinClient::getWMName(XTextProperty &textprop) const { return XGetWMName(display(), window(), &textprop); } @@ -313,12 +317,26 @@ void WinClient::updateTitle() { if (m_title_override) return; - m_title.setLogical(FbTk::FbString(Xutil::getWMName(window()), 0, 512)); + FbTk::FbString fullname = FbTk::FbString(Xutil::getWMName(window()), 0, 512); + FbTk::FbString clientmachine = FbTk::FbString(Xutil::getWMClientMachine(window()), 0, 512); + char *host = new char[512]; gethostname(host, 512); + FbTk::FbString hostname = FbTk::FbString(host); + if (clientmachine != "Unnamed" && clientmachine != "" && clientmachine != hostname) { + fullname += " (on " + clientmachine + ")"; + } + m_title.setLogical(fullname); titleSig().emit(m_title.logical(), *this); } void WinClient::setTitle(const FbTk::FbString &title) { - m_title.setLogical(title); + FbTk::FbString fullname = title; + FbTk::FbString clientmachine = FbTk::FbString(Xutil::getWMClientMachine(window()), 0, 512); + char *host = new char[512]; gethostname(host, 512); + FbTk::FbString hostname = FbTk::FbString(host); + if (clientmachine != "Unnamed" && clientmachine != "" && clientmachine != hostname) { + fullname += " (on " + clientmachine + ")"; + } + m_title.setLogical(fullname); m_title_override = true; titleSig().emit(m_title.logical(), *this); } --- a/src/WinClient.hh +++ b/src/WinClient.hh @@ -91,6 +91,7 @@ public: // bool getAttrib(XWindowAttributes &attr) const; + bool getWMClientMachine(XTextProperty &textprop) const; bool getWMName(XTextProperty &textprop) const; bool getWMIconName(XTextProperty &textprop) const; std::string getWMRole() const;