From a8a0db3497280b50d3b1546a4dbbc3c840bd1637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Mon, 9 Jan 2012 11:12:05 -0500 Subject: [PATCH] window: Move button handler to widget --- clients/desktop-shell.c | 47 +++++++++++++++++++++++------------------ clients/dnd.c | 7 +++--- clients/eventdemo.c | 5 +++-- clients/flower.c | 7 ++++-- clients/resizor.c | 8 ++++--- clients/tablet-shell.c | 7 +++--- clients/terminal.c | 8 ++++--- clients/view.c | 6 ++++-- clients/window.c | 42 ++++++++++++++++++------------------ clients/window.h | 24 ++++++--------------- 10 files changed, 86 insertions(+), 75 deletions(-) diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c index 9e46cc1d..3aa535b4 100644 --- a/clients/desktop-shell.c +++ b/clients/desktop-shell.c @@ -244,24 +244,29 @@ panel_widget_leave_handler(struct widget *widget, } static void -panel_button_handler(struct window *window, - struct input *input, uint32_t time, - int button, int state, void *data) +panel_widget_button_handler(struct widget *widget, + struct input *input, uint32_t time, + int button, int state, void *data) { struct panel *panel = data; struct panel_widget *pi; - struct widget *focus; - focus = window_get_focus_widget(panel->window); - if (focus && button == BTN_LEFT) { - pi = widget_get_user_data(focus); - window_schedule_redraw(panel->window); - if (state == 0) - panel_activate_widget(panel, pi); - } else if (button == BTN_RIGHT) { - if (state) - show_menu(panel, input, time); - } + pi = widget_get_user_data(widget); + widget_schedule_redraw(widget); + if (state == 0) + panel_activate_widget(panel, pi); +} + +static void +panel_button_handler(struct widget *widget, + struct input *input, uint32_t time, + int button, int state, void *data) +{ + struct window *window = data; + struct panel *panel = window_get_user_data(window); + + if (button == BTN_RIGHT && state) + show_menu(panel, input, time); } static void @@ -291,7 +296,9 @@ panel_create(struct display *display) window_set_redraw_handler(panel->window, panel_redraw_handler); window_set_custom(panel->window); window_set_user_data(panel->window, panel); - window_set_button_handler(panel->window, panel_button_handler); + + widget_set_button_handler(window_get_widget(panel->window), + panel_button_handler); return panel; } @@ -310,6 +317,7 @@ panel_add_widget(struct panel *panel, const char *icon, const char *path) widget->widget = window_add_widget(panel->window, widget); widget_set_enter_handler(widget->widget, panel_widget_enter_handler); widget_set_leave_handler(widget->widget, panel_widget_leave_handler); + widget_set_button_handler(widget->widget, panel_widget_button_handler); } static void @@ -414,16 +422,14 @@ unlock_dialog_draw(struct unlock_dialog *dialog) } static void -unlock_dialog_button_handler(struct window *window, +unlock_dialog_button_handler(struct widget *widget, struct input *input, uint32_t time, int button, int state, void *data) { struct unlock_dialog *dialog = data; struct desktop *desktop = dialog->desktop; - struct widget *focus; - focus = window_get_focus_widget(dialog->window); - if (focus && button == BTN_LEFT) { + if (button == BTN_LEFT) { if (state == 0 && !dialog->closing) { display_defer(desktop->display, &desktop->unlock_task); dialog->closing = 1; @@ -480,12 +486,13 @@ unlock_dialog_create(struct desktop *desktop) window_set_redraw_handler(dialog->window, unlock_dialog_redraw_handler); window_set_keyboard_focus_handler(dialog->window, unlock_dialog_keyboard_focus_handler); - window_set_button_handler(dialog->window, unlock_dialog_button_handler); dialog->button = window_add_widget(dialog->window, NULL); widget_set_enter_handler(dialog->button, unlock_dialog_widget_enter_handler); widget_set_leave_handler(dialog->button, unlock_dialog_widget_leave_handler); + widget_set_button_handler(dialog->button, + unlock_dialog_button_handler); desktop_shell_set_lock_surface(desktop->shell, window_get_wl_shell_surface(dialog->window)); diff --git a/clients/dnd.c b/clients/dnd.c index c557e71c..f8cd7ef0 100644 --- a/clients/dnd.c +++ b/clients/dnd.c @@ -361,11 +361,12 @@ create_drag_cursor(struct dnd_drag *dnd_drag, } static void -dnd_button_handler(struct window *window, +dnd_button_handler(struct widget *widget, struct input *input, uint32_t time, int button, int state, void *data) { - struct dnd *dnd = data; + struct window *window = data; + struct dnd *dnd = window_get_user_data(window); int32_t x, y; struct item *item; struct rectangle allocation; @@ -537,13 +538,13 @@ dnd_create(struct display *display) window_set_redraw_handler(dnd->window, redraw_handler); window_set_keyboard_focus_handler(dnd->window, keyboard_focus_handler); - window_set_button_handler(dnd->window, dnd_button_handler); window_set_data_handler(dnd->window, dnd_data_handler); window_set_drop_handler(dnd->window, dnd_drop_handler); widget = window_get_widget(dnd->window); widget_set_enter_handler(widget, dnd_enter_handler); widget_set_motion_handler(widget, dnd_motion_handler); + widget_set_button_handler(widget, dnd_button_handler); width = 4 * (item_width + item_padding) + item_padding; height = 4 * (item_height + item_padding) + item_padding; diff --git a/clients/eventdemo.c b/clients/eventdemo.c index 34a4dfae..54daf774 100644 --- a/clients/eventdemo.c +++ b/clients/eventdemo.c @@ -222,7 +222,7 @@ key_handler(struct window *window, struct input *input, uint32_t time, * \param data user data associated to the window */ static void -button_handler(struct window *window, struct input *input, uint32_t time, +button_handler(struct widget *widget, struct input *input, uint32_t time, int button, int state, void *data) { int32_t x, y; @@ -314,7 +314,8 @@ eventdemo_create(struct display *d) window_set_key_handler(e->window, key_handler); /* Set the callback button handler for the window */ - window_set_button_handler(e->window, button_handler); + widget_set_button_handler(window_get_widget(e->window), + button_handler); /* Set the callback motion handler for the window */ widget_set_motion_handler(window_get_widget(e->window), diff --git a/clients/flower.c b/clients/flower.c index 4b6a872c..18e20158 100644 --- a/clients/flower.c +++ b/clients/flower.c @@ -105,10 +105,12 @@ motion_handler(struct widget *widget, struct input *input, } static void -button_handler(struct window *window, +button_handler(struct widget *widget, struct input *input, uint32_t time, int button, int state, void *data) { + struct window *window = data; + if (state) window_move(window, input, time); } @@ -156,7 +158,8 @@ int main(int argc, char *argv[]) widget_set_motion_handler(window_get_widget(flower.window), motion_handler); - window_set_button_handler(flower.window, button_handler); + widget_set_button_handler(window_get_widget(flower.window), + button_handler); window_set_user_data(flower.window, &flower); display_run(d); diff --git a/clients/resizor.c b/clients/resizor.c index 10378241..2818e26f 100644 --- a/clients/resizor.c +++ b/clients/resizor.c @@ -190,11 +190,12 @@ show_menu(struct resizor *resizor, struct input *input, uint32_t time) } static void -button_handler(struct window *window, +button_handler(struct widget *widget, struct input *input, uint32_t time, int button, int state, void *data) { - struct resizor *resizor = data; + struct window *window = data; + struct resizor *resizor = window_get_user_data(window); switch (button) { case BTN_RIGHT: @@ -232,7 +233,8 @@ resizor_create(struct display *display) height = resizor->height.current + 0.5; window_set_child_size(resizor->window, resizor->width, height); - window_set_button_handler(resizor->window, button_handler); + widget_set_button_handler(window_get_widget(resizor->window), + button_handler); resizor_draw(resizor); diff --git a/clients/tablet-shell.c b/clients/tablet-shell.c index 0de35ce8..479aa88d 100644 --- a/clients/tablet-shell.c +++ b/clients/tablet-shell.c @@ -198,11 +198,12 @@ lockscreen_draw(struct tablet_shell *shell) } static void -lockscreen_button_handler(struct window *window, +lockscreen_button_handler(struct widget *widget, struct input *input, uint32_t time, int button, int state, void *data) { - struct tablet_shell *shell = data; + struct window *window = data; + struct tablet_shell *shell = window_get_user_data(window); window_destroy(shell->lockscreen); shell->lockscreen = NULL; @@ -219,7 +220,7 @@ show_lockscreen(void *data, struct tablet_shell *tablet_shell) window_set_user_data(shell->lockscreen, shell); window_set_decoration(shell->lockscreen, 0); window_set_custom(shell->lockscreen); - window_set_button_handler(shell->lockscreen, + widget_set_button_handler(window_get_widget(shell->lockscreen), lockscreen_button_handler); tablet_shell_set_lockscreen(shell->tablet_shell, diff --git a/clients/terminal.c b/clients/terminal.c index c83b630d..9ec81909 100644 --- a/clients/terminal.c +++ b/clients/terminal.c @@ -2224,11 +2224,12 @@ keyboard_focus_handler(struct window *window, } static void -button_handler(struct window *window, +button_handler(struct widget *widget, struct input *input, uint32_t time, int button, int state, void *data) { - struct terminal *terminal = data; + struct window *window = data; + struct terminal *terminal = window_get_user_data(window); switch (button) { case 272: @@ -2298,7 +2299,8 @@ terminal_create(struct display *display, int fullscreen) window_set_key_handler(terminal->window, key_handler); window_set_keyboard_focus_handler(terminal->window, keyboard_focus_handler); - window_set_button_handler(terminal->window, button_handler); + widget_set_button_handler(window_get_widget(terminal->window), + button_handler); widget_set_motion_handler(window_get_widget(terminal->window), motion_handler); diff --git a/clients/view.c b/clients/view.c index 9d8a99f1..1a345e60 100644 --- a/clients/view.c +++ b/clients/view.c @@ -154,7 +154,8 @@ static void button_handler(struct window *window, struct input *input, uint32_t time, int button, int state, void *data) { - struct view *view = data; + struct window *window = data; +a struct view *view = window_get_user_data(window); if(!state) return; @@ -252,7 +253,8 @@ view_create(struct display *display, window_set_key_handler(view->window, key_handler); window_set_keyboard_focus_handler(view->window, keyboard_focus_handler); - window_set_button_handler(view->window, button_handler); + widget_set_button_handler(window_get_widget(view->window), + button_handler); view->page = 0; view->fullscreen = fullscreen; diff --git a/clients/window.c b/clients/window.c index 6e92e762..70642a45 100644 --- a/clients/window.c +++ b/clients/window.c @@ -130,7 +130,6 @@ struct window { window_resize_handler_t resize_handler; window_redraw_handler_t redraw_handler; window_key_handler_t key_handler; - window_button_handler_t button_handler; window_keyboard_focus_handler_t keyboard_focus_handler; window_data_handler_t data_handler; window_drop_handler_t drop_handler; @@ -153,6 +152,7 @@ struct widget { widget_enter_handler_t enter_handler; widget_leave_handler_t leave_handler; widget_motion_handler_t motion_handler; + widget_button_handler_t button_handler; void *user_data; }; @@ -1126,6 +1126,13 @@ widget_set_motion_handler(struct widget *widget, widget->motion_handler = handler; } +void +widget_set_button_handler(struct widget *widget, + widget_button_handler_t handler) +{ + widget->button_handler = handler; +} + void widget_schedule_redraw(struct widget *widget) { @@ -1349,6 +1356,7 @@ input_handle_button(void *data, location = get_pointer_location(window, input->sx, input->sy); + widget = window->focus_widget; if (window->display->shell && button == BTN_LEFT && state == 1) { switch (location) { case WINDOW_TITLEBAR: @@ -1373,11 +1381,11 @@ input_handle_button(void *data, location); break; case WINDOW_CLIENT_AREA: - if (window->button_handler) - (*window->button_handler)(window, + if (widget && widget->button_handler) + (*widget->button_handler)(widget, input, time, button, state, - window->user_data); + widget->user_data); break; } } else if (button == BTN_RIGHT && state == 1) { @@ -1393,19 +1401,19 @@ input_handle_button(void *data, window_schedule_redraw(window->menu); break; case WINDOW_CLIENT_AREA: - if (window->button_handler) - (*window->button_handler)(window, + if (widget && widget->button_handler) + (*widget->button_handler)(widget, input, time, button, state, - window->user_data); + widget->user_data); break; } } else { - if (window->button_handler) - (*window->button_handler)(window, + if (widget && widget->button_handler) + (*widget->button_handler)(widget, input, time, button, state, - window->user_data); + widget->user_data); } if (window->focus_widget && @@ -2042,13 +2050,6 @@ window_set_key_handler(struct window *window, window->key_handler = handler; } -void -window_set_button_handler(struct window *window, - window_button_handler_t handler) -{ - window->button_handler = handler; -} - void window_set_keyboard_focus_handler(struct window *window, window_keyboard_focus_handler_t handler) @@ -2241,12 +2242,13 @@ menu_leave_handler(struct widget *widget, struct input *input, void *data) } static void -menu_button_handler(struct window *window, +menu_button_handler(struct widget *widget, struct input *input, uint32_t time, int button, int state, void *data) { - struct menu *menu = data; + struct window *window = data; + struct menu *menu = window_get_user_data(window); /* Either relase after press-drag-release or click-motion-click. */ if (state == 0 && time - menu->time > 500) { @@ -2333,13 +2335,13 @@ window_create_menu(struct display *display, window->parent->shell_surface, window->x, window->y, 0); - window_set_button_handler(window, menu_button_handler); window_set_redraw_handler(window, menu_redraw_handler); window_set_user_data(window, menu); widget_set_enter_handler(window->widget, menu_enter_handler); widget_set_leave_handler(window->widget, menu_leave_handler); widget_set_motion_handler(window->widget, menu_motion_handler); + widget_set_button_handler(window->widget, menu_button_handler); return window; } diff --git a/clients/window.h b/clients/window.h index cf1b0bcb..97a1c6a3 100644 --- a/clients/window.h +++ b/clients/window.h @@ -168,15 +168,6 @@ typedef void (*window_key_handler_t)(struct window *window, struct input *input, typedef void (*window_keyboard_focus_handler_t)(struct window *window, struct input *device, void *data); -typedef void (*window_button_handler_t)(struct window *window, - struct input *input, uint32_t time, - int button, int state, void *data); - -typedef int (*window_motion_handler_t)(struct window *window, - struct input *input, uint32_t time, - int32_t x, int32_t y, - int32_t sx, int32_t sy, void *data); - typedef void (*window_data_handler_t)(struct window *window, struct input *input, uint32_t time, int32_t x, int32_t y, @@ -197,6 +188,9 @@ typedef void (*widget_leave_handler_t)(struct widget *widget, typedef int (*widget_motion_handler_t)(struct widget *widget, struct input *input, uint32_t time, int32_t x, int32_t y, void *data); +typedef void (*widget_button_handler_t)(struct widget *widget, + struct input *input, uint32_t time, + int button, int state, void *data); struct window * window_create(struct display *display, int32_t width, int32_t height); @@ -316,14 +310,6 @@ void window_set_key_handler(struct window *window, window_key_handler_t handler); -void -window_set_button_handler(struct window *window, - window_button_handler_t handler); - -void -window_set_motion_handler(struct window *window, - window_motion_handler_t handler); - void window_set_keyboard_focus_handler(struct window *window, window_keyboard_focus_handler_t handler); @@ -366,6 +352,10 @@ void widget_set_motion_handler(struct widget *widget, widget_motion_handler_t handler); void +widget_set_button_handler(struct widget *widget, + widget_button_handler_t handler); + +void widget_schedule_redraw(struct widget *widget); void