x11: Use a GListStore for the monitors

This commit is contained in:
Benjamin Otte
2020-05-12 19:46:40 +02:00
parent 188e28e196
commit 7ff69e9356
4 changed files with 73 additions and 44 deletions

View File

@@ -209,9 +209,9 @@ G_DEFINE_TYPE_WITH_CODE (GdkX11Display, gdk_x11_display, GDK_TYPE_DISPLAY,
gdk_x11_display_event_translator_init))
static void
gdk_x11_display_init (GdkX11Display *display)
gdk_x11_display_init (GdkX11Display *self)
{
display->monitors = g_ptr_array_new_with_free_func (g_object_unref);
self->monitors = g_list_store_new (GDK_TYPE_MONITOR);
}
static void
@@ -1950,7 +1950,8 @@ gdk_x11_display_finalize (GObject *object)
g_object_unref (display_x11->screen);
g_list_free_full (display_x11->screens, g_object_unref);
g_ptr_array_free (display_x11->monitors, TRUE);
g_list_store_remove_all (display_x11->monitors);
g_object_unref (display_x11->monitors);
g_free (display_x11->startup_notification_id);
@@ -2899,7 +2900,7 @@ gdk_x11_display_get_n_monitors (GdkDisplay *display)
{
GdkX11Display *x11_display = GDK_X11_DISPLAY (display);
return x11_display->monitors->len;
return g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors));
}
@@ -2908,16 +2909,23 @@ gdk_x11_display_get_monitor (GdkDisplay *display,
int monitor_num)
{
GdkX11Display *x11_display = GDK_X11_DISPLAY (display);
GdkMonitor *monitor;
if (0 <= monitor_num && monitor_num < x11_display->monitors->len)
return (GdkMonitor *)x11_display->monitors->pdata[monitor_num];
if (monitor_num < 0)
return NULL;
monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), monitor_num);
if (monitor)
g_object_unref (monitor);
return monitor;
return NULL;
}
/**
* gdk_x11_display_get_primary_monitor:
* @display: a #GdkDisplay
* @self: a #GdkDisplay
*
* Gets the primary monitor for the display.
*
@@ -2935,12 +2943,19 @@ gdk_x11_display_get_monitor (GdkDisplay *display,
GdkMonitor *
gdk_x11_display_get_primary_monitor (GdkDisplay *display)
{
GdkX11Display *x11_display = GDK_X11_DISPLAY (display);
GdkX11Display *self = GDK_X11_DISPLAY (display);
GdkMonitor *monitor;
if (0 <= x11_display->primary_monitor && x11_display->primary_monitor < x11_display->monitors->len)
return x11_display->monitors->pdata[x11_display->primary_monitor];
if (0 <= self->primary_monitor)
return NULL;
return NULL;
monitor = g_list_model_get_item (G_LIST_MODEL (self->monitors), self->primary_monitor);
if (monitor == NULL)
return NULL;
/* because g_list_model_get_item() returns a ref */
g_object_unref (monitor);
return monitor;
}
int

View File

@@ -114,7 +114,7 @@ struct _GdkX11Display
/* GdkCursor => XCursor */
GHashTable *cursors;
GPtrArray *monitors;
GListStore *monitors;
int primary_monitor;
/* Startup notification */

View File

