aboutsummaryrefslogtreecommitdiffstats
path: root/src/panel_menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/panel_menu.c')
-rw-r--r--src/panel_menu.c276
1 files changed, 276 insertions, 0 deletions
diff --git a/src/panel_menu.c b/src/panel_menu.c
new file mode 100644
index 0000000..fbb6169
--- /dev/null
+++ b/src/panel_menu.c
@@ -0,0 +1,276 @@
+#include "panel_menu.h"
+
+#ifdef USE_PNG
+#define FOLDER_IMG "mbfolder.png"
+#define ADD_IMG "mbadd.png"
+#define REMOVE_IMG "mbremove.png"
+#define HIDE_IMG "mbdown.png"
+#else
+#define FOLDER_IMG "mbfolder.xpm"
+#define ADD_IMG "mbadd.xpm"
+#define REMOVE_IMG "mbremove.xpm"
+#define HIDE_IMG "mbdown.xpm"
+#endif
+
+void panel_menu_exec_cb(MBMenuItem *item)
+{
+ char *cmd = strdup(item->info);
+
+ util_fork_exec(cmd);
+ free(cmd);
+}
+
+void panel_menu_exit_cb(MBMenuItem *item)
+{
+ /* This should only be called by the menu.
+ As we now delete the session file. So its not used again.
+ */
+ MBPanel *panel = (MBPanel *)item->cb_data;
+ session_destroy(panel);
+
+ util_cleanup_children(0);
+}
+
+void panel_menu_hide_cb(MBMenuItem *item)
+{
+ MBPanel *panel = (MBPanel *)item->cb_data;
+ panel_toggle_visibilty(panel);
+}
+
+void panel_menu_kill_cb(MBMenuItem *item)
+{
+ MBPanelApp *papp = (MBPanelApp *)item->cb_data;
+
+ XGrabServer(papp->panel->dpy);
+ XKillClient(papp->panel->dpy, papp->win);
+ session_save(papp->panel);
+ XUngrabServer(papp->panel->dpy);
+}
+
+void
+panel_menu_update_remove_items(MBPanel *panel)
+{
+ int *icon_data = NULL;
+ MBMenuItem *menu_item;
+ MBPanelApp *papp = NULL;
+ MBPanelApp *papp_heads[] = { panel->apps_start_head,
+ panel->apps_end_head,
+ NULL };
+ int i = 0;
+
+ if (panel->remove_menu == NULL)
+ {
+ char *icon_path = NULL;
+
+ icon_path = mb_dot_desktop_icon_get_full_path (panel->theme_name,
+ 16, REMOVE_IMG );
+
+ panel->remove_menu = mb_menu_add_path(panel->mbmenu, _("Remove"),
+ icon_path,
+ MBMENU_PREPEND);
+ if (icon_path) free(icon_path);
+ }
+
+ /* Remove all items then readd so order matches panel */
+
+ if (panel->remove_menu->items)
+ {
+ MBMenuItem *tmp_item = NULL;
+
+ menu_item = panel->remove_menu->items;
+
+ while (menu_item != NULL)
+ {
+ tmp_item = menu_item->next_item;
+ mb_menu_item_remove(panel->mbmenu, panel->remove_menu, menu_item);
+ menu_item = tmp_item;
+ }
+ }
+
+
+ while (i < 2)
+ {
+ papp = papp_heads[i];
+
+ if (i == 1)
+ papp = panel_app_list_get_last(panel, panel->apps_end_head);
+
+ while( papp != NULL)
+ {
+ if (!papp->ignore)
+ {
+ menu_item = mb_menu_add_item_to_menu(panel->mbmenu,
+ panel->remove_menu,
+ papp->name, NULL,
+ papp->name,
+ panel_menu_kill_cb,
+ (void *)papp,
+ MBMENU_NO_SORT);
+
+ if (!papp->icon)
+ {
+ if ((icon_data = panel_app_icon_prop_data_get(panel, papp))
+ != NULL )
+ {
+ char *p;
+ int j;
+
+ DBG("%s() Got icon data (size: %i x %i)\n", __func__,
+ icon_data[0], icon_data[1] );
+
+ papp->icon = mb_pixbuf_img_new(panel->pb,
+ icon_data[0], icon_data[1] );
+ p = papp->icon->rgba;
+
+ for (j =0 ; j < (icon_data[0]*icon_data[1]); j++)
+ {
+ *p++ = (icon_data[j+2] >> 16) & 0xff;
+ *p++ = (icon_data[j+2] >> 8) & 0xff;
+ *p++ = icon_data[j+2] & 0xff;
+ *p++ = icon_data[j+2] >> 24;
+ }
+
+ XFree(icon_data);
+ }
+ }
+
+ if (papp->icon)
+ mb_menu_item_icon_set(panel->mbmenu, menu_item, papp->icon);
+ }
+
+ if (i == 1)
+ {
+ papp = panel_app_list_get_prev (panel, papp,
+ &panel->apps_end_head);
+ }
+ else papp = papp->next;
+ }
+ i++;
+ }
+
+}
+
+void
+panel_menu_init(MBPanel *panel)
+{
+ MBMenuMenu *m, *menu_launchers;
+ char orig_wd[256] = { 0 };
+ struct dirent *dir_entry;
+ char *icon_path = NULL;
+ DIR *dp;
+
+ if (panel->mbmenu == NULL)
+ {
+ panel->mbmenu = mb_menu_new(panel->dpy, panel->screen );
+ mb_menu_set_icon_size(panel->mbmenu, 16);
+ }
+ else mb_menu_free(panel->mbmenu); /* XXX should be mb_menu_empty */
+
+ icon_path = mb_dot_desktop_icon_get_full_path (panel->theme_name,
+ 16, ADD_IMG );
+
+ m = mb_menu_add_path(panel->mbmenu, _("Add"), icon_path,
+ MBMENU_NO_SORT );
+
+ if (icon_path) free(icon_path);
+
+ icon_path = mb_dot_desktop_icon_get_full_path (panel->theme_name,
+ 16, FOLDER_IMG );
+
+ menu_launchers = mb_menu_add_path(panel->mbmenu, "Add/Launchers",
+ icon_path, MBMENU_NO_SORT );
+
+ if (icon_path) free(icon_path);
+
+ if (getcwd(orig_wd, 255) == (char *)NULL)
+ {
+ printf("Cant get current directory\n");
+ exit(0);
+ }
+
+ if ((dp = opendir(DATADIR "/applications")) != NULL)
+ {
+ chdir(DATADIR "/applications");
+
+ while((dir_entry = readdir(dp)) != NULL)
+ {
+ struct stat stat_info;
+ stat(dir_entry->d_name, &stat_info);
+ if (!(stat_info.st_mode & S_IFDIR))
+ {
+ MBDotDesktop *ddentry = NULL;
+ ddentry = mb_dotdesktop_new_from_file(dir_entry->d_name);
+ if (ddentry
+ && mb_dotdesktop_get(ddentry, "Type")
+ && mb_dotdesktop_get(ddentry, "Name")
+ && mb_dotdesktop_get(ddentry, "Exec")
+ )
+ {
+
+ char *png_path = NULL;
+ unsigned char *icon_str = mb_dotdesktop_get(ddentry, "Icon");
+
+ png_path = mb_dot_desktop_icon_get_full_path (
+ panel->theme_name,
+ 16, icon_str );
+
+ if (!strcmp(mb_dotdesktop_get(ddentry, "Type"), "PanelApp"))
+ {
+ mb_menu_add_item_to_menu(panel->mbmenu,
+ m,
+ mb_dotdesktop_get(ddentry,
+ "Name"),
+ png_path,
+ mb_dotdesktop_get(ddentry,
+ "Exec"),
+ panel_menu_exec_cb,
+ (void *)panel, 0);
+ } else {
+ char launcher_exec_str[256] = { 0 };
+ snprintf(launcher_exec_str, 256,
+ "monolaunch -o -1 --desktop %s/%s",
+ DATADIR "/applications", dir_entry->d_name);
+ mb_menu_add_item_to_menu(panel->mbmenu,
+ menu_launchers,
+ mb_dotdesktop_get(ddentry,
+ "Name"),
+ png_path,
+ launcher_exec_str,
+ panel_menu_exec_cb,
+ (void *)panel, 0);
+
+ }
+ if (png_path) free(png_path);
+ mb_dotdesktop_free(ddentry);
+ }
+ }
+ }
+ closedir(dp);
+ }
+ else fprintf(stderr, "failed to open %s\n", DATADIR "/applications");
+
+ chdir(orig_wd);
+
+ panel->remove_menu = NULL;
+
+ icon_path = mb_dot_desktop_icon_get_full_path (panel->theme_name,
+ 16, HIDE_IMG );
+
+ mb_menu_add_item_to_menu(panel->mbmenu, panel->mbmenu->rootmenu, _("Hide"),
+ icon_path, NULL ,
+ panel_menu_hide_cb, (void *)panel, MBMENU_NO_SORT);
+
+
+ if (panel->system_tray_id > 0)
+ mb_menu_add_item_to_menu(panel->mbmenu, panel->mbmenu->rootmenu,
+ "Exit",
+ NULL, NULL ,
+ panel_menu_exit_cb,
+ (void *)panel, MBMENU_NO_SORT);
+
+
+ if (icon_path) free(icon_path);
+
+ return;
+}
+