1/*
2 * twm menus include file
3 *
4 *
5 *       Copyright 1988 by Evans & Sutherland Computer Corporation,
6 *                          Salt Lake City, Utah
7 *  Portions Copyright 1989 by the Massachusetts Institute of Technology
8 *                        Cambridge, Massachusetts
9 *
10 * $XConsortium: menus.h,v 1.24 89/12/10 17:46:26 jim Exp $
11 *
12 * 17-Nov-87 Thomas E. LaStrange                File created
13 *
14 * Copyright 1992 Claude Lecommandeur.
15 */
16
17#ifndef _CTWM_MENUS_H
18#define _CTWM_MENUS_H
19
20#define TWM_ROOT        "bLoB_GoOp"     /* my private root menu */
21#define TWM_WINDOWS     "TwmWindows"    /* for f.menu "TwmWindows" */
22#define TWM_ICONS       "TwmIcons"      /* for f.menu "TwmIcons" */
23#define TWM_WORKSPACES  "TwmWorkspaces" /* for f.menu "TwmWorkspaces" */
24#define TWM_ALLWINDOWS  "TwmAllWindows" /* for f.menu "TwmAllWindows" */
25
26/* Added by dl 2004 */
27#define TWM_ALLICONS    "TwmAllIcons"   /* for f.menu "TwmAllIcons" */
28
29/*******************************************************************/
30/* Added by Dan Lilliehorn (dl@dl.nu) 2000-02-29                   */
31#define TWM_KEYS        "TwmKeys"       /* for f.menu "TwmKeys"    */
32#define TWM_VISIBLE     "TwmVisible"    /* for f.menu "TwmVisible" */
33
34
35/*
36 * MenuRoot.mapped - current/past state.
37 *
38 * XXX Perhaps the NEVER_MAPPED stuff should be pulled out and tracked
39 * some other way, and mapped just made into an bool.
40 */
41typedef enum {
42	MRM_NEVER,
43	MRM_UNMAPPED,
44	MRM_MAPPED,
45} MRMapState;
46
47
48struct MenuItem {
49	struct MenuItem *next;      /* next menu item */
50	struct MenuItem *prev;      /* prev menu item */
51	struct MenuRoot *sub;       /* MenuRoot of a pull right menu */
52	struct MenuRoot *root;      /* back pointer to my MenuRoot */
53	char *item;                 /* the character string displayed */
54	char *action;               /* action to be performed */
55	ColorPair normal;           /* unhiglight colors */
56	ColorPair highlight;        /* highlight colors */
57	short item_num;             /* item number of this menu */
58	short x;                    /* x coordinate for text */
59	short func;                 /* twm built in function */
60	bool  state;                /* in reversed video state (i.e., active) */
61	short strlen;               /* strlen(item) */
62	bool  user_colors;          /* colors were specified */
63	bool  separated;            /* separated from the next item */
64};
65
66struct MenuRoot {
67	struct MenuItem *first;     /* first item in menu */
68	struct MenuItem *last;      /* last item in menu */
69	struct MenuItem *lastactive; /* last active item in menu */
70	struct MenuItem *defaultitem;       /* default item in menu */
71	struct MenuRoot *prev;      /* previous root menu if pull right */
72	struct MenuRoot *next;      /* next in list of root menus */
73	char *name;                 /* name of root */
74	Window w;                   /* the window of the menu */
75	Window shadow;              /* the shadow window */
76	ColorPair highlight;        /* highlight colors */
77	MRMapState mapped;          /* whether ever/currently mapped */
78	short height;               /* height of the menu */
79	short width;                /* width of the menu */
80	short items;                /* number of items in the menu */
81	bool  pull;                 /* is there a pull right entry ? */
82	bool  entered;              /* EnterNotify following pop up */
83	bool  real_menu;            /* this is a real menu */
84	short x, y;                 /* position (for pinned menus) */
85	bool  pinned;               /* is this a pinned menu*/
86	struct MenuRoot *pmenu;     /* the associated pinned menu */
87};
88
89
90struct MouseButton {
91	int func;                   /* the function number */
92	int mask;                   /* modifier mask */
93	MenuRoot *menu;             /* menu if func is F_MENU */
94	MenuItem *item;             /* action to perform if func != F_MENU */
95};
96
97struct FuncButton {
98	struct FuncButton *next;    /* next in the list of function buttons */
99	int num;                    /* button number */
100	int cont;                   /* context */
101	int mods;                   /* modifiers */
102	int func;                   /* the function number */
103	MenuRoot *menu;             /* menu if func is F_MENU */
104	MenuItem *item;             /* action to perform if func != F_MENU */
105};
106
107struct FuncKey {
108	struct FuncKey *next;       /* next in the list of function keys */
109	char *name;                 /* key name */
110	KeySym keysym;              /* X keysym */
111	KeyCode keycode;            /* X keycode */
112	int cont;                   /* context */
113	int mods;                   /* modifiers */
114	int func;                   /* function to perform */
115	char *win_name;             /* window name (if any) */
116	char *action;               /* action string (if any) */
117	MenuRoot *menu;             /* menu if func is F_MENU */
118};
119
120extern MenuRoot *ActiveMenu;
121extern MenuItem *ActiveItem;
122
123extern bool menuFromFrameOrWindowOrTitlebar;
124extern char *CurrentSelectedWorkspace;
125extern bool AlternateContext;
126extern int AlternateKeymap;
127
128#define MAXMENUDEPTH    10      /* max number of nested menus */
129extern int MenuDepth;
130
131#define WARPSCREEN_NEXT "next"
132#define WARPSCREEN_PREV "prev"
133#define WARPSCREEN_BACK "back"
134
135#define COLORMAP_NEXT "next"
136#define COLORMAP_PREV "prev"
137#define COLORMAP_DEFAULT "default"
138
139MenuRoot *NewMenuRoot(char *name);
140MenuItem *AddToMenu(MenuRoot *menu, char *item, char *action,
141                    MenuRoot *sub, int func, char *fore, char *back);
142bool PopUpMenu(MenuRoot *menu, int x, int y, bool center);
143void MakeWorkspacesMenu(void);
144MenuRoot *FindMenuRoot(char *name);
145bool AddFuncKey(char *name, int cont, int mods, int func,
146                MenuRoot *menu, char *win_name, char *action);
147void AddFuncButton(int num, int cont, int mods, int func,
148                   MenuRoot *menu, MenuItem *item);
149void AddDefaultFuncButtons(void);
150void PopDownMenu(void);
151void HideMenu(MenuRoot *menu);
152void PaintEntry(MenuRoot *mr, MenuItem *mi, bool exposure);
153void PaintMenu(MenuRoot *mr, XEvent *e);
154bool cur_fromMenu(void);
155void UpdateMenu(void);
156void MakeMenus(void);
157void MakeMenu(MenuRoot *mr);
158void MoveMenu(XEvent *eventp);
159void WarpCursorToDefaultEntry(MenuRoot *menu);
160
161// Mostly internal; exposed for testing
162char *mk_twmkeys_entry(const FuncKey *key);
163
164#endif /* _CTWM_MENUS_H */
165