1 /* Paths.c- pixmap/icon paths
3 * WPrefs - Window Maker Preferences Program
5 * Copyright (c) 1998 Alfredo K. Kojima
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,
27 typedef struct _Panel
{
33 CallbackRec callbacks
;
57 #define ICON_FILE "paths"
61 addPathToList(WMList
*list
, int index
, char *path
)
63 char *fpath
= wexpandpath(path
);
66 item
= WMInsertListItem(list
, index
, path
);
68 if (access(fpath
, X_OK
)!=0) {
76 showData(_Panel
*panel
)
78 proplist_t array
, val
;
81 array
= GetObjectForKey("IconPath");
82 if (!array
|| !PLIsArray(array
)) {
84 wwarning(_("bad value in option IconPath. Using default path list"));
85 addPathToList(panel
->icoL
, -1, "~/pixmaps");
86 addPathToList(panel
->icoL
, -1, "~/GNUstep/Library/Icons");
87 addPathToList(panel
->icoL
, -1, "/usr/include/X11/pixmaps");
88 addPathToList(panel
->icoL
, -1, "/usr/local/share/WindowMaker/Icons");
89 addPathToList(panel
->icoL
, -1, "/usr/local/share/WindowMaker/Pixmaps");
90 addPathToList(panel
->icoL
, -1, "/usr/share/WindowMaker/Icons");
92 for (i
=0; i
<PLGetNumberOfElements(array
); i
++) {
93 val
= PLGetArrayElement(array
, i
);
94 addPathToList(panel
->icoL
, -1, PLGetString(val
));
98 array
= GetObjectForKey("PixmapPath");
99 if (!array
|| !PLIsArray(array
)) {
101 wwarning(_("bad value in option PixmapPath. Using default path list"));
102 addPathToList(panel
->pixL
, -1, "~/pixmaps");
103 addPathToList(panel
->pixL
, -1, "~/GNUstep/Library/WindowMaker/Pixmaps");
104 addPathToList(panel
->pixL
, -1, "/usr/local/share/WindowMaker/Pixmaps");
106 for (i
=0; i
<PLGetNumberOfElements(array
); i
++) {
107 val
= PLGetArrayElement(array
, i
);
108 addPathToList(panel
->pixL
, -1, PLGetString(val
));
115 pushButton(WMWidget
*w
, void *data
)
117 _Panel
*panel
= (_Panel
*)data
;
121 if (w
== panel
->icoaB
) {
122 char *text
= WMGetTextFieldText(panel
->icoT
);
124 if (text
&& strlen(text
) > 0) {
125 i
= WMGetListSelectedItemRow(panel
->icoL
);
127 addPathToList(panel
->icoL
, i
, text
);
128 WMSetListBottomPosition(panel
->icoL
,
129 WMGetListNumberOfRows(panel
->icoL
));
134 WMSetTextFieldText(panel
->icoT
, NULL
);
135 } else if (w
== panel
->icorB
) {
136 i
= WMGetListSelectedItemRow(panel
->icoL
);
139 WMRemoveListItem(panel
->icoL
, i
);
143 if (w
== panel
->pixaB
) {
144 char *text
= WMGetTextFieldText(panel
->pixT
);
146 if (text
&& strlen(text
) > 0) {
147 i
= WMGetListSelectedItemRow(panel
->pixL
);
149 addPathToList(panel
->pixL
, i
, text
);
150 WMSetListBottomPosition(panel
->pixL
,
151 WMGetListNumberOfRows(panel
->pixL
));
155 WMSetTextFieldText(panel
->pixT
, NULL
);
156 } else if (w
== panel
->pixrB
) {
157 i
= WMGetListSelectedItemRow(panel
->pixL
);
160 WMRemoveListItem(panel
->pixL
, i
);
166 textEditedObserver(void *observerData
, WMNotification
*notification
)
168 _Panel
*panel
= (_Panel
*)observerData
;
170 switch ((int)WMGetNotificationClientData(notification
)) {
171 case WMReturnTextMovement
:
172 if (WMGetNotificationObject(notification
) == panel
->icoT
)
173 WMPerformButtonClick(panel
->icoaB
);
175 WMPerformButtonClick(panel
->pixaB
);
178 case WMIllegalTextMovement
:
179 if (WMGetNotificationObject(notification
) == panel
->icoT
) {
180 WMSetButtonImage(panel
->icoaB
, NULL
);
181 WMSetButtonImage(panel
->icoaB
, NULL
);
183 WMSetButtonImage(panel
->pixaB
, NULL
);
184 WMSetButtonImage(panel
->pixaB
, NULL
);
192 textBeginObserver(void *observerData
, WMNotification
*notification
)
194 _Panel
*panel
= (_Panel
*)observerData
;
195 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
196 WMPixmap
*arrow1
= WMGetSystemPixmap(scr
, WSIReturnArrow
);
197 WMPixmap
*arrow2
= WMGetSystemPixmap(scr
, WSIHighlightedReturnArrow
);
199 if (WMGetNotificationObject(notification
)==panel
->icoT
) {
200 WMSetButtonImage(panel
->icoaB
, arrow1
);
201 WMSetButtonAltImage(panel
->icoaB
, arrow2
);
203 WMSetButtonImage(panel
->pixaB
, arrow1
);
204 WMSetButtonAltImage(panel
->pixaB
, arrow2
);
211 listClick(WMWidget
*w
, void *data
)
213 _Panel
*panel
= (_Panel
*)data
;
216 if (w
== panel
->icoL
) {
217 t
= WMGetListSelectedItem(panel
->icoL
)->text
;
218 WMSetTextFieldText(panel
->icoT
, t
);
220 t
= WMGetListSelectedItem(panel
->pixL
)->text
;
221 WMSetTextFieldText(panel
->pixT
, t
);
228 paintItem(WMList
*lPtr
, int index
, Drawable d
, char *text
, int state
,
231 int width
, height
, x
, y
;
232 _Panel
*panel
= (_Panel
*)WMGetHangedData(lPtr
);
233 WMScreen
*scr
= WMWidgetScreen(lPtr
);
234 Display
*dpy
= WMScreenDisplay(scr
);
236 width
= rect
->size
.width
;
237 height
= rect
->size
.height
;
241 if (state
& WLDSSelected
)
242 XFillRectangle(dpy
, d
, WMColorGC(panel
->white
), x
, y
, width
,
245 XClearArea(dpy
, d
, x
, y
, width
, height
, False
);
248 WMDrawString(scr
, d
, WMColorGC(panel
->red
), panel
->font
, x
+4, y
,
251 WMDrawString(scr
, d
, WMColorGC(panel
->black
), panel
->font
, x
+4, y
,
259 storeData(_Panel
*panel
)
266 list
= PLMakeArrayFromElements(NULL
, NULL
);
267 for (i
=0; i
<WMGetListNumberOfRows(panel
->icoL
); i
++) {
268 p
= WMGetListItem(panel
->icoL
, i
)->text
;
269 tmp
= PLMakeString(p
);
270 PLAppendArrayElement(list
, tmp
);
272 SetObjectForKey(list
, "IconPath");
274 list
= PLMakeArrayFromElements(NULL
, NULL
);
275 for (i
=0; i
<WMGetListNumberOfRows(panel
->pixL
); i
++) {
276 p
= WMGetListItem(panel
->pixL
, i
)->text
;
277 tmp
= PLMakeString(p
);
278 PLAppendArrayElement(list
, tmp
);
280 SetObjectForKey(list
, "PixmapPath");
286 createPanel(Panel
*p
)
288 _Panel
*panel
= (_Panel
*)p
;
289 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
291 panel
->white
= WMWhiteColor(scr
);
292 panel
->black
= WMBlackColor(scr
);
293 panel
->red
= WMCreateRGBColor(scr
, 0xffff, 0, 0, True
);
294 panel
->font
= WMSystemFontOfSize(scr
, 12);
296 panel
->frame
= WMCreateFrame(panel
->win
);
297 WMResizeWidget(panel
->frame
, FRAME_WIDTH
, FRAME_HEIGHT
);
298 WMMoveWidget(panel
->frame
, FRAME_LEFT
, FRAME_TOP
);
301 panel
->icoF
= WMCreateFrame(panel
->frame
);
302 WMResizeWidget(panel
->icoF
, 230, 210);
303 WMMoveWidget(panel
->icoF
, 25, 10);
304 WMSetFrameTitle(panel
->icoF
, _("Icon Search Paths"));
306 panel
->icoL
= WMCreateList(panel
->icoF
);
307 WMResizeWidget(panel
->icoL
, 200, 120);
308 WMMoveWidget(panel
->icoL
, 15, 20);
309 WMSetListAction(panel
->icoL
, listClick
, panel
);
310 WMSetListUserDrawProc(panel
->icoL
, paintItem
);
311 WMHangData(panel
->icoL
, panel
);
313 panel
->icoaB
= WMCreateCommandButton(panel
->icoF
);
314 WMResizeWidget(panel
->icoaB
, 90, 24);
315 WMMoveWidget(panel
->icoaB
, 125, 145);
316 WMSetButtonText(panel
->icoaB
, _("Add"));
317 WMSetButtonAction(panel
->icoaB
, pushButton
, panel
);
318 WMSetButtonImagePosition(panel
->icoaB
, WIPRight
);
320 panel
->icorB
= WMCreateCommandButton(panel
->icoF
);
321 WMResizeWidget(panel
->icorB
, 90, 24);
322 WMMoveWidget(panel
->icorB
, 15, 145);
323 WMSetButtonText(panel
->icorB
, _("Remove"));
324 WMSetButtonAction(panel
->icorB
, pushButton
, panel
);
326 panel
->icoT
= WMCreateTextField(panel
->icoF
);
327 WMResizeWidget(panel
->icoT
, 200, 20);
328 WMMoveWidget(panel
->icoT
, 15, 175);
329 WMAddNotificationObserver(textEditedObserver
, panel
,
330 WMTextDidEndEditingNotification
, panel
->icoT
);
331 WMAddNotificationObserver(textBeginObserver
, panel
,
332 WMTextDidBeginEditingNotification
, panel
->icoT
);
334 WMMapSubwidgets(panel
->icoF
);
337 panel
->pixF
= WMCreateFrame(panel
->frame
);
338 WMResizeWidget(panel
->pixF
, 230, 210);
339 WMMoveWidget(panel
->pixF
, 270, 10);
340 WMSetFrameTitle(panel
->pixF
, _("Pixmap Search Paths"));
342 panel
->pixL
= WMCreateList(panel
->pixF
);
343 WMResizeWidget(panel
->pixL
, 200, 120);
344 WMMoveWidget(panel
->pixL
, 15, 20);
345 WMSetListAction(panel
->pixL
, listClick
, panel
);
346 WMSetListUserDrawProc(panel
->pixL
, paintItem
);
347 WMHangData(panel
->pixL
, panel
);
349 panel
->pixaB
= WMCreateCommandButton(panel
->pixF
);
350 WMResizeWidget(panel
->pixaB
, 90, 24);
351 WMMoveWidget(panel
->pixaB
, 125, 145);
352 WMSetButtonText(panel
->pixaB
, _("Add"));
353 WMSetButtonAction(panel
->pixaB
, pushButton
, panel
);
354 WMSetButtonImagePosition(panel
->pixaB
, WIPRight
);
356 panel
->pixrB
= WMCreateCommandButton(panel
->pixF
);
357 WMResizeWidget(panel
->pixrB
, 90, 24);
358 WMMoveWidget(panel
->pixrB
, 15, 145);
359 WMSetButtonText(panel
->pixrB
, _("Remove"));
360 WMSetButtonAction(panel
->pixrB
, pushButton
, panel
);
362 panel
->pixT
= WMCreateTextField(panel
->pixF
);
363 WMResizeWidget(panel
->pixT
, 200, 20);
364 WMMoveWidget(panel
->pixT
, 15, 175);
365 WMAddNotificationObserver(textEditedObserver
, panel
,
366 WMTextDidEndEditingNotification
, panel
->pixT
);
367 WMAddNotificationObserver(textBeginObserver
, panel
,
368 WMTextDidBeginEditingNotification
, panel
->pixT
);
370 WMSetTextFieldNextTextField(panel
->pixT
, panel
->icoT
);
371 WMSetTextFieldPrevTextField(panel
->pixT
, panel
->icoT
);
373 WMMapSubwidgets(panel
->pixF
);
375 WMRealizeWidget(panel
->frame
);
376 WMMapSubwidgets(panel
->frame
);
384 InitPaths(WMScreen
*scr
, WMWindow
*win
)
388 panel
= wmalloc(sizeof(_Panel
));
389 memset(panel
, 0, sizeof(_Panel
));
391 panel
->sectionName
= _("Search Path Configuration");
393 panel
->description
= _("Search paths to use when looking for pixmaps\n"
398 panel
->callbacks
.createWidgets
= createPanel
;
399 panel
->callbacks
.updateDomain
= storeData
;
401 AddSection(panel
, ICON_FILE
);