old Wait syntax

2014-09-02 Thread Dominik Vogt
Just found this comment in CMD_Wait():

  /* nope, multiple tokens - try old syntax */

Actually, apart from the syntax described in the man page (first
and only argument is a window name/class/... pattern), there is
another syntax mode that looks like this:

  Wait garbage-token restofline

With this syntax, the first argument is thrown away.  Then
leading and trailing whitespace is removed from the rest of the
line, and what remains is used as the pattern to wait for.

Does anybody remember where this undocumented extra syntax comes
from?  Is it safe to remove that?

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt



mvwm: master branch updated

2014-09-02 Thread Thomas Adam
The mvwm repository's master branch has been updated.  The following shows
the diffstat and patchsets between the merged result and HEAD.

commit 71a68616768877f5693fb53baa414f4fe21dcdbc
Merge: 55d129f cedbcb6
Author: Thomas Adam tho...@xteddy.org
Date:   Tue Sep 2 21:43:54 2014 +0100

Merge branch 'branch-2_6'

Conflicts:
mvwm/builtins.c

commit cedbcb6cd9a226613f884d7fb4a22b72c151ab02
Merge: 7609bf2 3ca7363
Author: Thomas Adam tho...@xteddy.org
Date:   Tue Sep 2 21:40:40 2014 +0100

Merge remote-tracking branch 'cvs/branch-2_6' into branch-2_6

commit 3ca73635637a1499e635e0081ad08f3857dcc531
Author: domivogt domivogt
Date:   Tue Sep 2 20:29:34 2014 +

* Fix memory leak in wait command.

diff --git a/ChangeLog b/ChangeLog
index a72ea07..5d5bb27 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-09-02  Dominik Vogt  dominik(dot)vogt(at)gmx(dot)de
+
+   * fvwm/builtins.c (CMD_Wait):
+   fixed a memory leak
+
 2014-08-28  Dominik Vogt  dominik(dot)vogt(at)gmx(dot)de
 
* fvwm/menus.c (get_menu_options):
diff --git a/fvwm/builtins.c b/fvwm/builtins.c
index 20f8c4c..0ef90d2 100644
--- a/fvwm/builtins.c
+++ b/fvwm/builtins.c
@@ -2539,6 +2539,7 @@ void CMD_Wait(F_CMD_ARGS)
{
temp++;
}
+   free(wait_string);
wait_string = safestrdup(temp);
for (i = strlen(wait_string) - 1; i = 0 
 isspace(wait_string[i]); i--)




CVS tadam: Update passive grabs tracking modifiers

2014-09-02 Thread cvs
CVSROOT:/home/cvs/fvwm
Module name:fvwm
Changes by: tadam   14/09/02 16:19:33

Modified files:
.  : Tag: branch-2_6 ChangeLog 
fvwm   : Tag: branch-2_6 bindings.c bindings.h events.c 

Log message:
Update passive grabs tracking modifiers

In the case of GTK's link widget which doesn't handle passive grabs
following FVWM's window bindings (which assumes the underlying
application can handle a PointerReplay), update the grabs in this
context by always ungrabbing the button and grabbing it for modifiers
other than ALL_MODIFIERS.

I've had this in testing for three years and recently dusted it off for a
bug report I received for another application with this problem, called
darktable.




CVS domivogt: * Added a comment about GetNextSimpleOption().

2014-09-02 Thread cvs
CVSROOT:/home/cvs/fvwm
Module name:fvwm
Changes by: domivogt14/09/02 16:32:13

Modified files:
fvwm   : Tag: branch-2_6 conditional.c 

Log message:
* Added a comment about GetNextSimpleOption().




Re: GetNextSimpleOption is broken

2014-09-02 Thread Dan Espen
Dominik Vogt dominik.v...@gmx.de writes:

 Just found this comment in CMD_Test:

   /*
* unfortunately, GetNextSimpleOption is
* * broken, does not accept quoted empty 
*/

 Actually, GetNextSimpleOption() is _not_ broken.  The parsing
 library guarantees never to return empty tokens.  This is a
 feature, albeit a questionable one.

The CVS command you are looking for is annotate.

