Skip to content

Commit 6a75174

Browse files
committed
Add some api for the display applet.
display: Add helper functions for translating between logical and xinerama monitor numbers. Monitor 0 is traditionally the primary monitor. Logical monitors don't work this way - if you change the primary, its number stays the same. Fortunately the underlying x number is still available. This may eventually be complicated by monitors that allow multiple logical inputs (tiling), but I have none to test with.
1 parent 2cabdbd commit 6a75174

File tree

4 files changed

+207
-0
lines changed

4 files changed

+207
-0
lines changed

src/backends/meta-monitor-manager.c

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3564,3 +3564,150 @@ meta_monitor_manager_get_vendor_name (MetaMonitorManager *manager,
35643564

35653565
return gnome_pnp_ids_get_pnp_id (manager->pnp_ids, vendor);
35663566
}
3567+
3568+
#define META_MONITOR_TRANSFORM_INVALID -1
3569+
3570+
MetaMonitorTransform
3571+
xrandr_to_monitor_transform (MetaXrandrRotation rotation)
3572+
{
3573+
switch (rotation)
3574+
{
3575+
case META_XRANDR_ROTATION_NORMAL:
3576+
return META_MONITOR_TRANSFORM_NORMAL;
3577+
case META_XRANDR_ROTATION_LEFT:
3578+
return META_MONITOR_TRANSFORM_90;
3579+
case META_XRANDR_ROTATION_FLIPPED:
3580+
return META_MONITOR_TRANSFORM_180;
3581+
case META_XRANDR_ROTATION_RIGHT:
3582+
return META_MONITOR_TRANSFORM_270;
3583+
3584+
default:
3585+
g_return_val_if_reached (META_MONITOR_TRANSFORM_INVALID);
3586+
}
3587+
}
3588+
3589+
gboolean
3590+
meta_monitor_manager_can_apply_rotation (MetaMonitorManager *manager,
3591+
MetaXrandrRotation rotation)
3592+
{
3593+
gboolean ret = FALSE;
3594+
3595+
if (!meta_monitor_manager_get_is_builtin_display_on (manager))
3596+
return FALSE;
3597+
3598+
MetaOrientation orientation = xrandr_to_monitor_transform (rotation);
3599+
3600+
if (orientation == META_MONITOR_TRANSFORM_INVALID)
3601+
{
3602+
meta_warning ("Invalid orientation requested.");
3603+
return ret;
3604+
}
3605+
3606+
MetaMonitorsConfig *config = meta_monitor_config_manager_create_for_orientation (manager->config_manager, orientation);
3607+
3608+
ret = config != NULL;
3609+
3610+
g_clear_object (&config);
3611+
3612+
if (ret)
3613+
return TRUE;
3614+
3615+
MetaXrandrRotation current_rotation;
3616+
meta_monitor_manager_get_current_rotation (manager, &current_rotation);
3617+
3618+
if (current_rotation == rotation)
3619+
return TRUE;
3620+
3621+
return FALSE;
3622+
}
3623+
3624+
gboolean
3625+
meta_monitor_manager_apply_temporary_rotation (MetaMonitorManager *manager,
3626+
MetaXrandrRotation rotation)
3627+
{
3628+
MetaOrientation orientation = xrandr_to_monitor_transform (rotation);
3629+
3630+
if (orientation == META_MONITOR_TRANSFORM_INVALID)
3631+
{
3632+
meta_warning ("Invalid orientation requested.");
3633+
return FALSE;
3634+
}
3635+
3636+
GError *error = NULL;
3637+
MetaMonitorsConfig *config = meta_monitor_config_manager_create_for_orientation (manager->config_manager, orientation);
3638+
3639+
if (!config)
3640+
{
3641+
meta_warning ("Could not create config for rotation.");
3642+
return FALSE;
3643+
}
3644+
3645+
if (!meta_monitor_manager_apply_monitors_config (manager,
3646+
config,
3647+
META_MONITORS_CONFIG_METHOD_TEMPORARY,
3648+
&error))
3649+
{
3650+
g_warning ("Failed to use rotate monitor configuration: %s",
3651+
error->message);
3652+
g_error_free (error);
3653+
g_object_unref (config);
3654+
return FALSE;
3655+
}
3656+
3657+
g_object_unref (config);
3658+
3659+
return TRUE;
3660+
}
3661+
3662+
MetaXrandrRotation
3663+
monitor_transform_to_xrandr_rotation (MetaMonitorTransform transform)
3664+
{
3665+
switch (transform)
3666+
{
3667+
case META_MONITOR_TRANSFORM_NORMAL:
3668+
return META_XRANDR_ROTATION_NORMAL;
3669+
case META_MONITOR_TRANSFORM_90:
3670+
return META_XRANDR_ROTATION_LEFT;
3671+
case META_MONITOR_TRANSFORM_180:
3672+
return META_XRANDR_ROTATION_FLIPPED;
3673+
case META_MONITOR_TRANSFORM_270:
3674+
return META_XRANDR_ROTATION_RIGHT;
3675+
default:
3676+
g_return_val_if_reached (META_XRANDR_ROTATION_NORMAL);
3677+
}
3678+
}
3679+
3680+
/**
3681+
* meta_monitor_manager_get_current_rotation:
3682+
* @manager: A #MetaMonitorManager object
3683+
* @rotation: (out): The current #MetaXrandrRotation applied to the laptop panel.
3684+
*
3685+
* Returns %TRUE if there is a laptop panel and its current rotation
3686+
* can be determined, otherwise %FALSE
3687+
*/
3688+
gboolean
3689+
meta_monitor_manager_get_current_rotation (MetaMonitorManager *manager,
3690+
MetaXrandrRotation *rotation)
3691+
{
3692+
MetaMonitor *monitor;
3693+
MetaLogicalMonitor *logical_monitor;
3694+
3695+
*rotation = META_XRANDR_ROTATION_NORMAL;
3696+
monitor = meta_monitor_manager_get_laptop_panel (manager);
3697+
3698+
if (monitor == NULL || !meta_monitor_is_active (monitor))
3699+
{
3700+
return FALSE;
3701+
}
3702+
3703+
logical_monitor = meta_monitor_get_logical_monitor (monitor);
3704+
3705+
if (logical_monitor != NULL)
3706+
{
3707+
MetaMonitorTransform transform = meta_logical_monitor_get_transform (logical_monitor);
3708+
*rotation = monitor_transform_to_xrandr_rotation (transform);
3709+
return TRUE;
3710+
}
3711+
3712+
return FALSE;
3713+
}

