VirtualBox

Changeset 99614 in vbox


Ignore:
Timestamp:
May 5, 2023 8:33:52 AM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
157140
Message:

Guest / Host bugref:10427:

  • Added new type VBGHSESSIONTYPE_XWAYLAND
  • Added the same detection logic as FE/Qt (see NativeWindowSubsystem::detectDisplayServerType()).
  • Added VBGHSessionTypeIs[X|Wayland]Available().
Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/GuestHost/SessionType.h

    r99584 r99614  
    6060    VBGHSESSIONTYPE_X11,
    6161    /** 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
    6365} VBGHSESSIONTYPE;
    6466
    6567const char *VBGHSessionTypeToStr(VBGHSESSIONTYPE enmType);
    6668VBGHSESSIONTYPE VBGHSessionTypeDetect(void);
     69bool VBGHSessionTypeIsXAvailable(VBGHSESSIONTYPE enmType);
     70bool VBGHSessionTypeIsWaylandAvailable(VBGHSESSIONTYPE enmType);
    6771
    6872#endif /* !VBOX_INCLUDED_GuestHost_SessionType_h */
  • trunk/src/VBox/GuestHost/SessionType.cpp

    r99580 r99614  
    3333#include <iprt/env.h>
    3434#include <iprt/string.h>
     35#include <iprt/ldr.h>
    3536
    3637#include <VBox/GuestHost/Log.h>
     
    5455        RT_CASE_RET_STR(VBGHSESSIONTYPE_NONE);
    5556        RT_CASE_RET_STR(VBGHSESSIONTYPE_AUTO);
     57        RT_CASE_RET_STR(VBGHSESSIONTYPE_X11);
    5658        RT_CASE_RET_STR(VBGHSESSIONTYPE_WAYLAND);
    57         RT_CASE_RET_STR(VBGHSESSIONTYPE_X11);
     59        RT_CASE_RET_STR(VBGHSESSIONTYPE_XWAYLAND);
    5860        default: break;
    5961    }
     
    6769 * @returns A value of VBGHSESSIONTYPE, or VBGHSESSIONTYPE_NONE if detection was not successful.
    6870 *
    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.
    7078 */
    7179VBGHSESSIONTYPE VBGHSessionTypeDetect(void)
    7280{
    7381    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;
    74126
    75127    /*
     
    111163
    112164    /* Set the returning type according to the precedence. */
    113     VBGHSESSIONTYPE retSessionType;
    114165    if      (waylandDisplayType    != VBGHSESSIONTYPE_NONE) retSessionType = waylandDisplayType;
    115166    else if (xdgSessionType        != VBGHSESSIONTYPE_NONE) retSessionType = xdgSessionType;
     
    140191}
    141192
     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 */
     199bool 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 */
     211bool 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.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette