summaryrefslogtreecommitdiff
path: root/uisimulator/win32/button.c
diff options
context:
space:
mode:
authorJörg Hohensohn <hohensoh@rockbox.org>2003-04-19 13:15:33 +0000
committerJörg Hohensohn <hohensoh@rockbox.org>2003-04-19 13:15:33 +0000
commitc6fb565dd98d2da0cd5ba0e29b73c49617edcb9c (patch)
tree44ab870d30d5f5872a4bb35d49936185296616e3 /uisimulator/win32/button.c
parent6d522179dcbba409768a02845237967f39264e85 (diff)
downloadrockbox-c6fb565dd98d2da0cd5ba0e29b73c49617edcb9c.tar.gz
rockbox-c6fb565dd98d2da0cd5ba0e29b73c49617edcb9c.zip
most of UI sim patch 708460 from Magnus Holmgren, except the bitmap removal
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3571 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'uisimulator/win32/button.c')
-rw-r--r--uisimulator/win32/button.c233
1 files changed, 147 insertions, 86 deletions
diff --git a/uisimulator/win32/button.c b/uisimulator/win32/button.c
index 7176cbc20c..807e08fe22 100644
--- a/uisimulator/win32/button.c
+++ b/uisimulator/win32/button.c
@@ -20,119 +20,180 @@
20#include <windows.h> 20#include <windows.h>
21#include "uisw32.h" 21#include "uisw32.h"
22#include "config.h" 22#include "config.h"
23#include "sh7034.h"
24#include "button.h" 23#include "button.h"
25#include "kernel.h" 24#include "kernel.h"
25#include "backlight.h"
26 26
27#define KEY(k) (HIBYTE(GetKeyState (k)) & 1) 27/* how long until repeat kicks in */
28#define REPEAT_START 6
28 29
29int last_key ; 30/* the speed repeat starts at */
30static int release_mask; 31#define REPEAT_INTERVAL_START 4
31static int repeat_mask;
32 32
33/* speed repeat finishes at */
34#define REPEAT_INTERVAL_FINISH 2
33 35
34void button_init(void) 36long last_keypress;
35{ 37struct event_queue button_queue;
36 last_key = 0 ;
37}
38 38
39int button_set_repeat(int newmask) 39void button_event(int key, bool pressed)
40{ 40{
41 int oldmask = repeat_mask; 41 bool post = false;
42 repeat_mask = newmask; 42 int new_btn = 0;
43 return oldmask; 43 int diff = 0;
44} 44 static int count = 0;
45 static int btn = 0; /* Hopefully keeps track of currently pressed keys... */
46 static int lastbtn;
47 static int repeat_speed = REPEAT_INTERVAL_START;
48 static int repeat_count = 0;
49 static bool repeat = false;
50
51 switch (key)
52 {
53 case VK_NUMPAD4:
54 case VK_LEFT:
55 new_btn = BUTTON_LEFT;
56 break;
57 case VK_NUMPAD6:
58 case VK_RIGHT:
59 new_btn = BUTTON_RIGHT;
60 break;
61 case VK_NUMPAD8:
62 case VK_UP:
63 new_btn = BUTTON_UP;
64 break;
65 case VK_NUMPAD2:
66 case VK_DOWN:
67 new_btn = BUTTON_DOWN;
68 break;
69 case VK_ADD:
70 new_btn = BUTTON_ON;
71 break;
45 72
46int button_set_release(int newmask) 73#ifdef HAVE_RECORDER_KEYPAD
47{ 74 case VK_RETURN:
48 int oldmask = release_mask; 75 new_btn = BUTTON_OFF;
49 release_mask = newmask; 76 break;
50 return oldmask; 77 case VK_DIVIDE:
51} 78 case VK_F1:
79 new_btn = BUTTON_F1;
80 break;
81 case VK_MULTIPLY:
82 case VK_F2:
83 new_btn = BUTTON_F2;
84 break;
85 case VK_SUBTRACT:
86 case VK_F3:
87 new_btn = BUTTON_F3;
88 break;
89 case VK_NUMPAD5:
90 case VK_SPACE:
91 new_btn = BUTTON_PLAY;
92 break;
93#else
94 case VK_RETURN:
95 new_btn = BUTTON_MENU;
96 break;
97#endif
98 }
52 99
53static int real_button_get(void) 100 if (pressed)
54{ 101 btn |= new_btn;
55 int btn = 0; 102 else
56 Sleep (25); 103 btn &= !new_btn;
104
105 /* Lots of stuff copied from real button.c. Not good, I think... */
57 106
58 if (bActive) 107 /* Find out if a key has been released */
108 diff = btn ^ lastbtn;
109
110 if(diff && (btn & diff) == 0)
59 { 111 {
60 if (KEY (VK_NUMPAD4) || 112 queue_post(&button_queue, BUTTON_REL | diff, NULL);
61 KEY (VK_LEFT)) // left button 113 }
62 btn |= BUTTON_LEFT;
63 114
64 if (KEY (VK_NUMPAD6) || 115 if ( btn )
65 KEY (VK_RIGHT)) 116 {
66 btn |= BUTTON_RIGHT; // right button 117 /* normal keypress */
118 if ( btn != lastbtn )
119 {
120 post = true;
121 repeat = false;
122 repeat_speed = REPEAT_INTERVAL_START;
67 123
68 if (KEY (VK_NUMPAD8) || 124 }
69 KEY (VK_UP)) 125 else /* repeat? */
70 btn |= BUTTON_UP; // up button 126 {
127 if ( repeat )
128 {
129 count--;
130 if (count == 0)
131 {
132 post = true;
133 /* yes we have repeat */
134 repeat_speed--;
135 if (repeat_speed < REPEAT_INTERVAL_FINISH)
136 repeat_speed = REPEAT_INTERVAL_FINISH;
137 count = repeat_speed;
138
139 repeat_count++;
140 }
141 }
142 else
143 {
144 if (count++ > REPEAT_START)
145 {
146 post = true;
147 repeat = true;
148 repeat_count = 0;
149 /* initial repeat */
150 count = REPEAT_INTERVAL_START;
151 }
152 }
153 }
71 154
72 if (KEY (VK_NUMPAD2) || 155 if ( post )
73 KEY (VK_DOWN)) 156 {
74 btn |= BUTTON_DOWN; // down button 157 if(repeat)
158 queue_post(&button_queue, BUTTON_REPEAT | btn, NULL);
159 else
160 queue_post(&button_queue, btn, NULL);
75 161
76 if (KEY (VK_ADD)) 162 backlight_on();
77 btn |= BUTTON_ON; // on button
78
79#ifdef HAVE_RECORDER_KEYPAD
80 if (KEY (VK_RETURN))
81 btn |= BUTTON_OFF; // off button
82
83 if (KEY (VK_DIVIDE) || KEY(VK_F1))
84 btn |= BUTTON_F1; // F1 button
85
86 if (KEY (VK_MULTIPLY) || KEY(VK_F2))
87 btn |= BUTTON_F2; // F2 button
88
89 if (KEY (VK_SUBTRACT) || KEY(VK_F3))
90 btn |= BUTTON_F3; // F3 button
91
92 if (KEY (VK_NUMPAD5) ||
93 KEY (VK_SPACE))
94 btn |= BUTTON_PLAY; // play button
95#else
96 if (KEY (VK_RETURN))
97 btn |= BUTTON_MENU; // menu button
98#endif
99 163
100 if (btn != 0) { 164 last_keypress = current_tick;
101 last_key = 0 ; 165 }
102 } 166 }
167 else
168 {
169 repeat = false;
170 count = 0;
103 } 171 }
104 172
105 return btn; 173 lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT);
106} 174}
107 175
108int button_get(bool block) 176void button_init(void)
109{ 177{
110 int btn; 178 last_keypress = 0;
111 do { 179}
112 180
113 btn = real_button_get(); 181/* Again copied from real button.c... */
114 182
115 if (btn) 183int button_get(bool block)
116 break; 184{
117 185 struct event ev;
118 } while (block);
119 186
120 return btn; 187 if ( block || !queue_empty(&button_queue) ) {
188 queue_wait(&button_queue, &ev);
189 return ev.id;
190 }
191 return BUTTON_NONE;
121} 192}
122 193
123int button_get_w_tmo(int ticks) 194int button_get_w_tmo(int ticks)
124{ 195{
125 int btn; 196 struct event ev;
126 do { 197 queue_wait_w_tmo(&button_queue, &ev, ticks);
127 btn = real_button_get(); 198 return (ev.id != SYS_TIMEOUT)? ev.id: BUTTON_NONE;
128 199}
129 if(!btn)
130 /* prevent busy-looping */
131 sleep(10); /* one tick! */
132 else
133 return btn;
134
135 } while (--ticks);
136
137 return btn;
138}