Subject: FVWM: Patch: balloon help for Pager

From: Richard Lister <[email-masked]>
Date: Tue, 26 Aug 1997 19:49:02 -0400

Hi folks

The other day I was mucking around with 4Dwm on Irix 6.3, and the
Desks Overview (their pager) had a nice little feature. When you point
at a window in the pager it pops up a little help balloon with the icon
title of the window.

I like this because I keep the pager small and can't use normal labels
or even MiniIcons in such tiny windows.

So I knocked up a little patch to do the same for FvwmPager. I've
included it below.

'patch < file' it in the fvwm-2.0.46 source directory, 
read the man page, and add something like this to your config:

    *FvwmPagerBalloons
    *FvwmPagerBalloonBack Yellow
    *FvwmPagerBalloonFore Black
    *FvwmPagerBalloonFont lucidasanstypewriter-12

I've only tested on Linux/X11R6 so far.

If you go to

    http://www.giccs.georgetown.edu/~ric/software/fvwm/pager.html

you can also get a screenshot and the FvwmPager directory as a tarball.

Comments and suggestions welcome.

Ric

Richard J Lister, Georgetown Institute for Cognitive and Computational Sciences
Georgetown University Medical Center, Washington, DC.
Phone: 202-687 2878
Email: [email-masked] 
Web: http://www.giccs.georgetown.edu/

------------------------------cut here for patch--------------------------
diff -u modules/FvwmPager.orig/FvwmPager.c modules/FvwmPager/FvwmPager.c
--- modules/FvwmPager.orig/FvwmPager.c	Tue Aug 26 18:46:54 1997
+++ modules/FvwmPager/FvwmPager.c	Tue Aug 26 18:50:59 1997
@@ -68,6 +68,11 @@
 char *WindowHiBack = NULL;
 char *WindowHiFore = NULL;
 
+int ShowBalloons = 0;
+char *BalloonBack = NULL;
+char *BalloonFore = NULL;
+char *BalloonFont = "fixed";
+
 int window_w=0, window_h=0, window_x=0, window_y=0;
 int icon_x=-10000, icon_y=-10000, icon_w=0, icon_h=0;
 int usposition = 0,uselabel = 1;
@@ -1060,6 +1065,36 @@
 			colors = GetNextToken (colors, &WindowHiBack);
 		}
 	}
+
+      
+      /* ... and get Balloon config options ...
+         -- [email-masked] */
+      else if ( (strlen(&tline[0]) > 1) &&
+                (strncasecmp (tline, CatString3 ("*", MyName, "Balloons"),
+                              Clength + 9) == 0) ) {
+        ShowBalloons = 1;
+      }
+
+      else if ( (strlen(&tline[0]) > 1) &&
+                (strncasecmp (tline, CatString3 ("*", MyName, "BalloonBack"),
+                              Clength + 12) == 0) ) {
+        if (Scr.d_depth > 1)
+          CopyString(&BalloonBack, &tline[Clength+12]);
+      }
+
+      else if ( (strlen(&tline[0]) > 1) &&
+                (strncasecmp (tline, CatString3 ("*", MyName, "BalloonFore"), 
+                              Clength + 12) == 0) ) {
+        if (Scr.d_depth > 1)
+          CopyString(&BalloonFore, &tline[Clength+12]);
+      }
+
+      else if ( (strlen(&tline[0]) > 1) &&
+                (strncasecmp (tline, CatString3 ("*", MyName, "BalloonFont"), 
+                              Clength + 12) == 0) ) {
+        CopyString(&BalloonFont, &tline[Clength+12]);
+      }
+
       GetConfigLine(fd,&tline);
     }
   return;
diff -u modules/FvwmPager.orig/FvwmPager.h modules/FvwmPager/FvwmPager.h
--- modules/FvwmPager.orig/FvwmPager.h	Tue Aug 26 18:46:55 1997
+++ modules/FvwmPager/FvwmPager.h	Tue Aug 26 18:50:59 1997
@@ -68,6 +68,14 @@
 } PagerWindow;

