#include <wayland-server.h>
#include <tizen-extension-server-protocol.h>
+#include "libds-tizen/keyrouter.h"
+
#define KEYROUTER_MAX_KEYS 512
-struct ds_tizen_keyrouter_key_info
-{
- void *data;
- struct wl_list link;
+/**
+ * Keyroute mode of keyroutes returned by keyrouter_grab_get_keyroutes()
+ * for a given keycode.
+ */
+enum keyroute_mode {
+ /**
+ * The keycode is not under any keyroute mode.
+ * The compositor may send a keycode to a focused wayland cliet as usual.
+ */
+ KEYROUTE_MODE_NONE,
+ /**
+ * Exclusive mode means that a given keycode is required to be sent
+ * exclusively to wayland clients of returned keyroutes. So the compositor
+ * must not send this keycode to any other wayland clients except for
+ * returned wayland clients.
+ */
+ KEYROUTE_MODE_EXCLUSIVE,
+ /**
+ * The keycode is required to be shared with returned wayland clients.
+ * The compositor must send the keycode not only to returned wayland
+ * clients, but also to a focused wayland client.
+ */
+ KEYROUTE_MODE_SHARED,
};
-struct ds_tizen_keyrouter_grabbed
+struct keyroute_info
{
- int keycode;
+ struct wl_client *wl_client;
+ struct wl_list link;
+};
+struct keyrouter_grabbed
+{
struct {
- struct wl_list excl;
- struct wl_list or_excl;
- struct wl_list top;
- struct wl_list shared;
+ struct wl_list excl; // keyroute_info::link
+ struct wl_list or_excl; // keyroute_info::link
+ struct wl_list top; // keyroute_info::link
+ struct wl_list shared; // keyroute_info::link
} grab;
struct wl_list pressed;
};
-struct ds_tizen_keyrouter_grab
+struct keyrouter_grab
{
- struct ds_tizen_keyrouter_grabbed *hard_keys;
-
- void *focus_client;
- void *top_client;
+ struct keyrouter_grabbed hard_keys[KEYROUTER_MAX_KEYS];
};
-struct ds_tizen_keyrouter_key_options
+struct keyrouter_key_options
{
bool enabled;
bool no_privilege;
struct wl_signal destroy;
} events;
- struct ds_tizen_keyrouter_key_options *opts;
+ struct keyrouter_key_options *opts;
- struct ds_tizen_keyrouter_grab *keyrouter_grab;
+ struct keyrouter_grab keygrab;
bool security_initialized;
};
-struct ds_tizen_keyrouter_client
+struct keyrouter_client
{
struct ds_tizen_keyrouter *keyrouter;
struct wl_resource *resource;
+ struct wl_client *wl_client;
- bool grabbed;
+ bool privileged;
struct wl_list link; // ds_tizen_keyrouter::clients
};
int err;
};
-struct ds_tizen_keyrouter_grab *
-keyrouter_grab_create(void);
-void
-keyrouter_grab_destroy(struct ds_tizen_keyrouter_grab *keyrouter_grab);
-int
-keyrouter_grab_grab_key(struct ds_tizen_keyrouter_grab *keyrouter_grab,
- int type, int keycode, void *data);
-void
-keyrouter_grab_ungrab_key(struct ds_tizen_keyrouter_grab *keyrouter_grab,
- int type, int keycode, void *data);
-int
-keyrouter_grab_key_process(struct ds_tizen_keyrouter_grab *keyrouter_grab,
- int keycode, int pressed, struct wl_list *delivery_list);
-void
-keyrouter_grab_set_focus_client(struct ds_tizen_keyrouter_grab *keyrouter_grab,
- void *focus_client);
-void
-keyrouter_grab_set_top_client(struct ds_tizen_keyrouter_grab *keyrouter_grab,
- void *top_client);
-bool
-keyrouter_grab_check_grabbed_key(struct ds_tizen_keyrouter_grab *keyrouter_grab,
- int keycode);
+void keyrouter_grab_init(struct keyrouter_grab *keygrab);
+
+void keyrouter_grab_finish(struct keyrouter_grab *keygrab);
+
+int keyrouter_grab_grab_key(struct keyrouter_grab *keygrab, int mode,
+ int keycode, struct wl_client *wl_client);
+
+void keyrouter_grab_ungrab_key(struct keyrouter_grab *keygrab, int mode,
+ int keycode, struct wl_client *wl_client);
+
+enum keyroute_mode
+keyrouter_grab_get_keyroutes(struct keyrouter_grab *keygrab, int keycode,
+ struct wl_client *topmost_client, struct wl_array *keyroutes);
#endif