I made a patch to implement the vector offset additions I suggested a
while ago on the FVWM-list.

I followed the instructions on the web for CVS, I hope I did everything
correct.

With this you can do for example:

ButtonStyle 2 5 [EMAIL PROTECTED] [EMAIL PROTECTED] [EMAIL PROTECTED] [EMAIL 
PROTECTED] [EMAIL PROTECTED]

to get a button that is aligned with an absolute number of pixels from the
border.
With this it's also possible to get lines of double witdh by using offset
of 1 pixel.

//Marcus
Index: ChangeLog
===================================================================
RCS file: /home/cvs/fvwm/fvwm/ChangeLog,v
retrieving revision 1.2103
diff -u -u -r1.2103 ChangeLog
--- ChangeLog   2002/10/25 11:11:43     1.2103
+++ ChangeLog   2002/10/26 11:14:00
@@ -1,3 +1,17 @@
+2002-10-26  Marcus Lundblad <[EMAIL PROTECTED]>
+       * fvwm/screen.h (vector_coords):
+       added fields for offsets
+       * fvwm/builtins.c (ReadDecorFace):
+       rewrote parser for vector definitions to accept optinal
+       offsets
+       * fvwm/fvwm.c (LoadDefaultLeftButton):
+         (LoadDefaultRightButton)
+       set default values for offsets
+       * fvwm/borders.c (border_draw_vector_to_pixmap):
+       updated XDrawLine call to take offsets into account
+       * fvwm/fvwm.1.in:
+       documented new options for vector offsets
+       
 2002-10-25  Dominik Vogt  <[EMAIL PROTECTED]>
 
        * fvwm/functable.c (func_table):
Index: fvwm/borders.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/borders.c,v
retrieving revision 1.218
diff -u -u -r1.218 borders.c
--- fvwm/borders.c      2002/10/17 11:01:06     1.218
+++ fvwm/borders.c      2002/10/26 11:14:06
@@ -1540,12 +1540,17 @@
                        /* don't draw a line */
                        continue;
                }
+
                XDrawLine(
                        dpy, dest_pix, gcs[coords->c[i]],
-                       pixmap_g->width * coords->x[i-1] / 100,
-                       pixmap_g->height * coords->y[i-1] / 100,
-                       pixmap_g->width * coords->x[i] / 100,
-                       pixmap_g->height * coords->y[i] / 100);
+                       pixmap_g->width * coords->x[i-1] / 100 + 
+                                         coords->xoff[i-1],
+                       pixmap_g->height * coords->y[i-1] / 100 +
+                                          coords->yoff[i-1],
+                       pixmap_g->width * coords->x[i] / 100 +
+                                         coords->xoff[i],
+                       pixmap_g->height * coords->y[i] / 100 +
+                                          coords->yoff[i]);
        }
 
        return;
Index: fvwm/builtins.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/builtins.c,v
retrieving revision 1.378
diff -u -u -r1.378 builtins.c
--- fvwm/builtins.c     2002/10/24 07:21:43     1.378
+++ fvwm/builtins.c     2002/10/26 11:14:35
@@ -1159,6 +1159,15 @@
                {
                        free (df->u.vector.y);
                }
