static gboolean drop_internal_icon (PanelWidget *panel, int pos, const char *icon_name, int action) { Launcher *old_launcher = NULL; if (!icon_name) return FALSE; if (!panel_profile_id_lists_are_writable ()) return FALSE; if (action == GDK_ACTION_MOVE) old_launcher = find_launcher (icon_name); if (!panel_launcher_create_copy (panel->toplevel, pos, icon_name)) return FALSE; if (old_launcher && old_launcher->button) { if (old_launcher->prop_dialog) { g_signal_handler_disconnect (old_launcher->button, old_launcher->destroy_handler); launcher_properties_destroy (old_launcher); } panel_profile_delete_object (old_launcher->info); } return TRUE; }
void drawer_query_deletion (Drawer *drawer) { GtkWidget *dialog; if (drawer->toplevel) { PanelWidget *panel_widget; panel_widget = panel_toplevel_get_panel_widget (drawer->toplevel); if (!panel_global_config_get_confirm_panel_remove () || !g_list_length (panel_widget->applet_list)) { panel_profile_delete_object (drawer->info); return; } dialog = panel_deletion_dialog (drawer->toplevel); g_signal_connect (dialog, "response", G_CALLBACK (drawer_deletion_response), drawer); g_signal_connect_object (drawer->toplevel, "destroy", G_CALLBACK (gtk_widget_destroy), dialog, G_CONNECT_SWAPPED); gtk_widget_show_all (dialog); } }
static void applet_remove_callback (GtkWidget *widget, AppletInfo *info) { if (info->type == PANEL_OBJECT_DRAWER) drawer_query_deletion (info->data); else panel_profile_delete_object (info); }
static void drawer_deletion_response (GtkWidget *dialog, int response, Drawer *drawer) { if (response == GTK_RESPONSE_OK) panel_profile_delete_object (drawer->info); gtk_widget_destroy (dialog); }
static void panel_delete_without_query (PanelToplevel *toplevel) { PanelWidget *panel_widget; panel_widget = panel_toplevel_get_panel_widget (toplevel); if (panel_toplevel_get_is_attached (toplevel) && panel_widget->master_widget) { AppletInfo *info; info = g_object_get_data (G_OBJECT (panel_widget->master_widget), "applet_info"); panel_profile_delete_object (info); } else panel_profile_delete_toplevel (toplevel); }
static gboolean drop_internal_applet (PanelWidget *panel, int pos, const char *applet_type, int action) { int applet_index = -1; gboolean remove_applet = FALSE; gboolean success = FALSE; if (applet_type == NULL) return FALSE; if (sscanf (applet_type, "MENU:%d", &applet_index) == 1 || sscanf (applet_type, "DRAWER:%d", &applet_index) == 1) { if (action != GDK_ACTION_MOVE) g_warning ("Only MOVE supported for menus/drawers"); success = move_applet (panel, pos, applet_index); } else if (strncmp (applet_type, "MENU:", strlen ("MENU:")) == 0) { const char *menu; const char *menu_path; menu = &applet_type[strlen ("MENU:")]; menu_path = strchr (menu, '/'); if (!menu_path) { if (strncmp (menu, "MAIN", strlen ("MAIN")) == 0) success = drop_menu (panel, pos, NULL, NULL); else success = drop_menu (panel, pos, menu, NULL); } else { char *menu_filename; menu_filename = g_strndup (menu, menu_path - menu); menu_path++; success = drop_menu (panel, pos, menu_filename, menu_path); g_free (menu_filename); } } else if (!strcmp (applet_type, "DRAWER:NEW")) { if (panel_profile_id_lists_are_writable ()) { panel_drawer_create (panel->toplevel, pos, NULL, FALSE, NULL); success = TRUE; } else { success = FALSE; } } else if (!strncmp (applet_type, "ACTION:", strlen ("ACTION:"))) { if (panel_profile_id_lists_are_writable ()) { remove_applet = panel_action_button_load_from_drag ( panel->toplevel, pos, applet_type, &applet_index); success = TRUE; } else { success = FALSE; } } else if (!strcmp (applet_type, "MENUBAR:NEW")) { if (panel_profile_id_lists_are_writable ()) { panel_menu_bar_create (panel->toplevel, pos); success = TRUE; } else { success = FALSE; } } else if (!strcmp(applet_type,"SEPARATOR:NEW")) { if (panel_profile_id_lists_are_writable ()) { panel_separator_create (panel->toplevel, pos); success = TRUE; } else { success = FALSE; } } else if (!strcmp(applet_type,"LAUNCHER:ASK")) { if (panel_profile_id_lists_are_writable ()) { ask_about_launcher (NULL, panel, pos, TRUE); success = TRUE; } else { success = FALSE; } } if (remove_applet && action == GDK_ACTION_MOVE) { AppletInfo *info; GSList *applet_list; applet_list = mate_panel_applet_list_applets (); info = g_slist_nth_data (applet_list, applet_index); if (info) panel_profile_delete_object (info); } return success; }
AppletInfo * mate_panel_applet_register (GtkWidget *applet, gpointer data, GDestroyNotify data_destroy, PanelWidget *panel, gboolean locked, gint pos, gboolean exactpos, PanelObjectType type, const char *id) { AppletInfo *info; gchar *path; gchar *locked_changed; g_return_val_if_fail (applet != NULL && panel != NULL, NULL); if (gtk_widget_get_has_window (applet)) gtk_widget_set_events (applet, (gtk_widget_get_events (applet) | APPLET_EVENT_MASK) & ~( GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK)); info = g_new0 (AppletInfo, 1); info->type = type; info->widget = applet; info->menu = NULL; info->data = data; info->data_destroy = data_destroy; info->user_menu = NULL; info->move_item = NULL; info->id = g_strdup (id); path = g_strdup_printf (PANEL_OBJECT_PATH "%s/", id); info->settings = g_settings_new_with_path (PANEL_OBJECT_SCHEMA, path); g_free (path); g_object_set_data (G_OBJECT (applet), "applet_info", info); if (type != PANEL_OBJECT_APPLET) panel_lockdown_notify_add (G_CALLBACK (mate_panel_applet_recreate_menu), info); locked_changed = g_strdup_printf ("changed::%s", PANEL_OBJECT_LOCKED_KEY); g_signal_connect (info->settings, locked_changed, G_CALLBACK (mate_panel_applet_locked_change_notify), G_OBJECT (applet)); g_free (locked_changed); if (type == PANEL_OBJECT_DRAWER) { Drawer *drawer = data; PanelWidget *assoc_panel; assoc_panel = panel_toplevel_get_panel_widget (drawer->toplevel); g_object_set_data (G_OBJECT (applet), MATE_PANEL_APPLET_ASSOC_PANEL_KEY, assoc_panel); assoc_panel->master_widget = applet; g_object_add_weak_pointer ( G_OBJECT (applet), (gpointer *) &assoc_panel->master_widget); } g_object_set_data (G_OBJECT (applet), MATE_PANEL_APPLET_FORBIDDEN_PANELS, NULL); registered_applets = g_slist_append (registered_applets, info); if (panel_widget_add (panel, applet, locked, pos, exactpos) == -1 && panel_widget_add (panel, applet, locked, 0, TRUE) == -1) { GSList *l; for (l = panels; l; l = l->next) { panel = PANEL_WIDGET (l->data); if (panel_widget_add (panel, applet, locked, 0, TRUE) != -1) break; } if (!l) { g_warning (_("Cannot find an empty spot")); panel_profile_delete_object (info); return NULL; } } if (BUTTON_IS_WIDGET (applet) || gtk_widget_get_has_window (applet)) { g_signal_connect (applet, "button_press_event", G_CALLBACK (applet_button_press), info); g_signal_connect (applet, "popup_menu", G_CALLBACK (applet_popup_menu), info); } g_signal_connect (applet, "destroy", G_CALLBACK (mate_panel_applet_destroy), info); mate_panel_applet_set_dnd_enabled (info, !locked); gtk_widget_show_all (applet); orientation_change (info, panel); size_change (info, panel); back_change (info, panel); if (type != PANEL_OBJECT_APPLET) gtk_widget_grab_focus (applet); else gtk_widget_child_focus (applet, GTK_DIR_TAB_FORWARD); return info; }