← Back to team overview

ayatana-commits team mailing list archive

[Branch ~indicator-applet-developers/indicator-applet/applet] Rev 354: Make the applet support vertical panels.

 

Merge authors:
  MarkieB (ubunt-u-markbenjamin)
Related merge proposals:
  https://code.launchpad.net/~ubunt-u-markbenjamin/indicator-applet/reorient/+merge/23524
  proposed by: MarkieB (ubunt-u-markbenjamin)
  review: Approve - Sense Hofstede (qense)
------------------------------------------------------------
revno: 354 [merge]
committer: Ted Gould <ted@xxxxxxxx>
branch nick: applet
timestamp: Tue 2010-04-27 11:47:39 -0500
message:
  Make the applet support vertical panels.
modified:
  src/applet-main.c


--
lp:indicator-applet
https://code.launchpad.net/~indicator-applet-developers/indicator-applet/applet

Your team ayatana-commits is subscribed to branch lp:indicator-applet.
To unsubscribe from this branch go to https://code.launchpad.net/~indicator-applet-developers/indicator-applet/applet/+edit-subscription
=== modified file 'src/applet-main.c'
--- src/applet-main.c	2010-04-16 19:56:30 +0000
+++ src/applet-main.c	2010-04-19 02:21:44 +0000
@@ -38,6 +38,9 @@
 	NULL
 };
 
+static GtkPackDirection packdirection;
+static PanelAppletOrient orient;
+
 #define  MENU_DATA_INDICATOR_OBJECT  "indicator-object"
 #define  MENU_DATA_INDICATOR_ENTRY   "indicator-entry"
 
@@ -45,7 +48,6 @@
 
 static gboolean     applet_fill_cb (PanelApplet * applet, const gchar * iid, gpointer data);
 
-
 static void cw_panel_background_changed (PanelApplet               *applet,
                                          PanelAppletBackgroundType  type,
                         				         GdkColor                  *colour,
@@ -178,23 +180,37 @@
 }
 
 static void
-entry_added (IndicatorObject * io, IndicatorObjectEntry * entry, GtkWidget * menu)
+entry_added (IndicatorObject * io, IndicatorObjectEntry * entry, GtkWidget * menubar)
 {
 	g_debug("Signal: Entry Added");
 
 	GtkWidget * menuitem = gtk_menu_item_new();
-	GtkWidget * hbox = gtk_hbox_new(FALSE, 3);
+	GtkWidget * box = (packdirection == GTK_PACK_DIRECTION_LTR) ?
+			gtk_hbox_new(FALSE, 3) : gtk_vbox_new(FALSE, 3);
 
-        g_object_set_data (G_OBJECT (menuitem), "indicator", io);
+	g_object_set_data (G_OBJECT (menuitem), "indicator", io);
+	g_object_set_data (G_OBJECT (menuitem), "box", box);
 
 	if (entry->image != NULL) {
-		gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(entry->image), FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(entry->image), FALSE, FALSE, 0);
 	}
 	if (entry->label != NULL) {
-		gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(entry->label), FALSE, FALSE, 0);
+		switch(packdirection) {
+			case GTK_PACK_DIRECTION_LTR:
+				gtk_label_set_angle(GTK_LABEL(entry->label), 0.0);
+				break;
+			case GTK_PACK_DIRECTION_TTB:
+				gtk_label_set_angle(GTK_LABEL(entry->label),
+						(orient == PANEL_APPLET_ORIENT_LEFT) ? 
+						270.0 : 90.0);
+				break;
+			default:
+				break;
+		}		
+		gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(entry->label), FALSE, FALSE, 0);
 	}
-	gtk_container_add(GTK_CONTAINER(menuitem), hbox);
-	gtk_widget_show(hbox);
+	gtk_container_add(GTK_CONTAINER(menuitem), box);
+	gtk_widget_show(box);
 
 	if (entry->menu != NULL) {
 		gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), GTK_WIDGET(entry->menu));
@@ -206,9 +222,9 @@
 	position.menupos = 0;
 	position.found = FALSE;
 
-	gtk_container_foreach(GTK_CONTAINER(menu), place_in_menu, &position);
+	gtk_container_foreach(GTK_CONTAINER(menubar), place_in_menu, &position);
 
-	gtk_menu_shell_insert(GTK_MENU_SHELL(menu), menuitem, position.menupos);
+	gtk_menu_shell_insert(GTK_MENU_SHELL(menubar), menuitem, position.menupos);
 	gtk_widget_show(menuitem);
 
 	g_object_set_data(G_OBJECT(menuitem), MENU_DATA_INDICATOR_ENTRY,  entry);
