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 <[email protected]>
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