// Copyright {{{ 

/*
 * Copyright (c) 2003 Andre Lerche <a.lerche@gmx.net>
 * Copyright (c) 2003 Benedikt Meurer <benedikt.meurer@unix-ag.uni-siegen.de>
 * Copyright (c) 2007 Mike Massonnet <mmassonnet@xfce.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// }}}

// some includes and defines {{{

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#if defined(__linux__)
#include <sys/vfs.h>
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD_kernel__)
#include <sys/param.h>
#include <sys/mount.h>
#endif

#include <gtk/gtk.h>
#include <libxfce4util/libxfce4util.h>
#include <libxfcegui4/libxfcegui4.h>
#include <libxfce4panel/xfce-panel-plugin.h>
#include <libxfce4panel/xfce-panel-convenience.h>
#include <libxfce4panel/xfce-hvbox.h>

#define ICON_NORMAL             0
#define ICON_WARNING            1
#define ICON_URGENT             2
#define ICON_INSENSITIVE        3

#define BORDER                  8

#define COLOR_NORMAL            "#00C000"
#define COLOR_WARNING           "#FFE500"
#define COLOR_URGENT            "#FF4F00"

// }}}

// struct {{{

typedef struct
{
    XfcePanelPlugin    *plugin;
    gboolean            seen;
    gint                icon_id;
    gint                timeout;
    guint               limit_warning;
    guint               limit_urgent;
    gboolean            show_size;
    gboolean            show_progress_bar;
    gboolean            hide_button;
    gchar              *name;
    gchar              *path;
    gchar              *filemanager;

    GtkWidget          *ebox;
    GtkWidget          *box;
    GtkWidget          *btn_panel;
    GtkWidget          *icon_panel;
    GtkWidget          *lab_box;
    GtkWidget          *lab_name;
    GtkWidget          *lab_size;
    GtkWidget          *pb_box;
    GtkWidget          *progress_bar;
    GtkWidget          *cb_hide_button;
} FsGuard;

static GtkTooltips *tooltips = NULL;

// }}}

// all functions {{{

static inline void
fsguard_refresh_button (FsGuard *fsguard)
{
    /* Refresh the checkbox state as seen in the dialog */
    if (GTK_IS_WIDGET (fsguard->cb_hide_button)
        && fsguard->hide_button == TRUE && *(fsguard->name) == '\0'
        && !fsguard->show_size && !fsguard->show_progress_bar)
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fsguard->cb_hide_button), FALSE);
}

static void
fsguard_refresh_name (FsGuard *fsguard)
{
    if (*(fsguard->name) != '\0') {
        gtk_label_set_text (GTK_LABEL(fsguard->lab_name), fsguard->name);
        gtk_widget_show (fsguard->lab_name);
    } else {
        gtk_widget_hide (fsguard->lab_name);
        fsguard_refresh_button (fsguard);
    }
}

static void
fsguard_set_icon (FsGuard *fsguard, gint id)
{
    GdkPixbuf          *pixbuf;
    gint                size;

    if (id == fsguard->icon_id)
        return;

    fsguard->icon_id = id;
    size = xfce_panel_plugin_get_size (fsguard->plugin);
    size = size - 2 - (2 * MAX (fsguard->btn_panel->style->xthickness,
                                fsguard->btn_panel->style->ythickness));

    switch (id) {
      default:
      case ICON_NORMAL:
        pixbuf = xfce_themed_icon_load ("xfce4-fsguard-plugin", size);
        break;
      case ICON_WARNING:
        pixbuf = xfce_themed_icon_load ("xfce4-fsguard-plugin-warning", size);
        break;
      case ICON_URGENT:
        pixbuf = xfce_themed_icon_load ("xfce4-fsguard-plugin-urgent", size);
        break;
    }

    gtk_widget_set_sensitive (fsguard->icon_panel, id != ICON_INSENSITIVE);
    gtk_image_set_from_pixbuf (GTK_IMAGE (fsguard->icon_panel), pixbuf);
    g_object_unref (G_OBJECT (pixbuf));
}

static inline void
fsguard_refresh_icon (FsGuard *fsguard)
{
    gint icon_id = fsguard->icon_id;
    fsguard->icon_id = -1;
    fsguard_set_icon (fsguard, icon_id);
}

