From 4c456054b8a5ffd484eddc18a30501a4e8f338f6 Mon Sep 17 00:00:00 2001 From: Hyoyoung Chang Date: Tue, 12 Apr 2011 17:04:45 +0900 Subject: [PATCH] add rotation window feature --- src/cbhm_main.c | 175 ++++++++++++++++++++++++++++++++++++++++------ src/cbhm_main.h | 14 +++- src/clipdrawer.c | 209 ++++++++++++++++++++++++++++++++++++++++++++++--------- src/clipdrawer.h | 7 +- 4 files changed, 348 insertions(+), 57 deletions(-) diff --git a/src/cbhm_main.c b/src/cbhm_main.c index 6302ee1..7b5aa74 100644 --- a/src/cbhm_main.c +++ b/src/cbhm_main.c @@ -16,9 +16,10 @@ #include "clipdrawer.h" #include "scrcapture.h" +#include + // FIXME: how to remove g_main_ad? static struct appdata *g_main_ad = NULL; - static Evas_Object* create_win(void *data, const char *name); static Evas_Object* load_edj(Evas_Object *parent, const char *file, const char *group); @@ -35,6 +36,11 @@ static void main_quit_cb(void *data, Evas_Object* obj, void* event_info) elm_exit(); } +static int lang_changed(void *data) +{ + return 0; +} + void* g_get_main_appdata() { return (void*)g_main_ad; @@ -76,21 +82,87 @@ int init_appview(void *data) void set_focus_for_app_window(Evas_Object *win, Eina_Bool enable) { - Eina_Bool accepts_focus; - Ecore_X_Window_State_Hint initial_state; - Ecore_X_Pixmap icon_pixmap; - Ecore_X_Pixmap icon_mask; - Ecore_X_Window icon_window; - Ecore_X_Window window_group; - Eina_Bool is_urgent; - - ecore_x_icccm_hints_get (elm_win_xwindow_get (win), - &accepts_focus, &initial_state, &icon_pixmap, &icon_mask, &icon_window, &window_group, &is_urgent); - ecore_x_icccm_hints_set (elm_win_xwindow_get (win), - enable, initial_state, icon_pixmap, icon_mask, icon_window, window_group, is_urgent); + Eina_Bool accepts_focus; + Ecore_X_Window_State_Hint initial_state; + Ecore_X_Pixmap icon_pixmap; + Ecore_X_Pixmap icon_mask; + Ecore_X_Window icon_window; + Ecore_X_Window window_group; + Eina_Bool is_urgent; + + ecore_x_icccm_hints_get (elm_win_xwindow_get (win), + &accepts_focus, &initial_state, &icon_pixmap, &icon_mask, &icon_window, &window_group, &is_urgent); + ecore_x_icccm_hints_set (elm_win_xwindow_get (win), + enable, initial_state, icon_pixmap, icon_mask, icon_window, window_group, is_urgent); DTRACE("set focus mode = %d\n", enable); } +int get_rotation_degree() +{ + int angle; + enum appcore_rm mode; + appcore_get_rotation_state(&mode); + if (mode == -1) + return 0; + + switch (mode) + { + case APPCORE_RM_LANDSCAPE_NORMAL: + angle = -90; + break; + + case APPCORE_RM_LANDSCAPE_REVERSE: + angle = 90; + break; + + case APPCORE_RM_PORTRAIT_REVERSE: + angle = 180; + break; + + case APPCORE_RM_UNKNOWN: + case APPCORE_RM_PORTRAIT_NORMAL: + default: + angle = 0; + break; + } + + return angle; +} + +static int _rotation_cb(enum appcore_rm mode, void *data) +{ + struct appdata *ad = (struct appdata *)data; + int angle; + + switch (mode) + { + case APPCORE_RM_LANDSCAPE_NORMAL: + angle = -90; + break; + + case APPCORE_RM_LANDSCAPE_REVERSE: + angle = 90; + break; + + case APPCORE_RM_PORTRAIT_REVERSE: + angle = 180; + break; + + case APPCORE_RM_UNKNOWN: + case APPCORE_RM_PORTRAIT_NORMAL: + default: + angle = 0; + break; + } + + elm_win_rotation_set(ad->win_main, angle); + + // This is need for customized rotation process. + set_rotation_to_clipdrawer(ad, angle); + + return 0; +} + static Evas_Object* create_win(void *data, const char *name) { struct appdata *ad = (struct appdata *) data; @@ -101,7 +173,7 @@ static Evas_Object* create_win(void *data, const char *name) eo = elm_win_add(NULL, name, ELM_WIN_BASIC); if (eo) - { + { elm_win_title_set(eo, name); elm_win_borderless_set(eo, EINA_TRUE); ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h); @@ -122,7 +194,7 @@ static Evas_Object* create_win(void *data, const char *name) } static Evas_Object* load_edj(Evas_Object *parent, const char *file, const char *group) -{ +{ Evas_Object *eo; int ret; @@ -159,17 +231,64 @@ static void fini(struct appdata *ad) if (ad->ly_main) evas_object_del(ad->ly_main); +} + +static void init_ad(struct appdata *ad) +{ + g_main_ad = ad; +} + +static int app_create(void *data) +{ + struct appdata *ad = data; + + init_ad(ad); + + init(ad); + + lang_changed(ad); + + /* add system event callback */ + appcore_set_event_callback(APPCORE_EVENT_LANG_CHANGE, + lang_changed, ad); + + return 0; +} + + +static int app_terminate(void *data) +{ + struct appdata *ad = data; + + fini(ad); if (ad->win_main) evas_object_del(ad->win_main); + + return 0; } -static void init_ad(struct appdata *ad) +static int app_pause(void *data) { - memset(ad, 0x0, sizeof(struct appdata)); - g_main_ad = ad; + return 0; } +static int app_resume(void *data) +{ + return 0; +} + +static int app_reset(bundle *b, void *data) +{ + struct appdata *ad = data; + + if (ad->win_main) + elm_win_activate(ad->win_main); + + return 0; +} + +/* EAPI int elm_main(int argc, char **argv) { struct appdata ad; @@ -185,10 +304,24 @@ EAPI int elm_main(int argc, char **argv) return EXIT_SUCCESS; } +*/ -int main( int argc, char *argv[] ) +int main(int argc, char *argv[]) { - elm_init(argc, argv); + struct appdata ad; + struct appcore_ops ops = { + .create = app_create, + .terminate = app_terminate, + .pause = app_pause, + .resume = app_resume, + .reset = app_reset, + }; + + memset(&ad, 0x0, sizeof(struct appdata)); + ops.data = &ad; + + appcore_set_i18n(PACKAGE, LOCALEDIR); + appcore_set_rotation_cb(_rotation_cb, &ad); - return elm_main(argc, argv); + return appcore_efl_main(PACKAGE, &argc, &argv, &ops); } diff --git a/src/cbhm_main.h b/src/cbhm_main.h index c179d28..9d9a163 100755 --- a/src/cbhm_main.h +++ b/src/cbhm_main.h @@ -3,8 +3,17 @@ #include -#define APPNAME "Clipboard History Manager" -#define LOCALEDIR "/usr/share/locale" +#if !defined(PACKAGE) +# define PACKAGE "CBHM" +#endif + +#if !defined(APPNAME) +# define APPNAME "Clipboard History Manager" +#endif + +#if !defined(LOCALEDIR) +# define LOCALEDIR "/usr/share/locale" +#endif #define EDJ_PATH "/usr/share/edje" #define APP_EDJ_FILE EDJ_PATH"/cbhmdrawer.edj" @@ -36,6 +45,7 @@ struct appdata }; void* g_get_main_appdata(); + void set_focus_for_app_window(Evas_Object *win, Eina_Bool enable); #endif /* _cbhm_main_h_ */ diff --git a/src/clipdrawer.c b/src/clipdrawer.c index fe1ff5e..dcfde93 100644 --- a/src/clipdrawer.c +++ b/src/clipdrawer.c @@ -440,6 +440,47 @@ clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const } } +void set_rotation_to_clipdrawer(void *data, int angle) +{ + struct appdata *ad = data; + double wh, wy; + int wposx, wwidth; + + if (angle == 180) // reverse + { + wh = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h; + wy = 0; + wwidth = ad->root_w; + wposx = CLIPDRAWER_POS_X; + } + else if (angle == 90) // right rotate + { + wh = (1.0*CLIPDRAWER_HEIGHT_LANDSCAPE/SCREEN_WIDTH)*ad->root_w; + wy = (1.0*CLIPDRAWER_POS_X/SCREEN_WIDTH)*ad->root_w; + wwidth = ad->root_h; + wposx = CLIPDRAWER_WIDTH-CLIPDRAWER_HEIGHT_LANDSCAPE; + } + else if (angle == -90) // left rotate + { + wh = (1.0*CLIPDRAWER_HEIGHT_LANDSCAPE/SCREEN_WIDTH)*ad->root_w; + wy = (1.0*CLIPDRAWER_POS_X/SCREEN_WIDTH)*ad->root_w; + wwidth = ad->root_h; + wposx = CLIPDRAWER_POS_X; + } + else // angle == 0 + { + wh = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h; + wy = (1.0*CLIPDRAWER_POS_Y/SCREEN_HEIGHT)*ad->root_h; + wwidth = ad->root_w; + wposx = CLIPDRAWER_POS_X; + } + + evas_object_resize(ad->win_main, wwidth, (int)wh); + evas_object_move(ad->win_main, wposx, (int)wy); + evas_object_resize(ad->ly_main, wwidth, (int)wh); + evas_object_move(ad->ly_main, wposx, (int)wy); +} + int clipdrawer_init(void *data) { struct appdata *ad = data; @@ -453,13 +494,7 @@ int clipdrawer_init(void *data) // for elm_check elm_theme_extension_add(NULL, APP_EDJ_FILE); - cdy = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h; - cdw = (1.0*CLIPDRAWER_POS_Y/SCREEN_HEIGHT)*ad->root_h; - - evas_object_resize(ad->win_main, ad->root_w, (int)cdy); - evas_object_move(ad->win_main, CLIPDRAWER_POS_X, (int)cdw); - evas_object_resize(ad->ly_main, ad->root_w, (int)cdy); - evas_object_move(ad->ly_main, CLIPDRAWER_POS_X, (int)cdw); + set_rotation_to_clipdrawer(ad, get_rotation_degree()); edje_object_signal_callback_add(elm_layout_edje_get(ad->ly_main), "mouse,up,1", "*", clipdrawer_ly_clicked, ad); @@ -526,29 +561,152 @@ int clipdrawer_create_view(void *data) return 0; } -Eina_Bool anim_pos_calc_cb(void *data) +Eina_Bool _get_anim_pos(void *data, int *sp, int *ep) { + if (!sp || !ep) + return EINA_FALSE; + struct appdata *ad = data; + int angle = get_rotation_degree(); + int anim_start, anim_end, delta; - static int anim_count = 0; - int anim_starty, anim_endy, deltay; + switch (ad->anim_status) + { + case HIDE_ANIM: + if (angle == 180) // reverse + { + anim_start = 0; + anim_end = (int)(((double)CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h); + anim_end = ad->root_h-anim_end; + anim_end = -anim_end; + } + else if (angle == 90) // right rotate + { + anim_end = ad->root_w; + anim_start = (int)(((double)CLIPDRAWER_HEIGHT_LANDSCAPE/SCREEN_WIDTH)*ad->root_w); + anim_start = ad->root_w-anim_start; + } + else if (angle == -90) // left rotate + { + anim_start = 0; + anim_end = (int)(((double)CLIPDRAWER_HEIGHT_LANDSCAPE/SCREEN_WIDTH)*ad->root_w); + anim_end = ad->root_w-anim_end; + anim_end = -anim_end; + } + else // angle == 0 + { + anim_start = (int)((1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h); + anim_end = ad->root_h; + anim_start = anim_end-anim_start; + } + break; + case SHOW_ANIM: + if (angle == 180) // reverse + { + anim_start = (int)(((double)CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h); + anim_start = ad->root_h - anim_start; + anim_start = -anim_start; + anim_end = 0; + } + else if (angle == 90) // right rotate + { + anim_start = ad->root_w; + anim_end = (int)(((double)CLIPDRAWER_HEIGHT_LANDSCAPE/SCREEN_WIDTH)*ad->root_w); + anim_end = anim_start-anim_end; + } + else if (angle == -90) // left rotate + { + anim_start = (int)(((double)CLIPDRAWER_HEIGHT_LANDSCAPE/SCREEN_WIDTH)*ad->root_w); + anim_start = ad->root_w-anim_start; + anim_start = -anim_start; + anim_end = 0; + } + else // angle == 0 + { + anim_start = ad->root_h; + anim_end = (int)(((double)CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h); + anim_end = anim_start-anim_end; + } + break; + } + *sp = anim_start; + *ep = anim_end; + return EINA_TRUE; +} + +Eina_Bool _do_anim_delta_pos(void *data, int sp, int ep, int ac, int *dp) +{ + if (!dp) + return EINA_FALSE; + + struct appdata *ad = data; + int angle = get_rotation_degree(); + int delta; double posprop; + posprop = 1.0*ac/ANIM_DURATION; switch (ad->anim_status) { case HIDE_ANIM: - anim_starty = (int)((1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h); - anim_endy = ad->root_h; - anim_starty = anim_endy - anim_starty; + if (angle == 180) // reverse + { + delta = (int)((sp-ep)*posprop); + evas_object_move(ad->win_main, 0, sp-delta); + } + else if (angle == 90) // right rotate + { + delta = (int)((sp-ep)*posprop); + evas_object_move(ad->win_main, sp-delta, 0); + } + else if (angle == -90) // left rotate + { + delta = (int)((sp-ep)*posprop); + evas_object_move(ad->win_main, sp-delta, 0); + } + else // angle == 0 + { + delta = (int)((ep-sp)*posprop); + evas_object_move(ad->win_main, 0, sp+delta); + } + break; case SHOW_ANIM: - anim_starty = ad->root_h; - anim_endy = (int)((1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h); - anim_endy = anim_starty-anim_endy; + if (angle == 180) // reverse + { + delta = (int)((ep-sp)*posprop); + evas_object_move(ad->win_main, 0, sp+delta); + } + else if (angle == 90) // right rotate + { + delta = (int)((ep-sp)*posprop); + evas_object_move(ad->win_main, sp+delta, 0); + } + else if (angle == -90) // left rotate + { + delta = (int)((ep-sp)*posprop); + evas_object_move(ad->win_main, sp+delta, 0); + } + else // angle == 0 + { + delta = (int)((sp-ep)*posprop); + evas_object_move(ad->win_main, 0, sp-delta); + } break; - default: - return EINA_FALSE; } + + *dp = delta; + + return EINA_TRUE; +} + +Eina_Bool anim_pos_calc_cb(void *data) +{ + struct appdata *ad = data; + + static int anim_count = 0; + int anim_start, anim_end, delta; + + _get_anim_pos(ad, &anim_start, &anim_end); if (anim_count > ANIM_DURATION) { @@ -564,20 +722,7 @@ Eina_Bool anim_pos_calc_cb(void *data) return EINA_FALSE; } - posprop = 1.0*anim_count/ANIM_DURATION; - switch (ad->anim_status) - { - case HIDE_ANIM: - deltay = (int)((anim_endy-anim_starty)*posprop); - evas_object_move(ad->win_main, 0, anim_starty+deltay); - break; - case SHOW_ANIM: - deltay = (int)((anim_starty-anim_endy)*posprop); - evas_object_move(ad->win_main, 0, anim_starty-deltay); - break; - default: - return EINA_FALSE; - } + _do_anim_delta_pos(ad, anim_start, anim_end, anim_count, &delta); anim_count++; return EINA_TRUE; diff --git a/src/clipdrawer.h b/src/clipdrawer.h index 3a5399e..251ae35 100644 --- a/src/clipdrawer.h +++ b/src/clipdrawer.h @@ -2,10 +2,11 @@ #define _clipdrawer_h_ #define CLIPDRAWER_POS_X 0 -#define CLIPDRAWER_POS_Y 465 +#define CLIPDRAWER_POS_Y 440 #define CLIPDRAWER_WIDTH 480 -//#define CLIPDRAWER_HEIGHT 335 #define CLIPDRAWER_HEIGHT 360 +#define CLIPDRAWER_HEIGHT_LANDSCAPE 288 +#define SCREEN_WIDTH 480 #define SCREEN_HEIGHT 800 enum { @@ -22,6 +23,8 @@ void clipdrawer_activate_view(void *data); //void clipdrawer_hide_view(void *data); void clipdrawer_lower_view(void *data); +void set_rotation_to_clipdrawer(void *data, int angle); + const char* clipdrawer_get_plain_string_from_escaped(char *escstr); char *clipdrawer_get_item_data(void *data, int pos); -- 2.7.4