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,
31 #include "TexturePanel.h"
33 typedef struct _Panel
{
37 CallbackRec callbacks
;
69 TexturePanel
*texturePanel
;
93 static void showData(_Panel
*panel
);
96 static void OpenExtractPanelFor(_Panel
*panel
, char *path
);
98 #define ICON_FILE "appearance"
100 #define TNEW_FILE "tnew"
101 #define TDEL_FILE "tdel"
102 #define TEDIT_FILE "tedit"
103 #define TEXTR_FILE "textr"
108 static char * blueled_xpm
[] = {
138 static char *blueled2_xpm
[] = {
139 /* width height num_colors chars_per_pixel */
172 #define FTITLE (1<<0)
173 #define UTITLE (1<<1)
174 #define OTITLE (1<<2)
175 #define MTITLE (1<<3)
179 #define EVERYTHING 0xff
184 #define TEXPREV_WIDTH 40
185 #define TEXPREV_HEIGHT 24
192 str2rcolor(RContext
*rc
, char *name
, RColor
*color
)
196 XParseColor(rc
->dpy
, rc
->cmap
, name
, &xcolor
);
199 color
->red
= xcolor
.red
>> 8;
200 color
->green
= xcolor
.green
>> 8;
201 color
->blue
= xcolor
.blue
>> 8;
207 dumpRImage(char *path
, RImage
*image
)
211 f
= fopen(path
, "w");
216 fprintf(f
, "%02x%02x%1x", image
->width
, image
->height
,
217 image
->data
[3]!=NULL
? 4 : 3);
219 fwrite(image
->data
[0], 1, image
->width
* image
->height
, f
);
220 fwrite(image
->data
[1], 1, image
->width
* image
->height
, f
);
221 fwrite(image
->data
[2], 1, image
->width
* image
->height
, f
);
223 fwrite(image
->data
[3], 1, image
->width
* image
->height
, f
);
233 renderTexture(WMScreen
*scr
, proplist_t texture
, int width
, int height
,
234 char *path
, int border
)
239 RContext
*rc
= WMScreenRContext(scr
);
244 type
= PLGetString(PLGetArrayElement(texture
, 0));
246 image
= RCreateImage(width
, height
, False
);
248 if (strcasecmp(type
, "solid")==0) {
250 str
= PLGetString(PLGetArrayElement(texture
, 1));
252 str2rcolor(rc
, str
, &rcolor
);
254 RClearImage(image
, &rcolor
);
255 } else if (strcasecmp(&type
[1], "gradient")==0) {
259 switch (toupper(type
[0])) {
261 style
= RVerticalGradient
;
264 style
= RHorizontalGradient
;
267 style
= RDiagonalGradient
;
271 str
= PLGetString(PLGetArrayElement(texture
, 1));
272 str2rcolor(rc
, str
, &rcolor
);
273 str
= PLGetString(PLGetArrayElement(texture
, 2));
274 str2rcolor(rc
, str
, &rcolor2
);
276 image
= RRenderGradient(width
, height
, &rcolor
, &rcolor2
, style
);
277 } else if (strcasecmp(&type
[2], "gradient")==0) {
282 switch (toupper(type
[1])) {
284 style
= RVerticalGradient
;
287 style
= RHorizontalGradient
;
290 style
= RDiagonalGradient
;
294 j
= PLGetNumberOfElements(texture
);
297 colors
= wmalloc(j
* sizeof(RColor
*));
299 for (i
= 2; i
< j
; i
++) {
300 str
= PLGetString(PLGetArrayElement(texture
, i
));
301 colors
[i
-2] = wmalloc(sizeof(RColor
));
302 str2rcolor(rc
, str
, colors
[i
-2]);
306 image
= RRenderMultiGradient(width
, height
, colors
, style
);
308 for (i
= 0; colors
[i
]!=NULL
; i
++)
312 } else if (strcasecmp(&type
[1], "pixmap")==0) {
318 str
= PLGetString(PLGetArrayElement(texture
, 1));
320 path
= wfindfileinarray(GetObjectForKey("PixmapPath"), str
);
321 timage
= RLoadImage(rc
, path
, 0);
324 if (toupper(type
[0]) == 'T') {
325 if (timage
->width
< TEXPREV_WIDTH
326 || timage
->height
< TEXPREV_HEIGHT
) {
327 image
= RMakeTiledImage(timage
, TEXPREV_WIDTH
, TEXPREV_HEIGHT
);
328 RDestroyImage(timage
);
335 if (w
- TEXPREV_WIDTH
> h
- TEXPREV_HEIGHT
) {
336 h
= (w
* TEXPREV_HEIGHT
)/TEXPREV_WIDTH
;
338 w
= (h
* TEXPREV_WIDTH
)/TEXPREV_HEIGHT
;
341 image
= RScaleImage(timage
, w
, h
);
342 RDestroyImage(timage
);
348 dumpRImage(path
, image
);
352 RBevelImage(image
, border
);
355 RConvertImage(rc
, image
, &pixmap
);
356 RDestroyImage(image
);
365 updatePreviewBox(_Panel
*panel
, int elements
)
367 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
368 Display
*dpy
= WMScreenDisplay(scr
);
369 /* RContext *rc = WMScreenRContext(scr);*/
374 gc
= XCreateGC(dpy
, WMWidgetXID(panel
->win
), 0, NULL
);
377 if (!panel
->preview
) {
380 panel
->preview
= XCreatePixmap(dpy
, WMWidgetXID(panel
->win
),
381 220-4, 185-4, WMScreenDepth(scr
));
383 color
= WMGrayColor(scr
);
384 XFillRectangle(dpy
, panel
->preview
, WMColorGC(color
),
386 WMReleaseColor(color
);
391 if (elements
& FTITLE
) {
392 pix
= renderTexture(scr
, panel
->ftitleTex
, 180, 20, NULL
,
395 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 180, 20, 5, 10);
397 XFreePixmap(dpy
, pix
);
399 if (elements
& UTITLE
) {
400 pix
= renderTexture(scr
, panel
->utitleTex
, 180, 20, NULL
,
403 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 180, 20, 10, 35);
405 XFreePixmap(dpy
, pix
);
407 if (elements
& OTITLE
) {
408 pix
= renderTexture(scr
, panel
->ptitleTex
, 180, 20, NULL
,
411 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 180, 20, 15, 60);
413 XFreePixmap(dpy
, pix
);
415 if (elements
& MTITLE
) {
416 pix
= renderTexture(scr
, panel
->mtitleTex
, 100, 20, NULL
,
419 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 100, 20, 20, 95);
421 XFreePixmap(dpy
, pix
);
423 if (elements
& MITEM
) {
424 pix
= renderTexture(scr
, panel
->menuTex
, 100, 18, NULL
,
427 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 100, 20, 20, 115);
428 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 100, 20, 20, 115+18);
429 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 100, 20, 20, 115+36);
431 XFreePixmap(dpy
, pix
);
433 if (elements
& ICON
) {
434 pix
= renderTexture(scr
, panel
->iconTex
, 64, 64, NULL
,
437 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 64, 64, 130, 100);
439 XFreePixmap(dpy
, pix
);
446 pix
= WMCreatePixmapFromXPixmaps(scr
, panel
->preview
, None
,
447 220-4, 185-4, WMScreenDepth(scr
));
449 WMSetLabelImage(panel
->prevL
, pix
);
450 WMReleasePixmap(pix
);
460 cancelNewTexture(void *data
)
462 _Panel
*panel
= (_Panel
*)data
;
464 HideTexturePanel(panel
->texturePanel
);
469 makeFileName(char *prefix
, char *name
)
474 str
= wstrappend(prefix
, name
);
475 fname
= wstrdup(str
);
478 while (access(fname
, F_OK
)==0) {
482 sprintf(buf
, "%i", i
++);
483 fname
= wstrappend(str
, buf
);
492 okNewTexture(void *data
)
494 _Panel
*panel
= (_Panel
*)data
;
499 TextureListItem
*titem
;
500 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
502 titem
= wmalloc(sizeof(TextureListItem
));
503 memset(titem
, 0, sizeof(TextureListItem
));
505 HideTexturePanel(panel
->texturePanel
);
507 name
= GetTexturePanelTextureName(panel
->texturePanel
);
509 prop
= GetTexturePanelTexture(panel
->texturePanel
);
511 str
= PLGetDescription(prop
);
515 titem
->texture
= str
;
516 titem
->selectedFor
= 0;
518 titem
->path
= makeFileName(panel
->fprefix
, name
);
519 titem
->preview
= renderTexture(scr
, prop
, TEXPREV_WIDTH
, TEXPREV_HEIGHT
,
522 item
= WMAddListItem(panel
->texLs
, "");
523 item
->clientData
= titem
;
525 WMSetListPosition(panel
->texLs
, WMGetListNumberOfRows(panel
->texLs
));
531 okEditTexture(void *data
)
533 _Panel
*panel
= (_Panel
*)data
;
538 TextureListItem
*titem
;
540 item
= WMGetListItem(panel
->texLs
, WMGetListSelectedItemRow(panel
->texLs
));
541 titem
= (TextureListItem
*)item
->clientData
;
543 HideTexturePanel(panel
->texturePanel
);
545 if (titem
->current
) {
546 name
= GetTexturePanelTextureName(panel
->texturePanel
);
552 prop
= GetTexturePanelTexture(panel
->texturePanel
);
554 str
= PLGetDescription(prop
);
556 PLRelease(titem
->prop
);
559 free(titem
->texture
);
560 titem
->texture
= str
;
562 XFreePixmap(WMScreenDisplay(WMWidgetScreen(panel
->texLs
)), titem
->preview
);
563 titem
->preview
= renderTexture(WMWidgetScreen(panel
->texLs
), titem
->prop
,
564 TEXPREV_WIDTH
, TEXPREV_HEIGHT
,
567 WMRedisplayWidget(panel
->texLs
);
573 editTexture(WMWidget
*w
, void *data
)
575 _Panel
*panel
= (_Panel
*)data
;
577 TextureListItem
*titem
;
579 item
= WMGetListItem(panel
->texLs
, WMGetListSelectedItemRow(panel
->texLs
));
580 titem
= (TextureListItem
*)item
->clientData
;
582 SetTexturePanelTexture(panel
->texturePanel
, titem
->title
, titem
->prop
);
584 SetTexturePanelCancelAction(panel
->texturePanel
, cancelNewTexture
, panel
);
585 SetTexturePanelOkAction(panel
->texturePanel
, okEditTexture
, panel
);
587 SetTexturePanelPixmapPath(panel
->texturePanel
,
588 GetObjectForKey("PixmapPath"));
589 ShowTexturePanel(panel
->texturePanel
);
595 newTexture(WMWidget
*w
, void *data
)
597 _Panel
*panel
= (_Panel
*)data
;
599 SetTexturePanelTexture(panel
->texturePanel
, "New Texture", NULL
);
601 SetTexturePanelCancelAction(panel
->texturePanel
, cancelNewTexture
, panel
);
603 SetTexturePanelOkAction(panel
->texturePanel
, okNewTexture
, panel
);
605 SetTexturePanelPixmapPath(panel
->texturePanel
,
606 GetObjectForKey("PixmapPath"));
607 ShowTexturePanel(panel
->texturePanel
);
613 deleteTexture(WMWidget
*w
, void *data
)
615 _Panel
*panel
= (_Panel
*)data
;
617 TextureListItem
*titem
;
621 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
622 row
= WMGetListSelectedItemRow(panel
->texLs
);
623 item
= WMGetListItem(panel
->texLs
, row
);
624 titem
= (TextureListItem
*)item
->clientData
;
626 if (titem
->selectedFor
& (1 << section
)) {
627 TextureListItem
*titem2
;
629 panel
->textureIndex
[section
] = section
;
630 item
= WMGetListItem(panel
->texLs
, section
);
631 titem2
= (TextureListItem
*)item
->clientData
;
632 titem2
->selectedFor
|= 1 << section
;
636 free(titem
->texture
);
637 PLRelease(titem
->prop
);
639 if (remove(titem
->path
) < 0 && errno
!= ENOENT
) {
640 wsyserror("could not remove file %s", titem
->path
);
647 WMRemoveListItem(panel
->texLs
, row
);
648 WMSetButtonEnabled(panel
->delB
, False
);
655 extractTexture(WMWidget
*w
, void *data
)
657 _Panel
*panel
= (_Panel
*)data
;
660 WMScreen
*scr
= WMWidgetScreen(w
);
662 opanel
= WMGetOpenPanel(scr
);
663 WMSetFilePanelCanChooseDirectories(opanel
, False
);
664 WMSetFilePanelCanChooseFiles(opanel
, True
);
666 if (WMRunModalFilePanelForDirectory(opanel
, panel
->win
, wgethomedir(),
667 _("Select File"), NULL
)) {
668 path
= WMGetFilePanelFileName(opanel
);
671 OpenExtractPanelFor(panel
, path
);
681 changePage(WMWidget
*w
, void *data
)
683 _Panel
*panel
= (_Panel
*)data
;
686 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
688 WMSelectListItem(panel
->texLs
, panel
->textureIndex
[section
]);
690 WMSetListPosition(panel
->texLs
, panel
->textureIndex
[section
]
691 - WMGetListNumberOfRows(panel
->texLs
)/2);
697 textureClick(WMWidget
*w
, void *data
)
699 _Panel
*panel
= (_Panel
*)data
;
702 TextureListItem
*titem
;
704 i
= WMGetListSelectedItemRow(panel
->texLs
);
706 item
= WMGetListItem(panel
->texLs
, i
);
708 titem
= (TextureListItem
*)item
->clientData
;
710 if (titem
->current
) {
711 WMSetButtonEnabled(panel
->delB
, False
);
713 WMSetButtonEnabled(panel
->delB
, True
);
720 textureDoubleClick(WMWidget
*w
, void *data
)
722 _Panel
*panel
= (_Panel
*)data
;
725 TextureListItem
*titem
;
727 /* unselect old texture */
728 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
730 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[section
]);
731 titem
= (TextureListItem
*)item
->clientData
;
732 titem
->selectedFor
&= ~(1 << section
);
734 /* select new texture */
735 i
= WMGetListSelectedItemRow(panel
->texLs
);
737 item
= WMGetListItem(panel
->texLs
, i
);
739 titem
= (TextureListItem
*)item
->clientData
;
741 titem
->selectedFor
|= 1<<section
;
743 panel
->textureIndex
[section
] = i
;
745 WMRedisplayWidget(panel
->texLs
);
752 paintListItem(WMList
*lPtr
, int index
, Drawable d
, char *text
, int state
,
755 _Panel
*panel
= (_Panel
*)WMGetHangedData(lPtr
);
756 WMScreen
*scr
= WMWidgetScreen(lPtr
);
757 int width
, height
, x
, y
;
758 Display
*dpy
= WMScreenDisplay(scr
);
759 WMColor
*white
= WMWhiteColor(scr
);
761 WMColor
*black
= WMBlackColor(scr
);
762 TextureListItem
*titem
;
764 width
= rect
->size
.width
;
765 height
= rect
->size
.height
;
769 if (state
& WLDSSelected
)
770 XFillRectangle(dpy
, d
, WMColorGC(white
), x
, y
, width
, height
);
772 XClearArea(dpy
, d
, x
, y
, width
, height
, False
);
774 item
= WMGetListItem(lPtr
, index
);
775 titem
= (TextureListItem
*)item
->clientData
;
778 XCopyArea(dpy
, titem
->preview
, d
, WMColorGC(black
), 0, 0, TEXPREV_WIDTH
,
779 TEXPREV_HEIGHT
, x
+ 5, y
+ 5);
781 if ((1 << WMGetPopUpButtonSelectedItem(panel
->secP
)) & titem
->selectedFor
)
782 WMDrawPixmap(panel
->onLed
, d
, x
+ TEXPREV_WIDTH
+ 10, y
+ 6);
783 else if (titem
->selectedFor
)
784 WMDrawPixmap(panel
->offLed
, d
, x
+ TEXPREV_WIDTH
+ 10, y
+ 6);
786 WMDrawString(scr
, d
, WMColorGC(black
), panel
->boldFont
,
787 x
+ TEXPREV_WIDTH
+ 22, y
+ 2, titem
->title
,
788 strlen(titem
->title
));
790 WMDrawString(scr
, d
, WMColorGC(black
), panel
->smallFont
,
791 x
+ TEXPREV_WIDTH
+ 14, y
+ 18, titem
->texture
,
792 strlen(titem
->texture
));
795 WMReleaseColor(white
);
796 WMReleaseColor(black
);
802 loadRImage(WMScreen
*scr
, char *path
)
810 f
= fopen(path
, "r");
814 fscanf(f
, "%02x%02x%1x", &w
, &h
, &d
);
816 image
= RCreateImage(w
, h
, d
== 4);
817 for (i
= 0; i
< d
; i
++) {
818 fread(image
->data
[i
], 1, w
*h
, f
);
822 RConvertImage(WMScreenRContext(scr
), image
, &pixmap
);
823 RDestroyImage(image
);
830 fillTextureList(WMList
*lPtr
)
832 proplist_t textureList
;
834 WMUserDefaults
*udb
= WMGetStandardUserDefaults();
836 TextureListItem
*titem
;
837 WMScreen
*scr
= WMWidgetScreen(lPtr
);
839 textureList
= WMGetUDObjectForKey(udb
, "TextureList");
843 for (i
= 0; i
< PLGetNumberOfElements(textureList
); i
++) {
846 texture
= PLGetArrayElement(textureList
, i
);
848 titem
= wmalloc(sizeof(TextureListItem
));
849 memset(titem
, 0, sizeof(TextureListItem
));
851 titem
->title
= wstrdup(PLGetString(PLGetArrayElement(texture
, 0)));
852 titem
->prop
= PLRetain(PLGetArrayElement(texture
, 1));
853 titem
->texture
= PLGetDescription(titem
->prop
);
854 titem
->selectedFor
= 0;
855 titem
->path
= wstrdup(PLGetString(PLGetArrayElement(texture
, 2)));
858 titem
->preview
= loadRImage(scr
, titem
->path
);
859 if (!titem
->preview
) {
860 titem
->preview
= renderTexture(scr
, titem
->prop
, TEXPREV_WIDTH
,
861 TEXPREV_HEIGHT
, NULL
, 0);
863 item
= WMAddListItem(lPtr
, "");
864 item
->clientData
= titem
;
870 createPanel(Panel
*p
)
872 _Panel
*panel
= (_Panel
*)p
;
875 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
880 panel
->fprefix
= wstrappend(wusergnusteppath(), "/.AppInfo");
882 if (access(panel
->fprefix
, F_OK
)!=0) {
883 if (mkdir(panel
->fprefix
, 0755) < 0) {
884 wsyserror(panel
->fprefix
);
889 tmp
= wstrappend(panel
->fprefix
, "/WPrefs/");
890 free(panel
->fprefix
);
891 panel
->fprefix
= tmp
;
892 if (access(panel
->fprefix
, F_OK
)!=0) {
893 if (mkdir(panel
->fprefix
, 0755) < 0) {
894 wsyserror(panel
->fprefix
);
899 panel
->smallFont
= WMSystemFontOfSize(scr
, 10);
900 panel
->normalFont
= WMSystemFontOfSize(scr
, 12);
901 panel
->boldFont
= WMBoldSystemFontOfSize(scr
, 12);
903 panel
->onLed
= WMCreatePixmapFromXPMData(scr
, blueled_xpm
);
904 panel
->offLed
= WMCreatePixmapFromXPMData(scr
, blueled2_xpm
);
906 panel
->frame
= WMCreateFrame(panel
->win
);
907 WMResizeWidget(panel
->frame
, FRAME_WIDTH
, FRAME_HEIGHT
);
908 WMMoveWidget(panel
->frame
, FRAME_LEFT
, FRAME_TOP
);
911 panel
->prevL
= WMCreateLabel(panel
->frame
);
912 WMResizeWidget(panel
->prevL
, 260, 165);
913 WMMoveWidget(panel
->prevL
, 15, 10);
914 WMSetLabelImagePosition(panel
->prevL
, WIPImageOnly
);
916 panel
->secP
= WMCreatePopUpButton(panel
->frame
);
917 WMResizeWidget(panel
->secP
, 260, 20);
918 WMMoveWidget(panel
->secP
, 15, 180);
919 WMSetPopUpButtonSelectedItem(panel
->secP
, 0);
920 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Focused Window"));
921 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Unfocused Windows"));
922 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Focused Window's Owner"));
923 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Menus"));
924 WMAddPopUpButtonItem(panel
->secP
, _("Menu Items"));
925 WMAddPopUpButtonItem(panel
->secP
, _("Icon Background"));
926 /* WMAddPopUpButtonItem(panel->secP, _("Workspace Backgrounds"));
928 WMSetPopUpButtonAction(panel
->secP
, changePage
, panel
);
931 font
= WMBoldSystemFontOfSize(scr
, 12);
933 panel
->texL
= WMCreateLabel(panel
->frame
);
934 WMResizeWidget(panel
->texL
, 225, 18);
935 WMMoveWidget(panel
->texL
, 285, 10);
936 WMSetLabelFont(panel
->texL
, font
);
937 WMSetLabelText(panel
->texL
, _("Textures"));
938 WMSetLabelRelief(panel
->texL
, WRSunken
);
939 WMSetLabelTextAlignment(panel
->texL
, WACenter
);
940 color
= WMDarkGrayColor(scr
);
941 WMSetWidgetBackgroundColor(panel
->texL
, color
);
942 WMReleaseColor(color
);
943 color
= WMWhiteColor(scr
);
944 WMSetLabelTextColor(panel
->texL
, color
);
945 WMReleaseColor(color
);
949 panel
->texLs
= WMCreateList(panel
->frame
);
950 WMResizeWidget(panel
->texLs
, 225, 144);
951 WMMoveWidget(panel
->texLs
, 285, 30);
952 WMSetListUserDrawItemHeight(panel
->texLs
, 35);
953 WMSetListUserDrawProc(panel
->texLs
, paintListItem
);
954 WMHangData(panel
->texLs
, panel
);
955 WMSetListAction(panel
->texLs
, textureClick
, panel
);
956 WMSetListDoubleAction(panel
->texLs
, textureDoubleClick
, panel
);
958 /* command buttons */
960 font
= WMSystemFontOfSize(scr
, 10);
963 panel
->newB
= WMCreateCommandButton(panel
->frame
);
964 WMResizeWidget(panel
->newB
, 56, 48);
965 WMMoveWidget(panel
->newB
, 285, 180);
966 WMSetButtonFont(panel
->newB
, font
);
967 WMSetButtonImagePosition(panel
->newB
, WIPAbove
);
968 WMSetButtonText(panel
->newB
, _("New"));
969 WMSetButtonAction(panel
->newB
, newTexture
, panel
);
970 SetButtonAlphaImage(scr
, panel
->newB
, TNEW_FILE
);
972 panel
->ripB
= WMCreateCommandButton(panel
->frame
);
973 WMResizeWidget(panel
->ripB
, 56, 48);
974 WMMoveWidget(panel
->ripB
, 341, 180);
975 WMSetButtonFont(panel
->ripB
, font
);
976 WMSetButtonImagePosition(panel
->ripB
, WIPAbove
);
977 WMSetButtonText(panel
->ripB
, _("Extract..."));
978 WMSetButtonAction(panel
->ripB
, extractTexture
, panel
);
979 SetButtonAlphaImage(scr
, panel
->ripB
, TEXTR_FILE
);
981 WMSetButtonEnabled(panel
->ripB
, False
);
983 panel
->editB
= WMCreateCommandButton(panel
->frame
);
984 WMResizeWidget(panel
->editB
, 56, 48);
985 WMMoveWidget(panel
->editB
, 397, 180);
986 WMSetButtonFont(panel
->editB
, font
);
987 WMSetButtonImagePosition(panel
->editB
, WIPAbove
);
988 WMSetButtonText(panel
->editB
, _("Edit"));
989 SetButtonAlphaImage(scr
, panel
->editB
, TEDIT_FILE
);
990 WMSetButtonAction(panel
->editB
, editTexture
, panel
);
992 panel
->delB
= WMCreateCommandButton(panel
->frame
);
993 WMResizeWidget(panel
->delB
, 56, 48);
994 WMMoveWidget(panel
->delB
, 453, 180);
995 WMSetButtonFont(panel
->delB
, font
);
996 WMSetButtonImagePosition(panel
->delB
, WIPAbove
);
997 WMSetButtonText(panel
->delB
, _("Delete"));
998 SetButtonAlphaImage(scr
, panel
->delB
, TDEL_FILE
);
999 WMSetButtonEnabled(panel
->delB
, False
);
1000 WMSetButtonAction(panel
->delB
, deleteTexture
, panel
);
1002 WMReleaseFont(font
);
1006 WMRealizeWidget(panel
->frame
);
1007 WMMapSubwidgets(panel
->frame
);
1009 WMSetPopUpButtonSelectedItem(panel
->secP
, 0);
1013 fillTextureList(panel
->texLs
);
1015 panel
->texturePanel
= CreateTexturePanel(panel
->win
);
1021 setupTextureFor(WMList
*list
, char *key
, char *defValue
, char *title
,
1025 TextureListItem
*titem
;
1027 titem
= wmalloc(sizeof(TextureListItem
));
1028 memset(titem
, 0, sizeof(TextureListItem
));
1030 titem
->title
= wstrdup(title
);
1031 titem
->prop
= GetObjectForKey(key
);
1033 titem
->prop
= PLGetProplistWithDescription(defValue
);
1035 PLRetain(titem
->prop
);
1037 titem
->texture
= PLGetDescription((proplist_t
)titem
->prop
);
1039 titem
->selectedFor
= 1<<index
;
1041 titem
->preview
= renderTexture(WMWidgetScreen(list
), titem
->prop
,
1042 TEXPREV_WIDTH
, TEXPREV_HEIGHT
, NULL
, 0);
1044 item
= WMAddListItem(list
, "");
1045 item
->clientData
= titem
;
1053 showData(_Panel
*panel
)
1057 panel
->ftitleTex
= setupTextureFor(panel
->texLs
, "FTitleBack",
1058 "(solid, black)", "[Focused]", i
);
1059 panel
->textureIndex
[i
] = i
++;
1061 panel
->utitleTex
= setupTextureFor(panel
->texLs
, "UTitleBack",
1062 "(solid, gray)", "[Unfocused]", i
);
1063 panel
->textureIndex
[i
] = i
++;
1065 panel
->ptitleTex
= setupTextureFor(panel
->texLs
, "PTitleBack",
1066 "(solid, \"#616161\")",
1067 "[Owner of Focused]", i
);
1068 panel
->textureIndex
[i
] = i
++;
1070 panel
->mtitleTex
= setupTextureFor(panel
->texLs
, "MenuTitleBack",
1071 "(solid, black)", "[Menu Title]", i
);
1072 panel
->textureIndex
[i
] = i
++;
1074 panel
->menuTex
= setupTextureFor(panel
->texLs
, "MenuTextBack",
1075 "(solid, gray)", "[Menu Item]", i
);
1076 panel
->textureIndex
[i
] = i
++;
1078 panel
->iconTex
= setupTextureFor(panel
->texLs
, "IconBack",
1079 "(solid, gray)", "[Icon]", i
);
1080 panel
->textureIndex
[i
] = i
++;
1082 panel->backTex = setupTextureFor(panel->texLs, "WorkspaceBack",
1083 "(solid, black)", "[Workspace]", i);
1084 panel->textureIndex[i] = i++;
1087 updatePreviewBox(panel
, EVERYTHING
);
1093 storeData(_Panel
*panel
)
1095 proplist_t textureList
;
1098 TextureListItem
*titem
;
1100 WMUserDefaults
*udb
= WMGetStandardUserDefaults();
1102 textureList
= PLMakeArrayFromElements(NULL
, NULL
);
1104 /* store list of textures */
1105 for (i
= 6; i
< WMGetListNumberOfRows(panel
->texLs
); i
++) {
1106 item
= WMGetListItem(panel
->texLs
, i
);
1107 titem
= (TextureListItem
*)item
->clientData
;
1109 texture
= PLMakeArrayFromElements(PLMakeString(titem
->title
),
1110 PLRetain(titem
->prop
),
1111 PLMakeString(titem
->path
),
1114 PLAppendArrayElement(textureList
, texture
);
1117 WMSetUDObjectForKey(udb
, textureList
, "TextureList");
1118 PLRelease(textureList
);
1120 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[0]);
1121 titem
= (TextureListItem
*)item
->clientData
;
1122 SetObjectForKey(titem
->prop
, "FTitleBack");
1124 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[1]);
1125 titem
= (TextureListItem
*)item
->clientData
;
1126 SetObjectForKey(titem
->prop
, "UTitleBack");
1128 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[2]);
1129 titem
= (TextureListItem
*)item
->clientData
;
1130 SetObjectForKey(titem
->prop
, "PTitleBack");
1132 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[3]);
1133 titem
= (TextureListItem
*)item
->clientData
;
1134 SetObjectForKey(titem
->prop
, "MenuTitleBack");
1136 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[4]);
1137 titem
= (TextureListItem
*)item
->clientData
;
1138 SetObjectForKey(titem
->prop
, "MenuTextBack");
1140 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[5]);
1141 titem
= (TextureListItem
*)item
->clientData
;
1142 SetObjectForKey(titem
->prop
, "IconBack");
1149 InitAppearance(WMScreen
*scr
, WMWindow
*win
)
1153 panel
= wmalloc(sizeof(_Panel
));
1154 memset(panel
, 0, sizeof(_Panel
));
1156 panel
->sectionName
= _("Appearance Preferences");
1160 panel
->callbacks
.createWidgets
= createPanel
;
1161 panel
->callbacks
.updateDomain
= storeData
;
1163 AddSection(panel
, ICON_FILE
);
1170 /****************************************************************************/
1174 typedef struct ExtractPanel
{
1187 OpenExtractPanelFor(_Panel
*panel
, char *path
)
1189 ExtractPanel
*epanel
;
1192 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
1194 epanel
= wmalloc(sizeof(ExtractPanel
));
1195 epanel
->win
= WMCreatePanelWithStyleForWindow(panel
->win
, "extract",
1197 |WMClosableWindowMask
);
1198 WMResizeWidget(epanel
->win
, 245, 250);
1199 WMSetWindowTitle(epanel
->win
, _("Extract Texture"));
1201 epanel
->label
= WMCreateLabel(epanel
->win
);
1202 WMResizeWidget(epanel
->label
, 225, 18);
1203 WMMoveWidget(epanel
->label
, 10, 10);
1204 WMSetLabelTextAlignment(epanel
->label
, WACenter
);
1205 WMSetLabelRelief(epanel
->label
, WRSunken
);
1207 color
= WMDarkGrayColor(scr
);
1208 WMSetWidgetBackgroundColor(epanel
->label
, color
);
1209 WMReleaseColor(color
);
1211 color
= WMWhiteColor(scr
);
1212 WMSetLabelTextColor(epanel
->label
, color
);
1213 WMReleaseColor(color
);
1215 font
= WMBoldSystemFontOfSize(scr
, 12);
1216 WMSetLabelFont(epanel
->label
, font
);
1217 WMReleaseFont(font
);
1219 WMSetLabelText(epanel
->label
, _("Textures"));
1221 epanel
->list
= WMCreateList(epanel
->win
);
1222 WMResizeWidget(epanel
->list
, 225, 165);
1223 WMMoveWidget(epanel
->list
, 10, 30);
1227 epanel
->closeB
= WMCreateCommandButton(epanel
->win
);
1228 WMResizeWidget(epanel
->closeB
, 74, 24);
1229 WMMoveWidget(epanel
->closeB
, 165, 215);
1230 WMSetButtonText(epanel
->closeB
, _("Close"));
1232 epanel
->extrB
= WMCreateCommandButton(epanel
->win
);
1233 WMResizeWidget(epanel
->extrB
, 74, 24);
1234 WMMoveWidget(epanel
->extrB
, 80, 215);
1235 WMSetButtonText(epanel
->extrB
, _("Extract"));
1237 WMMapSubwidgets(epanel
->win
);
1240 /* take textures from file */
1244 WMRealizeWidget(epanel
->win
);
1246 WMMapWidget(epanel
->win
);