imtk
diff src/imtk.c @ 0:b04d49e4599c
foo
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Thu, 30 Dec 2010 05:22:14 +0200 |
parents | |
children | dfbd12d1f566 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/imtk.c Thu Dec 30 05:22:14 2010 +0200 1.3 @@ -0,0 +1,161 @@ 1.4 +#include <stdio.h> 1.5 +#include <assert.h> 1.6 +#ifndef __APPLE__ 1.7 +#include <GL/glut.h> 1.8 +#else 1.9 +#include <GLUT/glut.h> 1.10 +#endif 1.11 +#include "imtk.h" 1.12 + 1.13 +static int scr_width = 1, scr_height = 1; 1.14 +static int mousex, mousey, mouse_bnmask; 1.15 +static int active = -1, hot = -1; 1.16 + 1.17 +static void set_active(int id); 1.18 +static int set_hot(int id); 1.19 +static int hit_test(int x, int y, int w, int h); 1.20 + 1.21 +static void draw_button(int id, int x, int y, const char *label, int focused); 1.22 +static void calc_button_size(const char *label, int *wret, int *hret); 1.23 +static void draw_string(int x, int y, const char *str); 1.24 +static int string_size(const char *str); 1.25 + 1.26 +void imtk_inp_key(int key, int state) 1.27 +{ 1.28 + glutPostRedisplay(); 1.29 +} 1.30 + 1.31 +void imtk_inp_mouse(int bn, int state) 1.32 +{ 1.33 + if(state == IMTK_DOWN) { 1.34 + mouse_bnmask |= 1 << bn; 1.35 + } else { 1.36 + mouse_bnmask &= ~(1 << bn); 1.37 + } 1.38 + glutPostRedisplay(); 1.39 +} 1.40 + 1.41 +void imtk_inp_motion(int x, int y) 1.42 +{ 1.43 + mousex = x; 1.44 + mousey = y; 1.45 + 1.46 + glutPostRedisplay(); 1.47 +} 1.48 + 1.49 +void imtk_inp_reshape(int x, int y) 1.50 +{ 1.51 + scr_width = x; 1.52 + scr_height = y; 1.53 +} 1.54 + 1.55 +void imtk_begin(void) 1.56 +{ 1.57 + glMatrixMode(GL_PROJECTION); 1.58 + glPushMatrix(); 1.59 + glLoadIdentity(); 1.60 + glTranslatef(-1, 1, 0); 1.61 + glScalef(2.0 / scr_width, -2.0 / scr_height, 1.0); 1.62 +} 1.63 + 1.64 +void imtk_end(void) 1.65 +{ 1.66 + glMatrixMode(GL_PROJECTION); 1.67 + glPopMatrix(); 1.68 +} 1.69 + 1.70 +int imtk_button(int id, const char *label, int x, int y) 1.71 +{ 1.72 + int w, h, res = 0; 1.73 + int over = 0; 1.74 + 1.75 + assert(id >= 0); 1.76 + 1.77 + calc_button_size(label, &w, &h); 1.78 + 1.79 + if(hit_test(x, y, w, h)) { 1.80 + if(set_hot(id)) { 1.81 + glutPostRedisplay(); 1.82 + } 1.83 + over = 1; 1.84 + } 1.85 + 1.86 + 1.87 + if(mouse_bnmask & (1 << IMTK_LEFT_BUTTON)) { 1.88 + if(over) { 1.89 + set_active(id); 1.90 + } 1.91 + } else { /* mouse button up */ 1.92 + if(active == id) { 1.93 + set_active(-1); 1.94 + if(hot == id && over) { 1.95 + res = 1; 1.96 + } 1.97 + } 1.98 + } 1.99 + 1.100 + draw_button(id, x, y, label, over); 1.101 + return res; 1.102 +} 1.103 + 1.104 +static void set_active(int id) 1.105 +{ 1.106 + active = id; 1.107 +} 1.108 + 1.109 +static int set_hot(int id) 1.110 +{ 1.111 + if(active == -1) { 1.112 + hot = id; 1.113 + return 1; 1.114 + } 1.115 + return 0; 1.116 +} 1.117 + 1.118 +static int hit_test(int x, int y, int w, int h) 1.119 +{ 1.120 + return mousex >= x && mousex < (x + w) && 1.121 + mousey >= y && mousey < (y + h); 1.122 +} 1.123 + 1.124 +static void draw_button(int id, int x, int y, const char *label, int focused) 1.125 +{ 1.126 + int width, height; 1.127 + 1.128 + calc_button_size(label, &width, &height); 1.129 + 1.130 + glBegin(GL_QUADS); 1.131 + if(focused) { 1.132 + glColor3f(0.85, 0.85, 0.85); 1.133 + } else { 1.134 + glColor3f(0.7, 0.7, 0.7); 1.135 + } 1.136 + glVertex2f(x, y); 1.137 + glVertex2f(x + width, y); 1.138 + glVertex2f(x + width, y + height); 1.139 + glVertex2f(x, y + height); 1.140 + glEnd(); 1.141 + 1.142 + glColor3f(0, 0, 0); 1.143 + draw_string(x + 20, y + 15, label); 1.144 +} 1.145 + 1.146 +static void calc_button_size(const char *label, int *wret, int *hret) 1.147 +{ 1.148 + int strsz = string_size(label); 1.149 + if(wret) *wret = strsz + 40; 1.150 + if(hret) *hret = 20; 1.151 +} 1.152 + 1.153 +static void draw_string(int x, int y, const char *str) 1.154 +{ 1.155 + glRasterPos2i(x, y); 1.156 + while(*str) { 1.157 + glutBitmapCharacter(GLUT_BITMAP_HELVETICA_10, *str++); 1.158 + } 1.159 +} 1.160 + 1.161 +static int string_size(const char *str) 1.162 +{ 1.163 + return glutBitmapLength(GLUT_BITMAP_HELVETICA_10, str); 1.164 +}