summaryrefslogtreecommitdiff
path: root/usr.bin/vim/gui.h
blob: 7a35f93817e98bf4ddd5697bfdd89c7b8c6ec084 (plain)
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 */