Skip to content

Commit 1124342

Browse files
authored
Display (Linux): show brand of Xserver in WM section (#1888)
* Display: add server vendor string * Display (X11): fetch server vendor string using XCB/Xlib * WM: show server vendor string when not empty * Display (XCB): use proper string helper function * Display (X11): shorten "The X.Org Foundation" to "Xorg"
1 parent 329cb22 commit 1124342

File tree

5 files changed

+56
-2
lines changed

5 files changed

+56
-2
lines changed

src/detection/displayserver/displayserver.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ const FFDisplayServerResult* ffConnectDisplayServer()
6161
ffStrbufInit(&result.wmProtocolName);
6262
ffStrbufInit(&result.deProcessName);
6363
ffStrbufInit(&result.dePrettyName);
64+
ffStrbufInit(&result.serverVendor);
6465
ffListInit(&result.displays, sizeof(FFDisplayResult));
6566
ffConnectDisplayServerImpl(&result);
6667
}

src/detection/displayserver/displayserver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ typedef struct FFDisplayServerResult
9191
FFstrbuf wmProtocolName;
9292
FFstrbuf deProcessName;
9393
FFstrbuf dePrettyName;
94+
FFstrbuf serverVendor;
9495
FFlist displays; //List of FFDisplayResult
9596
} FFDisplayServerResult;
9697

src/detection/displayserver/linux/xcb.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "common/time.h"
77
#include "util/edidHelper.h"
88
#include "util/mallocHelper.h"
9+
#include "util/stringUtils.h"
910

1011
#include <stdlib.h>
1112
#include <string.h>
@@ -24,6 +25,9 @@ typedef struct XcbPropertyData
2425
FF_LIBRARY_SYMBOL(xcb_get_atom_name_name)
2526
FF_LIBRARY_SYMBOL(xcb_get_atom_name_name_length)
2627
FF_LIBRARY_SYMBOL(xcb_get_atom_name_reply)
28+
FF_LIBRARY_SYMBOL(xcb_get_setup)
29+
FF_LIBRARY_SYMBOL(xcb_setup_vendor)
30+
FF_LIBRARY_SYMBOL(xcb_setup_vendor_length)
2731
} XcbPropertyData;
2832

2933
static bool xcbInitPropertyData(FF_MAYBE_UNUSED void* libraryHandle, XcbPropertyData* propertyData)
@@ -38,6 +42,9 @@ static bool xcbInitPropertyData(FF_MAYBE_UNUSED void* libraryHandle, XcbProperty
3842
FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_get_atom_name_name, false)
3943
FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_get_atom_name_name_length, false)
4044
FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_get_atom_name_reply, false)
45+
FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_get_setup, false)
46+
FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_setup_vendor, false)
47+
FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_setup_vendor_length, false)
4148

4249
return true;
4350
}
@@ -86,6 +93,21 @@ static void xcbDetectWMfromEWMH(XcbPropertyData* data, xcb_connection_t* connect
8693
ffStrbufSetS(&result->wmProcessName, wmName);
8794
}
8895

96+
static void xcbFetchServerVendor(XcbPropertyData* data, xcb_connection_t* connection, FFDisplayServerResult* result)
97+
{
98+
const xcb_setup_t* setup = data->ffxcb_get_setup(connection);
99+
100+
int length = data->ffxcb_setup_vendor_length(setup);
101+
if(length <= 0)
102+
return;
103+
104+
ffStrbufSetNS(&result->serverVendor, (uint32_t) length, data->ffxcb_setup_vendor(setup));
105+
106+
//Shorten Xorg vendor string
107+
if (!ffStrbufCompS(&result->serverVendor, "The X.Org Foundation"))
108+
ffStrbufSetS(&result->serverVendor, "Xorg");
109+
}
110+
89111
typedef struct XcbRandrData
90112
{
91113
FF_LIBRARY_SYMBOL(xcb_randr_get_screen_resources_current)
@@ -381,8 +403,10 @@ const char* ffdsConnectXcbRandr(FFDisplayServerResult* result)
381403
xcb_screen_iterator_t iterator = ffxcb_setup_roots_iterator(ffxcb_get_setup(data.connection));
382404

383405

384-
if(iterator.rem > 0 && propertyDataInitialized)
406+
if(iterator.rem > 0 && propertyDataInitialized) {
385407
xcbDetectWMfromEWMH(&data.propData, data.connection, iterator.data->root, result);
408+
xcbFetchServerVendor(&data.propData, data.connection, result);
409+
}
386410

387411

388412
while(iterator.rem > 0)

src/detection/displayserver/linux/xlib.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ typedef struct X11PropertyData
1414
{
1515
FF_LIBRARY_SYMBOL(XInternAtom)
1616
FF_LIBRARY_SYMBOL(XGetWindowProperty)
17+
FF_LIBRARY_SYMBOL(XServerVendor)
1718
FF_LIBRARY_SYMBOL(XFree)
1819
} X11PropertyData;
1920

2021
static bool x11InitPropertyData(FF_MAYBE_UNUSED void* libraryHandle, X11PropertyData* propertyData)
2122
{
2223
FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, XInternAtom, false)
2324
FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, XGetWindowProperty, false)
25+
FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, XServerVendor, false)
2426
FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, XFree, false)
2527

2628
return true;
@@ -62,6 +64,23 @@ static void x11DetectWMFromEWMH(X11PropertyData* data, Display* display, FFDispl
6264
data->ffXFree(wmWindow);
6365
}
6466

67+
static void x11FetchServerVendor(X11PropertyData* data, Display* display, FFDisplayServerResult* result)
68+
{
69+
if(result->serverVendor.length > 0 || ffStrbufCompS(&result->wmProtocolName, FF_WM_PROTOCOL_WAYLAND) == 0)
70+
return;
71+
72+
const char* serverVendor = data->ffXServerVendor(display);
73+
if(ffStrSet(serverVendor)) {
74+
ffStrbufSetS(&result->serverVendor, serverVendor);
75+
76+
//Shorten Xorg vendor string
77+
if (!ffStrbufCompS(&result->serverVendor, "The X.Org Foundation"))
78+
ffStrbufSetS(&result->serverVendor, "Xorg");
79+
}
80+
81+
82+
}
83+
6584
typedef struct XrandrData
6685
{
6786
FF_LIBRARY_SYMBOL(XInternAtom)
@@ -305,8 +324,10 @@ const char* ffdsConnectXrandr(FFDisplayServerResult* result)
305324
if(data.display == NULL)
306325
return "XOpenDisplay() failed";
307326

308-
if(propertyDataInitialized && ScreenCount(data.display) > 0)
327+
if(propertyDataInitialized && ScreenCount(data.display) > 0) {
309328
x11DetectWMFromEWMH(&propertyData, data.display, result);
329+
x11FetchServerVendor(&propertyData, data.display, result);
330+
}
310331

311332
data.result = result;
312333

src/modules/wm/wm.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ void ffPrintWM(FFWMOptions* options)
4242
putchar(')');
4343
}
4444

45+
if(result->serverVendor.length > 0)
46+
{
47+
fputs(" [", stdout);
48+
ffStrbufWriteTo(&result->serverVendor, stdout);
49+
putchar(']');
50+
}
51+
4552
if(pluginName.length > 0)
4653
{
4754
fputs(" (with ", stdout);

0 commit comments

Comments
 (0)