diff options
Diffstat (limited to 'uisimulator/win32/button.c')
-rw-r--r-- | uisimulator/win32/button.c | 233 |
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 | ||
29 | int last_key ; | 30 | /* the speed repeat starts at */ |
30 | static int release_mask; | 31 | #define REPEAT_INTERVAL_START 4 |
31 | static int repeat_mask; | ||
32 | 32 | ||
33 | /* speed repeat finishes at */ | ||
34 | #define REPEAT_INTERVAL_FINISH 2 | ||
33 | 35 | ||
34 | void button_init(void) | 36 | long last_keypress; |
35 | { | 37 | struct event_queue button_queue; |
36 | last_key = 0 ; | ||
37 | } | ||
38 | 38 | ||
39 | int button_set_repeat(int newmask) | 39 | void 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 | ||
46 | int 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 | ||
53 | static 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 | ||
108 | int button_get(bool block) | 176 | void 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) | 183 | int 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 | ||
123 | int button_get_w_tmo(int ticks) | 194 | int 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 | } | ||