Add a simple key binding mechanism
This commit is contained in:
parent
04db9fa583
commit
3555d09813
@ -1053,6 +1053,82 @@ wlsc_switcher_destroy(struct wlsc_switcher *switcher)
|
||||
free(switcher);
|
||||
}
|
||||
|
||||
static void
|
||||
switcher_next_binding(struct wlsc_input_device *device,
|
||||
uint32_t time, uint32_t key, uint32_t state, void *data)
|
||||
{
|
||||
struct wlsc_compositor *compositor = data;
|
||||
|
||||
if (!state)
|
||||
return;
|
||||
if (wl_list_empty(&compositor->surface_list))
|
||||
return;
|
||||
if (compositor->switcher == NULL)
|
||||
compositor->switcher = wlsc_switcher_create(compositor);
|
||||
|
||||
wlsc_switcher_next(compositor->switcher);
|
||||
}
|
||||
|
||||
static void
|
||||
switcher_terminate_binding(struct wlsc_input_device *device,
|
||||
uint32_t time, uint32_t key, uint32_t state,
|
||||
void *data)
|
||||
{
|
||||
struct wlsc_compositor *compositor = data;
|
||||
|
||||
if (compositor->switcher && !state) {
|
||||
wlsc_surface_activate(compositor->switcher->current,
|
||||
device, time);
|
||||
wlsc_switcher_destroy(compositor->switcher);
|
||||
compositor->switcher = NULL;
|
||||
compositor->overlay_surface = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
struct wlsc_binding {
|
||||
uint32_t key;
|
||||
uint32_t modifier;
|
||||
wlsc_binding_handler_t handler;
|
||||
void *data;
|
||||
struct wl_list link;
|
||||
};
|
||||
|
||||
static void
|
||||
terminate_binding(struct wlsc_input_device *device,
|
||||
uint32_t time, uint32_t key, uint32_t state, void *data)
|
||||
{
|
||||
struct wlsc_compositor *compositor = data;
|
||||
|
||||
wl_display_terminate(compositor->wl_display);
|
||||
}
|
||||
|
||||
struct wlsc_binding *
|
||||
wlsc_compositor_add_binding(struct wlsc_compositor *compositor,
|
||||
uint32_t key, uint32_t modifier,
|
||||
wlsc_binding_handler_t handler, void *data)
|
||||
{
|
||||
struct wlsc_binding *binding;
|
||||
|
||||
binding = malloc(sizeof *binding);
|
||||
if (binding == NULL)
|
||||
return NULL;
|
||||
|
||||
binding->key = key;
|
||||
binding->modifier = modifier;
|
||||
binding->handler = handler;
|
||||
binding->data = data;
|
||||
wl_list_insert(compositor->binding_list.prev, &binding->link);
|
||||
|
||||
return binding;
|
||||
}
|
||||
|
||||
void
|
||||
wlsc_binding_destroy(struct wlsc_binding *binding)
|
||||
{
|
||||
wl_list_remove(&binding->link);
|
||||
free(binding);
|
||||
}
|
||||
|
||||
void
|
||||
notify_key(struct wl_input_device *device,
|
||||
uint32_t time, uint32_t key, uint32_t state)
|
||||
@ -1062,32 +1138,14 @@ notify_key(struct wl_input_device *device,
|
||||
(struct wlsc_compositor *) device->compositor;
|
||||
uint32_t *k, *end;
|
||||
uint32_t modifier;
|
||||
struct wlsc_binding *b;
|
||||
|
||||
switch (key | wd->modifier_state) {
|
||||
case KEY_BACKSPACE | MODIFIER_CTRL | MODIFIER_ALT:
|
||||
wl_display_terminate(compositor->wl_display);
|
||||
return;
|
||||
|
||||
case KEY_TAB | MODIFIER_SUPER:
|
||||
if (!state)
|
||||
return;
|
||||
if (wl_list_empty(&compositor->surface_list))
|
||||
return;
|
||||
if (compositor->switcher == NULL)
|
||||
compositor->switcher = wlsc_switcher_create(compositor);
|
||||
|
||||
wlsc_switcher_next(compositor->switcher);
|
||||
return;
|
||||
|
||||
case KEY_LEFTMETA | MODIFIER_SUPER:
|
||||
case KEY_RIGHTMETA | MODIFIER_SUPER:
|
||||
if (compositor->switcher && !state) {
|
||||
wlsc_surface_activate(compositor->switcher->current,
|
||||
wd, time);
|
||||
wlsc_switcher_destroy(compositor->switcher);
|
||||
compositor->switcher = NULL;
|
||||
wl_list_for_each(b, &compositor->binding_list, link) {
|
||||
if (b->key == key &&
|
||||
b->modifier == wd->modifier_state && state) {
|
||||
b->handler(wd, time, key, state, b->data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
switch (key) {
|
||||
@ -1409,6 +1467,17 @@ wlsc_compositor_init(struct wlsc_compositor *ec, struct wl_display *display)
|
||||
wl_list_init(&ec->surface_list);
|
||||
wl_list_init(&ec->input_device_list);
|
||||
wl_list_init(&ec->output_list);
|
||||
wl_list_init(&ec->binding_list);
|
||||
|
||||
wlsc_compositor_add_binding(ec, KEY_BACKSPACE,
|
||||
MODIFIER_CTRL | MODIFIER_ALT,
|
||||
terminate_binding, ec);
|
||||
wlsc_compositor_add_binding(ec, KEY_TAB, MODIFIER_SUPER,
|
||||
switcher_next_binding, ec);
|
||||
wlsc_compositor_add_binding(ec, KEY_LEFTMETA, MODIFIER_SUPER,
|
||||
switcher_terminate_binding, ec);
|
||||
wlsc_compositor_add_binding(ec, KEY_RIGHTMETA, MODIFIER_SUPER,
|
||||
switcher_terminate_binding, ec);
|
||||
|
||||
create_pointer_images(ec);
|
||||
|
||||
|
@ -100,6 +100,7 @@ struct wlsc_compositor {
|
||||
struct wl_list output_list;
|
||||
struct wl_list input_device_list;
|
||||
struct wl_list surface_list;
|
||||
struct wl_list binding_list;
|
||||
|
||||
/* Repaint state. */
|
||||
struct wl_event_source *timer_source;
|
||||
@ -184,6 +185,18 @@ wlsc_compositor_finish_frame(struct wlsc_compositor *compositor, int msecs);
|
||||
void
|
||||
wlsc_compositor_schedule_repaint(struct wlsc_compositor *compositor);
|
||||
|
||||
struct wlsc_binding;
|
||||
typedef void (*wlsc_binding_handler_t)(struct wlsc_input_device *device,
|
||||
uint32_t time, uint32_t key,
|
||||
uint32_t state, void *data);
|
||||
struct wlsc_binding *
|
||||
wlsc_compositor_add_binding(struct wlsc_compositor *compositor,
|
||||
uint32_t key, uint32_t modifier,
|
||||
wlsc_binding_handler_t binding, void *data);
|
||||
void
|
||||
wlsc_binding_destroy(struct wlsc_binding *binding);
|
||||
|
||||
|
||||
void
|
||||
wlsc_surface_damage(struct wlsc_surface *surface);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user