1.107 (migo 13-Aug-05): /* unfortunately, GetNextSimpleOption is

Could be that it was broken when the comment was written.

-- 
Dan Espen



Re: Historical Parsing (twm onwards) [WAS: Re: REWRITE: Parsing]

2014-09-02 Thread Dominik Vogt
Just pushed a new version of the Abnf.

On Tue, Aug 26, 2014 at 10:10:57PM +0100, Dominik Vogt wrote:
 On Tue, Aug 26, 2014 at 03:20:09PM -0400, Dan Espen wrote:
  Thomas Adam tho...@fvwm.org writes:
  I might take the blame for other mis-designed things, but
  as far as I remember, that goes way back.  I think the issue was those
  pretty long commands AddToFunc, etc.  But the + sign is just broken.
  On the other hand, I've never seen it cause a real problem.
  I think Fvwm just scoops up commands so fast that it's unlikely that
  there will be a conflict.
 
 Probably because nobody uses dynamic menus much.  When fvwm reads
 a file or PipeRead input, it does not do anything in between, but
 input from modules cound trigger that.  Anyway, it would be nice
 to have a clean scripting engine that can handle this correctly.
 You'd just have to store a separate '+' context for each source
 from which fvwm reads commands.
 
  It would be nice if Fvwm reported where it found an error
  (line 40 .fvwm/config) which would make the parser aware
  of where commands are coming from and provide a way to fix
  this.  Of course sometimes it would be FvwmAnimate PID 1234,
  20th command.
 
 Good idea.  We should write that down somewhere.

Thomas, could you put this information somewhere?

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt



Re: GetNextSimpleOption is broken

2014-09-02 Thread Thomas Adam
On Tue, Sep 02, 2014 at 10:55:43PM +0100, Dominik Vogt wrote:
 By the way, does anybody know what this infostore stuff is
 about?

https://www.mail-archive.com/fvwm-workers@fvwm.org/msg02706.html

-- Thomas Adam

-- 
Deep in my heart I wish I was wrong.  But deep in my heart I know I am
not. -- Morrissey (Girl Least Likely To -- off of Viva Hate.)



Re: GetNextSimpleOption is broken

2014-09-02 Thread Dominik Vogt
On Tue, Sep 02, 2014 at 11:00:13PM +0100, Thomas Adam wrote:
 On Tue, Sep 02, 2014 at 10:55:43PM +0100, Dominik Vogt wrote:
  By the way, does anybody know what this infostore stuff is
  about?
 
 https://www.mail-archive.com/fvwm-workers@fvwm.org/msg02706.html

Thenks.  Can you write the missing sub-rule for the Test command
(the one that has to do with infostore)?

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt



Re: CVS tadam: Update passive grabs tracking modifiers

2014-09-02 Thread Dominik Vogt
On Tue, Sep 02, 2014 at 04:19:33PM -0500, c...@math.uh.edu wrote:
 Log message:
 Update passive grabs tracking modifiers
 
 In the case of GTK's link widget which doesn't handle passive grabs
 following FVWM's window bindings (which assumes the underlying
 application can handle a PointerReplay), update the grabs in this
 context by always ungrabbing the button and grabbing it for modifiers
 other than ALL_MODIFIERS.
 
 I've had this in testing for three years and recently dusted it off for a
 bug report I received for another application with this problem, called
 darktable.

Can you please explain the problem in even more detail?  Grabbing
is a crucial part of fvwm that I want to understand completely.
(A diff would also be nice for convenience; they're so difficult
to get from CVS.)

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt



Re: GetNextSimpleOption is broken

2014-09-02 Thread Dan Espen
Dominik Vogt dominik.v...@gmx.de writes:

 On Tue, Sep 02, 2014 at 05:48:05PM -0400, Dan Espen wrote:
 Dominik Vogt dominik.v...@gmx.de writes:
 
  Just found this comment in CMD_Test:
 
 /*
  * unfortunately, GetNextSimpleOption is
  * * broken, does not accept quoted empty 
  */
 
  Actually, GetNextSimpleOption() is _not_ broken.  The parsing
  library guarantees never to return empty tokens.  This is a
  feature, albeit a questionable one.
 
 The CVS command you are looking for is annotate.
 
 1.107 (migo 13-Aug-05): /* unfortunately, GetNextSimpleOption is

 Well, I thought it might be worhtwhile to mention it in public
 while we're working on the parser anyway.
  
 Could be that it was broken when the comment was written.

 No, it has always been this way.  This guarantee is used in many
 places where parsing is done, and when I coded
 GetNextSimpleOption() this was in there from the start (because it
 simply uses the same underlying implementation of the tokenisation
 functions as the rest of the parsing library).

 By the way, does anybody know what this infostore stuff is
 about?

Thomas does, but just in case he doesn't find his own email...

https://www.mail-archive.com/fvwm-workers@fvwm.org/msg02706.html

Seems reasonable, but I suggest, from infostore.h:

  MetaInfo *new_metainfo(void);
  void insert_metainfo(char *, char *);
  char *get_metainfo_value(const char *);
  void print_infostore(void);

the new, insert and get functions should all
use the word infostore, not metainfo.

-- 
Dan Espen



Re: GetNextSimpleOption is broken

2014-09-02 Thread Dominik Vogt
On Tue, Sep 02, 2014 at 06:07:44PM -0400, Dan Espen wrote:
 Dominik Vogt dominik.v...@gmx.de writes:
  By the way, does anybody know what this infostore stuff is
  about?
 
 Thomas does, but just in case he doesn't find his own email...
 
 https://www.mail-archive.com/fvwm-workers@fvwm.org/msg02706.html
 
 Seems reasonable, but I suggest, from infostore.h:
 
   MetaInfo *new_metainfo(void);
   void insert_metainfo(char *, char *);
   char *get_metainfo_value(const char *);
   void print_infostore(void);
 
 the new, insert and get functions should all
 use the word infostore, not metainfo.

Hm, is this in a stable release already?  I find the syntax a bit
clumsy (the name is not very intuitive, and $[infostore] is so
much to type), and if while we're rewriting the parser we might
clean that up as well.

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt



Re: Historical Parsing (twm onwards) [WAS: Re: REWRITE: Parsing]

2014-09-02 Thread Thomas Adam
On Tue, Sep 02, 2014 at 10:51:05PM +0100, Dominik Vogt wrote:
 Just pushed a new version of the Abnf.
 
 On Tue, Aug 26, 2014 at 10:10:57PM +0100, Dominik Vogt wrote:
  On Tue, Aug 26, 2014 at 03:20:09PM -0400, Dan Espen wrote:
   Thomas Adam tho...@fvwm.org writes:
   I might take the blame for other mis-designed things, but
   as far as I remember, that goes way back.  I think the issue was those
   pretty long commands AddToFunc, etc.  But the + sign is just broken.
   On the other hand, I've never seen it cause a real problem.
   I think Fvwm just scoops up commands so fast that it's unlikely that
   there will be a conflict.
  
  Probably because nobody uses dynamic menus much.  When fvwm reads
  a file or PipeRead input, it does not do anything in between, but
  input from modules cound trigger that.  Anyway, it would be nice
  to have a clean scripting engine that can handle this correctly.
  You'd just have to store a separate '+' context for each source
  from which fvwm reads commands.
  
   It would be nice if Fvwm reported where it found an error
   (line 40 .fvwm/config) which would make the parser aware
   of where commands are coming from and provide a way to fix
   this.  Of course sometimes it would be FvwmAnimate PID 1234,
   20th command.
  
  Good idea.  We should write that down somewhere.
 
 Thomas, could you put this information somewhere?

Done.  It's in the TODO for now.

-- Thomas Adam

-- 
Deep in my heart I wish I was wrong.  But deep in my heart I know I am
not. -- Morrissey (Girl Least Likely To -- off of Viva Hate.)



Re: GetNextSimpleOption is broken

2014-09-02 Thread Dominik Vogt
On Tue, Sep 02, 2014 at 11:09:49PM +0100, Thomas Adam wrote:
 On 2 September 2014 23:04, Dominik Vogt dominik.v...@gmx.de wrote:
  Can you write the missing sub-rule for the Test command
  (the one that has to do with infostore)?
 
 Will do in the next half-hour or so.

Great.  This is the last missing piece of the conditional commands.
I'm eager to get over with the basic parsing description draft so
I can try some practical things.  :-)

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt



Re: GetNextSimpleOption is broken

2014-09-02 Thread Thomas Adam
On Tue, Sep 02, 2014 at 11:11:56PM +0100, Dominik Vogt wrote:
 On Tue, Sep 02, 2014 at 06:07:44PM -0400, Dan Espen wrote:
  Dominik Vogt dominik.v...@gmx.de writes:
   By the way, does anybody know what this infostore stuff is
   about?
  
  Thomas does, but just in case he doesn't find his own email...
  
  https://www.mail-archive.com/fvwm-workers@fvwm.org/msg02706.html
  
  Seems reasonable, but I suggest, from infostore.h:
  
MetaInfo *new_metainfo(void);
void insert_metainfo(char *, char *);
char *get_metainfo_value(const char *);
void print_infostore(void);
  
  the new, insert and get functions should all
  use the word infostore, not metainfo.
 
 Hm, is this in a stable release already?  I find the syntax a bit
 clumsy (the name is not very intuitive, and $[infostore] is so
 much to type), and if while we're rewriting the parser we might
 clean that up as well.

I don't mind.  But I certainly _dislike_ the ridiculous tokens we have
now in terms of w.foo, i.foo, etc., etc.  I'd much rather we
deferred that part until much later on, as I've a few notes regarding
expansion versus information coming out of fvwm (and how that's stored
in fvwm, etc.)

-- Thomas Adam

-- 
Deep in my heart I wish I was wrong.  But deep in my heart I know I am
not. -- Morrissey (Girl Least Likely To -- off of Viva Hate.)



Re: GetNextSimpleOption is broken

2014-09-02 Thread Dan Espen
Dominik Vogt dominik.v...@gmx.de writes:

 On Tue, Sep 02, 2014 at 06:07:44PM -0400, Dan Espen wrote:
 Dominik Vogt dominik.v...@gmx.de writes:
  By the way, does anybody know what this infostore stuff is
  about?
 
 Thomas does, but just in case he doesn't find his own email...
 
 https://www.mail-archive.com/fvwm-workers@fvwm.org/msg02706.html
 
 Seems reasonable, but I suggest, from infostore.h:
 
   MetaInfo *new_metainfo(void);
   void insert_metainfo(char *, char *);
   char *get_metainfo_value(const char *);
   void print_infostore(void);
 
 the new, insert and get functions should all
 use the word infostore, not metainfo.

 Hm, is this in a stable release already?  I find the syntax a bit
 clumsy (the name is not very intuitive, and $[infostore] is so
 much to type), and if while we're rewriting the parser we might
 clean that up as well.

We have SetEnv.
Does SetVar work for you?

All of 2.6 is stable.

-- 
Dan Espen



Re: GetNextSimpleOption is broken

2014-09-02 Thread Dan Espen
Thomas Adam tho...@fvwm.org writes:

 On Tue, Sep 02, 2014 at 11:11:56PM +0100, Dominik Vogt wrote:
 On Tue, Sep 02, 2014 at 06:07:44PM -0400, Dan Espen wrote:
  Dominik Vogt dominik.v...@gmx.de writes:
   By the way, does anybody know what this infostore stuff is
   about?
  
  Thomas does, but just in case he doesn't find his own email...
  
  https://www.mail-archive.com/fvwm-workers@fvwm.org/msg02706.html
  
  Seems reasonable, but I suggest, from infostore.h:
  
MetaInfo *new_metainfo(void);
void insert_metainfo(char *, char *);
char *get_metainfo_value(const char *);
void print_infostore(void);
  
  the new, insert and get functions should all
  use the word infostore, not metainfo.
 
 Hm, is this in a stable release already?  I find the syntax a bit
 clumsy (the name is not very intuitive, and $[infostore] is so
 much to type), and if while we're rewriting the parser we might
 clean that up as well.

 I don't mind.  But I certainly _dislike_ the ridiculous tokens we have
 now in terms of w.foo, i.foo, etc., etc.  I'd much rather we
 deferred that part until much later on, as I've a few notes regarding
 expansion versus information coming out of fvwm (and how that's stored
 in fvwm, etc.)

Just kibitzing here, but when I do re-factoring,
I like to start with consistent names.
I could see how changing names might cause git - cvs issues.

-- 
Dan Espen



Re: GetNextSimpleOption is broken

2014-09-02 Thread Dominik Vogt
On Tue, Sep 02, 2014 at 11:15:44PM +0100, Thomas Adam wrote:
 On Tue, Sep 02, 2014 at 11:11:56PM +0100, Dominik Vogt wrote:
  On Tue, Sep 02, 2014 at 06:07:44PM -0400, Dan Espen wrote:
   Dominik Vogt dominik.v...@gmx.de writes:
By the way, does anybody know what this infostore stuff is
about?
   
   Thomas does, but just in case he doesn't find his own email...
   
   https://www.mail-archive.com/fvwm-workers@fvwm.org/msg02706.html
   
   Seems reasonable, but I suggest, from infostore.h:
   
 MetaInfo *new_metainfo(void);
 void insert_metainfo(char *, char *);
 char *get_metainfo_value(const char *);
 void print_infostore(void);
   
   the new, insert and get functions should all
   use the word infostore, not metainfo.
  
  Hm, is this in a stable release already?  I find the syntax a bit
  clumsy (the name is not very intuitive, and $[infostore] is so
  much to type), and if while we're rewriting the parser we might
  clean that up as well.
 
 I don't mind.  But I certainly _dislike_ the ridiculous tokens we have
 now in terms of w.foo, i.foo, etc., etc.

Agreed.

 I'd much rather we
 deferred that part until much later on, as I've a few notes regarding
 expansion versus information coming out of fvwm (and how that's stored
 in fvwm, etc.)

Yes, of course.  Expansion is a terrible mess right now and needs
to be cleaned up, and that will require much thought and planning.

I'd prefer to either make expansion much more similar to what
shells do (i.e. make the general syntax more shell-like) *or* to
do something completely different that does not interfere as much
with the parsing of the underlying shell (maybe easier to
understand and use).

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt



Re: GetNextSimpleOption is broken

2014-09-02 Thread Dominik Vogt
On Tue, Sep 02, 2014 at 06:18:14PM -0400, Dan Espen wrote:
 Dominik Vogt dominik.v...@gmx.de writes:
 
  On Tue, Sep 02, 2014 at 06:07:44PM -0400, Dan Espen wrote:
  Dominik Vogt dominik.v...@gmx.de writes:
   By the way, does anybody know what this infostore stuff is
   about?
  
  Thomas does, but just in case he doesn't find his own email...
  
  https://www.mail-archive.com/fvwm-workers@fvwm.org/msg02706.html
  
  Seems reasonable, but I suggest, from infostore.h:
  
MetaInfo *new_metainfo(void);
void insert_metainfo(char *, char *);
char *get_metainfo_value(const char *);
void print_infostore(void);
  
  the new, insert and get functions should all
  use the word infostore, not metainfo.
 
  Hm, is this in a stable release already?  I find the syntax a bit
  clumsy (the name is not very intuitive, and $[infostore] is so
  much to type), and if while we're rewriting the parser we might
  clean that up as well.
 
 We have SetEnv.
 Does SetVar work for you?

Of course, but it's closely related to parsing and command line
expansion.

 All of 2.6 is stable.

But 2.6.6 is not released.

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt



Re: GetNextSimpleOption is broken

2014-09-02 Thread Dominik Vogt
On Tue, Sep 02, 2014 at 06:22:28PM -0400, Dan Espen wrote:
  I don't mind.  But I certainly _dislike_ the ridiculous tokens we have
  now in terms of w.foo, i.foo, etc., etc.  I'd much rather we
  deferred that part until much later on, as I've a few notes regarding
  expansion versus information coming out of fvwm (and how that's stored
  in fvwm, etc.)
 
 Just kibitzing here, but when I do re-factoring,
 I like to start with consistent names.

 I could see how changing names might cause git - cvs issues.

That's actually something I'd like to move as far into the future
as possible.  I'd rather start with all the changes that would not
prevent to push fixes in fvwm to the new code.  But eventually it
will happen.

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt



Re: GetNextSimpleOption is broken

2014-09-02 Thread Thomas Adam
On Tue, Sep 02, 2014 at 11:14:11PM +0100, Dominik Vogt wrote:
 Great.  This is the last missing piece of the conditional commands.
 I'm eager to get over with the basic parsing description draft so
 I can try some practical things.  :-)

Done.

Heh, I've sneakily been starting a few things, but left it...

-- Thomas Adam

-- 
Deep in my heart I wish I was wrong.  But deep in my heart I know I am
not. -- Morrissey (Girl Least Likely To -- off of Viva Hate.)



mvwm: document-parsing branch updated

2014-09-02 Thread Thomas Adam
The mvwm repository's document-parsing branch has been updated.

The following shows the diffstat and patchsets between the merged result
and HEAD.

commit 9cceb32e1c4cc012be602f7bda06328f07f53142
Author: Thomas Adam tho...@xteddy.org
Date:   Tue Sep 2 23:40:03 2014 +0100

Fixed typo
---
 rewrite-notes/parsing | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/rewrite-notes/parsing b/rewrite-notes/parsing
index bd33ff5..bddf387 100644
--- a/rewrite-notes/parsing
+++ b/rewrite-notes/parsing
@@ -755,7 +755,7 @@ COLORSETKEYWORD =/ Back
 COLORSETKEYWORD =/ Background
 COLORSETKEYWORD =/ hi
 COLORSETKEYWORD =/ Hilite
-COLORSETKEYWORD =/ Hilight
+COLORSETKEYWORD =/ Hilight
 COLORSETKEYWORD =/ sh
 COLORSETKEYWORD =/ Shade
 COLORSETKEYWORD =/ Shadow




mvwm: document-parsing branch updated

2014-09-02 Thread Thomas Adam
The mvwm repository's document-parsing branch has been updated.

The following shows the diffstat and patchsets between the merged result
and HEAD.

commit fda352594c6ecae421265e464012a5ccf47df3bf
Author: Thomas Adam tho...@xteddy.org
Date:   Tue Sep 2 23:51:33 2014 +0100

Few more typo fixes
---
 rewrite-notes/parsing | 20 +++-
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/rewrite-notes/parsing b/rewrite-notes/parsing
index bddf387..8555c62 100644
--- a/rewrite-notes/parsing
+++ b/rewrite-notes/parsing
@@ -1219,7 +1219,7 @@ CMD_TITLE = Title
 ; note: syntax description complete
 
 CMD_TITLESTYLE = TitleStyle
-!!!
+;!!!
 
 CMD_SETENV = SetEnv [TOKEN_ENVVAR [TOKEN_ENVVAL]]
 TOKEN_ENVVAR = TOKEN
@@ -1417,6 +1417,8 @@ CMD_WINDOWID = WindowId
 ; note: syntax description complete
 WINDOWIDSCREENNUM = POSINT
 ; note: valid range is 0 to number of screens - 1
+; note: mvwm has replaced Xinerama with XRandr, therfore using integets to
+;   refer to monitors won't work.
 WINDOWID = LONGINT
 ; note: long value parsed by strtol without error checking
 
@@ -1461,14 +1463,14 @@ IMAGEFILE = TOKEN
 ; note: if file not found, try again with IMAGEFILE .gz
 
 ; parsed by parse_gravity_argument
-DIR_N = - / N / NorthTop / t / Up / u
-DIR_E =/ ] / E / East / Right / r / Right / r
-DIR_S =/ _ / S / South / Bottom / b / Down / d
-DIR_W =/ [ / W / West / Left / l / Left / l
-DIR_NE =/ ^ / NE / NorthEast / TopRight / tr / UpRight / ur
-DIR_SE =/  / SE / SouthEast / BottomRight / br / DownRight / dr
-DIR_SW =/ v / SW / SouthWest / BottomLeft / bl / DownLeft / dl
-DIR_NE =/  / NW / NorthWest / TopLeft / tl / UpLeft / ul
+DIR_N = - / N / North / Top / t / Up / u
+DIR_E = ] / E / East / Right / r / Right / r
+DIR_S = _ / S / South / Bottom / b / Down / d
+DIR_W = [ / W / West / Left / l / Left / l
+DIR_NE = ^ / NE / NorthEast / TopRight / tr / UpRight / ur
+DIR_SE =  / SE / SouthEast / BottomRight / br / DownRight / dr
+DIR_SW = v / SW / SouthWest / BottomLeft / bl / DownLeft / dl
+DIR_NE =  / NW / NorthWest / TopLeft / tl / UpLeft / ul
 DIR_C = . / C / Center / Centre
 DIRS_MAJOR = DIR_N / DIR_E / DIR_S / DIR_W
 DIRS_MINOR = DIRS_MAIN / DIR_NE / DIR_SE / DIR_SW / DIR_NW