On Fri, Feb 06, 2009 at 09:35:30AM +0000, Thomas Adam wrote:
> 2009/2/6 Dominik Vogt <[email protected]>:
> > On Thu, Feb 05, 2009 at 10:55:16PM +0000, Thomas Adam wrote:
> >> 2009/1/26 Thomas Adam <[email protected]>:
> > I was planning to look into the patch on saturday evening (GMT) or
> > maybe earlier.
> 
> Ah, OK.  Please don't think I'm forcing your hand on this, I just
> never know how much time to give between pauses before I give a gentle
> reminder that I haven't completely abandoned an idea.  :)

Neither have I.  I have attached a much smaller version of the
patch that removes all code that replaces other styles and fixes a
couple of small problems:

  * Don't look up the style in events.c again but pass the string
    back from AddWindow().  As a side effect, the command is only
    executed when the window is mapped initially, not when it's
    mapped because of deiconification.  Therefore I renamed the
    style to InitialMapCommand (which may or may not be a good
    idea).

  * Call execute_function_override_window() with the proper
    execution context.

> >> Is it worth, whilst I am looking at the code, to deprecate
> >> StartsOnDesk, seeing as StartsOnPage has this functionality anyway,
> >
> > Has it?  Can you give an example?
> 
> Sure (From within FvwmConsole):
> 
> FvwmPager 0 3
> Style Foo StartsOnPage 2
> Exec exec xterm -T Foo
> 
> ... will place the new window "Foo" on Desk 2.  Note that this was one
> of the reasons I came up with the "new" StartsOnLocation, which
> effectively deprecated StartsOnDesk/StartsOnScreen, because
> StartsOnDesk is already present in StartsOnPage, and because adding in
> an optional "screen [num]" parameter to StartsOnPage made sense.  Of
> course, StartsOnPage with just one parameter feels wrong because it's
> not a page, it's now a Desk -- hence the name change to
> StartsOnLocation.

Your're right.  StartsOnDesk could have been removed when
StartsOnPage was introduced.

> But this would break too many configs, I feel.

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt
? InitialMapComman.patch
Index: ChangeLog
===================================================================
RCS file: /home/cvs/fvwm/fvwm/ChangeLog,v
retrieving revision 1.3061
diff -u -r1.3061 ChangeLog
--- ChangeLog	30 Dec 2008 13:32:40 -0000	1.3061
+++ ChangeLog	7 Feb 2009 19:44:36 -0000
@@ -1,3 +1,11 @@
+2009-02-07  Dominik Vogt  <dominik(dot)vogt(at)gmx(dot)de>
+
+	* fvwm/events.c (HandleMapRequestKeepRaised):
+	* fvwm/add_window.c (AddWindow):
+	* fvwm/style.h:
+	* fvwm/style.c (style_parse_one_style_option):
+	add new style InitialMapCommand
+
 2008-12-29  Alexandre Julliard  <[email protected]>
 
 	* fvwm/ewmh_events.c (ewmh_WMStateMaxHoriz):
Index: NEWS
===================================================================
RCS file: /home/cvs/fvwm/fvwm/NEWS,v
retrieving revision 1.767
diff -u -r1.767 NEWS
--- NEWS	30 Dec 2008 13:32:40 -0000	1.767
+++ NEWS	7 Feb 2009 19:44:40 -0000
@@ -18,6 +18,9 @@
         ... is now honoured.  Useful with IndexedWindowName as a style
         option.
 
+   - New style InitialMapCommand allows to execute any command
+     when a window is mapped first.
+
 * Bug fixes:
 
    - Fixed compilation without XRender support.
Index: fvwm/add_window.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/add_window.c,v
retrieving revision 1.398
diff -u -r1.398 add_window.c
--- fvwm/add_window.c	6 Aug 2008 17:55:28 -0000	1.398
+++ fvwm/add_window.c	7 Feb 2009 19:44:45 -0000
@@ -2125,8 +2125,8 @@
  *
  */
 FvwmWindow *AddWindow(
-	const exec_context_t *exc, FvwmWindow *ReuseWin,
-	initial_window_options_t * win_opts)
+	const char **ret_initial_map_command, const exec_context_t *exc,
+	FvwmWindow *ReuseWin, initial_window_options_t * win_opts)
 {
 	/* new fvwm window structure */
 	register FvwmWindow *fw;
@@ -2242,6 +2242,11 @@
 			fw->class.res_class);
 	}
 
+	/****** InitialMapCommand ******/
+	*ret_initial_map_command =
+		(style.flags.has_initial_map_command_string) ?
+		SGET_INITIAL_MAP_COMMAND_STRING(style) : NULL;
+
 	/****** state setup ******/
 	setup_icon_boxes(fw, &style);
 	SET_ICONIFIED(fw, 0);
