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




