gnome-control-center/capplets/theme-switcher/lister.c
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

165 lines
3.4 KiB
C

#include "da.h"
void
edit_file_to_use(gchar *file, gchar *theme)
{
FILE *fin, *fout;
gchar tmp[4096], buf[4096];
gchar nextline = 0, hastheme = 0;
srand(time(NULL));
g_snprintf(tmp, sizeof(tmp), "/tmp/gtkrc_%i", rand());
fout = fopen(tmp, "w");
if (!fout)
return;
fin = fopen(file, "r");
if (!fin)
{
fprintf(fout, "# -- THEME AUTO-WRITTEN DO NOT EDIT\n");
fprintf(fout, "include \"%s\"\n\n", theme);
cp(tmp, file);
fclose(fout);
return;
}
while (fgets(buf, sizeof(buf), fin))
{
if (!strcmp("# -- THEME AUTO-WRITTEN DO NOT EDIT\n", buf))
hastheme = 1;
}
rewind(fin);
if (!hastheme)
{
fprintf(fout, "# -- THEME AUTO-WRITTEN DO NOT EDIT\n");
fprintf(fout, "include \"%s\"\n\n", theme);
while (fgets(buf, sizeof(buf), fin))
fprintf(fout, "%s", buf);
}
else
{
while (fgets(buf, sizeof(buf), fin))
{
if (!nextline)
fprintf(fout, "%s", buf);
else
{
nextline = 0;
fprintf(fout, "include \"%s\"\n\n", theme);
}
if (!strcmp("# -- THEME AUTO-WRITTEN DO NOT EDIT\n", buf))
nextline = 1;
}
}
fclose(fin);
fclose(fout);
cp(tmp, file);
rm(tmp);
}
void
set_tmp_rc()
{
gchar s[4096], *home;
home = getenv("HOME");
if (!home)
return;
g_snprintf(s, sizeof(s), "%s/.gnome/gtkrc", home);
srand(time(NULL));
g_snprintf(gtkrc_tmp, sizeof(gtkrc_tmp), "/tmp/%i-gtkrc-%i", time(NULL), rand());
cp(s, gtkrc_tmp);
}
void
use_theme(gchar *theme)
{
gchar s[4096], *home;
home = getenv("HOME");
if (!home)
return;
g_snprintf(s, sizeof(s), "%s/.gnome/gtkrc", home);
edit_file_to_use(s, theme);
}
void
test_theme(gchar *theme)
{
edit_file_to_use(gtkrc_tmp, theme);
}
void
free_theme_list(ThemeEntry *list, gint number)
{
gint i;
for(i = 0; i < number; i++)
{
g_free(list[i].name);
g_free(list[i].rc);
g_free(list[i].readme);
g_free(list[i].icon);
}
g_free(list);
}
ThemeEntry *
list_themes(gchar *dir, gint *number)
{
gchar **dir_listing = NULL, tmp[4096];
ThemeEntry *list = NULL;
gint i = 0, j = 0, num = 0;
dir_listing = ls(dir, &num);
for(i = 0; i < num; i++)
{
g_snprintf(tmp, sizeof(tmp), "%s/%s/gtk/gtkrc", dir, dir_listing[i]);
if (isfile(tmp))
{
list = g_realloc(list, sizeof(ThemeEntry) * ++j);
list[j - 1].name = g_strdup(dir_listing[i]);
list[j - 1].rc = g_strdup(tmp);
g_snprintf(tmp, sizeof(tmp), "%s/%s", dir, dir_listing[i]);
list[j - 1].dir = g_strdup(tmp);
g_snprintf(tmp, sizeof(tmp), "%s/%s/README.html", dir, dir_listing[i]);
list[j - 1].readme = g_strdup(tmp);
g_snprintf(tmp, sizeof(tmp), "%s/%s/ICON.png", dir, dir_listing[i]);
list[j - 1].icon = g_strdup(tmp);
}
}
freestrlist(dir_listing, num);
*number = j;
return list;
}
ThemeEntry *
list_system_themes(gint *number)
{
gchar *theme_dir = NULL;
ThemeEntry *list = NULL;
theme_dir = gtk_rc_get_theme_dir();
list = list_themes(theme_dir, number);
g_free(theme_dir);
return list;
}
ThemeEntry *
list_user_themes(gint *number)
{
gchar *home = NULL;
gchar *theme_dir = NULL;
ThemeEntry *list = NULL;
home = getenv("HOME");
if (!home)
return NULL;
if (!isdir(home))
return NULL;
theme_dir = g_malloc(strlen(home) + strlen("/.themes") + 1);
sprintf(theme_dir, "%s%s", home, "/.themes");
list = list_themes(theme_dir, number);
g_free(theme_dir);
return list;
}