I think this completes the effort for WMLabel and WMButton. Let me know if you 
see any issues. Onto the next
From c705428c64bd1b154900cd5dcddee924bab11fe5 Mon Sep 17 00:00:00 2001
From: Johann Haarhoff <joh...@haarhoff.org.za>
Date: Tue, 20 Apr 2010 23:45:26 +0200
Subject: [PATCH] Radio and Check buttons now work

Added support for Radio Buttons and Check Boxes. This pretty much
completes the effort on the buttons, except for maybe a slight text
alignment problem in the vertical direction
---
 WINGs/WINGs/WINGs.h |    2 +-
 WINGs/newtheme.c    |   19 +++++++++++-
 WINGs/wbutton.c     |   22 +++++++++------
 WINGs/wcolor.c      |   24 ++++++++++------
 WINGs/widgets.c     |   74 ++++++++++++++++++++++++++++++--------------------
 WINGs/wmisc.c       |   23 ++++++++-------
 WINGs/wview.c       |   35 ++++++++++++++----------
 test/cairo/draw.c   |   52 ++++++++++++++++++++----------------
 8 files changed, 151 insertions(+), 100 deletions(-)

diff --git a/WINGs/WINGs/WINGs.h b/WINGs/WINGs/WINGs.h
index abff8f9..ac805fc 100644
--- a/WINGs/WINGs/WINGs.h
+++ b/WINGs/WINGs/WINGs.h
@@ -824,7 +824,7 @@ void WMReleaseColor(WMColor *color);
 
 WMColor* WMRetainColor(WMColor *color);
 
