window: Replace widget focus handler with a enter/leave handler pair
This commit is contained in:
+25
-5
@@ -230,7 +230,15 @@ panel_redraw_handler(struct window *window, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
panel_widget_focus_handler(struct widget *widget, void *data)
|
panel_widget_enter_handler(struct widget *widget, struct input *input,
|
||||||
|
uint32_t time, int32_t x, int32_t y, void *data)
|
||||||
|
{
|
||||||
|
widget_schedule_redraw(widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
panel_widget_leave_handler(struct widget *widget,
|
||||||
|
struct input *input, void *data)
|
||||||
{
|
{
|
||||||
widget_schedule_redraw(widget);
|
widget_schedule_redraw(widget);
|
||||||
}
|
}
|
||||||
@@ -300,7 +308,8 @@ panel_add_widget(struct panel *panel, const char *icon, const char *path)
|
|||||||
widget->panel = panel;
|
widget->panel = panel;
|
||||||
|
|
||||||
widget->widget = window_add_widget(panel->window, widget);
|
widget->widget = window_add_widget(panel->window, widget);
|
||||||
widget_set_focus_handler(widget->widget, panel_widget_focus_handler);
|
widget_set_enter_handler(widget->widget, panel_widget_enter_handler);
|
||||||
|
widget_set_leave_handler(widget->widget, panel_widget_leave_handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -438,7 +447,16 @@ unlock_dialog_keyboard_focus_handler(struct window *window,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
unlock_dialog_widget_focus_handler(struct widget *widget, void *data)
|
unlock_dialog_widget_enter_handler(struct widget *widget,
|
||||||
|
struct input *input, uint32_t time,
|
||||||
|
int32_t x, int32_t y, void *data)
|
||||||
|
{
|
||||||
|
widget_schedule_redraw(widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
unlock_dialog_widget_leave_handler(struct widget *widget,
|
||||||
|
struct input *input, void *data)
|
||||||
{
|
{
|
||||||
widget_schedule_redraw(widget);
|
widget_schedule_redraw(widget);
|
||||||
}
|
}
|
||||||
@@ -464,8 +482,10 @@ unlock_dialog_create(struct desktop *desktop)
|
|||||||
unlock_dialog_keyboard_focus_handler);
|
unlock_dialog_keyboard_focus_handler);
|
||||||
window_set_button_handler(dialog->window, unlock_dialog_button_handler);
|
window_set_button_handler(dialog->window, unlock_dialog_button_handler);
|
||||||
dialog->button = window_add_widget(dialog->window, NULL);
|
dialog->button = window_add_widget(dialog->window, NULL);
|
||||||
widget_set_focus_handler(dialog->button,
|
widget_set_enter_handler(dialog->button,
|
||||||
unlock_dialog_widget_focus_handler);
|
unlock_dialog_widget_enter_handler);
|
||||||
|
widget_set_leave_handler(dialog->button,
|
||||||
|
unlock_dialog_widget_leave_handler);
|
||||||
|
|
||||||
desktop_shell_set_lock_surface(desktop->shell,
|
desktop_shell_set_lock_surface(desktop->shell,
|
||||||
window_get_wl_shell_surface(dialog->window));
|
window_get_wl_shell_surface(dialog->window));
|
||||||
|
|||||||
+31
-13
@@ -152,7 +152,8 @@ struct widget {
|
|||||||
struct window *window;
|
struct window *window;
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
struct rectangle allocation;
|
struct rectangle allocation;
|
||||||
widget_focus_handler_t focus_handler;
|
widget_enter_handler_t enter_handler;
|
||||||
|
widget_leave_handler_t leave_handler;
|
||||||
void *user_data;
|
void *user_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1102,9 +1103,15 @@ widget_get_user_data(struct widget *widget)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
widget_set_focus_handler(struct widget *widget, widget_focus_handler_t handler)
|
widget_set_enter_handler(struct widget *widget, widget_enter_handler_t handler)
|
||||||
{
|
{
|
||||||
widget->focus_handler = handler;
|
widget->enter_handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
widget_set_leave_handler(struct widget *widget, widget_leave_handler_t handler)
|
||||||
|
{
|
||||||
|
widget->leave_handler = handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1237,17 +1244,27 @@ input_set_pointer_image(struct input *input, uint32_t time, int pointer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
window_set_focus_widget(struct window *window, struct widget *focus)
|
window_set_focus_widget(struct window *window, struct widget *focus,
|
||||||
|
struct input *input, uint32_t time, int32_t x, int32_t y)
|
||||||
{
|
{
|
||||||
void *data;
|
struct widget *old;
|
||||||
|
|
||||||
if (focus == window->focus_widget)
|
if (focus == window->focus_widget)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
window->focus_widget = focus;
|
old = window->focus_widget;
|
||||||
data = focus ? focus->user_data : NULL;
|
if (old) {
|
||||||
if (focus && focus->focus_handler)
|
if (old->leave_handler)
|
||||||
focus->focus_handler(focus, data);
|
old->leave_handler(old, input, old->user_data);
|
||||||
|
window->focus_widget = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (focus) {
|
||||||
|
if (focus->enter_handler)
|
||||||
|
focus->enter_handler(focus, input, time,
|
||||||
|
x, y, focus->user_data);
|
||||||
|
window->focus_widget = focus;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1267,7 +1284,7 @@ input_handle_motion(void *data, struct wl_input_device *input_device,
|
|||||||
|
|
||||||
if (!window->focus_widget || !window->widget_grab_button) {
|
if (!window->focus_widget || !window->widget_grab_button) {
|
||||||
widget = window_find_widget(window, sx, sy);
|
widget = window_find_widget(window, sx, sy);
|
||||||
window_set_focus_widget(window, widget);
|
window_set_focus_widget(window, widget, input, time, sx, sy);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window->motion_handler)
|
if (window->motion_handler)
|
||||||
@@ -1383,7 +1400,8 @@ input_handle_button(void *data,
|
|||||||
window->widget_grab_button == button && !state) {
|
window->widget_grab_button == button && !state) {
|
||||||
window->widget_grab_button = 0;
|
window->widget_grab_button = 0;
|
||||||
widget = window_find_widget(window, input->sx, input->sy);
|
widget = window_find_widget(window, input->sx, input->sy);
|
||||||
window_set_focus_widget(window, widget);
|
window_set_focus_widget(window, widget, input, time,
|
||||||
|
input->sx, input->sy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1425,7 +1443,7 @@ input_remove_pointer_focus(struct input *input, uint32_t time)
|
|||||||
if (!window)
|
if (!window)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
window_set_focus_widget(window, NULL);
|
window_set_focus_widget(window, NULL, NULL, 0, 0, 0);
|
||||||
|
|
||||||
if (window->leave_handler)
|
if (window->leave_handler)
|
||||||
window->leave_handler(window, input, time, window->user_data);
|
window->leave_handler(window, input, time, window->user_data);
|
||||||
@@ -1464,7 +1482,7 @@ input_handle_pointer_focus(void *data,
|
|||||||
window->user_data);
|
window->user_data);
|
||||||
|
|
||||||
widget = window_find_widget(window, x, y);
|
widget = window_find_widget(window, x, y);
|
||||||
window_set_focus_widget(window, widget);
|
window_set_focus_widget(window, widget, input, time, sx, sy);
|
||||||
|
|
||||||
pointer = input_get_pointer_image_for_location(input, pointer);
|
pointer = input_get_pointer_image_for_location(input, pointer);
|
||||||
input_set_pointer_image(input, time, pointer);
|
input_set_pointer_image(input, time, pointer);
|
||||||
|
|||||||
+11
-4
@@ -194,10 +194,14 @@ typedef void (*window_drop_handler_t)(struct window *window,
|
|||||||
struct input *input,
|
struct input *input,
|
||||||
int32_t x, int32_t y, void *data);
|
int32_t x, int32_t y, void *data);
|
||||||
|
|
||||||
typedef void (*widget_focus_handler_t)(struct widget *widget, void *data);
|
|
||||||
|
|
||||||
typedef void (*window_close_handler_t)(struct window *window, void *data);
|
typedef void (*window_close_handler_t)(struct window *window, void *data);
|
||||||
|
|
||||||
|
typedef void (*widget_enter_handler_t)(struct widget *widget,
|
||||||
|
struct input *input, uint32_t time,
|
||||||
|
int32_t x, int32_t y, void *data);
|
||||||
|
typedef void (*widget_leave_handler_t)(struct widget *widget,
|
||||||
|
struct input *input, void *data);
|
||||||
|
|
||||||
struct window *
|
struct window *
|
||||||
window_create(struct display *display, int32_t width, int32_t height);
|
window_create(struct display *display, int32_t width, int32_t height);
|
||||||
struct window *
|
struct window *
|
||||||
@@ -362,8 +366,11 @@ void *
|
|||||||
widget_get_user_data(struct widget *widget);
|
widget_get_user_data(struct widget *widget);
|
||||||
|
|
||||||
void
|
void
|
||||||
widget_set_focus_handler(struct widget *widget,
|
widget_set_enter_handler(struct widget *widget,
|
||||||
widget_focus_handler_t handler);
|
widget_enter_handler_t handler);
|
||||||
|
void
|
||||||
|
widget_set_leave_handler(struct widget *widget,
|
||||||
|
widget_leave_handler_t handler);
|
||||||
|
|
||||||
void
|
void
|
||||||
widget_schedule_redraw(struct widget *widget);
|
widget_schedule_redraw(struct widget *widget);
|
||||||
|
|||||||
Reference in New Issue
Block a user