On Sun, 7 Aug 2005, Dominik Vogt wrote:
On Sun, Aug 07, 2005 at 02:21:24PM +0200, Dominik Vogt wrote:
On Sun, Aug 07, 2005 at 12:44:26PM +0200, Viktor Griph wrote:
On Sun, 7 Aug 2005, Dominik Vogt wrote:
[snip]
Could someone with cvs wrilte-access apply this patch?

I'd first like to understand what the patch does exactly.  Please
elaborate on how the new feature works.
This is a menufeel patch. It allows for selecting a menu item with a mouse
wheel as follows:

When the Menustyle Scroll is not Off the use of button 4 and 5 (Mousewheel
up and down) no longer acts as clicks on the menu, but triggers menu
scrolling. Menu scrolling is done i three possible ways: On - Positive
order, menu moving; Inverted - Negative order, menu moving; Pointer
Positive order, Pointer moving.

When the menu is about to scroll it will find the next selectable item in
the direction of the scroll, and if is On or Inverted (moving menu) the
Menu window will be moved vertically so that the the new item is
vertically centered under the pointer. If the scroll argument is Pointer
the Pointer will wrap vertically to the center of the next item.

The special case where the menu would have been placed partly outside of
the screen is treated differently depending on the value of ScrollOffPage.
If ScrollOffPage is true the menu will be allowed to leave the screen. If
not the menu will stop at the edge and Pointer scroll will be used.

Sounds interesting.  I fear there may be many nasty side effects
with the existing menu code - not because the patch is bad but
because the menu code is very touchy.  I need something to play
with (I don't have a mouse wheel).

I've mapped the scroll action to button 3 and shift + button 3 to
test the code.  Some comments:

1) Scrolling the menu off page looks like a useable feature, but:

  * Scroll the menu off the screen.
  * Switch to using the cursor keys.
  --> You can't get the menu back on screen

  Using the keys should bring it back.

I've taken care of that in the current candidate

2) I'm not particularly fond of the "Scroll On" behaviour because
  it is a mix of scrolling and warping the pointer.  I'd remove
  this part.

Are you sure that is "Scroll On" bahhaviour, and not "ScrollOffPage Off" behaviour? I've changed ScrollOffPage to default to On as that probably is the most useful way, and not combines pointer wrapping with menu scrolling. (Unless trigged from the keyboard, where the pointer always will wrap to the horizontal center of the menu)

3) I see this whole feature as an extension of the meneShortcuts()
  function.  Although it is triggered by the mouse, the behaviour
  is very similar to the keyboard shortcuts.  Merging the code
  into menuShortcuts() should not be difficult.

  I suggest to translate the button event to a keycode/modifier
  at the start of the menuShortcuts() function.

Sounds logical. I created my functiion mainly based on menuShortcuts since it seemed to do similar things, that I wanted to do. I've now merged the code into menuShortcurs by adding the action SA_SCROLL. I've also in the same time bound the scrolling to NumPad -/+ as Up/Down.


4) The "Scroll Pointer" behaviour should be the hard-coded default
  for all menus.
done


5) I'm not happy about the naming of the "Scroll" argument.  "on"
  and "off" should also allow all aliases that the
  parse_toggle_argument() function allows.  But that can wait
  until the patch is finalized because the syntax will probably
  change a bit.
I was quite unsure on how to handle the styles when I started. Maybe it would be better to follow the more common (for menu styles) way of having more styles that override each others. The reason why I decided not to do so was the fact that I ended up with two groups, and thought that would be more confusing. I've left these as they are in this candidate.

New updated candidate-patch attached.

/Viktor
? scroll.patch
Index: AUTHORS
===================================================================
RCS file: /home/cvs/fvwm/fvwm/AUTHORS,v
retrieving revision 1.103
diff -u -u -r1.103 AUTHORS
--- AUTHORS     29 Jun 2005 17:15:18 -0000      1.103
+++ AUTHORS     7 Aug 2005 17:59:53 -0000
@@ -4,6 +4,7 @@
 
 Viktor Griph:
 Patch for Perl modules on 64 bit machines.
+Scroll and ScrollOffPage menu style options.
 
 Bjoern Steinbrink:
 Patch for FvwmScript tasks running too often.
