From ac95f3ee9d463176c4b391e7f6daac8a006ab7b8 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Wed, 13 Feb 2013 16:17:17 +0200 Subject: [PATCH] window: move 'widget' member into struct surface Repaint and resizing widget recursions must start from the root widget of each (sub-)surface, so that buffers and regions get initialized correctly. Make it easier by moving the widget field from struct window to struct surface. Signed-off-by: Pekka Paalanen --- clients/window.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/clients/window.c b/clients/window.c index fb31d330..2f9c80f2 100644 --- a/clients/window.c +++ b/clients/window.c @@ -190,6 +190,7 @@ struct surface { struct wl_surface *surface; struct toysurface *toysurface; + struct widget *widget; struct rectangle allocation; struct rectangle server_allocation; @@ -236,7 +237,6 @@ struct window { struct wl_callback *frame_cb; struct frame *frame; - struct widget *widget; void *user_data; struct wl_list link; @@ -1360,6 +1360,12 @@ widget_find_widget(struct widget *widget, int32_t x, int32_t y) return NULL; } +static struct widget * +window_find_widget(struct window *window, int32_t x, int32_t y) +{ + return widget_find_widget(window->main_surface->widget, x, y); +} + static struct widget * widget_create(struct window *window, void *data) { @@ -1382,10 +1388,13 @@ widget_create(struct window *window, void *data) struct widget * window_add_widget(struct window *window, void *data) { - window->widget = widget_create(window, data); - wl_list_init(&window->widget->link); + struct widget *widget; - return window->widget; + widget = widget_create(window, data); + wl_list_init(&widget->link); + window->main_surface->widget = widget; + + return widget; } struct widget * @@ -2334,7 +2343,7 @@ input_ungrab(struct input *input) input->grab = NULL; if (input->pointer_focus) { - widget = widget_find_widget(input->pointer_focus->widget, + widget = window_find_widget(input->pointer_focus, input->sx, input->sy); input_set_focus_widget(input, widget, input->sx, input->sy); } @@ -2384,7 +2393,7 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer, input->sx = sx; input->sy = sy; - widget = widget_find_widget(window->widget, sx, sy); + widget = window_find_widget(window, sx, sy); input_set_focus_widget(input, widget, sx, sy); } @@ -2416,7 +2425,7 @@ pointer_handle_motion(void *data, struct wl_pointer *pointer, return; if (!(input->grab && input->grab_button)) { - widget = widget_find_widget(window->widget, sx, sy); + widget = window_find_widget(window, sx, sy); input_set_focus_widget(input, widget, sx, sy); } @@ -3180,7 +3189,7 @@ idle_resize(struct window *window) struct wl_compositor *compositor = window->display->compositor; window->resize_needed = 0; - widget = window->widget; + widget = window->main_surface->widget; widget_set_allocation(widget, window->pending_allocation.x, window->pending_allocation.y, @@ -3265,7 +3274,7 @@ static void handle_popup_done(void *data, struct wl_shell_surface *shell_surface) { struct window *window = data; - struct menu *menu = window->widget->user_data; + struct menu *menu = window->main_surface->widget->user_data; /* FIXME: Need more context in this event, at least the input * device. Or just use wl_callback. And this really needs to @@ -3327,7 +3336,7 @@ idle_redraw(struct task *task, uint32_t events) idle_resize(window); window_create_surface(window); - widget_redraw(window->widget); + widget_redraw(window->main_surface->widget); window->redraw_needed = 0; wl_list_init(&window->redraw_task.link);