1 /*
2  *   GRacer
3  *
4  *   Copyright (C) 1999 Takashi Matsuda <matsu@users.sourceforge.net>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19  * USA
20  */
21 
22 #ifndef __GRACER_WIDGETS_H__
23 #define __GRACER_WIDGETS_H__
24 
25 #include <GL/gl.h>
26 #include <common/gr_memory.h>
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 #if 0
32 }
33 #endif
34 
35 enum {
36   GR_GLUT_ROOT			= 0,
37   GR_GLUT_ROOT_WIDGET,
38   GR_GLUT_ROOT_GAME,
39 
40   GR_GLUT_WIDGET		= 0,
41   GR_GLUT_WIDGET_LABEL,
42   GR_GLUT_WIDGET_BUTTON,
43   GR_GLUT_WIDGET_ENTRY,
44 };
45 
46 enum {
47   GR_STATE_NORMAL	= 0,
48   GR_STATE_ACTIVE,
49   GR_STATE_FOCUS,
50   GR_STATE_GRAB,
51   GR_STATE_DISABLE,
52 
53   GR_NUM_STATE,
54 };
55 
56 enum {
57   GR_CENTER		= 0,
58   GR_TOP		= 1<<0,
59   GR_BOTTOM		= 1<<1,
60   GR_LEFT		= 1<<2,
61   GR_RIGHT		= 1<<3,
62 
63   GR_VERTICAL_MASK	= (GR_TOP|GR_BOTTOM),
64   GR_HORIZONTAL_MASK	= (GR_LEFT|GR_RIGHT),
65 };
66 
67 typedef void* GlutObject;
68 
69 typedef struct GlutRoot			GlutRoot;
70 typedef struct GlutWidget		GlutWidget;
71 typedef struct GlutLabel		GlutLabel;
72 typedef struct GlutButton		GlutButton;
73 typedef struct GlutEntry		GlutEntry;
74 
75 typedef struct GlutFontInfo		GlutFontInfo;
76 
77 struct GlutFontInfo {
78   void *font;
79   int height;
80   int ascent;
81   int descent;
82   GLuint dl;
83   int compiled[128];
84 };
85 
86 typedef void (*GlutRootFreeFunc)	(GlutObject obj);
87 typedef void (*GlutRootDisplayFunc)	(GlutObject obj);
88 typedef void (*GlutRootReshapeFunc)	(GlutObject obj,
89 					 int width, int height);
90 
91 struct GlutRoot {
92   GrRef ref;
93   int type;
94 
95   GLuint dl;
96   int changed;
97 
98   GlutRootFreeFunc		free_func;
99   GlutRootDisplayFunc		display_func;
100   GlutRootReshapeFunc		reshape_func;
101 };
102 
103 typedef void (*GlutWidgetKeyboardFunc)	(GlutObject obj,
104 					 unsigned char key, int x, int y);
105 typedef void (*GlutWidgetSpecialFunc)	(GlutObject obj,
106 					 int key, int x, int y);
107 typedef void (*GlutWidgetMouseFunc)	(GlutObject obj,
108     					 int button, int state, int x, int y);
109 
110 /* this is for internal use */
111 typedef void (*GlutWidgetCheckSize)	(GlutObject obj);
112 
113 struct GlutWidget {
114   GlutRoot core;
115 
116   int type;
117   int x, y;
118   int width, height;
119   int anchor;
120 
121   int x0, y0, x1, y1;
122 
123   int focus;
124   int active;
125 
126   void *font;
127   GLfloat fg_color[GR_NUM_STATE][4];
128   GLfloat bg_color[GR_NUM_STATE][4];
129 
130   GlutWidgetKeyboardFunc	keyboard_func;
131   GlutWidgetSpecialFunc		special_func;
132   GlutWidgetMouseFunc		mouse_func;
133 
134   GlutWidgetCheckSize		check_size;
135 };
136 
137 typedef void (*GlutButtonInvokeFunc)	(GlutObject obj);
138 
139 struct GlutLabel {
140   GlutWidget core;
141 
142   int type;
143 
144   char *title;
145   int length;
146   int str_width;
147   int justify;
148 };
149 
150 struct GlutButton {
151   GlutWidget core;
152 
153   int type;
154   char *title;
155   int length;
156   int str_width;
157 
158   GlutButtonInvokeFunc	invoke_func;
159 };
160 
161 typedef void (*GlutEntryInvokeFunc)	(GlutObject obj);
162 typedef void (*GlutEntryChangedFunc)	(GlutObject obj);
163 
164 struct GlutEntry {
165   GlutWidget core;
166 
167   int type;
168   char text[1024];
169   int length;
170   int display_pos;
171   int calet_pos;
172 
173   GlutEntryChangedFunc	invoke_func;
174   GlutEntryChangedFunc	changed_func;
175 };
176 
177 
178 extern GrSList *glut_widgets;
179 extern GlutObject grab_widget;
180 extern GlutObject focus_widget;
181 
182 extern int screen_width;
183 extern int screen_height;
184 
185 GlutObject	glut_root_new			(void);
186 void		glut_root_init 			(GlutObject obj);
187 void		glut_root_destroy		(GlutObject obj);
188 
189 GlutObject	glut_widget_new			(void);
190 void		glut_widget_init 		(GlutObject obj);
191 void		glut_widget_destroy 		(GlutObject obj);
192 
193 void		glut_widget_set_position	(GlutObject obj,
194     						 int x, int y, int anchor);
195 void		glut_widget_move		(GlutObject obj,
196 						 int dx, int dy);
197 void		glut_widget_set_size		(GlutObject obj,
198     						 int width, int height);
199 void		glut_widget_set_font		(GlutObject obj, void *font);
200 void		glut_widget_set_focus		(GlutObject obj);
201 int		glut_widget_is_focusable	(GlutObject obj);
202 
203 GlutObject	glut_label_new	 		(void);
204 void		glut_label_init	 		(GlutObject obj);
205 void		glut_label_destroy 		(GlutObject obj);
206 
207 void		glut_label_set_text		(GlutObject obj, char *text);
208 
209 void		glut_button_init 		(GlutObject obj);
210 void		glut_button_destroy 		(GlutObject obj);
211 GlutObject	glut_button_new 		(void);
212 void		glut_button_set_text		(GlutObject obj, char *text);
213 void		glut_button_invoke		(GlutObject obj);
214 
215 void		glut_entry_init 		(GlutObject obj);
216 void		glut_entry_destroy 		(GlutObject obj);
217 GlutObject	glut_entry_new	 		(void);
218 void		glut_entry_set_text		(GlutObject obj, char *text);
219 void		glut_entry_invoke		(GlutObject obj);
220 
221 void		glut_display_func		(void);
222 void		glut_reshape_func		(int width, int height);
223 void		glut_keyboard_func		(unsigned char key,
224     						 int x, int y);
225 void		glut_special_func		(int key, int x, int y);
226 void		glut_mouse_func			(int button, int state,
227     						 int x, int y);
228 void		glut_passive_motion_func	(int x, int y);
229 
230 void		glut_append_object		(GlutObject obj);
231 void		glut_prepend_object		(GlutObject obj);
232 void		glut_insert_object		(GlutObject obj,
233     						 GlutObject after);
234 void		glut_remove_object		(GlutObject obj);
235 
236 GlutObject	glut_previous_object		(GlutObject);
237 GlutObject	glut_next_object		(GlutObject);
238 GlutObject	glut_last_object		(void);
239 
240 GlutObject	glut_previous_focus_widget	(GlutObject);
241 GlutObject	glut_next_focus_widget		(GlutObject);
242 
243 int		glut_bitmap_string_width	(void *font, char *string,
244     						 int length);
245 GlutFontInfo*	glut_get_bitmap_font_info	(void *font);
246 
247 void		glut_forget_all			(void);
248 
249 
250 #ifdef __cplusplus
251 }
252 #endif
253 
254 #endif /* __GRACER_WIDGETS_H__ */
255