backend: Set up and use ownership chains
This means objects have an owner, where the chain eventually always leads to a MetaContext. This also means that all objects can find their way to other object instances via the chain, instead of scattered global singletons. This is a squashed commit originally containing the following: cursor-tracker: Don't get backend from singleton idle-manager: Don't get backend from singleton input-device: Pass pointer to backend during construction The backend is needed during construction to get the wacom database. input-mapper: Pass backend when constructing monitor: Don't get backend from singleton monitor-manager: Get backend directly from monitor manager remote: Get backend from manager class For the remote desktop and screen cast implementations, replace getting the backend from singletons with getting it via the manager classes. launcher: Pass backend during construction device-pool: Pass backend during construction Instead of passing the (maybe null) launcher, pass the backend, and get the launcher from there. That way we always have a way to some known context from the device pool. drm-buffer/gbm: Get backend via device pool cursor-renderer: Get backend directly from renderer input-device: Get backend getter input-settings: Add backend construct property and getter input-settings/x11: Don't get backend from singleton renderer: Get backend from renderer itself seat-impl: Add backend getter seat/native: Get backend from instance struct stage-impl: Get backend from stage impl itself x11/xkb-a11y: Don't get backend from singleton backend/x11/nested: Don't get Wayland compositor from singleton crtc: Add backend property Adding a link to the GPU isn't enough; the virtual CRTCs of virtual monitors doesn't have one. cursor-tracker: Don't get display from singleton remote: Don't get display from singleton seat: Don't get display from singleton backend/x11: Don't get display from singleton Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2718>
This commit is contained in:
@ -789,12 +789,14 @@ meta_backend_native_initable_init (GInitable *initable,
|
||||
break;
|
||||
}
|
||||
|
||||
native->launcher = meta_launcher_new (session_id, seat_id, error);
|
||||
native->launcher = meta_launcher_new (backend,
|
||||
session_id, seat_id,
|
||||
error);
|
||||
if (!native->launcher)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
native->device_pool = meta_device_pool_new (native->launcher);
|
||||
native->device_pool = meta_device_pool_new (native);
|
||||
native->udev = meta_udev_new (native);
|
||||
|
||||
kms_flags = META_KMS_FLAG_NONE;
|
||||
|
@ -525,6 +525,7 @@ meta_crtc_kms_new (MetaGpuKms *gpu_kms,
|
||||
kms_crtc);
|
||||
crtc_kms = g_object_new (META_TYPE_CRTC_KMS,
|
||||
"id", (uint64_t) meta_kms_crtc_get_id (kms_crtc),
|
||||
"backend", meta_gpu_get_backend (gpu),
|
||||
"gpu", gpu,
|
||||
NULL);
|
||||
|
||||
|
@ -31,9 +31,11 @@ struct _MetaCrtcVirtual
|
||||
G_DEFINE_TYPE (MetaCrtcVirtual, meta_crtc_virtual, META_TYPE_CRTC_NATIVE)
|
||||
|
||||
MetaCrtcVirtual *
|
||||
meta_crtc_virtual_new (uint64_t id)
|
||||
meta_crtc_virtual_new (MetaBackend *backend,
|
||||
uint64_t id)
|
||||
{
|
||||
return g_object_new (META_TYPE_CRTC_VIRTUAL,
|
||||
"backend", backend,
|
||||
"id", META_CRTC_VIRTUAL_ID_BIT | id,
|
||||
NULL);
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ G_DECLARE_FINAL_TYPE (MetaCrtcVirtual, meta_crtc_virtual,
|
||||
META, CRTC_VIRTUAL,
|
||||
MetaCrtcNative)
|
||||
|
||||
MetaCrtcVirtual * meta_crtc_virtual_new (uint64_t id);
|
||||
MetaCrtcVirtual * meta_crtc_virtual_new (MetaBackend *backend,
|
||||
uint64_t id);
|
||||
|
||||
#endif /* META_CRTC_VIRTUAL_H */
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "backends/native/meta-backend-native-types.h"
|
||||
#include "backends/native/meta-device-pool.h"
|
||||
#include "backends/native/meta-launcher.h"
|
||||
|
||||
@ -30,6 +31,6 @@ G_DECLARE_FINAL_TYPE (MetaDevicePool, meta_device_pool,
|
||||
META, DEVICE_POOL,
|
||||
GObject)
|
||||
|
||||
MetaDevicePool * meta_device_pool_new (MetaLauncher *launcher);
|
||||
MetaDevicePool * meta_device_pool_new (MetaBackendNative *backend_native);
|
||||
|
||||
#endif /* META_DEVICE_POOL_PRIVATE_H */
|
||||
|
@ -27,7 +27,9 @@
|
||||
#include <sys/sysmacros.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backends/native/meta-backend-native.h"
|
||||
#include "backends/native/meta-launcher.h"
|
||||
#include "meta/meta-backend.h"
|
||||
#include "meta/util.h"
|
||||
|
||||
#include "meta-dbus-login1.h"
|
||||
@ -50,6 +52,8 @@ struct _MetaDevicePool
|
||||
{
|
||||
GObject parent;
|
||||
|
||||
MetaBackend *backend;
|
||||
|
||||
MetaDbusLogin1Session *session_proxy;
|
||||
|
||||
GMutex mutex;
|
||||
@ -351,12 +355,16 @@ release_device_file (MetaDevicePool *pool,
|
||||
}
|
||||
|
||||
MetaDevicePool *
|
||||
meta_device_pool_new (MetaLauncher *launcher)
|
||||
meta_device_pool_new (MetaBackendNative *backend_native)
|
||||
{
|
||||
MetaDevicePool *pool;
|
||||
MetaLauncher *launcher;
|
||||
|
||||
pool = g_object_new (META_TYPE_DEVICE_POOL, NULL);
|
||||
|
||||
pool->backend = META_BACKEND (backend_native);
|
||||
|
||||
launcher = meta_backend_native_get_launcher (backend_native);
|
||||
if (launcher)
|
||||
pool->session_proxy = meta_launcher_get_session_proxy (launcher);
|
||||
|
||||
@ -387,3 +395,9 @@ meta_device_pool_class_init (MetaDevicePoolClass *klass)
|
||||
|
||||
object_class->finalize = meta_device_pool_finalize;
|
||||
}
|
||||
|
||||
MetaBackend *
|
||||
meta_device_pool_get_backend (MetaDevicePool *pool)
|
||||
{
|
||||
return pool->backend;
|
||||
}
|
||||
|
@ -68,6 +68,8 @@ MetaDeviceFile * meta_device_pool_open (MetaDevicePool *pool,
|
||||
MetaDeviceFileFlags flags,
|
||||
GError **error);
|
||||
|
||||
MetaBackend * meta_device_pool_get_backend (MetaDevicePool *pool);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaDeviceFile, meta_device_file_release)
|
||||
|
||||
#endif /* META_DEVICE_FILE_POOL_H */
|
||||
|
@ -33,6 +33,7 @@
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/native/meta-cogl-utils.h"
|
||||
#include "backends/native/meta-device-pool.h"
|
||||
#include "backends/native/meta-drm-buffer-private.h"
|
||||
|
||||
struct _MetaDrmBufferGbm
|
||||
@ -236,7 +237,9 @@ meta_drm_buffer_gbm_fill_timings (MetaDrmBuffer *buffer,
|
||||
GError **error)
|
||||
{
|
||||
MetaDrmBufferGbm *buffer_gbm = META_DRM_BUFFER_GBM (buffer);
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaDeviceFile *device_file = meta_drm_buffer_get_device_file (buffer);
|
||||
MetaDevicePool *device_pool = meta_device_file_get_pool (device_file);
|
||||
MetaBackend *backend = meta_device_pool_get_backend (device_pool);
|
||||
MetaEgl *egl = meta_backend_get_egl (backend);
|
||||
ClutterBackend *clutter_backend =
|
||||
meta_backend_get_clutter_backend (backend);
|
||||
@ -354,7 +357,10 @@ meta_drm_buffer_gbm_blit_to_framebuffer (CoglScanout *scanout,
|
||||
GError **error)
|
||||
{
|
||||
MetaDrmBufferGbm *buffer_gbm = META_DRM_BUFFER_GBM (scanout);
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaDrmBuffer *buffer = META_DRM_BUFFER (buffer_gbm);
|
||||
MetaDeviceFile *device_file = meta_drm_buffer_get_device_file (buffer);
|
||||
MetaDevicePool *device_pool = meta_device_file_get_pool (device_file);
|
||||
MetaBackend *backend = meta_device_pool_get_backend (device_pool);
|
||||
MetaEgl *egl = meta_backend_get_egl (backend);
|
||||
ClutterBackend *clutter_backend =
|
||||
meta_backend_get_clutter_backend (backend);
|
||||
|
@ -1461,6 +1461,7 @@ meta_input_device_native_new_in_impl (MetaSeatImpl *seat_impl,
|
||||
}
|
||||
|
||||
device = g_object_new (META_TYPE_INPUT_DEVICE_NATIVE,
|
||||
"backend", meta_seat_impl_get_backend (seat_impl),
|
||||
"name", libinput_device_get_name (libinput_device),
|
||||
"device-type", type,
|
||||
"capabilities", capabilities,
|
||||
@ -1532,6 +1533,7 @@ meta_input_device_native_new_virtual (MetaSeatImpl *seat_impl,
|
||||
};
|
||||
|
||||
device = g_object_new (META_TYPE_INPUT_DEVICE_NATIVE,
|
||||
"backend", meta_seat_impl_get_backend (seat_impl),
|
||||
"name", name,
|
||||
"device-type", type,
|
||||
"device-mode", mode,
|
||||
|
@ -831,6 +831,7 @@ MetaInputSettings *
|
||||
meta_input_settings_native_new_in_impl (MetaSeatImpl *seat_impl)
|
||||
{
|
||||
return g_object_new (META_TYPE_INPUT_SETTINGS_NATIVE,
|
||||
"backend", meta_seat_impl_get_backend (seat_impl),
|
||||
"seat-impl", seat_impl,
|
||||
NULL);
|
||||
}
|
||||
|
@ -46,6 +46,8 @@
|
||||
|
||||
struct _MetaLauncher
|
||||
{
|
||||
MetaBackend *backend;
|
||||
|
||||
MetaDbusLogin1Session *session_proxy;
|
||||
MetaDbusLogin1Seat *seat_proxy;
|
||||
char *seat_id;
|
||||
@ -309,7 +311,7 @@ get_seat_proxy (gchar *seat_id,
|
||||
static void
|
||||
sync_active (MetaLauncher *self)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaBackend *backend = self->backend;
|
||||
MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend);
|
||||
MetaDbusLogin1Session *session_proxy = self->session_proxy;
|
||||
gboolean active;
|
||||
@ -371,9 +373,10 @@ meta_launcher_get_session_proxy (MetaLauncher *launcher)
|
||||
}
|
||||
|
||||
MetaLauncher *
|
||||
meta_launcher_new (const char *fallback_session_id,
|
||||
const char *fallback_seat_id,
|
||||
GError **error)
|
||||
meta_launcher_new (MetaBackend *backend,
|
||||
const char *fallback_session_id,
|
||||
const char *fallback_seat_id,
|
||||
GError **error)
|
||||
{
|
||||
MetaLauncher *self = NULL;
|
||||
g_autoptr (MetaDbusLogin1Session) session_proxy = NULL;
|
||||
@ -420,6 +423,7 @@ meta_launcher_new (const char *fallback_session_id,
|
||||
goto fail;
|
||||
|
||||
self = g_new0 (MetaLauncher, 1);
|
||||
self->backend = backend;
|
||||
self->session_proxy = g_object_ref (session_proxy);
|
||||
self->seat_proxy = g_object_ref (seat_proxy);
|
||||
self->seat_id = g_steal_pointer (&seat_id);
|
||||
@ -455,3 +459,9 @@ meta_launcher_activate_vt (MetaLauncher *launcher,
|
||||
return meta_dbus_login1_seat_call_switch_to_sync (launcher->seat_proxy, vt,
|
||||
NULL, error);
|
||||
}
|
||||
|
||||
MetaBackend *
|
||||
meta_launcher_get_backend (MetaLauncher *launcher)
|
||||
{
|
||||
return launcher->backend;
|
||||
}
|
||||
|
@ -22,10 +22,13 @@
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "backends/meta-backend-types.h"
|
||||
|
||||
typedef struct _MetaLauncher MetaLauncher;
|
||||
typedef struct _MetaDbusLogin1Session MetaDbusLogin1Session;
|
||||
|
||||
MetaLauncher *meta_launcher_new (const char *session_id,
|
||||
MetaLauncher *meta_launcher_new (MetaBackend *backend,
|
||||
const char *session_id,
|
||||
const char *custom_seat_id,
|
||||
GError **error);
|
||||
void meta_launcher_free (MetaLauncher *self);
|
||||
@ -38,5 +41,7 @@ const char * meta_launcher_get_seat_id (MetaLauncher *launcher)
|
||||
|
||||
MetaDbusLogin1Session * meta_launcher_get_session_proxy (MetaLauncher *launcher);
|
||||
|
||||
MetaBackend * meta_launcher_get_backend (MetaLauncher *launcher);
|
||||
|
||||
|
||||
#endif /* META_LAUNCHER_H */
|
||||
|
@ -310,7 +310,7 @@ meta_monitor_manager_native_apply_monitors_config (MetaMonitorManager *ma
|
||||
{
|
||||
if (!manager->in_init)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
|
||||
MetaRenderer *renderer = meta_backend_get_renderer (backend);
|
||||
|
||||
meta_renderer_native_reset_modes (META_RENDERER_NATIVE (renderer));
|
||||
@ -628,13 +628,14 @@ meta_monitor_manager_native_create_virtual_monitor (MetaMonitorManager
|
||||
const MetaVirtualMonitorInfo *info,
|
||||
GError **error)
|
||||
{
|
||||
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
|
||||
MetaMonitorManagerNative *manager_native =
|
||||
META_MONITOR_MANAGER_NATIVE (manager);
|
||||
MetaVirtualMonitorNative *virtual_monitor_native;
|
||||
uint64_t id;
|
||||
|
||||
id = allocate_virtual_monitor_id (manager_native);
|
||||
virtual_monitor_native = meta_virtual_monitor_native_new (id, info);
|
||||
virtual_monitor_native = meta_virtual_monitor_native_new (backend, id, info);
|
||||
g_signal_connect (virtual_monitor_native, "notify::crtc-mode",
|
||||
G_CALLBACK (on_virtual_monitor_mode_changed),
|
||||
manager);
|
||||
|
@ -415,7 +415,8 @@ meta_renderer_native_choose_egl_config (CoglDisplay *cogl_display,
|
||||
{
|
||||
CoglRenderer *cogl_renderer = cogl_display->renderer;
|
||||
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaRenderer *renderer = cogl_renderer->custom_winsys_user_data;
|
||||
MetaBackend *backend = meta_renderer_get_backend (renderer);
|
||||
MetaEgl *egl = meta_backend_get_egl (backend);
|
||||
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
|
||||
EGLDisplay egl_display = cogl_renderer_egl->edpy;
|
||||
@ -486,10 +487,12 @@ meta_renderer_native_destroy_egl_display (CoglDisplay *cogl_display)
|
||||
}
|
||||
|
||||
static EGLSurface
|
||||
create_dummy_pbuffer_surface (EGLDisplay egl_display,
|
||||
GError **error)
|
||||
create_dummy_pbuffer_surface (CoglRenderer *cogl_renderer,
|
||||
EGLDisplay egl_display,
|
||||
GError **error)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaRenderer *renderer = cogl_renderer->custom_winsys_user_data;
|
||||
MetaBackend *backend = meta_renderer_get_backend (renderer);
|
||||
MetaEgl *egl = meta_backend_get_egl (backend);
|
||||
EGLConfig pbuffer_config;
|
||||
static const EGLint pbuffer_config_attribs[] = {
|
||||
@ -528,7 +531,9 @@ meta_renderer_native_egl_context_created (CoglDisplay *cogl_display,
|
||||
COGL_EGL_WINSYS_FEATURE_SURFACELESS_CONTEXT) == 0)
|
||||
{
|
||||
cogl_display_egl->dummy_surface =
|
||||
create_dummy_pbuffer_surface (cogl_renderer_egl->edpy, error);
|
||||
create_dummy_pbuffer_surface (cogl_renderer,
|
||||
cogl_renderer_egl->edpy,
|
||||
error);
|
||||
if (cogl_display_egl->dummy_surface == EGL_NO_SURFACE)
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -3747,3 +3747,9 @@ meta_seat_impl_get_input_settings (MetaSeatImpl *seat_impl)
|
||||
{
|
||||
return seat_impl->input_settings;
|
||||
}
|
||||
|
||||
MetaBackend *
|
||||
meta_seat_impl_get_backend (MetaSeatImpl *seat_impl)
|
||||
{
|
||||
return meta_seat_native_get_backend (seat_impl->seat_native);
|
||||
}
|
||||
|
@ -252,4 +252,6 @@ void meta_seat_impl_queue_main_thread_idle (MetaSeatImpl *seat_impl,
|
||||
gpointer user_data,
|
||||
GDestroyNotify destroy_notify);
|
||||
|
||||
MetaBackend * meta_seat_impl_get_backend (MetaSeatImpl *seat_impl);
|
||||
|
||||
#endif /* META_SEAT_IMPL_H */
|
||||
|
@ -261,7 +261,9 @@ meta_seat_native_peek_devices (ClutterSeat *seat)
|
||||
static void
|
||||
meta_seat_native_bell_notify (ClutterSeat *seat)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaSeatNative *seat_native = META_SEAT_NATIVE (seat);
|
||||
MetaContext *context = meta_backend_get_context (seat_native->backend);
|
||||
MetaDisplay *display = meta_context_get_display (context);
|
||||
|
||||
meta_bell_notify (display, NULL);
|
||||
}
|
||||
@ -595,7 +597,7 @@ meta_seat_native_maybe_ensure_cursor_renderer (MetaSeatNative *seat_native,
|
||||
MetaCursorRendererNative *cursor_renderer_native;
|
||||
|
||||
cursor_renderer_native =
|
||||
meta_cursor_renderer_native_new (meta_get_backend (),
|
||||
meta_cursor_renderer_native_new (seat_native->backend,
|
||||
seat_native->core_pointer);
|
||||
seat_native->cursor_renderer =
|
||||
META_CURSOR_RENDERER (cursor_renderer_native);
|
||||
@ -622,7 +624,7 @@ meta_seat_native_maybe_ensure_cursor_renderer (MetaSeatNative *seat_native,
|
||||
|
||||
if (!cursor_renderer)
|
||||
{
|
||||
cursor_renderer = meta_cursor_renderer_new (meta_get_backend (),
|
||||
cursor_renderer = meta_cursor_renderer_new (seat_native->backend,
|
||||
device);
|
||||
g_hash_table_insert (seat_native->tablet_cursors,
|
||||
device, cursor_renderer);
|
||||
|
@ -59,7 +59,8 @@ G_DEFINE_TYPE_WITH_CODE (MetaStageNative, meta_stage_native,
|
||||
void
|
||||
meta_stage_native_rebuild_views (MetaStageNative *stage_native)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_native);
|
||||
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
|
||||
MetaRenderer *renderer = meta_backend_get_renderer (backend);
|
||||
ClutterActor *stage = meta_backend_get_stage (backend);
|
||||
|
||||
@ -77,7 +78,8 @@ static void
|
||||
meta_stage_native_get_geometry (ClutterStageWindow *stage_window,
|
||||
cairo_rectangle_int_t *geometry)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_window);
|
||||
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
|
||||
@ -103,7 +105,8 @@ meta_stage_native_get_geometry (ClutterStageWindow *stage_window,
|
||||
static GList *
|
||||
meta_stage_native_get_views (ClutterStageWindow *stage_window)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_window);
|
||||
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
|
||||
MetaRenderer *renderer = meta_backend_get_renderer (backend);
|
||||
|
||||
return meta_renderer_get_views (renderer);
|
||||
@ -114,7 +117,8 @@ meta_stage_native_prepare_frame (ClutterStageWindow *stage_window,
|
||||
ClutterStageView *stage_view,
|
||||
ClutterFrame *frame)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_window);
|
||||
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
|
||||
MetaRenderer *renderer = meta_backend_get_renderer (backend);
|
||||
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
|
||||
MetaCursorRenderer *cursor_renderer =
|
||||
@ -152,7 +156,8 @@ meta_stage_native_finish_frame (ClutterStageWindow *stage_window,
|
||||
ClutterStageView *stage_view,
|
||||
ClutterFrame *frame)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_window);
|
||||
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
|
||||
MetaRenderer *renderer = meta_backend_get_renderer (backend);
|
||||
|
||||
meta_renderer_native_finish_frame (META_RENDERER_NATIVE (renderer),
|
||||
|
@ -72,7 +72,8 @@ meta_virtual_monitor_native_get_id (MetaVirtualMonitorNative *virtual_monitor_na
|
||||
}
|
||||
|
||||
MetaVirtualMonitorNative *
|
||||
meta_virtual_monitor_native_new (uint64_t id,
|
||||
meta_virtual_monitor_native_new (MetaBackend *backend,
|
||||
uint64_t id,
|
||||
const MetaVirtualMonitorInfo *info)
|
||||
{
|
||||
MetaVirtualMonitorNative *virtual_monitor_native;
|
||||
@ -80,7 +81,7 @@ meta_virtual_monitor_native_new (uint64_t id,
|
||||
MetaCrtcModeVirtual *crtc_mode_virtual;
|
||||
MetaOutputVirtual *output_virtual;
|
||||
|
||||
crtc_virtual = meta_crtc_virtual_new (id);
|
||||
crtc_virtual = meta_crtc_virtual_new (backend, id);
|
||||
crtc_mode_virtual = meta_crtc_mode_virtual_new (mode_id++, &info->mode_info);
|
||||
output_virtual = meta_output_virtual_new (id, info,
|
||||
crtc_virtual,
|
||||
|
@ -39,7 +39,8 @@ MetaCrtc * meta_virtual_monitor_native_get_crtc (MetaVirtualMonitorNative *virtu
|
||||
|
||||
MetaOutput * meta_virtual_monitor_native_get_output (MetaVirtualMonitorNative *virtual_monitor_native);
|
||||
|
||||
MetaVirtualMonitorNative * meta_virtual_monitor_native_new (uint64_t id,
|
||||
MetaVirtualMonitorNative * meta_virtual_monitor_native_new (MetaBackend *backend,
|
||||
uint64_t id,
|
||||
const MetaVirtualMonitorInfo *info);
|
||||
|
||||
#endif /* META_VIRTUAL_MONITOR_NATIVE_H */
|
||||
|
Reference in New Issue
Block a user