src/core/display.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3925,4 +3925,40 @@ gboolean
39253925
meta_display_get_desklets_above (MetaDisplay *display)
39263926
{
39273927
return display->desklets_above;
3928+
}
3929+
3930+
gint
3931+
meta_display_xinerama_index_to_logical_index (MetaDisplay *display,
3932+
gint x_index)
3933+
{
3934+
MetaLogicalMonitor *monitor;
3935+
3936+
monitor = meta_x11_display_xinerama_index_to_logical_monitor (display->x11_display, x_index);
3937+
3938+
if (monitor == NULL)
3939+
{
3940+
return 0;
3941+
}
3942+
3943+
return monitor->number;
3944+
}
3945+
3946+
gint
3947+
meta_display_logical_index_to_xinerama_index (MetaDisplay *display,
3948+
gint log_index)
3949+
{
3950+
MetaBackend *backend = meta_get_backend ();
3951+
MetaMonitorManager *manager;
3952+
MetaLogicalMonitor *monitor;
3953+
3954+
manager = meta_backend_get_monitor_manager (backend);
3955+
monitor = meta_monitor_manager_get_logical_monitor_from_number (manager, log_index);
3956+
3957+
if (monitor == NULL)
3958+
{
3959+
return 0;
3960+
}
3961+
3962+
return meta_x11_display_logical_monitor_to_xinerama_index (display->x11_display, monitor);
3963+
39283964
}

src/meta/display.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,14 @@ META_EXPORT
289289
void meta_display_focus_default_window (MetaDisplay *display,
290290
guint32 timestamp);
291291

292+
META_EXPORT
293+
gint meta_display_xinerama_index_to_logical_index (MetaDisplay *display,
294+
gint x_index);
295+
296+
META_EXPORT
297+
gint meta_display_logical_index_to_xinerama_index (MetaDisplay *display,
298+
gint log_index);
299+
292300
/**
293301
* MetaDisplayCorner:
294302
* @META_DISPLAY_TOPLEFT: top-left corner

src/meta/meta-monitor-manager.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ typedef enum
3333
META_MONITOR_SWITCH_CONFIG_UNKNOWN,
3434
} MetaMonitorSwitchConfigType;
3535

36+
typedef enum
37+
{
38+
META_XRANDR_ROTATION_NORMAL,
39+
META_XRANDR_ROTATION_LEFT,
40+
META_XRANDR_ROTATION_FLIPPED,
41+
META_XRANDR_ROTATION_RIGHT
42+
} MetaXrandrRotation;
43+
3644
typedef struct _MetaMonitorManagerClass MetaMonitorManagerClass;
3745
typedef struct _MetaMonitorManager MetaMonitorManager;
3846

@@ -62,4 +70,12 @@ MetaMonitorSwitchConfigType meta_monitor_manager_get_switch_config (MetaMonitorM
6270
META_EXPORT
6371
gint meta_monitor_manager_get_display_configuration_timeout (void);
6472

73+
META_EXPORT
74+
gboolean meta_monitor_manager_can_apply_rotation (MetaMonitorManager *manager, MetaXrandrRotation rotation);
75+
76+
META_EXPORT
77+
gboolean meta_monitor_manager_apply_temporary_rotation (MetaMonitorManager *manager, MetaXrandrRotation rotation);
78+
79+
META_EXPORT
80+
gboolean meta_monitor_manager_get_current_rotation (MetaMonitorManager *manager, MetaXrandrRotation *rotation);
6581
#endif /* META_MONITOR_MANAGER_H */

0 commit comments

Comments
 (0)