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.
17 #include <Elementary.h>
22 #include <appcore-efl.h>
25 #include "lockd-debug.h"
26 #include "lockd-window-mgr.h"
28 #define PACKAGE "starter"
31 Ecore_X_Window input_x_window;
33 Evas_Object *main_win;
34 Evas_Object *main_layout;
36 Ecore_X_Window lock_x_window;
38 Ecore_Event_Handler *h_keydown;
39 Ecore_Event_Handler *h_wincreate;
40 Ecore_Event_Handler *h_winshow;
44 static Eina_Bool _lockd_window_key_down_cb(void *data, int type, void *event)
46 LOCKD_DBG("Key Down CB.");
48 return ECORE_CALLBACK_PASS_ON;
52 _lockd_window_check_validate_rect(Ecore_X_Display * dpy, Ecore_X_Window window)
62 unsigned int width = 0;
63 unsigned int height = 0;
64 unsigned int border = 0;
65 unsigned int depth = 0;
67 Eina_Bool ret = FALSE;
69 root = ecore_x_window_root_first_get();
72 (dpy, window, &root, &rel_x, &rel_y, &width, &height, &border,
74 if (XTranslateCoordinates
75 (dpy, window, root, 0, 0, &abs_x, &abs_y, &child)) {
76 if ((abs_x - border) >= 480 || (abs_y - border) >= 800
77 || (width + abs_x) <= 0 || (height + abs_y) <= 0) {
88 static Window get_user_created_window(Window win)
91 int ret, size_ret = 0;
92 unsigned long num_ret = 0, bytes = 0;
93 unsigned char *prop_ret = NULL;
95 Atom prop_user_created_win;
97 prop_user_created_win =
98 XInternAtom(ecore_x_display_get(), "_E_USER_CREATED_WINDOW", False);
101 XGetWindowProperty(ecore_x_display_get(), win,
102 prop_user_created_win, 0L, 1L, False, 0,
103 &type_ret, &size_ret, &num_ret, &bytes,
106 if (ret != Success) {
108 XFree((void *)prop_ret);
110 } else if (!prop_ret) {
114 memcpy(&xid, prop_ret, sizeof(unsigned int));
115 XFree((void *)prop_ret);
122 lockd_window_set_window_property(lockw_data * data, int lock_app_pid,
125 Ecore_X_Event_Window_Create *e = event;
126 Ecore_X_Window user_window = 0;
127 lockw_data *lockw = (lockw_data *) data;
133 LOCKD_DBG("%s, %d", __func__, __LINE__);
135 user_window = get_user_created_window((Window) (e->win));
137 ecore_x_netwm_pid_get(user_window, &pid);
139 LOCKD_DBG("Check PID(%d) window. (lock_app_pid : %d)\n", pid,
142 if (lock_app_pid == pid) {
143 if (_lockd_window_check_validate_rect
144 (ecore_x_display_get(), user_window) == TRUE) {
145 lockw->lock_x_window = user_window;
147 ("This is lock application. Set window property. win id : %x",
150 ecore_x_icccm_name_class_set(user_window, "LOCK_SCREEN",
153 ecore_x_netwm_window_type_set(user_window,
154 ECORE_X_WINDOW_TYPE_NOTIFICATION);
156 utilx_set_system_notification_level(ecore_x_display_get
158 UTILX_NOTIFICATION_LEVEL_NORMAL);
160 utilx_set_window_opaque_state(ecore_x_display_get(),
162 UTILX_OPAQUE_STATE_ON);
168 lockd_window_set_window_effect(lockw_data * data, int lock_app_pid, void *event)
170 Ecore_X_Event_Window_Create *e = event;
171 Ecore_X_Window user_window = 0;
174 user_window = get_user_created_window((Window) (e->win));
175 ecore_x_netwm_pid_get(user_window, &pid);
177 LOCKD_DBG("%s, %d", __func__, __LINE__);
179 LOCKD_DBG("PID(%d) window created. (lock_app_pid : %d)\n", pid,
182 if (lock_app_pid == pid) {
183 if (_lockd_window_check_validate_rect
184 (ecore_x_display_get(), user_window) == TRUE) {
186 ("This is lock application. Disable window effect. win id : %x\n",
189 utilx_set_window_effect_state(ecore_x_display_get(),
196 lockd_window_mgr_ready_lock(void *data, lockw_data * lockw,
197 Eina_Bool(*create_cb) (void *, int, void *),
198 Eina_Bool(*show_cb) (void *, int, void *))
203 LOCKD_ERR("lockw is NULL.");
208 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CREATE, create_cb,
211 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, show_cb, data);
213 xwin = lockw->input_x_window;
214 utilx_grab_key(ecore_x_display_get(), xwin, KEY_SELECT, EXCLUSIVE_GRAB);
217 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
218 _lockd_window_key_down_cb, NULL);
221 void lockd_window_mgr_finish_lock(lockw_data * lockw)
226 LOCKD_ERR("lockw is NULL.");
229 if (lockw->h_wincreate != NULL) {
230 ecore_event_handler_del(lockw->h_wincreate);
231 lockw->h_wincreate = NULL;
233 if (lockw->h_winshow != NULL) {
234 ecore_event_handler_del(lockw->h_winshow);
235 lockw->h_winshow = NULL;
238 xwin = lockw->input_x_window;
239 utilx_ungrab_key(ecore_x_display_get(), xwin, KEY_SELECT);
241 if (lockw->h_keydown != NULL) {
242 ecore_event_handler_del(lockw->h_keydown);
243 lockw->h_keydown = NULL;
247 lockw_data *lockd_window_init(void)
249 lockw_data *lockw = NULL;
250 Ecore_X_Window input_x_window;
251 Ecore_X_Window root_window;
254 lockw = (lockw_data *) malloc(sizeof(lockw_data));
255 memset(lockw, 0x0, sizeof(lockw_data));
259 input_x_window = ecore_x_window_input_new(0, 0, 0, 1, 1);
260 ecore_x_icccm_title_set(input_x_window, "lock-daemon-input-window");
261 ecore_x_netwm_name_set(input_x_window, "lock-daemon-input-window");
262 ecore_x_netwm_pid_set(input_x_window, pid);
263 LOCKD_DBG("Created input window : %p", input_x_window);
264 lockw->input_x_window = input_x_window;
266 root_window = ecore_x_window_root_first_get();
267 ecore_x_window_client_sniff(root_window);