static void mate_panel_applet_added(GtkWidget *widget, GtkWidget *applet, gpointer data) { AppletInfo *info; info = g_object_get_data (G_OBJECT (applet), "applet_info"); orientation_change(info,PANEL_WIDGET(widget)); size_change(info,PANEL_WIDGET(widget)); back_change(info,PANEL_WIDGET(widget)); }
static gboolean move_applet (PanelWidget *panel, PanelObjectPackType pack_type, int pack_index, int applet_index) { GSList *applet_list; AppletInfo *info; GtkWidget *parent; applet_list = panel_applet_list_applets (); info = g_slist_nth_data (applet_list, applet_index); if (info == NULL || info->widget == NULL || !panel_applet_can_freely_move (info)) return FALSE; parent = gtk_widget_get_parent (info->widget); if (parent != NULL && PANEL_IS_WIDGET (parent)) { panel_widget_reparent (PANEL_WIDGET (parent), panel, info->widget, pack_type, pack_index); } return TRUE; }
static void main_menu_append (GtkWidget *main_menu, gpointer data) { PanelWidget *panel; GtkWidget *item; gboolean add_separator; GList *children; GList *last; panel = PANEL_WIDGET (data); add_separator = FALSE; children = gtk_container_get_children (GTK_CONTAINER (main_menu)); last = g_list_last (children); if (last != NULL) { add_separator = !GTK_IS_SEPARATOR (GTK_WIDGET (last->data)); } g_list_free (children); if (add_separator) add_menu_separator (main_menu); item = panel_place_menu_item_new (TRUE); panel_place_menu_item_set_panel (item, panel); gtk_menu_shell_append (GTK_MENU_SHELL (main_menu), item); gtk_widget_show (item); item = panel_desktop_menu_item_new (TRUE, FALSE); panel_desktop_menu_item_set_panel (item, panel); gtk_menu_shell_append (GTK_MENU_SHELL (main_menu), item); gtk_widget_show (item); panel_menu_items_append_lock_logout (main_menu); }
static gboolean move_applet (PanelWidget *panel, int pos, int applet_index) { GSList *applet_list; AppletInfo *info; GtkWidget *parent; applet_list = mate_panel_applet_list_applets (); info = g_slist_nth_data (applet_list, applet_index); if ( ! mate_panel_applet_can_freely_move (info)) return FALSE; if (pos < 0) pos = 0; parent = gtk_widget_get_parent (info->widget); if (info != NULL && info->widget != NULL && parent != NULL && PANEL_IS_WIDGET (parent)) { GSList *forb; forb = g_object_get_data (G_OBJECT (info->widget), MATE_PANEL_APPLET_FORBIDDEN_PANELS); if ( ! g_slist_find (forb, panel)) panel_widget_reparent (PANEL_WIDGET (parent), panel, info->widget, pos); } return TRUE; }
static void panel_back_change (GtkWidget *widget, gpointer data) { gtk_container_foreach (GTK_CONTAINER (widget), (GtkCallback) back_change_foreach, widget); #ifdef FIXME_FOR_NEW_CONFIG /*update the configuration box if it is displayed*/ update_config_back(PANEL_WIDGET(widget)); #endif /* FIXME_FOR_NEW_CONFIG */ }
static GdkScreen * launcher_get_screen (Launcher *launcher) { PanelWidget *panel_widget; g_return_val_if_fail (launcher != NULL, NULL); g_return_val_if_fail (launcher->info != NULL, NULL); g_return_val_if_fail (launcher->info->widget != NULL, NULL); panel_widget = PANEL_WIDGET (gtk_widget_get_parent (launcher->info->widget)); return gtk_window_get_screen (GTK_WINDOW (panel_widget->toplevel)); }
static void mate_panel_applet_removed(GtkWidget *widget, GtkWidget *applet, gpointer data) { PanelToplevel *toplevel; AppletInfo *info; toplevel = PANEL_WIDGET (widget)->toplevel; info = g_object_get_data (G_OBJECT (applet), "applet_info"); if (info->type == PANEL_OBJECT_DRAWER) { Drawer *drawer = info->data; if (drawer->toplevel) panel_toplevel_queue_auto_hide (toplevel); } }
static void mate_panel_applet_frame_matecomponent_change_background (MatePanelAppletFrame *frame, PanelBackgroundType type) { MatePanelAppletFrameMateComponent *matecomponent_frame = MATE_PANEL_APPLET_FRAME_MATECOMPONENT (frame); char *bg_str; bg_str = _mate_panel_applet_frame_get_background_string ( frame, PANEL_WIDGET (GTK_WIDGET (frame)->parent), type); if (bg_str != NULL) { matecomponent_pbclient_set_string (matecomponent_frame->priv->property_bag, PROPERTY_BACKGROUND, bg_str, NULL); g_free (bg_str); } }
void launcher_properties (Launcher *launcher) { if (launcher->prop_dialog != NULL) { gtk_window_set_screen (GTK_WINDOW (launcher->prop_dialog), gtk_widget_get_screen (launcher->button)); gtk_window_present (GTK_WINDOW (launcher->prop_dialog)); return; } launcher->prop_dialog = panel_ditem_editor_new (NULL, launcher->key_file, launcher->location, _("Launcher Properties")); gtk_window_set_screen (GTK_WINDOW (launcher->prop_dialog), gtk_widget_get_screen (launcher->button)); panel_widget_register_open_dialog (PANEL_WIDGET (gtk_widget_get_parent (launcher->info->widget)), launcher->prop_dialog); panel_ditem_register_save_uri_func (PANEL_DITEM_EDITOR (launcher->prop_dialog), launcher_save_uri, launcher); g_signal_connect (launcher->prop_dialog, "changed", G_CALLBACK (launcher_changed), launcher); g_signal_connect (launcher->prop_dialog, "command_changed", G_CALLBACK (launcher_command_changed), launcher); g_signal_connect (launcher->prop_dialog, "saved", G_CALLBACK (launcher_saved), launcher); g_signal_connect (launcher->prop_dialog, "error_reported", G_CALLBACK (launcher_error_reported), NULL); g_signal_connect (launcher->prop_dialog, "destroy", G_CALLBACK (gtk_widget_destroyed), &launcher->prop_dialog); gtk_widget_show (launcher->prop_dialog); }
static void panel_menu_button_parent_set (GtkWidget *widget, GtkWidget *previous_parent) { PanelMenuButton *button = PANEL_MENU_BUTTON (widget); g_return_if_fail (!widget->parent || PANEL_IS_WIDGET (widget->parent)); if (widget->parent) button->priv->toplevel = PANEL_WIDGET (widget->parent)->toplevel; else button->priv->toplevel = NULL; panel_menu_button_associate_panel (button); panel_menu_button_set_icon (button); if (GTK_WIDGET_CLASS (parent_class)->parent_set) GTK_WIDGET_CLASS (parent_class)->parent_set (widget, previous_parent); }
gboolean panel_is_applet_right_stick (GtkWidget *applet) { GtkWidget *parent; PanelWidget *panel_widget; g_return_val_if_fail (GTK_IS_WIDGET (applet), FALSE); parent = gtk_widget_get_parent (applet); g_return_val_if_fail (PANEL_IS_WIDGET (parent), FALSE); panel_widget = PANEL_WIDGET (parent); if (!panel_toplevel_get_expand (panel_widget->toplevel)) return FALSE; return panel_widget_is_applet_stuck (panel_widget, applet); }
static void move_applet_callback (GtkWidget *widget, AppletInfo *info) { GtkWidget *parent; PanelWidget *panel; g_return_if_fail (info != NULL); g_return_if_fail (info->widget != NULL); parent = gtk_widget_get_parent (info->widget); g_return_if_fail (parent != NULL); g_return_if_fail (PANEL_IS_WIDGET (parent)); panel = PANEL_WIDGET (parent); panel_widget_applet_drag_start (panel, info->widget, GDK_CURRENT_TIME); }
static void mate_panel_applet_frame_dbus_change_background (MatePanelAppletFrame *frame, PanelBackgroundType type) { MatePanelAppletFrameDBus *dbus_frame = MATE_PANEL_APPLET_FRAME_DBUS (frame); char *bg_str; bg_str = _mate_panel_applet_frame_get_background_string ( frame, PANEL_WIDGET (gtk_widget_get_parent (GTK_WIDGET (frame))), type); if (bg_str != NULL) { if (dbus_frame->priv->bg_cancellable) g_cancellable_cancel (dbus_frame->priv->bg_cancellable); dbus_frame->priv->bg_cancellable = g_cancellable_new (); mate_panel_applet_container_child_set (dbus_frame->priv->container, "background", g_variant_new_string (bg_str), dbus_frame->priv->bg_cancellable, container_child_background_set, dbus_frame); g_free (bg_str); } }
static void panel_action_button_clicked (GtkButton *gtk_button) { PanelActionButton *button; g_return_if_fail (PANEL_IS_ACTION_BUTTON (gtk_button)); button = PANEL_ACTION_BUTTON (gtk_button); g_return_if_fail (button->priv->type > PANEL_ACTION_NONE); g_return_if_fail (button->priv->type < PANEL_ACTION_LAST); if (panel_global_config_get_drawer_auto_close ()) { PanelToplevel *toplevel; toplevel = PANEL_WIDGET (gtk_widget_get_parent (GTK_WIDGET (button)))->toplevel; if (panel_toplevel_get_is_attached (toplevel)) panel_toplevel_hide (toplevel, FALSE, -1); } if (actions [button->priv->type].invoke) actions [button->priv->type].invoke (GTK_WIDGET (button)); }
static inline PanelWidget * panel_applet_get_panel_widget (AppletInfo *info) { return PANEL_WIDGET (gtk_widget_get_parent (info->widget)); }
static gboolean key_press_drawer (GtkWidget *widget, GdkEventKey *event, Drawer *drawer) { gboolean retval = TRUE; GtkOrientation orient; if (event->state & gtk_accelerator_get_default_mod_mask ()) return FALSE; orient = PANEL_WIDGET (gtk_widget_get_parent (drawer->button))->orient; switch (event->keyval) { case GDK_KEY_Up: case GDK_KEY_KP_Up: if (orient == GTK_ORIENTATION_HORIZONTAL) { if (!panel_toplevel_get_is_hidden (drawer->toplevel)) drawer_focus_panel_widget (drawer, GTK_DIR_TAB_BACKWARD); } else { /* let default focus movement happen */ retval = FALSE; } break; case GDK_KEY_Left: case GDK_KEY_KP_Left: if (orient == GTK_ORIENTATION_VERTICAL) { if (!panel_toplevel_get_is_hidden (drawer->toplevel)) drawer_focus_panel_widget (drawer, GTK_DIR_TAB_BACKWARD); } else { /* let default focus movement happen */ retval = FALSE; } break; case GDK_KEY_Down: case GDK_KEY_KP_Down: if (orient == GTK_ORIENTATION_HORIZONTAL) { if (!panel_toplevel_get_is_hidden (drawer->toplevel)) drawer_focus_panel_widget (drawer, GTK_DIR_TAB_FORWARD); } else { /* let default focus movement happen */ retval = FALSE; } break; case GDK_KEY_Right: case GDK_KEY_KP_Right: if (orient == GTK_ORIENTATION_VERTICAL) { if (!panel_toplevel_get_is_hidden (drawer->toplevel)) drawer_focus_panel_widget (drawer, GTK_DIR_TAB_FORWARD); } else { /* let default focus movement happen */ retval = FALSE; } break; case GDK_KEY_Escape: panel_toplevel_hide (drawer->toplevel, FALSE, -1); break; default: retval = FALSE; break; } return retval; }
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; }
void panel_applet_position_menu (GtkMenu *menu, int *x, int *y, gboolean *push_in, GtkWidget *applet) { GtkAllocation allocation; GtkRequisition requisition; GdkScreen *screen; GtkWidget *parent; int menu_x = 0; int menu_y = 0; int pointer_x; int pointer_y; parent = gtk_widget_get_parent (applet); g_return_if_fail (PANEL_IS_WIDGET (parent)); screen = gtk_widget_get_screen (applet); gtk_widget_get_preferred_size (GTK_WIDGET (menu), &requisition, NULL); gdk_window_get_origin (gtk_widget_get_window (applet), &menu_x, &menu_y); gtk_widget_get_pointer (applet, &pointer_x, &pointer_y); gtk_widget_get_allocation (applet, &allocation); if (!gtk_widget_get_has_window (applet)) { menu_x += allocation.x; menu_y += allocation.y; } if (PANEL_WIDGET (parent)->orient == GTK_ORIENTATION_HORIZONTAL) { if (gtk_widget_get_direction (GTK_WIDGET (menu)) != GTK_TEXT_DIR_RTL) { if (pointer_x < allocation.width && requisition.width < pointer_x) menu_x += MIN (pointer_x, allocation.width - requisition.width); } else { menu_x += allocation.width - requisition.width; if (pointer_x > 0 && pointer_x < allocation.width && pointer_x < allocation.width - requisition.width) { menu_x -= MIN (allocation.width - pointer_x, allocation.width - requisition.width); } } menu_x = MIN (menu_x, gdk_screen_get_width (screen) - requisition.width); if (menu_y > gdk_screen_get_height (screen) / 2) menu_y -= requisition.height; else menu_y += allocation.height; } else { if (pointer_y < allocation.height && requisition.height < pointer_y) menu_y += MIN (pointer_y, allocation.height - requisition.height); menu_y = MIN (menu_y, gdk_screen_get_height (screen) - requisition.height); if (menu_x > gdk_screen_get_width (screen) / 2) menu_x -= requisition.width; else menu_x += allocation.width; } *x = menu_x; *y = menu_y; *push_in = FALSE; }