On Tue, 11 Mar 2008 14:12:48 +0100
Dominik Vogt <[EMAIL PROTECTED]> wrote:

> On Tue, Mar 11, 2008 at 07:31:40AM +0100, Jesús Guerrero wrote:
> > Hello,
> > 
> > I made a new patch which solves one of the longstanding issues I had
> > with my fvwm menus. It's not that it's something important, but it
> > was a small annoyance.
> 
> ... and where is the patch?

Well, I will attach it to this mail. But, as I said, it's not a finished
product. That's why I didn't include it on the first post, but since you
asked... It basically works, but I need to test it extensively to make
sure that nothing strange happens. At the current state, it only support
the top and bottom margins. I will implement margins around separators 
probably later today if I can.

The docs and stuff is not done. I don't want to waste my time documenting
it if it's never going to be merged and I am the only one using it. But
I will gladly make the docs and test stuff if you think that this would
be a good addition for fvwm.

The patch works as follows:

MenuStyle * VerticalMargins x y

Where x is the top margin and y is the bottom one. As said, margins around
separators are still not implemented, though I think they would be a good
addition. The separator lines are just next the the selection area, and
that makes them look really bad.

Thanks for your time.
-- 
Jesús Guerrero <[EMAIL PROTECTED]>
diff -r -U5 fvwm/fvwm/menuitem.c fvwm/fvwm/menuitem.c
--- fvwm/fvwm/menuitem.c	2008-03-10 22:26:15.000000000 +0100
+++ fvwm/fvwm/menuitem.c	2008-03-10 21:49:15.000000000 +0100
@@ -388,10 +388,11 @@
 	Region region = None;
 	int i;
 	int sx1;
 	int sx2;
 	FlocaleFont* font;
+	int top_margin = ST_VERTICAL_MARGIN_TOP(ms);
 
 	if (!mi)
 	{
 		return;
 	}
@@ -404,11 +405,11 @@
 	else
 	{
 		font = ST_PSTDFONT(ms);
 	}
 
-	y_offset = MI_Y_OFFSET(mi);
+	y_offset = MI_Y_OFFSET(mi) + ST_VERTICAL_MARGIN_TOP(ms);
 	y_height = MI_HEIGHT(mi);
 	if (MI_IS_SELECTABLE(mi))
 	{
 		text_y = y_offset + MDIM_ITEM_TEXT_Y_OFFSET(*dim);
 	}
diff -r -U5 fvwm/fvwm/menus.c fvwm/fvwm/menus.c
--- fvwm/fvwm/menus.c	2008-03-10 22:26:30.000000000 +0100
+++ fvwm/fvwm/menus.c	2008-03-10 21:23:52.000000000 +0100
@@ -126,10 +126,12 @@
 	} max;
 	struct
 	{
 		unsigned is_popup_indicator_used : 1;
 	} flags;
+	unsigned char top_margin;
+	unsigned char bottom_margin;
 } MenuSizingParameters;
 
 typedef enum
 {
 	SCTX_MENU_ROOT,
@@ -1796,11 +1798,13 @@
 	if (MR_LAST_ITEM(msp->menu) != NULL &&
 	    MI_IS_SELECTABLE(MR_LAST_ITEM(msp->menu)))
 	{
 		y += relief_thickness;
 	}
-	MR_HEIGHT(msp->menu) = y + MST_BORDER_WIDTH(msp->menu);
+	MR_HEIGHT(msp->menu) = y + MST_BORDER_WIDTH(msp->menu)
+		+ MST_VERTICAL_MARGIN_TOP(msp->menu)
+		+ MST_VERTICAL_MARGIN_BOTTOM(msp->menu);
 
 	return has_continuation_menu;
 }
 
 /*
diff -r -U5 fvwm/fvwm/menustyle.c fvwm/fvwm/menustyle.c
--- fvwm/fvwm/menustyle.c	2008-03-10 22:26:34.000000000 +0100
+++ fvwm/fvwm/menustyle.c	2008-03-10 22:14:22.000000000 +0100
@@ -303,10 +303,31 @@
 	*below = val[1];
 
 	return;
 }
 
+static void parse_vertical_margins_line(
+	char *args, signed char *top, signed char *bottom,
+	signed char top_default, signed char bottom_default)
+{
+	int val[2];
+
+	if (GetIntegerArguments(args, NULL, val, 2) != 2 ||
+	    val[0] < MIN_VERTICAL_SPACING || val[0] > MAX_VERTICAL_SPACING ||
+	    val[1] < MIN_VERTICAL_SPACING || val[1] > MAX_VERTICAL_SPACING)
+	{
+		/* illegal or missing parameters, return to default */
+		*top = top_default;
+		*bottom = bottom_default;
+		return;
+	}
+	*top = val[0];
+	*bottom = val[1];
+
+	return;
+}
+
 static MenuStyle *menustyle_parse_old_style(F_CMD_ARGS)
 {
 	char *buffer, *rest;
 	char *fore, *back, *stipple, *font, *style, *animated;
 	MenuStyle *ms = NULL;
@@ -404,10 +425,11 @@
 		"PopupIgnore", "PopupClose",
 		"MouseWheel", "ScrollOffPage",
 		"TrianglesUseFore",
 		"TitleColorset", "HilightTitleBack",
 		"TitleFont",
+		"VerticalMargins",
 		NULL
 	};
 
 	return GetTokenIndex(option, optlist, 0, NULL);
 }
