8 static struct wl_list *
9 keyrouter_grab_get_grabbed_list(struct ds_tizen_keyrouter_grab *keyrouter_grab,
10 int type, int keycode)
13 case TIZEN_KEYROUTER_MODE_EXCLUSIVE:
14 return &keyrouter_grab->hard_keys[keycode].grab.excl;
15 case TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE:
16 return &keyrouter_grab->hard_keys[keycode].grab.or_excl;
17 case TIZEN_KEYROUTER_MODE_TOPMOST:
18 return &keyrouter_grab->hard_keys[keycode].grab.top;
19 case TIZEN_KEYROUTER_MODE_SHARED:
20 return &keyrouter_grab->hard_keys[keycode].grab.shared;
27 keyrouter_grab_check_grabbed_key(struct ds_tizen_keyrouter_grab *keyrouter_grab, int keycode)
31 list = keyrouter_grab_get_grabbed_list(keyrouter_grab, TIZEN_KEYROUTER_MODE_EXCLUSIVE, keycode);
32 if (list && !wl_list_empty(list))
35 list = keyrouter_grab_get_grabbed_list(keyrouter_grab, TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE, keycode);
36 if (list && !wl_list_empty(list))
39 list = keyrouter_grab_get_grabbed_list(keyrouter_grab, TIZEN_KEYROUTER_MODE_TOPMOST, keycode);
40 if (list && !wl_list_empty(list))
43 list = keyrouter_grab_get_grabbed_list(keyrouter_grab, TIZEN_KEYROUTER_MODE_SHARED, keycode);
44 if (list && !wl_list_empty(list))
51 keyrouter_grab_check_duplicated_data(struct wl_list *list, void *data)
53 struct ds_tizen_keyrouter_key_info *info;
55 if (wl_list_empty(list))
58 wl_list_for_each(info, list, link) {
59 if (info->data == data)
67 keyrouter_grab_check_grabbed(struct ds_tizen_keyrouter_grab *keyrouter_grab,
68 int type, int keycode, void *data)
73 list = keyrouter_grab_get_grabbed_list(keyrouter_grab, type, keycode);
75 ds_err("keycode(%d) had no list for type(%d).", keycode, type);
80 case TIZEN_KEYROUTER_MODE_EXCLUSIVE:
81 if (wl_list_empty(list) == false)
86 case TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE:
87 ret = keyrouter_grab_check_duplicated_data(list, data);
89 case TIZEN_KEYROUTER_MODE_TOPMOST:
90 ret = keyrouter_grab_check_duplicated_data(list, data);
92 case TIZEN_KEYROUTER_MODE_SHARED:
93 ret = keyrouter_grab_check_duplicated_data(list, data);
104 keyrouter_grab_set_focus_client(struct ds_tizen_keyrouter_grab *keyrouter_grab,
107 keyrouter_grab->focus_client = focus_client;
110 ds_dbg("[%s] focus client has been set. (focus_client=0x%p)", __FUNCTION__, focus_client);
112 ds_dbg("[%s] focus client has been set to NULL.", __FUNCTION__);
116 keyrouter_grab_set_top_client(struct ds_tizen_keyrouter_grab *keyrouter_grab, void *top_client)
118 keyrouter_grab->top_client = top_client;
121 ds_dbg("[%s] top client has been set. (top_client=0x%p)", __FUNCTION__, top_client);
123 ds_dbg("[%s] top client has been set to NULL.", __FUNCTION__);
127 keyrouter_grab_key_process(struct ds_tizen_keyrouter_grab *keyrouter_grab,
128 int keycode, int pressed, struct wl_list *delivery_list)
130 struct ds_tizen_keyrouter_key_info *info, *delivery;
133 if (keycode <= 0 || keycode >= KEYROUTER_MAX_KEYS) {
134 ds_err("Invalid keycode(%d)", keycode);
138 if (!wl_list_empty(&keyrouter_grab->hard_keys[keycode].grab.excl)) {
139 info = wl_container_of(keyrouter_grab->hard_keys[keycode].grab.excl.next, info, link);
141 delivery = calloc(1, sizeof(struct ds_tizen_keyrouter_key_info));
142 if (delivery == NULL) {
143 ds_err("Failed to allocate memory.");
146 delivery->data = info->data;
147 wl_list_insert(delivery_list, &delivery->link);
148 ds_dbg("Exclusive Mode: keycode: %d to data: %p", keycode, info->data);
151 } else if (!wl_list_empty(&keyrouter_grab->hard_keys[keycode].grab.or_excl)) {
152 info = wl_container_of(keyrouter_grab->hard_keys[keycode].grab.or_excl.next, info, link);
154 delivery = calloc(1, sizeof(struct ds_tizen_keyrouter_key_info));
155 if (delivery == NULL) {
156 ds_err("Failed to allocate memory.");
159 delivery->data = info->data;
160 wl_list_insert(delivery_list, &delivery->link);
161 ds_dbg("OR-Excl Mode: keycode: %d to data: %p", keycode, info->data);
164 } else if (!wl_list_empty(&keyrouter_grab->hard_keys[keycode].grab.top)) {
165 wl_list_for_each(info, &keyrouter_grab->hard_keys[keycode].grab.top, link) {
166 if (keyrouter_grab->top_client && keyrouter_grab->top_client == info->data) {
167 delivery = calloc(1, sizeof(struct ds_tizen_keyrouter_key_info));
168 if (delivery == NULL) {
169 ds_err("Failed to allocate memory.");
172 delivery->data = info->data;
173 wl_list_insert(delivery_list, &delivery->link);
174 ds_dbg("Topmost Mode: keycode: %d to data: %p", keycode, info->data);
180 if (keyrouter_grab->focus_client) {
181 delivery = calloc(1, sizeof(struct ds_tizen_keyrouter_key_info));
182 if (delivery == NULL) {
183 ds_err("Failed to allocate memory.");
186 delivery->data = keyrouter_grab->focus_client;
187 wl_list_insert(delivery_list, &delivery->link);
189 ds_dbg("Focus: keycode: %d to data: %p, count: %d", keycode, delivery->data, count);
192 if (!wl_list_empty(&keyrouter_grab->hard_keys[keycode].grab.shared)) {
193 wl_list_for_each(info, &keyrouter_grab->hard_keys[keycode].grab.shared, link) {
194 if (keyrouter_grab->focus_client && keyrouter_grab->focus_client == info->data)
196 delivery = calloc(1, sizeof(struct ds_tizen_keyrouter_key_info));
197 if (delivery == NULL) {
198 ds_err("Failed to allocate memory.");
201 delivery->data = info->data;
202 wl_list_insert(delivery_list, &delivery->link);
204 ds_dbg("Shared: keycode: %d to data: %p, count: %d", keycode, info->data, count);
212 keyrouter_grab_grab_key(struct ds_tizen_keyrouter_grab *keyrouter_grab,
213 int type, int keycode, void *data)
215 struct ds_tizen_keyrouter_key_info *info = NULL;
216 struct wl_list *list = NULL;
218 if (keycode <= 0 || keycode >= KEYROUTER_MAX_KEYS) {
219 ds_err("Invalid keycode(%d)", keycode);
220 return TIZEN_KEYROUTER_ERROR_INVALID_KEY;
223 if (keyrouter_grab_check_grabbed(keyrouter_grab, type, keycode, data))
224 return TIZEN_KEYROUTER_ERROR_GRABBED_ALREADY;
226 info = calloc(1, sizeof(struct ds_tizen_keyrouter_key_info));
228 ds_err("Failed to allocate memory.");
229 return TIZEN_KEYROUTER_ERROR_NO_SYSTEM_RESOURCES;
233 wl_list_init(&info->link);
235 list = keyrouter_grab_get_grabbed_list(keyrouter_grab, type, keycode);
237 ds_err("keycode(%d) had no list for type(%d)", keycode, type);
239 return TIZEN_KEYROUTER_ERROR_INVALID_MODE;
242 if (!keyrouter_grab->hard_keys[keycode].keycode)
243 keyrouter_grab->hard_keys[keycode].keycode = keycode;
245 wl_list_insert(list, &info->link);
247 return TIZEN_KEYROUTER_ERROR_NONE;
251 keyrouter_list_remove_data(struct wl_list *list, void *data)
253 struct ds_tizen_keyrouter_key_info *info, *tmp;
255 if (wl_list_empty(list))
258 wl_list_for_each_safe(info ,tmp, list, link) {
259 if (info->data == data) {
260 wl_list_remove(&info->link);
267 keyrouter_grab_ungrab_key(struct ds_tizen_keyrouter_grab *keyrouter_grab,
268 int type, int keycode, void *data)
270 struct wl_list *list;
272 if (keycode <= 0 || keycode >= KEYROUTER_MAX_KEYS) {
273 ds_err("Invalid keycode(%d)", keycode);
277 if (keyrouter_grab->hard_keys[keycode].keycode == 0)
280 list = keyrouter_grab_get_grabbed_list(keyrouter_grab, type, keycode);
282 ds_err("keycode(%d) had no list for type(%d)", keycode, type);
286 keyrouter_list_remove_data(list, data);
289 struct ds_tizen_keyrouter_grab *
290 keyrouter_grab_create(void)
292 struct ds_tizen_keyrouter_grab *keyrouter_grab = NULL;
295 keyrouter_grab = calloc(1, sizeof(struct ds_tizen_keyrouter_grab));
296 if (keyrouter_grab == NULL) {
297 ds_err("Failed to allocate memory.");
301 /* FIXME: Who defined max keycode? */
302 keyrouter_grab->hard_keys = calloc(KEYROUTER_MAX_KEYS, sizeof(struct ds_tizen_keyrouter_grabbed));
303 if (keyrouter_grab == NULL) {
304 ds_err("Failed to allocate memory.");
305 free(keyrouter_grab);
309 for (i = 0; i < KEYROUTER_MAX_KEYS; i++) {
310 /* Enable all of keys to grab */
311 //keyrouter_grab->hard_keys[i].keycode = i;
312 wl_list_init(&keyrouter_grab->hard_keys[i].grab.excl);
313 wl_list_init(&keyrouter_grab->hard_keys[i].grab.or_excl);
314 wl_list_init(&keyrouter_grab->hard_keys[i].grab.top);
315 wl_list_init(&keyrouter_grab->hard_keys[i].grab.shared);
316 wl_list_init(&keyrouter_grab->hard_keys[i].pressed);
319 return keyrouter_grab;
323 keyrouter_grab_delete_list(struct wl_list *list)
325 struct ds_tizen_keyrouter_key_info *info, *tmp;
327 if (wl_list_empty(list))
330 wl_list_for_each_safe(info, tmp, list, link) {
331 wl_list_remove(&info->link);
337 keyrouter_grab_destroy(struct ds_tizen_keyrouter_grab *keyrouter_grab)
341 for (i = 0; i < KEYROUTER_MAX_KEYS; i++) {
342 keyrouter_grab_delete_list(&keyrouter_grab->hard_keys[i].grab.excl);
343 keyrouter_grab_delete_list(&keyrouter_grab->hard_keys[i].grab.or_excl);
344 keyrouter_grab_delete_list(&keyrouter_grab->hard_keys[i].grab.top);
345 keyrouter_grab_delete_list(&keyrouter_grab->hard_keys[i].grab.shared);
346 keyrouter_grab_delete_list(&keyrouter_grab->hard_keys[i].pressed);
349 free(keyrouter_grab->hard_keys);
350 free(keyrouter_grab);