2 * Copyright (c) 2009-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.
18 #include <Elementary.h>
19 #if defined(WINSYS_X11)
25 #define NOTI_HEIGHT ELM_SCALE_SIZE(260)
26 #define NOTI_START_Y ELM_SCALE_SIZE(36)
30 #define __UNUSED__ __attribute__((unused))
32 /* Using this macro to emphasize that some portion like stacking and
33 rotation handling are implemented for X based platform
38 #include "dbus_utility.h"
40 struct Internal_Data {
42 Ecore_Event_Handler *rotation_event_handler;
48 enum Noti_Orient orient;
51 #define E_DATA_KEY "E_DATA_KEY"
52 #define E_DATA_BASE_RECT "E_DATA_BASE_RECT"
54 static void _show(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
56 struct Internal_Data *wd = evas_object_data_get(obj, E_DATA_KEY);
63 evas_object_show(wd->content);
68 static void _content_changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
71 struct Internal_Data *wd = evas_object_data_get(data, E_DATA_KEY);
77 evas_object_size_hint_min_get(obj, NULL, &h);
79 evas_object_size_hint_min_set(obj, wd->w, wd->h);
80 evas_object_size_hint_min_set(data, wd->w, wd->h);
81 evas_object_resize(data, wd->w, wd->h);
85 static void _resized(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
87 evas_object_show(obj);
90 static void _del(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
92 struct Internal_Data *wd = evas_object_data_get(obj, E_DATA_KEY);
95 if (wd->rotation_event_handler) {
96 ecore_event_handler_del(wd->rotation_event_handler);
101 evas_object_data_set(data, E_DATA_KEY, NULL);
104 static void _win_rotated(Evas_Object *obj)
107 struct Internal_Data *wd = evas_object_data_get(obj, E_DATA_KEY);
113 angle = elm_win_rotation_get(obj);
127 evas_object_size_hint_min_set(obj, wd->scr_w, wd->h);
128 evas_object_resize(obj, wd->scr_w, wd->h);
129 evas_object_move(obj, 0, NOTI_START_Y);
132 evas_object_size_hint_min_set(obj, wd->scr_h, wd->h);
133 evas_object_resize(obj, wd->scr_h, wd->h);
134 evas_object_move(obj, NOTI_START_Y, 0);
137 evas_object_size_hint_min_set(obj, wd->scr_h, wd->h);
138 evas_object_resize(obj, wd->scr_h, wd->h);
139 evas_object_move(obj, wd->scr_w - wd->h - NOTI_START_Y, 0);
142 ERR("cannot reach here");
146 static void _ui_rotation_wm_cb(void *data, Evas_Object *obj, void *event)
149 angle = elm_win_rotation_get((Evas_Object *)obj);
151 DBG("ACTIVENOTI ROTATE:%d", angle);
156 static void _resize_cb (void *data, Evas *e, Evas_Object *eo, void *event_info)
159 evas_object_geometry_get(eo, &x, &y, &w, &h);
160 DBG("%s: %d:%d:%d:%d\n", data, x, y, w, h);
163 HAPI Evas_Object *quickpanel_noti_win_add(Evas_Object *parent)
166 struct Internal_Data *wd;
167 Evas_Coord w = 0, h = 0;
169 Ecore_Evas *ee = NULL;
171 win = elm_win_add(parent, "noti_win", ELM_WIN_NOTIFICATION);
176 e = evas_object_evas_get(win);
178 evas_object_del(win);
182 ee = ecore_evas_ecore_evas_get(e);
184 evas_object_del(win);
188 ecore_evas_name_class_set(ee, "APP_POPUP", "APP_POPUP");
190 elm_win_alpha_set(win, EINA_FALSE);
191 elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_HIDE);
192 elm_win_title_set(win, "noti_win");
193 elm_win_borderless_set(win, EINA_TRUE);
194 elm_win_autodel_set(win, EINA_TRUE);
195 evas_object_size_hint_weight_set(win, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
196 evas_object_size_hint_align_set(win, EVAS_HINT_FILL, EVAS_HINT_FILL);
198 efl_util_set_notification_window_level(win, EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT);
199 elm_win_prop_focus_skip_set(win, EINA_TRUE);
200 elm_win_aux_hint_add(win, "wm.policy.win.user.geometry", "1");
202 if (elm_win_wm_rotation_supported_get(win)) {
203 int rots[4] = { 0, 90, 180, 270 };
204 elm_win_wm_rotation_available_rotations_set(win, rots, 4);
206 evas_object_smart_callback_add(win, "wm,rotation,changed", _ui_rotation_wm_cb, NULL);
207 evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _resize_cb, "win");
209 wd = (struct Internal_Data *) calloc(1, sizeof(struct Internal_Data));
212 evas_object_del(win);
216 evas_object_data_set(win, E_DATA_KEY, wd);
218 wd->orient = NOTI_ORIENT_TOP;
219 evas_object_move(win, 0, NOTI_START_Y);
220 elm_win_screen_size_get(win, NULL, NULL, &w, &h);
227 evas_object_resize(win, w, wd->h);
228 evas_object_event_callback_add(win, EVAS_CALLBACK_SHOW, _show, NULL);
229 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _del, NULL);
230 evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _resized, NULL);
235 HAPI void quickpanel_noti_win_content_set(Evas_Object *obj, Evas_Object *content)
237 struct Internal_Data *wd;
243 wd = evas_object_data_get(obj, E_DATA_KEY);
248 if (wd->content && content != NULL) {
249 evas_object_del(wd->content);
253 wd->content = content;
259 evas_object_size_hint_weight_set(content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
260 evas_object_resize(obj, wd->w, wd->h);
261 elm_win_resize_object_add(obj, content);
262 evas_object_size_hint_min_set(content, wd->w, wd->h);
263 evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _content_changed_size_hints, obj);
266 HAPI void quickpanel_noti_win_resize(Evas_Object *obj, int btn_cnt)
268 struct Internal_Data *wd;
274 wd = evas_object_data_get(obj, E_DATA_KEY);
279 evas_object_resize(obj, wd->w, wd->h);
282 HAPI void quickpanel_noti_win_orient_set(Evas_Object *obj, enum Noti_Orient orient)
284 struct Internal_Data *wd = evas_object_data_get(obj, E_DATA_KEY);
290 if (orient >= NOTI_ORIENT_LAST) {
294 case NOTI_ORIENT_BOTTOM:
295 evas_object_move(obj, 0, wd->scr_h - wd->h);
296 wd->orient = NOTI_ORIENT_BOTTOM;
298 case NOTI_ORIENT_TOP:
300 evas_object_move(obj, 0, NOTI_START_Y);
301 wd->orient = NOTI_ORIENT_TOP;