Index: ChangeLog
===================================================================
RCS file: /home/cvs/fvwm/fvwm/ChangeLog,v
retrieving revision 1.2609
diff -u -u -r1.2609 ChangeLog
--- ChangeLog   7 Aug 2005 09:48:29 -0000       1.2609
+++ ChangeLog   7 Aug 2005 17:59:54 -0000
@@ -1,3 +1,22 @@
+
+2005-08-07  Viktor Griph  <[EMAIL PROTECTED]>
+
+       * fvwm/menus.c (pop_menu_up): 
+       fixed check if parent menu is transparent, and not if the popup
+       is transparent
+
+       * fvwm/menustyle.c (menustyle_copy): 
+       fixed copy of PopdownDelay
+       
+       * fvwm/menustyle.h (enum, MenuFeel, ST_DO_SCROLL, MST_DO_SCROLL) 
+       (ST_SCROLL_OFF_PAGE, MST_SCROLL_OFF_PAGE): 
+       * fvwm/menustyle.c (menustyle_copy): 
+       (menustyle_get_styleopt_index): 
+       (menustyle_parse_style): 
+       * fvwm/menus.c (menuShortcuts, enum, __mloop_handle_event):     
+       * fvwm/fvwm.1.in: 
+       added Scroll and ScrollOffPage menu styles
+
 2005-08-07  Dominik Vogt  <[EMAIL PROTECTED]>
 
        * fvwm/menustyle.c (menustyle_copy):
Index: NEWS
===================================================================
RCS file: /home/cvs/fvwm/fvwm/NEWS,v
retrieving revision 1.561
diff -u -u -r1.561 NEWS
--- NEWS        4 Aug 2005 16:25:40 -0000       1.561
+++ NEWS        7 Aug 2005 17:59:54 -0000
@@ -8,6 +8,7 @@
 * New features:
 
    - Fvwm now officially supports 64-bit architertures.
+   - Added Scroll and ScrollOffPage menu style options.
 
 * Bug Fixes:
 
@@ -15,6 +16,9 @@
    - Fixed a hang with layers set by applications (e.g. AbiWord).
    - GotoDesk with a relative page argument now wraps around at
      the end of the given range as documented. (Bug #1396).
+   - PopupDelayed menu style option was not copied on CopyMenuStyle
+   - Transparent Animated menus with non-transparent popup were not
+     animated correctly.
 
 -------------------------------------------------------------------
 
Index: fvwm/fvwm.1.in
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/fvwm.1.in,v
retrieving revision 1.167
diff -u -u -r1.167 fvwm.1.in
--- fvwm/fvwm.1.in      2 Jun 2005 20:54:53 -0000       1.167
+++ fvwm/fvwm.1.in      7 Aug 2005 17:59:55 -0000
@@ -2853,7 +2853,9 @@
 ItemFormat,
 VerticalItemSpacing,
 VerticalTitleSpacing,
-AutomaticHotkeys / AutomaticHotkeysOff.
+AutomaticHotkeys / AutomaticHotkeysOff,
+Scroll,
+ScrollOffPage.
 
 In the above list some options are listed as option pairs or
 triples with a '/' in between.  These options exclude each other.
@@ -3393,6 +3395,21 @@
 .B AddToMenu
 command.
 
+.IR Scroll
+controls the ability to scroll the menu using a mouse wheel. It takes
+one argument, that can be one of On, Off, Inverted or Pointer. On and
+Inverted enables menu scrolling around the pointer, Off disables it,
+and Pointer enables scrolling with Pointer wrapping. Inverted has
+inverted scrolling direction. That is the menu moves in the same
+direction as the mouse wheel, as opposed to the selected item.
+If no argument is supplied the default state, Pointer, is restored.
+
+.IR ScrollOffPage 
+controls if a menu is allowed to be scrolled out of the visible area if
+.I Scroll 
+is set to On or Inverted. It takes one optional toggle argument. If no
+argument is supplied the default state, on, is restored.
+
 Examples:
 .EX
 MenuStyle * Mwm
Index: fvwm/menus.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/menus.c,v
retrieving revision 1.384
diff -u -u -r1.384 menus.c
--- fvwm/menus.c        7 Aug 2005 09:48:29 -0000       1.384
+++ fvwm/menus.c        7 Aug 2005 17:59:56 -0000
@@ -129,7 +129,8 @@
        SA_WARPBACK,
        SA_SELECT,
        SA_TEAROFF,
-       SA_ABORT
+       SA_ABORT,
+       SA_SCROLL
 } shortcut_action;
 
 /* ---------------------------- menu loop types ---------------------------- */