@@ -264,13 +280,13 @@
 entry_moved (IndicatorObject * io, IndicatorObjectEntry * entry,
              gint old G_GNUC_UNUSED, gint new G_GNUC_UNUSED, gpointer user_data)
 {
-	GtkWidget * menu = GTK_WIDGET(user_data);
+	GtkWidget * menubar = GTK_WIDGET(user_data);
 
 	gpointer array[2];
 	array[0] = entry;
 	array[1] = NULL;
 
-	gtk_container_foreach(GTK_CONTAINER(user_data), entry_moved_find_cb, array);
+	gtk_container_foreach(GTK_CONTAINER(menubar), entry_moved_find_cb, array);
 	if (array[1] == NULL) {
 		g_warning("Moving an entry that isn't in our menus.");
 		return;
@@ -278,7 +294,7 @@
 
 	GtkWidget * mi = GTK_WIDGET(array[1]);
 	g_object_ref(G_OBJECT(mi));
-	gtk_container_remove(GTK_CONTAINER(user_data), mi);
+	gtk_container_remove(GTK_CONTAINER(menubar), mi);
 
 	incoming_position_t position;
 	position.objposition = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(io), IO_DATA_ORDER_NUMBER));
@@ -286,16 +302,16 @@
 	position.menupos = 0;
 	position.found = FALSE;
 
-	gtk_container_foreach(GTK_CONTAINER(menu), place_in_menu, &position);
+	gtk_container_foreach(GTK_CONTAINER(menubar), place_in_menu, &position);
 
-	gtk_menu_shell_insert(GTK_MENU_SHELL(menu), mi, position.menupos);
+	gtk_menu_shell_insert(GTK_MENU_SHELL(menubar), mi, position.menupos);
 	g_object_unref(G_OBJECT(mi));
 
 	return;
 }
 
 static gboolean
-load_module (const gchar * name, GtkWidget * menu)
+load_module (const gchar * name, GtkWidget * menubar)
 {
 	g_debug("Looking at Module: %s", name);
 	g_return_val_if_fail(name != NULL, FALSE);
@@ -314,10 +330,10 @@
 	/* Attach the 'name' to the object */
 	g_object_set_data(G_OBJECT(io), IO_DATA_ORDER_NUMBER, GINT_TO_POINTER(name2order(name)));
 
-	/* Connect to it's signals */
-	g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED,   G_CALLBACK(entry_added),    menu);
-	g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED, G_CALLBACK(entry_removed),  menu);
-	g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_MOVED,   G_CALLBACK(entry_moved),    menu);
+	/* Connect to its signals */
+	g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED,   G_CALLBACK(entry_added),    menubar);
+	g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED, G_CALLBACK(entry_removed),  menubar);
+	g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_MOVED,   G_CALLBACK(entry_moved),    menubar);
 
 	/* Work on the entries */
 	GList * entries = indicator_object_get_entries(io);
@@ -325,7 +341,7 @@
 
 	for (entry = entries; entry != NULL; entry = g_list_next(entry)) {
 		IndicatorObjectEntry * entrydata = (IndicatorObjectEntry *)entry->data;
-		entry_added(io, entrydata, menu);
+		entry_added(io, entrydata, menubar);
 	}
 
 	g_list_free(entries);
@@ -445,6 +461,72 @@
 	return;
 }
 
