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