aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2018-04-23 09:53:46 +0200
committerGuido Günther <agx@sigxcpu.org>2018-04-23 11:24:31 +0200
commit5209c797026cc5c97d2abc796b70d43ceaaac519 (patch)
tree132b430504aa64a2998a6b3930055d5eb9b155e4
parent57cc4c319d1d7002dc281e623c6716e619e21fdf (diff)
examples: Handle input entering popup in layer-shell
Change the cursor when entering the popup and make mouse buttons change the red component of the square. This makes sure we can handle input correctly.
-rw-r--r--examples/layer-shell.c61
1 files changed, 44 insertions, 17 deletions
diff --git a/examples/layer-shell.c b/examples/layer-shell.c
index 115b72cb..721fd69e 100644
--- a/examples/layer-shell.c
+++ b/examples/layer-shell.c
@@ -45,7 +45,7 @@ struct wl_egl_window *popup_egl_window;
static uint32_t popup_width = 256, popup_height = 256;
struct wlr_egl_surface *popup_egl_surface;
struct wl_callback *popup_frame_callback;
-float popup_alpha = 1.0;
+float popup_alpha = 1.0, popup_red = 0.5f;
static uint32_t layer = ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND;
static uint32_t anchor = 0;
@@ -59,9 +59,9 @@ static double frame = 0;
static int cur_x = -1, cur_y = -1;
static int buttons = 0;
-struct wl_cursor_theme *cursor_theme;
struct wl_cursor_image *cursor_image;
-struct wl_surface *cursor_surface;
+struct wl_cursor_image *popup_cursor_image;
+struct wl_surface *cursor_surface, *input_surface;
static struct {
struct timespec last_frame;
@@ -154,7 +154,7 @@ static void draw_popup() {
eglMakeCurrent(egl.display, popup_egl_surface, popup_egl_surface, egl.context);
glViewport(0, 0, popup_width, popup_height);
- glClearColor(0.5f, 0.5f, 0.5f, popup_alpha);
+ glClearColor(popup_red, 0.5f, 0.5f, popup_alpha);
popup_alpha += alpha_mod;
if (popup_alpha < 0.01 || popup_alpha >= 1.0f) {
alpha_mod *= -1.0;
@@ -267,11 +267,20 @@ struct zwlr_layer_surface_v1_listener layer_surface_listener = {
static void wl_pointer_enter(void *data, struct wl_pointer *wl_pointer,
uint32_t serial, struct wl_surface *surface,
wl_fixed_t surface_x, wl_fixed_t surface_y) {
+ struct wl_cursor_image *image;
+ if (surface == popup_wl_surface) {
+ image = popup_cursor_image;
+ } else {
+ image = cursor_image;
+ }
wl_surface_attach(cursor_surface,
- wl_cursor_image_get_buffer(cursor_image), 0, 0);
- wl_pointer_set_cursor(wl_pointer, serial, cursor_surface,
- cursor_image->hotspot_x, cursor_image->hotspot_y);
+ wl_cursor_image_get_buffer(image), 0, 0);
+ wl_surface_damage(cursor_surface, 1, 0,
+ image->width, image->height);
wl_surface_commit(cursor_surface);
+ wl_pointer_set_cursor(wl_pointer, serial, cursor_surface,
+ image->hotspot_x, image->hotspot_y);
+ input_surface = surface;
}
static void wl_pointer_leave(void *data, struct wl_pointer *wl_pointer,
@@ -288,16 +297,28 @@ static void wl_pointer_motion(void *data, struct wl_pointer *wl_pointer,
static void wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
uint32_t serial, uint32_t time, uint32_t button, uint32_t state) {
- if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
- if (button == BTN_RIGHT) {
- create_popup();
+ if (input_surface == wl_surface) {
+ if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
+ if (button == BTN_RIGHT) {
+ create_popup();
+ } else {
+ buttons++;
+ }
} else {
- buttons++;
+ if (button != BTN_RIGHT) {
+ buttons--;
+ }
}
- } else {
- if (button != BTN_RIGHT) {
- buttons--;
+ } else if (input_surface == popup_wl_surface) {
+ if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
+ if (button == BTN_LEFT && popup_red <= 0.9f) {
+ popup_red += 0.1;
+ } else if (button == BTN_RIGHT && popup_red >= 0.1f) {
+ popup_red -= 0.1;
+ }
}
+ } else {
+ assert(false && "Unknown surface");
}
}
@@ -557,12 +578,18 @@ int main(int argc, char **argv) {
return 1;
}
- cursor_theme = wl_cursor_theme_load(NULL, 16, shm);
+ struct wl_cursor_theme *cursor_theme =
+ wl_cursor_theme_load(NULL, 16, shm);
assert(cursor_theme);
- struct wl_cursor *cursor;
- cursor = wl_cursor_theme_get_cursor(cursor_theme, "crosshair");
+ struct wl_cursor *cursor =
+ wl_cursor_theme_get_cursor(cursor_theme, "crosshair");
assert(cursor);
cursor_image = cursor->images[0];
+
+ cursor = wl_cursor_theme_get_cursor(cursor_theme, "tcross");
+ assert(cursor);
+ popup_cursor_image = cursor->images[0];
+
cursor_surface = wl_compositor_create_surface(compositor);
assert(cursor_surface);