@@ -776,9 +777,9 @@
        MenuRoot *mr, MenuParameters *pmp, MenuReturn *pmret, XEvent *event,
        MenuItem **pmiCurrent, double_keypress *pdkp)
 {
-       int fControlKey = event->xkey.state & ControlMask? True : False;
-       int fShiftedKey = event->xkey.state & ShiftMask? True: False;
-       int fMetaKey = event->xkey.state & Mod1Mask? True: False;
+       int fControlKey;
+       int fShiftedKey;
+       int fMetaKey;
        KeySym keysym;
        char ckeychar = 0;
        int ikeychar;
@@ -792,6 +793,7 @@
        unsigned int menu_width;
        unsigned int menu_height;
        int items_to_move;
+       int direction;
        Bool fSkipSection = False;
        shortcut_action saction = SA_NONE;
 
@@ -802,28 +804,58 @@
                pmret->rc = MENU_SELECTED;
                return;
        }
-
-       /*** handle double-keypress ***/
-
-       if (pdkp->timestamp &&
-           fev_get_evtime() - pdkp->timestamp <
-           MST_DOUBLE_CLICK_TIME(pmp->menu) &&
-           event->xkey.state == pdkp->keystate &&
-           event->xkey.keycode == pdkp->keycode)
+       /*** map mouse events to keysymb ***/
+       if (event->type == ButtonRelease)
        {
-               *pmiCurrent = NULL;
-               pmret->rc = MENU_DOUBLE_CLICKED;
-               return;
+               /*** Read the control keys stats ***/   
+               fControlKey = event->xbutton.state & ControlMask? True : False;
+               fShiftedKey = event->xbutton.state & ShiftMask? True: False;
+               fMetaKey = event->xbutton.state & Mod1Mask? True: False;
+               switch (event->xbutton.button)
+               {
+               case 4: /* ScrollUp -- Translate to NumPad - */
+                       keysym = XK_KP_Subtract;                        
+                       break;
+               case 5: /* ScrollDown -- Translate to NumPad + */
+                       keysym = XK_KP_Add;
+                               break;
+               default:
+                       /* No mapped button */
+                       pmret->rc = MENU_NOP;
+                       return;
+               }
+               index = 0;
        }
-       pdkp->timestamp = 0;
-
-       /*** find out the key ***/
+       else /* Should be KeyPressed */
+       {
+               /*** Read the control keys stats ***/   
+               fControlKey = event->xkey.state & ControlMask? True : False;
+               fShiftedKey = event->xkey.state & ShiftMask? True: False;
+               fMetaKey = event->xkey.state & Mod1Mask? True: False;
+               
+               /*** handle double-keypress ***/
+
+               if (pdkp->timestamp &&
+                   fev_get_evtime() - pdkp->timestamp <
+                   MST_DOUBLE_CLICK_TIME(pmp->menu) &&
+                   event->xkey.state == pdkp->keystate &&
+                   event->xkey.keycode == pdkp->keycode)
+               {
+                       *pmiCurrent = NULL;
+                       pmret->rc = MENU_DOUBLE_CLICKED;
+                       return;
+               }
+               pdkp->timestamp = 0;
 
-       /* Is it okay to treat keysym-s as Ascii?
-        * No, because the keypad numbers don't work. Use XlookupString */
-       index = XLookupString(&(event->xkey), &ckeychar, 1, &keysym, NULL);
-       ikeychar = (int)ckeychar;
+               /*** find out the key ***/
 
+               /* Is it okay to treat keysym-s as Ascii?
+                * No, because the keypad numbers don't work.
+                * Use XlookupString */
+               index = XLookupString(&(event->xkey), &ckeychar, 1, &keysym, 
+                                     NULL);
+               ikeychar = (int)ckeychar;
+       }
        /*** Try to match hot keys ***/
 
        /* Need isascii here - isgraph might coredump! */
@@ -1061,13 +1093,22 @@
                saction = SA_TEAROFF;
                break;
 
