Hello all,

Something I've seen an increase of lately, on the fvwm list and
particularly on IRC and the forums, is the question of:  "What are the
default mouse/key bindings of fvwm"?  To which the answer varies,
since invariably the question is:  "Can I list all my bindings fvwm
knows about?"

Well, with the attached patch, you can.  I've added it to PrintInfo,
since it really is only useful in certain circumstances.

Dominik:   I've deliberately not restructured this patch to sit on top
of the InitialMapCommand patches -- so if you consider applying this
patch along with that one, you might get some conflicts in NEWS,
AUTHORS and Changelog.  Hopefully shouldn't be a problem though.

Comment/suggestions welcome as always.

-- Thomas Adam
Index: AUTHORS
===================================================================
RCS file: /home/cvs/fvwm/fvwm/AUTHORS,v
retrieving revision 1.130
diff -u -r1.130 AUTHORS
--- AUTHORS	19 Oct 2008 12:04:12 -0000	1.130
+++ AUTHORS	8 Feb 2009 02:27:54 -0000
@@ -15,6 +15,7 @@
 StartShaded style option.
 Introduce the command expansion placeholder:  $[w.visiblename]
 Make style matching honour a window's visible name (c.f. $[w.visiblename])
+Added "bindings" option to PrintInfo command useful for debugging.
 
 Serge (gentoosiast) Koksharov:
 Documentation fixes, bug fixes.
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	8 Feb 2009 02:28:04 -0000
@@ -1,3 +1,16 @@
+2009-02-05  Thomas Adam <[email protected]>
+	* libs/charmap.c (charmap_table_to_string):
+	* libs/charmap.h:
+	Introduce charmap_to_string function which is used to build up a
+	binding string, for use with PrintInfo.
+
+	* fvwm/bindings.c (print_bindings):
+	Introduce print_bindings to print all bindings known to fvwm.
+
+	* fvwm/builtins.c (CMD_PrintInfo):
+	* fvwm/builtins.h:
+	Add support for "binding" as an option to PrintInfo.
+
 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	8 Feb 2009 02:28:05 -0000
@@ -18,6 +18,9 @@
         ... is now honoured.  Useful with IndexedWindowName as a style
         option.
 
+   - New option to PrintInfo, "bindings" which prints out all of the Key,
+     PointerKey, Mouse and Stroke bindings which fvwm knows about.
+
 * Bug fixes:
 
    - Fixed compilation without XRender support.
Index: doc/commands/PrintInfo.xml
===================================================================
RCS file: /home/cvs/fvwm/fvwm/doc/commands/PrintInfo.xml,v
retrieving revision 1.4
diff -u -r1.4 PrintInfo.xml
--- doc/commands/PrintInfo.xml	16 Jun 2007 12:38:46 -0000	1.4
+++ doc/commands/PrintInfo.xml	8 Feb 2009 02:28:05 -0000
@@ -57,4 +57,10 @@
 <replaceable>verbose</replaceable>
 can be 1.</para>
 
+<para><fvwmopt cms="PrintInfo" opt="bindings"/>
+which prints information on all the bindings fvwm has:  key, mouse and
+stroke bindings.
+<replaceable>verbose</replaceable>
+has no effect with this option.</para>
+
 </section>
Index: fvwm/bindings.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/bindings.c,v
retrieving revision 1.103
diff -u -r1.103 bindings.c
--- fvwm/bindings.c	23 Nov 2007 08:49:11 -0000	1.103
+++ fvwm/bindings.c	8 Feb 2009 02:28:10 -0000
@@ -639,6 +639,60 @@
 	return;
 }
 
