2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <Elementary.h>
20 #include "ivug-debug.h"
21 #include "ivug-mouse-event.h"
25 // Down Up duration under 300ms & Down pos, Up pos under 3 pixel
28 // Long pressed condition
29 // Down Up duration upper 1s & Down pos, Up pos under 5 pixel
35 MOUSE_DOWN_ERROR, // Error
39 #define INVALID_DEVICE_ID (-1)
40 #define NUM_MAX_BUTTON (1)
42 typedef struct _mouse_data_t{
50 bool bDown[NUM_MAX_BUTTON]; // For Mose down check before mouse move
51 bool bHold[NUM_MAX_BUTTON];
53 MouseEvent event[NUM_MAX_BUTTON];
54 MouseEvent down[NUM_MAX_BUTTON];
55 MouseEvent prve_up[NUM_MAX_BUTTON];
57 unsigned int prev_dist;
61 // For debugging purpose, later will be removed.
67 #define __UNUSED__ __attribute__((unused))
70 static void _on_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
74 MSG_MOUSE_ERROR("Debug me!!!!");
78 mouse_data_t *pData = (mouse_data_t *)data;
79 MouseEvent *ev = event_info;
81 if ( ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
83 MSG_MOUSE_HIGH("[%s] %s On Hold. Dev=%d", pData->alias, __func__, ev->device);
86 int pressed = ev->device;
88 if(pressed >= NUM_MAX_BUTTON)
90 MSG_MOUSE_FATAL("Invalid Pressed(%d)", pressed);
94 if ( pData->m_state == MOUSE_DOWN_UNKNWON )
96 MSG_MOUSE_ERROR("[%s] Something wrong", pData->alias);
99 if
\r( pData->bDown[pressed] == true )
101 MSG_MOUSE_WARN("Mouse down is detected. but already pressed button. ignore");
106 pData->bDown[pressed] = true; // TODO : probably, can make memory overwritten issues.
108 if ( pData->m_state == MOUSE_DOWN_1 )
110 MSG_MOUSE_HIGH("[%s] Callback Mouse Down : Dev=%d (%d,%d)", pData->alias, ev->device, ev->x, ev->y);
112 if ( pData->cb.onMouseDown )
114 (pData->cb.onMouseDown)(pData->obj, ev, pData->pClientData);
117 MSG_MOUSE_MED("Func:%s Device=%d XY(%d,%d)", "_on_mouse_down", pressed, ev->x , ev->y );
121 MSG_MOUSE_WARN("[%s] Ignore third finger! State=%d Dev=%d bPressed(%d,%d,%d)", pData->alias, pData->m_state, ev->device,
129 pData->event[pressed] = *ev;
130 pData->down[pressed] = *ev;
136 static void _on_mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
141 MSG_MOUSE_ERROR("Debug me!!!!");
145 mouse_data_t *pData = (mouse_data_t *)data;
146 MouseEvent *ev = event_info;
148 int pressed = ev->device;
150 if(pressed >= NUM_MAX_BUTTON)
152 MSG_MOUSE_FATAL("Invalid Pressed(%d)", pressed);
156 if ( pData->m_state == MOUSE_DOWN_UNKNWON )
158 MSG_MOUSE_ERROR("[%s] Something wrong. Dev=%d", pData->alias, ev->device);
159 MSG_MOUSE_ERROR("[%s] Error! State=%d Dev=%d bPressed(%d,%d,%d)", pData->alias, pData->m_state, ev->device,
166 if ( pData->m_state == MOUSE_DOWN_NONE )
168 MSG_MOUSE_WARN("[%s] Mouse up is detected. but state is NONE.", pData->alias);
169 pData->bDown[0] = pData->bDown[1] = pData->bDown[2] = 0;
175 if
\r( pData->bDown[pressed] == false )
177 MSG_MOUSE_ERROR("[%s] Something wrong", pData->alias);
178 MSG_MOUSE_ERROR("[%s] Error! State=%d Dev=%d bPressed(%d,%d,%d)", pData->alias, pData->m_state, ev->device,
184 if ( ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
186 MSG_MOUSE_HIGH("[%s] %s On Hold. Dev=%d", pData->alias, __func__, ev->device);
187 pData->bHold[pressed] = true;
190 pData->bDown[pressed] = false;
192 if ( pData->m_state == MOUSE_DOWN_NONE )
194 MSG_MOUSE_HIGH("[%s] Callback Mouse Up : Dev=%d (%d,%d)", pData->alias, ev->device, ev->x, ev->y);
196 if ( ev->button_flags & EVAS_BUTTON_DOUBLE_CLICK)
198 if ( pData->cb.onMouseDlbClick )
200 (pData->cb.onMouseDlbClick)(pData->obj, ev, pData->pClientData);
202 MSG_MOUSE_HIGH("[%s] %s Double click detected. Dev=%d (%d,%d)", pData->alias, __func__, ev->device, ev->x, ev->y);
204 if ( pData->cb.onMouseUp )
206 (pData->cb.onMouseUp)(pData->obj, ev, pData->pClientData);
209 pData->prve_up[pressed] = *ev;
211 MSG_MOUSE_MED("Func:%s State=%d Device=%d XY(%d,%d)", "_on_mouse_up", pData->m_state, pressed, ev->x , ev->y);
218 static void _on_mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
222 MSG_MOUSE_ERROR("Debug me!!!!");
226 mouse_data_t *pData = (mouse_data_t *)data;
227 MouseEvent *ev = event_info;
229 int pressed = ev->device;
231 if ( ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
233 MSG_MOUSE_HIGH("[%s] %s On Hold. Dev=%d", pData->alias, __func__, ev->device);
236 if(pressed >= NUM_MAX_BUTTON)
238 MSG_MOUSE_FATAL("Invalid Pressed(%d)", pressed);
242 if ( pData->bDown[pressed] == false)
244 // Move event prior down should be ignored
245 MSG_MOUSE_MED("Ignore move event before click");
249 switch ( pData->m_state )
253 MSG_MOUSE_MED("Func:%s. Device=%d Old(%d,%d) Cur(%d,%d)", __FUNCTION__, pressed,
254 pData->event[pressed].x, pData->event[pressed].y,
257 if ( pData->cb.onMouseMove )
259 MSG_MOUSE_MED("[%s] Callback Mouse Move : (%d,%d)", pData->alias, ev->x, ev->y);
260 (pData->cb.onMouseMove)(pData->obj, &pData->event[pressed], ev, pData->pClientData);
263 pData->event[pressed] = *ev;
268 MSG_MOUSE_ERROR("[%s] Something wrong. state=%d", pData->alias, pData->m_state);
278 static void _proxy_on_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
280 Evas_Event_Mouse_Down *ev = event_info;
285 event.timestamp = ev->timestamp;
286 event.x = ev->canvas.x;
287 event.y = ev->canvas.y;
288 event.button_flags = ev->flags;
289 event.event_flags = ev->event_flags;
291 MSG_MOUSE_MED("%s Dev=%d Button=%d Flags=%d Event=%d", __func__, (int)ev->dev, ev->button, ev->flags, ev->event_flags);
293 _on_mouse_down(data, NULL, obj, (void *)&event);
296 static void _proxy_on_mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
298 Evas_Event_Mouse_Up *ev = event_info;
303 event.timestamp = ev->timestamp;
304 event.x = ev->canvas.x;
305 event.y = ev->canvas.y;
306 event.button_flags = ev->flags;
307 event.event_flags = ev->event_flags;
310 MSG_MOUSE_MED("%s Dev=%d Button=%d Flags=%d Event=%d", __func__, (int)ev->dev, ev->button, ev->flags, ev->event_flags);
313 _on_mouse_up(data, NULL, obj, (void *)&event);
316 static void _proxy_on_mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
318 Evas_Event_Mouse_Move *ev = event_info;
323 event.timestamp = ev->timestamp;
324 event.x = ev->cur.canvas.x;
325 event.y = ev->cur.canvas.y;
326 event.button_flags = 0;
327 event.event_flags = ev->event_flags;
329 MSG_MOUSE_MED("%s Dev=%d Button=%d Event=%d Prev(%d,%d) Cur(%d,%d)", __func__, (int)ev->dev, ev->buttons, ev->event_flags,
330 ev->prev.canvas.x, ev->prev.canvas.y, ev->cur.canvas.x, ev->cur.canvas.y);
332 _on_mouse_move(data, NULL, obj, (void *)&event);
338 ivug_mouse_event_add(Evas_Object *obj, mouse_callback_t *pCallback, void *client_data, const char *alias)
340 mouse_data_t *pData = NULL;
341 //TODO : Should check parameters
343 pData = calloc(1, sizeof(mouse_data_t));
346 pData->pClientData = client_data;
347 pData->m_state = MOUSE_DOWN_NONE;
348 strncpy(pData->alias, alias, sizeof(pData->alias));
350 memcpy(&pData->cb, pCallback, sizeof(mouse_callback_t));
352 evas_object_event_callback_add(pData->obj, EVAS_CALLBACK_MOUSE_DOWN, _proxy_on_mouse_down, pData);
353 evas_object_event_callback_add(pData->obj, EVAS_CALLBACK_MOUSE_UP, _proxy_on_mouse_up, pData);
354 evas_object_event_callback_add(pData->obj, EVAS_CALLBACK_MOUSE_MOVE, _proxy_on_mouse_move, pData);
356 MSG_MOUSE_HIGH("Mouse Event Handler Add : Alias(%s) 0x%08x for Object(0x%08x)", alias, pData, obj);
358 return (Ivug_Event_Handle *)pData;
362 void ivug_mouse_event_del(Ivug_Event_Handle handle)
364 mouse_data_t *pData = handle;
366 evas_object_event_callback_del(pData->obj, EVAS_CALLBACK_MOUSE_DOWN, _proxy_on_mouse_down);
367 evas_object_event_callback_del(pData->obj, EVAS_CALLBACK_MOUSE_UP, _proxy_on_mouse_up);
368 evas_object_event_callback_del(pData->obj, EVAS_CALLBACK_MOUSE_MOVE, _proxy_on_mouse_move);
370 MSG_MOUSE_HIGH("Mouse Event Handler Remove : 0x%08x", pData);