summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2007-07-23 09:06:59 -0400
committerRay Strode <rstrode@redhat.com>2007-07-23 09:06:59 -0400
commit88fe2b17a2264974ae04b3bd6ec344665ec7ffcb (patch)
treef7f233d8f7b0f505879b7504b40415cd654abd95
parent76148a4dd388108f548aa56fd1e235c4fc0d3250 (diff)
don't draw a screensaver if it would be completely overlapped by a
screensaver in the existing monitor layout anyway.
-rw-r--r--test-screensaver-extension.c58
1 files changed, 41 insertions, 17 deletions
diff --git a/test-screensaver-extension.c b/test-screensaver-extension.c
index ace4c3f..99c504a 100644
--- a/test-screensaver-extension.c
+++ b/test-screensaver-extension.c
@@ -293,35 +293,59 @@ add_area_to_head_layout (TestScreensaver *screensaver,
}
static void
-setup_head_geometry (TestScreensaver *screensaver)
+add_monitor_to_layout (TestScreensaver *screensaver,
+ gint monitor_number)
{
- int number_of_monitors, i;
+ TestScreensaverHead *head;
+ GdkRectangle area;
+ GdkOverlapType overlap_type;
- g_assert (screensaver->heads == NULL);
+ gdk_screen_get_monitor_geometry (screensaver->screen,
+ monitor_number, &area);
+ g_debug ("monitor %d has geometry %dx%d+%d+%d",
+ monitor_number, area.x, area.y,
+ area.width, area.height);
- number_of_monitors = gdk_screen_get_n_monitors (screensaver->screen);
+ overlap_type = gdk_region_rect_in (screensaver->head_layout, &area);
- for (i = 0; i < number_of_monitors; i++)
+ switch (overlap_type)
{
- TestScreensaverHead *head;
- GdkRectangle area;
+ case GDK_OVERLAP_RECTANGLE_IN:
+ break;
- gdk_screen_get_monitor_geometry (screensaver->screen,
- i, &area);
+ case GDK_OVERLAP_RECTANGLE_PART:
+ g_debug ("monitor %d overlaps existing layout, clipping...",
+ monitor_number);
+ clip_area_against_head_layout (screensaver, &area);
- clip_area_against_head_layout (screensaver, &area);
+ /* fall through */
- head = test_screensaver_head_new (i, &area);
- g_debug ("head %d has geometry %dx%d+%d+%d",
- head->number, head->area.x, head->area.y,
- head->area.width, head->area.height);
- screensaver->heads = g_list_prepend (screensaver->heads,
- head);
+ case GDK_OVERLAP_RECTANGLE_OUT:
+ head = test_screensaver_head_new (monitor_number, &area);
+ g_debug ("head %d has geometry %dx%d+%d+%d",
+ head->number, head->area.x, head->area.y,
+ head->area.width, head->area.height);
+ screensaver->heads = g_list_prepend (screensaver->heads,
+ head);
- add_area_to_head_layout (screensaver, &head->area);
+ add_area_to_head_layout (screensaver, &head->area);
+ break;
}
}
+static void
+setup_head_geometry (TestScreensaver *screensaver)
+{
+ int number_of_monitors, i;
+
+ g_assert (screensaver->heads == NULL);
+
+ number_of_monitors = gdk_screen_get_n_monitors (screensaver->screen);
+
+ for (i = 0; i < number_of_monitors; i++)
+ add_monitor_to_layout (screensaver, i);
+}
+
#ifdef SUPPORT_DYNAMIC_HEAD_SETUPS
static void
clear_head_geometry (TestScreensaver *screensaver)