The Easiest Way to Save and Share Code Snippets on the web

miniswitch.c

c | by: Andrewshick

last edit: Jan, 23rd 2011 | jump to bottom

//	MINISWITCH gnome-panel applet by anergy.me
//	type to make: gcc -Wall miniswitch.c -o miniswitch `pkg-config --cflags gtk+-2.0 libwnck-1.0 libpanelapplet-2.0` `pkg-config --libs gtk+-2.0 libpanelapplet-2.0 libwnck-1.0`
//	put minimalswitch in /usr/lib/gnome-panel
//	create minimalswitch.server in /usr/lib/bonobo/servers
 
#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include <libwnck/screen.h>
#include <libwnck/workspace.h>
#include <panel-applet.h>
#include <stdlib.h>
 
#define PNG_ACTIVE "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAACwSURBVEiJ7ZVBCsIwEEV/giIEQUuO1Z1H8SC2x+jKXY+UZYgDUhAh300XVRedRQsiGfibgZdHZiAxJLFm2VVPL4Ii+D9BCyCNadUUSU0aflejYY3mqRiG4WatPUx7OWdxzh3n2I3mliICa9+nmXOGc26WVe0ghNCJCKYJIXQaVjUiY0zV9/3Fe38CgBjjta7rM8m0lGAHoAKwH1t3AInkYykBAGw/BE8VWz6cIvh9wQv2aZjUcrigqAAAAABJRU5ErkJggg=="
#define PNG_INACTIVE "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAAC0SURBVEiJ7ZUxDsIwDEWfExBFMLTn4Ricq5dgysKaI0WqUEQHECCUmoWJBQ90QEpGKy/P/oMjqsqcx836ehVUwX8IFpZLIgLQAOt36aaqdwtrnaCJMe5yzoec8yHGuBORxtScZVWISDeO49E5twGYpunatu1eVc/fWFNEgB+GQbz3AJRSBPAW0BpRCSH0KaVTSukUQuiBYgGtEa2ADti+SxfgrKqPXwkAlh+Cp4mt/0EVVAEvn81KwdYMrhIAAAAASUVORK5CYII="
 
int number;
gboolean compiz;
GdkPixbuf *png_active, *png_inactive;
GtkWidget *box;
WnckScreen *screen;
WnckWorkspace *space;
//	force no focus
static void force_no_focus(GtkWidget *widget){
	gtk_rc_parse_string ("style "miniswitch-style" {nGtkWidget::focus-line-width=0n}nwidget "*.miniswitch" style "miniswitch-style"");
	gtk_widget_set_name (widget, "miniswitch");
}
//	fill pixbufs
void fill_pixbufs(){
	gsize size;
	guchar* buf = g_base64_decode((gchar*)PNG_ACTIVE, &size);
	GdkPixbufLoader* pbl = gdk_pixbuf_loader_new_with_type("png", NULL);
	gdk_pixbuf_loader_write(pbl, buf, size, NULL);
	png_active = gdk_pixbuf_loader_get_pixbuf(pbl);
	size = 0;
	buf = g_base64_decode((gchar*)PNG_INACTIVE, &size);
	pbl = gdk_pixbuf_loader_new_with_type("png", NULL);
	gdk_pixbuf_loader_write(pbl, buf, size, NULL);
	png_inactive = gdk_pixbuf_loader_get_pixbuf(pbl);
}
//	redraw indicators
void miniswitch_draw_indicators(int n){
	GList *children = gtk_container_get_children(GTK_CONTAINER(box));
	int cur = 0;
	while (children) { 
		GtkWidget* evtbox = GTK_WIDGET(children->data);
		GList *img = gtk_container_get_children(GTK_CONTAINER(evtbox));
		while (img) {
			GtkWidget *widgetimg = GTK_WIDGET(img->data);
			gtk_container_remove(GTK_CONTAINER(evtbox), widgetimg);
			if(n == cur)
				gtk_container_add (GTK_CONTAINER (evtbox), gtk_image_new_from_pixbuf(png_active));
			else
				gtk_container_add (GTK_CONTAINER (evtbox), gtk_image_new_from_pixbuf(png_inactive));
			gtk_widget_show_all(GTK_WIDGET(evtbox));
			img = img->next;
		}
		cur++;
		children = children->next;
	}
}
//	move to workspace
void miniswitch_set_workspace(gpointer i) {
	int n = (int)i;
	miniswitch_draw_indicators(n);
	if(compiz){
		int width_scrn = wnck_screen_get_width(screen);
		wnck_screen_move_viewport(screen, width_scrn * n, 0);
	} else
		wnck_workspace_activate(wnck_screen_get_workspace(screen, n), 0);
}
//	follow to workspace
void miniswitch_workspace_changed(gpointer data){
	wnck_screen_force_update(screen);
	int n;
	if(compiz){
		WnckWorkspace *wspc = wnck_screen_get_active_workspace(screen);
		n = wnck_workspace_get_viewport_x(wspc) / wnck_screen_get_width(screen);
	} else
		n = wnck_workspace_get_number(wnck_screen_get_active_workspace(screen));
	miniswitch_draw_indicators(n);
}
//	create miniswitcher
GtkWidget* miniswitch_create(){
	//	get screen information
	screen = wnck_screen_get_default();
	wnck_screen_force_update(screen);
	space = wnck_screen_get_active_workspace(screen);
	number = wnck_workspace_get_width(space) / wnck_screen_get_width(screen);
	compiz = TRUE;
	if (number < wnck_screen_get_workspace_count(screen)){
		compiz = FALSE;
		number = wnck_screen_get_workspace_count(screen);
	}
	//	draw indicators
	fill_pixbufs();
	box = gtk_hbox_new (TRUE, 0);
	GtkWidget *alignment = gtk_alignment_new(0.5, 0.5, 1, 1);
	gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 20, 20);
	gtk_container_add(GTK_CONTAINER(alignment), box);
	int i;
	for (i = 0; i < number; i++) {
		GtkWidget *image = gtk_event_box_new();
		gtk_event_box_set_visible_window (GTK_EVENT_BOX(image), FALSE);	
		gtk_container_add (GTK_CONTAINER (image), gtk_image_new_from_pixbuf(png_inactive));		
		gtk_box_pack_start (GTK_BOX (box), image, TRUE, TRUE, 0);
		gtk_signal_connect_object(GTK_OBJECT(image), "button_press_event", GTK_SIGNAL_FUNC(miniswitch_set_workspace), (gpointer)i);
	}
	miniswitch_workspace_changed(NULL);
	g_signal_connect(G_OBJECT(screen), "viewports-changed", G_CALLBACK(miniswitch_workspace_changed), NULL);
	g_signal_connect(G_OBJECT(screen), "active-workspace-changed", G_CALLBACK(miniswitch_workspace_changed), NULL);
	return alignment;
}
static gboolean miniswitch_applet(PanelApplet *applet, const gchar *iid, gpointer data){
	gtk_init(NULL, NULL);
	GtkWidget *minimalswitch = miniswitch_create();
	gtk_container_add (GTK_CONTAINER (applet), minimalswitch);
	panel_applet_set_background_widget(PANEL_APPLET(applet), GTK_WIDGET(applet));
	force_no_focus(GTK_WIDGET(applet));
	gtk_widget_show_all (GTK_WIDGET (applet));
	return TRUE;
}
PANEL_APPLET_BONOBO_FACTORY ("OAFIID:MinimalSwitchApplet_Factory",PANEL_TYPE_APPLET, "MinimalSwitch Applet", "0", miniswitch_applet, NULL);
67 views