From 29b6afd0962319c21ea450224a0381ee90730a90 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Fri, 29 Dec 2006 02:56:26 +0000 Subject: [PATCH] 1. remove ld_lib_path from all things e17 executes EXCEPT its own specific tools. 2. custom screensaver patches SVN revision: 27628 --- TODO | 9 ++-- src/bin/e_actions.c | 4 +- src/bin/e_config.c | 12 ++++- src/bin/e_config.h | 6 ++- src/bin/e_desklock.c | 70 ++++++++++++++++++++++++++--- src/bin/e_int_config_desklock.c | 62 +++++++++++++++++++------ src/bin/e_intl.c | 2 + src/bin/e_ipc_handlers.h | 80 +++++++++++++++++++++++++++++++++ src/bin/e_ipc_handlers_list.h | 8 ++++ src/bin/e_manager.c | 3 +- src/bin/e_utils.c | 28 ++++++++++++ src/bin/e_utils.h | 2 + 12 files changed, 256 insertions(+), 30 deletions(-) diff --git a/TODO b/TODO index 417fe9a37..19135b894 100644 --- a/TODO +++ b/TODO @@ -20,7 +20,6 @@ Some of the things (in very short form) that need to be done to E17... ------------------------------------------------------------------------------- * fm2 needs a right-click file properties dialog -* fm2 needs a way to set custom backgrounds and handle scrolling * fm2 needs to display symlink info on files somehow * fm2 needs to display more than 1 file being dragged (if more than 1 is being dragged) @@ -29,13 +28,14 @@ Some of the things (in very short form) that need to be done to E17... * fm2 needs a way to use custom icons per dir/file * fm2 needs a way to bypass thumb gen anim on just a unrealize/realize as well as change state instantly if it already was selected -* fm2 needs a mime filter +* fm2 needs to not unrealize then re-realize on resort/arraneg - keep objects + around. +* fm2 needs a mime/extension/glob filter * fm2 will pop up tonnes of error dialogs if u try delete a lot of files in a tree you can't delete - fix to make this a dialog with a log etc. * dnd needs to do xdnd properly. * fm2 needs icon views (auto-arrange, snap to grid and free placement), for fwin windows and the desktop -* middle mouse on gadgets as a quick move/resize thing? * language packs: need to have a tool to load/setup a language pack (which means .mo compiled files from a .po, an optional font and a config file that specifies the locale and font) and then install the font(s) either as a user @@ -77,8 +77,6 @@ Some of the things (in very short form) that need to be done to E17... * need to audit, namespace and expand text and color classes * need to specify what is NEEDED from a theme, what is optional (in terms of parts, groups and signals). etc. -* winlist should support place for window "screenshot" in list as well as - app icon * winlist could divide windows up into blocks - sub-lists within a container per desktop (with stick windows considered to live on the "current" desk when winlist starts) @@ -91,7 +89,6 @@ Some of the things (in very short form) that need to be done to E17... * desktop flip animations need to allow control over accel/decel and have a better ui - add wobble and controls etc. etc. * internal windows (config dialogs, etc) should re-open after a restart -* .order file handling needs some going over, there is at least one bug. ]]] [[[ diff --git a/src/bin/e_actions.c b/src/bin/e_actions.c index ff23b839a..4b5698c1e 100644 --- a/src/bin/e_actions.c +++ b/src/bin/e_actions.c @@ -1225,8 +1225,10 @@ ACT_FN_GO(exec) if (params) { Ecore_Exe *exe; - + + e_util_library_path_strip(); exe = ecore_exe_run(params, NULL); + e_util_library_path_restore(); e_exehist_add("action/exec", params); if (exe) ecore_exe_free(exe); } diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 5681cd746..95d04e6fc 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -478,6 +478,8 @@ e_config_init(void) E_CONFIG_VAL(D, T, desklock_use_timeout, INT); E_CONFIG_VAL(D, T, desklock_timeout, DOUBLE); E_CONFIG_VAL(D, T, desklock_disable_screensaver, INT); + E_CONFIG_VAL(D, T, desklock_use_custom_screensaver, INT); + E_CONFIG_VAL(D, T, desklock_custom_screensaver_cmd, STR); E_CONFIG_VAL(D, T, display_res_restore, INT); E_CONFIG_VAL(D, T, display_res_width, INT); E_CONFIG_VAL(D, T, display_res_height, INT); @@ -1282,6 +1284,12 @@ e_config_init(void) e_config->remember_internal_windows = 1; IFCFGEND; + + IFCFG(0x00106); + e_config->desklock_use_custom_screensaver = 0; + e_config->desklock_custom_screensaver_cmd = NULL; + IFCFGEND; + #if 0 /* example of new config */ IFCFG(0x0090); /* the version # where this value(s) was introduced */ e_config->new_value = 10; /* set the value(s) */ @@ -1366,8 +1374,9 @@ e_config_init(void) E_CONFIG_LIMIT(e_config->desklock_login_box_zone, -2, 1000); E_CONFIG_LIMIT(e_config->desklock_autolock, 0, 1); E_CONFIG_LIMIT(e_config->desklock_use_timeout, 0, 1); - E_CONFIG_LIMIT(e_config->desklock_timeout, 1.0, 600.0); + E_CONFIG_LIMIT(e_config->desklock_timeout, 1.0, 5400.0); E_CONFIG_LIMIT(e_config->desklock_disable_screensaver, 0, 1); + E_CONFIG_LIMIT(e_config->desklock_use_custom_screensaver, 0, 1); E_CONFIG_LIMIT(e_config->display_res_restore, 0, 1); E_CONFIG_LIMIT(e_config->display_res_width, 1, 8192); E_CONFIG_LIMIT(e_config->display_res_height, 1, 8192); @@ -1966,6 +1975,7 @@ _e_config_free(void) if (e_config->wallpaper_import_last_dev) evas_stringshare_del(e_config->wallpaper_import_last_dev); if (e_config->wallpaper_import_last_path) evas_stringshare_del(e_config->wallpaper_import_last_path); if (e_config->theme_default_border_style) evas_stringshare_del(e_config->theme_default_border_style); + if (e_config->desklock_custom_screensaver_cmd) evas_stringshare_del(e_config->desklock_custom_screensaver_cmd); E_FREE(e_config); } } diff --git a/src/bin/e_config.h b/src/bin/e_config.h index f54b05b6b..04851eb87 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -52,7 +52,7 @@ typedef Eet_Data_Descriptor E_Config_DD; /* increment this whenever a new set of config values are added but the users * config doesn't need to be wiped - simply new values need to be put in */ -#define E_CONFIG_FILE_GENERATION 0x0105 +#define E_CONFIG_FILE_GENERATION 0x0106 #define E_CONFIG_FILE_VERSION ((E_CONFIG_FILE_EPOCH << 16) | E_CONFIG_FILE_GENERATION) #define E_EVAS_ENGINE_DEFAULT 0 @@ -231,7 +231,9 @@ struct _E_Config int desklock_use_timeout; // GUI double desklock_timeout; // GUI int desklock_disable_screensaver; // GUI - + int desklock_use_custom_screensaver; //GUI + const char *desklock_custom_screensaver_cmd; // GUI + int display_res_restore; // GUI int display_res_width; // GUI int display_res_height; // GUI diff --git a/src/bin/e_desklock.c b/src/bin/e_desklock.c index 21a35863b..1cacf9906 100644 --- a/src/bin/e_desklock.c +++ b/src/bin/e_desklock.c @@ -49,6 +49,8 @@ static E_Zone *last_active_zone = NULL; static Ecore_Event_Handler *_e_desklock_exit_handler = NULL; static pid_t _e_desklock_child_pid = -1; #endif +static Ecore_Exe *_e_custom_saver_exe = NULL; +static Ecore_Event_Handler *_e_custom_saver_exe_handler = NULL; /***********************************************************************/ @@ -57,6 +59,7 @@ static int _e_desklock_cb_mouse_down(void *data, int type, void *event); static int _e_desklock_cb_mouse_up(void *data, int type, void *event); static int _e_desklock_cb_mouse_wheel(void *data, int type, void *event); static int _e_desklock_cb_mouse_move(void *data, int type, void *event); +static int _e_desklock_cb_custom_saver_exit(void *data, int type, void *event); static void _e_desklock_passwd_update(); static void _e_desklock_backspace(); @@ -77,17 +80,25 @@ static char *_desklock_auth_get_current_host(void); EAPI int e_desklock_init(void) { + if (e_config->desklock_disable_screensaver) ecore_x_screensaver_timeout_set(0); else { if (e_config->desklock_use_timeout) - ecore_x_screensaver_timeout_set(e_config->desklock_timeout); + ecore_x_screensaver_timeout_set(e_config->desklock_timeout); } - + + /* + * Effectively hide the X screensaver yet allow + * it to generate the timer events for us. + */ + ecore_x_screensaver_blank_set(!e_config->desklock_use_custom_screensaver); + ecore_x_screensaver_expose_set(!e_config->desklock_use_custom_screensaver); + if (e_config->desklock_background) e_filereg_register(e_config->desklock_background); - + return 1; } @@ -110,9 +121,23 @@ e_desklock_show(void) E_Zone *current_zone; int zone_counter; int total_zone_num; - - if (edd) return 0; + + if (_e_custom_saver_exe) return 0; + + if (e_config->desklock_use_custom_screensaver) + { + _e_custom_saver_exe_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, + _e_desklock_cb_custom_saver_exit, + NULL); + e_util_library_path_strip(); + _e_custom_saver_exe = ecore_exe_run(e_config->desklock_custom_screensaver_cmd, NULL); + e_util_library_path_restore(); + return 1; + } + + if (edd) return 0; + #ifdef HAVE_PAM if (e_config->desklock_auth_method == 1) { @@ -323,8 +348,14 @@ e_desklock_hide(void) { E_Desklock_Popup_Data *edp; - if (!edd) return; + if ((!edd) && (!_e_custom_saver_exe)) return; + if (e_config->desklock_use_custom_screensaver) + { + _e_custom_saver_exe = NULL; + return; + } + if (edd->elock_grab_break_wnd) ecore_x_window_show(edd->elock_grab_break_wnd); while (edd->elock_wnd_list) @@ -735,3 +766,30 @@ _desklock_auth_get_current_host(void) return strdup("localhost"); } #endif + +static int +_e_desklock_cb_custom_saver_exit(void *data, int type, void *event) +{ + Ecore_Exe_Event_Del *ev; + + ev = event; + if (ev->exe != _e_custom_saver_exe) return 1; + + if (ev->exit_code != 0) + { + /* do something profound here... like notify someone */ + } + + /* + * Miserable HACK alert!!! + * Seems I must reset this. Some reason yet unknown, my + * intended values are getting reset!?! + */ + ecore_x_screensaver_timeout_set(e_config->desklock_timeout); + ecore_x_screensaver_blank_set(!e_config->desklock_use_custom_screensaver); + ecore_x_screensaver_expose_set(!e_config->desklock_use_custom_screensaver); + + e_desklock_hide(); + + return 0; +} diff --git a/src/bin/e_int_config_desklock.c b/src/bin/e_int_config_desklock.c index 7cd0b5c1d..479282d97 100644 --- a/src/bin/e_int_config_desklock.c +++ b/src/bin/e_int_config_desklock.c @@ -14,7 +14,6 @@ #define DEF_DESKLOCK_BACKGROUND "theme_desklock_background" #define DEF_THEME_BACKGROUND "theme_background" - static void *_create_data(E_Config_Dialog *cfd); static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); @@ -61,6 +60,9 @@ struct _E_Config_Dialog_Data int specific_lb_zone; // local variable int specific_lb_zone_backup; // used to have smart iface + int use_custom_screensaver; + char *custom_screensaver_cmd; + int zone_count; // local variable; int bg_mode; // config @@ -290,7 +292,7 @@ _fill_data(E_Config_Dialog_Data *cfdata) cfdata->autolock = e_config->desklock_autolock; cfdata->use_timeout = e_config->desklock_use_timeout; - cfdata->timeout = e_config->desklock_timeout; + cfdata->timeout = e_config->desklock_timeout / 60; /* should be taken from e_config */ //cfdata->login_box_on_zone = -1; @@ -347,6 +349,10 @@ _fill_data(E_Config_Dialog_Data *cfdata) cfdata->auth_method = e_config->desklock_auth_method; #endif + cfdata->use_custom_screensaver = e_config->desklock_use_custom_screensaver; + if (e_config->desklock_custom_screensaver_cmd) + cfdata->custom_screensaver_cmd = strdup(e_config->desklock_custom_screensaver_cmd); + //vertical_lb_align = e_config->desklock_login } @@ -385,14 +391,16 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) e_config->desklock_personal_passwd = evas_stringshare_add(cfdata->desklock_passwd_cp); e_config->desklock_autolock = cfdata->autolock; e_config->desklock_use_timeout = cfdata->use_timeout; - e_config->desklock_timeout = cfdata->timeout; + e_config->desklock_timeout = cfdata->timeout * 60; #ifdef HAVE_PAM e_config->desklock_auth_method = cfdata->auth_method; #endif if (e_config->desklock_use_timeout) - { - ecore_x_screensaver_timeout_set(e_config->desklock_timeout); - } + ecore_x_screensaver_timeout_set(e_config->desklock_timeout); + + ecore_x_screensaver_blank_set(!e_config->desklock_use_custom_screensaver); + ecore_x_screensaver_expose_set(!e_config->desklock_use_custom_screensaver); + e_config_save_queue(); return 1; } @@ -417,8 +425,8 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf ob = e_widget_label_add(evas, _("Time until screensaver starts")); e_widget_disabled_set(ob, !ecore_x_screensaver_event_available_get()); e_widget_framelist_object_append(of, ob); - ob = e_widget_slider_add(evas, 1, 0, _("%1.0f seconds"), - 1.0, 600.0, + ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), + 1.0, 90.0, 1.0, 0, &(cfdata->timeout), NULL, 200); e_widget_framelist_object_append(of, ob); @@ -467,14 +475,25 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) e_config->desklock_autolock = cfdata->autolock; e_config->desklock_use_timeout = cfdata->use_timeout; - e_config->desklock_timeout = cfdata->timeout; + e_config->desklock_timeout = cfdata->timeout * 60; #ifdef HAVE_PAM e_config->desklock_auth_method = cfdata->auth_method; #endif if (e_config->desklock_use_timeout) - ecore_x_screensaver_timeout_set(e_config->desklock_timeout); + ecore_x_screensaver_timeout_set(e_config->desklock_timeout); + + e_config->desklock_use_custom_screensaver = cfdata->use_custom_screensaver; + if (cfdata->custom_screensaver_cmd) + { + if (e_config->desklock_custom_screensaver_cmd) + evas_stringshare_del(e_config->desklock_custom_screensaver_cmd); + e_config->desklock_custom_screensaver_cmd = evas_stringshare_add(cfdata->custom_screensaver_cmd); + } + ecore_x_screensaver_blank_set(!e_config->desklock_use_custom_screensaver); + ecore_x_screensaver_expose_set(!e_config->desklock_use_custom_screensaver); + e_config_save_queue(); return 1; } @@ -713,7 +732,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data e_widget_disabled_set(of, !ecore_x_screensaver_event_available_get()); - ob = e_widget_check_add(evas, _("Enable screensaver"), &(cfdata->use_timeout)); + ob = e_widget_check_add(evas, _("Enable X screensaver"), &(cfdata->use_timeout)); e_widget_disabled_set(ob, !ecore_x_screensaver_event_available_get()); e_widget_framelist_object_append(of, ob); @@ -724,8 +743,8 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data ob = e_widget_label_add(evas, _("Time until screensaver starts")); e_widget_disabled_set(ob, !ecore_x_screensaver_event_available_get()); e_widget_framelist_object_append(of, ob); - ob = e_widget_slider_add(evas, 1, 0, _("%1.0f seconds"), - 1.0, 600.0, + ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), + 1.0, 90.0, 1.0, 0, &(cfdata->timeout), NULL, 100); e_widget_framelist_object_append(of, ob); @@ -734,6 +753,23 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data #else e_widget_table_object_append(ot, of, 1, 2, 1, 1 ,1 ,1 ,1 ,1); #endif + + /* + * Allow Custom Screen Saver + * Useful, for example, for those of us who prefer + * to use things like xscreensaver, kscreesaver, etc... + */ + of = e_widget_framelist_add(evas, _("Custom Screensaver"), 0); + ob = e_widget_check_add(evas, _("Use custom screensaver/desklock"), + &(cfdata->use_custom_screensaver)); + e_widget_framelist_object_append(of, ob); + ob = e_widget_entry_add(evas, &(cfdata->custom_screensaver_cmd)); + e_widget_framelist_object_append(of, ob); +#ifdef HAVE_PAM + e_widget_table_object_append(ot, of, 0, 4, 2, 1, 1, 1, 1, 1); +#else + e_widget_table_object_append(ot, of, 0, 4, 2, 1, 1, 1, 1, 1); +#endif e_dialog_resizable_set(cfd->dia, 0); return ot; diff --git a/src/bin/e_intl.c b/src/bin/e_intl.c index 9ad9d7007..76f42d5b2 100644 --- a/src/bin/e_intl.c +++ b/src/bin/e_intl.c @@ -352,7 +352,9 @@ e_intl_input_method_set(const char *imc_path) if (E_EXE_IS_VALID(imc->e_im_exec)) { + e_util_library_path_strip(); _e_intl_input_method_exec = ecore_exe_run(imc->e_im_exec, NULL); + e_util_library_path_restore(); ecore_exe_tag_set(_e_intl_input_method_exec,"E/im_exec"); if ( !_e_intl_input_method_exec || diff --git a/src/bin/e_ipc_handlers.h b/src/bin/e_ipc_handlers.h index ee11e13db..b2bbc064e 100644 --- a/src/bin/e_ipc_handlers.h +++ b/src/bin/e_ipc_handlers.h @@ -7816,3 +7816,83 @@ break; #elif (TYPE == E_REMOTE_IN) #endif #undef HDL + +/****************************************************************************/ +#define HDL E_IPC_OP_DESKLOCK_USE_CUSTOM_SCREENSAVER_SET +#if (TYPE == E_REMOTE_OPTIONS) + OP("-desklock-use-custom-screensaver-set", 1, "Set whether a custom screensaver will be utilized", 0, HDL) +#elif (TYPE == E_REMOTE_OUT) + REQ_INT(atoi(params[0]), HDL); +#elif (TYPE == E_WM_IN) + START_INT(policy, HDL); + e_config->desklock_use_custom_screensaver = policy; + E_CONFIG_LIMIT(e_config->desklock_use_custom_screensaver, 0, 1); + SAVE; + END_INT; +#elif (TYPE == E_REMOTE_IN) +#endif +#undef HDL + +/****************************************************************************/ +#define HDL E_IPC_OP_DESKLOCK_USE_CUSTOM_SCREENSAVER_GET +#if (TYPE == E_REMOTE_OPTIONS) + OP("-desklock-use-custom-screensaver-get", 0, "Get whether a custom screen saver is being used", 1, HDL) +#elif (TYPE == E_REMOTE_OUT) + REQ_NULL(HDL); +#elif (TYPE == E_WM_IN) + SEND_INT(e_config->desklock_use_custom_screensaver, E_IPC_OP_DESKLOCK_USE_CUSTOM_SCREENSAVER_GET_REPLY, HDL); +#elif (TYPE == E_REMOTE_IN) +#endif +#undef HDL + +/****************************************************************************/ +#define HDL E_IPC_OP_DESKLOCK_USE_CUSTOM_SCREENSAVER_GET_REPLY +#if (TYPE == E_REMOTE_OPTIONS) +#elif (TYPE == E_REMOTE_OUT) +#elif (TYPE == E_WM_IN) +#elif (TYPE == E_REMOTE_IN) + START_INT(val, HDL); + printf("REPLY: POLICY=%d\n", val); + END_INT; +#endif +#undef HDL + +/****************************************************************************/ +#define HDL E_IPC_OP_DESKLOCK_CUSTOM_SCREENSAVER_CMD_SET +#if (TYPE == E_REMOTE_OPTIONS) + OP("-desklock-custom-screensaver-cmd-set", 1, "Set the current custom screensaver command to OPT1", 0, HDL) +#elif (TYPE == E_REMOTE_OUT) + REQ_STRING(params[0], HDL); +#elif (TYPE == E_WM_IN) + STRING(s, HDL); + if (e_config->desklock_custom_screensaver_cmd) + evas_stringshare_del(e_config->desklock_custom_screensaver_cmd); + e_config->desklock_custom_screensaver_cmd = evas_stringshare_add(s); + END_STRING(s); +#elif (TYPE == E_REMOTE_IN) +#endif +#undef HDL + +/****************************************************************************/ +#define HDL E_IPC_OP_DESKLOCK_CUSTOM_SCREENSAVER_CMD_GET +#if (TYPE == E_REMOTE_OPTIONS) + OP("-desklock-custom-screensaver-cmd-get", 0, "Get the current custom screensaver command", 1, HDL) +#elif (TYPE == E_REMOTE_OUT) + REQ_NULL(HDL); +#elif (TYPE == E_WM_IN) + SEND_STRING(e_config->desklock_custom_screensaver_cmd, E_IPC_OP_PROFILE_GET_REPLY, HDL); +#elif (TYPE == E_REMOTE_IN) +#endif +#undef HDL + +/****************************************************************************/ +#define HDL E_IPC_OP_DESKLOCK_CUSTOM_SCREENSAVER_CMD_GET_REPLY +#if (TYPE == E_REMOTE_OPTIONS) +#elif (TYPE == E_REMOTE_OUT) +#elif (TYPE == E_WM_IN) +#elif (TYPE == E_REMOTE_IN) + STRING(s, HDL); + printf("REPLY: \"%s\"\n", s); + END_STRING(s); +#endif +#undef HDL diff --git a/src/bin/e_ipc_handlers_list.h b/src/bin/e_ipc_handlers_list.h index 1852bdb26..05ddd8b3f 100644 --- a/src/bin/e_ipc_handlers_list.h +++ b/src/bin/e_ipc_handlers_list.h @@ -413,3 +413,11 @@ #define E_IPC_OP_HIBERNATE 376 #define E_IPC_OP_REBOOT 377 #define E_IPC_OP_SUSPEND 378 + +#define E_IPC_OP_DESKLOCK_USE_CUSTOM_SCREENSAVER_SET 379 +#define E_IPC_OP_DESKLOCK_USE_CUSTOM_SCREENSAVER_GET 380 +#define E_IPC_OP_DESKLOCK_USE_CUSTOM_SCREENSAVER_GET_REPLY 381 +#define E_IPC_OP_DESKLOCK_CUSTOM_SCREENSAVER_CMD_SET 382 +#define E_IPC_OP_DESKLOCK_CUSTOM_SCREENSAVER_CMD_GET 383 +#define E_IPC_OP_DESKLOCK_CUSTOM_SCREENSAVER_CMD_GET_REPLY 384 + diff --git a/src/bin/e_manager.c b/src/bin/e_manager.c index b6ab1b2ba..54cd94f3d 100644 --- a/src/bin/e_manager.c +++ b/src/bin/e_manager.c @@ -754,7 +754,8 @@ _e_manager_cb_screensaver_notify(void *data, int ev_type __UNUSED__, void *ev) if (e->on) { - if (e_config->desklock_autolock) e_desklock_show(); + if ((e_config->desklock_autolock) || (e_config->desklock_use_custom_screensaver)) + e_desklock_show(); } return 1; } diff --git a/src/bin/e_utils.c b/src/bin/e_utils.c index 7d7a61254..e4926a545 100644 --- a/src/bin/e_utils.c +++ b/src/bin/e_utils.c @@ -229,7 +229,9 @@ e_util_head_exec(int head, const char *cmd) strcpy(buf, penv_display); ok = 1; + e_util_library_path_strip(); exe = ecore_exe_run(cmd, NULL); + e_util_library_path_restore(); if (!exe) { e_util_dialog_show(_("Run Error"), @@ -780,6 +782,32 @@ e_util_file_time_get(time_t ftime) return s; } +static char *prev_ld_library_path = NULL; + +EAPI void +e_util_library_path_strip(void) +{ + char *p, *p2; + + p = getenv("LD_LIBRARY_PATH"); + E_FREE(prev_ld_library_path); + if (p) + { + prev_ld_library_path = strdup(p); + p2 = strchr(p, ':'); + if (p2) p2++; + e_util_env_set("LD_LIBRARY_PATH", p2); + } +} + +EAPI void +e_util_library_path_restore(void) +{ + if (!prev_ld_library_path) return; + e_util_env_set("LD_LIBRARY_PATH", prev_ld_library_path); + E_FREE(prev_ld_library_path); +} + /* local subsystem functions */ static void _e_util_container_fake_mouse_up_cb(void *data) diff --git a/src/bin/e_utils.h b/src/bin/e_utils.h index 647b61519..41704cf1d 100644 --- a/src/bin/e_utils.h +++ b/src/bin/e_utils.h @@ -47,6 +47,8 @@ EAPI int e_util_icon_save(Ecore_X_Icon *icon, const char *filename); EAPI char *e_util_shell_env_path_eval(char *path); EAPI char *e_util_size_string_get(off_t size); EAPI char *e_util_file_time_get(time_t ftime); +EAPI void e_util_library_path_strip(void); +EAPI void e_util_library_path_restore(void); #endif #endif