@@ -135,12 +135,16 @@ gdk_x11_screen_get_monitor_output (GdkX11Screen *x11_screen,
{
GdkX11Display *x11_display = GDK_X11_DISPLAY (x11_screen->display);
GdkX11Monitor *monitor;
XID output;
g_return_val_if_fail (monitor_num >= 0, None);
g_return_val_if_fail (monitor_num < x11_display->monitors->len, None);
g_return_val_if_fail (monitor_num < g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)), None);
monitor = x11_display->monitors->pdata[monitor_num];
return monitor->output;
monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), monitor_num);
output = monitor->output;
g_object_unref (monitor);
return output;
}
static int
@@ -386,9 +390,10 @@ find_monitor_by_output (GdkX11Display *x11_display, XID output)
{
int i;
for (i = 0; i < x11_display->monitors->len; i++)
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)); i++)
{
GdkX11Monitor *monitor = x11_display->monitors->pdata[i];
GdkX11Monitor *monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
g_object_unref (monitor);
if (monitor->output == output)
return monitor;
}
@@ -439,11 +444,12 @@ init_randr15 (GdkX11Screen *x11_screen, gboolean *changed)
if (!rr_monitors)
return FALSE;
for (i = 0; i < x11_display->monitors->len; i++)
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)); i++)
{
GdkX11Monitor *monitor = x11_display->monitors->pdata[i];
GdkX11Monitor *monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
monitor->add = FALSE;
monitor->remove = TRUE;
g_object_unref (monitor);
}
for (i = 0; i < num_rr_monitors; i++)
@@ -503,7 +509,7 @@ init_randr15 (GdkX11Screen *x11_screen, gboolean *changed)
NULL);
monitor->output = output;
monitor->add = TRUE;
g_ptr_array_add (x11_display->monitors, monitor);
g_list_store_append (x11_display->monitors, monitor);
}
/* Fetch minimal manufacturer information (PNP ID) from EDID */
@@ -591,9 +597,9 @@ init_randr15 (GdkX11Screen *x11_screen, gboolean *changed)
XRRFreeMonitors (rr_monitors);
XRRFreeScreenResources (resources);
for (i = x11_display->monitors->len - 1; i >= 0; i--)
for (i = g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)) - 1; i >= 0; i--)
{
GdkX11Monitor *monitor = x11_display->monitors->pdata[i];
GdkX11Monitor *monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
if (monitor->add)
{
gdk_display_monitor_added (display, GDK_MONITOR (monitor));
@@ -602,18 +608,20 @@ init_randr15 (GdkX11Screen *x11_screen, gboolean *changed)
else if (monitor->remove)
{
g_object_ref (monitor);
g_ptr_array_remove (x11_display->monitors, monitor);
g_list_store_remove (x11_display->monitors, i);
gdk_display_monitor_removed (display, GDK_MONITOR (monitor));
g_object_unref (monitor);
*changed = TRUE;
}
g_object_unref (monitor);
}
old_primary = x11_display->primary_monitor;
x11_display->primary_monitor = 0;
for (i = 0; i < x11_display->monitors->len; ++i)
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)); i++)
{
GdkX11Monitor *monitor = x11_display->monitors->pdata[i];
GdkX11Monitor *monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
g_object_unref (monitor);
if (monitor->output == primary_output)
{
x11_display->primary_monitor = i;
@@ -636,7 +644,7 @@ init_randr15 (GdkX11Screen *x11_screen, gboolean *changed)
if (x11_display->primary_monitor != old_primary)
*changed = TRUE;
return x11_display->monitors->len > 0;
return g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)) > 0;
#endif
return FALSE;
@@ -662,11 +670,12 @@ init_randr13 (GdkX11Screen *x11_screen, gboolean *changed)
if (!resources)
return FALSE;
for (i = 0; i < x11_display->monitors->len; i++)
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)); i++)
{
GdkX11Monitor *monitor = x11_display->monitors->pdata[i];
GdkX11Monitor *monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
monitor->add = FALSE;
monitor->remove = TRUE;
g_object_unref (monitor);
}
for (i = 0; i < resources->noutput; ++i)
@@ -712,7 +721,7 @@ init_randr13 (GdkX11Screen *x11_screen, gboolean *changed)
NULL);
monitor->output = output;
monitor->add = TRUE;
g_ptr_array_add (x11_display->monitors, monitor);
g_list_store_append (x11_display->monitors, monitor);
}
gdk_monitor_get_geometry (GDK_MONITOR (monitor), &geometry);
@@ -758,9 +767,9 @@ init_randr13 (GdkX11Screen *x11_screen, gboolean *changed)
/* Which usable multihead data is not returned in non RandR 1.2+ X driver? */
for (i = x11_display->monitors->len - 1; i >= 0; i--)
for (i = g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)) - 1; i >= 0; i--)
{
GdkX11Monitor *monitor = x11_display->monitors->pdata[i];
GdkX11Monitor *monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
if (monitor->add)
{
gdk_display_monitor_added (display, GDK_MONITOR (monitor));
@@ -769,7 +778,7 @@ init_randr13 (GdkX11Screen *x11_screen, gboolean *changed)
else if (monitor->remove)
{
g_object_ref (monitor);
g_ptr_array_remove (x11_display->monitors, monitor);
g_list_store_remove (x11_display->monitors, i);
gdk_display_monitor_removed (display, GDK_MONITOR (monitor));
g_object_unref (monitor);
*changed = TRUE;
@@ -781,9 +790,10 @@ init_randr13 (GdkX11Screen *x11_screen, gboolean *changed)
primary_output = XRRGetOutputPrimary (x11_screen->xdisplay,
x11_screen->xroot_window);
for (i = 0; i < x11_display->monitors->len; ++i)
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)); i++)
{
GdkX11Monitor *monitor = x11_display->monitors->pdata[i];
GdkX11Monitor *monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
g_object_unref (monitor);
if (monitor->output == primary_output)
{
x11_display->primary_monitor = i;
@@ -806,7 +816,7 @@ init_randr13 (GdkX11Screen *x11_screen, gboolean *changed)
if (x11_display->primary_monitor != old_primary)
*changed = TRUE;
return x11_display->monitors->len > 0;
return g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)) > 0;
#endif
return FALSE;
@@ -822,11 +832,12 @@ init_no_multihead (GdkX11Screen *x11_screen, gboolean *changed)
int width, height;
int i;
for (i = 0; i < x11_display->monitors->len; i++)
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)); i++)
{
monitor = x11_display->monitors->pdata[i];
monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
monitor->add = FALSE;
monitor->remove = TRUE;
g_object_unref (monitor);
}
monitor = find_monitor_by_output (x11_display, 0);
@@ -839,7 +850,7 @@ init_no_multihead (GdkX11Screen *x11_screen, gboolean *changed)
NULL);
monitor->output = 0;
monitor->add = TRUE;
g_ptr_array_add (x11_display->monitors, monitor);
g_list_store_append (x11_display->monitors, monitor);
}
width_mm = WidthMMOfScreen (x11_screen->xscreen);
@@ -866,9 +877,9 @@ init_no_multihead (GdkX11Screen *x11_screen, gboolean *changed)
*changed = TRUE;
x11_display->primary_monitor = 0;
for (i = x11_display->monitors->len - 1; i >= 0; i--)
for (i = g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)) - 1; i >= 0; i--)
{
monitor = x11_display->monitors->pdata[i];
monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
if (monitor->add)
{
gdk_display_monitor_added (GDK_DISPLAY (x11_display), GDK_MONITOR (monitor));
@@ -877,11 +888,12 @@ init_no_multihead (GdkX11Screen *x11_screen, gboolean *changed)
else if (monitor->remove)
{
g_object_ref (monitor);
g_ptr_array_remove (x11_display->monitors, monitor);
g_list_store_remove (x11_display->monitors, i);
gdk_display_monitor_removed (GDK_DISPLAY (x11_display), GDK_MONITOR (monitor));
g_object_unref (monitor);
*changed = TRUE;
}
g_object_unref (monitor);
}
}
@@ -958,11 +970,13 @@ _gdk_x11_screen_set_surface_scale (GdkX11Screen *x11_screen,
_gdk_x11_surface_set_surface_scale (surface, scale);
}
for (i = 0; i < x11_display->monitors->len; i++)
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)); i++)
{
GdkMonitor *monitor = GDK_MONITOR (x11_display->monitors->pdata[i]);
GdkMonitor *monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
gdk_monitor_set_scale_factor (monitor, scale);
g_object_unref (monitor);
}
/* We re-read the monitor sizes so we can apply the new scale */

View File

@@ -106,7 +106,7 @@ GDK_AVAILABLE_IN_ALL
GdkX11Screen *gdk_x11_display_get_screen (GdkDisplay *display);
GDK_AVAILABLE_IN_ALL
GdkMonitor * gdk_x11_display_get_primary_monitor (GdkDisplay *display);
GdkMonitor * gdk_x11_display_get_primary_monitor (GdkDisplay *self);
GDK_AVAILABLE_IN_ALL
void gdk_x11_display_grab (GdkDisplay *display);