From 9c06513ab136e55262cc9c5207abf60c76c4716d Mon Sep 17 00:00:00 2001 From: Jin Yoon Date: Thu, 4 Jul 2013 10:56:49 +0900 Subject: [PATCH] Merge with private --- CMakeLists.txt | 1 + data/edje/all_apps_portrait.edc | 2 +- data/edje/item_4x4.edc | 7 +- data/edje/layout_portrait.edc | 33 +++++ data/org.tizen.menu-screen.xml.in | 2 +- include/all_apps/layout.h | 4 + include/conf.h | 2 +- include/key.h | 29 ++++ include/popup.h | 9 +- packaging/org.tizen.menu-screen.spec | 2 +- src/all_apps/layout.c | 23 +++ src/item.c | 2 +- src/key.c | 206 +++++++++++++++++++++++++++ src/menu_screen.c | 3 + src/page_scroller.c | 14 -- src/popup.c | 98 ++++++++++--- 16 files changed, 386 insertions(+), 51 deletions(-) create mode 100644 include/key.h create mode 100644 src/key.c diff --git a/CMakeLists.txt b/CMakeLists.txt index d1c20aa..4c410f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,6 +67,7 @@ ADD_EXECUTABLE(${PROJECT_NAME} src/item.c src/item_badge.c src/item_event.c + src/key.c src/layout.c src/list.c src/mapbuf.c diff --git a/data/edje/all_apps_portrait.edc b/data/edje/all_apps_portrait.edc index bbbc287..b413286 100644 --- a/data/edje/all_apps_portrait.edc +++ b/data/edje/all_apps_portrait.edc @@ -80,7 +80,7 @@ collections { description { state: "default" 0.0; rel1 { relative: 0.0 134/1210; to, "bg"; } // 154 - 70 - rel2 { relative: 1.0 1194/1210; to, "bg"; } + rel2 { relative: 1.0 1164/1210; to, "bg"; } color: 34 34 34 255; visible: 0; } diff --git a/data/edje/item_4x4.edc b/data/edje/item_4x4.edc index 7d688d2..25e6750 100644 --- a/data/edje/item_4x4.edc +++ b/data/edje/item_4x4.edc @@ -62,8 +62,9 @@ collections { mouse_events: 1; description { state: "default" 0.0; - rel1 { relative: 0.5 54/ITEM_HEIGHT; } - rel2 { relative: 0.5 54/ITEM_HEIGHT; } + rel1 { relative: 0.5 60/ITEM_HEIGHT; to: "bg"; } + rel2 { relative: 0.5 60/ITEM_HEIGHT; to: "bg"; } + align: 0.5 0.5; min: 117 117; fixed: 1 1; } @@ -186,7 +187,7 @@ collections { description { state: "default" 0.0; - rel1 { relative: 0.0 1.0; to_x, "bg"; to_y, "icon_image"; } + rel1 { relative: 0.0 1.0; to_x, "bg"; to_y, "icon_image"; offset: 0 7; } rel2 { relative: 1.0 1.0; to, "bg"; } align: 0.5 0.0; color: 255 255 255 255; diff --git a/data/edje/layout_portrait.edc b/data/edje/layout_portrait.edc index 0202a07..50c40e2 100644 --- a/data/edje/layout_portrait.edc +++ b/data/edje/layout_portrait.edc @@ -45,9 +45,42 @@ collections { visible: 1; } } + part { + name: "content,blocker"; + type: RECT; + scale: 1; + mouse_events: 1; + repeat_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + color: 0 0 0 0; + visible: 0; + } + description { + state: "block" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } } programs { + program { + name: "block,content"; + signal: "block"; + source: "layout"; + action: STATE_SET "block" 0.0; + target: "content,blocker"; + } + program { + name: "unblock,content"; + signal: "unblock"; + source: "layout"; + action: STATE_SET "default" 0.0; + target: "content,blocker"; + } } } // group } // collections diff --git a/data/org.tizen.menu-screen.xml.in b/data/org.tizen.menu-screen.xml.in index 6646d3d..921afd4 100755 --- a/data/org.tizen.menu-screen.xml.in +++ b/data/org.tizen.menu-screen.xml.in @@ -1,5 +1,5 @@ - + Jin Yoon Youngjoo Park diff --git a/include/all_apps/layout.h b/include/all_apps/layout.h index 258e936..73cd023 100644 --- a/include/all_apps/layout.h +++ b/include/all_apps/layout.h @@ -23,6 +23,10 @@ #define PAGE_MAX_APP 16 +extern bool all_apps_layout_is_edited(Evas_Object *all_apps); +extern void all_apps_layout_edit(Evas_Object *all_apps); +extern void all_apps_layout_unedit(Evas_Object *all_apps); + extern Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate); extern void all_apps_layout_destroy(Evas_Object *all_apps); diff --git a/include/conf.h b/include/conf.h index 7a4da32..50d40f8 100644 --- a/include/conf.h +++ b/include/conf.h @@ -24,7 +24,7 @@ #define BASE_HEIGHT 1280.0f #define BASE_WIDTH 720.0f -#define PAGE_PORTRAIT_HEIGHT 1060.0f +#define PAGE_PORTRAIT_HEIGHT 1030.0f #define INDEX_HEIGHT 70 #define ITEM_WIDTH 180.0 diff --git a/include/key.h b/include/key.h new file mode 100644 index 0000000..def465f --- /dev/null +++ b/include/key.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MENU_SCREEN_INPUT_KEY_H__ +#define __MENU_SCREEN_INPUT_KEY_H__ + +#include "util.h" + +HAPI void key_register(void); +HAPI void key_unregister(void); +HAPI void key_grab_home(void); +HAPI void key_ungrab_home(void); + +#endif //__MENU_SCREEN_INPUT_KEY_H__ + +// End of a file diff --git a/include/popup.h b/include/popup.h index cff5fcd..b894376 100644 --- a/include/popup.h +++ b/include/popup.h @@ -19,12 +19,9 @@ #ifndef __MENU_SCREEN_POPUP_H__ #define __MENU_SCREEN_POPUP_H__ -extern void popup_append_list(Evas_Object *popup); -extern void popup_remove_list(Evas_Object *popup); -extern void popup_free_list(); - -extern Evas_Object *popup_create(Evas_Object *parent, const char *warning); -extern void popup_destroy(Evas_Object *popup); +extern Evas_Object *popup_exist(void); +extern void popup_destroy_all(void); +extern Evas_Object *popup_create_confirm(Evas_Object *parent, const char *warning); extern Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item); #endif //__MENU_SCREEN_POPUP_H__ diff --git a/packaging/org.tizen.menu-screen.spec b/packaging/org.tizen.menu-screen.spec index c838278..848f599 100644 --- a/packaging/org.tizen.menu-screen.spec +++ b/packaging/org.tizen.menu-screen.spec @@ -16,7 +16,7 @@ Name: org.tizen.menu-screen Summary: An utility library of the menu screen -Version: 1.1.11 +Version: 1.1.12 Release: 1.1 Group: TO_BE/FILLED_IN License: Flora Software License diff --git a/src/all_apps/layout.c b/src/all_apps/layout.c index 7411306..092fbb8 100644 --- a/src/all_apps/layout.c +++ b/src/all_apps/layout.c @@ -22,9 +22,11 @@ #include "conf.h" #include "index.h" #include "item_event.h" +#include "key.h" #include "layout.h" #include "list.h" #include "page_scroller.h" +#include "popup.h" #include "util.h" #include "all_apps/layout.h" #include "all_apps/list.h" @@ -42,11 +44,22 @@ #define IDS_HS_BUTTON_DONE "IDS_HS_BUTTON_DONE" + +HAPI bool all_apps_layout_is_edited(Evas_Object *all_apps) +{ + retv_if(NULL == all_apps, false); + return (bool) evas_object_data_get(all_apps, "is_edited"); +} + + + HAPI void all_apps_layout_edit(Evas_Object *all_apps) { Evas_Object *edit_button; Evas_Object *scroller; + evas_object_data_set(all_apps, "is_edited", (void *) true); + edit_button = elm_object_part_content_get(all_apps, ALL_APPS_EDIT_BUTTON_PART); ret_if(NULL == edit_button); elm_object_signal_emit(edit_button, "edit_button_state,edit", "menu"); @@ -54,6 +67,8 @@ HAPI void all_apps_layout_edit(Evas_Object *all_apps) scroller = elm_object_part_content_get(all_apps, "content"); ret_if(NULL == scroller); page_scroller_edit(scroller); + + key_grab_home(); } @@ -64,6 +79,12 @@ HAPI void all_apps_layout_unedit(Evas_Object *all_apps) ret_if(NULL == all_apps); + key_ungrab_home(); + popup_destroy_all(); + + bool is_edited = (bool) evas_object_data_get(all_apps, "is_edited"); + if (false == is_edited) return; + do { edit_button = elm_object_part_content_get(all_apps, ALL_APPS_EDIT_BUTTON_PART); ret_if(NULL == edit_button); @@ -314,6 +335,7 @@ HAPI Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate) evas_object_data_set(all_apps, "is_under_pkgmgr", (void *) true); evas_object_data_set(all_apps, "rotate", (void *) rotate); evas_object_data_set(all_apps, "enable_bg_image", (void *) true); + evas_object_data_set(all_apps, "is_edited", (void *) true); evas_object_size_hint_min_set(all_apps, width, height); evas_object_size_hint_max_set(all_apps, width, height); evas_object_resize(all_apps, width, height); @@ -385,6 +407,7 @@ HAPI void all_apps_layout_destroy(Evas_Object *all_apps) evas_object_data_del(all_apps, "is_under_pkgmgr"); evas_object_data_del(all_apps, "rotate"); evas_object_data_del(all_apps, "enable_bg_image"); + evas_object_data_del(all_apps, "is_edited"); evas_object_del(all_apps); } diff --git a/src/item.c b/src/item.c index 0c98b4a..39e2f34 100644 --- a/src/item.c +++ b/src/item.c @@ -879,7 +879,7 @@ HAPI void item_launch(Evas_Object *obj) } snprintf(sinform, len, D_("IDS_IDLE_POP_UNABLE_TO_LAUNCH_PS"), name); - popup_create(obj, sinform); + popup_create_confirm(obj, sinform); free(sinform); layout_disable_block(layout); diff --git a/src/key.c b/src/key.c new file mode 100644 index 0000000..007a0a3 --- /dev/null +++ b/src/key.c @@ -0,0 +1,206 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include + +#include "conf.h" +#include "key.h" +#include "menu_screen.h" +#include "page_scroller.h" +#include "popup.h" +#include "util.h" +#include "all_apps/layout.h" + + + +static struct { + Eina_Bool pressed; + Ecore_Event_Handler *press_handler; + Ecore_Event_Handler *release_handler; + Eina_Bool register_handler; + Ecore_Timer *long_press; + Eina_Bool home_grabbed; +} key_info = { + .pressed = 0, + .press_handler = NULL, + .release_handler = NULL, + .register_handler = EINA_FALSE, + .long_press = NULL, + .home_grabbed = EINA_FALSE, +}; + + + +#define KEY_LEFT "Left" +#define KEY_RIGHT "Right" +static Eina_Bool _key_release_cb(void *data, int type, void *event) +{ + Evas_Event_Key_Up *ev = event; + + retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_CANCEL); + retv_if(NULL == ev, ECORE_CALLBACK_CANCEL); + + _D("Key(%s) released %d", ev->keyname, key_info.pressed); + + if (key_info.pressed == EINA_FALSE) return ECORE_CALLBACK_CANCEL; + + do { + Evas_Object *win; + win = menu_screen_get_win(); + break_if(NULL == win); + + Evas_Object *layout; + layout = evas_object_data_get(win, "layout"); + break_if(NULL == layout); + + Evas_Object *all_apps; + all_apps = evas_object_data_get(layout, "all_apps"); + break_if(NULL == all_apps); + + Evas_Object *scroller = evas_object_data_get(all_apps, "scroller"); + break_if(NULL == scroller); + + if (!strcmp(ev->keyname, KEY_SELECT) || !strcmp(ev->keyname, KEY_BACK)) { + if (popup_exist()) { + popup_destroy_all(); + break; + } + + if (all_apps_layout_is_edited(all_apps)) { + all_apps_layout_unedit(all_apps); + } + } else if (!strcmp(ev->keyname, KEY_LEFT) || !strcmp(ev->keyname, KEY_RIGHT)) { + + int cur_idx = page_scroller_get_current_page_no(scroller); + + int idx = 0, x = 0, w = 0; + elm_scroller_region_get(scroller, &x, NULL, &w, NULL); + + if (w) idx = x / w; + if (cur_idx != idx) { + page_scroller_bring_in(scroller, idx); + } + } + } while (0); + + key_info.pressed = EINA_FALSE; + + return ECORE_CALLBACK_CANCEL; +} + + + +static Eina_Bool _key_press_cb(void *data, int type, void *event) +{ + Evas_Event_Key_Down *ev = event; + + retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_CANCEL); + retv_if(NULL == ev, ECORE_CALLBACK_CANCEL); + + key_info.pressed = EINA_TRUE; + _D("Key pressed %d", key_info.pressed); + + return ECORE_CALLBACK_CANCEL; +} + + + +HAPI void key_register(void) +{ + if (!key_info.release_handler) { + key_info.release_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_release_cb, NULL); + if (!key_info.release_handler) { + _E("Failed to register a key up event handler"); + } + } + + if (!key_info.press_handler) { + key_info.press_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_press_cb, NULL); + if (!key_info.press_handler) { + _E("Failed to register a key down event handler"); + } + } + + key_info.pressed = EINA_FALSE; + key_info.register_handler = EINA_TRUE; +} + + + +HAPI void key_unregister(void) +{ + if (key_info.long_press) { + ecore_timer_del(key_info.long_press); + key_info.long_press = NULL; + } + + if (key_info.release_handler) { + ecore_event_handler_del(key_info.release_handler); + key_info.release_handler = NULL; + } + + if (key_info.press_handler) { + ecore_event_handler_del(key_info.press_handler); + key_info.press_handler = NULL; + } + + key_info.register_handler = EINA_FALSE; +} + + + +HAPI void key_grab_home(void) +{ + if (EINA_TRUE == key_info.home_grabbed) return; + + Ecore_X_Window win = elm_win_xwindow_get(menu_screen_get_win()); + Display* dpy = ecore_x_display_get(); + + int ret = utilx_grab_key(dpy, win, KEY_SELECT, TOP_POSITION_GRAB); + ret_if(0 != ret); + + ret = utilx_grab_key(dpy, win, KEY_BACK, TOP_POSITION_GRAB); + ret_if(0 != ret); + + key_info.home_grabbed = EINA_TRUE; +} + + + +HAPI void key_ungrab_home(void) +{ + if (key_info.home_grabbed == EINA_FALSE) return; + + Ecore_X_Window win = elm_win_xwindow_get(menu_screen_get_win()); + Display* dpy = ecore_x_display_get(); + + int ret = utilx_ungrab_key(dpy, win, KEY_SELECT); + ret_if(0 != ret); + + ret = utilx_ungrab_key(dpy, win, KEY_BACK); + ret_if(0 != ret); + + key_info.home_grabbed = EINA_FALSE; +} + + + +// End of a file diff --git a/src/menu_screen.c b/src/menu_screen.c index 67449ff..881b256 100644 --- a/src/menu_screen.c +++ b/src/menu_screen.c @@ -28,6 +28,7 @@ #include "conf.h" #include "item.h" +#include "key.h" #include "layout.h" #include "mapbuf.h" #include "menu_screen.h" @@ -394,6 +395,7 @@ if (vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, _tts_cb, NULL) elm_object_content_set(conformant, layout); mouse_register(); aul_listen_app_dead_signal(_dead_cb, NULL); + key_register(); return true; } @@ -415,6 +417,7 @@ static void _terminate_cb(void *data) evas_object_hide(menu_screen_info.win); + key_unregister(); mouse_unregister(); layout = evas_object_data_del(menu_screen_info.win, "layout"); diff --git a/src/page_scroller.c b/src/page_scroller.c index 0690f96..2882abd 100644 --- a/src/page_scroller.c +++ b/src/page_scroller.c @@ -39,20 +39,6 @@ -static int _count_pages(Evas_Object *scroller) -{ - const Eina_List *children; - Evas_Object *box; - - box = evas_object_data_get(scroller, "box"); - retv_if(NULL == box, 0); - - children = elm_box_children_get(box); - return eina_list_count(children); -} - - - HAPI void page_scroller_bring_in(Evas_Object *scroller, int idx) { Evas_Object *index; diff --git a/src/popup.c b/src/popup.c index 60d5fa5..b640525 100644 --- a/src/popup.c +++ b/src/popup.c @@ -28,28 +28,65 @@ #define BUFSZE 1024 -static void _response_cb(void *data, Evas_Object *obj, void *event_info) -{ + +static struct { Evas_Object *popup; +} popup_info = { + .popup = NULL, +}; + + + +HAPI Evas_Object *popup_exist(void) +{ + return popup_info.popup; +} + + + +HAPI void popup_destroy_all(void) +{ + void (*_destroy_popup)(void *data, Evas_Object *obj, void *event_info); + + if (NULL == popup_info.popup) return; + + _destroy_popup = evas_object_data_get(popup_info.popup, "func_destroy_popup"); + if (_destroy_popup) _destroy_popup(popup_info.popup, NULL, NULL); + + popup_info.popup = NULL; +} + + +static void _response_cb(void *data, Evas_Object *obj, void *event_info) +{ ret_if(NULL == data); - popup = data; + + Evas_Object *popup = data; + evas_object_data_del(popup, "func_destroy_popup"); + popup_info.popup = NULL; + evas_object_del(evas_object_data_del(popup, "button")); + evas_object_smart_callback_del(popup, "block,clicked", _response_cb); evas_object_del(popup); } -HAPI Evas_Object *popup_create(Evas_Object *parent, const char *warning) +HAPI Evas_Object *popup_create_confirm(Evas_Object *parent, const char *warning) { Evas_Object *popup; Evas_Object *btn; retv_if(NULL == warning, NULL); + popup_destroy_all(); + popup = elm_popup_add(parent); retv_if(NULL == popup, NULL); + evas_object_smart_callback_add(popup, "block,clicked", _response_cb, popup); + btn = elm_button_add(popup); if (NULL == btn) { evas_object_del(popup); @@ -61,28 +98,52 @@ HAPI Evas_Object *popup_create(Evas_Object *parent, const char *warning) elm_object_part_content_set(popup, "button1", btn); evas_object_smart_callback_add(btn, "clicked", _response_cb, popup); - evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(popup, "title,text", D_("IDS_COM_POP_WARNING")); elm_object_text_set(popup, warning); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); evas_object_show(popup); + evas_object_data_set(popup, "func_destroy_popup", _response_cb); + popup_info.popup = popup; + return popup; } -static void _uninstall_yes_cb(void *data, Evas_Object *obj, void *event_info) + +static void _uninstall_no_cb(void *data, Evas_Object *obj, void *event_info) { - Evas_Object *popup; - Evas_Object *item; + ret_if(NULL == data); + + Evas_Object *popup = data; + evas_object_data_del(popup, "func_destroy_popup"); + popup_info.popup = NULL; + evas_object_del(evas_object_data_del(popup, "button1")); + evas_object_del(evas_object_data_del(popup, "button2")); + evas_object_data_del(popup, "item"); + evas_object_smart_callback_del(popup, "block,clicked", _uninstall_no_cb); + evas_object_del(popup); +} + + + +static void _uninstall_yes_cb(void *data, Evas_Object *obj, void *event_info) +{ ret_if(NULL == data); - popup = data; + Evas_Object *popup = data; + evas_object_data_del(popup, "func_destroy_popup"); + popup_info.popup = NULL; + + Evas_Object *item; item = evas_object_data_del(popup, "item"); evas_object_del(evas_object_data_del(popup, "button1")); evas_object_del(evas_object_data_del(popup, "button2")); + evas_object_smart_callback_del(popup, "block,clicked", _uninstall_no_cb); evas_object_del(popup); bool is_shortcut = false; @@ -99,20 +160,6 @@ static void _uninstall_yes_cb(void *data, Evas_Object *obj, void *event_info) -static void _uninstall_no_cb(void *data, Evas_Object *obj, void *event_info) -{ - Evas_Object *popup; - - ret_if(NULL == data); - popup = data; - evas_object_del(evas_object_data_del(popup, "button1")); - evas_object_del(evas_object_data_del(popup, "button2")); - evas_object_data_del(popup, "item"); - evas_object_del(popup); -} - - - #define IDS_AT_POP_UNINSTALL_PS_Q "IDS_AT_POP_UNINSTALL_PS_Q" HAPI Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item) { @@ -121,10 +168,13 @@ HAPI Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item) Evas_Object *btn2; char warning[BUFSZE]; + popup_destroy_all(); + popup = elm_popup_add(parent); retv_if(NULL == popup, NULL); evas_object_data_set(popup, "item", item); + evas_object_smart_callback_add(popup, "block,clicked", _uninstall_no_cb, popup); btn1 = elm_button_add(popup); if (NULL == btn1) { @@ -147,6 +197,8 @@ HAPI Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item) evas_object_smart_callback_add(btn2, "clicked", _uninstall_no_cb, popup); evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_data_set(popup, "func_destroy_popup", _uninstall_no_cb); + popup_info.popup = popup; evas_object_show(popup); char *name= item_get_name(item); -- 2.34.1