From 78cb275b28303496e6f3ca58f4fb3af45ddc3228 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 31 Jul 2012 10:25:20 +0000 Subject: [PATCH] remove shadow option - this is handled by styles anyway, and make a basic vs advanced cfg dialog for people unable to cope with settings widgets. :) SVN revision: 74637 --- src/modules/comp/Makefile.am | 3 +- src/modules/comp/e_mod_comp.c | 20 +-- src/modules/comp/e_mod_comp_cfdata.c | 5 - src/modules/comp/e_mod_comp_cfdata.h | 2 - src/modules/comp/e_mod_config.c | 244 ++++++++++++++++++++++----- src/modules/comp/shadow.edj | Bin 10801 -> 0 bytes 6 files changed, 202 insertions(+), 72 deletions(-) delete mode 100644 src/modules/comp/shadow.edj diff --git a/src/modules/comp/Makefile.am b/src/modules/comp/Makefile.am index b3408ef7d..b2768b0eb 100644 --- a/src/modules/comp/Makefile.am +++ b/src/modules/comp/Makefile.am @@ -4,8 +4,7 @@ MODULE = comp # data files for the module filesdir = $(libdir)/enlightenment/modules/$(MODULE) files_DATA = \ -e-module-$(MODULE).edj module.desktop \ -shadow.edj +e-module-$(MODULE).edj module.desktop EXTRA_DIST = $(files_DATA) diff --git a/src/modules/comp/e_mod_comp.c b/src/modules/comp/e_mod_comp.c index 7aff723e3..ecff51a1a 100644 --- a/src/modules/comp/e_mod_comp.c +++ b/src/modules/comp/e_mod_comp.c @@ -1579,13 +1579,6 @@ _e_mod_comp_win_shadow_setup(E_Comp_Win *cw) "base/theme/borders", "e/comp/none"); } - // use different shadow objects/group per window type? - if (!ok) - { - if (_comp_mod->conf->shadow_file) - ok = edje_object_file_set(cw->shobj, _comp_mod->conf->shadow_file, - "shadow"); - } if (!ok) { if (_comp_mod->conf->shadow_style) @@ -1599,18 +1592,9 @@ _e_mod_comp_win_shadow_setup(E_Comp_Win *cw) ok = e_theme_edje_object_set(cw->shobj, "base/theme/borders", "e/comp/default"); } - if (!ok) // fallback to local shadow.edj - will go when default theme supports this - { - snprintf(buf, sizeof(buf), "%s/shadow.edj", - e_module_dir_get(_comp_mod->module)); - ok = edje_object_file_set(cw->shobj, buf, "shadow"); - } edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->obj); - if (!_comp_mod->conf->use_shadow - || (cw->bd && cw->bd->client.e.state.video)) - { - edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e"); - } + if (cw->bd && cw->bd->client.e.state.video) + edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e"); else { if (_e_mod_comp_win_do_shadow(cw)) diff --git a/src/modules/comp/e_mod_comp_cfdata.c b/src/modules/comp/e_mod_comp_cfdata.c index b31067cfc..686252af3 100644 --- a/src/modules/comp/e_mod_comp_cfdata.c +++ b/src/modules/comp/e_mod_comp_cfdata.c @@ -30,7 +30,6 @@ e_mod_comp_cfdata_edd_init(E_Config_DD **conf_edd, E_Config_DD **match_edd) #undef D #define T Config #define D *conf_edd - E_CONFIG_VAL(D, T, shadow_file, STR); E_CONFIG_VAL(D, T, shadow_style, STR); E_CONFIG_VAL(D, T, engine, INT); E_CONFIG_VAL(D, T, max_unmapped_pixels, INT); @@ -39,7 +38,6 @@ e_mod_comp_cfdata_edd_init(E_Config_DD **conf_edd, E_Config_DD **match_edd) E_CONFIG_VAL(D, T, fps_average_range, INT); E_CONFIG_VAL(D, T, fps_corner, UCHAR); E_CONFIG_VAL(D, T, fps_show, UCHAR); - E_CONFIG_VAL(D, T, use_shadow, UCHAR); E_CONFIG_VAL(D, T, indirect, UCHAR); E_CONFIG_VAL(D, T, texture_from_pixmap, UCHAR); E_CONFIG_VAL(D, T, lock_fps, UCHAR); @@ -66,7 +64,6 @@ e_mod_comp_cfdata_config_new(void) Match *mat; cfg = E_NEW(Config, 1); - cfg->shadow_file = NULL; cfg->shadow_style = eina_stringshare_add("default"); cfg->engine = ENGINE_SW; cfg->max_unmapped_pixels = 32 * 1024; // implement @@ -75,7 +72,6 @@ e_mod_comp_cfdata_config_new(void) cfg->fps_average_range = 30; cfg->fps_corner = 0; cfg->fps_show = 0; - cfg->use_shadow = 1; cfg->indirect = 0; cfg->texture_from_pixmap = 1; cfg->lock_fps = 1; @@ -159,7 +155,6 @@ _match_list_free(Eina_List *list) EAPI void e_mod_cfdata_config_free(Config *cfg) { - if (cfg->shadow_file) eina_stringshare_del(cfg->shadow_file); if (cfg->shadow_style) eina_stringshare_del(cfg->shadow_style); _match_list_free(cfg->match.popups); diff --git a/src/modules/comp/e_mod_comp_cfdata.h b/src/modules/comp/e_mod_comp_cfdata.h index fb87d656f..33cb9ff13 100644 --- a/src/modules/comp/e_mod_comp_cfdata.h +++ b/src/modules/comp/e_mod_comp_cfdata.h @@ -6,7 +6,6 @@ typedef struct _Match Match; struct _Config { - const char *shadow_file; const char *shadow_style; int engine; int max_unmapped_pixels; @@ -15,7 +14,6 @@ struct _Config int fps_average_range; unsigned char fps_corner; unsigned char fps_show; - unsigned char use_shadow; unsigned char indirect; unsigned char texture_from_pixmap; unsigned char lock_fps; diff --git a/src/modules/comp/e_mod_config.c b/src/modules/comp/e_mod_config.c index 2d608dd47..9598c476a 100644 --- a/src/modules/comp/e_mod_config.c +++ b/src/modules/comp/e_mod_config.c @@ -24,7 +24,6 @@ typedef struct _Match_Config struct _E_Config_Dialog_Data { - int use_shadow; int engine; int indirect; int texture_from_pixmap; @@ -76,6 +75,11 @@ static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, + Evas *evas, + E_Config_Dialog_Data *cfdata); +static int _advanced_apply_data(E_Config_Dialog *cfd, + E_Config_Dialog_Data *cfdata); E_Config_Dialog * e_int_config_comp_module(E_Container *con, @@ -93,7 +97,9 @@ e_int_config_comp_module(E_Container *con, v->free_cfdata = _free_data; v->basic.apply_cfdata = _basic_apply_data; v->basic.create_widgets = _basic_create_widgets; - + v->advanced.apply_cfdata = _advanced_apply_data; + v->advanced.create_widgets = _advanced_create_widgets; + snprintf(buf, sizeof(buf), "%s/e-module-comp.edj", e_module_dir_get(mod->module)); cfd = e_config_dialog_new(con, _("Composite Settings"), @@ -124,7 +130,6 @@ _create_data(E_Config_Dialog *cfd) cfdata = E_NEW(E_Config_Dialog_Data, 1); - cfdata->use_shadow = _comp_mod->conf->use_shadow; cfdata->engine = _comp_mod->conf->engine; if ((cfdata->engine != ENGINE_SW) && (cfdata->engine != ENGINE_GL)) @@ -233,28 +238,6 @@ _free_data(E_Config_Dialog *cfd __UNUSED__, free(cfdata); } -static void -_shadow_changed(void *data, - Evas_Object *obj, - void *event_info __UNUSED__) -{ - E_Config_Dialog_Data *cfdata = data; - Evas_Object *orec0; - Eina_List *style_list; - const E_Demo_Style_Item *it; - const Eina_List *l; - - orec0 = evas_object_name_find(evas_object_evas_get(obj), "style_shadows"); - style_list = evas_object_data_get(orec0, "list"); - EINA_LIST_FOREACH(style_list, l, it) - { - if (cfdata->use_shadow) - edje_object_signal_emit(it->preview, "e,state,shadow,on", "e"); - else - edje_object_signal_emit(it->preview, "e,state,shadow,off", "e"); - } -} - static Eina_Bool _style_demo(void *data) { @@ -347,7 +330,6 @@ _style_selector_del(void *data __UNUSED__, static Evas_Object * _style_selector(Evas *evas, - int use_shadow, const char **source) { Evas_Object *oi, *ob, *oo, *obd, *orec, *oly, *orec0; @@ -390,7 +372,7 @@ _style_selector(Evas *evas, e_layout_pack(oly, oo); e_layout_child_move(oo, 39, 39); e_layout_child_resize(oo, 162, 162); - if (use_shadow) edje_object_signal_emit(oo, "e,state,shadow,on", "e"); + edje_object_signal_emit(oo, "e,state,shadow,on", "e"); edje_object_signal_emit(oo, "e,state,visible,on", "e"); evas_object_show(oo); @@ -622,7 +604,7 @@ _edit_ok(void *d1, void *d2) { Match_Config *m = d1; - Evas_Object *dia, *bg, *of = d2; + Evas_Object *dia, *bg, *of = d2; Evas_Object *il; char *label; int n; @@ -925,7 +907,7 @@ _create_edit_frame(E_Config_Dialog *cfd, e_widget_toolbook_page_append(tb, NULL, _("Flags"), tab2, 1, 1, 1, 1, 0.5, 0.0); - oi = _style_selector(evas, cfdata->use_shadow, &(m->match.shadow_style)); + oi = _style_selector(evas, &(m->match.shadow_style)); e_widget_toolbook_page_append(tb, NULL, _("Style"), oi, 1, 1, 1, 1, 0.5, 0.0); @@ -1131,7 +1113,7 @@ _create_styles_toolbook(E_Config_Dialog *cfd, tb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale); - oi = _style_selector(evas, cfdata->use_shadow, &(cfdata->shadow_style)); + oi = _style_selector(evas, &(cfdata->shadow_style)); e_widget_toolbook_page_append(tb, NULL, _("Default"), oi, 1, 1, 1, 1, 0.5, 0.0); oi = _create_match_editor(cfd, evas, cfdata, &(cfdata->match.borders), &il); @@ -1156,11 +1138,11 @@ _create_styles_toolbook(E_Config_Dialog *cfd, } static Evas_Object * -_basic_create_widgets(E_Config_Dialog *cfd, - Evas *evas, - E_Config_Dialog_Data *cfdata) +_advanced_create_widgets(E_Config_Dialog *cfd, + Evas *evas, + E_Config_Dialog_Data *cfdata) { - Evas_Object *ob, *ol, *ol2, *of, *otb, *oi, *orec0, *tab; + Evas_Object *ob,*ol, *ol2, *of, *otb, *oi, *orec0, *tab; E_Radio_Group *rg; orec0 = evas_object_rectangle_add(evas); @@ -1173,9 +1155,6 @@ _basic_create_widgets(E_Config_Dialog *cfd, /////////////////////////////////////////// ol = e_widget_list_add(evas, 0, 0); - ob = e_widget_check_add(evas, _("Shadows"), &(cfdata->use_shadow)); - evas_object_smart_callback_add(ob, "changed", _shadow_changed, cfdata); - e_widget_list_object_append(ol, ob, 1, 0, 0.5); ob = e_widget_check_add(evas, _("Limit framerate"), &(cfdata->lock_fps)); e_widget_list_object_append(ol, ob, 1, 0, 0.5); ob = e_widget_check_add(evas, _("Smooth scaling"), &(cfdata->smooth_windows)); @@ -1205,6 +1184,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, e_widget_list_object_append(ol, ob, 1, 1, 0.5); e_widget_toolbook_page_append(otb, NULL, _("Sync"), ol, 0, 0, 0, 0, 0.5, 0.0); + /////////////////////////////////////////// ol = e_widget_list_add(evas, 0, 0); rg = e_widget_radio_group_new(&(cfdata->engine)); ob = e_widget_radio_add(evas, _("Software"), ENGINE_SW, rg); @@ -1220,8 +1200,6 @@ _basic_create_widgets(E_Config_Dialog *cfd, e_widget_framelist_content_align_set(of, 0.5, 0.0); ob = e_widget_check_add(evas, _("Texture from pixmap"), &(cfdata->texture_from_pixmap)); e_widget_framelist_object_append(of, ob); - ob = e_widget_label_add(evas, _("Ctrl+Alt+Shift+Home resets compositor")); - e_widget_framelist_object_append(of, ob); ob = e_widget_check_add(evas, _("Indirect OpenGL (EXPERIMENTAL)"), &(cfdata->indirect)); e_widget_framelist_object_append(of, ob); e_widget_list_object_append(ol, of, 1, 1, 0.5); @@ -1235,7 +1213,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, e_widget_list_object_append(ol, ob, 1, 1, 0.5); ob = e_widget_check_add(evas, _("Send dump"), &(cfdata->send_dump)); e_widget_list_object_append(ol, ob, 1, 1, 0.5); - ob = e_widget_check_add(evas, _("Don't composite fullscreen"), &(cfdata->nocomp_fs)); + ob = e_widget_check_add(evas, _("Don't composite fullscreen windows"), &(cfdata->nocomp_fs)); e_widget_list_object_append(ol, ob, 1, 1, 0.5); ob = e_widget_check_add(evas, _("Keep hidden windows"), &(cfdata->keep_unmapped)); e_widget_list_object_append(ol, ob, 1, 1, 0.5); @@ -1372,11 +1350,188 @@ _match_dup2(Match_Config *m2, } static int -_basic_apply_data(E_Config_Dialog *cfd __UNUSED__, - E_Config_Dialog_Data *cfdata) +_advanced_apply_data(E_Config_Dialog *cfd __UNUSED__, + E_Config_Dialog_Data *cfdata) { - if ((cfdata->use_shadow != _comp_mod->conf->use_shadow) || - (cfdata->lock_fps != _comp_mod->conf->lock_fps) || + if ((cfdata->lock_fps != _comp_mod->conf->lock_fps) || + (cfdata->smooth_windows != _comp_mod->conf->smooth_windows) || + (cfdata->grab != _comp_mod->conf->grab) || + (cfdata->keep_unmapped != _comp_mod->conf->keep_unmapped) || + (cfdata->nocomp_fs != _comp_mod->conf->nocomp_fs) || + (cfdata->shadow_style != _comp_mod->conf->shadow_style) || + (cfdata->max_unmapped_pixels != _comp_mod->conf->max_unmapped_pixels) || + (cfdata->max_unmapped_time != _comp_mod->conf->max_unmapped_time) || + (cfdata->min_unmapped_time != _comp_mod->conf->min_unmapped_time) || + (cfdata->send_flush != _comp_mod->conf->send_flush) || + (cfdata->send_dump != _comp_mod->conf->send_dump) || + (cfdata->fps_show != _comp_mod->conf->fps_show) || + (cfdata->fps_corner != _comp_mod->conf->fps_corner) || + (cfdata->fps_average_range != _comp_mod->conf->fps_average_range) || + (cfdata->first_draw_delay != _comp_mod->conf->first_draw_delay) || + (cfdata->match.changed) + ) + { + if (cfdata->match.changed) + { + Eina_List *l; + Match *m; + Match_Config *m2; + + _match_list_free(_comp_mod->conf->match.popups); + _match_list_free(_comp_mod->conf->match.borders); + _match_list_free(_comp_mod->conf->match.overrides); + _match_list_free(_comp_mod->conf->match.menus); + + _comp_mod->conf->match.popups = NULL; + _comp_mod->conf->match.borders = NULL; + _comp_mod->conf->match.overrides = NULL; + _comp_mod->conf->match.menus = NULL; + + EINA_LIST_FOREACH(cfdata->match.popups, l, m2) + { + m = E_NEW(Match, 1); + _match_dup2(m2, m); + _comp_mod->conf->match.popups = + eina_list_append(_comp_mod->conf->match.popups, m); + } + EINA_LIST_FOREACH(cfdata->match.borders, l, m2) + { + m = E_NEW(Match, 1); + _match_dup2(m2, m); + _comp_mod->conf->match.borders = + eina_list_append(_comp_mod->conf->match.borders, m); + } + EINA_LIST_FOREACH(cfdata->match.overrides, l, m2) + { + m = E_NEW(Match, 1); + _match_dup2(m2, m); + _comp_mod->conf->match.overrides = + eina_list_append(_comp_mod->conf->match.overrides, m); + } + EINA_LIST_FOREACH(cfdata->match.menus, l, m2) + { + m = E_NEW(Match, 1); + _match_dup2(m2, m); + _comp_mod->conf->match.menus = + eina_list_append(_comp_mod->conf->match.menus, m); + } + cfdata->match.changed = 0; + } + _comp_mod->conf->lock_fps = cfdata->lock_fps; + _comp_mod->conf->smooth_windows = cfdata->smooth_windows; + _comp_mod->conf->grab = cfdata->grab; + _comp_mod->conf->keep_unmapped = cfdata->keep_unmapped; + _comp_mod->conf->nocomp_fs = cfdata->nocomp_fs; + _comp_mod->conf->max_unmapped_pixels = cfdata->max_unmapped_pixels; + _comp_mod->conf->max_unmapped_time = cfdata->max_unmapped_time; + _comp_mod->conf->min_unmapped_time = cfdata->min_unmapped_time; + _comp_mod->conf->send_flush = cfdata->send_flush; + _comp_mod->conf->send_dump = cfdata->send_dump; + _comp_mod->conf->fps_show = cfdata->fps_show; + _comp_mod->conf->fps_corner = cfdata->fps_corner; + _comp_mod->conf->fps_average_range = cfdata->fps_average_range; + _comp_mod->conf->first_draw_delay = cfdata->first_draw_delay; + if (_comp_mod->conf->shadow_style) + eina_stringshare_del(_comp_mod->conf->shadow_style); + _comp_mod->conf->shadow_style = NULL; + if (cfdata->shadow_style) + _comp_mod->conf->shadow_style = eina_stringshare_add(cfdata->shadow_style); + e_mod_comp_shadow_set(); + } + if ((cfdata->engine != _comp_mod->conf->engine) || + (cfdata->indirect != _comp_mod->conf->indirect) || + (cfdata->texture_from_pixmap != _comp_mod->conf->texture_from_pixmap) || + (cfdata->efl_sync != _comp_mod->conf->efl_sync) || + (cfdata->loose_sync != _comp_mod->conf->loose_sync) || + (cfdata->vsync != _comp_mod->conf->vsync)) + { + E_Action *a; + + _comp_mod->conf->engine = cfdata->engine; + _comp_mod->conf->indirect = cfdata->indirect; + _comp_mod->conf->texture_from_pixmap = cfdata->texture_from_pixmap; + _comp_mod->conf->efl_sync = cfdata->efl_sync; + _comp_mod->conf->loose_sync = cfdata->loose_sync; + _comp_mod->conf->vsync = cfdata->vsync; + + a = e_action_find("restart"); + if ((a) && (a->func.go)) a->func.go(NULL, NULL); +// e_mod_comp_shutdown(); +// e_mod_comp_init(); + } + e_config_save_queue(); + return 1; +} + +static Evas_Object * +_basic_create_widgets(E_Config_Dialog *cfd, + Evas *evas, + E_Config_Dialog_Data *cfdata) +{ + Evas_Object *ob,*ol, *ol2, *of, *otb, *oi, *orec0, *tab; + E_Radio_Group *rg; + + orec0 = evas_object_rectangle_add(evas); + evas_object_name_set(orec0, "style_shadows"); + + tab = e_widget_table_add(evas, 0); + evas_object_name_set(tab, "dia_table"); + + otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale); + + /////////////////////////////////////////// + ol = e_widget_list_add(evas, 0, 0); + + ob = e_widget_check_add(evas, _("Sync screen (VBlank)"), &(cfdata->vsync)); + e_widget_list_object_append(ol, ob, 1, 0, 0.5); + + ob = e_widget_check_add(evas, _("Smooth scaling"), &(cfdata->smooth_windows)); + e_widget_list_object_append(ol, ob, 1, 0, 0.5); + + ob = e_widget_check_add(evas, _("Don't composite fullscreen windows"), &(cfdata->nocomp_fs)); + e_widget_list_object_append(ol, ob, 1, 0, 0.5); + + of = e_widget_frametable_add(evas, _("Select default style"), 0); + e_widget_frametable_content_align_set(of, 0.5, 0.5); + oi = _style_selector(evas, &(cfdata->shadow_style)); + e_widget_frametable_object_append(of, oi, 0, 0, 1, 1, 1, 1, 1, 1); + e_widget_list_object_append(ol, of, 1, 1, 0.5); + + e_widget_toolbook_page_append(otb, NULL, _("General"), ol, 1, 1, 1, 1, 0.5, 0.0); + + /////////////////////////////////////////// + ol = e_widget_list_add(evas, 0, 0); + rg = e_widget_radio_group_new(&(cfdata->engine)); + ob = e_widget_radio_add(evas, _("Software"), ENGINE_SW, rg); + e_widget_list_object_append(ol, ob, 1, 1, 0.5); + if (!getenv("ECORE_X_NO_XLIB")) + { + if (ecore_evas_engine_type_supported_get(ECORE_EVAS_ENGINE_OPENGL_X11)) + { + ob = e_widget_radio_add(evas, _("OpenGL"), ENGINE_GL, rg); + e_widget_list_object_append(ol, ob, 1, 1, 0.5); + } + } + ob = e_widget_label_add(evas, _("To reset compositor:")); + e_widget_list_object_append(ol, ob, 1, 1, 0.5); + ob = e_widget_label_add(evas, _("Ctrl+Alt+Shift+Home")); + e_widget_list_object_append(ol, ob, 1, 1, 0.5); + + e_widget_toolbook_page_append(otb, NULL, _("Rendering"), ol, 0, 0, 0, 0, 0.5, 0.0); + + e_widget_toolbook_page_show(otb, 0); + + e_dialog_resizable_set(cfd->dia, 1); + + e_widget_table_object_append(tab, otb, 0, 0, 1, 1, 1, 1, 1, 1); + return tab; +} + +static int +_basic_apply_data(E_Config_Dialog *cfd __UNUSED__, + E_Config_Dialog_Data *cfdata) +{ + if ((cfdata->lock_fps != _comp_mod->conf->lock_fps) || (cfdata->smooth_windows != _comp_mod->conf->smooth_windows) || (cfdata->grab != _comp_mod->conf->grab) || (cfdata->keep_unmapped != _comp_mod->conf->keep_unmapped) || @@ -1440,7 +1595,6 @@ _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, } cfdata->match.changed = 0; } - _comp_mod->conf->use_shadow = cfdata->use_shadow; _comp_mod->conf->lock_fps = cfdata->lock_fps; _comp_mod->conf->smooth_windows = cfdata->smooth_windows; _comp_mod->conf->grab = cfdata->grab; diff --git a/src/modules/comp/shadow.edj b/src/modules/comp/shadow.edj deleted file mode 100644 index 31bfc910cebe5925e43aa9f7910491883d697842..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10801 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