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 name
= GetTexturePanelTextureName(panel
->texturePanel
);
499 prop
= GetTexturePanelTexture(panel
->texturePanel
);
501 str
= PLGetDescription(prop
);
506 PLRelease(titem
->prop
);
509 free(titem
->texture
);
510 titem
->texture
= str
;
512 XFreePixmap(WMScreenDisplay(WMWidgetScreen(panel
->texLs
)), titem
->preview
);
513 titem
->preview
= renderTexture(WMWidgetScreen(panel
->texLs
), titem
->prop
,
514 TEXPREV_WIDTH
, TEXPREV_HEIGHT
,
517 WMRedisplayWidget(panel
->texLs
);
523 editTexture(WMWidget
*w
, void *data
)
525 _Panel
*panel
= (_Panel
*)data
;
527 TextureListItem
*titem
;
529 item
= WMGetListItem(panel
->texLs
, WMGetListSelectedItemRow(panel
->texLs
));
530 titem
= (TextureListItem
*)item
->clientData
;
532 SetTexturePanelTexture(panel
->texturePanel
, titem
->title
, titem
->prop
);
534 SetTexturePanelCancelAction(panel
->texturePanel
, cancelNewTexture
, panel
);
535 SetTexturePanelOkAction(panel
->texturePanel
, okEditTexture
, panel
);
537 SetTexturePanelPixmapPath(panel
->texturePanel
,
538 GetObjectForKey("PixmapPath"));
539 ShowTexturePanel(panel
->texturePanel
);
545 newTexture(WMWidget
*w
, void *data
)
547 _Panel
*panel
= (_Panel
*)data
;
549 SetTexturePanelTexture(panel
->texturePanel
, "New Texture", NULL
);
551 SetTexturePanelCancelAction(panel
->texturePanel
, cancelNewTexture
, panel
);
553 SetTexturePanelOkAction(panel
->texturePanel
, okNewTexture
, panel
);
555 SetTexturePanelPixmapPath(panel
->texturePanel
,
556 GetObjectForKey("PixmapPath"));
557 ShowTexturePanel(panel
->texturePanel
);
563 deleteTexture(WMWidget
*w
, void *data
)
565 _Panel
*panel
= (_Panel
*)data
;
567 TextureListItem
*titem
;
571 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
572 row
= WMGetListSelectedItemRow(panel
->texLs
);
573 item
= WMGetListItem(panel
->texLs
, row
);
574 titem
= (TextureListItem
*)item
->clientData
;
576 if (titem
->selectedFor
& (1 << section
)) {
577 TextureListItem
*titem2
;
579 panel
->textureIndex
[section
] = section
;
580 item
= WMGetListItem(panel
->texLs
, section
);
581 titem2
= (TextureListItem
*)item
->clientData
;
582 titem2
->selectedFor
|= 1 << section
;
586 free(titem
->texture
);
587 PLRelease(titem
->prop
);
589 if (remove(titem
->path
) < 0 && errno
!= ENOENT
) {
590 wsyserror("could not remove file %s", titem
->path
);
597 WMRemoveListItem(panel
->texLs
, row
);
598 WMSetButtonEnabled(panel
->delB
, False
);
603 changePage(WMWidget
*w
, void *data
)
605 _Panel
*panel
= (_Panel
*)data
;
608 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
610 WMSelectListItem(panel
->texLs
, panel
->textureIndex
[section
]);
612 WMSetListPosition(panel
->texLs
, panel
->textureIndex
[section
]
613 - WMGetListNumberOfRows(panel
->texLs
)/2);
619 textureClick(WMWidget
*w
, void *data
)
621 _Panel
*panel
= (_Panel
*)data
;
624 TextureListItem
*titem
;
626 i
= WMGetListSelectedItemRow(panel
->texLs
);
628 item
= WMGetListItem(panel
->texLs
, i
);
630 titem
= (TextureListItem
*)item
->clientData
;
632 if (titem
->current
) {
633 WMSetButtonEnabled(panel
->delB
, False
);
635 WMSetButtonEnabled(panel
->delB
, True
);
642 textureDoubleClick(WMWidget
*w
, void *data
)
644 _Panel
*panel
= (_Panel
*)data
;
647 TextureListItem
*titem
;
649 /* unselect old texture */
650 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
652 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[section
]);
653 titem
= (TextureListItem
*)item
->clientData
;
654 titem
->selectedFor
&= ~(1 << section
);
656 /* select new texture */
657 i
= WMGetListSelectedItemRow(panel
->texLs
);
659 item
= WMGetListItem(panel
->texLs
, i
);
661 titem
= (TextureListItem
*)item
->clientData
;
663 titem
->selectedFor
|= 1<<section
;
665 panel
->textureIndex
[section
] = i
;
667 WMRedisplayWidget(panel
->texLs
);
674 paintListItem(WMList
*lPtr
, int index
, Drawable d
, char *text
, int state
,
677 _Panel
*panel
= (_Panel
*)WMGetHangedData(lPtr
);
678 WMScreen
*scr
= WMWidgetScreen(lPtr
);
679 int width
, height
, x
, y
;
680 Display
*dpy
= WMScreenDisplay(scr
);
681 WMColor
*white
= WMWhiteColor(scr
);
683 WMColor
*black
= WMBlackColor(scr
);
684 TextureListItem
*titem
;
686 width
= rect
->size
.width
;
687 height
= rect
->size
.height
;
691 if (state
& WLDSSelected
)
692 XFillRectangle(dpy
, d
, WMColorGC(white
), x
, y
, width
, height
);
694 XClearArea(dpy
, d
, x
, y
, width
, height
, False
);
696 item
= WMGetListItem(lPtr
, index
);
697 titem
= (TextureListItem
*)item
->clientData
;
700 XCopyArea(dpy
, titem
->preview
, d
, WMColorGC(black
), 0, 0, TEXPREV_WIDTH
,
701 TEXPREV_HEIGHT
, x
+ 5, y
+ 5);
703 if ((1 << WMGetPopUpButtonSelectedItem(panel
->secP
)) & titem
->selectedFor
)
704 WMDrawPixmap(panel
->onLed
, d
, x
+ TEXPREV_WIDTH
+ 10, y
+ 6);
705 else if (titem
->selectedFor
)
706 WMDrawPixmap(panel
->offLed
, d
, x
+ TEXPREV_WIDTH
+ 10, y
+ 6);
708 WMDrawString(scr
, d
, WMColorGC(black
), panel
->boldFont
,
709 x
+ TEXPREV_WIDTH
+ 22, y
+ 2, titem
->title
,
710 strlen(titem
->title
));
712 WMDrawString(scr
, d
, WMColorGC(black
), panel
->smallFont
,
713 x
+ TEXPREV_WIDTH
+ 14, y
+ 18, titem
->texture
,
714 strlen(titem
->texture
));
717 WMReleaseColor(white
);
718 WMReleaseColor(black
);
724 loadRImage(WMScreen
*scr
, char *path
)
732 f
= fopen(path
, "r");
736 fscanf(f
, "%02x%02x%1x", &w
, &h
, &d
);
738 image
= RCreateImage(w
, h
, d
== 4);
739 for (i
= 0; i
< d
; i
++) {
740 fread(image
->data
[i
], 1, w
*h
, f
);
744 RConvertImage(WMScreenRContext(scr
), image
, &pixmap
);
745 RDestroyImage(image
);
752 fillTextureList(WMList
*lPtr
)
754 proplist_t textureList
;
756 WMUserDefaults
*udb
= WMGetStandardUserDefaults();
758 TextureListItem
*titem
;
759 WMScreen
*scr
= WMWidgetScreen(lPtr
);
761 textureList
= WMGetUDObjectForKey(udb
, "TextureList");
765 for (i
= 0; i
< PLGetNumberOfElements(textureList
); i
++) {
768 texture
= PLGetArrayElement(textureList
, i
);
770 titem
= wmalloc(sizeof(TextureListItem
));
771 memset(titem
, 0, sizeof(TextureListItem
));
773 titem
->title
= wstrdup(PLGetString(PLGetArrayElement(texture
, 0)));
774 titem
->prop
= PLRetain(PLGetArrayElement(texture
, 1));
775 titem
->texture
= PLGetDescription(titem
->prop
);
776 titem
->selectedFor
= 0;
777 titem
->path
= wstrdup(PLGetString(PLGetArrayElement(texture
, 2)));
779 titem
->preview
= loadRImage(scr
, titem
->path
);
780 if (!titem
->preview
) {
781 titem
->preview
= renderTexture(scr
, titem
->prop
, TEXPREV_WIDTH
,
782 TEXPREV_HEIGHT
, NULL
, False
);
784 item
= WMAddListItem(lPtr
, "");
785 item
->clientData
= titem
;
791 createPanel(Panel
*p
)
793 _Panel
*panel
= (_Panel
*)p
;
796 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
801 panel
->fprefix
= wstrappend(wusergnusteppath(), "/.AppInfo");
803 if (access(panel
->fprefix
, F_OK
)!=0) {
804 if (mkdir(panel
->fprefix
, 0755) < 0) {
805 wsyserror(panel
->fprefix
);
810 tmp
= wstrappend(panel
->fprefix
, "/WPrefs/");
811 free(panel
->fprefix
);
812 panel
->fprefix
= tmp
;
813 if (access(panel
->fprefix
, F_OK
)!=0) {
814 if (mkdir(panel
->fprefix
, 0755) < 0) {
815 wsyserror(panel
->fprefix
);
820 panel
->smallFont
= WMSystemFontOfSize(scr
, 10);
821 panel
->normalFont
= WMSystemFontOfSize(scr
, 12);
822 panel
->boldFont
= WMBoldSystemFontOfSize(scr
, 12);
824 panel
->onLed
= WMCreatePixmapFromXPMData(scr
, blueled_xpm
);
825 panel
->offLed
= WMCreatePixmapFromXPMData(scr
, blueled2_xpm
);
827 panel
->frame
= WMCreateFrame(panel
->win
);
828 WMResizeWidget(panel
->frame
, FRAME_WIDTH
, FRAME_HEIGHT
);
829 WMMoveWidget(panel
->frame
, FRAME_LEFT
, FRAME_TOP
);
832 panel
->prevB
= WMCreateCommandButton(panel
->frame
);
833 WMResizeWidget(panel
->prevB
, 260, 165);
834 WMMoveWidget(panel
->prevB
, 15, 10);
835 WMSetButtonImagePosition(panel
->prevB
, WIPImageOnly
);
837 panel
->secP
= WMCreatePopUpButton(panel
->frame
);
838 WMResizeWidget(panel
->secP
, 260, 20);
839 WMMoveWidget(panel
->secP
, 15, 180);
840 WMSetPopUpButtonSelectedItem(panel
->secP
, 0);
841 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Focused Window"));
842 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Unfocused Windows"));
843 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Focused Window's Owner"));
844 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Menus"));
845 WMAddPopUpButtonItem(panel
->secP
, _("Menu Items"));
846 WMAddPopUpButtonItem(panel
->secP
, _("Icon Background"));
847 /* WMAddPopUpButtonItem(panel->secP, _("Workspace Backgrounds"));
849 WMSetPopUpButtonAction(panel
->secP
, changePage
, panel
);
852 font
= WMBoldSystemFontOfSize(scr
, 12);
854 panel
->texL
= WMCreateLabel(panel
->frame
);
855 WMResizeWidget(panel
->texL
, 225, 18);
856 WMMoveWidget(panel
->texL
, 285, 10);
857 WMSetLabelFont(panel
->texL
, font
);
858 WMSetLabelText(panel
->texL
, _("Textures"));
859 WMSetLabelRelief(panel
->texL
, WRSunken
);
860 WMSetLabelTextAlignment(panel
->texL
, WACenter
);
861 color
= WMDarkGrayColor(scr
);
862 WMSetWidgetBackgroundColor(panel
->texL
, color
);
863 WMReleaseColor(color
);
864 color
= WMWhiteColor(scr
);
865 WMSetLabelTextColor(panel
->texL
, color
);
866 WMReleaseColor(color
);
870 panel
->texLs
= WMCreateList(panel
->frame
);
871 WMResizeWidget(panel
->texLs
, 225, 144);
872 WMMoveWidget(panel
->texLs
, 285, 30);
873 WMSetListUserDrawItemHeight(panel
->texLs
, 35);
874 WMSetListUserDrawProc(panel
->texLs
, paintListItem
);
875 WMHangData(panel
->texLs
, panel
);
876 WMSetListAction(panel
->texLs
, textureClick
, panel
);
877 WMSetListDoubleAction(panel
->texLs
, textureDoubleClick
, panel
);
879 /* command buttons */
881 font
= WMSystemFontOfSize(scr
, 10);
884 panel
->newB
= WMCreateCommandButton(panel
->frame
);
885 WMResizeWidget(panel
->newB
, 56, 48);
886 WMMoveWidget(panel
->newB
, 285, 180);
887 WMSetButtonFont(panel
->newB
, font
);
888 WMSetButtonImagePosition(panel
->newB
, WIPAbove
);
889 WMSetButtonText(panel
->newB
, _("New"));
890 WMSetButtonAction(panel
->newB
, newTexture
, panel
);
891 SetButtonAlphaImage(scr
, panel
->newB
, TNEW_FILE
);
893 panel
->ripB
= WMCreateCommandButton(panel
->frame
);
894 WMResizeWidget(panel
->ripB
, 56, 48);
895 WMMoveWidget(panel
->ripB
, 341, 180);
896 WMSetButtonFont(panel
->ripB
, font
);
897 WMSetButtonImagePosition(panel
->ripB
, WIPAbove
);
898 WMSetButtonText(panel
->ripB
, _("Extract..."));
899 SetButtonAlphaImage(scr
, panel
->ripB
, TEXTR_FILE
);
901 WMSetButtonEnabled(panel
->ripB
, False
);
903 panel
->editB
= WMCreateCommandButton(panel
->frame
);
904 WMResizeWidget(panel
->editB
, 56, 48);
905 WMMoveWidget(panel
->editB
, 397, 180);
906 WMSetButtonFont(panel
->editB
, font
);
907 WMSetButtonImagePosition(panel
->editB
, WIPAbove
);
908 WMSetButtonText(panel
->editB
, _("Edit"));
909 SetButtonAlphaImage(scr
, panel
->editB
, TEDIT_FILE
);
910 WMSetButtonAction(panel
->editB
, editTexture
, panel
);
912 panel
->delB
= WMCreateCommandButton(panel
->frame
);
913 WMResizeWidget(panel
->delB
, 56, 48);
914 WMMoveWidget(panel
->delB
, 453, 180);
915 WMSetButtonFont(panel
->delB
, font
);
916 WMSetButtonImagePosition(panel
->delB
, WIPAbove
);
917 WMSetButtonText(panel
->delB
, _("Delete"));
918 SetButtonAlphaImage(scr
, panel
->delB
, TDEL_FILE
);
919 WMSetButtonEnabled(panel
->delB
, False
);
920 WMSetButtonAction(panel
->delB
, deleteTexture
, panel
);
926 WMRealizeWidget(panel
->frame
);
927 WMMapSubwidgets(panel
->frame
);
929 WMSetPopUpButtonSelectedItem(panel
->secP
, 0);
933 fillTextureList(panel
->texLs
);
935 panel
->texturePanel
= CreateTexturePanel(panel
->win
);
941 setupTextureFor(WMList
*list
, char *key
, char *defValue
, char *title
,
945 TextureListItem
*titem
;
947 titem
= wmalloc(sizeof(TextureListItem
));
948 memset(titem
, 0, sizeof(TextureListItem
));
950 titem
->title
= wstrdup(title
);
951 titem
->prop
= GetObjectForKey(key
);
953 titem
->prop
= PLGetProplistWithDescription(defValue
);
955 PLRetain(titem
->prop
);
957 titem
->texture
= PLGetDescription((proplist_t
)titem
->prop
);
959 titem
->selectedFor
= 1<<index
;
961 titem
->preview
= renderTexture(WMWidgetScreen(list
), titem
->prop
,
962 TEXPREV_WIDTH
, TEXPREV_HEIGHT
, NULL
, False
);
964 item
= WMAddListItem(list
, "");
965 item
->clientData
= titem
;
973 showData(_Panel
*panel
)
977 panel
->ftitleTex
= setupTextureFor(panel
->texLs
, "FTitleBack",
978 "(solid, black)", "[Focused]", i
);
979 panel
->textureIndex
[i
] = i
++;
981 panel
->utitleTex
= setupTextureFor(panel
->texLs
, "UTitleBack",
982 "(solid, gray)", "[Unfocused]", i
);
983 panel
->textureIndex
[i
] = i
++;
985 panel
->ptitleTex
= setupTextureFor(panel
->texLs
, "PTitleBack",
986 "(solid, \"#616161\")",
987 "[Owner of Focused]", i
);
988 panel
->textureIndex
[i
] = i
++;
990 panel
->mtitleTex
= setupTextureFor(panel
->texLs
, "MenuTitleBack",
991 "(solid, black)", "[Menu Title]", i
);
992 panel
->textureIndex
[i
] = i
++;
994 panel
->menuTex
= setupTextureFor(panel
->texLs
, "MenuTextBack",
995 "(solid, gray)", "[Menu Item]", i
);
996 panel
->textureIndex
[i
] = i
++;
998 panel
->iconTex
= setupTextureFor(panel
->texLs
, "IconBack",
999 "(solid, gray)", "[Icon]", i
);
1000 panel
->textureIndex
[i
] = i
++;
1002 panel->backTex = setupTextureFor(panel->texLs, "WorkspaceBack",
1003 "(solid, black)", "[Workspace]", i);
1004 panel->textureIndex[i] = i++;
1011 storeData(_Panel
*panel
)
1013 proplist_t textureList
;
1016 TextureListItem
*titem
;
1018 WMUserDefaults
*udb
= WMGetStandardUserDefaults();
1020 textureList
= PLMakeArrayFromElements(NULL
, NULL
);
1022 /* store list of textures */
1023 for (i
= 6; i
< WMGetListNumberOfRows(panel
->texLs
); i
++) {
1024 item
= WMGetListItem(panel
->texLs
, i
);
1025 titem
= (TextureListItem
*)item
->clientData
;
1027 texture
= PLMakeArrayFromElements(PLMakeString(titem
->title
),
1028 PLRetain(titem
->prop
),
1029 PLMakeString(titem
->path
),
1032 PLAppendArrayElement(textureList
, texture
);
1035 WMSetUDObjectForKey(udb
, textureList
, "TextureList");
1036 PLRelease(textureList
);
1038 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[0]);
1039 titem
= (TextureListItem
*)item
->clientData
;
1040 SetObjectForKey(titem
->prop
, "FTitleBack");
1042 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[1]);
1043 titem
= (TextureListItem
*)item
->clientData
;
1044 SetObjectForKey(titem
->prop
, "UTitleBack");
1046 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[2]);
1047 titem
= (TextureListItem
*)item
->clientData
;
1048 SetObjectForKey(titem
->prop
, "PTitleBack");
1050 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[3]);
1051 titem
= (TextureListItem
*)item
->clientData
;
1052 SetObjectForKey(titem
->prop
, "MenuTitleBack");
1054 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[4]);
1055 titem
= (TextureListItem
*)item
->clientData
;
1056 SetObjectForKey(titem
->prop
, "MenuTextBack");
1058 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[5]);
1059 titem
= (TextureListItem
*)item
->clientData
;
1060 SetObjectForKey(titem
->prop
, "IconBack");
1067 InitAppearance(WMScreen
*scr
, WMWindow
*win
)
1071 panel
= wmalloc(sizeof(_Panel
));
1072 memset(panel
, 0, sizeof(_Panel
));
1074 panel
->sectionName
= _("Appearance Preferences");
1078 panel
->callbacks
.createWidgets
= createPanel
;
1079 panel
->callbacks
.updateDomain
= storeData
;
1081 AddSection(panel
, ICON_FILE
);