Include the currently pressed keys in keyboard focus event.

dev
Kristian Høgsberg 16 years ago
parent 7e3e860031
commit 3c38fa0c3e
  1. 29
      connection.c
  2. 3
      wayland-client.h
  3. 2
      wayland-protocol.c
  4. 24
      wayland-system-compositor.c
  5. 44
      wayland-util.c
  6. 9
      wayland-util.h
  7. 4
      window.c

@ -229,6 +229,7 @@ wl_connection_vmarshal(struct wl_connection *connection,
{ {
struct wl_object *object; struct wl_object *object;
uint32_t args[32], length, *p, size; uint32_t args[32], length, *p, size;
struct wl_array *array;
const char *s; const char *s;
int i, count; int i, count;
@ -254,6 +255,16 @@ wl_connection_vmarshal(struct wl_connection *connection,
object = va_arg(ap, struct wl_object *); object = va_arg(ap, struct wl_object *);
*p++ = object ? object->id : 0; *p++ = object ? object->id : 0;
break; break;
case 'a':
array = va_arg(ap, struct wl_array *);
if (array == NULL || array->size == 0) {
*p++ = 0;
break;
}
*p++ = array->size;
memcpy(p, array->data, array->size);
p = (void *) p + array->size;
break;
default: default:
assert(0); assert(0);
break; break;
@ -283,6 +294,7 @@ wl_connection_demarshal(struct wl_connection *connection,
char *string; char *string;
void *object; void *object;
uint32_t new_id; uint32_t new_id;
struct wl_array *array;
} values[20]; } values[20];
void *args[20]; void *args[20];
struct wl_object *object; struct wl_object *object;
@ -344,6 +356,20 @@ wl_connection_demarshal(struct wl_connection *connection,
printf("object already exists (%d)\n", *p); printf("object already exists (%d)\n", *p);
p++; p++;
break; break;
case 'a':
types[i] = &ffi_type_pointer;
length = *p++;
values[i].array = malloc(length + sizeof *values[i].array);
if (values[i].array == NULL) {
/* FIXME: Send NO_MEMORY */
return;
}
values[i].array->size = length;
values[i].array->alloc = 0;
values[i].array->data = values[i].array + 1;
memcpy(values[i].array->data, p, length);
p += DIV_ROUNDUP(length, sizeof *p);
break;
default: default:
printf("unknown type\n"); printf("unknown type\n");
break; break;
@ -359,6 +385,9 @@ wl_connection_demarshal(struct wl_connection *connection,
case 's': case 's':
free(values[i].string); free(values[i].string);
break; break;
case 'a':
free(values[i].array);
break;
} }
} }
} }

@ -124,7 +124,8 @@ struct wl_input_device_listener {
struct wl_surface *surface); struct wl_surface *surface);
void (*keyboard_focus)(void *data, void (*keyboard_focus)(void *data,
struct wl_input_device *input_device, struct wl_input_device *input_device,
struct wl_surface *surface); struct wl_surface *surface,
struct wl_array *keys);
}; };
int int