-WMColor* WMCreateColorWithSpec(WMScreen *scr, WMColorSpec *spec);
+XColor WMCreateColorWithSpec(WMScreen *scr, WMColorSpec *spec);
 
 WMColor* WMCreateRGBColor(WMScreen *scr, unsigned short red,
                           unsigned short green, unsigned short blue,
diff --git a/WINGs/newtheme.c b/WINGs/newtheme.c
index b32590c..3bb6370 100644
--- a/WINGs/newtheme.c
+++ b/WINGs/newtheme.c
@@ -3,9 +3,16 @@
 void W_DrawButtonDarkBack(cairo_t *cairo, WMButton *bPtr, unsigned int width, 
unsigned int height, WMReliefType relief)
 {
        cairo_save(cairo);
-
-       WMColorSpec topfill = WMLightGrayColorSpec();
-       WMColorSpec bottomfill = WMGrayColorSpec();
+       WMColorSpec topfill;
+       WMColorSpec bottomfill;
+
+       if (relief == WRFlat) {
+               topfill = WMGrayColorSpec();
+               bottomfill = WMGrayColorSpec();
+       } else {
+               topfill = WMLightGrayColorSpec();
+               bottomfill = WMGrayColorSpec();
+       }
 
        //draw main gradient
        cairo_pattern_t *linpat;
@@ -53,6 +60,14 @@ void W_DrawButtonRelief(cairo_t *cairo, unsigned int width, 
unsigned int height,
        WMColorSpec innerbottomright;
 
        switch (relief) {
+               case WRFlat:
+               {
+                       outerlefttop = WMTransparentColorSpec();
+                       outerbottomright = WMTransparentColorSpec();
+                       innerlefttop = WMTransparentColorSpec();
+                       innerbottomright = WMTransparentColorSpec();
+                       break;
+               }
                case WRSimple:
                {
                        outerlefttop = WMBlackColorSpec();
diff --git a/WINGs/wbutton.c b/WINGs/wbutton.c
index 7304a17..3c8eb65 100644
--- a/WINGs/wbutton.c
+++ b/WINGs/wbutton.c
@@ -476,12 +476,11 @@ static void paintButton(WMButton * bPtr)
                textColor = bPtr->disTextColor;
        }
 
-       if (bPtr->flags.enabled || !bPtr->flags.dimsWhenDisabled)
+       if (bPtr->flags.enabled || !bPtr->flags.dimsWhenDisabled) {
                image = WMRetainImage(bPtr->image);
-       else
-       {
+       } else {
                //XXX make dimmited image
-               image = bPtr->image;
+               image = WMRetainImage(bPtr->image);
        }
        offset = 0;
        if (bPtr->flags.bordered)
@@ -497,9 +496,11 @@ static void paintButton(WMButton * bPtr)
                if (bPtr->flags.stateChange) {
                        if (bPtr->altCaption)
                                caption = bPtr->altCaption;
-                       if (bPtr->altImage)
-                               image = bPtr->altImage;
+                       if (bPtr->altImage) {
+                               WMDestroyImage(image);
+                               image = WMRetainImage(bPtr->altImage);
                                textColor = bPtr->altTextColor;
+                       }
                }
 
                if (bPtr->flags.statePush && bPtr->flags.bordered) {
@@ -520,9 +521,11 @@ static void paintButton(WMButton * bPtr)
                if (bPtr->flags.pushChange) {
                        if (bPtr->altCaption)
                                caption = bPtr->altCaption;
-                       if (bPtr->altImage)
-                               image = bPtr->altImage;
+                       if (bPtr->altImage) {
+                               WMDestroyImage(image);
+                               image = WMRetainImage(bPtr->altImage);
                                textColor = bPtr->altTextColor;
+                       }
                }
        }
 
@@ -539,8 +542,9 @@ static void paintButton(WMButton * bPtr)
                                                relief, caption, 
bPtr->flags.alignment, image,
                                                bPtr->flags.imagePosition, 
&backColor, offset);
 
-       if (image)
+       if (image) {
                WMDestroyImage(image);
+       }
 
        cairo_destroy(cr);
 
diff --git a/WINGs/wcolor.c b/WINGs/wcolor.c
index 929c45c..7790940 100644
--- a/WINGs/wcolor.c
+++ b/WINGs/wcolor.c
@@ -73,17 +73,23 @@ WMColor *WMCreateRGBColor(WMScreen * scr, unsigned short 
red, unsigned short gre
 }
 #endif
 
-WMColor* WMCreateColorWithSpec(WMScreen *scr, WMColorSpec *spec)
+XColor WMCreateColorWithSpec(WMScreen *scr, WMColorSpec *spec)
 {
-       WMColor *color = NULL;
-
-       if (!(color=createRGBAColor(scr, spec->red<<8, spec->green<<8, 
spec->blue<<8, 0xffff)))
-               color = findCloseColor(scr, spec->red<<8, spec->green<<8, 
spec->blue<<8, 0xffff);
-
-       if (!color)
-               createRGBAColor(scr, spec->red<<8, spec->green<<8, 
spec->blue<<8, 0xffff);
+       XColor xcolor;
+//     WMColor *color = NULL;
+//
+//     if (!(color=createRGBAColor(scr, spec->red<<8, spec->green<<8, 
spec->blue<<8, 0xffff)))
+//             color = findCloseColor(scr, spec->red<<8, spec->green<<8, 
spec->blue<<8, 0xffff);
+//
+//     if (!color)
+//             createRGBAColor(scr, spec->red<<8, spec->green<<8, 
spec->blue<<8, 0xffff);
+
+       xcolor.red = spec->red;
+       xcolor.green = spec->green;
+       xcolor.blue = spec->blue;
+       xcolor.flags = DoRed | DoGreen | DoBlue;
 
-       return color;
+       return xcolor;
 }
 
 