static void
fsguard_refresh_monitor (FsGuard *fsguard)
{
    GdkColor            color;

    switch (fsguard->icon_id) {
      default:
      case ICON_NORMAL:
        gdk_color_parse (COLOR_NORMAL, &color);
        break;

      case ICON_WARNING:
        gdk_color_parse (COLOR_WARNING, &color);
        break;

      case ICON_URGENT:
        gdk_color_parse (COLOR_URGENT, &color);
        break;
    }

    gtk_widget_modify_bg (GTK_WIDGET (fsguard->progress_bar),
                          GTK_STATE_PRELIGHT,
                          &color);
    gtk_widget_modify_bg (GTK_WIDGET (fsguard->progress_bar),
                          GTK_STATE_SELECTED,
                          &color);
    gtk_widget_modify_base (GTK_WIDGET (fsguard->progress_bar),
                            GTK_STATE_SELECTED,
                            &color);
}

static void
fsguard_open_mnt (GtkWidget *widget, FsGuard *fsguard)
{
    GString *cmd;
    if (strlen(fsguard->filemanager) == 0) {
        return;
    }
    cmd = g_string_new (fsguard->filemanager);
    if (fsguard->path != NULL && (strcmp(fsguard->path, ""))) {
        g_string_append (cmd, " ");
        g_string_append (cmd, fsguard->path);
    }
    xfce_exec (cmd->str, FALSE, FALSE, NULL);
    g_string_free (cmd, TRUE);
}

static gboolean
fsguard_check_fs (FsGuard *fsguard)
{
    float               size = 0;
    float               total = 0;
    float               freeblocks = 0;
    float               totalblocks = 0;
    long                blocksize;
    int                 err;
    gchar               msg_size[100], msg_total_size[100], msg[100];
    gint                icon_id = ICON_INSENSITIVE;
    static struct statfs fsd;

    err = statfs (fsguard->path, &fsd);
    
    if (err != -1) {
        blocksize       = fsd.f_bsize;
        freeblocks      = fsd.f_bavail;
        totalblocks     = fsd.f_blocks;
        size            = (freeblocks * blocksize) / 1048576;
        total           = (totalblocks * blocksize) / 1048576;

        if (total > 1024) {
            g_snprintf (msg_total_size, sizeof (msg_total_size), _("%.2f GB"), total/1024);
        } else {
            g_snprintf (msg_total_size, sizeof (msg_total_size), _("%.2f MB"), total);
        }
        if (size > 1024) {
            g_snprintf (msg_size, sizeof (msg_size), _("%.2f GB"), size/1024);
        } else {
            g_snprintf (msg_size, sizeof (msg_size), _("%.2f MB"), size);
        }
        gtk_label_set_text (GTK_LABEL(fsguard->lab_size), msg_size);
        gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(fsguard->progress_bar), size / total);

        if (size <= fsguard->limit_urgent) {
            icon_id = ICON_URGENT;
	    if (!fsguard->seen) {
                if (fsguard->name != NULL && (strcmp(fsguard->name,"")) && (strcmp(fsguard->path, fsguard->name))) {
                    xfce_warn (_("Only %s space left on %s (%s)!"), msg_size, fsguard->path, fsguard->name);
                } else {
                    xfce_warn (_("Only %s space left on %s!"), msg_size, fsguard->path);
		}
		fsguard->seen = TRUE;
	    }
        } else if (size >= fsguard->limit_urgent && size <= fsguard->limit_warning) {
            icon_id = ICON_WARNING;
        } else {
            icon_id = ICON_NORMAL;
        }

        if (fsguard->name != NULL && (strcmp(fsguard->name,"")) && (strcmp(fsguard->path, fsguard->name))) {
            g_snprintf (msg, sizeof (msg), _("%s/%s space left on %s (%s)"), msg_size, msg_total_size, fsguard->path, fsguard->name);
        } else if (fsguard->path != NULL && (strcmp(fsguard->path, ""))) {
            g_snprintf (msg, sizeof (msg), _("%s/%s space left on %s"), msg_size, msg_total_size, fsguard->path);
        } 
    } else {
        gtk_label_set_text (GTK_LABEL(fsguard->lab_size), "0.0 MB");
        gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(fsguard->progress_bar), 0.0);
        g_snprintf (msg, sizeof (msg), _("could not check mountpoint %s, please check your config"), fsguard->path);
    }
    
    gtk_tooltips_set_tip (tooltips, fsguard->ebox, msg, NULL);
    fsguard_set_icon (fsguard, icon_id);
    fsguard_refresh_monitor (fsguard);

    return TRUE;
}

