This patch enables users to set the workspace background (WorkspaceBack) in the
Appearance Preferences section of WPrefs.  It appears as a new item in the
popup menu in the Texture tab, in the list of textures below, and a preview
appears in the background of the preview panel on the left.
---
 WPrefs.app/Appearance.c | 73 +++++++++++++++++++++++++++++++++----------------
 1 file changed, 49 insertions(+), 24 deletions(-)

diff --git a/WPrefs.app/Appearance.c b/WPrefs.app/Appearance.c
index ec71ee4..12ee13c 100644
--- a/WPrefs.app/Appearance.c
+++ b/WPrefs.app/Appearance.c
@@ -108,6 +108,7 @@ typedef struct _Panel {
 
        Pixmap preview;
        Pixmap previewNoText;
+       Pixmap previewBack;
 
        char *fprefix;
 } _Panel;
@@ -303,7 +304,8 @@ static const struct {
        { "ResizebarBack", "(solid, gray)", N_("[Resizebar]") },
        { "MenuTitleBack", "(solid, black)", N_("[Menu Title]") },
        { "MenuTextBack", "(solid, gray)", N_("[Menu Item]") },
-       { "IconBack", "(solid, gray)", N_("[Icon]") }
+       { "IconBack", "(solid, gray)", N_("[Icon]") },
+       { "WorkspaceBack", "(solid, black)", N_("[Background]") }
 };
 
 #define RESIZEBAR_BEVEL        -1
@@ -364,6 +366,7 @@ static WMRect previewPositions[] = {
        {{155, 130}, {64, 64}}
 };
 