+typedef struct balloon_window
+{
+  Window w;              /* ID of balloon window */
+  PagerWindow *pw;       /* pager window it's associated with */
+  XFontStruct *font;
+} BalloonWindow;
+
+
 typedef struct desk_info 
 {
   Window w;
@@ -144,6 +152,10 @@
 void IconMoveWindow(XEvent *Event,PagerWindow *t);
 void HandleExpose(XEvent *Event);
 void MoveStickyWindows(void);
+void MapBalloonWindow(XEvent *);
+void UnmapBalloonWindow(void);
+void DrawInBalloonWindow(void);
+
 #ifdef BROKEN_SUN_HEADERS
 #include "../../fvwm/sun_headers.h"
 #endif
diff -u modules/FvwmPager.orig/FvwmPager.man modules/FvwmPager/FvwmPager.man
--- modules/FvwmPager.orig/FvwmPager.man	Tue Aug 26 18:46:55 1997
+++ modules/FvwmPager/FvwmPager.man	Tue Aug 26 18:50:59 1997
@@ -181,10 +181,28 @@
 Allow the pager to display a window's mini icon in the pager, if it has
 one, instead of showing the window's name.
 
+.IP "*FvwmPagerBalloons"
+Show a balloon describing the window when the pointer is moved into
+a window in the pager. Currently only the window's icon name is shown.
+Note that balloons are not shown for the iconified pager. 
+
+.IP "*FvwmPagerBalloonFore \fIcolor\fP"
+Specifies the color for text in the balloon window. If omitted it
+defaults to the foreground color for the window being described.
+
+.IP "*FvwmPagerBalloonBack \fIcolor\fP"
+Specifies the background color for the balloon window. If omitted it
+defaults to the background color for the window being described.
+
+.IP "*FvwmPagerBalloonFont \fIfont-name\fP"
+Specifies a font to use for the balloon text.
+
+
 .SH AUTHOR
 Robert Nation 
 .br
 DeskColor patch contributed by Alan Wild
 .br
 MiniIcons and WindowColors patch contributed by Rob Whapham
-
+.br
+Balloons patch contributed by Ric Lister <[email-masked]>
diff -u modules/FvwmPager.orig/Makefile modules/FvwmPager/Makefile
--- modules/FvwmPager.orig/Makefile	Tue Aug 26 18:46:55 1997
+++ modules/FvwmPager/Makefile	Tue Aug 26 18:50:59 1997
@@ -578,6 +578,7 @@
 FvwmPager: $(OBJS) $(DEPLIBS)
 	$(RM) $@
 	$(CC) -o $@ $(OBJS) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS)
+#	@mv FvwmPager /home/cns/ric/lib/fvwm/modules/.
 
 install:: FvwmPager
 	@if [ -d $(DESTDIR)$(FVWMDIR) ]; then set +x; \
diff -u modules/FvwmPager.orig/x_pager.c modules/FvwmPager/x_pager.c
--- modules/FvwmPager.orig/x_pager.c	Tue Aug 26 18:46:55 1997
+++ modules/FvwmPager/x_pager.c	Tue Aug 26 18:50:59 1997
@@ -33,12 +33,15 @@
 extern int window_w, window_h,window_x,window_y,usposition,uselabel,xneg,yneg;
 extern int StartIconic;
 extern int MiniIcons;
+extern int ShowBalloons;
+
 extern int icon_w, icon_h, icon_x, icon_y;
 XFontStruct *font, *windowFont;
 
 GC NormalGC,DashedGC,HiliteGC,rvGC;
 GC StdGC;
 GC MiniIconGC;
+GC BalloonGC;
 
 extern PagerWindow *Start;
 extern PagerWindow *FocusWin;
@@ -74,6 +77,7 @@

 Window		icon_win;               /* icon window */
