gnome-control-center/capplets/theme-switcher/gui.c

347 lines
11 KiB
C
Raw Normal View History

1998-11-21 23:35:51 +00:00
#include <config.h>
#include "da.h"
#include "capplet-widget.h"
#include <signal.h>
static GtkWidget *w;
extern gint pid;
void
die_callback(GtkWidget *widget, gpointer data)
{
kill (pid,9);
}
void
auto_callback (GtkWidget *widget, gpointer data)
{
if (GTK_TOGGLE_BUTTON (auto_preview)->active)
click_preview (widget,NULL);
}
GtkWidget *
make_main(void)
{
GtkWidget *evbox;
GtkWidget *l2;
GtkWidget *sw, *label, *socket;
GtkWidget *box, *vbox, *hbox;
GtkWidget *text, *frame, *button;
GtkWidget *hbxo;
w = capplet_widget_new();
gtk_container_set_border_width(GTK_CONTAINER(w), 5);
box = gtk_vbox_new(FALSE, GNOME_PAD);
hbox = gtk_hbox_new(TRUE, GNOME_PAD);
1998-11-21 23:35:51 +00:00
frame = gtk_frame_new (_("Available Themes"));
vbox = gtk_hbox_new(FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (vbox), GNOME_PAD_SMALL);
gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER (frame), vbox);
l2 = gtk_list_new();
gtk_list_set_selection_mode(GTK_LIST(l2), GTK_SELECTION_SINGLE);
hbxo = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
gtk_container_set_border_width (GTK_CONTAINER (hbxo), GNOME_PAD_SMALL);
1998-11-21 23:35:51 +00:00
label = gtk_label_new (_("Auto\nPreview"));
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
auto_preview = gtk_check_button_new ();
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (auto_preview), gnome_config_get_bool ("/theme-switcher-capplet/settings/auto=TRUE"));
gtk_signal_connect (GTK_OBJECT (auto_preview), "toggled", GTK_SIGNAL_FUNC (auto_callback), NULL);
gtk_container_add (GTK_CONTAINER (auto_preview), label);
gtk_box_pack_start (GTK_BOX (hbxo), auto_preview, FALSE, FALSE, 0);
1998-11-21 23:35:51 +00:00
button = gtk_button_new_with_label (_("Preview"));
gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (click_preview), NULL);
gtk_box_pack_start (GTK_BOX (hbxo), button, FALSE, FALSE, 0);
button = gtk_button_new_with_label (_("Install new\ntheme..."));
/* FIXME: this needs ot actually do something. */
gtk_box_pack_start (GTK_BOX (hbxo), button, FALSE, FALSE, 0);
sw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), l2);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_widget_set_usize (sw, 120, -1);
gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbxo, FALSE, FALSE, 0);
1998-11-21 23:35:51 +00:00
frame = gtk_frame_new (_("Theme Information"));
evbox = gtk_viewport_new(NULL, NULL);
gtk_container_add (GTK_CONTAINER (frame), evbox);
gtk_container_set_border_width (GTK_CONTAINER (evbox), GNOME_PAD_SMALL);
//gtk_widget_set_usize(evbox, 150, -1);
gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0);
text = gtk_xmhtml_new();
gtk_container_add(GTK_CONTAINER(evbox), text);
hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
gtk_container_set_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL);
1998-11-21 23:35:51 +00:00
frame = gtk_frame_new (_("Preview"));
gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER (frame), hbox);
/* in a gratuituous reuse of variable names... */
sw = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (sw), GTK_SHADOW_IN);
evbox = gtk_event_box_new();
gtk_box_pack_start(GTK_BOX(hbox), sw, TRUE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(sw), evbox);
socket = gtk_socket_new();
gtk_container_add(GTK_CONTAINER(evbox), socket);
update_theme_entries(l2);
gtk_signal_connect (GTK_OBJECT (w), "try",
GTK_SIGNAL_FUNC (click_try), NULL);
gtk_signal_connect (GTK_OBJECT (w), "ok",
GTK_SIGNAL_FUNC (click_ok), NULL);
gtk_signal_connect (GTK_OBJECT (w), "revert",
GTK_SIGNAL_FUNC (click_revert), NULL);
gtk_signal_connect (GTK_OBJECT (w), "cancel",
GTK_SIGNAL_FUNC (click_revert), NULL);
gtk_container_add (GTK_CONTAINER (w), box);
gtk_signal_connect (GTK_OBJECT (w), "destroy",
(GtkSignalFunc) die_callback, NULL);
readme_display = text;
readme_current = NULL;
current_theme = NULL;
last_theme = NULL;
system_list = l2;
preview_socket = socket;
gtk_widget_realize(socket);
return w;
}
void
click_update(GtkWidget *widget, gpointer data)
{
update_theme_entries(system_list);
}
void
click_preview(GtkWidget *widget, gpointer data)
{
gchar *rc;
if (current_theme == last_theme)
return;
last_theme = current_theme;
if (!current_theme)
return;
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(current_theme), "rc");
test_theme(rc);
send_reread();
}
void
click_try(GtkWidget *widget, gpointer data)
{
gchar *rc;
gchar *dir, cmd[10240];
if (current_theme == current_global_theme)
return;
widget = current_theme;
if (!widget)
return;
current_global_theme = current_theme;
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
dir = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "dir");
/* hack for enlightenment only!!!! */
/* FIXME: restart what ever windowmanager you have! */
/*g_snprintf(cmd, sizeof(cmd), "eesh -e \"restart %s/e\"", dir);*/
printf("%s\n", cmd);
send_reread();
use_theme(rc);
gdk_error_warnings = 0;
signal_apply_theme(widget);
gdk_flush();
system(cmd);
gdk_error_warnings = 1;
}
void
click_ok(GtkWidget *widget, gpointer data)
{
click_try (widget, data);
gnome_config_set_bool ("/theme-switcher-capplet/settings/auto",GTK_TOGGLE_BUTTON (auto_preview)->active);
gnome_config_set_string ("/theme-switcher-capplet/settings/theme", gtk_object_get_data (GTK_OBJECT (current_theme), "name"));
gnome_config_sync ();
}
void
click_revert(GtkWidget *widget, gpointer data)
{
gchar *rc;
gchar *dir, cmd[10240];
if ((current_global_theme == initial_theme) || (!current_global_theme))
return;
widget = initial_theme;
if (!widget)
return;
current_global_theme = widget;
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
dir = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "dir");
/* hack for enlightenment only!!!! */
/* FIXME: restart what ever windowmanager you have! */
/* g_snprintf(cmd, sizeof(cmd), "eesh -e \"restart %s/e\"", dir);*/
printf("%s\n", cmd);
send_reread();
use_theme(rc);
gdk_error_warnings = 0;
signal_apply_theme(widget);
gdk_flush();
system(cmd);
gdk_error_warnings = 1;
gtk_list_select_child (GTK_LIST (system_list), initial_theme);
}
void
click_entry(GtkWidget *widget, gpointer data)
{
gchar *rc, *name, *readme, *new_readme, buf[1024];
FILE *f;
name = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "name");
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
readme = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "readme");
/* boy is this hackish! */
if (widget != initial_theme)
gtk_list_item_deselect (GTK_LIST_ITEM (initial_theme));
if (initial_theme)
capplet_widget_state_changed(CAPPLET_WIDGET (w), TRUE);
else
capplet_widget_state_changed(CAPPLET_WIDGET (w), FALSE);
if (readme_current)
{
g_free(readme_current);
readme_current = NULL;
}
f = fopen(readme, "r");
if (f)
{
new_readme = NULL;
while (fgets(buf, 1024, f))
{
if (new_readme)
new_readme = g_realloc(new_readme, strlen(buf) + strlen(new_readme) + 1);
else
{
new_readme = g_malloc(strlen(buf) + 1);
new_readme[0] = 0;
}
strcat(new_readme, buf);
}
fclose(f);
if ((new_readme) && (strlen(new_readme) > 0))
{
gtk_xmhtml_source(GTK_XMHTML(readme_display), new_readme);
}
readme_current = new_readme;
}
current_theme = widget;
if (GTK_TOGGLE_BUTTON (auto_preview)->active)
click_preview (widget,NULL);
}
void
delete_entry(GtkWidget *widget, gpointer data)
{
gchar *rc, *name, *readme, *icon;
name = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "name");
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
readme = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "readme");
icon = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "icon");
g_free(name);
g_free(rc);
g_free(readme);
g_free(icon);
if (current_theme == widget)
current_theme = NULL;
}
static gint sort_alpha(const void *a, const void *b)
{
GtkBin *A, *B;
A = GTK_BIN (a);
B = GTK_BIN (b);
return strcmp((char *)GTK_LABEL (A->child)->label, (char *)GTK_LABEL (B->child)->label);
}
void
update_theme_entries(GtkWidget *disp_list)
{
ThemeEntry *te;
gint num;
GList *list;
int i;
GtkWidget *item;
gchar *d_theme = gnome_config_get_string ("/theme-switcher-capplet/settings/theme=Default");
list = NULL;
gtk_list_clear_items(GTK_LIST(disp_list), 0, -1);
te = list_system_themes(&num);
for (i = 0; i < num; i++)
{
item = gtk_list_item_new_with_label(te[i].name);
gtk_widget_show(item);
if (strcmp (d_theme, te[i].name) == 0) {
g_print ("woo hoo -- gotta match %s\n",te[i].name);
initial_theme = item;
}
gtk_object_set_data(GTK_OBJECT(item), "name", g_strdup(te[i].name));
gtk_object_set_data(GTK_OBJECT(item), "rc", g_strdup(te[i].rc));
gtk_object_set_data(GTK_OBJECT(item), "dir", g_strdup(te[i].dir));
gtk_object_set_data(GTK_OBJECT(item), "readme", g_strdup(te[i].readme));
gtk_object_set_data(GTK_OBJECT(item), "icon", g_strdup(te[i].icon));
gtk_signal_connect(GTK_OBJECT(item), "select",
GTK_SIGNAL_FUNC(click_entry), NULL);
gtk_signal_connect(GTK_OBJECT(item), "destroy",
GTK_SIGNAL_FUNC(delete_entry), NULL);
list = g_list_insert_sorted(list, item, sort_alpha);
}
te = list_user_themes(&num);
for (i = 0; i < num; i++)
{
item = gtk_list_item_new_with_label(te[i].name);
gtk_widget_show(item);
if (strcmp (d_theme, te[i].name) == 0) {
g_print ("woo hoo -- gotta match %s\n",te[i].name);
initial_theme = item;
}
gtk_object_set_data(GTK_OBJECT(item), "name", g_strdup(te[i].name));
gtk_object_set_data(GTK_OBJECT(item), "rc", g_strdup(te[i].rc));
gtk_object_set_data(GTK_OBJECT(item), "dir", g_strdup(te[i].dir));
gtk_object_set_data(GTK_OBJECT(item), "readme", g_strdup(te[i].readme));
gtk_object_set_data(GTK_OBJECT(item), "icon", g_strdup(te[i].icon));
gtk_signal_connect(GTK_OBJECT(item), "select",
GTK_SIGNAL_FUNC(click_entry), NULL);
gtk_signal_connect(GTK_OBJECT(item), "destroy",
GTK_SIGNAL_FUNC(delete_entry), NULL);
list = g_list_insert_sorted(list, item, sort_alpha);
}
gtk_list_select_child (GTK_LIST (system_list), initial_theme);
gtk_list_append_items(GTK_LIST(disp_list), list);
free_theme_list(te, num);
g_free (d_theme);
}