grim/guifications1

update so I can recode the heart of this in anjuta...
/*
Guifications - The notification plugin to end all notification plugins!
Copyright (C) 2003 Gary Kramlich
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <stdio.h>
#include <gtk/gtk.h>
#include <glib.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include "xmlnode.h"
#include "gf_types.h"
#include "gf_pngs.h"
#include "gf_theme.h"
#include "gf_gtkutils.h"
#include "grimdirtreeview.h"
/***********************************************************************
* Globals
**********************************************************************/
#define base_title "Guifications Theme Editor"
GtkWidget *window;
gf_theme theme;
gboolean theme_modified = FALSE;
gchar *file_name;
/* info globals */
GtkWidget *theme_name, *theme_version, *theme_description;
GtkWidget *theme_author, *theme_website;
/* basic globals */
GtkWidget *basic_image_file, *basic_image_button;
GtkWidget *basic_text_font_check, *basic_text_font_button;
GtkWidget *basic_text_color_check, *basic_text_color_button;
GtkWidget *basic_text_clipping_menu, *basic_text_pos_menu;
GtkWidget *basic_text_horz_offset, *basic_text_vert_offset;
GtkWidget *basic_proto_pos_menu, *basic_proto_size_menu;
GtkWidget *basic_proto_horz_offset, *basic_proto_vert_offset;
GtkWidget *basic_message_signon, *basic_message_signoff;
GtkWidget *basic_message_away, *basic_message_back;
GtkWidget *basic_message_idle, *basic_message_unidle;
/* preview globals */
GtkWidget *preview_menu, *preview_image;
/***********************************************************************
* Prototypes
**********************************************************************/
gint main(gint argc, gchar *argv[]);
static GtkWidget *make_window();
static void make_info_page(GtkWidget *notebook);
static void make_basic_page(GtkWidget *notebook);
static void make_messages_page(GtkWidget *notebook);
static void make_advanced_page(GtkWidget *notebook);
static void clear_theme();
static void update_controls();
static void update_modified(gboolean modified);
/* helpers */
static GtkWidget *make_dir_dialog(gchar *title, gboolean open, gboolean quit);
/* Callbacks */
static gboolean close_editor(GtkWidget *widget, GdkEvent *event, gpointer data);
static void menu_new_cb();
static void menu_open_cb();
static void menu_save_cb();
static void menu_save_as_cb();
static void menu_quit_cb();
static void menu_debug_theme_dump_cb();
static void menu_debug_xml_theme_dump_cb();
static void preview_option_cb(GtkWidget *widget, gpointer data);
static gboolean entry_cb(GtkWidget *widget, gpointer data);
static void spin_button_cb(GtkWidget *widget, gpointer data);
static void check_button_cb(GtkWidget *widget, gpointer data);
static void option_menu_cb(GtkWidget *widget, gpointer data);
static void image_file_dialog(GtkWidget *widget, gpointer data);
static void image_file_dialog_ok(GtkWidget *widget, gpointer data);
static void font_dialog(GtkWidget *widget, gpointer data);
static void font_dialog_ok(GtkWidget *widget, gpointer data);
static void color_dialog(GtkWidget *widget, gpointer data);
static void color_dialog_ok(GtkWidget *widget, gpointer data);
static void modified_message_response_cb(GtkWidget *widget, gint response_id, gpointer data);
static void dir_dialog_cb(GtkWidget *widget, gint response_id, gpointer data);
/***********************************************************************
* Menu
**********************************************************************/
static GtkItemFactoryEntry main_menu[] = {
/* filemenu */
{ "/_File", NULL, NULL, 0, "<Branch>" },
{ "/File/_New", "<CTL>N", menu_new_cb, 0, "<StockItem>", GTK_STOCK_NEW },
{ "/File/_Open...", "<CTL>O", menu_open_cb, 0, "<StockItem>", GTK_STOCK_OPEN },
{ "/File/_Save", "<CTL>S", menu_save_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
{ "/File/Save _As...", NULL, menu_save_as_cb, 0, "<StockItem>", GTK_STOCK_SAVE_AS },
{ "/File/sep", NULL, NULL, 0, "<Separator>" },
{ "/File/_Refresh Preview", "F5", NULL, 0, "<StockItem>", GTK_STOCK_REFRESH },
{ "/File/sep1", NULL, NULL, 0, "<Separator>" },
{ "/File/_Quit", "<CTL>Q", menu_quit_cb, 0, "<StockItem>", GTK_STOCK_QUIT },
{ "/_Debug", NULL, NULL, 0, "<Branch>" },
{ "/Debug/_Dump Theme", "<CTL>D", menu_debug_theme_dump_cb, 0, NULL },
{ "/Debug/Dump _XML Theme", "<CTL>X", menu_debug_xml_theme_dump_cb, 0, NULL },
};
/***********************************************************************
* Functions
**********************************************************************/
gint
main(gint argc, gchar *argv[]) {
gtk_init(&argc, &argv);
file_name = NULL;
clear_theme();
update_controls();
window = make_window();
gtk_main();
return 0;
}
/***********************************************************************
* Helpers
**********************************************************************/
static GtkWidget *
make_window() {
GtkWidget *win, *vbox, *hbox, *note, *frame;
GtkItemFactory *menubar;
GtkAccelGroup *accel;
win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(win), base_title);
gtk_window_set_resizable(GTK_WINDOW(win), FALSE);
g_signal_connect(G_OBJECT(win), "delete_event", G_CALLBACK(close_editor), NULL);
/* setup accel group */
accel = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(win), accel);
g_object_unref(accel);
/* create main vbox */
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(win), vbox);
/* create and pack the menubar */
menubar = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<ThemeMain>", accel);
gtk_item_factory_create_items(menubar, sizeof(main_menu) / sizeof(*main_menu), main_menu, NULL);
gtk_box_pack_start(GTK_BOX(vbox), gtk_item_factory_get_widget(menubar, "<ThemeMain>"), FALSE, FALSE, 0);
/* create and pack main hbox */
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
/* create and pack the notebook */
note = gtk_notebook_new();
gtk_box_pack_start(GTK_BOX(hbox), note, TRUE, TRUE, 0);
/* create and add pages */
make_info_page(note);
make_basic_page(note);
make_messages_page(note);
make_advanced_page(note);
/* create and pack preview vbox */
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 4);
/* create preview frame */
frame = make_hig_frame(vbox, "Preview");
gtk_container_set_border_width(GTK_CONTAINER(frame), 12);
/* create and pack preview option menu */
preview_menu = make_event_option_menu(gf_event_signon);
g_signal_connect(G_OBJECT(preview_menu), "changed", G_CALLBACK(preview_option_cb), NULL);
gtk_box_pack_start(GTK_BOX(frame), preview_menu, FALSE, FALSE, 0);
/* show all widgets and return the window */
gtk_widget_show_all(win);
return win;
}
/**********************************************************************/
static void
make_info_page(GtkWidget *notebook) {
GtkWidget *vbox, *label, *frame;
GtkSizeGroup *sg;
vbox = add_page(GTK_NOTEBOOK(notebook), "Information", -1);
sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
/* create and pack frame */
frame = make_hig_frame(vbox, "Theme Information");
/* create and pack name line */
theme_name = gtk_entry_new();
g_signal_connect(G_OBJECT(theme_name), "changed", G_CALLBACK(entry_cb), &theme.info[0]);
label = add_label(theme_name, "_Name:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack version line */
theme_version = gtk_entry_new();
g_signal_connect(G_OBJECT(theme_version), "changed", G_CALLBACK(entry_cb), &theme.info[1]);
label = add_label(theme_version, "_Version:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack description line */
theme_description = gtk_entry_new();
g_signal_connect(G_OBJECT(theme_description), "changed", G_CALLBACK(entry_cb), &theme.info[2]);
label = add_label(theme_description, "_Description:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack author line */
theme_author = gtk_entry_new();
g_signal_connect(G_OBJECT(theme_author), "changed", G_CALLBACK(entry_cb), &theme.info[3]);
label = add_label(theme_author, "_Author:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack website list */
theme_website = gtk_entry_new();
g_signal_connect(G_OBJECT(theme_website), "changed", G_CALLBACK(entry_cb), &theme.info[4]);
label = add_label(theme_website, "_Website:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* free the sizegroup */
g_object_unref(sg);
}
/**********************************************************************/
static void
make_basic_page(GtkWidget *notebook) {
GtkWidget *vbox, *hbox, *frame, *label;
GtkSizeGroup *sg;
sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
vbox = add_page(GTK_NOTEBOOK(notebook), "Basic Theme", -1);
/* create and pack image frame */
frame = make_hig_frame(vbox, "Image");
hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(frame), hbox, TRUE, TRUE, 0);
basic_image_file = gtk_entry_new();
gtk_widget_set_sensitive(basic_image_file, FALSE);
gtk_box_pack_start(GTK_BOX(hbox), basic_image_file, TRUE, TRUE, 0);
basic_image_button = gtk_button_new_with_mnemonic("_Browse...");
g_signal_connect(G_OBJECT(basic_image_button), "clicked", G_CALLBACK(image_file_dialog), &theme.data.basic.image);
gtk_box_pack_start(GTK_BOX(hbox), basic_image_button, FALSE, FALSE, 0);
/* create and pack text frame */
frame = make_hig_frame(vbox, "Text");
/* create and pack font line */
hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
basic_text_font_check = make_check_button(FALSE, "Use custom fon_t", sg);
g_signal_connect(G_OBJECT(basic_text_font_check), "clicked", G_CALLBACK(check_button_cb), &theme.data.basic.text_custom_font);
gtk_box_pack_start(GTK_BOX(hbox), basic_text_font_check, FALSE, FALSE, 0);
basic_text_font_button = gtk_button_new_from_stock(GTK_STOCK_SELECT_FONT);
g_signal_connect(G_OBJECT(basic_text_font_button), "clicked", G_CALLBACK(font_dialog), &theme.data.basic.text_font);
gtk_box_pack_start(GTK_BOX(hbox), basic_text_font_button, FALSE, FALSE, 0);
/* create and pack color line */
hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
basic_text_color_check = make_check_button(FALSE, "Use custom co_lor", sg);
g_signal_connect(G_OBJECT(basic_text_color_check), "clicked", G_CALLBACK(check_button_cb), &theme.data.basic.text_custom_color);
gtk_box_pack_start(GTK_BOX(hbox), basic_text_color_check, FALSE, FALSE, 0);
basic_text_color_button = gtk_button_new_from_stock(GTK_STOCK_SELECT_COLOR);
g_signal_connect(G_OBJECT(basic_text_color_button), "clicked", G_CALLBACK(color_dialog), &theme.data.basic.text_color);
gtk_box_pack_start(GTK_BOX(hbox), basic_text_color_button, FALSE, FALSE, 0);
/* create and pack clipping line */
basic_text_clipping_menu = make_text_clipping_option_menu(text_clipping_elipse_middle);
g_signal_connect(G_OBJECT(basic_text_clipping_menu), "changed", G_CALLBACK(option_menu_cb), &theme.data.basic.text_clipping);
label = add_label(basic_text_clipping_menu, "Clippin_g:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack text position line */
basic_text_pos_menu = make_item_position_option_menu(item_position_c);
g_signal_connect(G_OBJECT(basic_text_pos_menu), "changed", G_CALLBACK(option_menu_cb), &theme.data.basic.text_position);
label = add_label(basic_text_pos_menu, "_Position:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack horizontal offset line */
basic_text_horz_offset = make_spin_button(0, 0, 255, TRUE);
g_signal_connect(G_OBJECT(basic_text_horz_offset), "changed", G_CALLBACK(spin_button_cb), &theme.data.basic.text_horz_offset);
label = add_label(basic_text_horz_offset, "_Horizontal offset:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack vertical offset line */
basic_text_vert_offset = make_spin_button(0, 0, 255, TRUE);
g_signal_connect(G_OBJECT(basic_text_vert_offset), "changed", G_CALLBACK(spin_button_cb), &theme.data.basic.text_vert_offset);
label = add_label(basic_text_vert_offset, "_Vertical offset:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack protocol frame */
frame = make_hig_frame(vbox, "Protocol Icon");
/* create and pack protocol position line */
basic_proto_pos_menu = make_item_position_option_menu(item_position_sw);
g_signal_connect(G_OBJECT(basic_proto_pos_menu), "changed", G_CALLBACK(option_menu_cb), &theme.data.basic.proto_position);
label = add_label(basic_proto_pos_menu, "P_osition:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack protocol size line */
basic_proto_size_menu = make_icon_size_option_menu(icon_size_normal);
g_signal_connect(G_OBJECT(basic_proto_size_menu), "changed", G_CALLBACK(option_menu_cb), &theme.data.basic.proto_size);
label = add_label(basic_proto_size_menu, "Si_ze:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack protocol horizontal offset line */
basic_proto_horz_offset = make_spin_button(0, 0, 255, TRUE);
g_signal_connect(G_OBJECT(basic_proto_horz_offset), "changed", G_CALLBACK(spin_button_cb), &theme.data.basic.proto_horz_offset);
label = add_label(basic_proto_horz_offset, "Ho_rizontal offset:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack protocol vertical offset line */
basic_proto_vert_offset = make_spin_button(0, 0, 255, TRUE);
g_signal_connect(G_OBJECT(basic_proto_vert_offset), "changed", G_CALLBACK(spin_button_cb), &theme.data.basic.proto_vert_offset);
label = add_label(basic_proto_vert_offset, "Ver_tical offset:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* free the sizegroup */
g_object_unref(sg);
}
/**********************************************************************/
static void
make_messages_page(GtkWidget *notebook) {
GtkWidget *vbox, *label, *frame;
GtkSizeGroup *sg;
sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
vbox = add_page(GTK_NOTEBOOK(notebook), "Messages", -1);
/* create and pack frame */
frame = make_hig_frame(vbox, "Status Messages");
/* create and pack sign on line */
basic_message_signon = gtk_entry_new();
g_signal_connect(G_OBJECT(basic_message_signon), "changed", G_CALLBACK(entry_cb), &theme.data.basic.messages[0]);
label = add_label(basic_message_signon, "_Sign On:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack sign off line */
basic_message_signoff = gtk_entry_new();
g_signal_connect(G_OBJECT(basic_message_signoff), "changed", G_CALLBACK(entry_cb), &theme.data.basic.messages[1]);
label = add_label(basic_message_signoff, "Sign _Off:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack away line */
basic_message_away = gtk_entry_new();
g_signal_connect(G_OBJECT(basic_message_away), "changed", G_CALLBACK(entry_cb), &theme.data.basic.messages[2]);
label = add_label(basic_message_away, "_Away:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack back line */
basic_message_back = gtk_entry_new();
g_signal_connect(G_OBJECT(basic_message_back), "changed", G_CALLBACK(entry_cb), &theme.data.basic.messages[3]);
label = add_label(basic_message_back, "_Back:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack idle line */
basic_message_idle = gtk_entry_new();
g_signal_connect(G_OBJECT(basic_message_idle), "changed", G_CALLBACK(entry_cb), &theme.data.basic.messages[4]);
label = add_label(basic_message_idle, "_Idle:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create and pack unidle line */
basic_message_unidle = gtk_entry_new();
g_signal_connect(G_OBJECT(basic_message_unidle), "changed", G_CALLBACK(entry_cb), &theme.data.basic.messages[5]);
label = add_label(basic_message_unidle, "_Unidle:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* free sizegroup */
g_object_unref(sg);
}
/**********************************************************************/
static void
moved_cursor(GrimDirTreeView *dir_tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data) {
gtk_window_set_title(GTK_WINDOW(window), grim_dir_tree_view_get_path(dir_tree_view));
printf("path=%s\n", gtk_tree_path_to_string(path));
}
static void
make_advanced_page(GtkWidget *notebook) {
GtkWidget *vbox, *scrolled_window, *dir_tree_view;
vbox = add_page(GTK_NOTEBOOK(notebook), "Advanced Theme", -1);
scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);
dir_tree_view = grim_dir_tree_view_new();
g_signal_connect(G_OBJECT(dir_tree_view), "row-activated", G_CALLBACK(moved_cursor), NULL);
gtk_container_add(GTK_CONTAINER(scrolled_window), dir_tree_view);
grim_dir_tree_view_set_path(GRIM_DIR_TREE_VIEW(dir_tree_view), g_get_home_dir());
}
/**********************************************************************/
static void
clear_theme() {
gint i;
theme.type = gf_theme_type_basic;
/* clear info */
for (i = 0; i < 5; i++) {
if (theme.info[i] != NULL)
g_free(theme.info[i]);
theme.info[i] = NULL;
}
/* clear basic theme */
if (theme.data.basic.image != NULL)
g_free(theme.data.basic.image);
theme.data.basic.image = NULL;
theme.data.basic.text_custom_font = FALSE;
if (theme.data.basic.text_font != NULL)
g_free(theme.data.basic.text_font);
theme.data.basic.text_font = NULL;
theme.data.basic.text_custom_color = FALSE;
if (theme.data.basic.text_color != NULL)
g_free(theme.data.basic.text_color);
theme.data.basic.text_color = NULL;
theme.data.basic.text_clipping = 0;
theme.data.basic.text_position = 0;
theme.data.basic.text_horz_offset = 0;
theme.data.basic.text_vert_offset = 0;
theme.data.basic.proto_position = 0;
theme.data.basic.proto_size = 0;
theme.data.basic.proto_horz_offset = 0;
theme.data.basic.proto_vert_offset = 0;
/* clear basic messages */
for (i = 0; i < 6; i++) {
if (theme.data.basic.messages[i] != NULL)
g_free(theme.data.basic.messages[i]);
theme.data.basic.messages[i] = NULL;
}
}
/**********************************************************************/
static void
update_controls() {
if (window != NULL) {
/* info tab */
if (theme.info[0] != NULL)
gtk_entry_set_text(GTK_ENTRY(theme_name), theme.info[0]);
else
gtk_entry_set_text(GTK_ENTRY(theme_name), "");
if (theme.info[1] != NULL)
gtk_entry_set_text(GTK_ENTRY(theme_version), theme.info[1]);
else
gtk_entry_set_text(GTK_ENTRY(theme_version), "");
if (theme.info[2] != NULL)
gtk_entry_set_text(GTK_ENTRY(theme_description), theme.info[2]);
else
gtk_entry_set_text(GTK_ENTRY(theme_description), "");
if (theme.info[3] != NULL)
gtk_entry_set_text(GTK_ENTRY(theme_author), theme.info[3]);
else
gtk_entry_set_text(GTK_ENTRY(theme_author), "");
if (theme.info[4] != NULL)
gtk_entry_set_text(GTK_ENTRY(theme_website), theme.info[4]);
else
gtk_entry_set_text(GTK_ENTRY(theme_website), "");
/* basic tab */
if (theme.data.basic.image != NULL)
gtk_entry_set_text(GTK_ENTRY(basic_image_file), theme.data.basic.image);
else
gtk_entry_set_text(GTK_ENTRY(basic_image_file), "");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(basic_text_font_check), theme.data.basic.text_custom_font);
gtk_widget_set_sensitive(basic_text_font_button, theme.data.basic.text_custom_font);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(basic_text_color_check), theme.data.basic.text_custom_color);
gtk_widget_set_sensitive(basic_text_color_button, theme.data.basic.text_custom_color);
gtk_option_menu_set_history(GTK_OPTION_MENU(basic_text_clipping_menu), theme.data.basic.text_clipping);
gtk_option_menu_set_history(GTK_OPTION_MENU(basic_text_pos_menu), theme.data.basic.text_position);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(basic_text_horz_offset), theme.data.basic.text_horz_offset);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(basic_text_vert_offset), theme.data.basic.text_vert_offset);
gtk_option_menu_set_history(GTK_OPTION_MENU(basic_proto_pos_menu), theme.data.basic.proto_position);
gtk_option_menu_set_history(GTK_OPTION_MENU(basic_proto_size_menu), theme.data.basic.proto_size);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(basic_proto_horz_offset), theme.data.basic.proto_horz_offset);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(basic_proto_vert_offset), theme.data.basic.proto_vert_offset);
/* messages tab */
if (theme.data.basic.messages[0] != NULL)
gtk_entry_set_text(GTK_ENTRY(basic_message_signon), theme.data.basic.messages[0]);
else
gtk_entry_set_text(GTK_ENTRY(basic_message_signon), "");
if (theme.data.basic.messages[1] != NULL)
gtk_entry_set_text(GTK_ENTRY(basic_message_signoff), theme.data.basic.messages[1]);
else
gtk_entry_set_text(GTK_ENTRY(basic_message_signoff), "");
if (theme.data.basic.messages[2] != NULL)
gtk_entry_set_text(GTK_ENTRY(basic_message_away), theme.data.basic.messages[2]);
else
gtk_entry_set_text(GTK_ENTRY(basic_message_away), "");
if (theme.data.basic.messages[3] != NULL)
gtk_entry_set_text(GTK_ENTRY(basic_message_back), theme.data.basic.messages[3]);
else
gtk_entry_set_text(GTK_ENTRY(basic_message_back), "");
if (theme.data.basic.messages[4] != NULL)
gtk_entry_set_text(GTK_ENTRY(basic_message_idle), theme.data.basic.messages[4]);
else
gtk_entry_set_text(GTK_ENTRY(basic_message_idle), "");
if (theme.data.basic.messages[5] != NULL)
gtk_entry_set_text(GTK_ENTRY(basic_message_unidle), theme.data.basic.messages[5]);
else
gtk_entry_set_text(GTK_ENTRY(basic_message_unidle), "");
}
}
/**********************************************************************/
static void
update_modified(gboolean modified) {
gchar *title;
title = g_strdup_printf("%s %s", base_title, (modified) ? "(Modified)" : "(Saved)");
theme_modified = modified;
gtk_window_set_title(GTK_WINDOW(window), title);
g_free(title);
}
/**********************************************************************/
static GtkWidget *
make_dir_dialog(gchar *title, gboolean open, gboolean quit) {
GtkWidget *dialog, *scrolled_window, *dir_tree;
dialog = gtk_dialog_new_with_buttons(title, GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL);
gtk_container_set_border_width(GTK_CONTAINER(dialog), 12);
scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_widget_set_size_request(scrolled_window, 300, 350);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scrolled_window, TRUE, TRUE, 8);
gtk_widget_show(scrolled_window);
dir_tree = grim_dir_tree_view_new();
gtk_container_add(GTK_CONTAINER(scrolled_window), dir_tree);
grim_dir_tree_view_set_path(GRIM_DIR_TREE_VIEW(dir_tree), g_get_home_dir());
gtk_widget_show(dir_tree);
g_object_set_data(G_OBJECT(dialog), "open", (gpointer)open);
g_object_set_data(G_OBJECT(dialog), "quit", (gpointer)quit);
g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(dir_dialog_cb), (gpointer)dialog);
return dialog;
}
/***********************************************************************
* Callbacks
*********************************************************************/
static gboolean
close_editor(GtkWidget *widget, GdkEvent *event, gpointer data) {
gtk_widget_destroy(window);
window = NULL;
gtk_main_quit();
return FALSE;
}
/**********************************************************************/
static void
menu_new_cb() {
GtkWidget *dialog = NULL;
if (!theme_modified) {
clear_theme();
update_controls();
if (file_name != NULL)
g_free(file_name);
file_name = NULL;
}
else {
dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "The theme has not been saved.\nWould you like to save it?");
g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(modified_message_response_cb), (gpointer)dialog);
gtk_widget_show(dialog);
}
}
/**********************************************************************/
static void
menu_open_cb() {
GtkWidget *dialog;
dialog = make_dir_dialog("Open...", TRUE, FALSE);
gtk_widget_show(dialog);
}
/**********************************************************************/
static void
menu_save_cb() {
if (file_name == NULL)
menu_save_as_cb();
else {
printf("Write save file code here....\n");
}
}
/**********************************************************************/
static void
menu_save_as_cb() {
GtkWidget *dialog;
dialog = make_dir_dialog("Save As...", FALSE, FALSE);
gtk_widget_show(dialog);
}
/**********************************************************************/
static void
menu_quit_cb() {
GtkWidget *dialog = NULL;
if (!theme_modified) {
gtk_widget_destroy(window);
window = NULL;
gtk_main_quit();
}
else {
dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "The theme has not been saved.\nWould you like to save it?");
g_object_set_data(G_OBJECT(dialog), "quit", (gpointer)TRUE);
g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(modified_message_response_cb), (gpointer)dialog);
gtk_widget_show(dialog);
}
}
/**********************************************************************/
static void
menu_debug_theme_dump_cb() {
printf(" ********************\n");
printf(" * THEME DUMP START\n");
printf("**********************\n");
printf("* Type:\t\t\t%d\n", theme.type);
printf("* \n");
printf("* Name:\t\t\t%s\n", theme.info[0]);
printf("* Version:\t\t%s\n", theme.info[1]);
printf("* Description:\t\t%s\n", theme.info[2]);
printf("* Author:\t\t%s\n", theme.info[3]);
printf("* Website:\t\t%s\n", theme.info[4]);
if (theme.type == gf_theme_type_basic) {
printf("*\n");
printf("* Basic:\n");
printf("* Text:\n");
printf("* Image:\t\t%s\n", theme.data.basic.image);
printf("* Custom Font:\t%d\n", theme.data.basic.text_custom_font);
printf("* Font:\t\t%s\n", theme.data.basic.text_font);
printf("* Custom Color:\t%d\n", theme.data.basic.text_custom_color);
printf("* Color:\t\t%s\n", theme.data.basic.text_color);
printf("* Clipping:\t\t%d\n", theme.data.basic.text_clipping);
printf("* Position:\t\t%d\n", theme.data.basic.text_position);
printf("* Horz Offset:\t%d\n", theme.data.basic.text_horz_offset);
printf("* Vert Offset:\t%d\n", theme.data.basic.text_vert_offset);
printf("* Protocol:\n");
printf("* Position:\t\t%d\n", theme.data.basic.proto_position);
printf("* Size:\t\t%d\n", theme.data.basic.proto_size);
printf("* Horz Offset:\t%d\n", theme.data.basic.proto_horz_offset);
printf("* Vert Offset:\t%d\n", theme.data.basic.proto_vert_offset);
printf("*\n");
printf("* Messages:\n");
printf("* Signon:\t\t%s\n", theme.data.basic.messages[0]);
printf("* Signoff:\t\t%s\n", theme.data.basic.messages[1]);
printf("* Away:\t\t%s\n", theme.data.basic.messages[2]);
printf("* Back:\t\t%s\n", theme.data.basic.messages[3]);
printf("* Idle:\t\t%s\n", theme.data.basic.messages[4]);
printf("* Unidle:\t\t%s\n", theme.data.basic.messages[5]);
}
printf("**********************\n");
printf(" * THEME DUMP END\n");
printf(" ********************\n");
}
static void
menu_debug_xml_theme_dump_cb() {
xmlnode *node, *parent, *parent2, *child;
gchar *value;
gint len;
node = xmlnode_new("guifications_theme");
parent = xmlnode_new_child(node, "info");
child = xmlnode_new_child(parent, "type");
value = g_strdup_printf("%d", theme.type);
xmlnode_set_attrib(child, "value", value);
g_free(value);
child = xmlnode_new_child(parent, "name");
xmlnode_set_attrib(child, "value", (theme.info[0]) ? theme.info[0] : "");
child = xmlnode_new_child(parent, "version");
xmlnode_set_attrib(child, "value", (theme.info[1]) ? theme.info[1] : "");
child = xmlnode_new_child(parent, "description");
xmlnode_set_attrib(child, "value", (theme.info[2]) ? theme.info[2] : "");
child = xmlnode_new_child(parent, "author");
xmlnode_set_attrib(child, "value", (theme.info[3]) ? theme.info[3] : "");
child = xmlnode_new_child(parent, "website");
xmlnode_set_attrib(child, "value", (theme.info[4]) ? theme.info[4] : "");
if (theme.type == gf_theme_type_basic) {
parent = xmlnode_new_child(node, "basic");
child = xmlnode_new_child(parent, "image");
xmlnode_set_attrib(child, "value", (theme.data.basic.image) ? theme.data.basic.image : "");
parent2 = xmlnode_new_child(parent, "text");
child = xmlnode_new_child(parent2, "font");
value = g_strdup_printf("%d", theme.data.basic.text_custom_font);
xmlnode_set_attrib(child, "custom", value);
g_free(value);
xmlnode_set_attrib(child, "value", (theme.data.basic.text_font) ? theme.data.basic.text_font : "");
child = xmlnode_new_child(parent2, "color");
value = g_strdup_printf("%d", theme.data.basic.text_custom_color);
xmlnode_set_attrib(child, "custom", value);
g_free(value);
xmlnode_set_attrib(child, "value", (theme.data.basic.text_color) ? theme.data.basic.text_color : "");
child = xmlnode_new_child(parent2, "clipping");
value = g_strdup_printf("%d", theme.data.basic.text_clipping);
xmlnode_set_attrib(child, "value", value);
g_free(value);
child = xmlnode_new_child(parent2, "position");
value = g_strdup_printf("%d", theme.data.basic.text_position);
xmlnode_set_attrib(child, "value", value);
g_free(value);
child = xmlnode_new_child(parent2, "offset");
value = g_strdup_printf("%d", theme.data.basic.text_horz_offset);
xmlnode_set_attrib(child, "horizontal", value);
g_free(value);
value = g_strdup_printf("%d", theme.data.basic.text_vert_offset);
xmlnode_set_attrib(child, "vertical", value);
g_free(value);
parent2 = xmlnode_new_child(parent, "icon");
child = xmlnode_new_child(parent2, "position");
value = g_strdup_printf("%d", theme.data.basic.proto_position);
xmlnode_set_attrib(child, "value", value);
g_free(value);
child = xmlnode_new_child(parent2, "size");
value = g_strdup_printf("%d", theme.data.basic.proto_size);
xmlnode_set_attrib(child, "value", value);
g_free(value);
child = xmlnode_new_child(parent2, "offset");
value = g_strdup_printf("%d", theme.data.basic.proto_horz_offset);
xmlnode_set_attrib(child, "horizontal", value);
g_free(value);
value = g_strdup_printf("%d", theme.data.basic.proto_vert_offset);
xmlnode_set_attrib(child, "vertical", value);
g_free(value);
parent2 = xmlnode_new_child(parent, "messages");
child = xmlnode_new_child(parent2, "sign_on");
xmlnode_set_attrib(child, "value", (theme.data.basic.messages[0]) ? theme.data.basic.messages[0] : "");
child = xmlnode_new_child(parent2, "sign_off");
xmlnode_set_attrib(child, "value", (theme.data.basic.messages[1]) ? theme.data.basic.messages[1] : "");
child = xmlnode_new_child(parent2, "away");
xmlnode_set_attrib(child, "value", (theme.data.basic.messages[2]) ? theme.data.basic.messages[2] : "");
child = xmlnode_new_child(parent2, "back");
xmlnode_set_attrib(child, "value", (theme.data.basic.messages[3]) ? theme.data.basic.messages[3] : "");
child = xmlnode_new_child(parent2, "idle");
xmlnode_set_attrib(child, "value", (theme.data.basic.messages[4]) ? theme.data.basic.messages[4] : "");
child = xmlnode_new_child(parent2, "unidle");
xmlnode_set_attrib(child, "value", (theme.data.basic.messages[5]) ? theme.data.basic.messages[5] : "");
}
value = xmlnode_to_str(node, &len);
printf("************************\n");
printf("XML Theme Dump\n");
printf("************************\n");
printf("%s\n",value);
printf("************************\n");
printf("XML Theme Dump end\n");
printf("Theme is %d characters long\n", len);
printf("************************\n");
xmlnode_free(node);
}
/**********************************************************************/
static void
preview_option_cb(GtkWidget *widget, gpointer data) {
}
/**********************************************************************/
static gboolean
entry_cb(GtkWidget *widget, gpointer data) {
gchar **value = (gchar**)data;
if ((*value) != NULL)
g_free((*value));
(*value) = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
update_modified(TRUE);
return FALSE;
}
/**********************************************************************/
static void
spin_button_cb(GtkWidget *widget, gpointer data) {
gint *value = (gint*)data;
(*value) = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
update_modified(TRUE);
}
/**********************************************************************/
static void
check_button_cb(GtkWidget *widget, gpointer data) {
gboolean new_value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
gboolean *value = (gboolean*)data;
if (value == &theme.data.basic.text_custom_font)
gtk_widget_set_sensitive(basic_text_font_button, new_value);
else if (value == &theme.data.basic.text_custom_color)
gtk_widget_set_sensitive(basic_text_color_button, new_value);
(*value) = new_value;
update_modified(TRUE);
}
/**********************************************************************/
static void
option_menu_cb(GtkWidget *widget, gpointer data) {
gint *value = (gint*)data;
(*value) = gtk_option_menu_get_history(GTK_OPTION_MENU(widget));
update_modified(TRUE);
}
/**********************************************************************/
static void
image_file_dialog(GtkWidget *widget, gpointer data) {
GtkWidget *dialog;
gchar **value = (gchar**)data;
dialog = gtk_file_selection_new(NULL);
g_object_set_data(G_OBJECT(dialog), "var_addr", value);
if ((*value) != NULL)
gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog), (*value));
gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(dialog));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dialog)->ok_button), "clicked", G_CALLBACK(image_file_dialog_ok), (gpointer)dialog);
g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(dialog)->ok_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)dialog);
g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(dialog)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)dialog);
gtk_widget_show(dialog);
}
/**********************************************************************/
static void
image_file_dialog_ok(GtkWidget *widget, gpointer data) {
GtkWidget *dialog = (GtkWidget*)data, *message_box = NULL;
gchar **value = (gchar**)g_object_get_data(G_OBJECT(dialog), "var_addr");
gchar *file = NULL;
GdkPixbuf *pixbuf;
if ((*value) != NULL)
g_free((*value));
file = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(dialog)));
pixbuf = gdk_pixbuf_new_from_file(file, NULL);
if (pixbuf != NULL) {
(*value) = file;
g_object_unref(pixbuf);
gtk_entry_set_text(GTK_ENTRY(basic_image_file), file);
update_modified(TRUE);
}
else {
message_box = gtk_message_dialog_new(GTK_WINDOW(window), 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "The file \"%s\" is not a valid image file", file);
gtk_window_set_modal(GTK_WINDOW(message_box), TRUE);
g_signal_connect_swapped(G_OBJECT(message_box), "response", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(message_box));
gtk_widget_show(message_box);
}
}
/**********************************************************************/
static void
font_dialog(GtkWidget *widget, gpointer data) {
GtkWidget *dialog;
gchar **value = (gchar**)data;
dialog = gtk_font_selection_dialog_new("Select a font...");
g_object_set_data(G_OBJECT(dialog), "var_addr", value);
if ((*value) != NULL)
gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(dialog), (*value));
gtk_font_selection_dialog_set_preview_text(GTK_FONT_SELECTION_DIALOG(dialog), "Guifications");
g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(dialog)->ok_button), "clicked", G_CALLBACK(font_dialog_ok), (gpointer)dialog);
g_signal_connect_swapped(G_OBJECT(GTK_FONT_SELECTION_DIALOG(dialog)->ok_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)dialog);
g_signal_connect_swapped(G_OBJECT(GTK_FONT_SELECTION_DIALOG(dialog)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)dialog);
gtk_widget_show(dialog);
}
/**********************************************************************/
static void
font_dialog_ok(GtkWidget *widget, gpointer data) {
GtkWidget *dialog = (GtkWidget*)data;
gchar **value = (gchar**)g_object_get_data(G_OBJECT(dialog), "var_addr");
if ((*value) != NULL)
g_free((*value));
(*value) = g_strdup(gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(dialog)));
update_modified(TRUE);
}
/**********************************************************************/
static void
color_dialog(GtkWidget *widget, gpointer data) {
GtkWidget *dialog;
gchar **value = (gchar**)data;
GdkColor gdk_color;
PangoColor pan_color;
dialog = gtk_color_selection_dialog_new("Select a color...");
g_object_set_data(G_OBJECT(dialog), "var_addr", value);
if ((*value) != NULL) {
pango_color_parse(&pan_color, (*value));
gdk_color.red = pan_color.red;
gdk_color.green = pan_color.green;
gdk_color.blue = pan_color.blue;
gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(dialog)->colorsel), &gdk_color);
}
g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(dialog)->ok_button), "clicked", G_CALLBACK(color_dialog_ok), (gpointer)dialog);
g_signal_connect_swapped(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(dialog)->ok_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)dialog);
g_signal_connect_swapped(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(dialog)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)dialog);
gtk_widget_show(dialog);
}
/**********************************************************************/
static void
color_dialog_ok(GtkWidget *widget, gpointer data) {
GtkWidget *dialog = (GtkWidget*)data;
gchar **value = (gchar**)g_object_get_data(G_OBJECT(dialog), "var_addr");
GdkColor gdk_color;
if ((*value) != NULL)
g_free((*value));
gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(dialog)->colorsel), &gdk_color);
(*value) = g_strdup_printf("#%04x%04x%04x", gdk_color.red, gdk_color.green, gdk_color.blue);
update_modified(TRUE);
}
/**********************************************************************/
static void
modified_message_response_cb(GtkWidget *widget, gint response_id, gpointer data) {
GtkWidget *dialog = (GtkWidget*)data;
gboolean quit = (gboolean)g_object_get_data(G_OBJECT(dialog), "quit");
switch (response_id) {
case GTK_RESPONSE_YES:
break;
case GTK_RESPONSE_NO:
clear_theme();
update_controls();
theme_modified = FALSE;
gtk_window_set_title(GTK_WINDOW(window), base_title);
gtk_widget_destroy(dialog);
if (quit) {
gtk_widget_destroy(window);
window = NULL;
gtk_main_quit();
}
break;
}
}
/**********************************************************************/
static void
dir_dialog_cb(GtkWidget *widget, gint response_id, gpointer data) {
GtkWidget *dialog = (GtkWidget*)data;
GtkWidget *overwrite_dialog = NULL;
gchar *file = NULL;
gboolean open = (gboolean)g_object_get_data(G_OBJECT(dialog), "open");
gboolean quit = (gboolean)g_object_get_data(G_OBJECT(dialog), "quit");
if (response_id == GTK_RESPONSE_ACCEPT) {
printf("ok clicked\n");
if (open) {
}
else {
if (quit) {
gtk_widget_destroy(window);
window = NULL;
gtk_main_quit();
}
}
}
gtk_widget_destroy(dialog);
dialog = NULL;
}
/**********************************************************************/