With this patch we can set widget background image.
As now, only background color was available.
---
 WINGs/WINGs/WINGs.h  |  4 ++++
 WINGs/WINGs/WINGsP.h |  4 ++++
 WINGs/widgets.c      | 15 +++++++++++++++
 WINGs/wmisc.c        | 14 +++++++++++---
 WINGs/wview.c        | 17 ++++++++++++++++-
 5 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/WINGs/WINGs/WINGs.h b/WINGs/WINGs/WINGs.h
index e460ef4..ca7be55 100644
--- a/WINGs/WINGs/WINGs.h
+++ b/WINGs/WINGs/WINGs.h
@@ -930,6 +930,10 @@ void WMSetWidgetBackgroundColor(WMWidget *w,
WMColor *color);

 WMColor* WMGetWidgetBackgroundColor(WMWidget *w);

+void WMSetWidgetBackgroundPixmap(WMWidget *w, WMPixmap *pix);
+
+WMPixmap *WMGetWidgetBackgroundPixmap(WMWidget *w);
+
 void WMMapSubwidgets(WMWidget *w);

 void WMUnmapSubwidgets(WMWidget *w);
diff --git a/WINGs/WINGs/WINGsP.h b/WINGs/WINGs/WINGsP.h
index 2484b25..fc18b1c 100644
--- a/WINGs/WINGs/WINGsP.h
+++ b/WINGs/WINGs/WINGsP.h
@@ -572,6 +572,8 @@ struct W_View {
     void *hangedData;                  /* data holder for user program */

     WMColor *backColor;
+    WMPixmap *backImage;
+

     Cursor cursor;

@@ -664,6 +666,8 @@ void W_ResizeView(W_View *view, unsigned int
width, unsigned int height);

 void W_SetViewBackgroundColor(W_View *view, WMColor *color);

+void W_SetViewBackgroundPixmap(W_View *view, WMPixmap *pix);
+
 void W_SetViewCursor(W_View *view, Cursor cursor);

 void W_SetFocusOfTopLevel(W_View *toplevel, W_View *view);
diff --git a/WINGs/widgets.c b/WINGs/widgets.c
index 75b44e7..87fa9d6 100644
--- a/WINGs/widgets.c
+++ b/WINGs/widgets.c
@@ -960,6 +960,21 @@ WMColor *WMGetWidgetBackgroundColor(WMWidget * w)
  return W_VIEW(w)->backColor;
 }

+void WMSetWidgetBackgroundPixmap(WMWidget *w, WMPixmap *pix)
+{
+ if (!pix)
+ return;
+
+ W_SetViewBackgroundPixmap(W_VIEW(w), pix);
+ if (W_VIEW(w)->flags.mapped)
+ WMRedisplayWidget(w);
+}
+
+WMPixmap *WMGetWidgetBackgroundPixmap(WMWidget *w)
+{
+ return W_VIEW(w)->backImage;
+}
+
 void WMRaiseWidget(WMWidget * w)
 {
  W_RaiseView(W_VIEW(w));
diff --git a/WINGs/wmisc.c b/WINGs/wmisc.c
index 331dc40..ba4c8a6 100644
--- a/WINGs/wmisc.c
+++ b/WINGs/wmisc.c
@@ -220,12 +220,20 @@ W_PaintTextAndImage(W_View * view, int wrap,
WMColor * textColor, W_Font * font,
  XFillRectangle(screen->display, d, WMColorGC(backColor),
        0, 0, view->size.width, view->size.height);
  } else {
+ if (view->attribs.background_pixmap) {
 #ifndef DOUBLE_BUFFER
- XClearWindow(screen->display, d);
+ XClearWindow(screen->display, d);
 #else
- XSetForeground(screen->display, screen->copyGC,
view->attribs.background_pixel);
- XFillRectangle(screen->display, d, screen->copyGC, 0, 0,
view->size.width, view->size.height);
+ XCopyArea(screen->display, view->attribs.background_pixmap, d,
screen->copyGC, 0, 0, view->size.width, view->size.height, 0, 0);
 #endif
+ } else {
+#ifndef DOUBLE_BUFFER
+ XClearWindow(screen->display, d);
+#else
+ XSetForeground(screen->display, screen->copyGC,
view->attribs.background_pixel);
+ XFillRectangle(screen->display, d, screen->copyGC, 0, 0,
view->size.width, view->size.height);
+#endif
+ }
  }

  if (relief == WRFlat) {
diff --git a/WINGs/wview.c b/WINGs/wview.c
index 2066244..610e640 100644
--- a/WINGs/wview.c
+++ b/WINGs/wview.c
@@ -100,7 +100,8 @@ static W_View *createView(W_Screen * screen,
W_View * parent)
  view->attribFlags = CWEventMask | CWBitGravity;
  view->attribs = defAtts;

- view->attribFlags |= CWBackPixel | CWColormap | CWBorderPixel;
+                view->attribFlags |= CWBackPixel | CWColormap |
CWBorderPixel | CWBackPixmap;
+                view->attribs.background_pixmap = None;
  view->attribs.background_pixel = W_PIXEL(screen->gray);
  view->attribs.border_pixel = W_PIXEL(screen->black);
  view->attribs.colormap = screen->colormap;
@@ -496,6 +497,20 @@ void W_SetViewBackgroundColor(W_View * view,
WMColor * color)
  }
 }

+void W_SetViewBackgroundPixmap(W_View *view, WMPixmap *pix)
+{
+       if (view->backImage)
+               WMReleasePixmap(view->backImage);
+       view->backImage = WMRetainPixmap(pix);
+
+       view->attribFlags |= CWBackPixmap;
+       view->attribs.background_pixmap = pix->pixmap;
+       if (view->flags.realized) {
+               XSetWindowBackgroundPixmap(view->screen->display,
view->window, pix->pixmap);
+               XClearWindow(view->screen->display, view->window);
+       }
+}
+
 void W_SetViewCursor(W_View * view, Cursor cursor)
 {
  view->cursor = cursor;
-- 
2.1.0

Attachment: 0001-WINGs-add-functions-to-set-widget-background-image.patch
Description: Binary data

Reply via email to