@@ -906,11 +928,11 @@
 		while (poption[0] == '!')
 		{
 			on ^= 1;
 			poption++;
 		}
-		switch((i = menustyle_get_styleopt_index(poption)))
+		switch(i = menustyle_get_styleopt_index(poption))
 		{
 		case 0: /* fvwm */
 		case 1: /* mwm */
 		case 2: /* win */
 			if (i == 0)
@@ -957,10 +979,12 @@
 				ST_DO_HILIGHT_BACK(tmpms) = 1;
 				ST_DO_HILIGHT_FORE(tmpms) = 1;
 			}
 
 			/* common settings */
+			ST_VERTICAL_MARGIN_TOP(tmpms) = 0;
+			ST_VERTICAL_MARGIN_BOTTOM(tmpms) = 0;
 			ST_CSET_MENU(tmpms) = 0;
 			ST_HAS_MENU_CSET(tmpms) = 0;
 			ST_CSET_ACTIVE(tmpms) = 0;
 			ST_HAS_ACTIVE_CSET(tmpms) = 0;
 			ST_CSET_GREYED(tmpms) = 0;
@@ -1565,11 +1589,16 @@
 				ST_PTITLEFONT(tmpms) = new_font;
 				ST_USING_DEFAULT_TITLEFONT(tmpms) = False;
 			}
 			has_gc_changed = True;
 			break;
-
+		case 62: /* VerticalMargins */
+      parse_vertical_margins_line(
+        args, &ST_VERTICAL_MARGIN_TOP(tmpms),
+        &ST_VERTICAL_MARGIN_BOTTOM(tmpms),
+        0, 0);
+      break;
 
 #if 0
 		case 99: /* PositionHints */
 			/* to be implemented */
 			break;
@@ -1741,10 +1770,13 @@
 	ST_HAS_TRIANGLE_RELIEF(destms) = ST_HAS_TRIANGLE_RELIEF(origms);
 	/* PopupDelayed */
 	ST_DO_POPUP_IMMEDIATELY(destms) = ST_DO_POPUP_IMMEDIATELY(origms);
 	/* DoubleClickTime */
 	ST_DOUBLE_CLICK_TIME(destms) = ST_DOUBLE_CLICK_TIME(origms);
+	/* VerticalMargins */
+	ST_VERTICAL_MARGIN_TOP(destms) = ST_VERTICAL_MARGIN_TOP(origms);
+	ST_VERTICAL_MARGIN_BOTTOM(destms) = ST_VERTICAL_MARGIN_BOTTOM(origms);
 
 	/* SidePic */
 	if (ST_SIDEPIC(destms))
 	{
 		PDestroyFvwmPicture(dpy, ST_SIDEPIC(destms));
diff -r -U5 fvwm/fvwm/menustyle.h fvwm/fvwm/menustyle.h
--- fvwm/fvwm/menustyle.h	2008-03-10 22:26:35.000000000 +0100
+++ fvwm/fvwm/menustyle.h	2008-03-10 18:48:01.000000000 +0100
@@ -171,10 +171,14 @@
 #define MST_DOUBLE_CLICK_TIME(m)      ((m)->s->ms->feel.DoubleClickTime)
 #define ST_ITEM_FORMAT(s)             ((s)->feel.item_format)
 #define MST_ITEM_FORMAT(m)            ((m)->s->ms->feel.item_format)
 #define ST_SELECT_ON_RELEASE_KEY(s)   ((s)->feel.select_on_release_key)
 #define MST_SELECT_ON_RELEASE_KEY(m)  ((m)->s->ms->feel.select_on_release_key)
+#define ST_VERTICAL_MARGIN_TOP(s)     ((s)->look.vertical_margins.top)
+#define MST_VERTICAL_MARGIN_TOP(m)	  ((m)->s->ms->look.vertical_margins.top)
+#define ST_VERTICAL_MARGIN_BOTTOM(s)  ((s)->look.vertical_margins.bottom)
+#define MST_VERTICAL_MARGIN_BOTTOM(m)	((m)->s->ms->look.vertical_margins.bottom)
 
 /* ---------------------------- type definitions --------------------------- */
 
 typedef enum
 {
@@ -288,10 +292,15 @@
 		signed char separator_above;
 		signed char separator_below;
 	} vertical_spacing;
 	struct
 	{
+		signed char top;
+		signed char bottom;
+	} vertical_margins;
+	struct
+	{
 		int menu;
 		int active;
 		int greyed;
 		int title;
 	} cset;

Reply via email to