GtkWidget * panel_desktop_menu_item_new (gboolean use_image, gboolean append_lock_logout) { PanelDesktopMenuItem *menuitem; GtkWidget *image; menuitem = g_object_new (PANEL_TYPE_DESKTOP_MENU_ITEM, NULL); if (use_image) image = gtk_image_new_from_icon_name ("computer", panel_menu_icon_get_size ()); else image = NULL; setup_menuitem (GTK_WIDGET (menuitem), image ? panel_menu_icon_get_size () : GTK_ICON_SIZE_INVALID, image, _("System")); menuitem->priv->use_image = use_image; menuitem->priv->append_lock_logout = append_lock_logout; if (append_lock_logout) panel_lockdown_notify_add (G_CALLBACK (panel_desktop_menu_item_recreate_menu), menuitem); menuitem->priv->menu = panel_desktop_menu_item_create_menu (menuitem); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menuitem->priv->menu); return GTK_WIDGET (menuitem); }
static void panel_menu_button_load (const char *menu_path, gboolean use_menu_path, const char *custom_icon, gboolean use_custom_icon, const char *tooltip, PanelWidget *panel, gboolean locked, int position, gboolean exactpos, gboolean has_arrow, const char *id) { PanelMenuButton *button; AppletInfo *info; g_return_if_fail (panel != NULL); button = g_object_new (PANEL_TYPE_MENU_BUTTON, "menu-path", menu_path, "custom-icon", custom_icon, "tooltip", tooltip, "use-menu-path", use_menu_path, "use-custom-icon", use_custom_icon, "has-arrow", has_arrow, NULL); info = mate_panel_applet_register (GTK_WIDGET (button), NULL, NULL, panel, locked, position, exactpos, PANEL_OBJECT_MENU, id); if (!info) { gtk_widget_destroy (GTK_WIDGET (button)); return; } button->priv->applet_id = g_strdup (info->id); mate_panel_applet_add_callback (info, "help", GTK_STOCK_HELP, _("_Help"), NULL); if (!panel_lockdown_get_locked_down () && (panel_is_program_in_path ("mozo") || panel_is_program_in_path ("matemenu-simple-editor"))) mate_panel_applet_add_callback (info, "edit", NULL, _("_Edit Menus"), NULL); panel_widget_set_applet_expandable (panel, GTK_WIDGET (button), FALSE, TRUE); panel_widget_set_applet_size_constrained (panel, GTK_WIDGET (button), TRUE); panel_menu_button_connect_to_gsettings (button); panel_lockdown_notify_add (G_CALLBACK (panel_menu_button_recreate_menu), button); }
PanelData * panel_setup (PanelToplevel *toplevel) { PanelWidget *panel_widget; PanelData *pd; g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), NULL); panel_widget = panel_toplevel_get_panel_widget (toplevel); pd = g_new0 (PanelData,1); pd->menu = NULL; pd->panel = GTK_WIDGET (toplevel); pd->insertion_pos = -1; pd->deactivate_idle = 0; panel_list = g_slist_append (panel_list, pd); g_object_set_data (G_OBJECT (toplevel), "PanelData", pd); panel_lockdown_notify_add (G_CALLBACK (panel_recreate_context_menu), pd); panel_widget_setup (panel_widget); g_signal_connect (toplevel, "drag_data_received", G_CALLBACK (drag_data_recieved_cb), NULL); g_signal_connect (toplevel, "drag_motion", G_CALLBACK (drag_motion_cb), NULL); g_signal_connect (toplevel, "drag_leave", G_CALLBACK (drag_leave_cb), NULL); g_signal_connect (toplevel, "drag_drop", G_CALLBACK (drag_drop_cb), NULL); gtk_drag_dest_set (GTK_WIDGET (toplevel), 0, NULL, 0, 0); g_signal_connect (toplevel, "key-press-event", G_CALLBACK (panel_key_press_event), NULL); g_signal_connect (toplevel, "button-press-event", G_CALLBACK (panel_button_press_event), NULL); g_signal_connect (toplevel, "popup-menu", G_CALLBACK (panel_popup_menu_signal), NULL); g_signal_connect_swapped (toplevel, "notify::orientation", G_CALLBACK (panel_orient_change), panel_widget); g_signal_connect (toplevel, "destroy", G_CALLBACK (panel_destroy), pd); return pd; }
static void panel_action_button_connect_to_mateconf (PanelActionButton *button) { const char *key; key = panel_mateconf_full_key ( PANEL_MATECONF_OBJECTS, button->priv->info->id, "action_type"); button->priv->mateconf_notify = mateconf_client_notify_add (panel_mateconf_get_client (), key, (MateConfClientNotifyFunc) panel_action_button_type_changed, button, NULL, NULL); panel_lockdown_notify_add (G_CALLBACK (panel_action_button_update_sensitivity), button); }
static void panel_action_button_connect_to_gsettings (PanelActionButton *button) { gchar *settings_path; gchar *signal_name; settings_path = g_strdup_printf (PANEL_OBJECT_PATH "%s/", button->priv->info->id); button->priv->settings = g_settings_new_with_path (PANEL_OBJECT_SCHEMA, settings_path); signal_name = g_strdup_printf ("changed::%s", PANEL_OBJECT_ACTION_TYPE_KEY); g_signal_connect (button->priv->settings, signal_name, G_CALLBACK (panel_action_button_type_changed), button); g_free (signal_name); g_free (settings_path); panel_lockdown_notify_add (G_CALLBACK (panel_action_button_update_sensitivity), button); }
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; }