diff options
author | Ray Strode <rstrode@redhat.com> | 2007-07-23 09:06:59 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2007-07-23 09:06:59 -0400 |
commit | 88fe2b17a2264974ae04b3bd6ec344665ec7ffcb (patch) | |
tree | f7f233d8f7b0f505879b7504b40415cd654abd95 | |
parent | 76148a4dd388108f548aa56fd1e235c4fc0d3250 (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.c | 58 |
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) |