diff --unified --recursive --text fvwm-2.6.9/libs/FTips.c fvwm-patched/libs/FTips.c
--- fvwm-2.6.9/libs/FTips.c	2018-05-26 05:35:26.000000000 -0600
+++ fvwm-patched/libs/FTips.c	2020-08-21 16:20:45.638664630 -0600
@@ -504,7 +504,7 @@
 	if (fc == NULL)
 	{
 		fc = default_config;
-	}
+	} 
 	current_config = fc;
 
 	if (label != NULL)
Only in fvwm-patched/libs: FTips.c.orig
diff --unified --recursive --text fvwm-2.6.9/modules/FvwmButtons/FvwmButtons.c fvwm-patched/modules/FvwmButtons/FvwmButtons.c
--- fvwm-2.6.9/modules/FvwmButtons/FvwmButtons.c	2018-05-26 05:35:26.000000000 -0600
+++ fvwm-patched/modules/FvwmButtons/FvwmButtons.c	2020-08-21 16:28:07.722997146 -0600
@@ -55,6 +55,7 @@
 #include "libs/Colorset.h"
 #include "libs/vpacket.h"
 #include "libs/FRender.h"
+#include "libs/FTips.h"
 #include "libs/fsm.h"
 #include "libs/ColorUtils.h"
 #include "libs/Graphics.h"
@@ -900,6 +901,7 @@
 			button_info *tmp = ActiveButton;
 			ActiveButton = b;
 			RedrawButton(tmp, DRAW_FORCE, NULL);
+			
 		}
 		if (
 			b->flags.b_ActiveIcon ||
@@ -1040,6 +1042,9 @@
 
 	tmp.name = NULL;
 	tmp.name_list = NULL;
+
+	FTipsInit(Dpy);
+
 	while ( !isTerminated )
 	{
 		if (My_FNextEvent(Dpy, &Event))
@@ -1166,6 +1171,10 @@
 	  if (!event.xconfigure.send_event &&
 	      Event.xconfigure.window != MyWindow)
 	    continue;
+
+	  if(FTipsHandleEvents(Dpy, &event))
+	    continue;
+
 	  fev_sanitise_configure_notify(&event.xconfigure);
 	  Event.xconfigure.x = event.xconfigure.x;
 	  Event.xconfigure.y = event.xconfigure.y;
@@ -1209,10 +1218,33 @@
 	case EnterNotify:
 		b = handle_new_position(
 			b, Event.xcrossing.x, Event.xcrossing.y);
+
+		if(Event.xcrossing.mode == NotifyNormal)
+		{
+			b = handle_new_position(
+			b, Event.xcrossing.x, Event.xcrossing.y);
+			FTipsOn(Dpy,MyWindow,UberButton->c->tips_config, 
+			    (void *)UberButton, b->tipslabel, 
+			    b->x, b->y, Width,Height);
+			FTipsUpdateLabel(Dpy, b->tipslabel);
+		}
 		break;
 
 	case MotionNotify:
+
 		b = handle_new_position(b, Event.xmotion.x, Event.xmotion.y);
+			
+		x = Event.xbutton.x;
+		y = Event.xbutton.y;	
+
+		if(b->tipslabel != NULL)
+		{
+			FTipsOn(Dpy,MyWindow,UberButton->c->tips_config, (void *)UberButton, b->tipslabel, x, y, w, h);
+			FTipsUpdateLabel(Dpy, b->tipslabel);
+		} else {
+			 FTipsCancel(Dpy);
+		}
+		
 		break;
 
 	case LeaveNotify:
@@ -1235,11 +1267,13 @@
 				b = ActiveButton;
 				ActiveButton = NULL;
 				RedrawButton(b, DRAW_FORCE, NULL);
+
 			}
 			if (CurrentButton)
 			{
 				RedrawButton(b, DRAW_FORCE, NULL);
 			}
+			FTipsCancel(Dpy);
 		}
 		break;
 