diff --git a/WINGs/widgets.c b/WINGs/widgets.c
index a7488b1..0ffc099 100644
--- a/WINGs/widgets.c
+++ b/WINGs/widgets.c
@@ -308,20 +308,30 @@ static void renderImage(W_Screen *screen, cairo_surface_t 
*image, char **data,
                int width, int height)
 {
        int x, y, stride, offs;
-       unsigned char *buffer= cairo_image_surface_get_data(image);
-       WMColorSpec white= WMWhiteColorSpec();
-       WMColorSpec black= WMBlackColorSpec();
-       WMColorSpec light= WMGrayColorSpec();
-       WMColorSpec dark= WMDarkGrayColorSpec();
-       WMColorSpec trans= {0, 0, 0, 0};
+       unsigned char *buffer = cairo_image_surface_get_data(image);
+       if (buffer == NULL) {
+               printf("problem");
+               fflush(0);
+       }
+       WMColorSpec white = WMWhiteColorSpec();
+       WMColorSpec black = WMBlackColorSpec();
+       WMColorSpec light = WMGrayColorSpec();
+       WMColorSpec dark = WMDarkGrayColorSpec();
+       WMColorSpec trans = {0, 0, 0, 0};
 
+#ifdef __BIG_ENDIAN__
+#define PUTPIXEL(buffer, offs, color)\
+       buffer[offs++]= color.alpha, buffer[offs++]= color.red, buffer[offs++]= 
color.green, buffer[offs++]= color.blue
+#else
 #define PUTPIXEL(buffer, offs, color)\
-       buffer[offs++]= color.alpha, buffer[offs]= color.red, buffer[offs++]= 
color.green, buffer[offs++]= color.blue
+       buffer[offs++]= color.blue, buffer[offs++]= color.green, 
buffer[offs++]= color.red, buffer[offs++]= color.alpha
+#endif
 
-       stride= cairo_image_surface_get_stride(image);
-       offs= 0;
+       stride = cairo_image_surface_get_stride(image);
+       cairo_surface_flush(image);
+       offs = 0;
        for (y = 0; y < height; y++) {
-               offs= height * stride;
+               offs = y * stride;
                for (x = 0; x < width; x++) {
                        switch (data[y][x]) {
                                case ' ':
@@ -334,7 +344,7 @@ static void renderImage(W_Screen *screen, cairo_surface_t 
*image, char **data,
                                        break;
                                case '.':
                                case 'l':
-                                       PUTPIXEL(buffer, offs, light);
+                                       PUTPIXEL(buffer, offs, trans);
                                        break;
 
                                case '%':
@@ -344,19 +354,23 @@ static void renderImage(W_Screen *screen, cairo_surface_t 
*image, char **data,
 
                                case '#':
                                case 'b':
-                               default:
                                        PUTPIXEL(buffer, offs, black);
                                        break;
+
+                               default:
+                                       PUTPIXEL(buffer, offs, trans);
+                                       break;
                        }
                }
        }
+       cairo_surface_mark_dirty(image);
 }
 
 static WMImage* makeImage(W_Screen *sPtr, char **data, int width, int height, 
int masked)
 {
        cairo_surface_t *image;
 
-       image= cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
+       image = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
 
        renderImage(sPtr, image, data, width, height);
 
@@ -738,21 +752,21 @@ WMScreen *WMCreateScreen(Display * display, int screen)
 //stuff gets allocated on the heap
 //
 //
-//     scrPtr->checkButtonImageOn = makeImage(scrPtr, CHECK_BUTTON_ON,
-//                     CHECK_BUTTON_ON_WIDTH,
-//                     CHECK_BUTTON_ON_HEIGHT, False);
-//
-//     scrPtr->checkButtonImageOff = makeImage(scrPtr, CHECK_BUTTON_OFF,
-//                     CHECK_BUTTON_OFF_WIDTH,
-//                     CHECK_BUTTON_OFF_HEIGHT, False);
+       scrPtr->checkButtonImageOn = makeImage(scrPtr, CHECK_BUTTON_ON,
+                       CHECK_BUTTON_ON_WIDTH,
+                       CHECK_BUTTON_ON_HEIGHT, False);
 
-//     scrPtr->radioButtonImageOn = makeImage(scrPtr, RADIO_BUTTON_ON,
-//                     RADIO_BUTTON_ON_WIDTH,
-//                     RADIO_BUTTON_ON_HEIGHT, False);
-//
-//     scrPtr->radioButtonImageOff = makeImage(scrPtr, RADIO_BUTTON_OFF,
-//                     RADIO_BUTTON_OFF_WIDTH,
-//                     RADIO_BUTTON_OFF_HEIGHT, False);
+       scrPtr->checkButtonImageOff = makeImage(scrPtr, CHECK_BUTTON_OFF,
+                       CHECK_BUTTON_OFF_WIDTH,
+                       CHECK_BUTTON_OFF_HEIGHT, False);
+
+       scrPtr->radioButtonImageOn = makeImage(scrPtr, RADIO_BUTTON_ON,
+                       RADIO_BUTTON_ON_WIDTH,
+                       RADIO_BUTTON_ON_HEIGHT, False);
+
+       scrPtr->radioButtonImageOff = makeImage(scrPtr, RADIO_BUTTON_OFF,
+                       RADIO_BUTTON_OFF_WIDTH,
+                       RADIO_BUTTON_OFF_HEIGHT, False);
 //
 //     scrPtr->buttonArrow = makeImage(scrPtr, BUTTON_ARROW,
 //                     BUTTON_ARROW_WIDTH, BUTTON_ARROW_HEIGHT,
@@ -808,9 +822,9 @@ WMScreen *WMCreateScreen(Display * display, int screen)
 //                     PULLDOWN_INDICATOR_WIDTH,
 //                     PULLDOWN_INDICATOR_HEIGHT, True);
 //
-//     scrPtr->checkMark = makeImage(scrPtr, CHECK_MARK,
-//                     CHECK_MARK_WIDTH,
-//                     CHECK_MARK_HEIGHT, True);
+       scrPtr->checkMark = makeImage(scrPtr, CHECK_MARK,
+                       CHECK_MARK_WIDTH,
+                       CHECK_MARK_HEIGHT, True);
 //
 //     loadPixmaps(scrPtr);
 
diff --git a/WINGs/wmisc.c b/WINGs/wmisc.c
index fb3bb06..6c51f19 100644
--- a/WINGs/wmisc.c
+++ b/WINGs/wmisc.c
@@ -390,7 +390,12 @@ void W_PaintText(cairo_t *cairo, WMFont *font,  int x, int 
y,
        int count;
        int fheight = WMFontHeight(font);
 
-       line_x= x + (width - WMWidthOfString(font, ptr))/2;
+       if (alignment == WALeft)
+               line_x = x;
+       else if (alignment == WARight)
+               line_x = x + width - WMWidthOfString(font,ptr);
+       else
+               line_x = x + (width - WMWidthOfString(font,ptr)) / 2;
        WMDrawString(cairo, color, font, line_x, y, ptr);
        return;
 
@@ -486,19 +491,14 @@ void W_PaintTextAndImage(W_Screen *screen, cairo_t 
*cairo, W_View *view, int wra
                        break;
                }
 
+               cairo_set_operator(cairo,CAIRO_OPERATOR_SOURCE);
                ix += ofs;
                iy += ofs;
+               cairo_set_source_surface(cairo,image,ix+0.5,iy+0.5);
+               cairo_mask_surface(cairo,image,ix+0.5,iy+0.5);
+               cairo_stroke(cairo);
+               cairo_set_operator(cairo,CAIRO_OPERATOR_OVER);
 
-               //XXX        XSetClipOrigin(screen->display, screen->clipGC, 
ix, iy);
-               //XXX        XSetClipMask(screen->display, screen->clipGC, 
image->mask);
-               /*XXX
-                 if (image->depth==1)
-                 XCopyPlane(screen->display, image->pixmap, d, screen->clipGC,
-                 0, 0, WMGetImageWidth(image), WMGetImageHeight(image), ix, 
iy, 1);
-                 else
-                 XCopyArea(screen->display, image->pixmap, d, screen->clipGC,
-                 0, 0, WMGetImageWidth(image), WMGetImageHeight(image), ix, 
iy);
-                 */
        }
 
        /* draw text */
@@ -510,6 +510,7 @@ void W_PaintTextAndImage(W_Screen *screen, cairo_t *cairo, 
W_View *view, int wra
                                alignment, textColor, wrap, text);
        }
 