+BalloonWindow balloon;            /* balloon window */
 
 /***********************************************************************
  *
@@ -107,6 +111,7 @@
   XSetWindowAttributes attributes;
   extern char *PagerFore, *PagerBack, *HilightC;
   extern char *WindowBack, *WindowFore, *WindowHiBack, *WindowHiFore;
+  extern char *BalloonFore, *BalloonBack, *BalloonFont;
   extern char *font_string, *smallFont;
   int n,m,w,h,i,x,y;
   XGCValues gcv;
@@ -402,6 +407,50 @@
   gcv.background = back_pix;
   gcv.line_style = LineOnOffDash;
   DashedGC = XCreateGC(dpy, Scr.Root, gcm, &gcv);
+
+
+  /* create balloon window
+     -- [email-masked] */
+  if ( ShowBalloons ) {
+
+    /* tell WM to ignore this window */
+    attributes.override_redirect = True;
+  
+    attributes.event_mask = ExposureMask;
+
+    /* if given in config set this now, otherwise it'll be set for each
+       pager window when drawn later */
+    attributes.background_pixel = 
+      (BalloonBack == NULL) ? 0 : GetColor(BalloonBack);
+
+    /* get font for balloon */
+    if ( (balloon.font = XLoadQueryFont(dpy, BalloonFont)) == NULL ) {
+      if ( (balloon.font = XLoadQueryFont(dpy, "fixed")) == NULL ) {
+        fprintf(stderr,"%s: No fonts available.\n", MyName);
+        exit(1);
+      }
+      fprintf(stderr, "%s: Can't find font '%s', using fixed.\n",
+              MyName, BalloonFont);
+    }
+
+    balloon.w = XCreateWindow(dpy, Scr.Root, 
+                              0, 0,            /* coords set later */
+                              1,               /* width set later */
+                              balloon.font->ascent + balloon.font->descent + 1,
+                              1,               /* border */
+                              CopyFromParent,
+                              InputOutput,
+                              CopyFromParent,
+                              CWOverrideRedirect | CWEventMask | CWBackPixel,
+                              &attributes);
+
+    /* make gc for balloon */
+    gcv.font = balloon.font->fid;
+
+    BalloonGC = XCreateGC(dpy, balloon.w,
+                          GCFont,
+                          &gcv);
+  } /* ShowBalloons */
 }

@@ -449,6 +498,14 @@
 
   switch(Event->xany.type)
     {
+    case EnterNotify:
+      if ( ShowBalloons )
+        MapBalloonWindow(Event);
+      break;
+    case LeaveNotify:
+      if ( ShowBalloons )
+        UnmapBalloonWindow();
+      break;
     case ConfigureNotify:
       ReConfigure();
       break;
@@ -556,6 +613,12 @@
   int i;
   PagerWindow *t;
 
+  /* [email-masked] */
+  if ( Event->xany.window == balloon.w ) {
+    DrawInBalloonWindow();
+    return;
+  }
+
   for(i=0;i<ndesks;i++)
     {
       if((Event->xany.window == Desks[i].w)
@@ -953,6 +1016,10 @@
   attributes.border_pixel = fore_pix;
   attributes.event_mask = (ExposureMask);
 
+  /* [email-masked] -- added Enter and Leave events for 
+     popping up balloon window */
+  attributes.event_mask = (ExposureMask | EnterWindowMask | LeaveWindowMask);
+
   if((i >= 0)&& (i <ndesks))
     {
       t->PagerView = XCreateWindow(dpy,Desks[i].w, x, y, w, h,1,
@@ -1804,4 +1871,72 @@
 	XSetInputFocus (dpy, t->w, RevertToParent, Event->xbutton.time);
     }
 
+}
+
+
+/* Just maps window ... draw stuff in it later after Expose event
+   -- [email-masked] */
+void MapBalloonWindow (XEvent *event)
+{
+  PagerWindow *t;
+  Window *dummy;
+  XWindowChanges window_changes;
+  extern char *BalloonBack;
+  
+  /* is this the best way to match X event window ID to PagerWindow ID? */
+  t = Start;
+
+  while ( (t != NULL) && (t->PagerView != event->xcrossing.window) )
+    t = t->next;
+
+  if (t == NULL)
+    return; 
+
+  /* associate balloon with its pager window */
+  balloon.pw = t;
+
+  /* balloon is a top-level window, therefore need to
+     translate pager window coords to root window coords */
+  XTranslateCoordinates(dpy, t->PagerView, Scr.Root, 
+                        t->pager_view_width / 2,
+                        t->pager_view_height + 5,
+                        &window_changes.x, &window_changes.y,
+                        dummy);
+
+  /* change window width to accomodate string */
+  window_changes.width = 4 + XTextWidth(balloon.font, t->icon_name,
+                                        strlen(t->icon_name));
+  XConfigureWindow(dpy, balloon.w,
+                   CWX | CWY | CWWidth,
+                   &window_changes);
+
+  /* if background not set in config make it match pager window */
+  if ( BalloonBack == NULL )
+    XSetWindowBackground(dpy, balloon.w, balloon.pw->back);
+
+
+  XMapRaised(dpy, balloon.w);
+}
+
+
+/* -- [email-masked] */
+void UnmapBalloonWindow (void)
+{
+  XUnmapWindow(dpy, balloon.w);
+}
+
+
+/* Draws string in balloon window -- call after it's received Expose event
+   -- [email-masked] */
+void DrawInBalloonWindow (void)
+{
+  extern char *BalloonFore;
+
+  /* if foreground not set in config make it match pager window */
+  if ( BalloonFore == NULL ) 
+    XSetForeground(dpy, BalloonGC, balloon.pw->text);
+
+  XDrawString(dpy, balloon.w, BalloonGC,
+              2, balloon.font->ascent, 
+              balloon.pw->icon_name, strlen(balloon.pw->icon_name));
 }
--
Visit the official FVWM web page at <URL:http://www.hpc.uh.edu/fvwm/>.
To unsubscribe from the list, send "unsubscribe fvwm" in the body of a
message to [email-masked].
To report problems, send mail to [email-masked].

---

From: Richard Lister <[email-masked]>
Date: Wed, 27 Aug 1997 00:44:45 -0400

On Tue, 26 Aug 1997 19:49:02 -0400
Richard Lister <[email-masked]> 
> I've only tested on Linux/X11R6 so far.

Well, that'll teach me, won't it! I just went to test it on Solaris
before going home for my tea and it blew up in my face. So its now
several hours later and I'm v hungry but I've fixed the problem.

Turns out I had done something very stupid with a pointer. Inexplicably
Linux let me get away with it, but Irix and Solaris weren't quite so
forgiving. Appropriately enough the pointer was called 'dummy' :-)

So, humble apologies for the previous broken patch, and here's a new
one, tested on Linux/X11R6, Solaris 2.5/OpenWindows, and Irix 6.3.

For some reason the diff I made doesn't work with either Solaris or
GNU patch on my Sun box, though it's fine on Linux and SGI. Tried
both unified and context diffs. Any patch gurus out there with ideas?
Meantime, if you have trouble, get the tarball off the web:

Right, following that egg on my face I'm off for some egg on toast for
my tea.

Ric

------------------------------cut here-----------------------------------
diff -rc modules/FvwmPager.orig/FvwmPager.c modules/FvwmPager/FvwmPager.c
*** modules/FvwmPager.orig/FvwmPager.c	Tue Aug 26 18:46:54 1997
--- modules/FvwmPager/FvwmPager.c	Tue Aug 26 18:55:02 1997
***************
*** 68,73 ****
--- 68,78 ----
  char *WindowHiBack = NULL;
  char *WindowHiFore = NULL;
  
+ int ShowBalloons = 0;
+ char *BalloonBack = NULL;
+ char *BalloonFore = NULL;
+ char *BalloonFont = "fixed";
+ 
  int window_w=0, window_h=0, window_x=0, window_y=0;
  int icon_x=-10000, icon_y=-10000, icon_w=0, icon_h=0;
  int usposition = 0,uselabel = 1;
***************
*** 1060,1065 ****
--- 1065,1100 ----
  			colors = GetNextToken (colors, &WindowHiBack);
  		}
  	}