@@ -1261,8 +1295,8 @@
 	  Window dummy;
 
 	  XTranslateCoordinates(
-	    Dpy, Event.xbutton.window, MyWindow, Event.xbutton.x,
-	    Event.xbutton.y, &x, &y, &dummy);
+			  Dpy, Event.xbutton.window, MyWindow, Event.xbutton.x,
+			  Event.xbutton.y, &x, &y, &dummy);
 	}
 	if (CurrentButton)
 	{
@@ -1304,7 +1338,10 @@
 	  RedrawButton(tmp, DRAW_FORCE, NULL);
 	}
 	else
+	{
 	  RedrawButton(b, DRAW_FORCE, NULL);
+	}
+	  
 	if (!act)
 	{
 	  break;
Only in fvwm-patched/modules/FvwmButtons: FvwmButtons.c.orig
diff --unified --recursive --text fvwm-2.6.9/modules/FvwmButtons/FvwmButtons.h fvwm-patched/modules/FvwmButtons/FvwmButtons.h
--- fvwm-2.6.9/modules/FvwmButtons/FvwmButtons.h	2018-05-26 05:35:26.000000000 -0600
+++ fvwm-patched/modules/FvwmButtons/FvwmButtons.h	2020-08-21 16:20:45.638664630 -0600
@@ -32,6 +32,8 @@
 #include "libs/fvwmlib.h"
 #include "libs/Picture.h"
 #include "libs/Flocale.h"
+#include "libs/FTips.h"
+#define FONT_STRING "-*-fixed-medium-r-normal--13-*"
 
 /* ------------------------------- structs --------------------------------- */
 
@@ -76,6 +78,7 @@
 	unsigned b_PressIcon      : 1; /* Use alternate Icon on press */
 	unsigned b_PressColorset  : 1; /* Use alternate Colorset on press */
 	unsigned b_PressTitle     : 1; /* Use alternate Title text on press */
+	unsigned b_UseTips	  : 1; /* Whether to use tips or not. */	
 } flags_type;
 
 /* Flags for b->swallow */
@@ -125,6 +128,9 @@
 	int colorset;              /* b_Colorset */
 	int activeColorset;        /* b_ActiveColorset */
 	int pressColorset;         /* b_PressColorset */
+	char *tipsfont;		   /* b_TipsFont*/
+	ftips_config *tips_config; /* Struct that holds tips info.*/
+
 	Pixel fc;                  /* b_Fore */
 	Pixel bc, hc, sc;          /* b_Back && !b_IconBack */
 	FvwmPicture *backicon;     /* b_Back && b_IconBack */
@@ -181,6 +187,7 @@
 	FvwmPicture *pressicon;  /* b_PressIcon */
 	int activeColorset;      /* b_ActiveColorset */
 	int pressColorset;       /* b_PressColorset */
+	char *tipslabel;	 /* b_TipsLabel */
 	Window IconWin;          /* b_Swallow */
 	Window PanelWin;         /* b_Panel */
 	Window BackIconWin;      /* b_Back && b_IconBack */
Only in fvwm-patched/modules/FvwmButtons: FvwmButtons.h.orig
diff --unified --recursive --text fvwm-2.6.9/modules/FvwmButtons/parse.c fvwm-patched/modules/FvwmButtons/parse.c
--- fvwm-2.6.9/modules/FvwmButtons/parse.c	2018-05-26 05:35:26.000000000 -0600
+++ fvwm-patched/modules/FvwmButtons/parse.c	2020-08-21 16:20:45.638664630 -0600
@@ -882,6 +882,7 @@
 			"presstitle",
 			"activecolorset",
 			"presscolorset",
+			"tipslabel",
 			"top",
 			NULL
 		};
@@ -1605,7 +1606,33 @@
 					b->flags.b_ActiveColorset = 0;
 				}
 				break;
+			/* --------- TipsLabel ---------*/
+			case 28:
+				s = trimleft(s);
+				t = seekright(&s);
+				if(ub->c->flags.b_UseTips)
+				{
+					if (*s == '(')
+					{
+						fprintf(stderr,
+						"%s: justification not allowed "
+						"for TipsLabel.\n", MyName);
+					}
+					
+					
+
+					if (t && *t && (t[0] != '-' || t[1] != 0))
+					{
+						if (b->tipslabel != NULL)
+						{
+							free(b->tipslabel);
+						} else {
+							b->tipslabel = t;
+						}
+					}
+				}
 
