2 * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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>
20 #include <appcore-efl.h>
26 #include <ui-gadget.h>
29 #include "window_mgr.h"
31 #include "lock_pwd_util.h"
33 #define STR_ATOM_PANEL_SCROLLABLE_STATE "_E_MOVE_PANEL_SCROLLABLE_STATE"
39 Eina_Bool is_registered;
40 Ecore_X_Window lock_x_window;
42 Ecore_Event_Handler *h_wincreate;
43 Ecore_Event_Handler *h_winshow;
44 Ecore_Event_Handler *h_winhide;
49 static int _is_on_screen(Ecore_X_Display * dpy, Ecore_X_Window window)
60 unsigned int width = 0;
61 unsigned int height = 0;
62 unsigned int border = 0;
63 unsigned int depth = 0;
64 unsigned int root_w = 0;
65 unsigned int root_h = 0;
67 Eina_Bool ret = FALSE;
69 root = ecore_x_window_root_first_get();
70 XGetGeometry(dpy, root, &win, &rel_x, &rel_y, &root_w, &root_h, &border, &depth);
71 _D("root rel_x[%d] rel_y[%d] border[%d] width[%d] height[%d]", rel_x, rel_y, border, root_w, root_h);
73 if (XGetGeometry(dpy, window, &win, &rel_x, &rel_y, &width, &height, &border, &depth)) {
74 if (XTranslateCoordinates(dpy, window, root, 0, 0, &abs_x, &abs_y, &child)) {
75 _D("abs_x[%d] abs_y[%d] border[%d] width[%d] height[%d]", abs_x, abs_y, border, width, height);
76 if ((abs_x - border) >= root_w
77 || (abs_y - border) >= root_h
78 || (width + abs_x) <= 0 || (height + abs_y) <= 0)
82 ret = (width == root_w) && (height == root_h);
92 static Window _get_user_created_window(Window win)
95 int ret, size_ret = 0;
96 unsigned long num_ret = 0, bytes = 0;
97 unsigned char *prop_ret = NULL;
99 Atom prop_user_created_win;
101 prop_user_created_win = XInternAtom(ecore_x_display_get(), "_E_USER_CREATED_WINDOW", False);
103 ret = XGetWindowProperty(ecore_x_display_get()
104 , win, prop_user_created_win
107 , &type_ret, &size_ret
110 if (ret != Success) {
112 XFree((void *) prop_ret);
114 } else if (!prop_ret) {
118 memcpy(&xid, prop_ret, sizeof(unsigned int));
119 XFree((void *)prop_ret);
127 int window_mgr_get_focus_window_pid(void)
129 Ecore_X_Window x_win_focused = 0;
133 _D("%s, %d", __func__, __LINE__);
135 x_win_focused = ecore_x_window_focus_get();
136 ret = ecore_x_netwm_pid_get(x_win_focused, &pid);
138 _E("Can't get pid for focus x window (%x)\n", x_win_focused);
141 _D("PID(%d) for focus x window (%x)\n", pid, x_win_focused);
148 static void _pwd_transient_set(Ecore_X_Window win, Ecore_X_Window for_win)
150 _W("%p is transient for %p", win, for_win);
152 ecore_x_icccm_transient_for_set(win, for_win);
157 static void _pwd_transient_unset(Ecore_X_Window xwin)
161 _W("%p is not transient", xwin);
162 ecore_x_icccm_transient_for_unset(xwin);
167 Eina_Bool window_mgr_pwd_transient_set(void *data)
169 Evas_Object *pwd_win = NULL;
170 Ecore_X_Window pwd_x_win;
171 lockw_data *lockw = (lockw_data *) data;
172 retv_if(!lockw, EINA_FALSE);
174 pwd_win = lock_pwd_util_win_get();
175 retv_if(!pwd_win, EINA_FALSE);
177 pwd_x_win = elm_win_xwindow_get(pwd_win);
178 retv_if(!pwd_x_win, EINA_FALSE);
180 retv_if(!lockw->lock_x_window, EINA_FALSE);
182 /* unset transient */
183 _pwd_transient_unset(lockw->lock_x_window);
186 _pwd_transient_set(lockw->lock_x_window, pwd_x_win);
193 Eina_Bool window_mgr_set_prop(lockw_data * data, int lock_app_pid, void *event)
195 Ecore_X_Event_Window_Create *e = event;
196 Ecore_X_Window user_window = 0;
197 lockw_data *lockw = (lockw_data *) data;
201 retv_if(!lockw, EINA_FALSE);
203 user_window = _get_user_created_window((Window) (e->win));
205 ret = ecore_x_netwm_pid_get(user_window, &pid);
206 retv_if(ret != 1, EINA_FALSE);
208 _D("Check PID(%d) window. (lock_app_pid : %d)", pid, lock_app_pid);
210 if (lock_app_pid == pid) {
211 if (_is_on_screen(ecore_x_display_get(), user_window) == TRUE) {
212 lockw->lock_x_window = user_window;
213 /* window effect : fade in /out */
214 ecore_x_icccm_name_class_set(user_window, "LOCK_SCREEN", "LOCK_SCREEN");
215 ecore_x_netwm_window_type_set(user_window, ECORE_X_WINDOW_TYPE_NOTIFICATION);
216 utilx_set_system_notification_level(ecore_x_display_get(), user_window, UTILX_NOTIFICATION_LEVEL_NORMAL);
217 utilx_set_window_opaque_state(ecore_x_display_get(), user_window, UTILX_OPAQUE_STATE_ON);
220 if (!window_mgr_pwd_transient_set(lockw)) {
221 _E("Failed to set transient");
232 Eina_Bool window_mgr_set_effect(lockw_data * data, int lock_app_pid, void *event)
234 Ecore_X_Event_Window_Create *e = event;
235 Ecore_X_Window user_window = 0;
239 user_window = _get_user_created_window((Window) (e->win));
240 ret = ecore_x_netwm_pid_get(user_window, &pid);
241 retv_if(ret != 1, EINA_FALSE);
243 if (lock_app_pid == pid) {
244 if (_is_on_screen(ecore_x_display_get(), user_window) == TRUE) {
245 Ecore_X_Atom ATOM_WINDOW_EFFECT_ENABLE = 0;
246 unsigned int effect_state = 0;
248 ATOM_WINDOW_EFFECT_ENABLE = ecore_x_atom_get("_NET_CM_WINDOW_EFFECT_ENABLE");
249 if (ATOM_WINDOW_EFFECT_ENABLE) {
250 ecore_x_window_prop_card32_set(user_window, ATOM_WINDOW_EFFECT_ENABLE, &effect_state, 1);
252 _E("ecore_x_atom_get() failed");
262 void window_mgr_set_scroll_prop(lockw_data *data, int lock_type)
264 lockw_data *lockw = (lockw_data *) data;
265 Ecore_X_Atom ATOM_PANEL_SCROLLABLE_STATE = 0;
266 unsigned int val[3] = { 0, };
270 ATOM_PANEL_SCROLLABLE_STATE = ecore_x_atom_get(STR_ATOM_PANEL_SCROLLABLE_STATE);
271 if (lock_type == SETTING_SCREEN_LOCK_TYPE_SIMPLE_PASSWORD ||
272 lock_type == SETTING_SCREEN_LOCK_TYPE_PASSWORD) {
273 val[0] = 0; // always enable F
274 val[1] = 0; // quickpanel enable F
275 val[2] = 0; // apptray enable F
277 val[0] = 0; // always enable F
278 val[1] = 1; // quickpanel enable T
279 val[2] = 0; // apptray enable F
281 ecore_x_window_prop_card32_set(lockw->lock_x_window, ATOM_PANEL_SCROLLABLE_STATE, val, 3);
286 void window_mgr_register_event(void *data, lockw_data * lockw,
287 Eina_Bool (*create_cb) (void *, int, void *),
288 Eina_Bool (*show_cb) (void *, int, void *))
290 Ecore_X_Window root_window;
294 if (lockw->is_registered) {
295 _E("Already register event cb");
299 /* For getting window x event */
300 root_window = ecore_x_window_root_first_get();
301 ecore_x_window_client_sniff(root_window);
303 lockw->h_wincreate = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CREATE, create_cb, data);
304 lockw->h_winshow = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, show_cb, data);
306 lockw->is_registered = EINA_TRUE;
311 static inline void _unregister_event(lockw_data *lockw)
313 Ecore_X_Window root_window;
315 /* unset transient */
316 _pwd_transient_unset(lockw->lock_x_window);
318 /* delete getting window x event */
319 root_window = ecore_x_window_root_first_get();
320 ecore_x_window_client_sniff(root_window);
322 /* delete window create event handler */
323 if (lockw->h_wincreate) {
324 ecore_event_handler_del(lockw->h_wincreate);
325 lockw->h_wincreate = NULL;
327 if (lockw->h_winshow) {
328 ecore_event_handler_del(lockw->h_winshow);
329 lockw->h_winshow = NULL;
331 if (lockw->h_winhide) {
332 ecore_event_handler_del(lockw->h_winhide);
333 lockw->h_winhide = NULL;
336 ecore_x_pointer_ungrab();
338 lockw->is_registered = EINA_FALSE;
343 void window_mgr_unregister_event(lockw_data *lockw)
347 if (!lockw->is_registered) {
348 _E("event cb is not registered");
352 _unregister_event(lockw);
357 lockw_data *window_mgr_init(void)
359 lockw_data *lockw = NULL;
361 lockw = calloc(1, sizeof(*lockw));
368 void window_mgr_fini(lockw_data *lockw)
372 if (lockw->is_registered) {
373 _unregister_event(lockw);
380 Evas_Object *window_mgr_pwd_lock_win_create(void)
382 Evas_Object *win = elm_win_add(NULL, "LOCKSCREEN_PWD", ELM_WIN_NOTIFICATION);
385 elm_win_alpha_set(win, EINA_TRUE);
386 elm_win_borderless_set(win, EINA_TRUE);
387 elm_win_autodel_set(win, EINA_TRUE);
388 elm_win_role_set(win, "no-dim");
391 Ecore_X_Window xwin = elm_win_xwindow_get(win);
393 ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION);
394 utilx_set_system_notification_level(ecore_x_display_get(), xwin, UTILX_NOTIFICATION_LEVEL_NORMAL);
395 utilx_set_window_opaque_state(ecore_x_display_get(), xwin, UTILX_OPAQUE_STATE_ON);
397 Ecore_X_Atom ATOM_PANEL_SCROLLABLE_STATE = ecore_x_atom_get(STR_ATOM_PANEL_SCROLLABLE_STATE);
398 unsigned int val[3] = { 0, };
400 ecore_x_window_prop_card32_set(xwin, ATOM_PANEL_SCROLLABLE_STATE, val, 3);