+       /* menu-scroll */
+       case XK_KP_Add:      /* ScrollUp */
+               saction = SA_SCROLL;
+               direction = 1;
+               break;
+       case XK_KP_Subtract: /* ScrollDown */
+               saction = SA_SCROLL;
+               direction = -1;
+               break;
        default:
                break;
        }
 
        if (!miCurrent &&
            (saction == SA_ENTER || saction == SA_MOVE_ITEMS ||
-            saction == SA_SELECT))
+            saction == SA_SELECT || saction == SA_SCROLL))
        {
                if (menu_get_geometry(
                            mr, &JunkRoot, &menu_x, &menu_y, &menu_width,
@@ -1256,12 +1297,129 @@
                        (MR_IS_TEAR_OFF_MENU(mr)) ? MENU_NOP : MENU_TEAR_OFF;
                return;
 
+       case SA_SCROLL:
+               if (MST_DO_SCROLL(mr) == MDS_INVERTED)
+               {
+                       direction *= -1;
+               }
+               if (!menu_get_geometry(
+                   mr, &JunkRoot, &menu_x, &menu_y, &JunkWidth, &menu_height,
+                   &JunkBW, &JunkDepth))
+               {               
+                   fvwm_msg(ERR, "menuShortcuts",
+                        "can't get geometry of menu %s", MR_NAME(mr));
+                       return;
+               }
+               for (newItem = miCurrent; newItem && 
+                      ( !MI_IS_SELECTABLE(newItem) || newItem ==  miCurrent );
+                      newItem = (direction == 1) ?
+                                MI_NEXT_ITEM(newItem) :  MI_PREV_ITEM(newItem))
+                       ; /* maybe use while insted... */
+
+               if (newItem)
+               {
+                       *pmiCurrent = newItem;
+                       pmret->rc = MENU_NEWITEM;
+
+                       if (FQueryPointer( dpy, Scr.Root, &JunkRoot,
+                               &JunkChild, &mx, &my, &JunkX, &JunkY, &JunkMask)
+                               ==  False)
+                       {
+                               /* This should not happen */
+                               mx = 0;
+                               my = menu_y;
+                       }
+                                         
+                       if (MST_DO_SCROLL(mr) == MDS_POINTER)
+                       {
+                               if (event->type == ButtonRelease)
+                               {
+                                       FWarpPointer(dpy, 0, 0, 0, 0, 0, 0, 0,
+                                               menu_y - my +
+                                               menuitem_middle_y_offset(
+                                                       newItem,
+                                                       MR_STYLE(mr)));
+                               }
+                               /* pointer wrapped outside for key events */
+                       }
+                       else
+                       {                         
+                               menu_y = my - menuitem_middle_y_offset(
+                                                       newItem,
+                                                       MR_STYLE(mr));
+                               if (!MST_SCROLL_OFF_PAGE(mr) && 
+                                   menu_height < MR_SCREEN_HEIGHT(mr))
+                               {
+                                       if (menu_y < 0)
+                                       {
+                                               FWarpPointer(dpy, 0, 0, 0, 0,
+                                                            0, 0, 0,-menu_y);
+                                               menu_y=0;
+                                       }
+                               
+                                       if (menu_y + menu_height >
+                                           MR_SCREEN_HEIGHT(mr))
+                                       {
+                                               FWarpPointer(dpy, 0, 0, 0, 0, 0,
+                                                       0, 0,
+                                                       MR_SCREEN_HEIGHT(mr) 
+                                                       - menu_y - menu_height);
+                                               menu_y = MR_SCREEN_HEIGHT(mr) -
+                                                        menu_height;
+                                       }
+                               }
+                               XMoveWindow(dpy, MR_WINDOW(mr), menu_x, menu_y);
+                               if (ST_HAS_MENU_CSET(MR_STYLE(mr)) &&
+                                       CSET_IS_TRANSPARENT(
+                                               ST_CSET_MENU(MR_STYLE(mr))))
+                               {
+                                       MenuRepaintTransparentParameters mrtp;
+                                       get_menu_repaint_transparent_parameters(
+                                               &mrtp, mr, (*pmp->pexc)->w.fw);
+                                       repaint_transparent_menu(
+                                                &mrtp,False, menu_x,menu_y,
+                                                menu_x,menu_y);
+                               }
+                       }
+               }
+               else
+               {
+                       pmret->rc = MENU_NOP;
+               }
+               break;
        case SA_NONE:
        default:
                pmret->rc = MENU_NOP;
                break;
        }
-
+       if (saction != SA_SCROLL && pmret->rc == MENU_NEWITEM)
+       {
+               if (!menu_get_geometry(
+                   mr, &JunkRoot, &menu_x, &menu_y, &JunkWidth, &menu_height,
+                   &JunkBW, &JunkDepth))
+               {               
+                   fvwm_msg(ERR, "menuShortcuts",
+                        "can't get geometry of menu %s", MR_NAME(mr));
+                       return;
+               }
+               if (menu_y < 0 || menu_y + + menu_height > MR_SCREEN_HEIGHT(mr))
+               {
+                       menu_y = 
+                         (menu_y < 0) ? 0 : MR_SCREEN_HEIGHT(mr) - menu_height;
+                       XMoveWindow(dpy, MR_WINDOW(mr), menu_x, menu_y);
+                       if (ST_HAS_MENU_CSET(MR_STYLE(mr)) &&
+                               CSET_IS_TRANSPARENT(
+                                       ST_CSET_MENU(MR_STYLE(mr))))
+                       {
+                               MenuRepaintTransparentParameters mrtp;
+                               get_menu_repaint_transparent_parameters(
+                                       &mrtp, mr, (*pmp->pexc)->w.fw);
+                               repaint_transparent_menu(
+                                        &mrtp,False, menu_x,menu_y,
+                                        menu_x,menu_y);
+                       }
+               }
+       }
        return;
 }
 
@@ -1496,6 +1654,7 @@
        return (*p != NULL);
 }
 
