VirtualBox

Changeset 106807 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
Oct 31, 2024 11:10:16 AM (3 months ago)
Author:
vboxsync
Message:

Additions: Linux/Wayland: Gtk helper: Minimize global vars usage, bugref:10796.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/x11/VBoxClient/wayland-helper-gtk.cpp

    r106790 r106807  
    8585} vbox_wl_gtk_ctx_t;
    8686
     87/** Private data for a callback when host reports clipboard formats. */
     88struct vbcl_wayland_hlp_gtk_clip_hg_report_priv
     89{
     90    /** Helper context. */
     91    vbox_wl_gtk_ctx_t *pCtx;
     92    /** Clipboard formats. */
     93    SHCLFORMATS fFormats;
     94};
     95
     96/** Private data for a callback when host requests clipboard
     97 *  data in specified format. */
     98struct vbcl_wayland_hlp_gtk_clip_gh_read_priv
     99{
     100    /** Helper context. */
     101    vbox_wl_gtk_ctx_t *pCtx;
     102    /** Clipboard format. */
     103    SHCLFORMAT uFormat;
     104};
     105
    87106/** Helper context. */
    88 static vbox_wl_gtk_ctx_t g_GtkCtx;
     107static vbox_wl_gtk_ctx_t g_GtkClipCtx;
    89108
    90109/**
     
    205224 * @returns IPRT status code.
    206225 * @param   enmSessionType      Session type (unused).
    207  * @param   pvUser              User data (unused).
     226 * @param   pvUser              User data.
    208227 */
    209228static DECLCALLBACK(int) vbcl_wayland_hlp_gtk_session_start_generic_cb(
    210229    vbcl_wl_session_type_t enmSessionType, void *pvUser)
    211230{
    212     RT_NOREF(enmSessionType, pvUser);
    213 
    214     VBCL_LOG_CALLBACK;
    215 
    216     return vbcl_wayland_hlp_gtk_session_prepare(&g_GtkCtx.Session);
     231    VBCL_LOG_CALLBACK;
     232
     233    vbox_wl_gtk_ctx_t *pCtx = (vbox_wl_gtk_ctx_t *)pvUser;
     234    AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
     235
     236    RT_NOREF(enmSessionType);
     237
     238    return vbcl_wayland_hlp_gtk_session_prepare(&pCtx->Session);
    217239}
    218240
     
    222244 * @returns IPRT status code.
    223245 * @param   enmSessionType      Session type (unused).
    224  * @param   pvUser              User data (session to reset).
     246 * @param   pvUser              User data.
    225247 */
    226248static DECLCALLBACK(int) vbcl_wayland_hlp_gtk_session_end_cb(
     
    269291    vbcl_wl_session_type_t enmSessionType, void *pvUser)
    270292{
    271     PRTLOCALIPCSESSION phIpcSession = (RTLOCALIPCSESSION *)pvUser;
    272     AssertPtrReturn(phIpcSession, VERR_INVALID_PARAMETER);
     293    vbox_wl_gtk_ctx_t *pCtx = (vbox_wl_gtk_ctx_t *)pvUser;
     294    AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
    273295
    274296    const vbcl::ipc::flow_t *pFlow;
     
    279301
    280302    /* Make sure valid session is in progress. */
    281     AssertReturn(g_GtkCtx.Session.uSessionId > 0, VERR_INVALID_PARAMETER);
     303    AssertReturn(pCtx->Session.uSessionId > 0, VERR_INVALID_PARAMETER);
    282304
    283305    /* Select corresponding IPC flow depending on session type. */
     
    296318    /* Proceed with selected flow. */
    297319    if (RT_VALID_PTR(pFlow))
    298         rc = g_GtkCtx.Session.oDataIpc->flow(pFlow, *phIpcSession);
     320        rc = pCtx->Session.oDataIpc->flow(pFlow, pCtx->Session.hIpcSession);
    299321
    300322    return rc;
     
    335357        while (!ASMAtomicReadBool(&pCtx->fShutdown))
    336358        {
    337             RTLOCALIPCSESSION hClientSession;
    338 
    339             rc = RTLocalIpcServerListen(pCtx->hIpcServer, &hClientSession);
     359            rc = RTLocalIpcServerListen(pCtx->hIpcServer, &pCtx->Session.hIpcSession);
    340360            if (RT_SUCCESS(rc))
    341361            {
     
    344364                /* Authenticate remote user. Only allow connection from
    345365                 * process who belongs to the same UID. */
    346                 rc = RTLocalIpcSessionQueryUserId(hClientSession, &uUid);
     366                rc = RTLocalIpcSessionQueryUserId(pCtx->Session.hIpcSession, &uUid);
    347367                if (RT_SUCCESS(rc))
    348368                {
     
    355375                        rc = vbcl_wayland_session_join(&pCtx->Session.Base,
    356376                                                       &vbcl_wayland_hlp_gtk_worker_join_cb,
    357                                                        &hClientSession);
     377                                                       pCtx);
    358378
    359379                        VBClLogVerbose(1, "IPC flow completed, rc=%Rrc\n", rc);
     
    372392                    VBClLogError("failed to get remote IPC UID, rc=%Rrc\n", rc);
    373393
    374                 RTLocalIpcSessionClose(hClientSession);
     394                RTLocalIpcSessionClose(pCtx->Session.hIpcSession);
    375395            }
    376396            else if (rc != VERR_CANCELLED)
     
    408428    VBCL_LOG_CALLBACK;
    409429
    410     RT_ZERO(g_GtkCtx);
    411 
    412     return vbcl_wayland_thread_start(&g_GtkCtx.Thread, vbcl_wayland_hlp_gtk_worker, "wl-gtk-ipc", &g_GtkCtx);
     430    RT_ZERO(g_GtkClipCtx);
     431
     432    return vbcl_wayland_thread_start(&g_GtkClipCtx.Thread, vbcl_wayland_hlp_gtk_worker, "wl-gtk-ipc", &g_GtkClipCtx);
    413433}
    414434
     
    420440    int rc;
    421441    int rcThread = 0;
     442    vbox_wl_gtk_ctx_t *pCtx = &g_GtkClipCtx;
    422443
    423444    /* Set termination flag. */
    424     g_GtkCtx.fShutdown = true;
     445    pCtx->fShutdown = true;
    425446
    426447    /* Cancel IPC loop. */
    427     rc = RTLocalIpcServerCancel(g_GtkCtx.hIpcServer);
     448    rc = RTLocalIpcServerCancel(pCtx->hIpcServer);
    428449    if (RT_FAILURE(rc))
    429450        VBClLogError("unable to notify IPC server about shutdown, rc=%Rrc\n", rc);
     
    432453    {
    433454        /* Wait for Gtk event loop thread to shutdown. */
    434         rc = RTThreadWait(g_GtkCtx.Thread, RT_MS_30SEC, &rcThread);
     455        rc = RTThreadWait(pCtx->Thread, RT_MS_30SEC, &rcThread);
    435456        VBClLogInfo("gtk event thread exited with status, rc=%Rrc\n", rcThread);
    436457    }
     
    446467static DECLCALLBACK(void) vbcl_wayland_hlp_gtk_clip_set_ctx(PVBGLR3SHCLCMDCTX pCtx)
    447468{
    448     g_GtkCtx.pClipboardCtx = pCtx;
     469    g_GtkClipCtx.pClipboardCtx = pCtx;
    449470}
    450471
     
    459480 * @param   enmSessionType      Session type, must be verified as
    460481 *                              a consistency check.
    461  * @param   pvUser              User data (unused).
     482 * @param   pvUser              User data.
    462483 */
    463484static DECLCALLBACK(int) vbcl_wayland_hlp_gtk_clip_popup_join_cb(
     
    467488             ? VINF_SUCCESS : VERR_WRONG_ORDER;
    468489
    469     RT_NOREF(pvUser);
    470 
    471     VBCL_LOG_CALLBACK;
    472 
    473     if (RT_SUCCESS(rc))
    474     {
    475         SHCLFORMATS fFmts = g_GtkCtx.Session.oDataIpc->m_fFmts.wait();
    476         if (fFmts !=  g_GtkCtx.Session.oDataIpc->m_fFmts.defaults())
    477             rc = VbglR3ClipboardReportFormats(g_GtkCtx.pClipboardCtx->idClient, fFmts);
     490    VBCL_LOG_CALLBACK;
     491
     492    vbox_wl_gtk_ctx_t *pCtx = (vbox_wl_gtk_ctx_t *)pvUser;
     493    AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
     494
     495    if (RT_SUCCESS(rc))
     496    {
     497        SHCLFORMATS fFmts = pCtx->Session.oDataIpc->m_fFmts.wait();
     498        if (fFmts !=  pCtx->Session.oDataIpc->m_fFmts.defaults())
     499            rc = VbglR3ClipboardReportFormats(pCtx->pClipboardCtx->idClient, fFmts);
    478500        else
    479501            rc = VERR_TIMEOUT;
     
    489511{
    490512    int rc;
    491 
    492     VBCL_LOG_CALLBACK;
    493 
    494     rc = vbcl_wayland_session_start(&g_GtkCtx.Session.Base,
     513    vbox_wl_gtk_ctx_t *pCtx = &g_GtkClipCtx;
     514
     515    VBCL_LOG_CALLBACK;
     516
     517    rc = vbcl_wayland_session_start(&pCtx->Session.Base,
    495518                                    VBCL_WL_CLIPBOARD_SESSION_TYPE_ANNOUNCE_TO_HOST,
    496519                                    &vbcl_wayland_hlp_gtk_session_start_generic_cb,
    497                                     &g_GtkCtx.Session);
    498     if (RT_SUCCESS(rc))
    499     {
    500         rc = vbcl_wayland_session_join(&g_GtkCtx.Session.Base,
     520                                    pCtx);
     521    if (RT_SUCCESS(rc))
     522    {
     523        rc = vbcl_wayland_session_join(&pCtx->Session.Base,
    501524                                       &vbcl_wayland_hlp_gtk_clip_popup_join_cb,
    502                                        NULL);
     525                                       pCtx);
    503526    }
    504527
     
    526549    vbcl_wl_session_type_t enmSessionType, void *pvUser)
    527550{
    528     SHCLFORMATS *pfFmts = (SHCLFORMATS *)pvUser;
    529     AssertPtrReturn(pfFmts, VERR_INVALID_PARAMETER);
     551    struct vbcl_wayland_hlp_gtk_clip_hg_report_priv *pPriv =
     552        (struct vbcl_wayland_hlp_gtk_clip_hg_report_priv *)pvUser;
     553    AssertPtrReturn(pPriv, VERR_INVALID_POINTER);
    530554
    531555    SHCLFORMAT uFmt;
     
    538562    if (RT_SUCCESS(rc))
    539563    {
    540         g_GtkCtx.Session.oDataIpc->m_fFmts.set(*pfFmts);
    541 
    542         uFmt = g_GtkCtx.Session.oDataIpc->m_uFmt.wait();
    543         if (uFmt != g_GtkCtx.Session.oDataIpc->m_uFmt.defaults())
     564        pPriv->pCtx->Session.oDataIpc->m_fFmts.set(pPriv->fFormats);
     565
     566        uFmt = pPriv->pCtx->Session.oDataIpc->m_uFmt.wait();
     567        if (uFmt != pPriv->pCtx->Session.oDataIpc->m_uFmt.defaults())
    544568        {
    545569            void *pvData;
    546570            uint32_t cbData;
    547571
    548             rc = VBClClipboardReadHostClipboard(g_GtkCtx.pClipboardCtx, uFmt, &pvData, &cbData);
     572            rc = VBClClipboardReadHostClipboard(pPriv->pCtx->pClipboardCtx, uFmt, &pvData, &cbData);
    549573            if (RT_SUCCESS(rc))
    550574            {
    551                 g_GtkCtx.Session.oDataIpc->m_pvDataBuf.set((uint64_t)pvData);
    552                 g_GtkCtx.Session.oDataIpc->m_cbDataBuf.set((uint64_t)cbData);
     575                pPriv->pCtx->Session.oDataIpc->m_pvDataBuf.set((uint64_t)pvData);
     576                pPriv->pCtx->Session.oDataIpc->m_cbDataBuf.set((uint64_t)cbData);
    553577            }
    554578        }
     
    566590{
    567591    int rc = VERR_NO_DATA;
     592    vbox_wl_gtk_ctx_t *pCtx = &g_GtkClipCtx;
    568593
    569594    VBCL_LOG_CALLBACK;
     
    571596    if (fFormats != VBOX_SHCL_FMT_NONE)
    572597    {
    573         rc = vbcl_wayland_session_start(&g_GtkCtx.Session.Base,
     598        rc = vbcl_wayland_session_start(&pCtx->Session.Base,
    574599                                        VBCL_WL_CLIPBOARD_SESSION_TYPE_COPY_TO_GUEST,
    575600                                        &vbcl_wayland_hlp_gtk_session_start_generic_cb,
    576                                         &g_GtkCtx.Session);
     601                                        pCtx);
    577602        if (RT_SUCCESS(rc))
    578603        {
    579             rc = vbcl_wayland_session_join(&g_GtkCtx.Session.Base,
     604            struct vbcl_wayland_hlp_gtk_clip_hg_report_priv priv = { pCtx, fFormats };
     605
     606            rc = vbcl_wayland_session_join(&pCtx->Session.Base,
    580607                                           &vbcl_wayland_hlp_gtk_clip_hg_report_join_cb,
    581                                            &fFormats);
     608                                           &priv);
    582609        }
    583610    }
     
    605632    vbcl_wl_session_type_t enmSessionType, void *pvUser)
    606633{
    607     SHCLFORMAT *puFmt = (SHCLFORMAT *)pvUser;
    608     AssertPtrReturn(puFmt, VERR_INVALID_PARAMETER);
     634    struct vbcl_wayland_hlp_gtk_clip_gh_read_priv *pPriv =
     635        (struct vbcl_wayland_hlp_gtk_clip_gh_read_priv *)pvUser;
     636    AssertPtrReturn(pPriv, VERR_INVALID_POINTER);
    609637
    610638    int rc = (   enmSessionType == VBCL_WL_CLIPBOARD_SESSION_TYPE_COPY_TO_HOST
     
    620648
    621649        /* Store requested clipboard format to the session. */
    622         g_GtkCtx.Session.oDataIpc->m_uFmt.set(*puFmt);
     650        pPriv->pCtx->Session.oDataIpc->m_uFmt.set(pPriv->uFormat);
    623651
    624652        /* Wait for data in requested format. */
    625         pvData = (void *)g_GtkCtx.Session.oDataIpc->m_pvDataBuf.wait();
    626         cbData = g_GtkCtx.Session.oDataIpc->m_cbDataBuf.wait();
    627         if (   cbData != g_GtkCtx.Session.oDataIpc->m_cbDataBuf.defaults()
    628             && pvData != (void *)g_GtkCtx.Session.oDataIpc->m_pvDataBuf.defaults())
     653        pvData = (void *)pPriv->pCtx->Session.oDataIpc->m_pvDataBuf.wait();
     654        cbData = pPriv->pCtx->Session.oDataIpc->m_cbDataBuf.wait();
     655        if (   cbData != pPriv->pCtx->Session.oDataIpc->m_cbDataBuf.defaults()
     656            && pvData != (void *)pPriv->pCtx->Session.oDataIpc->m_pvDataBuf.defaults())
    629657        {
    630658            /* Send clipboard data to the host. */
    631             rc = VbglR3ClipboardWriteDataEx(g_GtkCtx.pClipboardCtx, *puFmt, pvData, cbData);
     659            rc = VbglR3ClipboardWriteDataEx(pPriv->pCtx->pClipboardCtx, pPriv->uFormat, pvData, cbData);
    632660        }
    633661        else
     
    644672{
    645673    int rc = VINF_SUCCESS;
     674    vbox_wl_gtk_ctx_t *pCtx = &g_GtkClipCtx;
    646675
    647676    VBCL_LOG_CALLBACK;
     
    667696         * vboxwl tool again
    668697         */
    669         if (!vbcl_wayland_session_is_started(&g_GtkCtx.Session.Base))
     698        if (!vbcl_wayland_session_is_started(&pCtx->Session.Base))
    670699        {
    671             rc = vbcl_wayland_session_start(&g_GtkCtx.Session.Base,
     700            rc = vbcl_wayland_session_start(&pCtx->Session.Base,
    672701                                            VBCL_WL_CLIPBOARD_SESSION_TYPE_COPY_TO_HOST,
    673702                                            &vbcl_wayland_hlp_gtk_session_start_generic_cb,
    674                                             NULL);
     703                                            pCtx);
    675704        }
    676705
    677706        if (RT_SUCCESS(rc))
    678707        {
    679             rc = vbcl_wayland_session_join(&g_GtkCtx.Session.Base,
     708            struct vbcl_wayland_hlp_gtk_clip_gh_read_priv priv = { pCtx, uFmt };
     709
     710            rc = vbcl_wayland_session_join(&pCtx->Session.Base,
    680711                                           &vbcl_wayland_hlp_gtk_clip_gh_read_join_cb,
    681                                            &uFmt);
     712                                           &priv);
    682713        }
    683714    }
Note: See TracChangeset for help on using the changeset viewer.

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