summaryrefslogtreecommitdiffstats
path: root/src/virt-viewer-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/virt-viewer-util.c')
-rw-r--r--src/virt-viewer-util.c58
1 files changed, 39 insertions, 19 deletions
diff --git a/src/virt-viewer-util.c b/src/virt-viewer-util.c
index 19a475e..e9f771b 100644
--- a/src/virt-viewer-util.c
+++ b/src/virt-viewer-util.c
@@ -536,11 +536,11 @@ static int
displays_cmp(const void *p1, const void *p2, gpointer user_data)
{
guint diff;
- GdkRectangle *displays = user_data;
+ GHashTable *displays = user_data;
guint i = *(guint*)p1;
guint j = *(guint*)p2;
- GdkRectangle *m1 = &displays[i];
- GdkRectangle *m2 = &displays[j];
+ GdkRectangle *m1 = g_hash_table_lookup(displays, GINT_TO_POINTER(i));
+ GdkRectangle *m2 = g_hash_table_lookup(displays, GINT_TO_POINTER(j));
diff = m1->x - m2->x;
if (diff == 0)
diff = m1->y - m2->y;
@@ -550,28 +550,44 @@ displays_cmp(const void *p1, const void *p2, gpointer user_data)
return diff;
}
+static void find_max_id(gpointer key,
+ gpointer value G_GNUC_UNUSED,
+ gpointer user_data)
+{
+ guint *max_id = user_data;
+ guint id = GPOINTER_TO_INT(key);
+ *max_id = MAX(*max_id, id);
+}
+
void
-virt_viewer_align_monitors_linear(GdkRectangle *displays, guint ndisplays)
+virt_viewer_align_monitors_linear(GHashTable *displays)
{
gint i, x = 0;
guint *sorted_displays;
+ guint max_id = 0;
+ GHashTableIter iter;
+ gpointer key, value;
g_return_if_fail(displays != NULL);
- if (ndisplays == 0)
+ if (g_hash_table_size(displays) == 0)
return;
- sorted_displays = g_new0(guint, ndisplays);
- for (i = 0; i < ndisplays; i++)
- sorted_displays[i] = i;
- g_qsort_with_data(sorted_displays, ndisplays, sizeof(guint), displays_cmp, displays);
+ g_hash_table_foreach(displays, find_max_id, &max_id);
+ sorted_displays = g_new0(guint, max_id);
+
+ g_hash_table_iter_init(&iter, displays);
+ while (g_hash_table_iter_next(&iter, &key, &value))
+ sorted_displays[GPOINTER_TO_INT(key)] = GPOINTER_TO_INT(key);
+
+ g_qsort_with_data(sorted_displays, max_id, sizeof(guint), displays_cmp, displays);
/* adjust monitor positions so that there's no gaps or overlap between
* monitors */
- for (i = 0; i < ndisplays; i++) {
+ for (i = 0; i < max_id; i++) {
guint nth = sorted_displays[i];
- g_assert(nth < ndisplays);
- GdkRectangle *rect = &displays[nth];
+ g_assert(nth < max_id);
+ GdkRectangle *rect = g_hash_table_lookup(displays, GINT_TO_POINTER(nth));
rect->x = x;
rect->y = 0;
x += rect->width;
@@ -591,16 +607,19 @@ virt_viewer_align_monitors_linear(GdkRectangle *displays, guint ndisplays)
* screen of that size.
*/
void
-virt_viewer_shift_monitors_to_origin(GdkRectangle *displays, guint ndisplays)
+virt_viewer_shift_monitors_to_origin(GHashTable *displays)
{
gint xmin = G_MAXINT;
gint ymin = G_MAXINT;
- gint i;
+ GHashTableIter iter;
+ gpointer key, value;
- g_return_if_fail(ndisplays > 0);
+ if (g_hash_table_size(displays) == 0)
+ return;
- for (i = 0; i < ndisplays; i++) {
- GdkRectangle *display = &displays[i];
+ g_hash_table_iter_init(&iter, displays);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ GdkRectangle *display = value;
if (display->width > 0 && display->height > 0) {
xmin = MIN(xmin, display->x);
ymin = MIN(ymin, display->y);
@@ -610,8 +629,9 @@ virt_viewer_shift_monitors_to_origin(GdkRectangle *displays, guint ndisplays)
if (xmin > 0 || ymin > 0) {
g_debug("%s: Shifting all monitors by (%i, %i)", G_STRFUNC, xmin, ymin);
- for (i = 0; i < ndisplays; i++) {
- GdkRectangle *display = &displays[i];
+ g_hash_table_iter_init(&iter, displays);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ GdkRectangle *display = value;
if (display->width > 0 && display->height > 0) {
display->x -= xmin;
display->y -= ymin;