+
 /* ---------------------------- item list handling ------------------------- */
 
 static void unlink_item_from_menu(
@@ -4673,6 +4832,20 @@
                                pmret->rc = MENU_TEAR_OFF;
                                return MENU_MLOOP_RET_END;
                        }
+                       else if ( med->mrMi != NULL && 
+                                 MST_DO_SCROLL(med->mrMi) != MDS_OFF && 
+                                 ((*pmp->pexc)->x.elast->xbutton.button == 4 ||
+                                  (*pmp->pexc)->x.elast->xbutton.button == 5))
+                       {                         
+                              menuShortcuts(med->mrMi, pmp, pmret, 
+                                         (*pmp->pexc)->x.elast,
+                                         &med->mi,pdkp);
+                              if (pmret->rc == MENU_NOP)
+                              {
+                                       return MENU_MLOOP_RET_LOOP;
+                              }
+                              break;
+                       }
                }
                in->mif.was_item_unposted = 0;
                if (pmret->flags.is_menu_posted && med->mrMi != NULL)
Index: fvwm/menustyle.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/menustyle.c,v
retrieving revision 1.30
diff -u -u -r1.30 menustyle.c
--- fvwm/menustyle.c    7 Aug 2005 09:48:29 -0000       1.30
+++ fvwm/menustyle.c    7 Aug 2005 17:59:56 -0000
@@ -348,6 +348,7 @@
                "PopdownDelay",
                "PopupActiveArea",
                "PopupIgnore", "PopupClose",
+               "Scroll", "ScrollOffPage",
                NULL
        };
 
@@ -698,6 +699,8 @@
                        ST_DOUBLE_CLICK_TIME(tmpms) = DEFAULT_MENU_CLICKTIME;
                        ST_POPUP_DELAY(tmpms) = DEFAULT_POPUP_DELAY;
                        ST_POPDOWN_DELAY(tmpms) = DEFAULT_POPDOWN_DELAY;
+                       ST_DO_SCROLL(tmpms) = MDS_POINTER;
+                       ST_SCROLL_OFF_PAGE(tmpms) = 1;
                        has_gc_changed = True;
                        option = "fvwm";
                }
@@ -1287,6 +1290,65 @@
                        ST_DO_POPUP_AS(tmpms) = MDP_CLOSE;
                        break;
 