static void
fsguard_read_config (FsGuard *fsguard)
{
    char               *file;
    XfceRc             *rc;

    file = xfce_panel_plugin_save_location (fsguard->plugin, TRUE);
    DBG ("Lookup rc file `%s'", file);
    rc = xfce_rc_simple_open (file, FALSE);
    g_free (file);
    g_return_if_fail (rc);

    fsguard->seen               = FALSE;
    fsguard->name               = g_strdup (xfce_rc_read_entry (rc, "label", ""));
    fsguard->path               = g_strdup (xfce_rc_read_entry (rc, "mnt", "/"));
    fsguard->filemanager        = g_strdup (xfce_rc_read_entry (rc, "filemanager", "Thunar"));
    fsguard->show_size          = xfce_rc_read_bool_entry (rc, "lab_size_visible", TRUE);
    fsguard->show_progress_bar  = xfce_rc_read_bool_entry (rc, "progress_bar_visible", TRUE);
    fsguard->hide_button        = xfce_rc_read_bool_entry (rc, "hide_button", FALSE);
    fsguard->limit_warning      = xfce_rc_read_int_entry (rc, "yellow", 1500);
    fsguard->limit_urgent       = xfce_rc_read_int_entry (rc, "red", 300);

    xfce_rc_close (rc);
}

static void
fsguard_write_config (XfcePanelPlugin *plugin, FsGuard *fsguard)
{
    char               *file;
    XfceRc             *rc;

    file = xfce_panel_plugin_save_location (plugin, TRUE);
    rc = xfce_rc_simple_open (file, FALSE);
    g_free (file);
    g_return_if_fail (rc);

    xfce_rc_write_int_entry (rc, "yellow", fsguard->limit_warning);
    xfce_rc_write_int_entry (rc, "red", fsguard->limit_urgent);
    xfce_rc_write_bool_entry (rc, "lab_size_visible", fsguard->show_size);
    xfce_rc_write_bool_entry (rc, "progress_bar_visible", fsguard->show_progress_bar);
    xfce_rc_write_bool_entry (rc, "hide_button", fsguard->hide_button);
    xfce_rc_write_entry (rc, "label", fsguard->name);
    xfce_rc_write_entry (rc, "mnt", fsguard->path);
    xfce_rc_write_entry (rc, "filemanager", fsguard->filemanager);

    xfce_rc_close (rc);
}    

static FsGuard *
fsguard_new (XfcePanelPlugin *plugin)
{
    FsGuard *fsguard = g_new0(FsGuard, 1);
    fsguard->plugin = plugin;

    fsguard_read_config (fsguard);

    tooltips = gtk_tooltips_new ();

    fsguard->ebox = gtk_event_box_new();

    GtkOrientation orientation = xfce_panel_plugin_get_orientation (plugin);
    fsguard->box =
      xfce_hvbox_new (orientation == GTK_ORIENTATION_HORIZONTAL ?
                      GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL,
                      FALSE, 2);

    fsguard->lab_name = gtk_label_new (NULL);
    fsguard->lab_size = gtk_label_new (NULL);
    fsguard->lab_box = gtk_vbox_new (FALSE, 0);

    fsguard->btn_panel = xfce_create_panel_button ();
    fsguard->icon_panel = gtk_image_new ();

    fsguard->progress_bar = gtk_progress_bar_new ();
    gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(fsguard->progress_bar), 0.0);
    gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR(fsguard->progress_bar),
                                      orientation == GTK_ORIENTATION_HORIZONTAL ?
                                      GTK_PROGRESS_BOTTOM_TO_TOP : GTK_PROGRESS_LEFT_TO_RIGHT);
    fsguard->pb_box =
      xfce_hvbox_new (orientation == GTK_ORIENTATION_HORIZONTAL ?
                      GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL,
                      FALSE, 0);
    gtk_container_set_border_width (GTK_CONTAINER (fsguard->pb_box), BORDER / 2);

    g_signal_connect (G_OBJECT(fsguard->btn_panel),
                      "clicked",
                      G_CALLBACK(fsguard_open_mnt),
                      fsguard);

    gtk_container_add (GTK_CONTAINER(fsguard->ebox), fsguard->box);
    gtk_container_add (GTK_CONTAINER(fsguard->box), fsguard->btn_panel);
    gtk_container_add (GTK_CONTAINER(fsguard->btn_panel), fsguard->icon_panel);
    gtk_container_add (GTK_CONTAINER(fsguard->lab_box), fsguard->lab_name);
    gtk_container_add (GTK_CONTAINER(fsguard->lab_box), fsguard->lab_size);
    gtk_container_add (GTK_CONTAINER(fsguard->box), fsguard->lab_box);
    gtk_container_add (GTK_CONTAINER(fsguard->box), fsguard->pb_box);
    gtk_container_add (GTK_CONTAINER(fsguard->pb_box), fsguard->progress_bar);

    xfce_panel_plugin_add_action_widget (plugin, fsguard->ebox);
    xfce_panel_plugin_add_action_widget (plugin, fsguard->btn_panel);

    gtk_widget_set_size_request(fsguard->ebox, -1, -1);
    gtk_widget_show_all (fsguard->ebox);
    fsguard_refresh_name (fsguard);
    if (fsguard->show_size != TRUE)
        gtk_widget_hide (fsguard->lab_size);
    if (fsguard->show_progress_bar != TRUE)
        gtk_widget_hide (fsguard->pb_box);
    if (fsguard->hide_button != FALSE)
        gtk_widget_hide (fsguard->btn_panel);

    return fsguard;
}

