2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
10 #include <stdio.h> /* for printf */
12 #define WIN32_LEAN_AND_MEAN
14 #undef WIN32_LEAN_AND_MEAN
18 #include "Ecore_Win32.h"
19 #include "ecore_win32_private.h"
22 /***** Private declarations *****/
25 static Ecore_Win32_Window *_ecore_win32_mouse_down_last_window = NULL;
26 static Ecore_Win32_Window *_ecore_win32_mouse_down_last_last_window = NULL;
27 static double _ecore_win32_mouse_down_last_time = 0;
28 static double _ecore_win32_mouse_down_last_last_time = 0;
29 static int _ecore_win32_mouse_down_did_triple = 0;
30 static int _ecore_win32_mouse_up_count = 0;
32 static void _ecore_win32_event_free_key_down(void *data,
35 static void _ecore_win32_event_free_key_up(void *data,
38 static int _ecore_win32_event_keystroke_get(int key,
43 static int _ecore_win32_event_char_get(int key,
49 /***** Global functions definitions *****/
52 _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg,
55 Ecore_Win32_Event_Key_Down *e;
57 e = (Ecore_Win32_Event_Key_Down *)malloc(sizeof(Ecore_Win32_Event_Key_Down));
62 if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
74 if (!_ecore_win32_event_char_get(LOWORD(msg->window_param),
85 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
91 e->time = (double)msg->time / 1000.0;
93 _ecore_win32_event_last_time = e->time;
95 ecore_event_add(ECORE_WIN32_EVENT_KEY_DOWN, e, _ecore_win32_event_free_key_down, NULL);
99 _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg,
102 Ecore_Win32_Event_Key_Up *e;
104 e = (Ecore_Win32_Event_Key_Up *)calloc(1, sizeof(Ecore_Win32_Event_Key_Up));
109 if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
121 if (!_ecore_win32_event_char_get(LOWORD(msg->window_param),
132 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
138 e->time = (double)msg->time / 1000.0;
140 _ecore_win32_event_last_time = e->time;
142 ecore_event_add(ECORE_WIN32_EVENT_KEY_UP, e, _ecore_win32_event_free_key_up, NULL);
146 _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg,
149 Ecore_Win32_Window *window;
151 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
155 Ecore_Win32_Event_Mouse_Wheel *e;
157 e = (Ecore_Win32_Event_Mouse_Wheel *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Wheel));
162 /* wheel delta is positive or negative, never 0 */
163 e->z = GET_WHEEL_DELTA_WPARAM(msg->window_param) > 0 ? -1 : 1;
164 e->x = GET_X_LPARAM(msg->data_param);
165 e->y = GET_Y_LPARAM(msg->data_param);
166 e->time = (double)msg->time / 1000.0;
168 _ecore_win32_event_last_time = e->time;
169 _ecore_win32_event_last_window = e->window;
171 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_WHEEL, e, NULL, NULL);
176 Ecore_Win32_Event_Mouse_Move *e;
178 e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
182 e->x = GET_X_LPARAM(msg->data_param);
183 e->y = GET_Y_LPARAM(msg->data_param);
184 e->time = (double)msg->time / 1000.0;
186 _ecore_win32_event_last_time = e->time;
187 _ecore_win32_event_last_window = e->window;
189 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
193 Ecore_Win32_Event_Mouse_Button_Down *e;
195 if (_ecore_win32_mouse_down_did_triple)
197 _ecore_win32_mouse_down_last_window = NULL;
198 _ecore_win32_mouse_down_last_last_window = NULL;
199 _ecore_win32_mouse_down_last_time = 0.0;
200 _ecore_win32_mouse_down_last_last_time = 0.0;
203 e = (Ecore_Win32_Event_Mouse_Button_Down *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Button_Down));
208 e->x = GET_X_LPARAM(msg->data_param);
209 e->y = GET_Y_LPARAM(msg->data_param);
210 e->time = (double)msg->time / 1000.0;
212 if (((e->time - _ecore_win32_mouse_down_last_time) <= _ecore_win32_double_click_time) &&
213 (e->window == _ecore_win32_mouse_down_last_window))
216 if (((e->time - _ecore_win32_mouse_down_last_last_time) <= (2.0 * _ecore_win32_double_click_time)) &&
217 (e->window == _ecore_win32_mouse_down_last_window) &&
218 (e->window == _ecore_win32_mouse_down_last_last_window))
221 _ecore_win32_mouse_down_did_triple = 1;
224 _ecore_win32_mouse_down_did_triple = 0;
226 if (!e->double_click && !e->triple_click)
227 _ecore_win32_mouse_up_count = 0;
229 _ecore_win32_event_last_time = e->time;
230 _ecore_win32_event_last_window = e->window;
232 if (!_ecore_win32_mouse_down_did_triple)
234 _ecore_win32_mouse_down_last_last_window = _ecore_win32_mouse_down_last_window;
235 _ecore_win32_mouse_down_last_window = e->window;
236 _ecore_win32_mouse_down_last_last_time = _ecore_win32_mouse_down_last_time;
237 _ecore_win32_mouse_down_last_time = e->time;
240 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
243 /* printf (" * ecore event button press\n"); */
247 _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg,
250 Ecore_Win32_Window *window;
252 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
255 Ecore_Win32_Event_Mouse_Move *e;
257 e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
261 e->x = GET_X_LPARAM(msg->data_param);
262 e->y = GET_Y_LPARAM(msg->data_param);
263 e->time = (double)msg->time / 1000.0;
265 _ecore_win32_event_last_time = e->time;
266 _ecore_win32_event_last_window = e->window;
268 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
272 Ecore_Win32_Event_Mouse_Button_Up *e;
274 e = (Ecore_Win32_Event_Mouse_Button_Up *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Button_Up));
279 e->x = GET_X_LPARAM(msg->data_param);
280 e->y = GET_Y_LPARAM(msg->data_param);
281 e->time = (double)msg->time / 1000.0;
283 _ecore_win32_mouse_up_count++;
285 if ((_ecore_win32_mouse_up_count >= 2) &&
286 ((e->time - _ecore_win32_mouse_down_last_time) <= _ecore_win32_double_click_time) &&
287 (e->window == _ecore_win32_mouse_down_last_window))
290 if ((_ecore_win32_mouse_up_count >= 3) &&
291 ((e->time - _ecore_win32_mouse_down_last_last_time) <= (2.0 * _ecore_win32_double_click_time)) &&
292 (e->window == _ecore_win32_mouse_down_last_window) &&
293 (e->window == _ecore_win32_mouse_down_last_last_window))
296 _ecore_win32_event_last_time = e->time;
297 _ecore_win32_event_last_window = e->window;
299 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
302 /* printf (" * ecore event button release\n"); */
306 _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg)
308 Ecore_Win32_Event_Mouse_Move *e;
310 e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
313 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
314 e->x = GET_X_LPARAM(msg->data_param);
315 e->y = GET_Y_LPARAM(msg->data_param);
316 e->time = (double)msg->time / 1000.0;
318 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
322 _ecore_win32_event_handle_enter_notify(Ecore_Win32_Callback_Data *msg)
325 Ecore_Win32_Event_Mouse_Move *e;
327 e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
330 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
333 e->time = (double)msg->time / 1000.0;
335 _ecore_win32_event_last_time = e->time;
336 _ecore_win32_event_last_window = e->window;
338 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
342 Ecore_Win32_Event_Mouse_In *e;
344 e = (Ecore_Win32_Event_Mouse_In *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_In));
347 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
350 e->time = (double)msg->time / 1000.0;
352 _ecore_win32_event_last_time = e->time;
354 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_IN, e, NULL, NULL);
359 _ecore_win32_event_handle_leave_notify(Ecore_Win32_Callback_Data *msg)
362 Ecore_Win32_Event_Mouse_Move *e;
364 e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
367 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
370 e->time = (double)msg->time / 1000.0;
372 _ecore_win32_event_last_time = e->time;
373 _ecore_win32_event_last_window = e->window;
375 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
379 Ecore_Win32_Event_Mouse_Out *e;
381 e = (Ecore_Win32_Event_Mouse_Out *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Out));
384 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
387 e->time = (double)msg->time / 1000.0;
389 _ecore_win32_event_last_time = e->time;
391 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_OUT, e, NULL, NULL);
396 _ecore_win32_event_handle_focus_in(Ecore_Win32_Callback_Data *msg)
398 Ecore_Win32_Event_Window_Focus_In *e;
400 e = (Ecore_Win32_Event_Window_Focus_In *)calloc(1, sizeof(Ecore_Win32_Event_Window_Focus_In));
403 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
405 e->time = _ecore_win32_event_last_time;
406 _ecore_win32_event_last_time = e->time;
408 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
412 _ecore_win32_event_handle_focus_out(Ecore_Win32_Callback_Data *msg)
414 Ecore_Win32_Event_Window_Focus_Out *e;
416 e = (Ecore_Win32_Event_Window_Focus_Out *)calloc(1, sizeof(Ecore_Win32_Event_Window_Focus_Out));
419 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
421 e->time = _ecore_win32_event_last_time;
422 _ecore_win32_event_last_time = e->time;
424 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
428 _ecore_win32_event_handle_expose(Ecore_Win32_Callback_Data *msg)
430 Ecore_Win32_Event_Window_Damage *e;
432 e = (Ecore_Win32_Event_Window_Damage *)calloc(1, sizeof(Ecore_Win32_Event_Window_Damage));
435 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
437 e->x = msg->update.left;
438 e->y = msg->update.top;
439 e->width = msg->update.right - msg->update.left;
440 e->height = msg->update.bottom - msg->update.top;
441 /* printf (" * ecore : event expose %d %d\n", e->width, e->height); */
443 e->time = _ecore_win32_event_last_time;
445 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
449 _ecore_win32_event_handle_create_notify(Ecore_Win32_Callback_Data *msg)
451 Ecore_Win32_Event_Window_Create *e;
453 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Create));
456 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
458 e->time = _ecore_win32_event_last_time;
460 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_CREATE, e, NULL, NULL);
464 _ecore_win32_event_handle_destroy_notify(Ecore_Win32_Callback_Data *msg)
466 Ecore_Win32_Event_Window_Destroy *e;
468 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Destroy));
471 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
473 e->time = _ecore_win32_event_last_time;
474 if (e->window == _ecore_win32_event_last_window) _ecore_win32_event_last_window = NULL;
476 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DESTROY, e, NULL, NULL);
480 _ecore_win32_event_handle_map_notify(Ecore_Win32_Callback_Data *msg)
482 Ecore_Win32_Event_Window_Show *e;
484 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Show));
487 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
489 e->time = _ecore_win32_event_last_time;
491 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_SHOW, e, NULL, NULL);
495 _ecore_win32_event_handle_unmap_notify(Ecore_Win32_Callback_Data *msg)
497 Ecore_Win32_Event_Window_Hide *e;
499 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Hide));
502 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
504 e->time = _ecore_win32_event_last_time;
506 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_HIDE, e, NULL, NULL);
510 _ecore_win32_event_handle_configure_notify(Ecore_Win32_Callback_Data *msg)
513 Ecore_Win32_Event_Window_Configure *e;
514 WINDOWPOS *window_pos;
516 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Configure));
519 window_pos = (WINDOWPOS *)msg->data_param;
520 wi.cbSize = sizeof(WINDOWINFO);
521 if (!GetWindowInfo(window_pos->hwnd, &wi))
527 /* printf ("_ecore_win32_event_handle_configure_notify\n"); */
528 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
529 e->abovewin = (void *)GetWindowLong(window_pos->hwndInsertAfter, GWL_USERDATA);
530 e->x = wi.rcClient.left;
531 e->y = wi.rcClient.top;
532 e->width = wi.rcClient.right - wi.rcClient.left;
533 e->height = wi.rcClient.bottom - wi.rcClient.top;
534 e->time = _ecore_win32_event_last_time;
536 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
540 _ecore_win32_event_handle_resize(Ecore_Win32_Callback_Data *msg)
543 Ecore_Win32_Event_Window_Resize *e;
545 if (!GetClientRect(msg->window, &rect))
548 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Resize));
551 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
552 e->width = rect.right - rect.left;
553 e->height = rect.bottom - rect.top;
554 e->time = _ecore_win32_event_last_time;
555 /* printf (" * _ecore_win32_event_handle_resize %d %d\n", e->width, e->height); */
557 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_RESIZE, e, NULL, NULL);
561 _ecore_win32_event_handle_delete_request(Ecore_Win32_Callback_Data *msg)
563 Ecore_Win32_Event_Window_Delete_Request *e;
565 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Delete_Request));
568 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
569 e->time = _ecore_win32_event_last_time;
571 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
575 /***** Private functions definitions *****/
578 _ecore_win32_event_free_key_down(void *data,
581 Ecore_Win32_Event_Key_Down *e;
584 if (e->keyname) free(e->keyname);
585 if (e->keysymbol) free(e->keysymbol);
586 if (e->keycompose) free(e->keycompose);
591 _ecore_win32_event_free_key_up(void *data,
594 Ecore_Win32_Event_Key_Up *e;
597 if (e->keyname) free(e->keyname);
598 if (e->keysymbol) free(e->keysymbol);
599 if (e->keycompose) free(e->keycompose);
604 _ecore_win32_event_keystroke_get(int key,
791 /* other non keystroke characters */
794 *keyname = strdup(kn);
795 if (!*keyname) return 0;
796 *keysymbol = strdup(ks);
803 *keycompose = strdup(kc);
817 _ecore_win32_event_char_get(int key,
833 strncpy(kn, "Backspace", 32);
834 strncpy(ks, "Backspace", 32);
838 strncpy(kn, "Tab", 32);
839 strncpy(ks, "Tab", 32);
843 /* Line feed (Shift + Enter) */
844 strncpy(kn, "LineFeed", 32);
845 strncpy(ks, "LineFeed", 32);
849 strncpy(kn, "Return", 32);
850 strncpy(ks, "Return", 32);
854 strncpy(kn, "Escape", 32);
855 strncpy(ks, "Escape", 32);
859 /* displayable characters */
860 printf (" * key : %d\n", key);
868 *keyname = strdup(kn);
869 if (!*keyname) return 0;
870 *keysymbol = strdup(ks);
877 *keycompose = strdup(kc);