+               case 56: /* Scroll */
+                       if (arg1)
+                       {
+                               if (StrEquals(arg1, "Off"))
+                               {
+                                       ST_DO_SCROLL(tmpms) = MDS_OFF;  
+                               }
+                               else if (StrEquals(arg1, "On") )
+                               {
+                                       ST_DO_SCROLL(tmpms) = MDS_ON;   
+                               }
+                               else if (StrEquals(arg1, "Inverted"))
+                               {
+                                       ST_DO_SCROLL(tmpms) = MDS_INVERTED;
+                               }
+                               else if (StrEquals(arg1, "Pointer"))
+                               {
+                                       ST_DO_SCROLL(tmpms) = MDS_POINTER;
+                               }
+                               else
+                               {
+                                       fvwm_msg(ERR, "NewMenuStyle", 
+                                                "unknown argument to Scroll 
'%s'",
+                                                arg1);
+                                       ST_DO_SCROLL(tmpms) = MDS_POINTER;
+                               }
+                       }
+                       else
+                       {
+                               ST_DO_SCROLL(tmpms) = MDS_POINTER;      
+                       }
+                       break;
+               case 57: /* ScrollOffPage */
+                       if (arg1)
+                       {                       
+                               switch (ParseToggleArgument(arg1, NULL, -2,0))
+                               {
+                               case -1: /* toggle */
+                                       ST_SCROLL_OFF_PAGE(tmpms) ^= 1;
+                                       break;
+                               case 0:
+                                       ST_SCROLL_OFF_PAGE(tmpms) = 0;
+                                       break;
+                               case 1:
+                                       ST_SCROLL_OFF_PAGE(tmpms) = 1;
+                                       break;
+                               default:
+                                       fvwm_msg(ERR, "NewMenuStyle", 
+                                                "unknown argument to 
ScrollOffPage '%s'",
+                                                arg1);
+                                       ST_SCROLL_OFF_PAGE(tmpms) = 1;
+                                       break;
+                               }
+                       }
+                       else
+                       {
+                               ST_SCROLL_OFF_PAGE(tmpms) = 1;
+                       }
+                       break;
 #if 0
                case 99: /* PositionHints */
                        /* to be implemented */
@@ -1542,6 +1604,10 @@
        ST_DO_POPDOWN_IMMEDIATELY(destms) = ST_DO_POPDOWN_IMMEDIATELY(origms);
        /* PopdownDelay */
        ST_POPDOWN_DELAY(destms) = ST_POPDOWN_DELAY(origms);
+       /* Scroll */
+       ST_DO_SCROLL(destms) = ST_DO_SCROLL(origms);
+       /* ScrollOffPage */
+       ST_SCROLL_OFF_PAGE(destms) = ST_SCROLL_OFF_PAGE(origms);
 
        menustyle_update(destms);
 
Index: fvwm/menustyle.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/menustyle.h,v
retrieving revision 1.14
diff -u -u -r1.14 menustyle.h
--- fvwm/menustyle.h    3 Nov 2003 17:41:20 -0000       1.14
+++ fvwm/menustyle.h    7 Aug 2005 17:59:56 -0000
@@ -121,6 +121,10 @@
 #define ST_USE_AUTOMATIC_HOTKEYS(s)   ((s)->feel.flags.use_automatic_hotkeys)
 #define MST_USE_AUTOMATIC_HOTKEYS(m) \
        ((m)->s->ms->feel.flags.use_automatic_hotkeys)
+#define ST_DO_SCROLL(s)               ((s)->feel.flags.do_scroll)
+#define MST_DO_SCROLL(m)              ((m)->s->ms->feel.flags.do_scroll)
+#define ST_SCROLL_OFF_PAGE(s)         ((s)->feel.flags.scroll_off_page)
+#define MST_SCROLL_OFF_PAGE(m)        ((m)->s->ms->feel.flags.scroll_off_page)
 #define ST_FLAGS(s)                   ((s)->feel.flags)
 #define MST_FLAGS(m)                  ((m)->s->ms->feel.flags)
 #define ST_POPUP_OFFSET_PERCENT(s)    ((s)->feel.PopupOffsetPercent)
@@ -163,6 +167,14 @@
        MDP_CLOSE = 3
 } ms_do_popup_as_t;
 
+typedef enum
+{
+       MDS_OFF = 0,
+       MDS_ON = 1,
+       MDS_INVERTED = 2,       
+       MDS_POINTER = 3
+} ms_do_scroll_t;
+
 typedef struct MenuFeel
 {
        struct
@@ -175,6 +187,8 @@
                unsigned do_unmap_submenu_on_popdown : 1;
                unsigned use_left_submenus : 1;
                unsigned use_automatic_hotkeys : 1;
+               unsigned do_scroll : 2;
+               unsigned scroll_off_page : 1;
        } flags;
        int PopdownDelay10ms;
        int PopupOffsetPercent;

Reply via email to