+               /* free offsets for coord */
+               if (df->u.vector.xoff)
+               {
+                 free(df->u.vector.xoff);
+               }
+               if(df->u.vector.yoff)
+               {
+                 free(df->u.vector.xoff);
+               }
                if (df->u.vector.c)
                {
                        free (df->u.vector.c);
@@ -1292,6 +1301,8 @@
                        vc->use_fgbg = 0;
                        vc->x = safemalloc(sizeof(char) * num_coords);
                        vc->y = safemalloc(sizeof(char) * num_coords);
+                       vc->xoff = safemalloc(sizeof(char) * num_coords);
+                       vc->yoff = safemalloc(sizeof(char) * num_coords);
                        vc->c = safemalloc(sizeof(char) * num_coords);
 
                        /* get the points */
@@ -1299,13 +1310,70 @@
                        {
                                int x;
                                int y;
+                               int xoff = 0;
+                               int yoff = 0;
                                int c;
+                               Bool valid = True;
 
-                               /* X x Y @ line_style */
-                               num = sscanf(
-                                       s,"[EMAIL PROTECTED]", &x, &y, &c, 
&offset);
-                               if (num != 3)
+                               /*printf(stderr,"Button: %s\n",s);*/
+
+                               /* read X-coord */
+                               num = sscanf(s,"%d%n",&x,&offset);
+                               if(num != 1)
+                                 valid = False;
+                               if(valid)
+                               {
+                                 s += offset;
+                                 /* check for offest */
+                                 if(*s == '+' || *s == '-')
+                                 {
+                                   num = sscanf(s,"%d%n",&xoff,&offset);
+                                   s += offset;
+                                   if(num != 1)
+                                     valid = False;
+                                 }
+                                 if(*s != 'x')
+                                   valid = False;
+                                 s++;
+                               }
+                                
+                               if(valid)
                                {
+                                 /* read y-coord */
+                                 num = sscanf(s,"%d%n",&y,&offset);
+                                 if(num != 1)
+                                   valid = False;  
+                               }
+                               if(valid) 
+                               {
+                                 s += offset;
+                                 /* if a posstive vector offset was 
+                                    specified*/
+                                 if(*s == '+' || *s == '-')
+                                 {
+                                   num = sscanf(s,"%d%n",&yoff,&offset);
+                                   s += offset;
+                                   if(num != 1)
+                                     valid = False;
+                                 }
+                                 
+                                 if(*s != '@')
+                                   valid = False;
+                                 /* eat the '@' */
+                                 s++;
+                               }
+
+                               if(valid)
+                               {
+                                 /* read the line style */
+                                 num = sscanf(s,"%d%n",&c,&offset);
+                                 if(num != 1)
+                                   valid = False;
+                                 s += offset;
+                               }
+                                       
+                               if(!valid)
+                               {
                                        if (verbose)
                                        {
                                                fvwm_msg(
@@ -1316,9 +1384,13 @@
                                        free(vc->x);
                                        free(vc->y);
                                        free(vc->c);
+                                       free(vc->xoff);
+                                       free(vc->yoff);
                                        vc->x = NULL;
                                        vc->y = NULL;
                                        vc->c = NULL;
+                                       vc->xoff = NULL;
+                                       vc->yoff = NULL;
                                        return False;
                                }
                                if (x < 0)
@@ -1344,11 +1416,12 @@
                                vc->x[i] = x;
                                vc->y[i] = y;
                                vc->c[i] = c;
+                               vc->xoff[i] = xoff;
+                               vc->yoff[i] = yoff;
                                if (c == 2 || c == 3)
                                {
                                        vc->use_fgbg = 1;
                                }
-                               s += offset;
                        }
                        memset(&df->style, 0, sizeof(df->style));
                        DFS_FACE_TYPE(df->style) = VectorButton;
Index: fvwm/fvwm.1.in
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/fvwm.1.in,v
retrieving revision 1.26
diff -u -u -r1.26 fvwm.1.in
--- fvwm/fvwm.1.in      2002/10/24 07:21:43     1.26
+++ fvwm/fvwm.1.in      2002/10/26 11:15:13
@@ -7649,7 +7649,8 @@
 .IR X x Y @ C .
 .IR X " and " Y
 are point coordinates inside the button, given in percents
-(from 0 to 100).
+(from 0 to 100) with an optional absolute offset in pixels, given as
++off or -off for a positive and a negative offset of off pixels respetivly.
 .I C
 specifies a line color (0 - the shadow color, 1 - the highlight
 color, 2 - the background color, 3 - the foreground color, 4 -
Index: fvwm/fvwm.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/fvwm.c,v
retrieving revision 1.336
diff -u -u -r1.336 fvwm.c
--- fvwm/fvwm.c 2002/10/22 00:48:32     1.336
+++ fvwm/fvwm.c 2002/10/26 11:15:23
@@ -834,6 +834,7 @@
 static void LoadDefaultLeftButton(DecorFace *df, int i)
 {
        struct vector_coords *v = &df->u.vector;
+       int i = 0;
 
        memset(&df->style, 0, sizeof(df->style));
        DFS_FACE_TYPE(df->style) = DefaultVectorButton;
@@ -844,6 +845,8 @@
                v->num = 5;
                v->x = safemalloc(sizeof(char) * v->num);
                v->y = safemalloc(sizeof(char) * v->num);
+               v->xoff = safemalloc(sizeof(char) * v->num);
+               v->yoff = safemalloc(sizeof(char) * v->num);
                v->c = safecalloc(v->num, sizeof(char));
                v->x[0] = 22;
                v->y[0] = 39;
@@ -863,6 +866,8 @@
                v->num = 5;
                v->x = safemalloc(sizeof(char) * v->num);
                v->y = safemalloc(sizeof(char) * v->num);
+               v->xoff = safemalloc(sizeof(char) * v->num);
+               v->yoff = safemalloc(sizeof(char) * v->num);
                v->c = safecalloc(v->num, sizeof(char));
                v->x[0] = 32;
                v->y[0] = 45;
@@ -881,6 +886,8 @@
                v->num = 5;
                v->x = safemalloc(sizeof(char) * v->num);
                v->y = safemalloc(sizeof(char) * v->num);
+               v->xoff = safemalloc(sizeof(char) * v->num);
+               v->yoff = safemalloc(sizeof(char) * v->num);
                v->c = safecalloc(v->num, sizeof(char));
                v->x[0] = 49;
                v->y[0] = 49;
@@ -900,6 +907,8 @@
                v->num = 5;
                v->x = safemalloc(sizeof(char) * v->num);
                v->y = safemalloc(sizeof(char) * v->num);
+               v->xoff = safemalloc(sizeof(char) * v->num);
+               v->yoff = safemalloc(sizeof(char) * v->num);
                v->c = safecalloc(v->num, sizeof(char));
                v->x[0] = 32;
                v->y[0] = 45;
@@ -917,6 +926,13 @@
                break;
        }
 
+       /* set offsets to 0, for all buttons */
+       for(i = 0 ; i < v->num ; i++)
+       {
+         v->xoff[i] = 0;
+         v->yoff[i] = 0;
+       }
+       
        return;
 }
 
@@ -929,6 +945,7 @@
 static void LoadDefaultRightButton(DecorFace *df, int i)
 {
        struct vector_coords *v = &df->u.vector;
+       int i = 0;
 
        memset(&df->style, 0, sizeof(df->style));
        DFS_FACE_TYPE(df->style) = DefaultVectorButton;
@@ -939,6 +956,8 @@
                v->num = 5;
                v->x = safemalloc(sizeof(char) * v->num);
                v->y = safemalloc(sizeof(char) * v->num);
+               v->xoff = safemalloc(sizeof(char) * v->num);
+               v->yoff = safemalloc(sizeof(char) * v->num);
                v->c = safecalloc(v->num, sizeof(char));
                v->x[0] = 25;
                v->y[0] = 25;
@@ -958,6 +977,8 @@
                v->num = 5;
                v->x = safemalloc(sizeof(char) * v->num);
                v->y = safemalloc(sizeof(char) * v->num);
+               v->xoff = safemalloc(sizeof(char) * v->num);
+               v->yoff = safemalloc(sizeof(char) * v->num);
                v->c = safecalloc(v->num, sizeof(char));
                v->x[0] = 39;
                v->y[0] = 39;
@@ -977,6 +998,8 @@
                v->num = 5;
                v->x = safemalloc(sizeof(char) * v->num);
                v->y = safemalloc(sizeof(char) * v->num);
+               v->xoff = safemalloc(sizeof(char) * v->num);
+               v->yoff = safemalloc(sizeof(char) * v->num);
                v->c = safecalloc(v->num, sizeof(char));
                v->x[0] = 49;
                v->y[0] = 49;
@@ -996,6 +1019,8 @@
                v->num = 5;
                v->x = safemalloc(sizeof(char) * v->num);
                v->y = safemalloc(sizeof(char) * v->num);
+               v->xoff = safemalloc(sizeof(char) * v->num);
+               v->yoff = safemalloc(sizeof(char) * v->num);
                v->c = safecalloc(v->num, sizeof(char));
                v->x[0] = 36;
                v->y[0] = 36;
@@ -1011,6 +1036,13 @@
                v->y[4] = 36;
                v->c[4] = 1;
                break;
+       }
+
+       /* set offsets to 0, for all buttons */
+       for(i = 0 ; i < v->num ; i++)
+       {
+         v->xoff[i] = 0;
+         v->yoff[i] = 0;
        }
 
        return;
Index: fvwm/screen.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/screen.h,v
retrieving revision 1.136
diff -u -u -r1.136 screen.h
--- fvwm/screen.h       2002/10/21 11:10:40     1.136
+++ fvwm/screen.h       2002/10/26 11:15:24
@@ -148,9 +148,13 @@
                } grad;
                struct vector_coords
                {
-                       int num;
+                       int num;
                        signed char *x;
                        signed char *y;
+                       /* added offsets for vector coords
+                          [EMAIL PROTECTED] */
+                       signed char *xoff;
+                       signed char *yoff;
                        signed char *c;
                        unsigned use_fgbg : 1;
                } vector;

Reply via email to