static void drag_data_recieved_cb (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time) { PanelWidget *panel_widget; PanelObjectPackType pack_type = PANEL_OBJECT_PACK_START; int pack_index = 0; g_return_if_fail (PANEL_IS_TOPLEVEL (widget)); /* we use this only to really find out the info, we already know this is an ok drop site and the info that got passed to us is bogus (it's always 0 in fact) */ if (!panel_check_dnd_target_data (widget, context, &info, NULL)) { gtk_drag_finish (context, FALSE, FALSE, time); return; } panel_widget = panel_toplevel_get_panel_widget (PANEL_TOPLEVEL (widget)); panel_widget_get_insert_at_cursor (panel_widget, &pack_type, &pack_index); panel_receive_dnd_data ( panel_widget, info, pack_type, pack_index, selection_data, context, time); }
static PanelPropertiesDialog * panel_properties_dialog_new (PanelToplevel *toplevel, GtkBuilder *gui) { PanelPropertiesDialog *dialog; char *toplevel_settings_path; dialog = g_new0 (PanelPropertiesDialog, 1); g_object_set_qdata_full (G_OBJECT (toplevel), panel_properties_dialog_quark, dialog, (GDestroyNotify) panel_properties_dialog_free); dialog->toplevel = toplevel; g_object_get (toplevel, "settings-path", &toplevel_settings_path, NULL); dialog->settings = g_settings_new_with_path (PANEL_TOPLEVEL_SCHEMA, toplevel_settings_path); dialog->settings_background = g_settings_get_child (dialog->settings, PANEL_BACKGROUND_SCHEMA_CHILD); g_free (toplevel_settings_path); dialog->properties_dialog = PANEL_GTK_BUILDER_GET (gui, "panel_properties_dialog"); g_signal_connect_swapped (dialog->properties_dialog, "response", G_CALLBACK (panel_properties_dialog_response), dialog); g_signal_connect_swapped (dialog->properties_dialog, "destroy", G_CALLBACK (panel_properties_dialog_destroy), dialog); gtk_window_set_screen (GTK_WINDOW (dialog->properties_dialog), gtk_window_get_screen (GTK_WINDOW (toplevel))); dialog->writability_warn_general = PANEL_GTK_BUILDER_GET (gui, "writability_warn_general"); dialog->writability_warn_background = PANEL_GTK_BUILDER_GET (gui, "writability_warn_background"); panel_properties_dialog_setup_orientation_combo (dialog, gui); panel_properties_dialog_size_spin_setup (dialog, gui); panel_properties_dialog_expand_toggle_setup (dialog, gui); panel_properties_dialog_autohide_toggle_setup (dialog, gui); panel_properties_dialog_hidebuttons_toggle_setup (dialog, gui); panel_properties_dialog_arrows_toggle_setup (dialog, gui); panel_properties_dialog_image_chooser_setup (dialog, gui); panel_properties_dialog_color_button_setup (dialog, gui); panel_properties_dialog_opacity_scale_setup (dialog, gui); panel_properties_dialog_background_radios_setup (dialog, gui); g_signal_connect (dialog->settings_background, "changed", G_CALLBACK (panel_properties_dialog_background_changed), dialog); panel_toplevel_push_autohide_disabler (dialog->toplevel); panel_widget_register_open_dialog (panel_toplevel_get_panel_widget (dialog->toplevel), dialog->properties_dialog); gtk_widget_show (dialog->properties_dialog); return dialog; }
static gboolean panel_popup_menu_left (PanelToplevel *toplevel, guint button, guint32 activate_time) { PanelWidget *panel_widget; GtkWidget *menu; PanelData *panel_data; GdkEvent *current_event; panel_widget = panel_toplevel_get_panel_widget (toplevel); panel_data = g_object_get_data (G_OBJECT (toplevel), "PanelData"); current_event = gtk_get_current_event (); if (current_event->type == GDK_BUTTON_PRESS) panel_data->insertion_pos = panel_widget_get_cursorloc (panel_widget); else panel_data->insertion_pos = -1; menu = make_popup_panel_menu (panel_widget); //gtk_widget_set_usize(GTK_WINDOW (menu),10,10); if (!menu) return FALSE; gtk_menu_set_screen (GTK_MENU (menu), gtk_window_get_screen (GTK_WINDOW (toplevel))); gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, activate_time); gtk_menu_popdown (GTK_MENU (menu)); return FALSE; }
static gboolean drag_motion_cb (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time) { PanelToplevel *toplevel; PanelWidget *panel_widget; guint info; g_return_val_if_fail (PANEL_IS_TOPLEVEL (widget), FALSE); if (!panel_check_dnd_target_data (widget, context, &info, NULL)) return FALSE; toplevel = PANEL_TOPLEVEL (widget); panel_widget = panel_toplevel_get_panel_widget (toplevel); if (!panel_check_drop_forbidden (panel_widget, context, info, time)) return FALSE; do_highlight (widget, TRUE); panel_toplevel_unhide (toplevel); return TRUE; }
static gboolean drag_motion_cb (GtkWidget *widget, GdkDragContext *context, int x, int y, guint time_, Drawer *drawer) { PanelWidget *panel_widget; guint info = 0; if (!panel_check_dnd_target_data (widget, context, &info, NULL)) return FALSE; panel_widget = panel_toplevel_get_panel_widget (drawer->toplevel); if (!panel_check_drop_forbidden (panel_widget, context, info, time_)) return FALSE; if (drawer->close_timeout_id) g_source_remove (drawer->close_timeout_id); drawer->close_timeout_id = 0; button_widget_set_dnd_highlight (BUTTON_WIDGET (widget), TRUE); if (panel_toplevel_get_is_hidden (drawer->toplevel)) { panel_toplevel_unhide (drawer->toplevel); drawer->opened_for_drag = TRUE; } return TRUE; }
static gboolean panel_popup_menu (PanelToplevel *toplevel, guint button, guint32 activate_time) { PanelWidget *panel_widget; GtkWidget *menu; PanelData *panel_data; GdkEvent *current_event; panel_widget = panel_toplevel_get_panel_widget (toplevel); panel_data = g_object_get_data (G_OBJECT (toplevel), "PanelData"); current_event = gtk_get_current_event (); if (current_event->type == GDK_BUTTON_PRESS) panel_data->insert_pack_type = panel_widget_get_insert_pack_type_at_cursor (panel_widget); else panel_data->insert_pack_type = PANEL_OBJECT_PACK_START; menu = make_popup_panel_menu (panel_widget); if (!menu) return FALSE; gtk_menu_set_screen (GTK_MENU (menu), gtk_window_get_screen (GTK_WINDOW (toplevel))); gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, activate_time); 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 mate_panel_applet_destroy (GtkWidget *widget, AppletInfo *info) { GList *l; g_return_if_fail (info != NULL); info->widget = NULL; registered_applets = g_slist_remove (registered_applets, info); queued_position_saves = g_slist_remove (queued_position_saves, info); if (info->type == PANEL_OBJECT_DRAWER) { Drawer *drawer = info->data; if (drawer->toplevel) { PanelWidget *panel_widget; panel_widget = panel_toplevel_get_panel_widget ( drawer->toplevel); panel_widget->master_widget = NULL; gtk_widget_destroy (GTK_WIDGET (drawer->toplevel)); drawer->toplevel = NULL; } } if (info->type != PANEL_OBJECT_APPLET) panel_lockdown_notify_remove (G_CALLBACK (mate_panel_applet_recreate_menu), info); if (info->menu) g_object_unref (info->menu); info->menu = NULL; if (info->data_destroy) info->data_destroy (info->data); info->data = NULL; for (l = info->user_menu; l != NULL; l = l->next) { AppletUserMenu *umenu = l->data; g_free (umenu->name); g_free (umenu->stock_item); g_free (umenu->text); g_free (umenu); } g_list_free (info->user_menu); info->user_menu = NULL; g_free (info->id); info->id = NULL; g_free (info); }
static void applet_callback_callback (GtkWidget *widget, AppletUserMenu *menu) { GdkScreen *screen; g_return_if_fail (menu->info != NULL); screen = applet_user_menu_get_screen (menu); switch (menu->info->type) { case PANEL_OBJECT_LAUNCHER: if (!strcmp (menu->name, "launch")) launcher_launch (menu->info->data, widget); else if (!strcmp (menu->name, "properties")) launcher_properties (menu->info->data); break; case PANEL_OBJECT_DRAWER: if (strcmp (menu->name, "add") == 0) { Drawer *drawer = menu->info->data; panel_addto_present (GTK_MENU_ITEM (widget), panel_toplevel_get_panel_widget (drawer->toplevel)); } else if (strcmp (menu->name, "properties") == 0) { Drawer *drawer = menu->info->data; panel_properties_dialog_present (drawer->toplevel); } else if (strcmp (menu->name, "help") == 0) { panel_show_help (screen, "user-guide", "gospanel-18", NULL); } break; case PANEL_OBJECT_MENU: panel_menu_button_invoke_menu ( PANEL_MENU_BUTTON (menu->info->widget), menu->name); break; case PANEL_OBJECT_ACTION: case PANEL_OBJECT_LOGOUT: case PANEL_OBJECT_LOCK: panel_action_button_invoke_menu ( PANEL_ACTION_BUTTON (menu->info->widget), menu->name); break; case PANEL_OBJECT_MENU_BAR: panel_menu_bar_invoke_menu ( PANEL_MENU_BAR (menu->info->widget), menu->name); break; case PANEL_OBJECT_APPLET: /* * Applet's menu's are handled differently */ break; case PANEL_OBJECT_SEPARATOR: break; default: g_assert_not_reached (); break; } }
static void mate_panel_applet_destroy (GtkWidget *widget, AppletInfo *info) { g_return_if_fail (info != NULL); g_signal_handlers_disconnect_by_data(info->settings,widget); info->widget = NULL; if (info->settings) { g_object_unref (info->settings); info->settings = NULL; } registered_applets = g_slist_remove (registered_applets, info); queued_position_saves = g_slist_remove (queued_position_saves, info); if (info->type == PANEL_OBJECT_DRAWER) { Drawer *drawer = info->data; if (drawer->toplevel) { PanelWidget *panel_widget; panel_widget = panel_toplevel_get_panel_widget ( drawer->toplevel); panel_widget->master_widget = NULL; gtk_widget_destroy (GTK_WIDGET (drawer->toplevel)); drawer->toplevel = NULL; } } if (info->type != PANEL_OBJECT_APPLET) panel_lockdown_notify_remove (G_CALLBACK (mate_panel_applet_recreate_menu), info); if (info->menu) { g_signal_handlers_disconnect_by_func (info->menu, G_CALLBACK (applet_menu_show), info); g_signal_handlers_disconnect_by_func (info->menu, G_CALLBACK (applet_menu_deactivate), info); g_object_unref (info->menu); } info->menu = NULL; if (info->data_destroy) info->data_destroy (info->data); info->data = NULL; mate_panel_applet_clear_user_menu (info); g_free (info->id); info->id = NULL; g_free (info); }
static void drawer_focus_panel_widget (Drawer *drawer, GtkDirectionType direction) { PanelWidget *panel_widget; panel_widget = panel_toplevel_get_panel_widget (drawer->toplevel); gtk_window_present (GTK_WINDOW (drawer->toplevel)); gtk_container_set_focus_child (GTK_CONTAINER (panel_widget), NULL); gtk_widget_child_focus (GTK_WIDGET (panel_widget), direction); }
static void panel_menu_button_associate_panel (PanelMenuButton *button) { PanelWidget *panel_widget = NULL; if (!button->priv->menu) return; if (button->priv->toplevel) panel_widget = panel_toplevel_get_panel_widget (button->priv->toplevel); mate_panel_applet_menu_set_recurse (GTK_MENU (button->priv->menu), "menu_panel", panel_widget); }
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; }
void panel_delete (PanelToplevel *toplevel) { PanelWidget *panel_widget; panel_widget = panel_toplevel_get_panel_widget (toplevel); if (!panel_global_config_get_confirm_panel_remove () || !g_list_length (panel_widget->applet_list)) { panel_delete_without_query (toplevel); return; } panel_query_deletion (toplevel); }
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); }
void orientation_change (AppletInfo *info, PanelWidget *panel) { PanelOrientation orientation; orientation = panel_widget_get_applet_orientation (panel); switch (info->type) { case PANEL_OBJECT_APPLET: mate_panel_applet_frame_change_orientation ( MATE_PANEL_APPLET_FRAME (info->widget), orientation); break; case PANEL_OBJECT_MENU: case PANEL_OBJECT_LAUNCHER: case PANEL_OBJECT_ACTION: button_widget_set_orientation (BUTTON_WIDGET (info->widget), orientation); break; case PANEL_OBJECT_MENU_BAR: panel_menu_bar_set_orientation (PANEL_MENU_BAR (info->widget), orientation); break; case PANEL_OBJECT_DRAWER: { Drawer *drawer = info->data; PanelWidget *panel_widget; panel_widget = panel_toplevel_get_panel_widget (drawer->toplevel); button_widget_set_orientation (BUTTON_WIDGET (info->widget), orientation); gtk_widget_queue_resize (GTK_WIDGET (drawer->toplevel)); gtk_container_foreach (GTK_CONTAINER (panel_widget), orient_change_foreach, panel_widget); } break; case PANEL_OBJECT_SEPARATOR: panel_separator_set_orientation (PANEL_SEPARATOR (info->widget), orientation); break; default: break; } }
static GtkWidget * make_popup_panel_menu (PanelWidget *panel_widget) { PanelData *pd; GtkWidget *menu; if (!panel_widget) { PanelToplevel *toplevel; toplevel = PANEL_TOPLEVEL (((PanelData *) panel_list->data)->panel); panel_widget = panel_toplevel_get_panel_widget (toplevel); } pd = g_object_get_data (G_OBJECT (panel_widget->toplevel), "PanelData"); menu = panel_menu_get (panel_widget, pd); g_object_set_data (G_OBJECT (menu), "menu_panel", panel_widget); return menu; }
static void drag_data_received_cb (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time_, Drawer *drawer) { PanelWidget *panel_widget; if (!panel_check_dnd_target_data (widget, context, &info, NULL)) { gtk_drag_finish (context, FALSE, FALSE, time_); return; } panel_widget = panel_toplevel_get_panel_widget (drawer->toplevel); panel_receive_dnd_data (panel_widget, info, -1, selection_data, context, time_); }
/* * This function implements Esc moving focus from the drawer to the drawer * icon and closing the drawer and Shift+Esc moving focus from the drawer * to the drawer icon without closing the drawer when focus is in the drawer. */ static gboolean key_press_drawer_widget (GtkWidget *widget, GdkEventKey *event, Drawer *drawer) { PanelWidget *panel_widget; if (event->keyval != GDK_KEY_Escape) return FALSE; panel_widget = panel_toplevel_get_panel_widget (drawer->toplevel); gtk_window_present (GTK_WINDOW (panel_widget->toplevel)); if ((event->state & gtk_accelerator_get_default_mod_mask ()) == GDK_SHIFT_MASK || panel_toplevel_get_is_hidden (drawer->toplevel)) return TRUE; panel_toplevel_hide (drawer->toplevel, FALSE, -1); return TRUE; }
void panel_delete (PanelToplevel *toplevel) { GSettings *settings; gboolean confirm; PanelWidget *panel_widget; settings = g_settings_new (PANEL_GENERAL_SCHEMA); confirm = g_settings_get_boolean (settings, PANEL_GENERAL_CONFIRM_PANEL_REMOVAL_KEY); g_object_unref (settings); panel_widget = panel_toplevel_get_panel_widget (toplevel); if (!confirm || !g_list_length (panel_widget->applet_list)) { panel_delete_without_query (toplevel); return; } panel_query_deletion (toplevel); }
static void drag_data_recieved_cb (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time) { PanelWidget *panel_widget; int pos; g_return_if_fail (PANEL_IS_TOPLEVEL (widget)); /* we use this only to really find out the info, we already know this is an ok drop site and the info that got passed to us is bogus (it's always 0 in fact) */ if (!panel_check_dnd_target_data (widget, context, &info, NULL)) { gtk_drag_finish (context, FALSE, FALSE, time); return; } panel_widget = panel_toplevel_get_panel_widget (PANEL_TOPLEVEL (widget)); pos = panel_widget_get_cursorloc (panel_widget); /* * -1 passed to mate_panel_applet_register will turn on * the insert_at_pos flag for panel_widget_add_full, * which will not place it after the first applet. */ if(pos < 0) pos = -1; else if(pos > panel_widget->size) pos = panel_widget->size; panel_receive_dnd_data ( panel_widget, info, pos, selection_data, context, time); }
static GtkWidget * panel_menu_button_create_menu (PanelMenuButton *button) { PanelWidget *panel_widget; if (button->priv->menu) return button->priv->menu; if (!button->priv->toplevel) return NULL; panel_widget = panel_toplevel_get_panel_widget (button->priv->toplevel); if (button->priv->use_menu_path && button->priv->path_root > FIRST_MENU && button->priv->path_root < LAST_MENU) { const char *filename; filename = panel_menu_path_root_to_filename (button->priv->path_root); button->priv->menu = create_applications_menu (filename, button->priv->menu_path, TRUE); } else button->priv->menu = create_main_menu (panel_widget); gtk_menu_attach_to_widget (GTK_MENU (button->priv->menu), GTK_WIDGET (button), (GtkMenuDetachFunc) panel_menu_button_menu_detacher); panel_menu_button_associate_panel (button); g_signal_connect_swapped (button->priv->menu, "deactivate", G_CALLBACK (panel_menu_button_menu_deactivated), button); return button->priv->menu; }
static gboolean panel_object_loader_idle_handler (gpointer dummy) { PanelObjectToLoad *object = NULL; PanelToplevel *toplevel = NULL; PanelWidget *panel_widget; GSList *l; char *iid = NULL; PanelObjectType object_type; char *object_type_detail = NULL; gboolean ret; if (!panel_objects_to_load) { panel_object_loader_have_idle = FALSE; return FALSE; } for (l = panel_objects_to_load; l; l = l->next) { object = l->data; toplevel = panel_toplevel_get_by_id (object->toplevel_id); if (toplevel) break; } if (!l) { /* All the remaining objects don't have a panel */ for (l = panel_objects_to_load; l; l = l->next) free_object_to_load (l->data); g_slist_free (panel_objects_to_load); panel_objects_to_load = NULL; panel_object_loader_have_idle = FALSE; if (panel_objects_loading == NULL) { /* unhide any potential initially hidden toplevel */ panel_object_loader_queue_initial_unhide_toplevels (NULL); } return FALSE; } panel_objects_to_load = g_slist_delete_link (panel_objects_to_load, l); panel_objects_loading = g_slist_append (panel_objects_loading, object); panel_widget = panel_toplevel_get_panel_widget (toplevel); iid = g_settings_get_string (object->settings, PANEL_OBJECT_IID_KEY); ret = panel_object_iid_to_type (iid, &object_type, &object_type_detail); if (!ret) { g_printerr ("Object '%s' has an invalid iid ('%s')\n", object->id, iid); panel_object_loader_stop_loading (object->id); g_free (iid); return TRUE; } g_free (iid); switch (object_type) { case PANEL_OBJECT_APPLET: panel_applet_frame_load (panel_widget, object->id, object->settings); break; case PANEL_OBJECT_MENU: panel_menu_button_load (panel_widget, object->id, object->settings); break; case PANEL_OBJECT_LAUNCHER: launcher_load (panel_widget, object->id, object->settings); break; case PANEL_OBJECT_ACTION: panel_action_button_load (panel_widget, object->id, object->settings, object_type_detail); break; case PANEL_OBJECT_MENU_BAR: panel_menu_bar_load (panel_widget, object->id, object->settings); break; case PANEL_OBJECT_SEPARATOR: panel_separator_load (panel_widget, object->id, object->settings); break; case PANEL_OBJECT_USER_MENU: panel_user_menu_load (panel_widget, object->id, object->settings); break; default: g_assert_not_reached (); break; } /* We load applets asynchronously, so we specifically don't call * panel_object_loader_stop_loading() for this type. */ if (object_type != PANEL_OBJECT_APPLET) panel_object_loader_stop_loading (object->id); return TRUE; }
static void load_drawer_applet (char *toplevel_id, GSettings *settings, const char *custom_icon, gboolean use_custom_icon, const char *tooltip, PanelToplevel *parent_toplevel, gboolean locked, int pos, gboolean exactpos, const char *id) { PanelOrientation orientation; PanelToplevel *toplevel = NULL; Drawer *drawer = NULL; PanelWidget *panel_widget; orientation = panel_toplevel_get_orientation (parent_toplevel); if (toplevel_id) toplevel = panel_profile_get_toplevel_by_id (toplevel_id); if (!toplevel) toplevel = create_drawer_toplevel (id, settings); if (toplevel) { panel_toplevel_hide (toplevel, FALSE, -1); drawer = create_drawer_applet (toplevel, parent_toplevel, tooltip, custom_icon, use_custom_icon, orientation); } if (!drawer) return; panel_widget = panel_toplevel_get_panel_widget (parent_toplevel); drawer->info = mate_panel_applet_register (drawer->button, drawer, (GDestroyNotify) g_free, panel_widget, locked, pos, exactpos, PANEL_OBJECT_DRAWER, id); if (!drawer->info) { gtk_widget_destroy (GTK_WIDGET (toplevel)); return; } g_signal_connect_after (drawer->button, "size_allocate", G_CALLBACK (drawer_button_size_allocated), drawer); panel_widget_add_forbidden (panel_toplevel_get_panel_widget (drawer->toplevel)); panel_widget_set_applet_expandable (panel_widget, GTK_WIDGET (drawer->button), FALSE, TRUE); panel_widget_set_applet_size_constrained (panel_widget, GTK_WIDGET (drawer->button), TRUE); mate_panel_applet_add_callback (drawer->info, "add", "list-add", _("_Add to Drawer..."), drawer_changes_enabled); mate_panel_applet_add_callback (drawer->info, "properties", "document-properties", _("_Properties"), drawer_changes_enabled); mate_panel_applet_add_callback (drawer->info, "help", "help-browser", _("_Help"), NULL); panel_drawer_connect_to_gsettings (drawer); }
static PanelPropertiesDialog * panel_properties_dialog_new (PanelToplevel *toplevel, GladeXML *gui) { PanelPropertiesDialog *dialog; dialog = g_new0 (PanelPropertiesDialog, 1); g_object_set_qdata_full (G_OBJECT (toplevel), panel_properties_dialog_quark, dialog, (GDestroyNotify) panel_properties_dialog_free); dialog->toplevel = toplevel; dialog->properties_dialog = glade_xml_get_widget (gui, "panel_properties_dialog"); g_signal_connect_swapped (dialog->properties_dialog, "response", G_CALLBACK (panel_properties_dialog_response), dialog); g_signal_connect_swapped (dialog->properties_dialog, "destroy", G_CALLBACK (panel_properties_dialog_destroy), dialog); gtk_window_set_screen (GTK_WINDOW (dialog->properties_dialog), gtk_window_get_screen (GTK_WINDOW (toplevel))); dialog->writability_warn_general = glade_xml_get_widget (gui, "writability_warn_general"); dialog->writability_warn_background = glade_xml_get_widget (gui, "writability_warn_background"); dialog->general_vbox = glade_xml_get_widget (gui, "general_vbox"); dialog->general_table = glade_xml_get_widget (gui, "general_table"); panel_properties_dialog_setup_orientation_combo (dialog, gui); panel_properties_dialog_setup_size_spin (dialog, gui); panel_properties_dialog_setup_icon_entry (dialog, gui); panel_properties_dialog_setup_expand_toggle (dialog, gui); panel_properties_dialog_setup_autohide_toggle (dialog, gui); panel_properties_dialog_setup_hidebuttons_toggle (dialog, gui); panel_properties_dialog_setup_arrows_toggle (dialog, gui); panel_properties_update_arrows_toggle_visible ( dialog, GTK_TOGGLE_BUTTON (dialog->hidebuttons_toggle)); g_signal_connect_swapped (dialog->hidebuttons_toggle, "toggled", G_CALLBACK (panel_properties_update_arrows_toggle_visible), dialog); dialog->toplevel_notify = panel_profile_toplevel_notify_add ( dialog->toplevel, NULL, (GConfClientNotifyFunc) panel_properties_dialog_toplevel_notify, dialog); panel_properties_dialog_setup_color_button (dialog, gui); panel_properties_dialog_setup_image_chooser (dialog, gui); panel_properties_dialog_setup_opacity_scale (dialog, gui); panel_properties_dialog_setup_background_radios (dialog, gui); dialog->background_notify = panel_profile_toplevel_notify_add ( dialog->toplevel, "background", (GConfClientNotifyFunc) panel_properties_dialog_background_notify, dialog); panel_properties_dialog_update_for_attached (dialog, panel_toplevel_get_is_attached (dialog->toplevel)); panel_toplevel_push_autohide_disabler (dialog->toplevel); panel_widget_register_open_dialog (panel_toplevel_get_panel_widget (dialog->toplevel), dialog->properties_dialog); g_signal_connect (dialog->properties_dialog, "event", G_CALLBACK (config_event), glade_xml_get_widget (gui, "notebook")); gtk_widget_show (dialog->properties_dialog); return dialog; }
static PanelPropertiesDialog * panel_properties_dialog_new (PanelToplevel *toplevel, GtkBuilder *gui) { PanelPropertiesDialog *dialog; char *toplevel_settings_path; dialog = g_new0 (PanelPropertiesDialog, 1); g_object_set_qdata_full (G_OBJECT (toplevel), panel_properties_dialog_quark, dialog, (GDestroyNotify) panel_properties_dialog_free); dialog->toplevel = toplevel; dialog->properties_dialog = PANEL_GTK_BUILDER_GET (gui, "panel_properties_dialog"); g_signal_connect_swapped (dialog->properties_dialog, "response", G_CALLBACK (panel_properties_dialog_response), dialog); g_signal_connect_swapped (dialog->properties_dialog, "destroy", G_CALLBACK (panel_properties_dialog_destroy), dialog); gtk_window_set_screen (GTK_WINDOW (dialog->properties_dialog), gtk_window_get_screen (GTK_WINDOW (toplevel))); dialog->writability_warn_general = PANEL_GTK_BUILDER_GET (gui, "writability_warn_general"); dialog->writability_warn_background = PANEL_GTK_BUILDER_GET (gui, "writability_warn_background"); dialog->general_vbox = PANEL_GTK_BUILDER_GET (gui, "general_vbox"); dialog->general_table = PANEL_GTK_BUILDER_GET (gui, "general_table"); panel_properties_dialog_setup_orientation_combo (dialog, gui); panel_properties_dialog_setup_size_spin (dialog, gui); panel_properties_dialog_setup_icon_chooser (dialog, gui); panel_properties_dialog_setup_expand_toggle (dialog, gui); panel_properties_dialog_setup_autohide_toggle (dialog, gui); panel_properties_dialog_setup_hidebuttons_toggle (dialog, gui); panel_properties_dialog_setup_arrows_toggle (dialog, gui); g_signal_connect_swapped (dialog->expand_toggle, "toggled", G_CALLBACK (panel_properties_dialog_setup_orientation_combo_sensitivty), dialog); panel_properties_update_arrows_toggle_visible ( dialog, GTK_TOGGLE_BUTTON (dialog->hidebuttons_toggle)); g_signal_connect_swapped (dialog->hidebuttons_toggle, "toggled", G_CALLBACK (panel_properties_update_arrows_toggle_visible), dialog); g_object_get (toplevel, "settings-path", &toplevel_settings_path, NULL); dialog->settings = g_settings_new_with_path (PANEL_TOPLEVEL_SCHEMA, toplevel_settings_path); gchar *toplevel_background_path; toplevel_background_path = g_strdup_printf ("%sbackground/", toplevel_settings_path); dialog->background_settings = g_settings_new_with_path (PANEL_TOPLEVEL_BACKGROUND_SCHEMA, toplevel_background_path); g_free (toplevel_background_path); g_signal_connect (dialog->settings, "changed", G_CALLBACK (panel_properties_dialog_toplevel_notify), dialog); panel_properties_dialog_setup_color_button (dialog, gui); panel_properties_dialog_setup_image_chooser (dialog, gui); panel_properties_dialog_setup_opacity_scale (dialog, gui); panel_properties_dialog_setup_background_radios (dialog, gui); g_signal_connect (dialog->background_settings, "changed", G_CALLBACK (panel_properties_dialog_background_notify), dialog); panel_properties_dialog_update_for_attached (dialog, panel_toplevel_get_is_attached (dialog->toplevel)); panel_toplevel_push_autohide_disabler (dialog->toplevel); panel_widget_register_open_dialog (panel_toplevel_get_panel_widget (dialog->toplevel), dialog->properties_dialog); #if !GTK_CHECK_VERSION (3, 0, 0) /* FIXME re-add once GTK3 support is fixed */ g_signal_connect (dialog->properties_dialog, "event", G_CALLBACK (config_event), PANEL_GTK_BUILDER_GET (gui, "notebook")); #endif gtk_widget_show (dialog->properties_dialog); return dialog; }
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; }
static gboolean mate_panel_applet_load_idle_handler (gpointer dummy) { PanelObjectType applet_type; MatePanelAppletToLoad *applet = NULL; PanelToplevel *toplevel = NULL; PanelWidget *panel_widget; GSList *l; if (!mate_panel_applets_to_load) { mate_panel_applet_have_load_idle = FALSE; return FALSE; } for (l = mate_panel_applets_to_load; l; l = l->next) { applet = l->data; toplevel = panel_profile_get_toplevel_by_id (applet->toplevel_id); if (toplevel) break; } if (!l) { /* All the remaining applets don't have a panel */ for (l = mate_panel_applets_to_load; l; l = l->next) free_applet_to_load (l->data); g_slist_free (mate_panel_applets_to_load); mate_panel_applets_to_load = NULL; mate_panel_applet_have_load_idle = FALSE; if (mate_panel_applets_loading == NULL) { /* unhide any potential initially hidden toplevel */ mate_panel_applet_queue_initial_unhide_toplevels (NULL); } return FALSE; } mate_panel_applets_to_load = g_slist_delete_link (mate_panel_applets_to_load, l); mate_panel_applets_loading = g_slist_append (mate_panel_applets_loading, applet); panel_widget = panel_toplevel_get_panel_widget (toplevel); if (applet->right_stick) { if (!panel_widget->packed) applet->position = panel_widget->size - applet->position; else applet->position = -1; } /* We load applets asynchronously, so we specifically don't call * mate_panel_applet_stop_loading() for this type. However, in case of * failure during the load, we might call mate_panel_applet_stop_loading() * synchronously, which will make us lose the content of the applet * variable. So we save the type to be sure we always ignore the * applets. */ applet_type = applet->type; switch (applet_type) { case PANEL_OBJECT_APPLET: mate_panel_applet_frame_load_from_gsettings ( panel_widget, applet->locked, applet->position, applet->id); break; case PANEL_OBJECT_DRAWER: drawer_load_from_gsettings (panel_widget, applet->locked, applet->position, applet->id); break; case PANEL_OBJECT_MENU: panel_menu_button_load_from_gsettings (panel_widget, applet->locked, applet->position, TRUE, applet->id); break; case PANEL_OBJECT_LAUNCHER: launcher_load_from_gsettings (panel_widget, applet->locked, applet->position, applet->id); break; case PANEL_OBJECT_ACTION: panel_action_button_load_from_gsettings ( panel_widget, applet->locked, applet->position, TRUE, applet->id); break; case PANEL_OBJECT_MENU_BAR: panel_menu_bar_load_from_gsettings ( panel_widget, applet->locked, applet->position, TRUE, applet->id); break; case PANEL_OBJECT_SEPARATOR: panel_separator_load_from_gsettings (panel_widget, applet->locked, applet->position, applet->id); break; default: g_assert_not_reached (); break; } /* Only the real applets will do a late stop_loading */ if (applet_type != PANEL_OBJECT_APPLET) mate_panel_applet_stop_loading (applet->id); return TRUE; }