rayfract

annotate src/imtk/state.c @ 10:1496aae2e7d4

- simplified build by including dependences in the source tree - added make dep tracking - added mingw cross-build rules - added readme & licence
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 31 Jul 2023 18:58:56 +0300
parents
children
rev   line source
nuclear@10 1 #include "state.h"
nuclear@10 2 #include "imtk.h"
nuclear@10 3
nuclear@10 4 struct key_node {
nuclear@10 5 int key;
nuclear@10 6 struct key_node *next;
nuclear@10 7 };
nuclear@10 8
nuclear@10 9
nuclear@10 10 struct imtk_state st = {
nuclear@10 11 1, 1, /* scr_width/scr_height */
nuclear@10 12 0, 0, 0, 0, 0, /* mousex/mousey, prevx, prevy, mouse_bnmask */
nuclear@10 13 -1, -1, -1, -1 /* active, hot, input, prev_active */
nuclear@10 14 };
nuclear@10 15
nuclear@10 16 static struct key_node *key_list, *key_tail;
nuclear@10 17
nuclear@10 18
nuclear@10 19
nuclear@10 20 void imtk_inp_key(int key, int state)
nuclear@10 21 {
nuclear@10 22 if(state == IMTK_DOWN) {
nuclear@10 23 struct key_node *node;
nuclear@10 24
nuclear@10 25 if(!(node = malloc(sizeof *node))) {
nuclear@10 26 return;
nuclear@10 27 }
nuclear@10 28 node->key = key;
nuclear@10 29 node->next = 0;
nuclear@10 30
nuclear@10 31 if(key_list) {
nuclear@10 32 key_tail->next = node;
nuclear@10 33 key_tail = node;
nuclear@10 34 } else {
nuclear@10 35 key_list = key_tail = node;
nuclear@10 36 }
nuclear@10 37 }
nuclear@10 38
nuclear@10 39 imtk_post_redisplay();
nuclear@10 40 }
nuclear@10 41
nuclear@10 42 void imtk_inp_mouse(int bn, int state)
nuclear@10 43 {
nuclear@10 44 if(state == IMTK_DOWN) {
nuclear@10 45 st.mouse_bnmask |= 1 << bn;
nuclear@10 46 } else {
nuclear@10 47 st.mouse_bnmask &= ~(1 << bn);
nuclear@10 48 }
nuclear@10 49 imtk_post_redisplay();
nuclear@10 50 }
nuclear@10 51
nuclear@10 52 void imtk_inp_motion(int x, int y)
nuclear@10 53 {
nuclear@10 54 st.mousex = x;
nuclear@10 55 st.mousey = y;
nuclear@10 56
nuclear@10 57 imtk_post_redisplay();
nuclear@10 58 }
nuclear@10 59
nuclear@10 60 void imtk_set_viewport(int x, int y)
nuclear@10 61 {
nuclear@10 62 st.scr_width = x;
nuclear@10 63 st.scr_height = y;
nuclear@10 64 }
nuclear@10 65
nuclear@10 66 void imtk_get_viewport(int *width, int *height)
nuclear@10 67 {
nuclear@10 68 if(width) *width = st.scr_width;
nuclear@10 69 if(height) *height = st.scr_height;
nuclear@10 70 }
nuclear@10 71
nuclear@10 72
nuclear@10 73 void imtk_set_active(int id)
nuclear@10 74 {
nuclear@10 75 if(id == -1 || st.hot == id) {
nuclear@10 76 st.prev_active = st.active;
nuclear@10 77 st.active = id;
nuclear@10 78 }
nuclear@10 79 }
nuclear@10 80
nuclear@10 81 int imtk_is_active(int id)
nuclear@10 82 {
nuclear@10 83 return st.active == id;
nuclear@10 84 }
nuclear@10 85
nuclear@10 86 int imtk_set_hot(int id)
nuclear@10 87 {
nuclear@10 88 if(st.active == -1) {
nuclear@10 89 st.hot = id;
nuclear@10 90 return 1;
nuclear@10 91 }
nuclear@10 92 return 0;
nuclear@10 93 }
nuclear@10 94
nuclear@10 95 int imtk_is_hot(int id)
nuclear@10 96 {
nuclear@10 97 return st.hot == id;
nuclear@10 98 }
nuclear@10 99
nuclear@10 100 void imtk_set_focus(int id)
nuclear@10 101 {
nuclear@10 102 st.input = id;
nuclear@10 103 }
nuclear@10 104
nuclear@10 105 int imtk_has_focus(int id)
nuclear@10 106 {
nuclear@10 107 return st.input == id;
nuclear@10 108 }
nuclear@10 109
nuclear@10 110 int imtk_hit_test(int x, int y, int w, int h)
nuclear@10 111 {
nuclear@10 112 return st.mousex >= x && st.mousex < (x + w) &&
nuclear@10 113 st.mousey >= y && st.mousey < (y + h);
nuclear@10 114 }
nuclear@10 115
nuclear@10 116 void imtk_get_mouse(int *xptr, int *yptr)
nuclear@10 117 {
nuclear@10 118 if(xptr) *xptr = st.mousex;
nuclear@10 119 if(yptr) *yptr = st.mousey;
nuclear@10 120 }
nuclear@10 121
nuclear@10 122 void imtk_set_prev_mouse(int x, int y)
nuclear@10 123 {
nuclear@10 124 st.prevx = x;
nuclear@10 125 st.prevy = y;
nuclear@10 126 }
nuclear@10 127
nuclear@10 128 void imtk_get_prev_mouse(int *xptr, int *yptr)
nuclear@10 129 {
nuclear@10 130 if(xptr) *xptr = st.prevx;
nuclear@10 131 if(yptr) *yptr = st.prevy;
nuclear@10 132 }
nuclear@10 133
nuclear@10 134 int imtk_button_state(int bn)
nuclear@10 135 {
nuclear@10 136 return st.mouse_bnmask & (1 << bn);
nuclear@10 137 }
nuclear@10 138
nuclear@10 139
nuclear@10 140 int imtk_get_key(void)
nuclear@10 141 {
nuclear@10 142 int key = -1;
nuclear@10 143 struct key_node *node = key_list;
nuclear@10 144
nuclear@10 145 if(node) {
nuclear@10 146 key = node->key;
nuclear@10 147 key_list = node->next;
nuclear@10 148 if(!key_list) {
nuclear@10 149 key_tail = 0;
nuclear@10 150 }
nuclear@10 151 free(node);
nuclear@10 152 }
nuclear@10 153 return key;
nuclear@10 154 }