+static gboolean
+swap_orient_cb (GtkWidget *item, gpointer data)
+{
+	GtkWidget *from = (GtkWidget *) data;
+	GtkWidget *to = (GtkWidget *) g_object_get_data(G_OBJECT(from), "to");
+	g_object_ref(G_OBJECT(item));
+	gtk_container_remove(GTK_CONTAINER(from), item);
+	if (GTK_IS_LABEL(item)) {
+			switch(packdirection) {
+			case GTK_PACK_DIRECTION_LTR:
+				gtk_label_set_angle(GTK_LABEL(item), 0.0);
+				break;
+			case GTK_PACK_DIRECTION_TTB:
+				gtk_label_set_angle(GTK_LABEL(item),
+						(orient == PANEL_APPLET_ORIENT_LEFT) ? 
+						270.0 : 90.0);
+				break;
+			default:
+				break;
+		}		
+	}
+	gtk_box_pack_start(GTK_BOX(to), item, FALSE, FALSE, 0);
+	return TRUE;
+}
+
+static gboolean
+reorient_box_cb (GtkWidget *menuitem, gpointer data)
+{
+	GtkWidget *from = g_object_get_data(G_OBJECT(menuitem), "box");
+	GtkWidget *to = (packdirection == GTK_PACK_DIRECTION_LTR) ?
+			gtk_hbox_new(FALSE, 0) : gtk_vbox_new(FALSE, 0);
+	g_object_set_data(G_OBJECT(from), "to", to);
+	gtk_container_foreach(GTK_CONTAINER(from), (GtkCallback)swap_orient_cb,
+			from);
+	gtk_container_remove(GTK_CONTAINER(menuitem), from);
+	gtk_container_add(GTK_CONTAINER(menuitem), to);
+	g_object_set_data(G_OBJECT(menuitem), "box", to);
+	gtk_widget_show_all(menuitem);
+	return TRUE;
+}
+
+static gboolean
+panelapplet_reorient_cb (GtkWidget *applet, PanelAppletOrient neworient,
+		gpointer data)
+{
+	GtkWidget *menubar = (GtkWidget *)data;
+	if ((((neworient == PANEL_APPLET_ORIENT_UP) || 
+			(neworient == PANEL_APPLET_ORIENT_DOWN)) && 
+			((orient == PANEL_APPLET_ORIENT_LEFT) || 
+			(orient == PANEL_APPLET_ORIENT_RIGHT))) || 
+			(((neworient == PANEL_APPLET_ORIENT_LEFT) || 
+			(neworient == PANEL_APPLET_ORIENT_RIGHT)) && 
+			((orient == PANEL_APPLET_ORIENT_UP) ||
+			(orient == PANEL_APPLET_ORIENT_DOWN)))) {
+		packdirection = (packdirection == GTK_PACK_DIRECTION_LTR) ?
+				GTK_PACK_DIRECTION_TTB : GTK_PACK_DIRECTION_LTR;
+		gtk_menu_bar_set_pack_direction(GTK_MENU_BAR(menubar),
+				packdirection);
+		orient = neworient;
+		gtk_container_foreach(GTK_CONTAINER(menubar),
+				(GtkCallback)reorient_box_cb, NULL);
+	}
+	orient = neworient;
+	return FALSE;
+}
+
 #ifdef N_
 #undef N_
 #endif
@@ -519,9 +601,9 @@
 			"<menuitem name=\"About Item\" verb=\"IndicatorAppletAbout\" _label=\"" N_("_About") "\" pixtype=\"stock\" pixname=\"gtk-about\"/>"
 		"</popup>";
 
+	static gboolean first_time = FALSE;
 	GtkWidget *menubar;
 	gint indicators_loaded = 0;
-	static gboolean first_time = FALSE;
 
 #ifdef INDICATOR_APPLET_SESSION
 	/* check if we are running stracciatella session */
@@ -552,7 +634,8 @@
 	/* Set panel options */
 	gtk_container_set_border_width(GTK_CONTAINER (applet), 0);
 	panel_applet_set_flags(applet, PANEL_APPLET_EXPAND_MINOR);
-	panel_applet_setup_menu(applet, menu_xml, menu_verbs, NULL);
+	menubar = gtk_menu_bar_new();
+	panel_applet_setup_menu(applet, menu_xml, menu_verbs, menubar);
 #ifdef INDICATOR_APPLET
 	atk_object_set_name (gtk_widget_get_accessible (GTK_WIDGET (applet)),
 	                     "indicator-applet");
@@ -599,12 +682,19 @@
 	gtk_widget_set_name(GTK_WIDGET (applet), "fast-user-switch-applet");
 
 	/* Build menubar */
-	menubar = gtk_menu_bar_new();
+	orient = (panel_applet_get_orient(applet));
+	packdirection = ((orient == PANEL_APPLET_ORIENT_UP) ||
+			(orient == PANEL_APPLET_ORIENT_DOWN)) ? 
+			GTK_PACK_DIRECTION_LTR : GTK_PACK_DIRECTION_TTB;
+	gtk_menu_bar_set_pack_direction(GTK_MENU_BAR(menubar),
+			packdirection);
 	GTK_WIDGET_SET_FLAGS (menubar, GTK_WIDGET_FLAGS(menubar) | GTK_CAN_FOCUS);
 	gtk_widget_set_name(GTK_WIDGET (menubar), "fast-user-switch-menubar");
 	g_signal_connect(menubar, "button-press-event", G_CALLBACK(menubar_press), NULL);
         g_signal_connect(menubar, "scroll-event", G_CALLBACK (menubar_scroll), NULL);
 	g_signal_connect_after(menubar, "expose-event", G_CALLBACK(menubar_on_expose), menubar);
+	g_signal_connect(applet, "change-orient", 
+			G_CALLBACK(panelapplet_reorient_cb), menubar);
 	gtk_container_set_border_width(GTK_CONTAINER(menubar), 0);
 
 	/* Add in filter func */
@@ -654,6 +744,7 @@
 	gtk_widget_show(GTK_WIDGET(applet));
 
 	return TRUE;
+
 }
 
 static void