commit 265b491

Michael Forney  ·  2014-01-23 00:54:28 +0000 UTC
parent 0d546e8
screen: Add usable area modifiers

This allows a panel or something related to adjust where windows are
positioned.
2 files changed,  +50, -0
+39, -0
 1@@ -23,6 +23,7 @@
 2 
 3 #include "screen.h"
 4 #include "drm.h"
 5+#include "event.h"
 6 #include "internal.h"
 7 #include "mode.h"
 8 #include "output.h"
 9@@ -75,6 +76,7 @@ struct swc_screen_internal * swc_screen_new(uint32_t crtc,
10     wl_signal_init(&screen->base.event_signal);
11     wl_list_init(&screen->outputs);
12     wl_list_insert(&INTERNAL(screen)->outputs, &output->link);
13+    wl_list_init(&screen->modifiers);
14 
15     if (!swc_framebuffer_plane_initialize(&screen->planes.framebuffer, crtc,
16                                           &output->preferred_mode->info,
17@@ -113,3 +115,40 @@ void swc_screen_destroy(struct swc_screen_internal * screen)
18     free(screen);
19 }
20 
21+void swc_screen_update_usable_geometry(struct swc_screen_internal * screen)
22+{
23+    pixman_region32_t total_usable, usable;
24+    pixman_box32_t * extents;
25+    struct swc_screen_modifier * modifier;
26+
27+    DEBUG("Updating usable geometry\n");
28+
29+    pixman_region32_init_rect(&total_usable,
30+                              screen->base.geometry.x, screen->base.geometry.y,
31+                              screen->base.geometry.width,
32+                              screen->base.geometry.height);
33+    pixman_region32_init(&usable);
34+
35+    wl_list_for_each(modifier, &screen->modifiers, link)
36+    {
37+        modifier->modify(modifier, &screen->base.geometry, &usable);
38+        pixman_region32_intersect(&total_usable, &total_usable, &usable);
39+    }
40+
41+    extents = pixman_region32_extents(&total_usable);
42+
43+    if (extents->x1 != screen->base.usable_geometry.x
44+        || extents->y1 != screen->base.usable_geometry.y
45+        || (extents->x2 - extents->x1) != screen->base.usable_geometry.width
46+        || (extents->y2 - extents->y1) != screen->base.usable_geometry.height)
47+    {
48+        screen->base.usable_geometry.x = extents->x1;
49+        screen->base.usable_geometry.y = extents->y1;
50+        screen->base.usable_geometry.width = extents->x2 - extents->x1;
51+        screen->base.usable_geometry.height = extents->y2 - extents->y1;
52+
53+        swc_send_event(&screen->base.event_signal,
54+                       SWC_SCREEN_USABLE_GEOMETRY_CHANGED, NULL);
55+    }
56+}
57+
+11, -0
 1@@ -31,6 +31,15 @@
 2 #include <wayland-util.h>
 3 
 4 struct swc_output;
 5+struct pixman_region32;
 6+
 7+struct swc_screen_modifier
 8+{
 9+    void (* modify)(struct swc_screen_modifier * modifier,
10+                    const struct swc_rectangle * geometry,
11+                    struct pixman_region32 * usable);
12+    struct wl_list link;
13+};
14 
15 struct swc_screen_internal
16 {
17@@ -60,5 +69,7 @@ static inline uint32_t swc_screen_mask(struct swc_screen_internal * screen)
18     return 1 << screen->id;
19 }
20 
21+void swc_screen_update_usable_geometry(struct swc_screen_internal * screen);
22+
23 #endif
24