+#define PBACKGROUND     7
 #define EVERYTHING     0xff
 
 static WMRect previewColorPositions[] = {
@@ -755,21 +758,32 @@ static void updatePreviewBox(_Panel * panel, int elements)
        gc = XCreateGC(dpy, WMWidgetXID(panel->parent), 0, NULL);
 
        if (panel->preview == None) {
-               WMColor *color;
                WMPixmap *p;
 
                panel->previewNoText = XCreatePixmap(dpy, 
WMWidgetXID(panel->parent),
                                                     240 - 4, 215 - 4, 
WMScreenDepth(scr));
+               panel->previewBack = XCreatePixmap(dpy, 
WMWidgetXID(panel->parent),
+                                                    240 - 4, 215 - 4, 
WMScreenDepth(scr));
 
                p = WMCreatePixmap(scr, 240 - 4, 215 - 4, WMScreenDepth(scr), 
False);
                panel->preview = WMGetPixmapXID(p);
                WMSetLabelImage(panel->prevL, p);
                WMReleasePixmap(p);
+       }
+       if  (elements & (1 << PBACKGROUND)) {
+               Pixmap tmp;
+               TextureListItem *titem;
+               WMListItem *item;
+
+               item = WMGetListItem(panel->texLs,
+                                    panel->textureIndex[PBACKGROUND]);
+               titem = (TextureListItem *) item->clientData;
+               tmp = renderTexture(scr, titem->prop, 240 - 4, 215 - 4, NULL, 
0);
 
-               color = WMCreateRGBColor(scr, 0x5100, 0x5100, 0x7100, True);
-               XFillRectangle(dpy, panel->preview, WMColorGC(color), 0, 0, 240 
- 4, 215 - 4);
-               XFillRectangle(dpy, panel->previewNoText, WMColorGC(color), 0, 
0, 240 - 4, 215 - 4);
-               WMReleaseColor(color);
+               XCopyArea(dpy, tmp, panel->preview, gc, 0, 0, 240 - 4, 215 -4 , 
0, 0);
+               XCopyArea(dpy, tmp, panel->previewNoText, gc, 0, 0, 240 - 4, 
215 -4 , 0, 0);
+               XCopyArea(dpy, tmp, panel->previewBack, gc, 0, 0, 240 - 4, 215 
-4 , 0, 0);
+               XFreePixmap(dpy, tmp);
        }
 
        if (elements & (1 << PFOCUSED)) {
@@ -966,8 +980,12 @@ static void okEditTexture(void *data)
 
        WMRedisplayWidget(panel->texLs);
 
-       if (titem->selectedFor)
-               updatePreviewBox(panel, titem->selectedFor);
+       if (titem->selectedFor) {
+               if (titem->selectedFor & (1 << PBACKGROUND))
+                       updatePreviewBox(panel, EVERYTHING);
+               else
+                       updatePreviewBox(panel, titem->selectedFor);
+       }
 
        changePage(panel->secP, panel);
 }
@@ -1097,12 +1115,14 @@ static void changePage(WMWidget * w, void *data)
                WMSetListPosition(panel->texLs, panel->textureIndex[section] - 
2);
        }
        {
-               WMColor *color;
-
-               color = WMCreateRGBColor(scr, 0x5100, 0x5100, 0x7100, True);
-               XFillRectangle(rc->dpy, panel->preview, WMColorGC(color),
-                              positions[panel->oldsection].x, 
positions[panel->oldsection].y, 22, 22);
-               WMReleaseColor(color);
+               GC gc;
+
+               gc = XCreateGC(rc->dpy, WMWidgetXID(panel->parent), 0, NULL);
+               XCopyArea(rc->dpy, panel->previewBack, panel->preview, gc,
+                         positions[panel->oldsection].x,
+                         positions[panel->oldsection].y, 22, 22 ,
+                         positions[panel->oldsection].x,
+                         positions[panel->oldsection].y);
        }
        if (w) {
                panel->oldsection = section;
@@ -1206,7 +1226,10 @@ static void textureDoubleClick(WMWidget * w, void *data)
 
        WMRedisplayWidget(panel->texLs);
 
-       updatePreviewBox(panel, 1 << section);
+       if (section == PBACKGROUND)
+               updatePreviewBox(panel, EVERYTHING);
+       else
+               updatePreviewBox(panel, 1 << section);
 }
 
 static void paintListItem(WMList * lPtr, int index, Drawable d, char *text, 
int state, WMRect * rect)
@@ -1380,12 +1403,14 @@ static void changeColorPage(WMWidget * w, void *data)
        };
 
        if (panel->preview) {
-               WMColor *color;
-
-               color = WMCreateRGBColor(scr, 0x5100, 0x5100, 0x7100, True);
-               XFillRectangle(rc->dpy, panel->preview, WMColorGC(color),
-                              positions[panel->oldcsection].x, 
positions[panel->oldcsection].y, 22, 22);
-               WMReleaseColor(color);
+               GC gc;
+
+               gc = XCreateGC(rc->dpy, WMWidgetXID(panel->parent), 0, NULL);
+               XCopyArea(rc->dpy, panel->previewBack, panel->preview, gc,
+                         positions[panel->oldcsection].x,
+                         positions[panel->oldcsection].y, 22, 22 ,
+                         positions[panel->oldcsection].x,
+                         positions[panel->oldcsection].y);
        }
        if (w) {
                section = WMGetPopUpButtonSelectedItem(panel->colP);
@@ -1668,8 +1693,8 @@ static void createPanel(Panel * p)
        WMAddPopUpButtonItem(panel->secP, _("Titlebar of Menus"));
        WMAddPopUpButtonItem(panel->secP, _("Menu Items"));
        WMAddPopUpButtonItem(panel->secP, _("Icon Background"));
-       /*    WMAddPopUpButtonItem(panel->secP, _("Workspace Backgrounds"));
-        */
+       WMAddPopUpButtonItem(panel->secP, _("Workspace Background"));
+
        WMSetPopUpButtonSelectedItem(panel->secP, 0);
        WMSetPopUpButtonAction(panel->secP, changePage, panel);
 
@@ -2044,7 +2069,7 @@ static void prepareForClose(_Panel * panel)
        textureList = WMCreatePLArray(NULL, NULL);
 
        /* store list of textures */
-       for (i = 7; i < WMGetListNumberOfRows(panel->texLs); i++) {
+       for (i = 8; i < WMGetListNumberOfRows(panel->texLs); i++) {
                item = WMGetListItem(panel->texLs, i);
                titem = (TextureListItem *) item->clientData;
 
-- 
1.9.1


-- 
To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.

Reply via email to