grim/guifications1

moved .cvsignore to .hgignore
default tip
2010-12-15, Gary Kramlich
8707c33529f9
moved .cvsignore to .hgignore
can't do much more with this since gaim doesn't exist anymore :)
/*
Guifications - The notification plugin to end all notification plugins!
Copyright (C) 2003-2004 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 <gtk/gtk.h>
#include <gdk/gdk.h>
#ifdef HAVE_CONFIG_H
#include "../gf_config.h"
#endif
#include "gaim.h"
#include "plugin.h"
#include "gtkplugin.h"
#include "gtkutils.h"
#include "prefs.h"
#include "debug.h"
#include "guifications.h"
#include "gf_types.h"
#include "gf_conf.h"
#include "gf_prefs.h"
#include "gf_pngs.h"
#include "gf_gtkutils.h"
/***********************************************************************
Globals
***********************************************************************/
static GtkWidget *btn_image, *btn_font, *btn_color;
static GtkWidget *edt_image;
static GtkWidget *evt_color;
/***********************************************************************
Prototypes
***********************************************************************/
static GtkWidget *make_entry( const gchar *pref );
static GtkWidget *make_button( gchar *text );
static void make_color_preview( GtkWidget *image, const gchar *color );
/* callbacks */
static void chk_box_cb( GtkWidget *check, const gchar *pref );
static void spn_btn_cb( GtkWidget *spin, const gchar *pref );
static void opt_mnu_cb( GtkWidget *opt_menu, const gchar *pref );
static gboolean edt_box_cb( GtkWidget *entry, GdkEventFocus *event, const gchar *pref );
static void image_file_ok( GtkWidget *widget, gpointer data );
static void image_file_dialog( GtkWidget *check, gpointer data );
static void font_ok( GtkWidget *widget, gpointer data );
static void font_dialog( GtkWidget *check, gpointer data );
static void color_ok( GtkWidget *widget, gpointer data );
static void color_dialog( GtkWidget *widget, gpointer data );
/**********************************************************************/
GtkWidget *
get_config_frame(GaimPlugin *plugin) {
GtkWidget *note, *vbox, *hbox, *frame, *label, *spin;
GtkWidget *chk_btn, *opt_mnu, *edt_box;
GtkSizeGroup *sg;
gint pad_x, pad_y;
pad_x = pad_y = 5;
/* create notebook */
note = gtk_notebook_new();
/*******************************************************************
behavior tab
*******************************************************************/
/* setup behavior sizegroup */
sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
/* create behavior tab */
vbox = gf_add_page(GTK_NOTEBOOK(note), "Behavior", -1);
/* create notification frame */
frame = gaim_gtk_make_frame(vbox, "Notifications");
/* create sign on/off hbox */
hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
/* create sign on check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_BEHAVIOR_SHOW_SIGN_ON), "Show _Sign On", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_BEHAVIOR_SHOW_SIGN_ON);
gtk_box_pack_start(GTK_BOX(hbox), chk_btn, FALSE, FALSE, 0 );
/* create sign off check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_BEHAVIOR_SHOW_SIGN_OFF), "Show Sign _Off", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_BEHAVIOR_SHOW_SIGN_OFF);
gtk_box_pack_start(GTK_BOX(hbox), chk_btn, FALSE, FALSE, 0);
/* create away/back hbox */
hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
/* create away check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_BEHAVIOR_SHOW_AWAY), "Show _Away", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_BEHAVIOR_SHOW_AWAY);
gtk_box_pack_start(GTK_BOX(hbox), chk_btn, FALSE, FALSE, 0 );
/* create back check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_BEHAVIOR_SHOW_BACK), "Show _Back", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_BEHAVIOR_SHOW_BACK);
gtk_box_pack_start(GTK_BOX(hbox), chk_btn, FALSE, FALSE, 0);
/* create idle/unidle hbox */
hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
/* create idle check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_BEHAVIOR_SHOW_IDLE), "Show _Idle", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_BEHAVIOR_SHOW_IDLE);
gtk_box_pack_start(GTK_BOX(hbox), chk_btn, FALSE, FALSE, 0);
/* create unidle check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_BEHAVIOR_SHOW_UNIDLE), "Show _Unidle", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_BEHAVIOR_SHOW_UNIDLE);
gtk_box_pack_start(GTK_BOX(hbox), chk_btn, FALSE, FALSE, 0);
/* create the messages hbox */
hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
/* create receive messages check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_BEHAVIOR_SHOW_RECEIVE_MESSAGES), "Show _Received Messages", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_BEHAVIOR_SHOW_RECEIVE_MESSAGES);
gtk_box_pack_start(GTK_BOX(hbox), chk_btn, FALSE, FALSE, 0);
/* create position frame */
frame = gaim_gtk_make_frame(vbox, "Position");
/* create position option menu */
opt_mnu = gf_make_window_position_option_menu(gaim_prefs_get_int(GF_PREF_BEHAVIOR_WINDOW_POS));
g_signal_connect(G_OBJECT(opt_mnu), "changed", G_CALLBACK(opt_mnu_cb), GF_PREF_BEHAVIOR_WINDOW_POS);
label = gf_add_label(opt_mnu, "_Position:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create offset spin buttons */
spin = gf_make_spin_button(gaim_prefs_get_int(GF_PREF_BEHAVIOR_X), 0, 255, TRUE);
g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(spn_btn_cb), (gpointer)GF_PREF_BEHAVIOR_X);
label = gf_add_label(spin, "_Horizontal offset:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
spin = gf_make_spin_button(gaim_prefs_get_int(GF_PREF_BEHAVIOR_Y), 0, 255, TRUE);
g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(spn_btn_cb), (gpointer)GF_PREF_BEHAVIOR_Y);
label = gf_add_label(spin, "_Vertical offset:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create vertical check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_BEHAVIOR_WINDOW_VERTICAL), "_Vertical", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_BEHAVIOR_WINDOW_VERTICAL);
gtk_box_pack_start(GTK_BOX(frame), chk_btn, FALSE, FALSE, 0);
/* create display frame */
frame = gaim_gtk_make_frame(vbox, "Display");
/* create display spin */
spin = gf_make_spin_button(gaim_prefs_get_int(GF_PREF_BEHAVIOR_TIMEOUT), 0, 60, TRUE);
g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(spn_btn_cb), (gpointer)GF_PREF_BEHAVIOR_TIMEOUT);
hbox = gf_add_label(spin, "Display _time:", sg);
label = gf_make_label("seconds", NULL);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
/* create zoom option menu */
opt_mnu = gf_make_window_zoom_option_menu(gaim_prefs_get_int(GF_PREF_BEHAVIOR_ZOOM));
g_signal_connect(G_OBJECT(opt_mnu), "changed", G_CALLBACK(opt_mnu_cb), GF_PREF_BEHAVIOR_ZOOM);
label = gf_add_label(opt_mnu, "_Zoom:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create alias check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_BEHAVIOR_ALIAS), "S_how alias if set", NULL);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_BEHAVIOR_ALIAS);
gtk_box_pack_start(GTK_BOX(frame), chk_btn, FALSE, FALSE, 0);
/* show if away check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_BEHAVIOR_SHOWAWAY), "Sho_w Guifications while away", NULL);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_BEHAVIOR_SHOWAWAY);
gtk_box_pack_start(GTK_BOX(frame), chk_btn, FALSE, FALSE, 0);
/* create mouse frame */
frame = gaim_gtk_make_frame(vbox, "Mouse");
/* create mouse1 option */
opt_mnu = gf_make_window_mouse_option_menu(gaim_prefs_get_int(GF_PREF_BEHAVIOR_MOUSE1));
g_signal_connect(G_OBJECT(opt_mnu), "changed", G_CALLBACK(opt_mnu_cb), GF_PREF_BEHAVIOR_MOUSE1);
label = gf_add_label(opt_mnu, "_Left Button:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create mouse2 option */
opt_mnu = gf_make_window_mouse_option_menu(gaim_prefs_get_int(GF_PREF_BEHAVIOR_MOUSE2));
g_signal_connect(G_OBJECT(opt_mnu), "changed", G_CALLBACK(opt_mnu_cb), GF_PREF_BEHAVIOR_MOUSE2);
label = gf_add_label(opt_mnu, "_Middle Button:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create mouse3 option */
opt_mnu = gf_make_window_mouse_option_menu(gaim_prefs_get_int(GF_PREF_BEHAVIOR_MOUSE3));
g_signal_connect(G_OBJECT(opt_mnu), "changed", G_CALLBACK(opt_mnu_cb), GF_PREF_BEHAVIOR_MOUSE3);
label = gf_add_label(opt_mnu, "_Right Button:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/*******************************************************************
appearance tab
*******************************************************************/
/* make appearance sizegroup */
sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
/* create appearance tab */
vbox = gf_add_page(GTK_NOTEBOOK(note), "Appearance", -1);
/* create image frame */
frame = gaim_gtk_make_frame(vbox, "Image");
/* create image check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_APPEARANCE_IMAGE), "Use custom _image", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_APPEARANCE_IMAGE);
gtk_box_pack_start(GTK_BOX(frame), chk_btn, FALSE, FALSE, 0);
/* create image entry/button hbox */
hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
/* create image edit box */
edt_image = make_entry(GF_PREF_APPEARANCE_IMAGE_FILE);
gtk_widget_set_sensitive(edt_image, FALSE);
gtk_box_pack_start(GTK_BOX(hbox), edt_image, FALSE, FALSE, 0);
/* create image button */
btn_image = make_button("_Browse...");
gtk_widget_set_sensitive(btn_image, gaim_prefs_get_bool(GF_PREF_APPEARANCE_IMAGE));
g_signal_connect(G_OBJECT(btn_image), "clicked", G_CALLBACK(image_file_dialog), NULL);
gtk_box_pack_start(GTK_BOX(hbox), btn_image, FALSE, FALSE, 0);
/* create text frame */
frame = gaim_gtk_make_frame(vbox, "Text");
/* create font hbox */
hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
/* create font check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_APPEARANCE_FONT), "Use custom fon_t", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_APPEARANCE_FONT);
gtk_box_pack_start(GTK_BOX(hbox), chk_btn, FALSE, FALSE, 0);
/* create font button */
btn_font = gtk_button_new_from_stock(GTK_STOCK_SELECT_FONT);
gtk_widget_set_sensitive(btn_font, gaim_prefs_get_bool(GF_PREF_APPEARANCE_FONT));
g_signal_connect(G_OBJECT(btn_font), "clicked", G_CALLBACK(font_dialog), NULL);
gtk_box_pack_start(GTK_BOX(hbox), btn_font, FALSE, FALSE, 0);
/* create color hbox */
hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
/* create color check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_APPEARANCE_COLOR), "Use custom co_lor", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_APPEARANCE_COLOR);
gtk_box_pack_start(GTK_BOX(hbox), chk_btn, FALSE, FALSE, 0);
/* create color button */
btn_color = gtk_button_new_from_stock(GTK_STOCK_SELECT_COLOR);
gtk_widget_set_sensitive(btn_color, gaim_prefs_get_bool(GF_PREF_APPEARANCE_COLOR));
g_signal_connect(G_OBJECT(btn_color), "clicked", G_CALLBACK(color_dialog), NULL);
gtk_box_pack_start(GTK_BOX(hbox), btn_color, FALSE, FALSE, 0);
/* create color event box */
evt_color = gtk_event_box_new();
gtk_widget_set_size_request(evt_color, 50, -1);
make_color_preview(evt_color, gaim_prefs_get_string(GF_PREF_COLORS_FOREGROUND));
gtk_box_pack_start(GTK_BOX(hbox), evt_color, FALSE, FALSE, 0);
/* create clipping option menu */
opt_mnu = gf_make_text_clipping_option_menu(gaim_prefs_get_int(GF_PREF_APPEARANCE_TEXT_CLIPPING));
g_signal_connect(G_OBJECT(opt_mnu), "changed", G_CALLBACK(opt_mnu_cb), GF_PREF_APPEARANCE_TEXT_CLIPPING);
label = gf_add_label(opt_mnu, "Clippin_g:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create position option menu */
opt_mnu = gf_make_item_position_option_menu(gaim_prefs_get_int(GF_PREF_APPEARANCE_TEXT_POS));
g_signal_connect(G_OBJECT(opt_mnu), "changed", G_CALLBACK(opt_mnu_cb), GF_PREF_APPEARANCE_TEXT_POS);
label = gf_add_label(opt_mnu, "_Position:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create horz spin */
spin = gf_make_spin_button(gaim_prefs_get_int(GF_PREF_APPEARANCE_TEXT_X), 0, 255, TRUE);
g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(spn_btn_cb), (gpointer)GF_PREF_APPEARANCE_TEXT_X);
label = gf_add_label(spin, "_Horizontal offset:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create vert spin */
spin = gf_make_spin_button(gaim_prefs_get_int(GF_PREF_APPEARANCE_TEXT_Y), 0, 255, TRUE);
g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(spn_btn_cb), (gpointer)GF_PREF_APPEARANCE_TEXT_Y);
label = gf_add_label(spin, "_Vertical offset:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create protocol frame */
frame = gaim_gtk_make_frame(vbox, "Protocol");
/* create position option menu */
opt_mnu = gf_make_item_position_option_menu(gaim_prefs_get_int(GF_PREF_APPEARANCE_PROT_POS));
g_signal_connect(G_OBJECT(opt_mnu), "changed", G_CALLBACK(opt_mnu_cb), GF_PREF_APPEARANCE_PROT_POS);
label = gf_add_label(opt_mnu, "P_osition:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create size option menu */
opt_mnu = gf_make_icon_size_option_menu(gaim_prefs_get_int(GF_PREF_APPEARANCE_PROT_SIZE));
g_signal_connect(G_OBJECT(opt_mnu), "changed", G_CALLBACK(opt_mnu_cb), GF_PREF_APPEARANCE_PROT_SIZE);
label = gf_add_label(opt_mnu, "Si_ze:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create horz spin */
spin = gf_make_spin_button(gaim_prefs_get_int(GF_PREF_APPEARANCE_PROT_X), 0, 255, TRUE);
g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(spn_btn_cb), (gpointer)GF_PREF_APPEARANCE_PROT_X);
label = gf_add_label(spin, "Ho_rizontal offset:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create vert spin */
spin = gf_make_spin_button(gaim_prefs_get_int(GF_PREF_APPEARANCE_PROT_Y), 0, 255, TRUE);
g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(spn_btn_cb), (gpointer)GF_PREF_APPEARANCE_PROT_Y);
label = gf_add_label(spin, "Ver_tical offset:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/*******************************************************************
Messages tab
*******************************************************************/
/* make messages size group */
sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
/* create message tab */
vbox = gf_add_page(GTK_NOTEBOOK(note), "Messages", -1);
/* create messages frame */
frame = gaim_gtk_make_frame(vbox, "Status Messages");
/* create sign on line */
edt_box = make_entry(GF_PREF_MESSAGES_SIGN_ON);
label = gf_add_label(edt_box, "_Sign on:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create sign off line */
edt_box = make_entry(GF_PREF_MESSAGES_SIGN_OFF);
label = gf_add_label(edt_box, "Sign _off:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create away line */
edt_box = make_entry(GF_PREF_MESSAGES_AWAY);
label = gf_add_label(edt_box, "_Away:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create back line */
edt_box = make_entry(GF_PREF_MESSAGES_BACK);
label = gf_add_label(edt_box, "_Back:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create idle line */
edt_box = make_entry(GF_PREF_MESSAGES_IDLE);
label = gf_add_label(edt_box, "_Idle:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create unidle line */
edt_box = make_entry(GF_PREF_MESSAGES_UNIDLE);
label = gf_add_label(edt_box, "_Unidle:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/* create receive line */
edt_box = make_entry(GF_PREF_MESSAGES_RECEIVE);
label = gf_add_label(edt_box, "_Receive:", sg);
gtk_box_pack_start(GTK_BOX(frame), label, FALSE, FALSE, 0);
/*******************************************************************
Advanced tab
*******************************************************************/
/* make advanced sizeground */
sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
/* create advanced tab */
vbox = gf_add_page(GTK_NOTEBOOK(note), "Advanced", -1);
/* create release notification frame */
frame = gaim_gtk_make_frame(vbox, "Release Notification");
/* create release notification check */
chk_btn = gf_make_check_button(gaim_prefs_get_bool(GF_PREF_ADVANCED_RELEASE), "Check for new releases", sg);
g_signal_connect(G_OBJECT(chk_btn), "clicked", G_CALLBACK(chk_box_cb), (gpointer)GF_PREF_ADVANCED_RELEASE);
gtk_box_pack_start(GTK_BOX(frame), chk_btn, FALSE, FALSE, 0);
/* create behavior frame */
frame = gaim_gtk_make_frame(vbox, "Behavior");
/* create sign on spin */
spin = gf_make_spin_button(gaim_prefs_get_int(GF_PREF_ADVANCED_DELAY), 0, 30000, TRUE);
g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(spn_btn_cb), (gpointer)GF_PREF_ADVANCED_DELAY);
hbox = gf_add_label(spin, "_Sign on delay:", sg);
/* create sign on description */
label = gf_make_label("milliseconds", NULL);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
gtk_widget_show_all(note);
g_object_unref(sg);
return note;
}
/**********************************************************************/
static void
make_color_preview(GtkWidget *image, const gchar *color) {
GtkStyle *style;
GdkColor gcolor;
PangoColor pcolor;
gcolor.pixel = 0;
if (gaim_prefs_get_bool(GF_PREF_APPEARANCE_COLOR))
{
pango_color_parse(&pcolor, color);
gcolor.red = pcolor.red;
gcolor.green = pcolor.green;
gcolor.blue = pcolor.blue;
}
else
gcolor.red = gcolor.green = gcolor.blue = 0;
style = gtk_style_new();
style->bg[0] = gcolor;
gtk_widget_set_style(image, style);
g_object_unref(style);
}
/**********************************************************************/
static GtkWidget *
make_entry(const gchar *pref) {
GtkWidget *entry;
entry = gtk_entry_new();
gtk_entry_set_text(GTK_ENTRY(entry), gaim_prefs_get_string(pref));
g_signal_connect(G_OBJECT(entry), "focus-out-event", G_CALLBACK(edt_box_cb), (gpointer)pref);
return entry;
}
/**********************************************************************/
static GtkWidget *
make_button(gchar *text) {
GtkWidget *ret;
ret = gtk_button_new_with_mnemonic(text);
return ret;
}
/***********************************************************************
Callbacks
***********************************************************************/
static void
chk_box_cb(GtkWidget *check, const gchar *pref) {
gboolean enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check));
gaim_prefs_set_bool(pref, enabled);
if (g_ascii_strcasecmp(pref, GF_PREF_APPEARANCE_IMAGE) == 0)
gtk_widget_set_sensitive(btn_image, enabled);
else if (g_ascii_strcasecmp(pref, GF_PREF_APPEARANCE_FONT) == 0)
gtk_widget_set_sensitive(btn_font, enabled);
else if (g_ascii_strcasecmp(pref, GF_PREF_APPEARANCE_COLOR) == 0) {
gtk_widget_set_sensitive(btn_color, enabled);
make_color_preview(evt_color, gaim_prefs_get_string(GF_PREF_COLORS_FOREGROUND));
}
}
/**********************************************************************/
static void
spn_btn_cb(GtkWidget *spin, const gchar *pref) {
gaim_prefs_set_int(pref, gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin)));
}
/**********************************************************************/
static void
opt_mnu_cb(GtkWidget *opt_menu, const gchar *pref) {
if (g_ascii_strcasecmp(pref, GF_PREF_BEHAVIOR_ZOOM) == 0)
gf_destroy_all();
gaim_prefs_set_int(pref, gtk_option_menu_get_history(GTK_OPTION_MENU(opt_menu)));
}
/**********************************************************************/
static gboolean
edt_box_cb(GtkWidget *entry, GdkEventFocus *event, const gchar *pref) {
gaim_prefs_set_string(pref, gtk_entry_get_text(GTK_ENTRY(entry)));
return FALSE;
}
/**********************************************************************/
static void
image_file_dialog(GtkWidget *check, gpointer data) {
GtkWidget *file_sel;
file_sel = gtk_file_selection_new("Select a background image");
gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_sel), gaim_prefs_get_string(GF_PREF_APPEARANCE_IMAGE_FILE));
gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(file_sel));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(file_sel)->ok_button), "clicked", G_CALLBACK(image_file_ok), (gpointer)file_sel);
g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(file_sel)->ok_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)file_sel);
g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(file_sel)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)file_sel);
gtk_widget_show(file_sel);
}
/**********************************************************************/
static void
image_file_ok(GtkWidget *widget, gpointer data) {
GtkWidget *file_sel = (GtkWidget*)data, *message_box = NULL;
const gchar *file;
GdkPixbuf *pixbuf;
file = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file_sel));
pixbuf = gdk_pixbuf_new_from_file(file, NULL);
if (pixbuf != NULL) {
gf_destroy_all();
gaim_prefs_set_string(GF_PREF_APPEARANCE_IMAGE_FILE, file);
g_object_unref(pixbuf);
gtk_entry_set_text(GTK_ENTRY(edt_image), file);
}
else {
message_box = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "The file \"%s\" is not a valid image file", file);
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 *check, gpointer data) {
GtkWidget *font_sel;
font_sel = gtk_font_selection_dialog_new("Select Font");
gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(font_sel), gaim_prefs_get_string(GF_PREF_APPEARANCE_FONT_FACE));
gtk_font_selection_dialog_set_preview_text(GTK_FONT_SELECTION_DIALOG(font_sel), "Guifications");
g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel)->ok_button), "clicked", G_CALLBACK(font_ok), (gpointer)font_sel);
g_signal_connect_swapped(G_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel)->ok_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)font_sel);
g_signal_connect_swapped(G_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)font_sel);
gtk_widget_show(font_sel);
}
/**********************************************************************/
static void
font_ok(GtkWidget *widget, gpointer data) {
GtkWidget *font_sel = (GtkWidget*)data;
gchar *face;
face = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(font_sel));
gtk_widget_destroy(font_sel);
font_sel = NULL;
gaim_prefs_set_string(GF_PREF_APPEARANCE_FONT_FACE, face);
if(face)
g_free(face);
}
/**********************************************************************/
static void
color_dialog(GtkWidget *widget, gpointer data) {
GtkWidget *color_sel;
GdkColor color;
PangoColor pcolor;
pango_color_parse(&pcolor, gaim_prefs_get_string(GF_PREF_COLORS_FOREGROUND));
color.red = pcolor.red;
color.green = pcolor.green;
color.blue = pcolor.blue;
color_sel = gtk_color_selection_dialog_new("Select Font Color");
gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(color_sel)->colorsel), &color);
g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(color_sel)->ok_button), "clicked", G_CALLBACK(color_ok), (gpointer)color_sel);
g_signal_connect_swapped(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(color_sel)->ok_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)color_sel);
g_signal_connect_swapped(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(color_sel)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)color_sel);
gtk_widget_show(color_sel);
}
/**********************************************************************/
static void
color_ok(GtkWidget *widget, gpointer data) {
GtkWidget *color_sel = (GtkWidget*)data;
GdkColor color;
char buf[14];
gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(color_sel)->colorsel), &color);
g_snprintf(buf, sizeof(buf), "#%04x%04x%04x", color.red, color.green, color.blue);
make_color_preview(evt_color, buf);
gaim_prefs_set_string(GF_PREF_COLORS_FOREGROUND, buf);
}
/**********************************************************************/