static void
fsguard_free (XfcePanelPlugin *plugin, FsGuard *fsguard)
{
    if (fsguard->timeout != 0) {
        g_source_remove (fsguard->timeout);
    }

    g_free (fsguard->name);
    g_free (fsguard->path);
    g_free (fsguard->filemanager);

    g_free(fsguard);
}

static void
fsguard_set_orientation (XfcePanelPlugin *plugin, GtkOrientation orientation, FsGuard *fsguard)
{
    DBG ("Set orientation to `%s'", orientation == GTK_ORIENTATION_HORIZONTAL ?
                                    "Horizontal" : "Vertical");

    xfce_hvbox_set_orientation (XFCE_HVBOX (fsguard->box), orientation);
    xfce_hvbox_set_orientation (XFCE_HVBOX (fsguard->pb_box), orientation);
    gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR(fsguard->progress_bar),
                                      orientation == GTK_ORIENTATION_HORIZONTAL ?
                                      GTK_PROGRESS_BOTTOM_TO_TOP : GTK_PROGRESS_LEFT_TO_RIGHT);
}

static gboolean
fsguard_set_size (XfcePanelPlugin *plugin, int size, FsGuard *fsguard)
{
    DBG ("Set size to `%d'", size);

    gtk_widget_set_size_request (fsguard->btn_panel, size, size);

    GtkOrientation orientation = xfce_panel_plugin_get_orientation (plugin);
    if (orientation == GTK_ORIENTATION_HORIZONTAL) {
        gtk_widget_set_size_request (GTK_WIDGET(fsguard->progress_bar), BORDER, -1);
        gtk_widget_set_size_request (GTK_WIDGET(plugin), -1, size);
    } else {
        gtk_widget_set_size_request (GTK_WIDGET(fsguard->progress_bar), -1, BORDER);
        gtk_widget_set_size_request (GTK_WIDGET(plugin), size, -1);
    }

    fsguard_refresh_icon (fsguard);

    return TRUE;
}

static void
fsguard_entry1_changed (GtkWidget *widget, FsGuard *fsguard)
{
    g_free (fsguard->path);
    fsguard->path = g_strdup (gtk_entry_get_text (GTK_ENTRY(widget)));
    fsguard->seen = FALSE;
    fsguard_check_fs (fsguard);
}

static void
fsguard_entry2_changed (GtkWidget *widget, FsGuard *fsguard)
{
    g_free (fsguard->filemanager);
    fsguard->filemanager = g_strdup (gtk_entry_get_text (GTK_ENTRY(widget)));
}

static void
fsguard_spin1_changed (GtkWidget *widget, FsGuard *fsguard)
{
    fsguard->limit_warning = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(widget));
    fsguard->seen = FALSE;
    fsguard_check_fs (fsguard);
}

static void
fsguard_spin2_changed (GtkWidget *widget, FsGuard *fsguard)
{
    fsguard->limit_urgent = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(widget));
    fsguard_check_fs (fsguard);
}

static void
fsguard_entry3_changed (GtkWidget *widget, FsGuard *fsguard)
{
    g_free (fsguard->name);
    fsguard->name = g_strdup (gtk_entry_get_text (GTK_ENTRY(widget)));
    fsguard_refresh_name (fsguard);
}