+ 
+       
+       /* ... and get Balloon config options ...
+          -- [email-masked] */
+       else if ( (strlen(&tline[0]) > 1) &&
+                 (strncasecmp (tline, CatString3 ("*", MyName, "Balloons"),
+                               Clength + 9) == 0) ) {
+         ShowBalloons = 1;
+       }
+ 
+       else if ( (strlen(&tline[0]) > 1) &&
+                 (strncasecmp (tline, CatString3 ("*", MyName, "BalloonBack"),
+                               Clength + 12) == 0) ) {
+         if (Scr.d_depth > 1)
+           CopyString(&BalloonBack, &tline[Clength+12]);
+       }
+ 
+       else if ( (strlen(&tline[0]) > 1) &&
+                 (strncasecmp (tline, CatString3 ("*", MyName, "BalloonFore"), 
+                               Clength + 12) == 0) ) {
+         if (Scr.d_depth > 1)
+           CopyString(&BalloonFore, &tline[Clength+12]);
+       }
+ 
+       else if ( (strlen(&tline[0]) > 1) &&
+                 (strncasecmp (tline, CatString3 ("*", MyName, "BalloonFont"), 
+                               Clength + 12) == 0) ) {
+         CopyString(&BalloonFont, &tline[Clength+12]);
+       }
+ 
        GetConfigLine(fd,&tline);
      }
    return;