Index: fvwm/add_window.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/add_window.h,v
retrieving revision 1.38
diff -u -r1.38 add_window.h
--- fvwm/add_window.h	17 Nov 2007 11:47:56 -0000	1.38
+++ fvwm/add_window.h	7 Feb 2009 19:44:45 -0000
@@ -58,8 +58,8 @@
 void FetchWmProtocols(
 	FvwmWindow *);
 FvwmWindow *AddWindow(
-	const exec_context_t *exc, FvwmWindow *ReuseWin,
-	initial_window_options_t * win_opts);
+	const char **ret_initial_map_command, const exec_context_t *exc,
+	FvwmWindow *ReuseWin, initial_window_options_t * win_opts);
 void GetWindowSizeHints(
 	FvwmWindow *);
 void free_window_names(
Index: fvwm/events.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/events.c,v
retrieving revision 1.561
diff -u -r1.561 events.c
--- fvwm/events.c	8 Aug 2008 11:44:01 -0000	1.561
+++ fvwm/events.c	7 Feb 2009 19:44:50 -0000
@@ -2878,7 +2878,9 @@
 	initial_window_options_t win_opts_bak;
 	Window ew;
 	FvwmWindow *fw;
+	const char *initial_map_command;
 
+	initial_map_command = NULL;
 	if (win_opts == NULL)
 	{
 		memset(&win_opts_bak, 0, sizeof(win_opts_bak));
@@ -2939,7 +2941,8 @@
 		}
 
 		/* Add decorations. */
-		fw = AddWindow(ea->exc, ReuseWin, win_opts);
+		fw = AddWindow(
+			&initial_map_command, ea->exc, ReuseWin, win_opts);
 		if (fw == AW_NO_WINDOW)
 		{
 			return;
@@ -3055,6 +3058,17 @@
 					(unsigned long)fw);
 #endif
 			}
+			/* TA:  20090125:  We *have* to handle
+			 * InitialMapCommand here and not in AddWindow() to
+			 * allow for correct timings when the window is truly
+			 * mapped. (c.f. things like Iconify.)
+			 */
+			if (initial_map_command != NULL)
+			{
+				execute_function_override_window(
+					NULL, ea->exc,
+					(char *)initial_map_command, 0, fw);
+			}
 			MyXUngrabServer(dpy);
 			break;
 
Index: fvwm/fvwm.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/fvwm.h,v
retrieving revision 1.259
diff -u -r1.259 fvwm.h
--- fvwm/fvwm.h	28 Nov 2008 23:29:27 -0000	1.259
+++ fvwm/fvwm.h	7 Feb 2009 19:44:53 -0000
@@ -594,6 +594,7 @@
 	unsigned has_placement_penalty : 1;
 	unsigned has_placement_percentage_penalty : 1;
 	unsigned has_placement_position_string : 1;
+	unsigned has_initial_map_command_string : 1;
 } style_flags;
 
 typedef struct style_id_t
@@ -679,6 +680,7 @@
 	pl_penalty_struct pl_penalty;
 	pl_percent_penalty_struct pl_percent_penalty;
 	char *pl_position_string;
+	char *initial_map_command_string;
 	style_flags flags;
 	style_flags flag_default;
 	style_flags flag_mask;
Index: fvwm/style.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/style.c,v
retrieving revision 1.260
diff -u -r1.260 style.c
--- fvwm/style.c	19 Oct 2008 12:04:13 -0000	1.260
+++ fvwm/style.c	7 Feb 2009 19:45:04 -0000
@@ -706,6 +706,13 @@
 			*merged_style,
 			strdup(SGET_PLACEMENT_POSITION_STRING(*add_style)));
 	}
+	if (add_style->flags.has_initial_map_command_string)
+	{
+		SAFEFREE(SGET_INITIAL_MAP_COMMAND_STRING(*merged_style));
+		SSET_INITIAL_MAP_COMMAND_STRING(
+			*merged_style,
+			strdup(SGET_INITIAL_MAP_COMMAND_STRING(*add_style)));
+	}
 	/* merge the style flags */
 
 	/*** ATTENTION:
@@ -761,6 +768,7 @@
 	SAFEFREE(SGET_MINI_ICON_NAME(*style));
 	remove_icon_boxes_from_style(style);
 	SAFEFREE(SGET_PLACEMENT_POSITION_STRING(*style));
+	SAFEFREE(SGET_INITIAL_MAP_COMMAND_STRING(*style));
 
 	return;
 }
@@ -2982,6 +2990,17 @@
 			S_SET_USE_INDEXED_ICON_NAME(SCM(*ps), 1);
 			S_SET_USE_INDEXED_ICON_NAME(SCC(*ps), 1);
 		}
+		else if (StrEquals(token, "InitialMapCommand"))
+		{
+			char *s;
+
+			s = (rest != NULL) ? strdup(rest) : NULL;
+			SSET_INITIAL_MAP_COMMAND_STRING(*ps, s);
+			ps->flags.has_initial_map_command_string = on;
+			ps->flag_mask.has_initial_map_command_string = on;
+			ps->change_mask.has_initial_map_command_string = 1;
+			rest = NULL; /* consume the entire string */
+		}
 		else
 		{
 			found = False;
Index: fvwm/style.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/style.h,v
retrieving revision 1.89
diff -u -r1.89 style.h
--- fvwm/style.h	17 Nov 2007 11:47:57 -0000	1.89
+++ fvwm/style.h	7 Feb 2009 19:45:06 -0000
@@ -657,6 +657,10 @@
 	((s).pl_position_string)
 #define SSET_PLACEMENT_POSITION_STRING(s,x)	\
 	((s).pl_position_string = (x))
+#define SGET_INITIAL_MAP_COMMAND_STRING(s) \
+	((s).initial_map_command_string)
+#define SSET_INITIAL_MAP_COMMAND_STRING(s,x)	\
+	((s).initial_map_command_string = (x))
 
 /* function prototypes */
 void lookup_style(FvwmWindow *fw, window_style *styles);

Reply via email to