+				break;
 			/* --------------- --------------- */
 			case 26: /* PressColorset */
 				i = strtol(s, &t, 10);
@@ -1777,6 +1804,14 @@
 		"colorset",
 		"activecolorset",
 		"presscolorset",
+		"usetips",
+		"tipsfont",
+		"tipsdelay",
+		"tipscolorset",
+		"tipsborderwidth",
+		"tipsplacement",
+		"tipsjustification",
+		"tipsoffset",
 		NULL
 	};
 	int i, j, k;
@@ -1924,7 +1959,97 @@
 			ub->c->flags.b_PressColorset = 0;
 		}
 		break;
+	case 15: /* UseTips */
+		/* We're using tips.*/
+		ub->c->flags.b_UseTips = 1;
+
+		/* Set the defaults up. */
+		ub->c->tips_config = FTipsNewConfig();
+
+		/* Include fonts. */
+		CopyStringWithQuotes(&ub->c->tipsfont,FONT_STRING);
+		ub->c->tips_config->Ffont = FlocaleLoadFont(Dpy, 
+				ub->c->tipsfont, MyName);
+		break;
+	case 16: /* TipsFont */
+		if(ub->c->flags.b_UseTips)
+		{
+			CopyStringWithQuotes(&ub->c->tipsfont,s);
 
+		ub->c->tips_config->Ffont = FlocaleLoadFont(Dpy, ub->c->tipsfont, 
+				MyName);
+		}
+				
+		break;
+	case 17: /*TipsDelay */
+		if(ub->c->flags.b_UseTips)
+		{
+			i = sscanf(s, "%d %d", &j, &k);
+			if( i > 0)
+			{
+				/* Then only one value was given.  Set the
+				 * mapped_delay option to this given value
+				 * also since it's optional. 
+				 */
+				ub->c->tips_config->delay = ub->c->tips_config->mapped_delay = j;
+			}
+			if( i > 1)
+			{
+				/* Two values passed in.  We only need to
+				 * change the value for mapped_delay here.
+				 */
+
+				ub->c->tips_config->mapped_delay = k;
+
+			}
+		}
+			break;
+	case 18: /* TipsColorset */
+		if (ub->c->flags.b_UseTips)
+		{
+			i = sscanf(s, "%d", &j);
+			if (i > 0)
+			{
+				ub->c->tips_config->colorset = j;
+				AllocColorset(j);
+			}
+		}
+		break;
+	case 19: /* TipsBorderWidth */
+		if (ub->c->flags.b_UseTips)
+		{
+			i = sscanf(s, "%d", &j);
+
+			if(i > 0)
+			{
+				ub->c->tips_config->border_width = j;
+			}
+		}
+		break;
+	case 20: /* TipsPlacement */
+		if(ub->c->flags.b_UseTips)
+		{
+			s = trimleft(s);
+
+			/* Options ... */
+			if(!strcasecmp(s, "up"))
+			{
+				i = FTIPS_PLACEMENT_UP;
+			} else if(!strcasecmp(s, "down")) {
+				i = FTIPS_PLACEMENT_DOWN;
+			} else if(!strcasecmp(s, "left")) {
+				i = FTIPS_PLACEMENT_LEFT;
+			} else if(!strcasecmp(s, "right")) {
+				i = FTIPS_PLACEMENT_RIGHT;
+			} else if(!strcasecmp(s, "updown")) {
+				i = FTIPS_PLACEMENT_AUTO_UPDOWN;
+			} else if(!strcasecmp(s, "leftright")) {
+				i = FTIPS_PLACEMENT_AUTO_LEFTRIGHT;
+			}
+
+			ub->c->tips_config->placement = i;
+		}
+			break;
 	default:
 		s = trimleft(s);
 		ParseButton(ubb, s);
Only in fvwm-patched/modules/FvwmButtons: parse.c.orig