static void
fsguard_check1_changed (GtkWidget *widget, FsGuard *fsguard)
{
    fsguard->show_size = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
    if (fsguard->show_size)
        gtk_widget_show (fsguard->lab_size);
    else {
        gtk_widget_hide (fsguard->lab_size);
        fsguard_refresh_button (fsguard);
    }
}

static void
fsguard_check2_changed (GtkWidget *widget, FsGuard *fsguard)
{
    fsguard->show_progress_bar = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
    if (fsguard->show_progress_bar)
        gtk_widget_show (fsguard->pb_box);
    else {
        gtk_widget_hide (fsguard->pb_box);
        fsguard_refresh_button (fsguard);
    }
}

static void
fsguard_check3_changed (GtkWidget *widget, FsGuard *fsguard)
{
    fsguard->hide_button = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));

    if (fsguard->hide_button == FALSE)
        gtk_widget_show (fsguard->btn_panel);
    else {
        gtk_widget_hide (fsguard->btn_panel);
        fsguard_refresh_button (fsguard);
    }
}

static void
fsguard_create_options (XfcePanelPlugin *plugin, FsGuard *fsguard)
{
    xfce_panel_plugin_block_menu (plugin);

    /* Dialog */
    GtkWidget *dialog =
      xfce_titled_dialog_new_with_buttons (_("Free Space Checker"),
        GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (plugin))),
        GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
        GTK_STOCK_CLOSE, GTK_RESPONSE_OK,
        NULL);
    gtk_window_set_icon_name (GTK_WINDOW (dialog), "xfce4-fsguard-plugin-warning");
    gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
    gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), BORDER);

    /* Configuration frame */
    GtkWidget *table1 = gtk_table_new (2, 4, FALSE);
    GtkWidget *frame1 = xfce_create_framebox_with_content (_("Configuration"), table1);
    gtk_table_set_row_spacings (GTK_TABLE (table1), BORDER);
    gtk_table_set_col_spacings (GTK_TABLE (table1), BORDER);
    gtk_container_set_border_width (GTK_CONTAINER (frame1), BORDER);
    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), frame1,
                        TRUE, TRUE, 0);

    GtkWidget *label1 = gtk_label_new (_("Mount point"));
    gtk_misc_set_alignment (GTK_MISC (label1), 0, 0.5);
    GtkWidget *entry1 = gtk_entry_new ();
    gtk_entry_set_max_length (GTK_ENTRY (entry1), 32);
    gtk_entry_set_text (GTK_ENTRY (entry1), fsguard->path);

    GtkWidget *label2 = gtk_label_new (_("File manager"));
    gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5);
    GtkWidget *entry2 = gtk_entry_new ();
    gtk_entry_set_max_length (GTK_ENTRY (entry2), 16);
    gtk_entry_set_text (GTK_ENTRY (entry2), fsguard->filemanager);

    GtkWidget *label3 = gtk_label_new (_("Warning limit (MB)"));
    gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
    GtkWidget *spin1 = gtk_spin_button_new_with_range (0, G_MAXUINT, 100);
    gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin1), fsguard->limit_warning);

    GtkWidget *label4 = gtk_label_new (_("Urgent limit (MB)"));
    gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5);
    GtkWidget *spin2 = gtk_spin_button_new_with_range (0, G_MAXUINT, 100);
    gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin2), fsguard->limit_urgent);

    gtk_table_attach_defaults (GTK_TABLE (table1), label1,
                               0, 1, 0, 1);
    gtk_table_attach_defaults (GTK_TABLE (table1), entry1,
                               1, 2, 0, 1);
    gtk_table_attach_defaults (GTK_TABLE (table1), label2,
                               0, 1, 1, 2);
    gtk_table_attach_defaults (GTK_TABLE (table1), entry2,
                               1, 2, 1, 2);
    gtk_table_attach_defaults (GTK_TABLE (table1), label3,
                               0, 1, 2, 3);
    gtk_table_attach_defaults (GTK_TABLE (table1), spin1,
                               1, 2, 2, 3);
    gtk_table_attach_defaults (GTK_TABLE (table1), label4,
                               0, 1, 3, 4);
    gtk_table_attach_defaults (GTK_TABLE (table1), spin2,
                               1, 2, 3, 4);

    /* Display frame */
    GtkWidget *table2 = gtk_table_new (2, 4, FALSE);
    GtkWidget *frame2 = xfce_create_framebox_with_content (_("User Interface"), table2);
    gtk_table_set_row_spacings (GTK_TABLE (table2), BORDER);
    gtk_table_set_col_spacings (GTK_TABLE (table2), BORDER);
    gtk_container_set_border_width (GTK_CONTAINER (frame2), BORDER);
    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), frame2,
                        TRUE, TRUE, 0);

    GtkWidget *label5 = gtk_label_new (_("Name"));
    gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5);
    GtkWidget *entry3 = gtk_entry_new ();
    gtk_entry_set_max_length (GTK_ENTRY (entry3), 16);
    gtk_entry_set_text (GTK_ENTRY (entry3), fsguard->name);

    GtkWidget *check1 = gtk_check_button_new_with_label (_("Display size"));
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check1),
                                  fsguard->show_size);

    GtkWidget *check2 = gtk_check_button_new_with_label (_("Display meter"));
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check2),
                                  fsguard->show_progress_bar);

    fsguard->cb_hide_button = gtk_check_button_new_with_label (_("Hide button"));
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fsguard->cb_hide_button),
                                  fsguard->hide_button);

    gtk_table_attach_defaults (GTK_TABLE (table2), label5,
                               0, 1, 0, 1);
    gtk_table_attach_defaults (GTK_TABLE (table2), entry3,
                               1, 2, 0, 1);
    gtk_table_attach_defaults (GTK_TABLE (table2), check1,
                               0, 2, 1, 2);
    gtk_table_attach_defaults (GTK_TABLE (table2), check2,
                               0, 2, 2, 3);
    gtk_table_attach_defaults (GTK_TABLE (table2), fsguard->cb_hide_button,
                               0, 2, 3, 4);

    g_signal_connect (entry1,
                      "changed",
                      G_CALLBACK (fsguard_entry1_changed),
                      fsguard);
    g_signal_connect (entry2,
                      "changed",
                      G_CALLBACK (fsguard_entry2_changed),
                      fsguard);
    g_signal_connect (spin1,
                      "value-changed",
                      G_CALLBACK (fsguard_spin1_changed),
                      fsguard);
    g_signal_connect (spin2,
                      "value-changed",
                      G_CALLBACK (fsguard_spin2_changed),
                      fsguard);
    g_signal_connect (entry3,
                      "changed",
                      G_CALLBACK (fsguard_entry3_changed),
                      fsguard);
    g_signal_connect (check1,
                      "toggled",
                      G_CALLBACK (fsguard_check1_changed),
                      fsguard);
    g_signal_connect (check2,
                      "toggled",
                      G_CALLBACK (fsguard_check2_changed),
                      fsguard);
    g_signal_connect (fsguard->cb_hide_button,
                      "toggled",
                      G_CALLBACK (fsguard_check3_changed),
                      fsguard);

    gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);
    gtk_dialog_run (GTK_DIALOG (dialog));
    gtk_widget_destroy (dialog);
    xfce_panel_plugin_unblock_menu (fsguard->plugin);
    fsguard_write_config (fsguard->plugin, fsguard);
}

