Removed build deps on ecore-x and libslp-utilx
[profile/ivi/taskmanager.git] / src / _logic.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  * 
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
7  * 
8  *     http://www.tizenopensource.org/license
9  * 
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.
15  */
16
17
18
19
20 #include <appcore-common.h>
21 #include <aul.h>
22 #if HAVE_X
23 #include <Ecore_X.h>
24 #endif
25 #include <vconf.h>
26
27 #include "taskmanager.h"
28 #include "_util_log.h"
29 #include "_util_efl.h"
30 #include "_genlist.h"
31 #include "_eina.h"
32 #include "_progressbar.h"
33 #include "_info.h"
34
35 int _dead_cb(int pid, void *data)
36 {
37 _D("func\n");
38         /* redraw list */
39         struct appdata *ad = (struct appdata *)data;
40         retvm_if(ad == NULL, -1, "Invalid argument: appdata is NULL\n");
41
42         int ret = -1;
43
44         _fini_pthread();
45         if (ad->update_timer) {
46                 ecore_timer_del(ad->update_timer);
47                 ad->update_timer = NULL;
48         }
49
50         ret = _subt_einalist_item(ad, pid);
51         _D("mode(%d) count(%d) pid(%d) \n", ad->mode, ad->endcnt, pid);
52
53         if (ret != -1) {
54         switch (ad->mode) {
55         default:
56         case MODE_END_INUSE:
57         case MODE_DEL_HISTORY:
58         case MODE_DEL_ALL_HISTORY:
59         case MODE_KILL_INUSE:
60                 _D("aa\n");
61                 _del_popup_timer(ad);
62                 _del_progressbar(ad);
63                 refresh_app_info(ad);
64                 _restart_pthread(ad);
65                 break;
66
67         case MODE_END_ALL_INUSE:
68         case MODE_KILL_ALL_INUSE:
69                 _D("bb\n");
70                 if (ad->endcnt <= 1) {
71                         _D("count set 0\n");
72                         _del_popup_timer(ad);
73                         _del_progressbar(ad);
74                         refresh_app_info(ad);
75                         _restart_pthread(ad);
76
77                 } else {
78                         ad->endcnt--;
79                 }
80                 break;
81         }
82 }
83 }
84
85 static void _back_cb(void *data, Evas_Object *obj, void *event_info)
86 {
87         struct appdata *ad = (struct appdata *)data;
88         /*
89         _unset_notification_level(ad->win);
90         */
91         elm_exit();
92
93 }
94
95 static void _drag_start_cb(void *data, Evas_Object *obj, void *event_info)
96 {
97         _D("func\n");
98         struct appdata *ad = (struct appdata *)data;
99         if (ad->update_timer) {
100                 ecore_timer_del(ad->update_timer);
101                 ad->update_timer = NULL;
102         }
103 }
104
105 static void _drag_stop_cb(void *data, Evas_Object *obj, void *event_info)
106 {
107         _D("func\n");
108         struct appdata *ad = (struct appdata *)data;
109         if (ad->update_timer) {
110                 ecore_timer_del(ad->update_timer);
111                 ad->update_timer = NULL;
112         }
113         ad->update_timer = ecore_timer_add(2.0, _update_list, ad);
114 }
115
116
117 static void _anim_start_cb(void *data, Evas_Object *obj, void *event_info)
118 {
119         _D("func\n");
120         struct appdata *ad = (struct appdata *)data;
121         if (ad->update_timer) {
122                 ecore_timer_del(ad->update_timer);
123                 ad->update_timer = NULL;
124         }
125 }
126
127 static void _anim_stop_cb(void *data, Evas_Object *obj, void *event_info)
128 {
129         _D("func\n");
130         struct appdata *ad = (struct appdata *)data;
131         if (ad->update_timer) {
132                 ecore_timer_del(ad->update_timer);
133                 ad->update_timer = NULL;
134         }
135         ad->update_timer = ecore_timer_add(2.0, _update_list, ad);
136 }
137
138 static void _moved_cb(void *data, Evas_Object *obj, void *event_info)
139 {
140         _D("func\n");
141 }
142
143 int _app_create(struct appdata *ad)
144 {
145         Evas_Object *ly, *bg, *nv, *bt, *gl;
146
147         retvm_if(ad == NULL, -1, "Invalid argument: appdata is NULL\n");
148         ad->ending = EINA_FALSE;
149
150         ly = _add_layout_main(ad->win, EINA_TRUE, EINA_FALSE);
151         retvm_if(ly == NULL, -1, "Failed to add layout main\n");
152
153         bg = _add_bg(ad->win, "group_list");
154         retvm_if(bg == NULL, -1, "Failed to add bg\n");
155         elm_object_part_content_set(ly, "elm.swallow.bg", bg);
156
157         nv = _add_naviframe(ly);
158         retvm_if(nv == NULL, -1, "Failed to add naviframe\n");
159         ad->nv = nv;
160
161         ly = _add_layout(ad->nv, EDJ_NAME, GRP_TM);
162         retvm_if(ly == NULL, -1, "Failed to add layout\n");
163         ad->ly = ly;
164
165         /* Load default content (running task) */
166         gl = _add_genlist(ly);
167         retvm_if(gl == NULL, -1, "Failed to add genlist\n");
168         elm_genlist_block_count_set(gl, 20);
169         evas_object_data_set(gl, "appdata", ad);
170         elm_object_part_content_set(ly, "list", gl);
171         evas_object_smart_callback_add(gl, "scroll,drag,start", _drag_start_cb, ad);
172         evas_object_smart_callback_add(gl, "scroll,drag,stop", _drag_stop_cb, ad);
173         evas_object_smart_callback_add(gl, "scroll,anim,start", _anim_start_cb, ad);
174         evas_object_smart_callback_add(gl, "scroll,anim,stop", _anim_stop_cb, ad);
175         ad->gl = gl;
176
177         bt = elm_button_add(nv);
178         retvm_if(bt == NULL, -1, "Failed to add button\n");
179         elm_object_style_set(bt, "naviframe/end_btn/default");
180         evas_object_smart_callback_add(bt, "clicked", _back_cb, ad);
181
182         elm_naviframe_item_push(nv,
183                         _("IDS_TASKMGR_HEADER_TASK_SWITCHER"),
184                         bt, NULL, ly, NULL);
185
186         return 0;
187 }
188
189 static void _get_win_geometry(struct appdata *ad)
190 {
191         Evas_Object *eo;
192         Ecore_Evas *ee;
193  
194         ee = ecore_evas_ecore_evas_get(evas_object_evas_get(ad->win));
195         ecore_evas_screen_geometry_get(ee, 0, 0, &ad->root_w, &ad->root_h);
196 }
197
198 static void _vconf_noti_cb(keynode_t *node, void *data)
199 {
200         elm_exit();
201 }
202
203 static void _set_vconf_noti(void *data)
204 {
205         vconf_notify_key_changed(VCONFKEY_IDLE_LOCK_STATE,
206                         _vconf_noti_cb, NULL);
207 }
208
209 /* X specific */
210 #if HAVE_X
211 /* this func is to exit taskmanager after launching application */
212 static Eina_Bool __climsg_cb(void *data, int type, void *event)
213 {
214         static Atom a_deact;
215         pid_t pid_a, pid_d;
216
217         struct appdata *ad = (struct appdata *)data;
218         Ecore_X_Event_Client_Message *ev = event;
219
220         if(ev == NULL) {
221                 _E("Invalid argument: event is NULL\n");
222                 ecore_timer_add(0.3, _exit_cb, NULL);
223                 return ECORE_CALLBACK_CANCEL;
224         }
225
226         pid_a = ev->data.l[1];
227         pid_d = ev->data.l[3];
228 #if HAVE_X
229         a_deact = ecore_x_atom_get("_X_ILLUME_DEACTIVATE_WINDOW");
230 #endif
231
232         /* when pid_a == pid_d, this is useless data */
233         if (pid_a == pid_d) {
234                 return ECORE_CALLBACK_RENEW;
235         }
236
237         if (ev->message_type == a_deact) {
238                 _D("exit after 1.0 sec\n");
239                 ad->exit_timer = ecore_timer_add(0.3, _exit_cb, ad);
240                 return ECORE_CALLBACK_CANCEL;
241         } else {
242                 _D("messagre is act\n");
243
244         }
245
246         return ECORE_CALLBACK_CANCEL;
247 }
248 #endif
249
250 static Eina_Bool _ask_kill_process(void *data)
251 {
252         struct appdata *ad = data;
253
254         _del_progressbar(ad);
255
256         ad->mode *= 2;
257         /* why? check enum in taskmgr.h */
258
259         if (ad->popup_ask) {
260                 evas_object_del(ad->popup_ask);
261                 ad->popup_ask = NULL;
262         }
263         ad->popup_ask = _add_popup_ask(ad->win,
264                         "It might be an invalid process. Do you want to kill this proceess anyway?",
265                         ad);
266
267         return ECORE_CALLBACK_CANCEL;
268 }
269
270 void _ok_response_cb(void *data, Evas_Object *obj, void *event_info)
271 {
272         struct appdata *ad = (struct appdata *)data;
273
274         retm_if(data == NULL, "Invalid argument: appdata is NULL\n");
275         if (ad->popup_ask) {
276                 evas_object_del(ad->popup_ask);
277                 ad->popup_ask = NULL;
278         }
279
280         switch (ad->mode) {
281                 case MODE_END_INUSE:
282                         _D("end inuse\n");
283                         _del_popup_timer(ad);
284                         ad->popup_timer = ecore_timer_add(7.0, _ask_kill_process, ad);
285                         _show_progressbar(ad);
286                         response_end_inuse(ad);
287                         _restart_pthread(ad);
288                         break;
289
290                 case MODE_END_ALL_INUSE:
291                         _D("end all inuse\n");
292                         _del_popup_timer(ad);
293                         ad->popup_timer = ecore_timer_add(7.0, _ask_kill_process, ad);
294                         _show_progressbar(ad);
295                         response_end_all_inuse(ad);
296                         break;
297
298                 case MODE_DEL_HISTORY:
299                         _D("del inuse\n");
300                         _del_popup_timer(ad);
301                         ad->popup_timer = ecore_timer_add(5.0, _ask_kill_process, ad);
302                         response_del_history(ad);
303                         break;
304
305                 case MODE_DEL_ALL_HISTORY:
306                         _D("del all inuse\n");
307                         _del_popup_timer(ad);
308                         ad->popup_timer = ecore_timer_add(5.0, _ask_kill_process, ad);
309                         response_del_all_history(ad);
310                         break;
311
312                 case MODE_KILL_INUSE:
313                         _D("kill all inuse\n");
314                         response_kill_inuse(ad);
315                         break;
316
317                 case MODE_KILL_ALL_INUSE:
318                         _D("kill all inuse\n");
319                         response_kill_all_inuse(ad);
320                         break;
321
322                 default:
323                         printf("[Wanning] taskmanager: check mode [%d]\n",
324                                         ad->mode);
325                         break;
326         }
327 }
328
329 void _cancel_response_cb(void *data, Evas_Object *obj, void *event_info)
330 {
331         struct appdata *ad = (struct appdata *)data;
332
333         retm_if(data == NULL, "Invalid argument: appdata is NULL\n");
334         if (ad->popup_ask) {
335                 evas_object_del(ad->popup_ask);
336                 ad->popup_ask = NULL;
337         }
338 }
339
340 Eina_Bool _create_idler_cb(void *data)
341 {
342         Evas_Object *pu, *bt1, *bt2;
343         struct appdata *ad = (struct appdata *)data;
344         retvm_if(ad == NULL, ECORE_CALLBACK_CANCEL, "Invalid argument\n");
345
346         evas_object_show(ad->win);
347
348 #if HAVE_X
349         _key_grab(ad);
350 #endif
351
352         _init_pthread();
353         _get_win_geometry(ad);
354         _set_vconf_noti(ad);
355 #if HAVE_X
356         ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, __climsg_cb, ad);
357 #endif
358
359         return ECORE_CALLBACK_CANCEL;
360 }
361
362
363