+       cairo_restore(cairo);
        /* draw relief */
        //W_DrawRelief(screen, cairo, 0, 0, view->size.width, 
view->size.height, relief);
 }
diff --git a/WINGs/wview.c b/WINGs/wview.c
index c3806bc..023cd07 100644
--- a/WINGs/wview.c
+++ b/WINGs/wview.c
@@ -99,17 +99,22 @@ static W_View *createView(W_Screen * screen, W_View * 
parent)
 
        view->screen = screen;
 
-       view->backColor= WMWhiteColorSpec();
+       view->backColor= WMGrayColorSpec();
 
        if (parent!=NULL) {
-               //XXXWMColor *xcolor= WMCreateColorWithSpec(screen, 
&view->backColor);
+               XColor xcolor;
+               xcolor.red = view->backColor.red << 8;
+               xcolor.green = view->backColor.green << 8;
+               xcolor.blue = view->backColor.blue << 8;
+               xcolor.flags = DoRed | DoGreen | DoBlue;
+               XAllocColor(screen->display,screen->colormap,&xcolor);
 
                /* attributes are not valid for root window */
                view->attribFlags = CWEventMask|CWBitGravity;
                view->attribs = defAtts;
 
                view->attribFlags |= CWBackPixel|CWColormap|CWBorderPixel;
-               view->attribs.background_pixel = 
WhitePixel(screen->display,screen->screen);
+               view->attribs.background_pixel = xcolor.pixel;
                view->attribs.border_pixel = 0;
                view->attribs.colormap = screen->colormap;
 
