enlightenment/src/modules/conf_menus/e_int_config_menus.c

396 lines
14 KiB
C

#include "e.h"
/* local structures */
struct _E_Config_Dialog_Data
{
int show_favs, show_apps, hide_icons;
int show_name, show_generic, show_comment;
int menu_gadcon_client_toplevel;
double scroll_speed, fast_mouse_move_threshhold;
double click_drag_timeout;
int autoscroll_margin, autoscroll_cursor_margin;
const char *default_system_menu;
};
/* local function prototypes */
static void *_create_data(E_Config_Dialog *cfd);
static void _fill_data(E_Config_Dialog_Data *cfdata);
static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static int _basic_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
E_Config_Dialog *
e_int_config_menus(Evas_Object *parent EINA_UNUSED, const char *params EINA_UNUSED)
{
E_Config_Dialog *cfd;
E_Config_Dialog_View *v;
if (e_config_dialog_find("E", "menus/menu_settings")) return NULL;
v = E_NEW(E_Config_Dialog_View, 1);
v->create_cfdata = _create_data;
v->free_cfdata = _free_data;
v->basic.create_widgets = _basic_create;
v->basic.apply_cfdata = _basic_apply;
v->basic.check_changed = _basic_check_changed;
cfd = e_config_dialog_new(NULL, _("Menu Settings"), "E", "menus/menu_settings",
"preferences-menus", 0, v, NULL);
return cfd;
}
/* local functions */
static void *
_create_data(E_Config_Dialog *cfd EINA_UNUSED)
{
E_Config_Dialog_Data *cfdata;
cfdata = E_NEW(E_Config_Dialog_Data, 1);
_fill_data(cfdata);
return cfdata;
}
static void
_fill_data(E_Config_Dialog_Data *cfdata EINA_UNUSED)
{
if (e_config->default_system_menu)
cfdata->default_system_menu =
eina_stringshare_add(e_config->default_system_menu);
else
cfdata->default_system_menu = NULL;
cfdata->show_favs = e_config->menu_favorites_show;
cfdata->show_apps = e_config->menu_apps_show;
cfdata->hide_icons = e_config->menu_icons_hide;
cfdata->show_name = e_config->menu_eap_name_show;
cfdata->show_generic = e_config->menu_eap_generic_show;
cfdata->show_comment = e_config->menu_eap_comment_show;
cfdata->menu_gadcon_client_toplevel = e_config->menu_gadcon_client_toplevel;
cfdata->scroll_speed = e_config->menus_scroll_speed;
cfdata->fast_mouse_move_threshhold =
e_config->menus_fast_mouse_move_threshhold;
cfdata->click_drag_timeout = e_config->menus_click_drag_timeout;
cfdata->autoscroll_margin = e_config->menu_autoscroll_margin;
cfdata->autoscroll_cursor_margin = e_config->menu_autoscroll_cursor_margin;
}
static void
_free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
{
if (cfdata->default_system_menu)
eina_stringshare_del(cfdata->default_system_menu);
E_FREE(cfdata);
}
static void
check_menu_dir(const char *dir, Eina_List **menus)
{
char buf[PATH_MAX], *file;
Eina_List *files;
snprintf(buf, sizeof(buf), "%s/menus", dir);
files = ecore_file_ls(buf);
EINA_LIST_FREE(files, file)
{
if (e_util_glob_match(file, "*.menu"))
{
snprintf(buf, sizeof(buf), "%s/menus/%s", dir, file);
*menus = eina_list_append(*menus, strdup(buf));
}
free(file);
}
}
void
get_menus(Eina_List **menus)
{
char buf[PATH_MAX];
const char *dirs[] =
{
"/etc/xdg",
"/usr/etc/xdg",
"/usr/local/etc/xdg",
"/usr/opt/etc/xdg",
"/usr/opt/xdg",
"/usr/local/opt/etc/xdg",
"/usr/local/opt/xdg",
"/opt/etc/xdg",
"/opt/xdg",
// FIXME: add more "known locations"
NULL
};
int i, newdir;
e_user_homedir_concat(buf, sizeof(buf), ".config");
check_menu_dir(buf, menus);
for (i = 0; dirs[i]; i++) check_menu_dir(dirs[i], menus);
newdir = 1;
snprintf(buf, sizeof(buf), "%s/etc/xdg", e_prefix_get());
for (i = 0; dirs[i]; i++)
{
if (!strcmp(dirs[i], buf))
{
newdir = 0;
break;
}
}
if (newdir) check_menu_dir(buf, menus);
}
static Evas_Object *
_create_menus_list(Evas *evas, E_Config_Dialog_Data *cfdata)
{
Eina_List *menus = NULL;
Evas_Object *ob;
char *file;
int sel = -1, i = 0;
get_menus(&menus);
ob = e_widget_ilist_add(evas, (40 * e_scale), (40 * e_scale),
&(cfdata->default_system_menu));
e_widget_size_min_set(ob, (100 * e_scale), (140 * e_scale));
e_widget_ilist_freeze(ob);
EINA_LIST_FREE(menus, file)
{
char buf[PATH_MAX], buf2[PATH_MAX], *p, *p2, *tlabel, *tdesc;
const char *label;
label = file;
tlabel = NULL;
tdesc = NULL;
e_user_homedir_concat(buf, sizeof(buf),
".config/menus/applications.menu");
snprintf(buf2, sizeof(buf2), "%s/etc/xdg/menus/e-applications.menu",
e_prefix_get());
if (!strcmp("/etc/xdg/menus/applications.menu", file))
{
label = _("System Default");
if (!cfdata->default_system_menu) sel = i;
}
else if (!strcmp(buf2, file))
{
label = _("Enlightenment Default");
if (cfdata->default_system_menu)
{
if (!strcmp(cfdata->default_system_menu, file)) sel = i;
}
}
else if (!strcmp(buf, file))
{
label = _("Personal Default");
if (cfdata->default_system_menu)
{
if (!strcmp(cfdata->default_system_menu, file)) sel = i;
}
}
else
{
p = strrchr(file, '/');
if (p)
{
p++;
p2 = strchr(p, '-');
if (!p2) p2 = strrchr(p, '.');
if (p2)
{
tlabel = malloc(p2 - p + 1);
if (tlabel)
{
eina_strlcpy(tlabel, p, p2 - p + 1);
tlabel[0] = toupper(tlabel[0]);
if (*p2 == '-')
{
p2++;
p = strrchr(p2, '.');
if (p)
{
tdesc = malloc(p - p2 + 1);
if (tdesc)
{
eina_strlcpy(tdesc, p2, p - p2 + 1);
tdesc[0] = toupper(tdesc[0]);
snprintf(buf, sizeof(buf), "%s (%s)", tlabel, tdesc);
}
else
snprintf(buf, sizeof(buf), "%s", tlabel);
}
else
snprintf(buf, sizeof(buf), "%s", tlabel);
}
else
snprintf(buf, sizeof(buf), "%s", tlabel);
label = buf;
}
}
else
label = p;
}
if (cfdata->default_system_menu)
{
if (!strcmp(cfdata->default_system_menu, file)) sel = i;
}
}
e_widget_ilist_append(ob, NULL, label, NULL, NULL, file);
free(tlabel);
free(tdesc);
free(file);
i++;
}
e_widget_ilist_go(ob);
e_widget_ilist_thaw(ob);
if (sel >= 0) e_widget_ilist_selected_set(ob, sel);
return ob;
}
static Evas_Object *
_basic_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
{
Evas_Object *otb, *ol, *of, *ow;
e_dialog_resizable_set(cfd->dia, 1);
otb = e_widget_toolbook_add(evas, (24 * e_scale), (24 * e_scale));
ol = e_widget_list_add(evas, 0, 0);
of = e_widget_framelist_add(evas, _("Main Menu"), 0);
ow = e_widget_check_add(evas, _("Favorites"), &(cfdata->show_favs));
e_widget_framelist_object_append(of, ow);
ow = e_widget_check_add(evas, _("Applications"), &(cfdata->show_apps));
e_widget_framelist_object_append(of, ow);
e_widget_list_object_append(ol, of, 1, 0, 0.5);
of = e_widget_framelist_add(evas, _("Applications Display"), 0);
ow = e_widget_check_add(evas, _("Name"), &(cfdata->show_name));
e_widget_framelist_object_append(of, ow);
ow = e_widget_check_add(evas, _("Generic"), &(cfdata->show_generic));
e_widget_framelist_object_append(of, ow);
ow = e_widget_check_add(evas, _("Comments"), &(cfdata->show_comment));
e_widget_framelist_object_append(of, ow);
e_widget_list_object_append(ol, of, 1, 0, 0.5);
of = e_widget_framelist_add(evas, _("Gadgets"), 0);
ow = e_widget_check_add(evas, _("Show gadget settings in top-level"), &(cfdata->menu_gadcon_client_toplevel));
e_widget_framelist_object_append(of, ow);
e_widget_list_object_append(ol, of, 1, 1, 0.5);
e_widget_toolbook_page_append(otb, NULL, _("Menus"), ol, 1, 1, 1, 0, 0.0, 0.0);
ol = e_widget_list_add(evas, 0, 0);
ow = _create_menus_list(evas, cfdata);
e_widget_list_object_append(ol, ow, 1, 1, 0.5);
e_widget_toolbook_page_append(otb, NULL, _("Applications"), ol, 1, 1, 1, 1, 0.0, 0.0);
ol = e_widget_list_add(evas, 0, 0);
ow = e_widget_label_add(evas, _("Margin"));
e_widget_list_object_append(ol, ow, 1, 0, 0.5);
ow = e_widget_slider_add(evas, 1, 0, _("%2.0f pixels"), 0, 50, 1, 0, NULL,
&(cfdata->autoscroll_margin), 100);
e_widget_list_object_append(ol, ow, 1, 0, 0.5);
ow = e_widget_label_add(evas, _("Cursor Margin"));
e_widget_list_object_append(ol, ow, 1, 0, 0.5);
ow = e_widget_slider_add(evas, 1, 0, _("%2.0f pixels"), 0, 50, 1, 0, NULL,
&(cfdata->autoscroll_cursor_margin), 100);
e_widget_list_object_append(ol, ow, 1, 0, 0.5);
e_widget_toolbook_page_append(otb, NULL, _("Autoscroll"), ol, 1, 1, 1, 0, 0.0, 0.0);
ol = e_widget_list_add(evas, 0, 0);
ow = e_widget_check_add(evas, _("Disable icons in menus"), &(cfdata->hide_icons));
e_widget_list_object_append(ol, ow, 1, 0, 0.5);
ow = e_widget_label_add(evas, _("Menu Scroll Speed"));
e_widget_list_object_append(ol, ow, 1, 0, 0.5);
ow = e_widget_slider_add(evas, 1, 0, _("%5.0f pixels/s"), 0, 20000, 100,
0, &(cfdata->scroll_speed), NULL, 100);
e_widget_list_object_append(ol, ow, 1, 0, 0.5);
ow = e_widget_label_add(evas, _("Fast Mouse Move Threshold"));
e_widget_list_object_append(ol, ow, 1, 0, 0.5);
ow = e_widget_slider_add(evas, 1, 0, _("%4.0f pixels/s"), 0, 2000, 10,
0, &(cfdata->fast_mouse_move_threshhold), NULL, 100);
e_widget_list_object_append(ol, ow, 1, 0, 0.5);
ow = e_widget_label_add(evas, _("Click Drag Timeout"));
e_widget_list_object_append(ol, ow, 1, 0, 0.5);
ow = e_widget_slider_add(evas, 1, 0, _("%2.2f s"), 0, 10, 0.25,
0, &(cfdata->click_drag_timeout), NULL, 100);
e_widget_list_object_append(ol, ow, 1, 0, 0.5);
e_widget_toolbook_page_append(otb, NULL, _("Miscellaneous"), ol, 1, 1, 1, 0, 0.0, 0.0);
e_widget_toolbook_page_show(otb, 0);
return otb;
}
static int
_basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
{
e_config->menu_favorites_show = cfdata->show_favs;
e_config->menu_apps_show = cfdata->show_apps;
e_config->menu_icons_hide = cfdata->hide_icons;
e_config->menu_eap_name_show = cfdata->show_name;
e_config->menu_eap_generic_show = cfdata->show_generic;
e_config->menu_eap_comment_show = cfdata->show_comment;
e_config->menu_gadcon_client_toplevel = cfdata->menu_gadcon_client_toplevel;
if (EINA_DBL_EQ(cfdata->scroll_speed, 0.0)) e_config->menus_scroll_speed = 1.0;
else e_config->menus_scroll_speed = cfdata->scroll_speed;
if (EINA_DBL_EQ(cfdata->fast_mouse_move_threshhold, 0.0))
e_config->menus_fast_mouse_move_threshhold = 1.0;
else
{
e_config->menus_fast_mouse_move_threshhold =
cfdata->fast_mouse_move_threshhold;
}
e_config->menus_click_drag_timeout = cfdata->click_drag_timeout;
e_config->menu_autoscroll_margin = cfdata->autoscroll_margin;
e_config->menu_autoscroll_cursor_margin = cfdata->autoscroll_cursor_margin;
if (cfdata->default_system_menu)
{
if (e_config->default_system_menu)
eina_stringshare_del(e_config->default_system_menu);
e_config->default_system_menu =
eina_stringshare_add(cfdata->default_system_menu);
}
else
{
if (e_config->default_system_menu)
eina_stringshare_del(e_config->default_system_menu);
e_config->default_system_menu = NULL;
}
e_config_save_queue();
return 1;
}
static int
_basic_check_changed(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
{
double scroll_speed, move_threshold;
if (EINA_DBL_EQ(cfdata->scroll_speed, 0.0))
scroll_speed = 1.0;
else
scroll_speed = cfdata->scroll_speed;
if (EINA_DBL_EQ(cfdata->fast_mouse_move_threshhold, 0.0))
move_threshold = 1.0;
else
move_threshold = cfdata->fast_mouse_move_threshhold;
return ((e_config->menu_favorites_show != cfdata->show_favs) ||
(e_config->menu_apps_show != cfdata->show_apps) ||
(e_config->menu_icons_hide != !!cfdata->hide_icons) ||
(e_config->menu_eap_name_show != cfdata->show_name) ||
(e_config->menu_eap_generic_show != cfdata->show_generic) ||
(e_config->menu_eap_comment_show != cfdata->show_comment) ||
(!EINA_DBL_EQ(e_config->menus_click_drag_timeout, cfdata->click_drag_timeout)) ||
(e_config->menu_autoscroll_margin != cfdata->autoscroll_margin) ||
(e_config->menu_autoscroll_cursor_margin != cfdata->autoscroll_cursor_margin) ||
(!EINA_DBL_EQ(e_config->menus_scroll_speed, scroll_speed)) ||
(!EINA_DBL_EQ(e_config->menus_fast_mouse_move_threshhold, move_threshold)) ||
(e_config->menu_gadcon_client_toplevel != cfdata->menu_gadcon_client_toplevel) ||
(!((cfdata->default_system_menu) &&
(e_config->default_system_menu) &&
(!strcmp(cfdata->default_system_menu,
e_config->default_system_menu)))));
}