Changeset 99614 in vbox
- Timestamp:
- May 5, 2023 8:33:52 AM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 157140
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/GuestHost/SessionType.h
r99584 r99614 60 60 VBGHSESSIONTYPE_X11, 61 61 /** Wayland. */ 62 VBGHSESSIONTYPE_WAYLAND 62 VBGHSESSIONTYPE_WAYLAND, 63 /** XWayland; Wayland is running, but some (older) apps need X as a bridge as well. */ 64 VBGHSESSIONTYPE_XWAYLAND 63 65 } VBGHSESSIONTYPE; 64 66 65 67 const char *VBGHSessionTypeToStr(VBGHSESSIONTYPE enmType); 66 68 VBGHSESSIONTYPE VBGHSessionTypeDetect(void); 69 bool VBGHSessionTypeIsXAvailable(VBGHSESSIONTYPE enmType); 70 bool VBGHSessionTypeIsWaylandAvailable(VBGHSESSIONTYPE enmType); 67 71 68 72 #endif /* !VBOX_INCLUDED_GuestHost_SessionType_h */ -
trunk/src/VBox/GuestHost/SessionType.cpp
r99580 r99614 33 33 #include <iprt/env.h> 34 34 #include <iprt/string.h> 35 #include <iprt/ldr.h> 35 36 36 37 #include <VBox/GuestHost/Log.h> … … 54 55 RT_CASE_RET_STR(VBGHSESSIONTYPE_NONE); 55 56 RT_CASE_RET_STR(VBGHSESSIONTYPE_AUTO); 57 RT_CASE_RET_STR(VBGHSESSIONTYPE_X11); 56 58 RT_CASE_RET_STR(VBGHSESSIONTYPE_WAYLAND); 57 RT_CASE_RET_STR(VBGHSESSIONTYPE_X 11);59 RT_CASE_RET_STR(VBGHSESSIONTYPE_XWAYLAND); 58 60 default: break; 59 61 } … … 67 69 * @returns A value of VBGHSESSIONTYPE, or VBGHSESSIONTYPE_NONE if detection was not successful. 68 70 * 69 * @note Precedence is: VBGH_ENV_WAYLAND_DISPLAY, VBGH_ENV_XDG_SESSION_TYPE, VBGH_ENV_XDG_CURRENT_DESKTOP. 71 * @note Precedence is: 72 * - Connecting to Wayland (via libwayland-client.so) and/or X11 (via libX11.so). 73 * - VBGH_ENV_WAYLAND_DISPLAY 74 * - VBGH_ENV_XDG_SESSION_TYPE 75 * - VBGH_ENV_XDG_CURRENT_DESKTOP. 76 * 77 * Will print a warning to the release log if configuration mismatches. 70 78 */ 71 79 VBGHSESSIONTYPE VBGHSessionTypeDetect(void) 72 80 { 73 81 VBGHLogVerbose(1, "Detecting session type ...\n"); 82 83 /* Try to connect to the wayland display, assuming it succeeds only when a wayland compositor is active: */ 84 void *pWaylandDisplay = NULL; 85 RTLDRMOD hWaylandClient = NIL_RTLDRMOD; 86 int rc = RTLdrLoadSystem("libwayland-client.so", /* fNoUnload = */ true, &hWaylandClient); 87 if (RT_SUCCESS(rc)) 88 { 89 void * (*pWaylandDisplayConnect)(const char *); 90 rc = RTLdrGetSymbol(hWaylandClient, "wl_display_connect", (void **)&pWaylandDisplayConnect); 91 if ( RT_SUCCESS(rc) 92 && pWaylandDisplayConnect) 93 pWaylandDisplay = pWaylandDisplayConnect(NULL); 94 RTLdrClose(hWaylandClient); 95 } 96 97 /* Also try to connect to the default X11 display to determine if Xserver is running: */ 98 void *pXDisplay = NULL; 99 RTLDRMOD hX11 = NIL_RTLDRMOD; 100 rc = RTLdrLoadSystem("libX11.so", /* fNoUnload = */ true, &hX11); 101 if (RT_SUCCESS(rc)) 102 { 103 void * (*pfnOpenDisplay)(const char *); 104 rc = RTLdrGetSymbol(hX11, "XOpenDisplay", (void **)&pfnOpenDisplay); 105 if ( RT_SUCCESS(rc) 106 && pfnOpenDisplay) 107 pXDisplay = pfnOpenDisplay(NULL); 108 RTLdrClose(hX11); 109 } 110 111 /* If both wayland and X11 display can be connected then we should have XWayland: */ 112 VBGHSESSIONTYPE retSessionType = VBGHSESSIONTYPE_NONE; 113 if (pWaylandDisplay && pXDisplay) 114 retSessionType = VBGHSESSIONTYPE_XWAYLAND; 115 else if (pWaylandDisplay && !pXDisplay) 116 retSessionType = VBGHSESSIONTYPE_WAYLAND; 117 else if (!pWaylandDisplay && pXDisplay) 118 retSessionType = VBGHSESSIONTYPE_X11; 119 120 VBGHLogVerbose(1, "Detected via connection: %s\n", VBGHSessionTypeToStr(retSessionType)); 121 122 /* If retSessionType is set, we assume we're done here; 123 * otherwise try the environment variables as a fallback. */ 124 if (retSessionType != VBGHSESSIONTYPE_NONE) 125 return retSessionType; 74 126 75 127 /* … … 111 163 112 164 /* Set the returning type according to the precedence. */ 113 VBGHSESSIONTYPE retSessionType;114 165 if (waylandDisplayType != VBGHSESSIONTYPE_NONE) retSessionType = waylandDisplayType; 115 166 else if (xdgSessionType != VBGHSESSIONTYPE_NONE) retSessionType = xdgSessionType; … … 140 191 } 141 192 193 /** 194 * Returns true if @a enmType is indicating running X. 195 * 196 * @returns \c true if @a enmType is running X, \c false if not. 197 * @param enmType Type to check. 198 */ 199 bool VBGHSessionTypeIsXAvailable(VBGHSESSIONTYPE enmType) 200 { 201 return enmType == VBGHSESSIONTYPE_XWAYLAND 202 || enmType == VBGHSESSIONTYPE_X11; 203 } 204 205 /** 206 * Returns true if @a enmType is indicating running Wayland. 207 * 208 * @returns \c true if @a enmType is running Wayland, \c false if not. 209 * @param enmType Type to check. 210 */ 211 bool VBGHSessionTypeIsWaylandAvailable(VBGHSESSIONTYPE enmType) 212 { 213 return enmType == VBGHSESSIONTYPE_XWAYLAND 214 || enmType == VBGHSESSIONTYPE_WAYLAND; 215 } 216
Note:
See TracChangeset
for help on using the changeset viewer.