@@ -499,18 +504,18 @@ void W_RedisplayView(W_View * view)
 
 void W_SetViewBackgroundColor(W_View *view, WMColorSpec *color)
 {
-       WMColor *xcolor= WMCreateColorWithSpec(view->screen, color);
-
-       view->backColor = *color;
-
-       view->attribFlags |= CWBackPixel;
-       view->attribs.background_pixel = W_PIXEL(xcolor);
-       if (view->flags.realized) {
-               XSetWindowBackground(view->screen->display, view->window,
-                               W_PIXEL(xcolor));
-               XClearWindow(view->screen->display, view->window);
-       }
-       WMReleaseColor(xcolor);
+//     XColor xcolor= WMCreateColorWithSpec(view->screen, color);
+//
+//     view->backColor = *color;
+//
+//     view->attribFlags |= CWBackPixel;
+//     view->attribs.background_pixel = W_PIXEL(xcolor);
+//     if (view->flags.realized) {
+//             XSetWindowBackground(view->screen->display, view->window,
+//                             W_PIXEL(xcolor));
+//             XClearWindow(view->screen->display, view->window);
+//     }
+//     WMReleaseColor(xcolor);
 }
 
 void W_SetViewCursor(W_View * view, Cursor cursor)
diff --git a/test/cairo/draw.c b/test/cairo/draw.c
index ba4a4b2..db459b9 100644
--- a/test/cairo/draw.c
+++ b/test/cairo/draw.c
@@ -14,41 +14,47 @@
 
 void draw(Display *dpy, Screen *scr, Visual *vis, Window win) {
        cairo_surface_t *surf;
+       cairo_surface_t *imgsurf;
        cairo_t *ct;
-       cairo_pattern_t *linpat;
-       int height = 35;
-       int width = 130;
 
        surf = (cairo_surface_t *) cairo_xlib_surface_create(dpy, win, vis, 
500, 500);
        ct = cairo_create(surf);
 
-       //cairo_set_line_width(ct, 1);
-
-       linpat = cairo_pattern_create_linear(0,0,0,height);
-       cairo_pattern_add_color_stop_rgb(linpat, 0, 194.0/255, 190.0/255, 
194.0/255);
-       cairo_pattern_add_color_stop_rgb(linpat, 1, 174.0/255, 170.0/255, 
174.0/255);
-       cairo_set_source(ct,linpat);
-       cairo_rectangle(ct,0,0,width,height);
-       cairo_fill(ct);
-
-       cairo_set_source_rgb(ct, 1, 1, 1);
-       cairo_rectangle(ct,0,0,1,height-1);
-       cairo_rectangle(ct,0,0,width-1,1);
-       cairo_fill(ct);
-
-       cairo_set_source_rgb(ct, 81.0/255, 85.0/255, 81.0/255);
-       cairo_rectangle(ct,1,height-2,width-1,1);
-       cairo_rectangle(ct,width-2,1,1,height-1);
+       cairo_set_source_rgba(ct,0.5,0.5,0.5,1.0);
+       cairo_rectangle(ct,0,0,499,499);
        cairo_fill(ct);
+       cairo_stroke(ct);
 
-       cairo_set_source_rgb(ct, 0, 0, 0);
-       cairo_rectangle(ct,0,height-1,width,1);
-       cairo_rectangle(ct,width-1,0,1,height);
-       cairo_fill(ct);
+       imgsurf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,10,10);
+       char *buf = cairo_image_surface_get_data(imgsurf);
+       int stride = cairo_image_surface_get_stride(imgsurf);
+
+       int offs;
+       int i;
+       int j;
+       for (i=0; i < 10; i++) {
+               offs = i*stride;
+               for (j=0; j < 10; j++) {
+                       //doesn't work, no black square
+                       buf[offs++] = 0x00; //alpha
+                       buf[offs++] = 0x00; //alpha
+                       buf[offs++] = 0x00; //alpha
+                       buf[offs++] = 0xff; //alpha
+
+
+                       //works <- white square
+                       //buf[offs++] = 0xff; //alpha
+                       //buf[offs++] = 0xff; //red
+                       //buf[offs++] = 0xff; //green
+                       //buf[offs++] = 0xff; //blue
+               }
+       }
 
+       cairo_set_operator(ct,CAIRO_OPERATOR_SOURCE);
+       cairo_set_source_surface(ct,imgsurf,0,0);
+       cairo_mask_surface(ct,imgsurf,0,0);
        cairo_stroke(ct);
 
-       cairo_pattern_destroy(linpat);
        cairo_destroy(ct);
        cairo_surface_destroy(surf);
 }
-- 
1.6.0.3

Reply via email to