@ -77,7 +77,7 @@ static const struct wl_message input_device_events[] = {
{ "button", "uuiiii" }, { "button", "uuiiii" },
{ "key", "uu" }, { "key", "uu" },
{ "pointer_focus", "o" }, { "pointer_focus", "o" },
{ "keyboard_focus", "o" }, { "keyboard_focus", "oa" },
}; };
WL_EXPORT const struct wl_interface wl_input_device_interface = { WL_EXPORT const struct wl_interface wl_input_device_interface = {

@ -88,6 +88,7 @@ struct wlsc_input_device {
struct wlsc_surface *grab_surface; struct wlsc_surface *grab_surface;
struct wlsc_surface *pointer_focus; struct wlsc_surface *pointer_focus;
struct wlsc_surface *keyboard_focus; struct wlsc_surface *keyboard_focus;
struct wl_array keys;
}; };
struct wlsc_compositor { struct wlsc_compositor {
@ -870,14 +871,13 @@ wlsc_input_device_set_keyboard_focus(struct wlsc_input_device *device,
(!surface || device->keyboard_focus->base.client != surface->base.client)) (!surface || device->keyboard_focus->base.client != surface->base.client))
wl_surface_post_event(&device->keyboard_focus->base, wl_surface_post_event(&device->keyboard_focus->base,
&device->base, &device->base,
WL_INPUT_KEYBOARD_FOCUS, NULL); WL_INPUT_KEYBOARD_FOCUS, NULL, NULL);
/* FIXME: We need to send the currently held down keys in the
* keyboard focus event. */
if (surface) if (surface)
wl_surface_post_event(&surface->base, wl_surface_post_event(&surface->base,
&device->base, &device->base,
WL_INPUT_KEYBOARD_FOCUS, &surface->base); WL_INPUT_KEYBOARD_FOCUS,
&surface->base, &device->keys);
device->keyboard_focus = surface; device->keyboard_focus = surface;
} }
@ -1051,6 +1051,10 @@ notify_key(struct wlsc_input_device *device,
uint32_t key, uint32_t state) uint32_t key, uint32_t state)
{ {
struct wlsc_compositor *ec = device->ec; struct wlsc_compositor *ec = device->ec;
uint32_t *k, *end;
if (!ec->vt_active)
return;
switch (key | ec->meta_state) { switch (key | ec->meta_state) {
case KEY_EJECTCD | META_DOWN: case KEY_EJECTCD | META_DOWN:
@ -1083,8 +1087,16 @@ notify_key(struct wlsc_input_device *device,
return; return;
} }
if (!ec->vt_active) end = device->keys.data + device->keys.size;
return; for (k = device->keys.data; k < end; k++) {
if (*k == key)
*k = *--end;
}
device->keys.size = (void *) end - device->keys.data;
if (state) {
k = wl_array_add(&device->keys, sizeof *k);
*k = key;
}
if (device->keyboard_focus != NULL) if (device->keyboard_focus != NULL)
wl_surface_post_event(&device->keyboard_focus->base, wl_surface_post_event(&device->keyboard_focus->base,

@ -137,3 +137,47 @@ wl_list_empty(struct wl_list *list)
{ {
return list->next == list; return list->next == list;
} }
void
wl_array_init(struct wl_array *array)
{
memset(array, 0, sizeof *array);
}
void
wl_array_release(struct wl_array *array)
{
free(array->data);
}
void *
wl_array_add(struct wl_array *array, int size)
{
int alloc;
void *data, *p;
if (array->alloc > 0)
alloc = array->alloc;
else
alloc = 16;
while (alloc < array->size + size)
alloc *= 2;
if (array->alloc < alloc) {
if (array->alloc > 0)
data = realloc(array->data, alloc);
else
data = malloc(alloc);
if (data == NULL)
return 0;
array->data = data;
array->alloc = alloc;
}
p = array->data + array->size;
array->size += size;
return p;
}

@ -82,5 +82,14 @@ void wl_list_remove(struct wl_list *elm);
int wl_list_length(struct wl_list *list); int wl_list_length(struct wl_list *list);
int wl_list_empty(struct wl_list *list); int wl_list_empty(struct wl_list *list);
struct wl_array {
uint32_t size;
uint32_t alloc;
void *data;
};
void wl_array_init(struct wl_array *array);
void wl_array_release(struct wl_array *array);
void *wl_array_add(struct wl_array *array, int size);
#endif #endif

@ -33,6 +33,7 @@
#include <cairo-drm.h> #include <cairo-drm.h>
#include <linux/input.h> #include <linux/input.h>
#include "wayland-util.h"
#include "wayland-client.h" #include "wayland-client.h"
#include "wayland-glib.h" #include "wayland-glib.h"
@ -490,7 +491,8 @@ window_handle_pointer_focus(void *data,
static void static void
window_handle_keyboard_focus(void *data, window_handle_keyboard_focus(void *data,
struct wl_input_device *input_device, struct wl_input_device *input_device,
struct wl_surface *surface) struct wl_surface *surface,
struct wl_array *keys)
{ {
struct window *window = data; struct window *window = data;

Loading…
Cancel
Save