+void print_bindings(int verbose)
+{
+	Binding *b;
+	
+	fprintf(stderr, "Current list of bindings:\n\n");
+	
+	for (b = Scr.AllBindings; b != NULL; b = b->NextBinding)
+	{
+		/* Key, PointerKey, Mouse, Stroke. */
+		char *binding_type = NULL;
+		char type[20];
+		switch (b->type)
+		{
+			case BIND_KEYPRESS:
+				binding_type = "Key";
+				sprintf(type, "%s", b->key_name);
+				break;
+			case BIND_PKEYPRESS:
+				binding_type = "PointerKey";
+				sprintf(type, "%s", b->key_name);
+				break;
+			case BIND_BUTTONPRESS:
+			case BIND_BUTTONRELEASE:
+			       binding_type = "Mouse";
+			       sprintf(type, "%d", b->Button_Key);
+			       break;
+			case BIND_STROKE:
+			      binding_type = "Stroke";
+			      sprintf(type, "%s\t%d", (char *)b->Stroke_Seq,
+					      b->Button_Key);
+			      break;
+		}
+
+		char *mod_string = charmap_table_to_string(
+				MaskUsedModifiers(b->Modifier),key_modifiers);
+		char *context_string = charmap_table_to_string(
+				b->Context, win_contexts);
+		char win_name[260] = "";
+
+		if (b->windowName != NULL)
+			sprintf(win_name, " (%s)", b->windowName);
+
+		fprintf(stderr, "%s %s\t%s\t%s\t%s\t%s\n",
+				binding_type, win_name, type, 
+				context_string, mod_string, 
+				(char *)b->Action);
+		
+		free (mod_string);
+		free (context_string);
+	}
+
+
+}
+
 /* ---------------------------- interface functions ------------------------ */
 
 /* Removes all unused modifiers from in_modifiers */
Index: fvwm/builtins.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/builtins.c,v
retrieving revision 1.432
diff -u -r1.432 builtins.c
--- fvwm/builtins.c	28 Nov 2008 23:29:27 -0000	1.432
+++ fvwm/builtins.c	8 Feb 2009 02:28:12 -0000
@@ -2700,6 +2700,10 @@
 	{
 		PicturePrintImageCache(verbose);
 	}
+	else if (StrEquals(subject, "Bindings"))
+	{
+		print_bindings(verbose);
+	}
 	else
 	{
 		fvwm_msg(ERR, "PrintInfo",
Index: fvwm/builtins.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/builtins.h,v
retrieving revision 1.22
diff -u -r1.22 builtins.h
--- fvwm/builtins.h	29 Jun 2003 19:53:23 -0000	1.22
+++ fvwm/builtins.h	8 Feb 2009 02:28:12 -0000
@@ -10,5 +10,6 @@
 Bool ReadDecorFace(char *s, DecorFace *df, int button, int verbose);
 void FreeDecorFace(Display *dpy, DecorFace *df);
 void update_fvwm_colorset(int cset);
+void print_bindings(int verbose);
 
 #endif /* BUILTINS_H */
Index: libs/charmap.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/libs/charmap.c,v
retrieving revision 1.2
diff -u -r1.2 charmap.c
--- libs/charmap.c	2 Nov 2003 17:04:44 -0000	1.2
+++ libs/charmap.c	8 Feb 2009 02:28:19 -0000
@@ -19,8 +19,10 @@
 #include "config.h"
 #include <stdio.h>
 #include <ctype.h>
+#include <string.h>
 
 #include "charmap.h"
+#include "safemalloc.h"
 
 /* ---------------------------- local definitions -------------------------- */
 
@@ -102,3 +104,30 @@
 
 	return c;
 }
+
+/* Used from "PrintInfo Bindings". */
+char *charmap_table_to_string(int mask, charmap_t *table)
+{
+	char *allmods = safemalloc (sizeof(table));
+	memset (allmods, '\0', sizeof(table));
+	
+	int modmask = mask;
+
+	for (; table->key !=0; table++)
+	{
+		char *c = safemalloc (sizeof(table->key));
+		memset (c, '\0', sizeof(c));
+		
+		strcpy(c, (char *)&table->key);
+		*c = toupper(*c);
+		
+		if (modmask & table->value)
+		{
+			modmask |= table->value;
+			strcat(allmods, c);
+		}
+		modmask &= ~table->value;
+		free(c);
+	}
+	return allmods;
+}
Index: libs/charmap.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/libs/charmap.h,v
retrieving revision 1.1
diff -u -r1.1 charmap.h
--- libs/charmap.h	5 Jul 2003 01:37:47 -0000	1.1
+++ libs/charmap.h	8 Feb 2009 02:28:19 -0000
@@ -27,4 +27,6 @@
 	int *ret, const char *string, charmap_t *table, char *errstring);
 char charmap_mask_to_char(int mask, charmap_t *table);
 
+char *charmap_table_to_string(int mask, charmap_t *table);
+
 #endif /* CHARMAP_H */

Reply via email to