/*
 * Copyright (c) 2007,2009 Brian Tarricone <bjt23@cornell.edu>
 *
 * Licensed for use and redistribution under the terms of the GNU General
 * Public License, version 2 ONLY.  See:
 * http://www.gnu.org/licenses/gpl.html
 */

/* To compile:
 *   cc -o ws-status ws-status.c `pkg-config libwnck-1.0 --cflags --libs`
 */

#include <gtk/gtk.h>
#define WNCK_I_KNOW_THIS_IS_UNSTABLE
#include <libwnck/libwnck.h>

static guint hide_timeout = 0;

static gboolean
ws_status_hide_window(gpointer data)
{
    gtk_widget_hide(GTK_WIDGET(data));
    hide_timeout = 0;
    return FALSE;
}

static void
ws_status_workspace_changed(WnckScreen *wnck_screen,
                            WnckWorkspace *previous_workspace,
                            gpointer user_data)
{
    GtkWidget *win = user_data, *lbl = gtk_bin_get_child(GTK_BIN(win));
    WnckWorkspace *ws = wnck_screen_get_active_workspace(wnck_screen);
    gchar *name = g_strdup_printf("<span size='xx-large'>%s</span>",
                                  wnck_workspace_get_name(ws));
    
    gtk_label_set_markup(GTK_LABEL(lbl), name);
    g_free(name);
    
    gtk_widget_show(win);
    
    if(hide_timeout)
        g_source_remove(hide_timeout);
    hide_timeout = g_timeout_add(2000, ws_status_hide_window, win);
}

int
main(int argc,
     char **argv)
{
    GtkWidget *win, *lbl;
    WnckScreen *wnck_screen;
    
    gtk_init(&argc, &argv);
    
    win = gtk_window_new(GTK_WINDOW_POPUP);
    gtk_window_set_accept_focus(GTK_WINDOW(win), FALSE);
    gtk_window_set_skip_taskbar_hint(GTK_WINDOW(win), TRUE);
    gtk_window_set_skip_pager_hint(GTK_WINDOW(win), TRUE);
    gtk_window_set_keep_above(GTK_WINDOW(win), TRUE);
    gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(win), 12);
    
    lbl = gtk_label_new("");
    gtk_label_set_use_markup(GTK_LABEL(lbl), TRUE);
    gtk_widget_show(lbl);
    gtk_container_add(GTK_CONTAINER(win), lbl);
    
    wnck_screen = wnck_screen_get_default();
    wnck_screen_force_update(wnck_screen);
    g_signal_connect(G_OBJECT(wnck_screen), "active-workspace-changed",
                     G_CALLBACK(ws_status_workspace_changed), win);
    
    gtk_main();
    
    return 0;
}

