gnome-control-center/capplets/theme-switcher/gui.c-6060
Jonathan Blandford 724309cdfb This will switch themes. You need themes for it to compile so you
need to edit the gnome-core/capplets/Makefile.am and
gnome-core/configure.in to get this to compile.  If you do, it's
pretty cool...
1998-09-23 02:39:17 +00:00

281 lines
7.9 KiB
Text

#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);
}
GtkWidget *
make_main(void)
{
GtkWidget *evbox;
GtkWidget *l1, *l2;
GtkWidget *sw, *label, *socket;
GtkWidget *box, *vbox, *hbox;
GtkWidget *text, *frame, *button;
w = capplet_widget_new();
gtk_container_border_width(GTK_CONTAINER(w), 0);
l1 = gtk_list_new();
gtk_list_set_selection_mode(GTK_LIST(l1), GTK_SELECTION_SINGLE);
l2 = gtk_list_new();
gtk_list_set_selection_mode(GTK_LIST(l2), GTK_SELECTION_SINGLE);
box = gtk_vbox_new(FALSE, 0);
hbox = gtk_hbox_new(TRUE, 0);
gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 0);
vbox = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
label = gtk_label_new("Installed System Themes");
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
sw = gtk_scrolled_window_new(NULL, NULL);
gtk_container_add(GTK_CONTAINER(sw), l1);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,
GTK_POLICY_ALWAYS);
gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
vbox = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
label = gtk_label_new("Installed User Themes");
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
sw = gtk_scrolled_window_new(NULL, NULL);
gtk_container_add(GTK_CONTAINER(sw), l2);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,
GTK_POLICY_ALWAYS);
gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
sw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_ALWAYS,
GTK_POLICY_ALWAYS);
gtk_widget_set_usize(sw, -1, 160);
gtk_box_pack_start(GTK_BOX(box), sw, FALSE, FALSE, 0);
evbox = gtk_event_box_new();
gtk_container_add(GTK_CONTAINER(sw), evbox);
socket = gtk_socket_new();
gtk_container_add(GTK_CONTAINER(evbox), socket);
/* gtk_widget_set_usize(socket, 640, 480);*/
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
frame = gtk_frame_new("Theme Information");
gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0);
vbox = gtk_vbox_new(FALSE, 0);
gtk_widget_set_usize(vbox, 128, 128);
gtk_container_add(GTK_CONTAINER(frame), vbox);
icon_display = vbox;
evbox = gtk_viewport_new(NULL, NULL);
gtk_widget_set_usize(evbox, 256, -1);
gtk_box_pack_start(GTK_BOX(hbox), evbox, TRUE, TRUE, 0);
text = gtk_xmhtml_new();
gtk_container_add(GTK_CONTAINER(evbox), text);
/* gtk_box_pack_start(GTK_BOX(hbox), text, TRUE, TRUE, 0);*/
update_theme_entries(l1, l2);
gtk_signal_connect (GTK_OBJECT (w), "try",
GTK_SIGNAL_FUNC (click_preview), NULL);
gtk_signal_connect (GTK_OBJECT (w), "ok",
GTK_SIGNAL_FUNC (click_apply), 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;
icon_current = NULL;
current_theme = NULL;
system_list = l1;
user_list = l2;
preview_socket = socket;
gtk_widget_realize(socket);
return w;
}
void
click_update(GtkWidget *widget, gpointer data)
{
update_theme_entries(system_list, user_list);
}
void
click_preview(GtkWidget *widget, gpointer data)
{
gchar *rc;
widget = current_theme;
if (!widget)
return;
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
test_theme(rc);
send_reread();
}
void
click_apply(GtkWidget *widget, gpointer data)
{
gchar *rc;
gchar *dir, cmd[10240];
widget = current_theme;
if (!widget)
return;
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_entry(GtkWidget *widget, gpointer data)
{
gchar *rc, *name, *readme, *icon, *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");
icon = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "icon");
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;
}
if (icon_current)
gtk_widget_destroy(icon_current);
icon_current = NULL;
if (isfile(icon))
{
icon_current = gnome_pixmap_new_from_file(icon);
if (icon_current)
{
gtk_container_add(GTK_CONTAINER(icon_display), icon_current);
gtk_widget_show(icon_current);
}
}
current_theme = widget;
}
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;
}
void
update_theme_entries(GtkWidget *system_list, GtkWidget *user_list)
{
ThemeEntry *te;
gint num;
GList *list;
int i;
GtkWidget *item;
list = NULL;
gtk_list_clear_items(GTK_LIST(system_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);
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_append(list, item);
}
gtk_list_append_items(GTK_LIST(system_list), list);
list = NULL;
gtk_list_clear_items(GTK_LIST(user_list), 0, -1);
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);
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_append(list, item);
}
gtk_list_append_items(GTK_LIST(user_list), list);
free_theme_list(te, num);
}