1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
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<char *>(*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;
|