1 /* Apperance.c- color/texture for titlebar etc.
3 * WPrefs - Window Maker Preferences Program
5 * Copyright (c) 1999 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,
29 #include "TexturePanel.h"
31 typedef struct _Panel
{
35 CallbackRec callbacks
;
67 TexturePanel
*texturePanel
;
72 /* for preview shit */
99 static void showData(_Panel
*panel
);
102 #define ICON_FILE "appearance"
104 #define TNEW_FILE "tnew"
105 #define TDEL_FILE "tdel"
106 #define TEDIT_FILE "tedit"
107 #define TEXTR_FILE "textr"
112 static char * blueled_xpm
[] = {
142 static char *blueled2_xpm
[] = {
143 /* width height num_colors chars_per_pixel */
176 #define FTITLE (1<<0)
177 #define UTITLE (1<<1)
178 #define OTITLE (1<<2)
179 #define MTITLE (1<<3)
183 #define EVERYTHING 0xff
188 #define TEXPREV_WIDTH 40
189 #define TEXPREV_HEIGHT 24
196 str2rcolor(RContext
*rc
, char *name
, RColor
*color
)
200 XParseColor(rc
->dpy
, rc
->cmap
, name
, &xcolor
);
203 color
->red
= xcolor
.red
>> 8;
204 color
->green
= xcolor
.green
>> 8;
205 color
->blue
= xcolor
.blue
>> 8;
211 dumpRImage(char *path
, RImage
*image
)
215 f
= fopen(path
, "w");
220 fprintf(f
, "%02x%02x%1x", image
->width
, image
->height
,
221 image
->data
[3]!=NULL
? 4 : 3);
223 fwrite(image
->data
[0], 1, image
->width
* image
->height
, f
);
224 fwrite(image
->data
[1], 1, image
->width
* image
->height
, f
);
225 fwrite(image
->data
[2], 1, image
->width
* image
->height
, f
);
227 fwrite(image
->data
[3], 1, image
->width
* image
->height
, f
);
237 renderTexture(WMScreen
*scr
, proplist_t texture
, int width
, int height
,
238 char *path
, Bool bordered
)
243 RContext
*rc
= WMScreenRContext(scr
);
248 type
= PLGetString(PLGetArrayElement(texture
, 0));
250 image
= RCreateImage(width
, height
, False
);
252 if (strcasecmp(type
, "solid")==0) {
254 str
= PLGetString(PLGetArrayElement(texture
, 1));
256 str2rcolor(rc
, str
, &rcolor
);
258 RClearImage(image
, &rcolor
);
259 } else if (strcasecmp(&type
[1], "gradient")==0) {
263 switch (toupper(type
[0])) {
265 style
= RVerticalGradient
;
268 style
= RHorizontalGradient
;
271 style
= RDiagonalGradient
;
275 str
= PLGetString(PLGetArrayElement(texture
, 1));
276 str2rcolor(rc
, str
, &rcolor
);
277 str
= PLGetString(PLGetArrayElement(texture
, 2));
278 str2rcolor(rc
, str
, &rcolor2
);
280 image
= RRenderGradient(width
, height
, &rcolor
, &rcolor2
, style
);
281 } else if (strcasecmp(&type
[2], "gradient")==0) {
286 switch (toupper(type
[1])) {
288 style
= RVerticalGradient
;
291 style
= RHorizontalGradient
;
294 style
= RDiagonalGradient
;
298 j
= PLGetNumberOfElements(texture
);
301 colors
= wmalloc(j
* sizeof(RColor
*));
303 for (i
= 2; i
< j
; i
++) {
304 str
= PLGetString(PLGetArrayElement(texture
, i
));
305 colors
[i
-2] = wmalloc(sizeof(RColor
));
306 str2rcolor(rc
, str
, colors
[i
-2]);
310 image
= RRenderMultiGradient(width
, height
, colors
, style
);
312 for (i
= 0; colors
[i
]!=NULL
; i
++)
316 } else if (strcasecmp(&type
[1], "pixmap")==0) {
322 str
= PLGetString(PLGetArrayElement(texture
, 1));
324 path
= wfindfileinarray(GetObjectForKey("PixmapPath"), str
);
325 timage
= RLoadImage(rc
, path
, 0);
331 if (w
- TEXPREV_WIDTH
> h
- TEXPREV_HEIGHT
) {
332 h
= (w
* TEXPREV_HEIGHT
)/TEXPREV_WIDTH
;
334 w
= (h
* TEXPREV_WIDTH
)/TEXPREV_HEIGHT
;
337 image
= RScaleImage(timage
, w
, h
);
338 RDestroyImage(timage
);
343 dumpRImage(path
, image
);
346 RConvertImage(rc
, image
, &pixmap
);
347 RDestroyImage(image
);
355 updatePreviewBox(_Panel
*panel
, int elements
)
357 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
358 Display
*dpy
= WMScreenDisplay(scr
);
359 /* RContext *rc = WMScreenRContext(scr);*/
363 if (!panel
->preview
) {
364 panel
->preview
= XCreatePixmap(dpy
, WMWidgetXID(panel
->win
),
365 220-4, 185-4, WMScreenDepth(scr
));
370 if (elements
& FTITLE
) {
372 XFreePixmap(dpy
, panel
->ftitle
);
374 panel
->ftitle
= renderTexture(scr
, tmp
, 180, 20, NULL
, True
);
378 /* have to repaint everything to make things simple, eliminating
386 pix
= WMCreatePixmapFromXPixmaps(scr
, panel
->preview
, None
,
387 220-4, 185-4, WMScreenDepth(scr
));
389 WMSetLabelImage(panel
->prevL
, pix
);
390 WMReleasePixmap(pix
);
397 getStrArrayForKey(char *key
)
401 v
= GetObjectForKey(key
);
405 return PLGetDescription(v
);
412 cancelNewTexture(void *data
)
414 _Panel
*panel
= (_Panel
*)data
;
416 HideTexturePanel(panel
->texturePanel
);
421 makeFileName(char *prefix
, char *name
)
426 str
= wstrappend(prefix
, name
);
427 fname
= wstrdup(str
);
430 while (access(fname
, F_OK
)==0) {
434 sprintf(buf
, "%i", i
++);
435 fname
= wstrappend(str
, buf
);
444 okNewTexture(void *data
)
446 _Panel
*panel
= (_Panel
*)data
;
451 TextureListItem
*titem
;
452 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
454 titem
= wmalloc(sizeof(TextureListItem
));
455 memset(titem
, 0, sizeof(TextureListItem
));
457 HideTexturePanel(panel
->texturePanel
);
459 name
= GetTexturePanelTextureName(panel
->texturePanel
);
461 prop
= GetTexturePanelTexture(panel
->texturePanel
);
463 str
= PLGetDescription(prop
);
467 titem
->texture
= str
;
468 titem
->selectedFor
= 0;
470 titem
->path
= makeFileName(panel
->fprefix
, name
);
471 titem
->preview
= renderTexture(scr
, prop
, TEXPREV_WIDTH
, TEXPREV_HEIGHT
,
474 item
= WMAddListItem(panel
->texLs
, "");
475 item
->clientData
= titem
;
477 WMSetListPosition(panel
->texLs
, WMGetListNumberOfRows(panel
->texLs
));
483 okEditTexture(void *data
)
485 _Panel
*panel
= (_Panel
*)data
;
490 TextureListItem
*titem
;
492 item
= WMGetListItem(panel
->texLs
, WMGetListSelectedItemRow(panel
->texLs
));
493 titem
= (TextureListItem
*)item
->clientData
;
495 HideTexturePanel(panel
->texturePanel
);
497 if (titem
->current
) {
498 name
= GetTexturePanelTextureName(panel
->texturePanel
);
504 prop
= GetTexturePanelTexture(panel
->texturePanel
);
506 str
= PLGetDescription(prop
);
508 PLRelease(titem
->prop
);
511 free(titem
->texture
);
512 titem
->texture
= str
;
514 XFreePixmap(WMScreenDisplay(WMWidgetScreen(panel
->texLs
)), titem
->preview
);
515 titem
->preview
= renderTexture(WMWidgetScreen(panel
->texLs
), titem
->prop
,
516 TEXPREV_WIDTH
, TEXPREV_HEIGHT
,
519 WMRedisplayWidget(panel
->texLs
);
525 editTexture(WMWidget
*w
, void *data
)
527 _Panel
*panel
= (_Panel
*)data
;
529 TextureListItem
*titem
;
531 item
= WMGetListItem(panel
->texLs
, WMGetListSelectedItemRow(panel
->texLs
));
532 titem
= (TextureListItem
*)item
->clientData
;
534 SetTexturePanelTexture(panel
->texturePanel
, titem
->title
, titem
->prop
);
536 SetTexturePanelCancelAction(panel
->texturePanel
, cancelNewTexture
, panel
);
537 SetTexturePanelOkAction(panel
->texturePanel
, okEditTexture
, panel
);
539 SetTexturePanelPixmapPath(panel
->texturePanel
,
540 GetObjectForKey("PixmapPath"));
541 ShowTexturePanel(panel
->texturePanel
);
547 newTexture(WMWidget
*w
, void *data
)
549 _Panel
*panel
= (_Panel
*)data
;
551 SetTexturePanelTexture(panel
->texturePanel
, "New Texture", NULL
);
553 SetTexturePanelCancelAction(panel
->texturePanel
, cancelNewTexture
, panel
);
555 SetTexturePanelOkAction(panel
->texturePanel
, okNewTexture
, panel
);
557 SetTexturePanelPixmapPath(panel
->texturePanel
,
558 GetObjectForKey("PixmapPath"));
559 ShowTexturePanel(panel
->texturePanel
);
565 deleteTexture(WMWidget
*w
, void *data
)
567 _Panel
*panel
= (_Panel
*)data
;
569 TextureListItem
*titem
;
573 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
574 row
= WMGetListSelectedItemRow(panel
->texLs
);
575 item
= WMGetListItem(panel
->texLs
, row
);
576 titem
= (TextureListItem
*)item
->clientData
;
578 if (titem
->selectedFor
& (1 << section
)) {
579 TextureListItem
*titem2
;
581 panel
->textureIndex
[section
] = section
;
582 item
= WMGetListItem(panel
->texLs
, section
);
583 titem2
= (TextureListItem
*)item
->clientData
;
584 titem2
->selectedFor
|= 1 << section
;
588 free(titem
->texture
);
589 PLRelease(titem
->prop
);
591 if (remove(titem
->path
) < 0 && errno
!= ENOENT
) {
592 wsyserror("could not remove file %s", titem
->path
);
599 WMRemoveListItem(panel
->texLs
, row
);
600 WMSetButtonEnabled(panel
->delB
, False
);
605 changePage(WMWidget
*w
, void *data
)
607 _Panel
*panel
= (_Panel
*)data
;
610 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
612 WMSelectListItem(panel
->texLs
, panel
->textureIndex
[section
]);
614 WMSetListPosition(panel
->texLs
, panel
->textureIndex
[section
]
615 - WMGetListNumberOfRows(panel
->texLs
)/2);
621 textureClick(WMWidget
*w
, void *data
)
623 _Panel
*panel
= (_Panel
*)data
;
626 TextureListItem
*titem
;
628 i
= WMGetListSelectedItemRow(panel
->texLs
);
630 item
= WMGetListItem(panel
->texLs
, i
);
632 titem
= (TextureListItem
*)item
->clientData
;
634 if (titem
->current
) {
635 WMSetButtonEnabled(panel
->delB
, False
);
637 WMSetButtonEnabled(panel
->delB
, True
);
644 textureDoubleClick(WMWidget
*w
, void *data
)
646 _Panel
*panel
= (_Panel
*)data
;
649 TextureListItem
*titem
;
651 /* unselect old texture */
652 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
654 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[section
]);
655 titem
= (TextureListItem
*)item
->clientData
;
656 titem
->selectedFor
&= ~(1 << section
);
658 /* select new texture */
659 i
= WMGetListSelectedItemRow(panel
->texLs
);
661 item
= WMGetListItem(panel
->texLs
, i
);
663 titem
= (TextureListItem
*)item
->clientData
;
665 titem
->selectedFor
|= 1<<section
;
667 panel
->textureIndex
[section
] = i
;
669 WMRedisplayWidget(panel
->texLs
);
676 paintListItem(WMList
*lPtr
, int index
, Drawable d
, char *text
, int state
,
679 _Panel
*panel
= (_Panel
*)WMGetHangedData(lPtr
);
680 WMScreen
*scr
= WMWidgetScreen(lPtr
);
681 int width
, height
, x
, y
;
682 Display
*dpy
= WMScreenDisplay(scr
);
683 WMColor
*white
= WMWhiteColor(scr
);
685 WMColor
*black
= WMBlackColor(scr
);
686 TextureListItem
*titem
;
688 width
= rect
->size
.width
;
689 height
= rect
->size
.height
;
693 if (state
& WLDSSelected
)
694 XFillRectangle(dpy
, d
, WMColorGC(white
), x
, y
, width
, height
);
696 XClearArea(dpy
, d
, x
, y
, width
, height
, False
);
698 item
= WMGetListItem(lPtr
, index
);
699 titem
= (TextureListItem
*)item
->clientData
;
702 XCopyArea(dpy
, titem
->preview
, d
, WMColorGC(black
), 0, 0, TEXPREV_WIDTH
,
703 TEXPREV_HEIGHT
, x
+ 5, y
+ 5);
705 if ((1 << WMGetPopUpButtonSelectedItem(panel
->secP
)) & titem
->selectedFor
)
706 WMDrawPixmap(panel
->onLed
, d
, x
+ TEXPREV_WIDTH
+ 10, y
+ 6);
707 else if (titem
->selectedFor
)
708 WMDrawPixmap(panel
->offLed
, d
, x
+ TEXPREV_WIDTH
+ 10, y
+ 6);
710 WMDrawString(scr
, d
, WMColorGC(black
), panel
->boldFont
,
711 x
+ TEXPREV_WIDTH
+ 22, y
+ 2, titem
->title
,
712 strlen(titem
->title
));
714 WMDrawString(scr
, d
, WMColorGC(black
), panel
->smallFont
,
715 x
+ TEXPREV_WIDTH
+ 14, y
+ 18, titem
->texture
,
716 strlen(titem
->texture
));
719 WMReleaseColor(white
);
720 WMReleaseColor(black
);
726 loadRImage(WMScreen
*scr
, char *path
)
734 f
= fopen(path
, "r");
738 fscanf(f
, "%02x%02x%1x", &w
, &h
, &d
);
740 image
= RCreateImage(w
, h
, d
== 4);
741 for (i
= 0; i
< d
; i
++) {
742 fread(image
->data
[i
], 1, w
*h
, f
);
746 RConvertImage(WMScreenRContext(scr
), image
, &pixmap
);
747 RDestroyImage(image
);
754 fillTextureList(WMList
*lPtr
)
756 proplist_t textureList
;
758 WMUserDefaults
*udb
= WMGetStandardUserDefaults();
760 TextureListItem
*titem
;
761 WMScreen
*scr
= WMWidgetScreen(lPtr
);
763 textureList
= WMGetUDObjectForKey(udb
, "TextureList");
767 for (i
= 0; i
< PLGetNumberOfElements(textureList
); i
++) {
770 texture
= PLGetArrayElement(textureList
, i
);
772 titem
= wmalloc(sizeof(TextureListItem
));
773 memset(titem
, 0, sizeof(TextureListItem
));
775 titem
->title
= wstrdup(PLGetString(PLGetArrayElement(texture
, 0)));
776 titem
->prop
= PLRetain(PLGetArrayElement(texture
, 1));
777 titem
->texture
= PLGetDescription(titem
->prop
);
778 titem
->selectedFor
= 0;
779 titem
->path
= wstrdup(PLGetString(PLGetArrayElement(texture
, 2)));
782 titem
->preview
= loadRImage(scr
, titem
->path
);
783 if (!titem
->preview
) {
784 titem
->preview
= renderTexture(scr
, titem
->prop
, TEXPREV_WIDTH
,
785 TEXPREV_HEIGHT
, NULL
, False
);
787 item
= WMAddListItem(lPtr
, "");
788 item
->clientData
= titem
;
794 createPanel(Panel
*p
)
796 _Panel
*panel
= (_Panel
*)p
;
799 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
804 panel
->fprefix
= wstrappend(wusergnusteppath(), "/.AppInfo");
806 if (access(panel
->fprefix
, F_OK
)!=0) {
807 if (mkdir(panel
->fprefix
, 0755) < 0) {
808 wsyserror(panel
->fprefix
);
813 tmp
= wstrappend(panel
->fprefix
, "/WPrefs/");
814 free(panel
->fprefix
);
815 panel
->fprefix
= tmp
;
816 if (access(panel
->fprefix
, F_OK
)!=0) {
817 if (mkdir(panel
->fprefix
, 0755) < 0) {
818 wsyserror(panel
->fprefix
);
823 panel
->smallFont
= WMSystemFontOfSize(scr
, 10);
824 panel
->normalFont
= WMSystemFontOfSize(scr
, 12);
825 panel
->boldFont
= WMBoldSystemFontOfSize(scr
, 12);
827 panel
->onLed
= WMCreatePixmapFromXPMData(scr
, blueled_xpm
);
828 panel
->offLed
= WMCreatePixmapFromXPMData(scr
, blueled2_xpm
);
830 panel
->frame
= WMCreateFrame(panel
->win
);
831 WMResizeWidget(panel
->frame
, FRAME_WIDTH
, FRAME_HEIGHT
);
832 WMMoveWidget(panel
->frame
, FRAME_LEFT
, FRAME_TOP
);
835 panel
->prevB
= WMCreateCommandButton(panel
->frame
);
836 WMResizeWidget(panel
->prevB
, 260, 165);
837 WMMoveWidget(panel
->prevB
, 15, 10);
838 WMSetButtonImagePosition(panel
->prevB
, WIPImageOnly
);
840 panel
->secP
= WMCreatePopUpButton(panel
->frame
);
841 WMResizeWidget(panel
->secP
, 260, 20);
842 WMMoveWidget(panel
->secP
, 15, 180);
843 WMSetPopUpButtonSelectedItem(panel
->secP
, 0);
844 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Focused Window"));
845 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Unfocused Windows"));
846 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Focused Window's Owner"));
847 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Menus"));
848 WMAddPopUpButtonItem(panel
->secP
, _("Menu Items"));
849 WMAddPopUpButtonItem(panel
->secP
, _("Icon Background"));
850 /* WMAddPopUpButtonItem(panel->secP, _("Workspace Backgrounds"));
852 WMSetPopUpButtonAction(panel
->secP
, changePage
, panel
);
855 font
= WMBoldSystemFontOfSize(scr
, 12);
857 panel
->texL
= WMCreateLabel(panel
->frame
);
858 WMResizeWidget(panel
->texL
, 225, 18);
859 WMMoveWidget(panel
->texL
, 285, 10);
860 WMSetLabelFont(panel
->texL
, font
);
861 WMSetLabelText(panel
->texL
, _("Textures"));
862 WMSetLabelRelief(panel
->texL
, WRSunken
);
863 WMSetLabelTextAlignment(panel
->texL
, WACenter
);
864 color
= WMDarkGrayColor(scr
);
865 WMSetWidgetBackgroundColor(panel
->texL
, color
);
866 WMReleaseColor(color
);
867 color
= WMWhiteColor(scr
);
868 WMSetLabelTextColor(panel
->texL
, color
);
869 WMReleaseColor(color
);
873 panel
->texLs
= WMCreateList(panel
->frame
);
874 WMResizeWidget(panel
->texLs
, 225, 144);
875 WMMoveWidget(panel
->texLs
, 285, 30);
876 WMSetListUserDrawItemHeight(panel
->texLs
, 35);
877 WMSetListUserDrawProc(panel
->texLs
, paintListItem
);
878 WMHangData(panel
->texLs
, panel
);
879 WMSetListAction(panel
->texLs
, textureClick
, panel
);
880 WMSetListDoubleAction(panel
->texLs
, textureDoubleClick
, panel
);
882 /* command buttons */
884 font
= WMSystemFontOfSize(scr
, 10);
887 panel
->newB
= WMCreateCommandButton(panel
->frame
);
888 WMResizeWidget(panel
->newB
, 56, 48);
889 WMMoveWidget(panel
->newB
, 285, 180);
890 WMSetButtonFont(panel
->newB
, font
);
891 WMSetButtonImagePosition(panel
->newB
, WIPAbove
);
892 WMSetButtonText(panel
->newB
, _("New"));
893 WMSetButtonAction(panel
->newB
, newTexture
, panel
);
894 SetButtonAlphaImage(scr
, panel
->newB
, TNEW_FILE
);
896 panel
->ripB
= WMCreateCommandButton(panel
->frame
);
897 WMResizeWidget(panel
->ripB
, 56, 48);
898 WMMoveWidget(panel
->ripB
, 341, 180);
899 WMSetButtonFont(panel
->ripB
, font
);
900 WMSetButtonImagePosition(panel
->ripB
, WIPAbove
);
901 WMSetButtonText(panel
->ripB
, _("Extract..."));
902 SetButtonAlphaImage(scr
, panel
->ripB
, TEXTR_FILE
);
904 WMSetButtonEnabled(panel
->ripB
, False
);
906 panel
->editB
= WMCreateCommandButton(panel
->frame
);
907 WMResizeWidget(panel
->editB
, 56, 48);
908 WMMoveWidget(panel
->editB
, 397, 180);
909 WMSetButtonFont(panel
->editB
, font
);
910 WMSetButtonImagePosition(panel
->editB
, WIPAbove
);
911 WMSetButtonText(panel
->editB
, _("Edit"));
912 SetButtonAlphaImage(scr
, panel
->editB
, TEDIT_FILE
);
913 WMSetButtonAction(panel
->editB
, editTexture
, panel
);
915 panel
->delB
= WMCreateCommandButton(panel
->frame
);
916 WMResizeWidget(panel
->delB
, 56, 48);
917 WMMoveWidget(panel
->delB
, 453, 180);
918 WMSetButtonFont(panel
->delB
, font
);
919 WMSetButtonImagePosition(panel
->delB
, WIPAbove
);
920 WMSetButtonText(panel
->delB
, _("Delete"));
921 SetButtonAlphaImage(scr
, panel
->delB
, TDEL_FILE
);
922 WMSetButtonEnabled(panel
->delB
, False
);
923 WMSetButtonAction(panel
->delB
, deleteTexture
, panel
);
929 WMRealizeWidget(panel
->frame
);
930 WMMapSubwidgets(panel
->frame
);
932 WMSetPopUpButtonSelectedItem(panel
->secP
, 0);
936 fillTextureList(panel
->texLs
);
938 panel
->texturePanel
= CreateTexturePanel(panel
->win
);
944 setupTextureFor(WMList
*list
, char *key
, char *defValue
, char *title
,
948 TextureListItem
*titem
;
950 titem
= wmalloc(sizeof(TextureListItem
));
951 memset(titem
, 0, sizeof(TextureListItem
));
953 titem
->title
= wstrdup(title
);
954 titem
->prop
= GetObjectForKey(key
);
956 titem
->prop
= PLGetProplistWithDescription(defValue
);
958 PLRetain(titem
->prop
);
960 titem
->texture
= PLGetDescription((proplist_t
)titem
->prop
);
962 titem
->selectedFor
= 1<<index
;
964 titem
->preview
= renderTexture(WMWidgetScreen(list
), titem
->prop
,
965 TEXPREV_WIDTH
, TEXPREV_HEIGHT
, NULL
, False
);
967 item
= WMAddListItem(list
, "");
968 item
->clientData
= titem
;
976 showData(_Panel
*panel
)
980 panel
->ftitleTex
= setupTextureFor(panel
->texLs
, "FTitleBack",
981 "(solid, black)", "[Focused]", i
);
982 panel
->textureIndex
[i
] = i
++;
984 panel
->utitleTex
= setupTextureFor(panel
->texLs
, "UTitleBack",
985 "(solid, gray)", "[Unfocused]", i
);
986 panel
->textureIndex
[i
] = i
++;
988 panel
->ptitleTex
= setupTextureFor(panel
->texLs
, "PTitleBack",
989 "(solid, \"#616161\")",
990 "[Owner of Focused]", i
);
991 panel
->textureIndex
[i
] = i
++;
993 panel
->mtitleTex
= setupTextureFor(panel
->texLs
, "MenuTitleBack",
994 "(solid, black)", "[Menu Title]", i
);
995 panel
->textureIndex
[i
] = i
++;
997 panel
->menuTex
= setupTextureFor(panel
->texLs
, "MenuTextBack",
998 "(solid, gray)", "[Menu Item]", i
);
999 panel
->textureIndex
[i
] = i
++;
1001 panel
->iconTex
= setupTextureFor(panel
->texLs
, "IconBack",
1002 "(solid, gray)", "[Icon]", i
);
1003 panel
->textureIndex
[i
] = i
++;
1005 panel->backTex = setupTextureFor(panel->texLs, "WorkspaceBack",
1006 "(solid, black)", "[Workspace]", i);
1007 panel->textureIndex[i] = i++;
1014 storeData(_Panel
*panel
)
1016 proplist_t textureList
;
1019 TextureListItem
*titem
;
1021 WMUserDefaults
*udb
= WMGetStandardUserDefaults();
1023 textureList
= PLMakeArrayFromElements(NULL
, NULL
);
1025 /* store list of textures */
1026 for (i
= 6; i
< WMGetListNumberOfRows(panel
->texLs
); i
++) {
1027 item
= WMGetListItem(panel
->texLs
, i
);
1028 titem
= (TextureListItem
*)item
->clientData
;
1030 texture
= PLMakeArrayFromElements(PLMakeString(titem
->title
),
1031 PLRetain(titem
->prop
),
1032 PLMakeString(titem
->path
),
1035 PLAppendArrayElement(textureList
, texture
);
1038 WMSetUDObjectForKey(udb
, textureList
, "TextureList");
1039 PLRelease(textureList
);
1041 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[0]);
1042 titem
= (TextureListItem
*)item
->clientData
;
1043 SetObjectForKey(titem
->prop
, "FTitleBack");
1045 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[1]);
1046 titem
= (TextureListItem
*)item
->clientData
;
1047 SetObjectForKey(titem
->prop
, "UTitleBack");
1049 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[2]);
1050 titem
= (TextureListItem
*)item
->clientData
;
1051 SetObjectForKey(titem
->prop
, "PTitleBack");
1053 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[3]);
1054 titem
= (TextureListItem
*)item
->clientData
;
1055 SetObjectForKey(titem
->prop
, "MenuTitleBack");
1057 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[4]);
1058 titem
= (TextureListItem
*)item
->clientData
;
1059 SetObjectForKey(titem
->prop
, "MenuTextBack");
1061 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[5]);
1062 titem
= (TextureListItem
*)item
->clientData
;
1063 SetObjectForKey(titem
->prop
, "IconBack");
1070 InitAppearance(WMScreen
*scr
, WMWindow
*win
)
1074 panel
= wmalloc(sizeof(_Panel
));
1075 memset(panel
, 0, sizeof(_Panel
));
1077 panel
->sectionName
= _("Appearance Preferences");
1081 panel
->callbacks
.createWidgets
= createPanel
;
1082 panel
->callbacks
.updateDomain
= storeData
;
1084 AddSection(panel
, ICON_FILE
);