diff -rc modules/FvwmPager.orig/FvwmPager.h modules/FvwmPager/FvwmPager.h
*** modules/FvwmPager.orig/FvwmPager.h	Tue Aug 26 18:46:55 1997
--- modules/FvwmPager/FvwmPager.h	Tue Aug 26 18:55:02 1997
***************
*** 68,73 ****
--- 68,81 ----
  } PagerWindow;

+ typedef struct balloon_window
+ {
+   Window w;              /* ID of balloon window */
+   PagerWindow *pw;       /* pager window it's associated with */
+   XFontStruct *font;
+ } BalloonWindow;
+ 
+ 
  typedef struct desk_info 
  {
    Window w;
***************
*** 144,149 ****
--- 152,161 ----
  void IconMoveWindow(XEvent *Event,PagerWindow *t);
  void HandleExpose(XEvent *Event);
  void MoveStickyWindows(void);
+ void MapBalloonWindow(XEvent *);
+ void UnmapBalloonWindow(void);
+ void DrawInBalloonWindow(void);
+ 
  #ifdef BROKEN_SUN_HEADERS
  #include "../../fvwm/sun_headers.h"
  #endif
diff -rc modules/FvwmPager.orig/FvwmPager.man modules/FvwmPager/FvwmPager.man
*** modules/FvwmPager.orig/FvwmPager.man	Tue Aug 26 18:46:55 1997
--- modules/FvwmPager/FvwmPager.man	Tue Aug 26 18:55:02 1997
***************
*** 181,190 ****
  Allow the pager to display a window's mini icon in the pager, if it has
  one, instead of showing the window's name.
  
  .SH AUTHOR
  Robert Nation 
  .br
! 
--- 181,208 ----
  
+ .IP "*FvwmPagerBalloons"
+ Show a balloon describing the window when the pointer is moved into
+ a window in the pager. Currently only the window's icon name is shown.
+ Note that balloons are not shown for the iconified pager. 
+ 
+ .IP "*FvwmPagerBalloonFore \fIcolor\fP"
+ Specifies the color for text in the balloon window. If omitted it
+ defaults to the foreground color for the window being described.
+ 
+ .IP "*FvwmPagerBalloonBack \fIcolor\fP"
+ Specifies the background color for the balloon window. If omitted it
+ defaults to the background color for the window being described.
+ 
+ .IP "*FvwmPagerBalloonFont \fIfont-name\fP"
+ Specifies a font to use for the balloon text.
+ 
+ 
  .SH AUTHOR
  Robert Nation 
  .br
  DeskColor patch contributed by Alan Wild
  .br
  MiniIcons and WindowColors patch contributed by Rob Whapham
! .br
! Balloons patch contributed by Ric Lister <[email-masked]>
diff -rc modules/FvwmPager.orig/x_pager.c modules/FvwmPager/x_pager.c
*** modules/FvwmPager.orig/x_pager.c	Tue Aug 26 18:46:55 1997
--- modules/FvwmPager/x_pager.c	Tue Aug 26 23:50:36 1997
***************
*** 33,44 ****
--- 33,47 ----
  extern int window_w, window_h,window_x,window_y,usposition,uselabel,xneg,yneg;
  extern int StartIconic;
  extern int MiniIcons;
+ extern int ShowBalloons;
+ 
  extern int icon_w, icon_h, icon_x, icon_y;
  XFontStruct *font, *windowFont;
  
+ GC BalloonGC;
  
***************
*** 74,79 ****
--- 77,83 ----

  Window		icon_win;               /* icon window */
+ BalloonWindow balloon;            /* balloon window */
  
***************
*** 107,112 ****
--- 111,117 ----
***************
*** 402,407 ****
--- 407,456 ----

***************
*** 449,454 ****
--- 498,511 ----
  
    switch(Event->xany.type)
      {
+     case EnterNotify:
+       if ( ShowBalloons )
***************
*** 556,561 ****
--- 613,624 ----
    int i;
    PagerWindow *t;
  
***************
*** 953,958 ****
--- 1016,1025 ----
  
***************
*** 1804,1807 ****
--- 1871,1942 ----
  
+ }
+ 
+ 
+ /* Just maps window ... draw stuff in it later after Expose event
+ void MapBalloonWindow (XEvent *event)
+ {
+   Window dummy;
+                         &dummy);
+     XSetWindowBackground(dpy, balloon.w, t->back);
+ /* -- [email-masked] */
+ void UnmapBalloonWindow (void)
+ {
+ /* Draws string in balloon window -- call after it's received Expose event
+ void DrawInBalloonWindow (void)
+ {

---

From: Martin Cartwright <[email-masked]>
Date: Wed, 27 Aug 1997 10:15:46 +0100 (BST)

I downloaded the tar file from the URL given but that appeared to
still have the bug that caused a silent fail whenever the pointer
entered the window. However the patch included in the e-mail works
fine on this Solaris 2.5 Ultra 1. Cool addition! I like it. I have two
further comments

1) It doesn't seem to be picking up on the *FvwmPagerBalloonFore black
statement in my .fvwmrc. I specified black but it insists on white. I
think it unlikely that it can't allocate a colourmap entry to "black".
That's okay, I'll just switch my colours around.

2) My pager is in the top right of the screen. Any windows in the
right most pages of the desktop have unreadable balloons, as they go
off the screen. A temporary fix, would be to move the pager I suppose,
but that means moving all sorts of stuff and resetting my IconBox etc
etc.. 

Any way good work so far!  :) 

[email-masked] --- http://star.pst.qub.ac.uk/~imc/vom.htm
-/-------------------------------------------------------------\-
|     	    "As private parts to the Gods are we...		|
|	      they play with us for their sport!"	      	|
-\-------------------------------------------------------------/-

---

From: Richard Lister <[email-masked]>
Date: Wed, 27 Aug 1997 12:18:23 -0400

On Wed, 27 Aug 1997 10:15:46 +0100 (BST)
Martin Cartwright <[email-masked]> 
wrote concerning 'Re: FVWM: Patch: balloon help for Pager':
> entered the window.

Odd, as I generated the files in the tar from the patch. I'll check on it.

> However the patch included in the e-mail works

It was a silly bug. I'll include a small patch to go on top of the
previous one at the end of this mail. I'll also update the web page
versions sometime in the next hour.

> but that means moving all sorts of stuff and resetting my IconBox etc

I knew people would ask for this. Things look the way they do at the
moment because I have the pager at top left :-)

There are a few things to consider:

1. It should be very easy to code so that a balloon that would project
off the screen to left or right is moved horizontally to be visible.
I'll have a go at that tonight.

2. Vertically is slightly more complicated. There is a very good reason
why balloons are always *outside* the window they are describing. It's
to avoid an EnterNotify/LeaveNotify event loop between the balloon
and the window. It would be possible to code around the loop but it
would make the event handling code for the whole module more complex.
I could have the balloon switch to being above the window if below
causes it to be off the screen.

3. How about two more options:

   *FvwmPagerBalloonPlacement: Above | Below
   *FvwmPagerHorizontalOffset: +x | -x

where the offset would determine the placement of the centre of the balloon
relative to the centre of the window. This would be shifted on the fly
to keep the balloon on the screen horizontally as well.

This doesn't feel generic enough ...

I'm very open to suggestions.

Ric

P.S. patch to x_pager.c below. Apply in the fvwm-2.0.46/modules/FvwmPager/
directory.

-------------------------------Cut here-----------------------------------
*** x_pager.c.prev	Wed Aug 27 00:06:27 1997
--- x_pager.c	Wed Aug 27 11:07:30 1997
***************
*** 444,454 ****
                                CWOverrideRedirect | CWEventMask | CWBackPixel,
                                &attributes);
  
!     /* make gc for balloon */
      gcv.font = balloon.font->fid;
  
      BalloonGC = XCreateGC(dpy, balloon.w,
!                           GCFont,
                            &gcv);
    } /* ShowBalloons */
  }
--- 444,457 ----
                                CWOverrideRedirect | CWEventMask | CWBackPixel,
                                &attributes);
  
!     /* set font */
      gcv.font = balloon.font->fid;
  
+     /* if fore given in config set now, otherwise it'll be set later */
+     gcv.foreground = (BalloonFore == NULL) ? 0 : GetColor(BalloonFore);
+ 
      BalloonGC = XCreateGC(dpy, balloon.w,
!                           GCFont | GCForeground,
                            &gcv);
    } /* ShowBalloons */
  }
--
Visit the official FVWM web page at <URL:http://www.hpc.uh.edu/fvwm/>.
To unsubscribe from the list, send "unsubscribe fvwm" in the body of a
message to [email-masked].
To report problems, send mail to [email-masked].