rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@0
|
3 #include <assert.h>
|
nuclear@3
|
4 #include <vector>
|
nuclear@0
|
5 #include <GL/glut.h>
|
nuclear@4
|
6 #include "goatkit.h"
|
nuclear@0
|
7
|
nuclear@0
|
8 static bool init();
|
nuclear@0
|
9 static void cleanup();
|
nuclear@0
|
10 static void disp();
|
nuclear@3
|
11 static void idle();
|
nuclear@0
|
12 static void reshape(int x, int y);
|
nuclear@0
|
13 static void keypress(unsigned char key, int x, int y);
|
nuclear@0
|
14 static void keyrelease(unsigned char key, int x, int y);
|
nuclear@0
|
15 static void skeypress(int key, int x, int y);
|
nuclear@0
|
16 static void skeyrelease(int key, int x, int y);
|
nuclear@0
|
17 static void mouse(int bn, int st, int x, int y);
|
nuclear@0
|
18 static void motion(int x, int y);
|
nuclear@0
|
19
|
nuclear@4
|
20 static std::vector<goatkit::Widget*> widgets;
|
nuclear@3
|
21
|
nuclear@0
|
22 int main(int argc, char **argv)
|
nuclear@0
|
23 {
|
nuclear@0
|
24 glutInitWindowSize(800, 600);
|
nuclear@0
|
25 glutInit(&argc, argv);
|
nuclear@0
|
26 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
|
nuclear@4
|
27 glutCreateWindow("goatkit test");
|
nuclear@0
|
28
|
nuclear@0
|
29 glutDisplayFunc(disp);
|
nuclear@3
|
30 glutIdleFunc(idle);
|
nuclear@0
|
31 glutReshapeFunc(reshape);
|
nuclear@0
|
32 glutKeyboardFunc(keypress);
|
nuclear@0
|
33 glutKeyboardUpFunc(keyrelease);
|
nuclear@0
|
34 glutSpecialFunc(skeypress);
|
nuclear@0
|
35 glutSpecialUpFunc(skeyrelease);
|
nuclear@0
|
36 glutMouseFunc(mouse);
|
nuclear@0
|
37 glutMotionFunc(motion);
|
nuclear@0
|
38 glutPassiveMotionFunc(motion);
|
nuclear@0
|
39
|
nuclear@0
|
40 if(!init()) {
|
nuclear@0
|
41 return 1;
|
nuclear@0
|
42 }
|
nuclear@0
|
43 atexit(cleanup);
|
nuclear@0
|
44
|
nuclear@0
|
45 glutMainLoop();
|
nuclear@0
|
46 return 0;
|
nuclear@0
|
47 }
|
nuclear@0
|
48
|
nuclear@0
|
49
|
nuclear@0
|
50 static bool init()
|
nuclear@0
|
51 {
|
nuclear@4
|
52 goatkit::Button *button = new goatkit::Button;
|
nuclear@3
|
53 button->set_position(350, 280);
|
nuclear@3
|
54 button->set_size(100, 40);
|
nuclear@3
|
55 widgets.push_back(button);
|
nuclear@3
|
56
|
nuclear@0
|
57 return true;
|
nuclear@0
|
58 }
|
nuclear@0
|
59
|
nuclear@0
|
60 static void cleanup()
|
nuclear@0
|
61 {
|
nuclear@3
|
62 for(size_t i=0; i<widgets.size(); i++) {
|
nuclear@3
|
63 delete widgets[i];
|
nuclear@3
|
64 }
|
nuclear@0
|
65 }
|
nuclear@0
|
66
|
nuclear@0
|
67 static void disp()
|
nuclear@0
|
68 {
|
nuclear@3
|
69 glClearColor(0.2, 0.2, 0.2, 1.0);
|
nuclear@0
|
70 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
nuclear@0
|
71
|
nuclear@3
|
72 for(size_t i=0; i<widgets.size(); i++) {
|
nuclear@3
|
73 widgets[i]->draw();
|
nuclear@3
|
74 }
|
nuclear@3
|
75
|
nuclear@0
|
76 glutSwapBuffers();
|
nuclear@0
|
77 assert(glGetError() == GL_NO_ERROR);
|
nuclear@0
|
78 }
|
nuclear@0
|
79
|
nuclear@3
|
80 static void idle()
|
nuclear@3
|
81 {
|
nuclear@3
|
82 glutPostRedisplay();
|
nuclear@3
|
83 }
|
nuclear@3
|
84
|
nuclear@0
|
85 static void reshape(int x, int y)
|
nuclear@0
|
86 {
|
nuclear@0
|
87 glViewport(0, 0, x, y);
|
nuclear@0
|
88 glMatrixMode(GL_PROJECTION);
|
nuclear@0
|
89 glLoadIdentity();
|
nuclear@3
|
90 glOrtho(0, x, 0, y, -1, 1);
|
nuclear@0
|
91 }
|
nuclear@0
|
92
|
nuclear@0
|
93 static void keypress(unsigned char key, int x, int y)
|
nuclear@0
|
94 {
|
nuclear@0
|
95 if(key == 27) {
|
nuclear@0
|
96 exit(0);
|
nuclear@0
|
97 }
|
nuclear@0
|
98 }
|
nuclear@0
|
99
|
nuclear@0
|
100 static void keyrelease(unsigned char key, int x, int y)
|
nuclear@0
|
101 {
|
nuclear@0
|
102 }
|
nuclear@0
|
103
|
nuclear@0
|
104 static void skeypress(int key, int x, int y)
|
nuclear@0
|
105 {
|
nuclear@0
|
106 }
|
nuclear@0
|
107
|
nuclear@0
|
108 static void skeyrelease(int key, int x, int y)
|
nuclear@0
|
109 {
|
nuclear@0
|
110 }
|
nuclear@0
|
111
|
nuclear@0
|
112 static void mouse(int bn, int st, int x, int y)
|
nuclear@0
|
113 {
|
nuclear@3
|
114 int bidx = bn - GLUT_LEFT_BUTTON;
|
nuclear@3
|
115 bool down = st == GLUT_DOWN;
|
nuclear@3
|
116
|
nuclear@3
|
117 for(size_t i=0; i<widgets.size(); i++) {
|
nuclear@4
|
118 goatkit::Widget *w = widgets[i];
|
nuclear@3
|
119
|
nuclear@4
|
120 if(w->hit_test(goatkit::Vec2(x, y))) {
|
nuclear@4
|
121 goatkit::Event ev;
|
nuclear@4
|
122 ev.type = goatkit::EV_MOUSE_BUTTON;
|
nuclear@3
|
123 ev.button.button = bidx;
|
nuclear@3
|
124 ev.button.press = down;
|
nuclear@4
|
125 ev.button.pos = goatkit::Vec2(x, y);
|
nuclear@3
|
126 w->handle_event(ev);
|
nuclear@3
|
127 }
|
nuclear@3
|
128 }
|
nuclear@0
|
129 }
|
nuclear@0
|
130
|
nuclear@0
|
131 static void motion(int x, int y)
|
nuclear@0
|
132 {
|
nuclear@4
|
133 static goatkit::Widget *active;
|
nuclear@3
|
134
|
nuclear@4
|
135 if(active && !active->hit_test(goatkit::Vec2(x, y))) {
|
nuclear@4
|
136 goatkit::Event ev;
|
nuclear@4
|
137 ev.type = goatkit::EV_MOUSE_FOCUS;
|
nuclear@3
|
138 ev.focus.enter = false;
|
nuclear@3
|
139 active->handle_event(ev);
|
nuclear@3
|
140 active = 0;
|
nuclear@3
|
141 }
|
nuclear@3
|
142
|
nuclear@3
|
143 for(size_t i=0; i<widgets.size(); i++) {
|
nuclear@4
|
144 goatkit::Widget *w = widgets[i];
|
nuclear@3
|
145
|
nuclear@4
|
146 if(w->hit_test(goatkit::Vec2(x, y))) {
|
nuclear@3
|
147 if(active != w) {
|
nuclear@4
|
148 goatkit::Event ev;
|
nuclear@4
|
149 ev.type = goatkit::EV_MOUSE_FOCUS;
|
nuclear@3
|
150 ev.focus.enter = true;
|
nuclear@3
|
151 w->handle_event(ev);
|
nuclear@3
|
152 active = w;
|
nuclear@3
|
153 }
|
nuclear@3
|
154 }
|
nuclear@3
|
155 }
|
nuclear@0
|
156 }
|