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.
19 #include <Elementary.h>
22 #include <ui-gadget.h>
25 #include <appcore-efl.h>
28 #include "lockd-debug.h"
29 #include "lockd-window-mgr.h"
31 #define PACKAGE "starter"
32 #define SOS_KEY_COUNT 3
33 #define SOS_KEY_INTERVAL 0.5
36 Evas_Object *main_win;
37 Evas_Object *main_layout;
39 Ecore_X_Window lock_x_window;
41 Ecore_Event_Handler *h_keydown;
42 Ecore_Event_Handler *h_wincreate;
43 Ecore_Event_Handler *h_winshow;
45 Ecore_Timer *pTimerId;
49 int phone_lock_app_pid;
52 static Eina_Bool _lockd_window_key_down_cb(void *data, int type, void *event)
54 Ecore_Event_Key *ev = event;
56 LOCKD_DBG("Key Down CB : %s", ev->keyname);
58 return ECORE_CALLBACK_PASS_ON;
62 _lockd_window_check_validate_rect(Ecore_X_Display * dpy, Ecore_X_Window window)
72 unsigned int width = 0;
73 unsigned int height = 0;
74 unsigned int border = 0;
75 unsigned int depth = 0;
77 Eina_Bool ret = FALSE;
79 root = ecore_x_window_root_first_get();
82 (dpy, window, &root, &rel_x, &rel_y, &width, &height, &border,
84 if (XTranslateCoordinates
85 (dpy, window, root, 0, 0, &abs_x, &abs_y, &child)) {
86 if ((abs_x - border) >= 480 || (abs_y - border) >= 800
87 || (width + abs_x) <= 0 || (height + abs_y) <= 0) {
98 static Window get_user_created_window(Window win)
101 int ret, size_ret = 0;
102 unsigned long num_ret = 0, bytes = 0;
103 unsigned char *prop_ret = NULL;
105 Atom prop_user_created_win;
107 prop_user_created_win =
108 XInternAtom(ecore_x_display_get(), "_E_USER_CREATED_WINDOW", False);
111 XGetWindowProperty(ecore_x_display_get(), win,
112 prop_user_created_win, 0L, 1L, False, 0,
113 &type_ret, &size_ret, &num_ret, &bytes,
116 if (ret != Success) {
118 XFree((void *)prop_ret);
120 } else if (!prop_ret) {
124 memcpy(&xid, prop_ret, sizeof(unsigned int));
125 XFree((void *)prop_ret);
132 lockd_window_set_window_property(lockw_data * data, int lock_app_pid,
135 Ecore_X_Event_Window_Create *e = event;
136 Ecore_X_Window user_window = 0;
137 lockw_data *lockw = (lockw_data *) data;
143 LOCKD_DBG("%s, %d", __func__, __LINE__);
145 user_window = get_user_created_window((Window) (e->win));
147 int ret = ecore_x_netwm_pid_get(user_window, &pid);
152 LOCKD_DBG("Check PID(%d) window. (lock_app_pid : %d)\n", pid,
155 if (lock_app_pid == pid) {
156 if (_lockd_window_check_validate_rect
157 (ecore_x_display_get(), user_window) == TRUE) {
158 lockw->lock_x_window = user_window;
160 ("This is lock application. Set window property. win id : %x",
163 ecore_x_icccm_name_class_set(user_window, "LOCK_SCREEN",
165 ecore_x_netwm_window_type_set(user_window,
166 ECORE_X_WINDOW_TYPE_NOTIFICATION);
167 utilx_set_system_notification_level(ecore_x_display_get
169 UTILX_NOTIFICATION_LEVEL_NORMAL);
170 utilx_set_window_opaque_state(ecore_x_display_get(),
172 UTILX_OPAQUE_STATE_ON);
180 lockd_window_set_window_effect(lockw_data * data, int lock_app_pid, void *event)
182 Ecore_X_Event_Window_Create *e = event;
183 Ecore_X_Window user_window = 0;
186 user_window = get_user_created_window((Window) (e->win));
187 int ret = ecore_x_netwm_pid_get(user_window, &pid);
192 LOCKD_DBG("%s, %d", __func__, __LINE__);
194 LOCKD_DBG("PID(%d) window created. (lock_app_pid : %d)\n", pid,
197 if (lock_app_pid == pid) {
198 if (_lockd_window_check_validate_rect
199 (ecore_x_display_get(), user_window) == TRUE) {
201 ("This is lock application. Disable window effect. win id : %x\n",
204 utilx_set_window_effect_state(ecore_x_display_get(),
212 void lockd_window_set_phonelock_pid(lockw_data * data, int phone_lock_pid)
214 lockw_data *lockw = (lockw_data *) data;
219 LOCKD_DBG("%s, %d", __func__, __LINE__);
220 lockw->phone_lock_app_pid = phone_lock_pid;
221 LOCKD_DBG("%s, %d, lockw->phone_lock_app_pid = %d", __func__, __LINE__,
222 lockw->phone_lock_app_pid);
226 lockd_window_mgr_ready_lock(void *data, lockw_data * lockw,
227 Eina_Bool(*create_cb) (void *, int, void *),
228 Eina_Bool(*show_cb) (void *, int, void *))
231 LOCKD_ERR("lockw is NULL.");
235 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CREATE, create_cb,
238 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, show_cb, data);
240 lockw->volume_key_cnt = 0;
243 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
244 _lockd_window_key_down_cb, lockw);
247 void lockd_window_mgr_finish_lock(lockw_data * lockw)
252 LOCKD_ERR("lockw is NULL.");
255 if (lockw->h_wincreate != NULL) {
256 ecore_event_handler_del(lockw->h_wincreate);
257 lockw->h_wincreate = NULL;
259 if (lockw->h_winshow != NULL) {
260 ecore_event_handler_del(lockw->h_winshow);
261 lockw->h_winshow = NULL;
264 ecore_x_pointer_ungrab();
266 if (lockw->h_keydown != NULL) {
267 ecore_event_handler_del(lockw->h_keydown);
268 lockw->h_keydown = NULL;
272 lockw_data *lockd_window_init(void)
274 lockw_data *lockw = NULL;
277 lockw = (lockw_data *) malloc(sizeof(lockw_data));
278 memset(lockw, 0x0, sizeof(lockw_data));