From 44ccbc68bd24a5bc1803863185e89804b1e3ce5e Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 12 Feb 2014 20:38:51 -0500 Subject: [PATCH] redo maximize animations to actually change window geometry this is ugly, but that's why desksanity is an external module! --- e-module-desksanity.edc | 78 ----------------------------------------- src/e_mod_main.c | 2 +- src/maximize.c | 77 +++++++++++++++++++++++++++++++++------- 3 files changed, 65 insertions(+), 92 deletions(-) diff --git a/e-module-desksanity.edc b/e-module-desksanity.edc index 75f7cad..de5c618 100644 --- a/e-module-desksanity.edc +++ b/e-module-desksanity.edc @@ -42,82 +42,4 @@ collections { } } } - #define COMP_EFFECT_DURATION 0.2 - - group { name: "e/comp/effects/desksanity/maximize"; - script { - public message(Msg_Type:type, id, ...) { - if ((type == MSG_INT_SET) && (id == 0)) { - /* set state */ - new st; - - st = getarg(2); - if (st == 1) - set_state(PART:"mover", "custom", 0.0); - else - set_state(PART:"mover", "default", 0.0); - } else if ((type == MSG_INT_SET) && (id == 1)) { - /* client geom[4] */ - new x, y, xx, yy; - - x = getarg(2); - y = getarg(3); - xx = getarg(4); - yy = getarg(5); - - custom_state(PART:"mover", "default", 0.0); - set_state_val(PART:"mover", STATE_REL1_OFFSET, x, y); - set_state_val(PART:"mover", STATE_REL2_OFFSET, xx, yy); - } - } - } - parts { - part { name: "mover"; type: SPACER; - description { state: "default" 0.0; - } - } - part { name: "e.swallow.content"; type: SWALLOW; - description { state: "default" 0.0; - rel1.to: "mover"; - rel2.to: "mover"; - } - } - } - programs { - program { - name: "show"; - signal: "e,action,go"; - source: "e"; - filter: "mover" "default"; - action: STATE_SET "custom" 0.0; - transition: SINUSOIDAL COMP_EFFECT_DURATION CURRENT; - target: "mover"; - after: "done"; - } - program { - name: "hide"; - signal: "e,action,go"; - source: "e"; - filter: "mover" "custom"; - action: STATE_SET "default" 0.0; - transition: SINUSOIDAL COMP_EFFECT_DURATION CURRENT; - target: "mover"; - after: "done"; - } - program { - name: "stop"; - signal: "e,action,stop"; - source: "e"; - action: ACTION_STOP; - target: "show"; - target: "hide"; - } - program { - name: "done"; - action: SIGNAL_EMIT "e,action,done" "e"; - } - } - } - - } diff --git a/src/e_mod_main.c b/src/e_mod_main.c index 5be892d..b2b9b02 100644 --- a/src/e_mod_main.c +++ b/src/e_mod_main.c @@ -76,7 +76,7 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) E_CONFIG_DD_FREE(conf_edd); E_FREE(mod); E_FREE_LIST(handlers, ecore_event_handler_del); - efx_shutdown(); + //efx_shutdown(); broken... return 1; } diff --git a/src/maximize.c b/src/maximize.c index 864c7f2..68af87a 100644 --- a/src/maximize.c +++ b/src/maximize.c @@ -2,18 +2,59 @@ static Ecore_Event_Handler *eh = NULL; +static void +_ds_unmaximize_post(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + E_Client *ec = data; + Eina_Rectangle *rect; + int x, y, w, h; + double time = 0.15; + + if (e_comp_config_get()->match.disable_borders) return; + if (e_comp_config_get()->fast_borders) + time /= 2; + w = ec->w, h = ec->h; + evas_object_geometry_get(ec->frame, &x, &y, NULL, NULL); + + rect = evas_object_data_del(obj, "__DSUMAX"); + evas_object_geometry_set(obj, rect->x, rect->y, rect->w, rect->h); + free(rect); + efx_resize(ec->frame, EFX_EFFECT_SPEED_SINUSOIDAL, EFX_POINT(x, y), w, h, time, NULL, NULL); +} + static void _ds_unmaximize(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { E_Client *ec = data; - int x, y, w, h; + Eina_Rectangle *rect; - e_comp_object_effect_set(ec->frame, "desksanity/maximize"); - e_comp_object_frame_xy_adjust(ec->frame, ec->saved.x, ec->saved.y, &x, &y); - e_comp_object_frame_wh_adjust(ec->frame, ec->saved.w, ec->saved.h, &w, &h); - e_comp_object_effect_params_set(ec->frame, 1, (int[]){ec->x - x, ec->y - y, (ec->x + ec->w) - (x + w), (ec->y + ec->h) - (y + h)}, 4); - e_comp_object_effect_params_set(ec->frame, 0, (int[]){1}, 1); - e_comp_object_effect_start(ec->frame, NULL, NULL); + if (e_comp_config_get()->match.disable_borders) return; + + rect = malloc(sizeof(Eina_Rectangle)); + rect->x = ec->x, rect->y = ec->y; + rect->w = ec->w, rect->h = ec->h; + evas_object_data_set(ec->frame, "__DSUMAX", rect); +} + +static void +_ds_unmaximize_pre(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + E_Client *ec = data; + Eina_Bool max; + + max = !!evas_object_data_del(ec->frame, "__DSMAX"); + if (max) + efx_resize_stop(ec->frame); + ec->maximize_override = 0; +} + +static void +_ds_maximize_done(void *data, Efx_Map_Data *emd EINA_UNUSED, Evas_Object *obj EINA_UNUSED) +{ + E_Client *ec = data; + + ec->maximize_override = 0; + evas_object_data_del(ec->frame, "__DSMAX"); } static void @@ -21,13 +62,19 @@ _ds_maximize(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNU { E_Client *ec = data; int x, y, w, h; + int ecx, ecy, ecw, ech; + double time = 0.2; - e_comp_object_effect_set(ec->frame, "desksanity/maximize"); + if (e_comp_config_get()->match.disable_borders) return; + if (e_comp_config_get()->fast_borders) + time /= 2; + ec->maximize_override = 1; + ecx = ec->x, ecy = ec->y, ecw = ec->w, ech = ec->h; e_comp_object_frame_xy_adjust(ec->frame, ec->saved.x, ec->saved.y, &x, &y); - e_comp_object_frame_wh_adjust(ec->frame, ec->saved.w, ec->saved.h, &w, &h); - e_comp_object_effect_params_set(ec->frame, 1, (int[]){x - ec->x, y - ec->y, (x + w) - (ec->x + ec->w), (y + h) - (ec->y + ec->h)}, 4); - e_comp_object_effect_params_set(ec->frame, 0, (int[]){1}, 1); - e_comp_object_effect_start(ec->frame, NULL, NULL); + evas_object_geometry_get(ec->frame, NULL, NULL, &w, &h); + evas_object_geometry_set(ec->frame, x, y, w, h); + efx_resize(ec->frame, EFX_EFFECT_SPEED_SINUSOIDAL, EFX_POINT(ecx, ecy), ecw, ech, time, _ds_maximize_done, ec); + evas_object_data_set(ec->frame, "__DSMAX", (void*)1); } static void @@ -35,7 +82,9 @@ _ds_maximize_check(E_Client *ec) { if (e_client_util_ignored_get(ec)) return; evas_object_smart_callback_add(ec->frame, "maximize_done", _ds_maximize, ec); + evas_object_smart_callback_add(ec->frame, "unmaximize_pre", _ds_unmaximize_pre, ec); evas_object_smart_callback_add(ec->frame, "unmaximize", _ds_unmaximize, ec); + evas_object_smart_callback_add(ec->frame, "unmaximize_done", _ds_unmaximize_post, ec); } static Eina_Bool @@ -63,8 +112,10 @@ maximize_shutdown(void) E_CLIENT_FOREACH(e_comp_get(NULL), ec) { if (e_client_util_ignored_get(ec)) continue; - evas_object_smart_callback_del(ec->frame, "maximize", _ds_maximize); + evas_object_smart_callback_del(ec->frame, "maximize_done", _ds_maximize); + evas_object_smart_callback_del(ec->frame, "unmaximize_pre", _ds_unmaximize_pre); evas_object_smart_callback_del(ec->frame, "unmaximize", _ds_unmaximize); + evas_object_smart_callback_del(ec->frame, "unmaximize_done", _ds_unmaximize_post); } E_FREE_FUNC(eh, ecore_event_handler_del); }