12 static gzFile gzf = NULL;
14 #define gtk_msg(type, args...) \
17 msgw = gtk_message_dialog_new(GTK_WINDOW(mainwin), \
18 GTK_DIALOG_DESTROY_WITH_PARENT | \
23 gtk_dialog_run(GTK_DIALOG(msgw)); \
24 gtk_widget_destroy(msgw); \
27 static int gzopen_frontend(const char *path, int oflags, int mode);
28 static int gzclose_frontend(int nothing);
29 static ssize_t gzread_frontend(int nothing, void *buf, size_t s);
30 static ssize_t gzwrite_frontend(int nothing, const void *buf, size_t s);
31 static gchar *get_theme_dir();
34 (openfunc_t) gzopen_frontend,
35 (closefunc_t) gzclose_frontend,
36 (readfunc_t) gzread_frontend,
37 (writefunc_t) gzwrite_frontend
40 static gchar *get_theme_dir()
45 dir = g_build_path(G_DIR_SEPARATOR_S, g_get_home_dir(), ".themes", NULL);
47 if (r == -1 && errno != EEXIST) {
48 gtk_msg(GTK_MESSAGE_ERROR,
49 _("Unable to create directory \"%s\": %s"),
50 dir, strerror(errno));
58 gboolean install_theme(char *path, char *theme)
66 if (!(dest = get_theme_dir()))
69 curdir = g_get_current_dir();
70 if (chdir(dest) == -1) {
71 gtk_msg(GTK_MESSAGE_ERROR,
72 _("Unable to move to directory \"%s\": %s"),
73 dest, strerror(errno));
78 if (tar_open(&t, path, &funcs, 0, O_RDONLY, TAR_GNU) == -1) {
79 gtk_msg(GTK_MESSAGE_ERROR,
80 _("Unable to open the file \"%s\": %s"),
81 path, strerror(errno));
87 glob = g_strdup_printf("%s/openbox-3/*", theme);
88 r = tar_extract_glob(t, glob, dest);
93 gtk_msg(GTK_MESSAGE_ERROR,
94 _("Unable to extract the file \"%s\".\nIt does not appear to be a valid Openbox theme archive (in tar.gz format)."),
95 path, strerror(errno));
103 gtk_msg(GTK_MESSAGE_INFO, _("%s was installed to %s"), theme, dest);
113 static int gzopen_frontend(const char *path, int oflags, int mode)
117 if ((fd = open(path, oflags, mode)) < 0) return -1;
118 if (!(gzf = gzdopen(fd, "rb"))) return -1;
122 static int gzclose_frontend(int nothing)
124 g_return_val_if_fail(gzf != NULL, 0);
128 static ssize_t gzread_frontend(int nothing, void *buf, size_t s)
130 return gzread(gzf, buf, s);
133 static ssize_t gzwrite_frontend(int nothing, const void *buf, size_t s)
135 return gzwrite(gzf, buf, s);