// }}}

// initialization {{{
static void
fsguard_construct (XfcePanelPlugin *plugin)
{
    xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
 
    FsGuard *fsguard = fsguard_new (plugin);
    fsguard_check_fs (fsguard);
    fsguard->timeout =
      g_timeout_add (8192, (GSourceFunc) fsguard_check_fs, fsguard);

    gtk_container_add (GTK_CONTAINER (plugin), fsguard->ebox);

    g_signal_connect (plugin,
                      "free-data",
                      G_CALLBACK (fsguard_free),
                      fsguard);
    g_signal_connect (plugin,
                      "save",
                      G_CALLBACK (fsguard_write_config),
                      fsguard);
    g_signal_connect (plugin,
                      "size-changed",
                      G_CALLBACK (fsguard_set_size),
                      fsguard);
    g_signal_connect (plugin,
                      "orientation-changed",
                      G_CALLBACK (fsguard_set_orientation),
                      fsguard);
    g_signal_connect (plugin,
                      "configure-plugin",
                      G_CALLBACK (fsguard_create_options),
                      fsguard);

    xfce_panel_plugin_menu_show_configure (plugin);
}

XFCE_PANEL_PLUGIN_REGISTER_EXTERNAL (fsguard_construct);

// }}}

// vim600: set foldmethod=marker: foldmarker={{{,}}}


syntax highlighted by Code2HTML, v. 0.9.1