- Fixed crashing bug in menu.c
[wmaker-crm.git] / WPrefs.app / Themes.c
blob8c325f17ef6bb364223122be58a7b9669c091b81
1 /* Themes.c- Theme stuff
2 *
3 * WPrefs - Window Maker Preferences Program
4 *
5 * Copyright (c) 1998-2003 Alfredo K. Kojima
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20 * USA.
24 #include "WPrefs.h"
26 #include <unistd.h>
28 typedef struct _Panel {
29 WMBox *box;
31 char *sectionName;
33 CallbackRec callbacks;
35 WMWidget *parent;
37 WMButton *saveB;
38 WMList *list;
39 WMButton *loadB;
40 WMButton *instB;
42 WMFrame *totF;
43 WMButton *totB;
44 WMLabel *totL;
46 WMFrame *botF;
47 WMButton *botB;
48 WMLabel *botL;
50 pid_t tilePID;
51 pid_t barPID;
52 } _Panel;
56 #define ICON_FILE "theme"
59 static void
60 showData(_Panel *panel)
66 static void
67 finishedTileDownload(void *data)
69 _Panel *panel = (_Panel*)data;
71 WMSetButtonText(panel->totB, _("Set"));
72 panel->tilePID = 0;
77 static void
78 finishedBarDownload(void *data)
80 _Panel *panel = (_Panel*)data;
82 WMSetButtonText(panel->botB, _("Set"));
83 panel->barPID = 0;
87 static pid_t
88 downloadFile(WMScreen *scr, _Panel *panel, char *file)
90 pid_t pid;
92 pid = fork();
93 if (pid < 0) {
94 wsyserror("could not fork() process");
96 WMRunAlertPanel(scr, GetWindow(panel), _("Error"),
97 "Could not start download. fork() failed",
98 _("OK"), NULL, NULL);
99 return -1;
101 if (pid != 0) {
102 return pid;
105 close(ConnectionNumber(WMScreenDisplay(scr)));
109 exit(1);
113 static void
114 downloadCallback(WMWidget *w, void *data)
116 _Panel *panel = (_Panel*)data;
117 pid_t newPid;
118 WMButton *button = (WMButton*)w;
119 pid_t *pid;
121 if (button == panel->totB) {
122 pid = &panel->tilePID;
123 } else {
124 pid = &panel->barPID;
127 if (*pid == 0) {
128 newPid = downloadFile(WMWidgetScreen(w), panel, NULL);
129 if (newPid < 0) {
130 return;
132 WMSetButtonText(button, _("Stop"));
134 if (button == panel->totB) {
135 AddDeadChildHandler(newPid, finishedTileDownload, data);
136 } else {
137 AddDeadChildHandler(newPid, finishedBarDownload, data);
139 *pid = newPid;
140 } else {
141 *pid = 0;
143 WMSetButtonText(button, _("Download"));
149 static void
150 updateThemeList(_Panel *panel)
152 WMClearList(panel->list);
160 static void
161 createPanel(Panel *p)
163 _Panel *panel = (_Panel*)p;
165 panel->box = WMCreateBox(panel->parent);
166 WMSetViewExpandsToParent(WMWidgetView(panel->box), 2, 2, 2, 2);
168 panel->saveB = WMCreateCommandButton(panel->box);
169 WMResizeWidget(panel->saveB, 154, 24);
170 WMMoveWidget(panel->saveB, 15, 10);
171 WMSetButtonText(panel->saveB, _("Save Current Theme"));
173 panel->list = WMCreateList(panel->box);
174 WMResizeWidget(panel->list, 154, 150);
175 WMMoveWidget(panel->list, 15, 40);
177 panel->loadB = WMCreateCommandButton(panel->box);
178 WMResizeWidget(panel->loadB, 74, 24);
179 WMMoveWidget(panel->loadB, 15, 200);
180 WMSetButtonText(panel->loadB, _("Load"));
182 panel->instB = WMCreateCommandButton(panel->box);
183 WMResizeWidget(panel->instB, 74, 24);
184 WMMoveWidget(panel->instB, 95, 200);
185 WMSetButtonText(panel->instB, _("Install"));
188 /**************** Tile of the day ****************/
190 panel->totF = WMCreateFrame(panel->box);
191 WMResizeWidget(panel->totF, 210, 105);
192 WMMoveWidget(panel->totF, 240, 10);
193 WMSetFrameTitle(panel->totF, _("Tile of The Day"));
195 panel->totL = WMCreateLabel(panel->totF);
196 WMResizeWidget(panel->totL, 67, 67);
197 WMMoveWidget(panel->totL, 25, 25);
198 WMSetLabelRelief(panel->totL, WRSunken);
200 panel->totB = WMCreateCommandButton(panel->totF);
201 WMResizeWidget(panel->totB, 86, 24);
202 WMMoveWidget(panel->totB, 105, 45);
203 WMSetButtonText(panel->totB, _("Download"));
204 WMSetButtonAction(panel->totB, downloadCallback, panel);
206 WMMapSubwidgets(panel->totF);
208 /**************** Bar of the day ****************/
210 panel->botF = WMCreateFrame(panel->box);
211 WMResizeWidget(panel->botF, 315, 95);
212 WMMoveWidget(panel->botF, 190, 125);
213 WMSetFrameTitle(panel->botF, _("Bar of The Day"));
215 panel->botL = WMCreateLabel(panel->botF);
216 WMResizeWidget(panel->botL, 285, 32);
217 WMMoveWidget(panel->botL, 15, 20);
218 WMSetLabelRelief(panel->botL, WRSunken);
220 panel->botB = WMCreateCommandButton(panel->botF);
221 WMResizeWidget(panel->botB, 86, 24);
222 WMMoveWidget(panel->botB, 110, 60);
223 WMSetButtonText(panel->botB, _("Download"));
224 WMSetButtonAction(panel->botB, downloadCallback, panel);
226 WMMapSubwidgets(panel->botF);
228 WMRealizeWidget(panel->box);
229 WMMapSubwidgets(panel->box);
231 showData(panel);
235 static void
236 storeData(_Panel *panel)
242 Panel*
243 InitThemes(WMScreen *scr, WMWidget *parent)
245 _Panel *panel;
247 panel = wmalloc(sizeof(_Panel));
248 memset(panel, 0, sizeof(_Panel));
250 panel->sectionName = _("Themes");
252 panel->parent = parent;
254 panel->callbacks.createWidgets = createPanel;
255 panel->callbacks.updateDomain = storeData;
257 AddSection(panel, ICON_FILE);
259 return panel;