imtk
changeset 0:b04d49e4599c
foo
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Thu, 30 Dec 2010 05:22:14 +0200 |
parents | |
children | dfbd12d1f566 |
files | Makefile src/imtk.c src/imtk.h test.c |
diffstat | 4 files changed, 313 insertions(+), 0 deletions(-) [+] |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/Makefile Thu Dec 30 05:22:14 2010 +0200 1.3 @@ -0,0 +1,20 @@ 1.4 +src = $(wildcard *.c src/*.c) 1.5 +obj = $(src:.c=.o) 1.6 +bin = test 1.7 + 1.8 +CC = gcc 1.9 +CFLAGS = -pedantic -Wall -g -Isrc 1.10 +LDFLAGS = $(libgl) 1.11 + 1.12 +ifeq ($(shell uname -s), Darwin) 1.13 + libgl = -framework OpenGL -framework GLUT 1.14 +else 1.15 + libgl = -lGL -lglut 1.16 +endif 1.17 + 1.18 +$(bin): $(obj) 1.19 + $(CC) -o $@ $(obj) $(LDFLAGS) 1.20 + 1.21 +.PHONY: clean 1.22 +clean: 1.23 + rm -f $(obj) $(bin)
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/src/imtk.c Thu Dec 30 05:22:14 2010 +0200 2.3 @@ -0,0 +1,161 @@ 2.4 +#include <stdio.h> 2.5 +#include <assert.h> 2.6 +#ifndef __APPLE__ 2.7 +#include <GL/glut.h> 2.8 +#else 2.9 +#include <GLUT/glut.h> 2.10 +#endif 2.11 +#include "imtk.h" 2.12 + 2.13 +static int scr_width = 1, scr_height = 1; 2.14 +static int mousex, mousey, mouse_bnmask; 2.15 +static int active = -1, hot = -1; 2.16 + 2.17 +static void set_active(int id); 2.18 +static int set_hot(int id); 2.19 +static int hit_test(int x, int y, int w, int h); 2.20 + 2.21 +static void draw_button(int id, int x, int y, const char *label, int focused); 2.22 +static void calc_button_size(const char *label, int *wret, int *hret); 2.23 +static void draw_string(int x, int y, const char *str); 2.24 +static int string_size(const char *str); 2.25 + 2.26 +void imtk_inp_key(int key, int state) 2.27 +{ 2.28 + glutPostRedisplay(); 2.29 +} 2.30 + 2.31 +void imtk_inp_mouse(int bn, int state) 2.32 +{ 2.33 + if(state == IMTK_DOWN) { 2.34 + mouse_bnmask |= 1 << bn; 2.35 + } else { 2.36 + mouse_bnmask &= ~(1 << bn); 2.37 + } 2.38 + glutPostRedisplay(); 2.39 +} 2.40 + 2.41 +void imtk_inp_motion(int x, int y) 2.42 +{ 2.43 + mousex = x; 2.44 + mousey = y; 2.45 + 2.46 + glutPostRedisplay(); 2.47 +} 2.48 + 2.49 +void imtk_inp_reshape(int x, int y) 2.50 +{ 2.51 + scr_width = x; 2.52 + scr_height = y; 2.53 +} 2.54 + 2.55 +void imtk_begin(void) 2.56 +{ 2.57 + glMatrixMode(GL_PROJECTION); 2.58 + glPushMatrix(); 2.59 + glLoadIdentity(); 2.60 + glTranslatef(-1, 1, 0); 2.61 + glScalef(2.0 / scr_width, -2.0 / scr_height, 1.0); 2.62 +} 2.63 + 2.64 +void imtk_end(void) 2.65 +{ 2.66 + glMatrixMode(GL_PROJECTION); 2.67 + glPopMatrix(); 2.68 +} 2.69 + 2.70 +int imtk_button(int id, const char *label, int x, int y) 2.71 +{ 2.72 + int w, h, res = 0; 2.73 + int over = 0; 2.74 + 2.75 + assert(id >= 0); 2.76 + 2.77 + calc_button_size(label, &w, &h); 2.78 + 2.79 + if(hit_test(x, y, w, h)) { 2.80 + if(set_hot(id)) { 2.81 + glutPostRedisplay(); 2.82 + } 2.83 + over = 1; 2.84 + } 2.85 + 2.86 + 2.87 + if(mouse_bnmask & (1 << IMTK_LEFT_BUTTON)) { 2.88 + if(over) { 2.89 + set_active(id); 2.90 + } 2.91 + } else { /* mouse button up */ 2.92 + if(active == id) { 2.93 + set_active(-1); 2.94 + if(hot == id && over) { 2.95 + res = 1; 2.96 + } 2.97 + } 2.98 + } 2.99 + 2.100 + draw_button(id, x, y, label, over); 2.101 + return res; 2.102 +} 2.103 + 2.104 +static void set_active(int id) 2.105 +{ 2.106 + active = id; 2.107 +} 2.108 + 2.109 +static int set_hot(int id) 2.110 +{ 2.111 + if(active == -1) { 2.112 + hot = id; 2.113 + return 1; 2.114 + } 2.115 + return 0; 2.116 +} 2.117 + 2.118 +static int hit_test(int x, int y, int w, int h) 2.119 +{ 2.120 + return mousex >= x && mousex < (x + w) && 2.121 + mousey >= y && mousey < (y + h); 2.122 +} 2.123 + 2.124 +static void draw_button(int id, int x, int y, const char *label, int focused) 2.125 +{ 2.126 + int width, height; 2.127 + 2.128 + calc_button_size(label, &width, &height); 2.129 + 2.130 + glBegin(GL_QUADS); 2.131 + if(focused) { 2.132 + glColor3f(0.85, 0.85, 0.85); 2.133 + } else { 2.134 + glColor3f(0.7, 0.7, 0.7); 2.135 + } 2.136 + glVertex2f(x, y); 2.137 + glVertex2f(x + width, y); 2.138 + glVertex2f(x + width, y + height); 2.139 + glVertex2f(x, y + height); 2.140 + glEnd(); 2.141 + 2.142 + glColor3f(0, 0, 0); 2.143 + draw_string(x + 20, y + 15, label); 2.144 +} 2.145 + 2.146 +static void calc_button_size(const char *label, int *wret, int *hret) 2.147 +{ 2.148 + int strsz = string_size(label); 2.149 + if(wret) *wret = strsz + 40; 2.150 + if(hret) *hret = 20; 2.151 +} 2.152 + 2.153 +static void draw_string(int x, int y, const char *str) 2.154 +{ 2.155 + glRasterPos2i(x, y); 2.156 + while(*str) { 2.157 + glutBitmapCharacter(GLUT_BITMAP_HELVETICA_10, *str++); 2.158 + } 2.159 +} 2.160 + 2.161 +static int string_size(const char *str) 2.162 +{ 2.163 + return glutBitmapLength(GLUT_BITMAP_HELVETICA_10, str); 2.164 +}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/src/imtk.h Thu Dec 30 05:22:14 2010 +0200 3.3 @@ -0,0 +1,26 @@ 3.4 +#ifndef IMTK_H_ 3.5 +#define IMTK_H_ 3.6 + 3.7 +/* key/button state enum */ 3.8 +enum { 3.9 + IMTK_UP, 3.10 + IMTK_DOWN 3.11 +}; 3.12 + 3.13 +enum { 3.14 + IMTK_LEFT_BUTTON, 3.15 + IMTK_MIDDLE_BUTTON, 3.16 + IMTK_RIGHT_BUTTON 3.17 +}; 3.18 + 3.19 +void imtk_inp_key(int key, int state); 3.20 +void imtk_inp_mouse(int bn, int state); 3.21 +void imtk_inp_motion(int x, int y); 3.22 +void imtk_inp_reshape(int x, int y); 3.23 + 3.24 +void imtk_begin(void); 3.25 +void imtk_end(void); 3.26 + 3.27 +int imtk_button(int id, const char *label, int x, int y); 3.28 + 3.29 +#endif /* IMTK_H_ */
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/test.c Thu Dec 30 05:22:14 2010 +0200 4.3 @@ -0,0 +1,106 @@ 4.4 +#include <stdio.h> 4.5 +#include <stdlib.h> 4.6 +#ifndef __APPLE__ 4.7 +#include <GL/glut.h> 4.8 +#else 4.9 +#include <GLUT/glut.h> 4.10 +#endif 4.11 +#include "imtk.h" 4.12 + 4.13 +void disp(void); 4.14 +void reshape(int x, int y); 4.15 +void keyb(unsigned char key, int x, int y); 4.16 +void keyb_up(unsigned char key, int x, int y); 4.17 +void skeyb(int key, int x, int y); 4.18 +void skeyb_up(int key, int x, int y); 4.19 +void mouse(int bn, int state, int x, int y); 4.20 +void motion(int x, int y); 4.21 + 4.22 + 4.23 +int main(int argc, char **argv) 4.24 +{ 4.25 + glutInitWindowSize(800, 600); 4.26 + glutInit(&argc, argv); 4.27 + glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); 4.28 + glutCreateWindow("imgui test"); 4.29 + 4.30 + glutDisplayFunc(disp); 4.31 + glutReshapeFunc(reshape); 4.32 + glutKeyboardFunc(keyb); 4.33 + glutKeyboardUpFunc(keyb_up); 4.34 + glutSpecialFunc(skeyb); 4.35 + glutSpecialUpFunc(skeyb_up); 4.36 + glutMouseFunc(mouse); 4.37 + glutMotionFunc(motion); 4.38 + glutPassiveMotionFunc(motion); 4.39 + 4.40 + glutMainLoop(); 4.41 + return 0; 4.42 +} 4.43 + 4.44 +void disp(void) 4.45 +{ 4.46 + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 4.47 + 4.48 + imtk_begin(); 4.49 + 4.50 + if(imtk_button(0, "foobar", 100, 100)) { 4.51 + printf("clicked button 0\n"); 4.52 + } 4.53 + if(imtk_button(1, "xyzzy", 100, 200)) { 4.54 + printf("clicked button 1\n"); 4.55 + } 4.56 + 4.57 + imtk_end(); 4.58 + 4.59 + glutSwapBuffers(); 4.60 +} 4.61 + 4.62 +void reshape(int x, int y) 4.63 +{ 4.64 + glViewport(0, 0, x, y); 4.65 + imtk_inp_reshape(x, y); 4.66 + 4.67 + glMatrixMode(GL_PROJECTION); 4.68 + glLoadIdentity(); 4.69 + glTranslatef(-1, -1, 0); 4.70 + glScalef(2.0 / x, 2.0 / y, 1.0); 4.71 +} 4.72 + 4.73 +void keyb(unsigned char key, int x, int y) 4.74 +{ 4.75 + switch(key) { 4.76 + case 27: 4.77 + exit(0); 4.78 + 4.79 + default: 4.80 + break; 4.81 + } 4.82 + 4.83 + imtk_inp_key(key, IMTK_DOWN); 4.84 +} 4.85 + 4.86 +void keyb_up(unsigned char key, int x, int y) 4.87 +{ 4.88 + imtk_inp_key(key, IMTK_UP); 4.89 +} 4.90 + 4.91 +void skeyb(int key, int x, int y) 4.92 +{ 4.93 + imtk_inp_key(key, IMTK_DOWN); 4.94 +} 4.95 + 4.96 +void skeyb_up(int key, int x, int y) 4.97 +{ 4.98 + imtk_inp_key(key, IMTK_UP); 4.99 +} 4.100 + 4.101 +void mouse(int bn, int state, int x, int y) 4.102 +{ 4.103 + imtk_inp_mouse(bn, state == GLUT_DOWN ? IMTK_DOWN : IMTK_UP); 4.104 +} 4.105 + 4.106 +void motion(int x, int y) 4.107 +{ 4.108 + imtk_inp_motion(x, y); 4.109 +}