1998-11-21 23:35:51 +00:00
|
|
|
#include <config.h>
|
1998-09-23 02:39:17 +00:00
|
|
|
#include "da.h"
|
|
|
|
#include "capplet-widget.h"
|
|
|
|
#include <signal.h>
|
|
|
|
|
|
|
|
static GtkWidget *w;
|
|
|
|
extern gint pid;
|
1998-10-19 19:03:55 +00:00
|
|
|
|
|
|
|
|
1998-09-23 02:39:17 +00:00
|
|
|
void
|
|
|
|
die_callback(GtkWidget *widget, gpointer data)
|
|
|
|
{
|
|
|
|
kill (pid,9);
|
|
|
|
}
|
1998-10-19 19:03:55 +00:00
|
|
|
void
|
|
|
|
auto_callback (GtkWidget *widget, gpointer data)
|
|
|
|
{
|
|
|
|
if (GTK_TOGGLE_BUTTON (auto_preview)->active)
|
|
|
|
click_preview (widget,NULL);
|
|
|
|
|
|
|
|
}
|
1998-09-23 02:39:17 +00:00
|
|
|
|
|
|
|
GtkWidget *
|
|
|
|
make_main(void)
|
|
|
|
{
|
|
|
|
GtkWidget *evbox;
|
1998-10-19 19:03:55 +00:00
|
|
|
GtkWidget *l2;
|
1998-09-23 02:39:17 +00:00
|
|
|
GtkWidget *sw, *label, *socket;
|
|
|
|
GtkWidget *box, *vbox, *hbox;
|
|
|
|
GtkWidget *text, *frame, *button;
|
1998-10-19 19:03:55 +00:00
|
|
|
GtkWidget *hbxo;
|
1998-09-23 02:39:17 +00:00
|
|
|
|
|
|
|
w = capplet_widget_new();
|
1998-10-19 19:03:55 +00:00
|
|
|
gtk_container_border_width(GTK_CONTAINER(w), 5);
|
1998-09-23 02:39:17 +00:00
|
|
|
|
1998-10-19 19:03:55 +00:00
|
|
|
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"));
|
1998-10-19 19:03:55 +00:00
|
|
|
vbox = gtk_hbox_new(FALSE, 0);
|
|
|
|
gtk_container_border_width (GTK_CONTAINER (vbox), GNOME_PAD_SMALL);
|
|
|
|
gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0);
|
1998-09-23 02:39:17 +00:00
|
|
|
gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 0);
|
1998-10-19 19:03:55 +00:00
|
|
|
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_border_width (GTK_CONTAINER (hbxo), GNOME_PAD_SMALL);
|
1998-11-21 23:35:51 +00:00
|
|
|
label = gtk_label_new (_("Auto\nPreview"));
|
1998-10-19 19:03:55 +00:00
|
|
|
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
|
|
|
|
auto_preview = gtk_check_button_new ();
|
1998-09-23 02:39:17 +00:00
|
|
|
|
1998-10-19 19:03:55 +00:00
|
|
|
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (auto_preview), gnome_config_get_bool ("/theme-switcher-capplet/settings/auto=FALSE"));
|
|
|
|
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"));
|
1998-10-19 19:03:55 +00:00
|
|
|
gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (click_preview), NULL);
|
|
|
|
gtk_box_pack_start (GTK_BOX (hbxo), button, FALSE, FALSE, 0);
|
1998-11-21 23:35:51 +00:00
|
|
|
button = gtk_button_new_with_label (_("Install"));
|
1998-09-23 02:39:17 +00:00
|
|
|
|
1998-10-19 19:03:55 +00:00
|
|
|
/* FIXME: this needs ot actually do something. */
|
|
|
|
gtk_box_pack_start (GTK_BOX (hbxo), button, FALSE, FALSE, 0);
|
1998-09-23 02:39:17 +00:00
|
|
|
|
|
|
|
sw = gtk_scrolled_window_new(NULL, NULL);
|
|
|
|
gtk_container_add(GTK_CONTAINER(sw), l2);
|
1998-10-19 19:03:55 +00:00
|
|
|
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,
|
|
|
|
GTK_POLICY_AUTOMATIC);
|
|
|
|
gtk_widget_set_usize (sw, 120, -1);
|
|
|
|
|
1998-09-23 02:39:17 +00:00
|
|
|
gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
|
1998-10-19 19:03:55 +00:00
|
|
|
gtk_box_pack_start(GTK_BOX(vbox), hbxo, FALSE, FALSE, 0);
|
1998-09-23 02:39:17 +00:00
|
|
|
|
1998-11-21 23:35:51 +00:00
|
|
|
frame = gtk_frame_new (_("Theme Information"));
|
1998-10-19 19:03:55 +00:00
|
|
|
evbox = gtk_viewport_new(NULL, NULL);
|
|
|
|
gtk_container_add (GTK_CONTAINER (frame), evbox);
|
|
|
|
gtk_container_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);
|
1998-09-23 02:39:17 +00:00
|
|
|
|
1998-10-19 19:03:55 +00:00
|
|
|
hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
|
|
|
|
gtk_container_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL);
|
1998-11-21 23:35:51 +00:00
|
|
|
frame = gtk_frame_new (_("Preview"));
|
1998-10-19 19:03:55 +00:00
|
|
|
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);
|
1998-09-23 02:39:17 +00:00
|
|
|
evbox = gtk_event_box_new();
|
1998-10-19 19:03:55 +00:00
|
|
|
gtk_box_pack_start(GTK_BOX(hbox), sw, TRUE, TRUE, 0);
|
1998-09-23 02:39:17 +00:00
|
|
|
gtk_container_add(GTK_CONTAINER(sw), evbox);
|
|
|
|
socket = gtk_socket_new();
|
|
|
|
gtk_container_add(GTK_CONTAINER(evbox), socket);
|
1998-10-19 19:03:55 +00:00
|
|
|
update_theme_entries(l2);
|
1998-09-23 02:39:17 +00:00
|
|
|
gtk_signal_connect (GTK_OBJECT (w), "try",
|
1998-10-19 19:03:55 +00:00
|
|
|
GTK_SIGNAL_FUNC (click_try), NULL);
|
1998-09-23 02:39:17 +00:00
|
|
|
gtk_signal_connect (GTK_OBJECT (w), "ok",
|
1998-10-19 19:03:55 +00:00
|
|
|
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);
|
1998-09-23 02:39:17 +00:00
|
|
|
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;
|
1998-10-19 19:03:55 +00:00
|
|
|
last_theme = NULL;
|
|
|
|
system_list = l2;
|
1998-09-23 02:39:17 +00:00
|
|
|
preview_socket = socket;
|
|
|
|
|
|
|
|
gtk_widget_realize(socket);
|
|
|
|
|
|
|
|
return w;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
click_update(GtkWidget *widget, gpointer data)
|
|
|
|
{
|
1998-10-19 19:03:55 +00:00
|
|
|
update_theme_entries(system_list);
|
1998-09-23 02:39:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
click_preview(GtkWidget *widget, gpointer data)
|
|
|
|
{
|
|
|
|
gchar *rc;
|
|
|
|
|
1998-10-19 19:03:55 +00:00
|
|
|
if (current_theme == last_theme)
|
1998-09-23 02:39:17 +00:00
|
|
|
return;
|
1998-10-19 19:03:55 +00:00
|
|
|
last_theme = current_theme;
|
|
|
|
if (!current_theme)
|
|
|
|
return;
|
|
|
|
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(current_theme), "rc");
|
1998-09-23 02:39:17 +00:00
|
|
|
test_theme(rc);
|
|
|
|
send_reread();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1998-10-19 19:03:55 +00:00
|
|
|
click_try(GtkWidget *widget, gpointer data)
|
1998-09-23 02:39:17 +00:00
|
|
|
{
|
|
|
|
gchar *rc;
|
|
|
|
gchar *dir, cmd[10240];
|
|
|
|
|
1998-10-19 19:03:55 +00:00
|
|
|
if (current_theme == current_global_theme)
|
|
|
|
return;
|
1998-09-23 02:39:17 +00:00
|
|
|
widget = current_theme;
|
|
|
|
if (!widget)
|
|
|
|
return;
|
1998-10-19 19:03:55 +00:00
|
|
|
current_global_theme = current_theme;
|
1998-09-23 02:39:17 +00:00
|
|
|
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;
|
|
|
|
}
|
1998-10-19 19:03:55 +00:00
|
|
|
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;
|
1998-09-23 02:39:17 +00:00
|
|
|
|
1998-10-19 19:03:55 +00:00
|
|
|
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);
|
|
|
|
}
|
1998-09-23 02:39:17 +00:00
|
|
|
void
|
|
|
|
click_entry(GtkWidget *widget, gpointer data)
|
|
|
|
{
|
1998-10-19 19:03:55 +00:00
|
|
|
gchar *rc, *name, *readme, *new_readme, buf[1024];
|
1998-09-23 02:39:17 +00:00
|
|
|
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");
|
|
|
|
|
1998-10-19 19:03:55 +00:00
|
|
|
/* 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);
|
1998-09-23 02:39:17 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
1998-10-19 19:03:55 +00:00
|
|
|
|
1998-09-23 02:39:17 +00:00
|
|
|
current_theme = widget;
|
1998-10-19 19:03:55 +00:00
|
|
|
if (GTK_TOGGLE_BUTTON (auto_preview)->active)
|
|
|
|
click_preview (widget,NULL);
|
|
|
|
|
1998-09-23 02:39:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
1998-10-19 19:03:55 +00:00
|
|
|
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);
|
|
|
|
}
|
1998-09-23 02:39:17 +00:00
|
|
|
|
|
|
|
void
|
1998-10-19 19:03:55 +00:00
|
|
|
update_theme_entries(GtkWidget *disp_list)
|
1998-09-23 02:39:17 +00:00
|
|
|
{
|
|
|
|
ThemeEntry *te;
|
|
|
|
gint num;
|
|
|
|
GList *list;
|
|
|
|
int i;
|
|
|
|
GtkWidget *item;
|
1998-10-19 19:03:55 +00:00
|
|
|
gchar *d_theme = gnome_config_get_string ("/theme-switcher-capplet/settings/theme=Default");
|
1998-09-23 02:39:17 +00:00
|
|
|
|
|
|
|
list = NULL;
|
1998-10-19 19:03:55 +00:00
|
|
|
gtk_list_clear_items(GTK_LIST(disp_list), 0, -1);
|
1998-09-23 02:39:17 +00:00
|
|
|
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);
|
1998-10-19 19:03:55 +00:00
|
|
|
if (strcmp (d_theme, te[i].name) == 0) {
|
|
|
|
g_print ("woo hoo -- gotta match %s\n",te[i].name);
|
|
|
|
initial_theme = item;
|
|
|
|
}
|
1998-09-23 02:39:17 +00:00
|
|
|
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);
|
1998-10-19 19:03:55 +00:00
|
|
|
list = g_list_insert_sorted(list, item, sort_alpha);
|
1998-09-23 02:39:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
1998-10-19 19:03:55 +00:00
|
|
|
if (strcmp (d_theme, te[i].name) == 0) {
|
|
|
|
g_print ("woo hoo -- gotta match %s\n",te[i].name);
|
|
|
|
initial_theme = item;
|
|
|
|
}
|
1998-09-23 02:39:17 +00:00
|
|
|
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);
|
1998-10-19 19:03:55 +00:00
|
|
|
list = g_list_insert_sorted(list, item, sort_alpha);
|
1998-09-23 02:39:17 +00:00
|
|
|
}
|
1998-10-19 19:03:55 +00:00
|
|
|
|
|
|
|
gtk_list_select_child (GTK_LIST (system_list), initial_theme);
|
|
|
|
gtk_list_append_items(GTK_LIST(disp_list), list);
|
1998-09-23 02:39:17 +00:00
|
|
|
|
|
|
|
free_theme_list(te, num);
|
1998-10-19 19:03:55 +00:00
|
|
|
g_free (d_theme);
|
1998-09-23 02:39:17 +00:00
|
|
|
}
|