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