swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

commit 265b4918c6fb5c5899aab52f11b590cf53912214
parent 0d546e80c1431c1c8d603715865b0b7fd9836789
Author: Michael Forney <mforney@mforney.org>
Date:   Wed, 22 Jan 2014 16:54:28 -0800

screen: Add usable area modifiers

This allows a panel or something related to adjust where windows are
positioned.

Diffstat:
Mlibswc/screen.c | 39+++++++++++++++++++++++++++++++++++++++
Mlibswc/screen.h | 11+++++++++++
2 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/libswc/screen.c b/libswc/screen.c @@ -23,6 +23,7 @@ #include "screen.h" #include "drm.h" +#include "event.h" #include "internal.h" #include "mode.h" #include "output.h" @@ -75,6 +76,7 @@ struct swc_screen_internal * swc_screen_new(uint32_t crtc, wl_signal_init(&screen->base.event_signal); wl_list_init(&screen->outputs); wl_list_insert(&INTERNAL(screen)->outputs, &output->link); + wl_list_init(&screen->modifiers); if (!swc_framebuffer_plane_initialize(&screen->planes.framebuffer, crtc, &output->preferred_mode->info, @@ -113,3 +115,40 @@ void swc_screen_destroy(struct swc_screen_internal * screen) free(screen); } +void swc_screen_update_usable_geometry(struct swc_screen_internal * screen) +{ + pixman_region32_t total_usable, usable; + pixman_box32_t * extents; + struct swc_screen_modifier * modifier; + + DEBUG("Updating usable geometry\n"); + + pixman_region32_init_rect(&total_usable, + screen->base.geometry.x, screen->base.geometry.y, + screen->base.geometry.width, + screen->base.geometry.height); + pixman_region32_init(&usable); + + wl_list_for_each(modifier, &screen->modifiers, link) + { + modifier->modify(modifier, &screen->base.geometry, &usable); + pixman_region32_intersect(&total_usable, &total_usable, &usable); + } + + extents = pixman_region32_extents(&total_usable); + + if (extents->x1 != screen->base.usable_geometry.x + || extents->y1 != screen->base.usable_geometry.y + || (extents->x2 - extents->x1) != screen->base.usable_geometry.width + || (extents->y2 - extents->y1) != screen->base.usable_geometry.height) + { + screen->base.usable_geometry.x = extents->x1; + screen->base.usable_geometry.y = extents->y1; + screen->base.usable_geometry.width = extents->x2 - extents->x1; + screen->base.usable_geometry.height = extents->y2 - extents->y1; + + swc_send_event(&screen->base.event_signal, + SWC_SCREEN_USABLE_GEOMETRY_CHANGED, NULL); + } +} + diff --git a/libswc/screen.h b/libswc/screen.h @@ -31,6 +31,15 @@ #include <wayland-util.h> struct swc_output; +struct pixman_region32; + +struct swc_screen_modifier +{ + void (* modify)(struct swc_screen_modifier * modifier, + const struct swc_rectangle * geometry, + struct pixman_region32 * usable); + struct wl_list link; +}; struct swc_screen_internal { @@ -60,5 +69,7 @@ static inline uint32_t swc_screen_mask(struct swc_screen_internal * screen) return 1 << screen->id; } +void swc_screen_update_usable_geometry(struct swc_screen_internal * screen); + #endif