1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
/* $OpenBSD: gui.h,v 1.1 1996/09/07 21:40:28 downsj Exp $ */
/* vi:set ts=4 sw=4:
*
* VIM - Vi IMproved by Bram Moolenaar
* Motif support by Robert Webb
*
* Do ":help uganda" in Vim to read copying and usage conditions.
* Do ":help credits" in Vim to see a list of people who contributed.
*/
/* For debugging */
/* #define D(x) printf x; */
#define D(x)
#ifdef USE_GUI_MOTIF
# define USE_GUI_X11
# include <Xm/Xm.h>
#endif
/*
* No, Athena doesn't work. Probably never will, there is probably a public
* domain X widget set that is more like Motif which should be used instead.
*/
#ifdef USE_GUI_ATHENA
# define USE_GUI_X11
# include <X11/Intrinsic.h>
# include <X11/StringDefs.h>
#endif
/*
* These macros convert between character row/column and pixel coordinates.
* TEXT_X - Convert character column into X pixel coord for drawing strings.
* TEXT_Y - Convert character row into Y pixel coord for drawing strings.
* FILL_X - Convert character column into X pixel coord for filling the area
* under the character.
* FILL_Y - Convert character row into Y pixel coord for filling the area
* under the character.
* X_2_COL - Convert X pixel coord into character column.
* Y_2_ROW - Convert Y pixel coord into character row.
*/
#define TEXT_X(col) ((col) * gui.char_width + gui.border_offset)
#define TEXT_Y(row) ((row) * gui.char_height + gui.char_ascent \
+ gui.border_offset)
#define FILL_X(col) ((col) * gui.char_width + gui.border_offset)
#define FILL_Y(row) ((row) * gui.char_height + gui.border_offset)
#define X_2_COL(x) (((x) - gui.border_offset) / gui.char_width)
#define Y_2_ROW(y) (((y) - gui.border_offset) / gui.char_height)
/* Menu modes */
#define MENU_NORMAL_MODE 0x01
#define MENU_VISUAL_MODE 0x02
#define MENU_INSERT_MODE 0x04
#define MENU_CMDLINE_MODE 0x08
#define MENU_ALL_MODES 0x0f
/* Indices into GuiMenu->strings[] and GuiMenu->noremap[] for each mode */
#define MENU_INDEX_INVALID -1
#define MENU_INDEX_NORMAL 0
#define MENU_INDEX_VISUAL 1
#define MENU_INDEX_INSERT 2
#define MENU_INDEX_CMDLINE 3
/* Update types for scrollbars, getting more severe on the way down */
#define SB_UPDATE_NOTHING 0
#define SB_UPDATE_VALUE 1
#define SB_UPDATE_HEIGHT 2
#define SB_UPDATE_CREATE 3
/* Indices for arrays of scrollbars */
#define SB_NONE -1
#define SB_LEFT 0
#define SB_RIGHT 1
#define SB_BOTTOM 2
/* Default size of scrollbar */
#define SB_DEFAULT_WIDTH 20
/* Default height of the menu bar */
#define MENU_DEFAULT_HEIGHT 32
/* Highlighting attribute bits. */
#define HL_NORMAL 0x00
#define HL_INVERSE 0x01
#define HL_BOLD 0x02
#define HL_ITAL 0x04
#define HL_UNDERLINE 0x08
#define HL_STANDOUT 0x10
#define HL_SELECTED 0x20
#define HL_ALL 0x3f
#ifdef USE_GUI_X11
/* Selection states for X11 selection. */
#define SELECT_CLEARED 0
#define SELECT_IN_PROGRESS 1
#define SELECT_DONE 2
#define SELECT_MODE_CHAR 0
#define SELECT_MODE_WORD 1
#define SELECT_MODE_LINE 2
#endif
/*
* When we know the cursor is no longer being displayed (eg it has been written
* over).
*/
#define INVALIDATE_CURSOR() (gui.cursor_row = -1)
/* #define INVALIDATE_CURSOR() do{printf("Invalidate cursor %d\n", __LINE__); gui.cursor_row = -1;}while(0) */
/*
* For checking whether cursor needs redrawing, or whether it doesn't need
* undrawing.
*/
#define IS_CURSOR_VALID() (gui.cursor_row >= 0)
typedef struct GuiSelection
{
int owned; /* Flag: do we own the selection? */
FPOS start; /* Start of selected area */
FPOS end; /* End of selected area */
#ifdef USE_GUI_X11
Atom atom; /* Vim's own special selection format */
short_u origin_row;
short_u origin_start_col;
short_u origin_end_col;
short_u word_start_col;
short_u word_end_col;
FPOS prev; /* Previous position */
short_u state; /* Current selection state */
short_u mode; /* Select by char, word, or line. */
#endif
} GuiSelection;
typedef struct GuiMenu
{
int modes; /* Which modes is this menu visible for? */
char_u *name; /* Name shown in menu */
void (*cb)(); /* Call-back routine */
char_u *strings[4]; /* Mapped string for each mode */
int noremap[4]; /* A noremap flag for each mode */
struct GuiMenu *children; /* Children of sub-menu */
struct GuiMenu *next; /* Next item in menu */
#ifdef USE_GUI_X11
Widget id; /* Manage this to enable item */
Widget submenu_id; /* If this is submenu, add children here */
#endif
} GuiMenu;
typedef struct GuiScrollbar
{
int update[2]; /* What kind of update is required? */
/* (For left & right scrollbars) */
int value; /* Represents top line number visible */
int size; /* Size of scrollbar thumb */
int max; /* Number of lines in buffer */
int top; /* Top of scroll bar (chars from row 0) */
int height; /* Height of scroll bar (num rows) */
int status_height; /* Height of status line */
#ifdef USE_GUI_X11
Widget id[2]; /* Id of real scroll bar (left & right) */
#endif
} GuiScrollbar;
typedef struct Gui
{
int in_focus; /* Vim has input focus */
int in_use; /* Is the GUI being used? */
int starting; /* GUI will start in a little while */
int dying; /* Is vim dying? Then output to terminal */
int dofork; /* Use fork() when GUI is starting */
int dragged_sb; /* Which scrollbar being dragged, if any? */
struct window *dragged_wp; /* Which WIN's sb being dragged, if any? */
int col; /* Current cursor column in GUI display */
int row; /* Current cursor row in GUI display */
int cursor_col; /* Physical cursor column in GUI display */
int cursor_row; /* Physical cursor row in GUI display */
int num_cols; /* Number of columns */
int num_rows; /* Number of rows */
int scroll_region_top; /* Top (first) line of scroll region */
int scroll_region_bot; /* Bottom (last) line of scroll region */
long_u highlight_mask; /* Highlight attribute mask */
GuiSelection selection; /* Info about selected text */
GuiMenu *root_menu; /* Root of menu hierarchy */
int num_scrollbars; /* Number of scrollbars (= #windows + 1) */
int scrollbar_width; /* Width of scrollbars */
int menu_height; /* Height of the menu bar */
int menu_is_active; /* TRUE if menu is present */
GuiScrollbar cmdline_sb; /* Scroll bar for command line */
/* (Other scrollbars in 'struct window') */
int which_scrollbars[3];/* Which scrollbar boxes are active? */
int new_sb[3]; /* Which scrollbar boxes are new? */
int prev_wrap; /* For updating the horizontal scrollbar */
int char_width; /* Width of char in pixels */
int char_height; /* Height of char in pixels */
int char_ascent; /* Ascent of char in pixels */
int border_width; /* Width of our border around text area */
int border_offset; /* Total pixel offset for all borders */
#ifdef USE_GUI_X11
Display *dpy; /* X display */
Window wid; /* Window id of text area */
int visibility; /* Is window partially/fully obscured? */
GC text_gc;
GC back_gc;
GC invert_gc;
XFontStruct *norm_font;
XFontStruct *bold_font;
XFontStruct *ital_font;
XFontStruct *boldital_font;
Pixel back_pixel; /* Pixel value of background */
Pixel norm_pixel; /* Pixel value of normal text */
Pixel bold_pixel; /* Pixel value of bold text */
Pixel ital_pixel; /* Pixel value of ital text */
Pixel underline_pixel; /* Pixel value of underlined text */
Pixel cursor_pixel; /* Pixel value of cursor */
Pixel menu_fg_pixel; /* Pixel value of menu foregound */
Pixel menu_bg_pixel; /* Pixel value of menu backgound */
Pixel scroll_fg_pixel; /* Pixel value of scrollbar foreground */
Pixel scroll_bg_pixel; /* Pixel value of scrollbar background */
/* X Resources */
char_u *dflt_font; /* Resource font, used if 'font' not set */
char_u *dflt_bold_fn; /* Resource bold font */
char_u *dflt_ital_fn; /* Resource italic font */
char_u *dflt_boldital_fn; /* Resource bold-italic font */
char_u *geom; /* Geometry, eg "80x24" */
Bool rev_video; /* Use reverse video? */
#endif
} Gui;
extern Gui gui; /* this is in gui.c */
extern int force_menu_update; /* this is in gui.c */
|