/* * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #include "e.h" #include "config.h" typedef struct _Main_Data Main_Data; struct _Main_Data { E_Menu *menu; E_Menu *apps; E_Menu *desktops; E_Menu *clients; E_Menu *modules; E_Menu *gadgets; E_Menu *themes; E_Menu *config; E_Menu *lost_clients; }; /* local subsystem functions */ static void _e_int_menus_quit (void); static void _e_int_menus_quit_cb (void *data); static void _e_int_menus_main_del_hook (void *obj); static void _e_int_menus_main_about (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_main_run (void *data, E_Menu *m, E_Menu_Item*mi); static void _e_int_menus_main_restart (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_main_exit (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_apps_scan (E_Menu *m); static void _e_int_menus_apps_start (void *data, E_Menu *m); static void _e_int_menus_apps_del_hook (void *obj); static void _e_int_menus_apps_free_hook (void *obj); static void _e_int_menus_apps_run (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_main_fm(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_config_pre_cb (void *data, E_Menu *m); static void _e_int_menus_config_free_hook (void *obj); static void _e_int_menus_config_item_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_config_generic_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_clients_pre_cb (void *data, E_Menu *m); static void _e_int_menus_clients_free_hook (void *obj); static void _e_int_menus_clients_item_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_clients_cleanup_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_desktops_pre_cb (void *data, E_Menu *m); static void _e_int_menus_desktops_item_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_desktops_row_add_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_desktops_row_del_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_desktops_col_add_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_desktops_col_del_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_gadgets_pre_cb (void *data, E_Menu *m); static void _e_int_menus_gadgets_edit_mode_cb(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_themes_pre_cb (void *data, E_Menu *m); static void _e_int_menus_themes_edit_mode_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_themes_about (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_lost_clients_pre_cb (void *data, E_Menu *m); static void _e_int_menus_lost_clients_free_hook (void *obj); static void _e_int_menus_lost_clients_item_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_augmentation_add (E_Menu *m, Evas_List *augmentation); static void _e_int_menus_augmentation_del (E_Menu *m, Evas_List *augmentation); /* local subsystem globals */ static Ecore_Job *_e_int_menus_quit_job = NULL; static Evas_Hash *_e_int_menus_augmentation = NULL; /* externally accessible functions */ E_Menu * e_int_menus_main_new(void) { E_Menu *m, *subm; E_Menu_Item *mi; Main_Data *dat; dat = calloc(1, sizeof(Main_Data)); m = e_menu_new(); dat->menu = m; e_object_data_set(E_OBJECT(m), dat); e_object_del_attach_func_set(E_OBJECT(m), _e_int_menus_main_del_hook); subm = e_int_menus_favorite_apps_new(); dat->apps = subm; mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Favorite Applications")); e_util_menu_item_edje_icon_set(mi, "enlightenment/favorites"); e_menu_item_submenu_set(mi, subm); mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); subm = e_module_menu_new(); dat->modules = subm; mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Modules")); e_util_menu_item_edje_icon_set(mi, "enlightenment/modules"); e_menu_item_submenu_set(mi, subm); subm = e_int_menus_desktops_new(); dat->desktops = subm; mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Desktops")); e_util_menu_item_edje_icon_set(mi, "enlightenment/desktops"); e_menu_item_submenu_set(mi, subm); subm = e_int_menus_clients_new(); dat->clients = subm; mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Windows")); e_util_menu_item_edje_icon_set(mi, "enlightenment/windows"); e_menu_item_submenu_set(mi, subm); subm = e_int_menus_lost_clients_new(); dat->lost_clients = subm; mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Lost Windows")); e_util_menu_item_edje_icon_set(mi, "enlightenment/lost_windows"); e_menu_item_submenu_set(mi, subm); subm = e_int_menus_gadgets_new(); dat->gadgets = subm; mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Gadgets")); e_util_menu_item_edje_icon_set(mi, "enlightenment/gadgets"); e_menu_item_submenu_set(mi, subm); subm = e_int_menus_themes_new(); dat->themes = subm; mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Themes")); e_util_menu_item_edje_icon_set(mi, "enlightenment/themes"); e_menu_item_submenu_set(mi, subm); mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("About Enlightenment")); e_util_menu_item_edje_icon_set(mi, "enlightenment/e"); e_menu_item_callback_set(mi, _e_int_menus_main_about, NULL); if (ecore_file_app_installed("exige")) { mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Run Command")); e_util_menu_item_edje_icon_set(mi, "enlightenment/run"); e_menu_item_callback_set(mi, _e_int_menus_main_run, NULL); } mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Files")); e_util_menu_item_edje_icon_set(mi, "enlightenment/fileman"); e_menu_item_callback_set(mi, _e_int_menus_main_fm, NULL); subm = e_int_menus_config_new(); dat->config = subm; mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Configuration")); e_util_menu_item_edje_icon_set(mi, "enlightenment/configuration"); e_menu_item_submenu_set(mi, subm); mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Restart Enlightenment")); e_util_menu_item_edje_icon_set(mi, "enlightenment/reset"); e_menu_item_callback_set(mi, _e_int_menus_main_restart, NULL); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Exit Enlightenment")); e_util_menu_item_edje_icon_set(mi, "enlightenment/exit"); e_menu_item_callback_set(mi, _e_int_menus_main_exit, NULL); return m; } E_Menu * e_int_menus_apps_new(char *dir) { E_Menu *m; E_App *a; m = e_menu_new(); a = e_app_new(dir, 0); e_object_data_set(E_OBJECT(m), a); e_menu_pre_activate_callback_set(m, _e_int_menus_apps_start, NULL); e_object_del_attach_func_set(E_OBJECT(m), _e_int_menus_apps_del_hook); e_object_free_attach_func_set(E_OBJECT(m), _e_int_menus_apps_free_hook); return m; } E_Menu * e_int_menus_desktops_new(void) { E_Menu *m; m = e_menu_new(); e_menu_pre_activate_callback_set(m, _e_int_menus_desktops_pre_cb, NULL); return m; } E_Menu * e_int_menus_favorite_apps_new(void) { E_Menu *m; char buf[4096]; char *homedir; homedir = e_user_homedir_get(); if (homedir) { snprintf(buf, sizeof(buf), "%s/.e/e/applications/favorite", homedir); m = e_int_menus_apps_new(buf); free(homedir); return m; } return NULL; } E_Menu * e_int_menus_config_new(void) { E_Menu *m; m = e_menu_new(); e_menu_pre_activate_callback_set(m, _e_int_menus_config_pre_cb, NULL); return m; } E_Menu * e_int_menus_clients_new(void) { E_Menu *m; m = e_menu_new(); e_menu_pre_activate_callback_set(m, _e_int_menus_clients_pre_cb, NULL); return m; } E_Menu * e_int_menus_gadgets_new(void) { E_Menu *m; m = e_menu_new(); e_menu_pre_activate_callback_set(m, _e_int_menus_gadgets_pre_cb, NULL); return m; } E_Menu * e_int_menus_themes_new(void) { E_Menu *m; m = e_menu_new(); e_menu_pre_activate_callback_set(m, _e_int_menus_themes_pre_cb, NULL); return m; } E_Menu * e_int_menus_lost_clients_new(void) { E_Menu *m; m = e_menu_new(); e_menu_pre_activate_callback_set(m, _e_int_menus_lost_clients_pre_cb, NULL); return m; } E_Int_Menu_Augmentation * e_int_menus_menu_augmentation_add(const char *menu, void (*func_add) (void *data, E_Menu *m), void *data_add, void (*func_del) (void *data, E_Menu *m), void *data_del) { E_Int_Menu_Augmentation *maug; Evas_List *l; maug = E_NEW(E_Int_Menu_Augmentation, 1); if (!maug) return NULL; maug->add.func = func_add; maug->add.data = data_add; maug->del.func = func_del; maug->del.data = data_del; l = evas_hash_find(_e_int_menus_augmentation, menu); l = evas_list_append(l, maug); _e_int_menus_augmentation = evas_hash_add(_e_int_menus_augmentation, menu, l); return maug; } void e_int_menus_menu_augmentation_del(const char *menu, E_Int_Menu_Augmentation *maug) { Evas_List *l; l = evas_hash_find(_e_int_menus_augmentation, menu); if (l) { /* * We should always add the list to the hash, in case the list * becomes empty, or the first element is removed. */ _e_int_menus_augmentation = evas_hash_del(_e_int_menus_augmentation, menu, l); l = evas_list_remove(l, maug); if (l) _e_int_menus_augmentation = evas_hash_add(_e_int_menus_augmentation, menu, l); } free(maug); } /* local subsystem functions */ static void _e_int_menus_quit(void) { if (_e_int_menus_quit_job) { ecore_job_del(_e_int_menus_quit_job); _e_int_menus_quit_job = NULL; } _e_int_menus_quit_job = ecore_job_add(_e_int_menus_quit_cb, NULL); } static void _e_int_menus_quit_cb(void *data) { E_Action *a; a = e_action_find("exit"); if ((a) && (a->func.go)) a->func.go(NULL, NULL); _e_int_menus_quit_job = NULL; } static void _e_int_menus_main_del_hook(void *obj) { Main_Data *dat; E_Menu *m; m = obj; dat = e_object_data_get(E_OBJECT(obj)); if (dat) { e_object_del(E_OBJECT(dat->apps)); e_object_del(E_OBJECT(dat->modules)); e_object_del(E_OBJECT(dat->desktops)); e_object_del(E_OBJECT(dat->clients)); e_object_del(E_OBJECT(dat->gadgets)); e_object_del(E_OBJECT(dat->themes)); e_object_del(E_OBJECT(dat->config)); e_object_del(E_OBJECT(dat->lost_clients)); free(dat); } } static void _e_int_menus_main_about(void *data, E_Menu *m, E_Menu_Item *mi) { E_About *about; about = e_about_new(e_container_current_get(e_manager_current_get())); if (about) e_about_show(about); } static void _e_int_menus_themes_about(void *data, E_Menu *m, E_Menu_Item *mi) { E_Theme_About *about; about = e_theme_about_new(e_container_current_get(e_manager_current_get())); if (about) e_theme_about_show(about); } static void _e_int_menus_main_run(void *data, E_Menu *m, E_Menu_Item *mi) { Ecore_Exe *exe; exe = ecore_exe_run("exige", NULL); if (exe) ecore_exe_free(exe); } static void _e_int_menus_main_fm(void *data, E_Menu *m, E_Menu_Item *mi) { E_Fileman *fileman; fileman = e_fileman_new (m->zone->container); e_fileman_show (fileman); } static void _e_int_menus_main_restart(void *data, E_Menu *m, E_Menu_Item *mi) { E_Action *a; a = e_action_find("restart"); if ((a) && (a->func.go)) a->func.go(NULL, NULL); } static void _e_int_menus_main_exit(void *data, E_Menu *m, E_Menu_Item *mi) { if (!e_util_immortal_check()) _e_int_menus_quit(); } static void _e_int_menus_apps_scan(E_Menu *m) { E_Menu_Item *mi; E_App *a; Evas_List *l; int app_count = 0; a = e_object_data_get(E_OBJECT(m)); if (a) { e_app_subdir_scan(a, 0); for (l = a->subapps; l; l = l->next) { a = l->data; if (e_app_valid_exe_get(a) || (!a->exe)) { int opt = 0; char label[4096]; mi = e_menu_item_new(m); if (e_config->menu_eap_name_show && a->name) opt |= 0x4; if (e_config->menu_eap_generic_show && a->generic) opt |= 0x2; if (e_config->menu_eap_comment_show && a->comment) opt |= 0x1; if (opt == 0x7) snprintf(label, sizeof(label), "%s (%s) [%s]", a->name, a->generic, a->comment); else if (opt == 0x6) snprintf(label, sizeof(label), "%s (%s)", a->name, a->generic); else if (opt == 0x5) snprintf(label, sizeof(label), "%s [%s]", a->name, a->comment); else if (opt == 0x4) snprintf(label, sizeof(label), "%s", a->name); else if (opt == 0x3) snprintf(label, sizeof(label), "%s [%s]", a->generic, a->comment); else if (opt == 0x2) snprintf(label, sizeof(label), "%s", a->generic); else if (opt == 0x1) snprintf(label, sizeof(label), "%s", a->comment); else snprintf(label, sizeof(label), "%s", a->name); e_menu_item_label_set(mi, label); if (a->exe) { e_menu_item_icon_edje_set(mi, a->path, "icon"); e_menu_item_callback_set(mi, _e_int_menus_apps_run, a); app_count++; } else { char buf[4096]; snprintf(buf, sizeof(buf), "%s/.directory.eap", a->path); e_menu_item_icon_edje_set(mi, buf, "icon"); e_menu_item_submenu_set(mi, e_int_menus_apps_new(a->path)); app_count++; } } } } if (app_count == 0) { mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("(No Applications)")); } } static void _e_int_menus_apps_start(void *data, E_Menu *m) { _e_int_menus_apps_scan(m); e_menu_pre_activate_callback_set(m, NULL, NULL); } static void _e_int_menus_apps_del_hook(void *obj) { E_Menu *m; Evas_List *l; m = obj; for (l = m->items; l; l = l->next) { E_Menu_Item *mi; mi = l->data; if (mi->submenu) e_object_del(E_OBJECT(mi->submenu)); } } static void _e_int_menus_apps_free_hook(void *obj) { E_Menu *m; E_App *a; m = obj; a = e_object_data_get(E_OBJECT(m)); /* note: app objects are shared so we ALWAYS unref not del! */ if (a) e_object_unref(E_OBJECT(a)); } static void _e_int_menus_apps_run(void *data, E_Menu *m, E_Menu_Item *mi) { E_App *a; a = data; e_zone_app_exec(m->zone, a); } static void _e_int_menus_desktops_pre_cb(void *data, E_Menu *m) { E_Menu_Item *mi; E_Menu *root; e_menu_pre_activate_callback_set(m, NULL, NULL); root = e_menu_root_get(m); /* Get the desktop list for this zone */ /* FIXME: Menu code needs to determine what zone menu was clicked in */ if ((root) && (root->zone)) { int i; E_Zone *zone; zone = root->zone; for (i = 0; i < zone->desk_x_count * zone->desk_y_count; i++) { E_Desk *desk = zone->desks[i]; mi = e_menu_item_new(m); e_menu_item_radio_group_set(mi, 1); e_menu_item_radio_set(mi, 1); e_menu_item_label_set(mi, desk->name); if (desk == e_desk_current_get(zone)) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _e_int_menus_desktops_item_cb, desk); } } mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("New Row of Desktops")); e_menu_item_callback_set(mi, _e_int_menus_desktops_row_add_cb, NULL); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Remove Row of Desktops")); e_menu_item_callback_set(mi, _e_int_menus_desktops_row_del_cb, NULL); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("New Column of Desktops")); e_menu_item_callback_set(mi, _e_int_menus_desktops_col_add_cb, NULL); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Remove Column of Desktops")); e_menu_item_callback_set(mi, _e_int_menus_desktops_col_del_cb, NULL); } /* FIXME: Use the zone the menu was clicked in */ static void _e_int_menus_desktops_row_add_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Menu *root; root = e_menu_root_get(m); if (root) e_desk_row_add(root->zone); } static void _e_int_menus_desktops_row_del_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Menu *root; root = e_menu_root_get(m); if (root) e_desk_row_remove(root->zone); } static void _e_int_menus_desktops_col_add_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Menu *root; root = e_menu_root_get(m); if (root) e_desk_col_add(root->zone); } static void _e_int_menus_desktops_col_del_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Menu *root; root = e_menu_root_get(m); if (root) e_desk_col_remove(root->zone); } static void _e_int_menus_desktops_item_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Desk *desk = data; e_desk_show(desk); } static void _e_int_menus_eapedit_item_cb(void *data, E_Menu *m, E_Menu_Item *mi) { /* This is temporarily put here so we can test the eap editor */ E_App *a; a = e_app_empty_new(NULL); e_eap_edit_show(m->zone->container, a); } static void _e_int_menus_config_pre_cb(void *data, E_Menu *m) { E_Menu_Item *mi; Evas_List *l; e_menu_pre_activate_callback_set(m, NULL, NULL); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Configuration Panel")); e_menu_item_callback_set(mi, _e_int_menus_config_item_cb, NULL); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Focus Settings")); e_menu_item_callback_set(mi, _e_int_menus_config_generic_cb, "focus"); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Eap Editor")); e_menu_item_callback_set(mi, _e_int_menus_eapedit_item_cb, NULL); l = evas_hash_find(_e_int_menus_augmentation, "config"); if (l) { mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); _e_int_menus_augmentation_add(m, l); } e_object_free_attach_func_set(E_OBJECT(m), _e_int_menus_config_free_hook); } static void _e_int_menus_config_free_hook(void *obj) { E_Menu *m; m = obj; _e_int_menus_augmentation_del(m, evas_hash_find(_e_int_menus_augmentation, "config")); } static void _e_int_menus_config_item_cb(void *data, E_Menu *m, E_Menu_Item *mi) { e_configure_show(m->zone->container); } static void _e_int_menus_config_generic_cb(void *data, E_Menu *m, E_Menu_Item *mi) { if (!strcmp((char *)data, "focus")) e_int_config_focus(m->zone->container); } static void _e_int_menus_clients_pre_cb(void *data, E_Menu *m) { E_Menu_Item *mi; Evas_List *l, *borders = NULL; E_Menu *root; E_Zone *zone = NULL; char *s; e_menu_pre_activate_callback_set(m, NULL, NULL); root = e_menu_root_get(m); /* get the current clients */ if (root) zone = root->zone; for (l = e_border_client_list(); l; l = l->next) { E_Border *border; border = l->data; if ((border->zone == zone) || (border->iconic)) borders = evas_list_append(borders, border); } if (!borders) { /* FIXME here we want nothing, but that crashes!!! */ mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("(No Windows)")); return; } for (l = borders; l; l = l->next) { E_Border *bd = l->data; E_App *a; const char *title; title = e_border_name_get(bd); mi = e_menu_item_new(m); e_menu_item_check_set(mi, 1); if ((title) && (title[0])) e_menu_item_label_set(mi, title); else e_menu_item_label_set(mi, _("No name!!")); /* ref the border as we implicitly unref it in the callback */ e_object_ref(E_OBJECT(bd)); // e_object_breadcrumb_add(E_OBJECT(bd), "clients_menu"); e_menu_item_callback_set(mi, _e_int_menus_clients_item_cb, bd); if (!bd->iconic) e_menu_item_toggle_set(mi, 1); a = e_app_window_name_class_title_role_find(bd->client.icccm.name, bd->client.icccm.class, title, bd->client.icccm.window_role); if (a) e_menu_item_icon_edje_set(mi, a->path, "icon"); } mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Cleanup Windows")); s = e_path_find(path_icons, "default.edj"); e_menu_item_icon_edje_set(mi, s, "windows"); E_FREE(s); e_menu_item_callback_set(mi, _e_int_menus_clients_cleanup_cb, zone); e_object_free_attach_func_set(E_OBJECT(m), _e_int_menus_clients_free_hook); e_object_data_set(E_OBJECT(m), borders); } static void _e_int_menus_clients_free_hook(void *obj) { E_Menu *m; Evas_List *borders; m = obj; borders = e_object_data_get(E_OBJECT(m)); while (borders) { E_Border *bd; bd = borders->data; borders = evas_list_remove_list(borders, borders); // e_object_breadcrumb_del(E_OBJECT(bd), "clients_menu"); e_object_unref(E_OBJECT(bd)); } } static void _e_int_menus_clients_item_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Border *bd; bd = data; E_OBJECT_CHECK(bd); if (bd->iconic) { if (!bd->lock_user_iconify) e_border_uniconify(bd); } e_desk_show(bd->desk); if (!bd->lock_user_stacking) e_border_raise(bd); if (!bd->lock_focus_out) { if (e_config->focus_policy != E_FOCUS_CLICK) ecore_x_pointer_warp(bd->zone->container->win, bd->x + (bd->w / 2), bd->y + (bd->h / 2)); e_border_focus_set(bd, 1, 1); } } static void _e_int_menus_clients_cleanup_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Zone *zone; zone = data; e_place_zone_region_smart_cleanup(zone); } static void _e_int_menus_gadgets_pre_cb(void *data, E_Menu *m) { E_Menu_Item *mi; E_Menu *root; e_menu_pre_activate_callback_set(m, NULL, NULL); root = e_menu_root_get(m); if ((root) && (root->zone)) { mi = e_menu_item_new(m); e_menu_item_check_set(mi, 1); if (e_gadman_mode_get(root->zone->container->gadman) == E_GADMAN_MODE_EDIT) e_menu_item_toggle_set(mi, 1); else e_menu_item_toggle_set(mi, 0); e_menu_item_label_set(mi, _("Edit Mode")); e_menu_item_callback_set(mi, _e_int_menus_gadgets_edit_mode_cb, root->zone->container->gadman); } else { mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("(Unused)")); e_menu_item_callback_set(mi, NULL, NULL); } } static void _e_int_menus_gadgets_edit_mode_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Gadman *gm; gm = data; if (e_menu_item_toggle_get(mi)) e_gadman_mode_set(gm, E_GADMAN_MODE_EDIT); else e_gadman_mode_set(gm, E_GADMAN_MODE_NORMAL); } /* FIXME: * * Remove this later, keep for fast theme switching now. */ static void _e_int_menus_themes_pre_cb(void *data, E_Menu *m) { E_Menu_Item *mi; E_Menu *root; int num = 0; e_menu_pre_activate_callback_set(m, NULL, NULL); root = e_menu_root_get(m); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("About This Theme")); e_util_menu_item_edje_icon_set(mi, "enlightenment/theme"); e_menu_item_callback_set(mi, _e_int_menus_themes_about, NULL); mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); if ((root) && (root->zone)) { char buf[4096]; char *homedir; homedir = e_user_homedir_get(); if (homedir) { snprintf(buf, sizeof(buf), "%s/.e/e/themes", homedir); free(homedir); } if ((ecore_file_exists(buf)) && (ecore_file_is_dir(buf))) { Ecore_List *themes; themes = ecore_file_ls(buf); if (themes) { char *theme, *deftheme = NULL; Evas_List *l; for (l = e_config->themes; l; l = l->next) { E_Config_Theme *et; et = l->data; if (!strcmp(et->category, "theme")) deftheme = et->file; } mi = e_menu_item_new(m); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 1); if (((deftheme) && (!strcmp("default.edj", deftheme))) || (!deftheme)) e_menu_item_toggle_set(mi, 1); e_menu_item_label_set(mi, "default"); e_menu_item_callback_set(mi, _e_int_menus_themes_edit_mode_cb, NULL); num++; while ((theme = ecore_list_next(themes))) { char *ext; ext = strrchr(theme, '.'); if (ecore_file_is_dir(theme) || (!ext)) continue; if (!strcasecmp(ext, ".edj")) { mi = e_menu_item_new(m); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 1); if (deftheme) { if (!strcmp(theme, deftheme)) e_menu_item_toggle_set(mi, 1); } *ext = 0; e_menu_item_label_set(mi, theme); e_menu_item_callback_set(mi, _e_int_menus_themes_edit_mode_cb, NULL); num++; } } ecore_list_destroy(themes); } } } } static void _e_int_menus_themes_edit_mode_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Config_Theme *et; Evas_List *l; E_Action *a; for (l = e_config->themes; l; l = l->next) { et = l->data; if (!strcmp(et->category, "theme")) { e_config->themes = evas_list_remove_list(e_config->themes, l); E_FREE(et->category); E_FREE(et->file); E_FREE(et); break; } } /* FIXME: EVIL... relies on label + .edj being the filename! */ et = E_NEW(E_Config_Theme, 1); et->category = strdup("theme"); et->file = E_NEW(char, strlen(mi->label) + 4 + 1); strcpy(et->file, mi->label); strcat(et->file, ".edj"); e_config->themes = evas_list_append(e_config->themes, et); e_config_save_queue(); a = e_action_find("restart"); if ((a) && (a->func.go)) a->func.go(NULL, NULL); } static void _e_int_menus_lost_clients_pre_cb(void *data, E_Menu *m) { E_Menu_Item *mi; Evas_List *l, *borders = NULL; E_Menu *root; E_Zone *zone = NULL; e_menu_pre_activate_callback_set(m, NULL, NULL); root = e_menu_root_get(m); /* get the current clients */ if (root) zone = root->zone; borders = e_border_lost_windows_get(zone); if (!borders) { /* FIXME here we want nothing, but that crashes!!! */ mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("(No Windows)")); return; } for (l = borders; l; l = l->next) { E_Border *bd = l->data; E_App *a; const char *title = ""; title = e_border_name_get(bd); mi = e_menu_item_new(m); if ((title) && (title[0])) e_menu_item_label_set(mi, title); else e_menu_item_label_set(mi, _("No name!!")); /* ref the border as we implicitly unref it in the callback */ e_object_ref(E_OBJECT(bd)); // e_object_breadcrumb_add(E_OBJECT(bd), "lost_clients_menu"); e_menu_item_callback_set(mi, _e_int_menus_lost_clients_item_cb, bd); a = e_app_window_name_class_title_role_find(bd->client.icccm.name, bd->client.icccm.class, title, bd->client.icccm.window_role); if (a) e_menu_item_icon_edje_set(mi, a->path, "icon"); } e_object_free_attach_func_set(E_OBJECT(m), _e_int_menus_lost_clients_free_hook); e_object_data_set(E_OBJECT(m), borders); } static void _e_int_menus_lost_clients_free_hook(void *obj) { E_Menu *m; Evas_List *borders; m = obj; borders = e_object_data_get(E_OBJECT(m)); while (borders) { E_Border *bd; bd = borders->data; borders = evas_list_remove_list(borders, borders); // e_object_breadcrumb_del(E_OBJECT(bd), "lost_clients_menu"); e_object_unref(E_OBJECT(bd)); } } static void _e_int_menus_lost_clients_item_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Border *bd = data; E_OBJECT_CHECK(bd); if (bd->iconic) e_border_uniconify(bd); if (bd->desk) e_desk_show(bd->desk); e_border_move(bd, bd->zone->x + ((bd->zone->w - bd->w) / 2), bd->zone->y + ((bd->zone->h - bd->h) / 2)); e_border_raise(bd); e_border_focus_set(bd, 1, 1); } static void _e_int_menus_augmentation_add(E_Menu *m, Evas_List *augmentation) { Evas_List *l; E_Menu_Item *mi; int i = 0; for (l = augmentation; l; l = l->next) { E_Int_Menu_Augmentation *aug; aug = l->data; if (i) { mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); } else i++; if (aug->add.func) aug->add.func(aug->add.data, m); } } static void _e_int_menus_augmentation_del(E_Menu *m, Evas_List *augmentation) { Evas_List *l; for (l = augmentation; l; l = l->next) { E_Int_Menu_Augmentation *aug; aug = l->data; if (aug->del.func) aug->del.func(aug->del.data, m); } }