Mercurial > otakunoraifu
comparison window/event.cc @ 52:15a18fbe6f21
* Known bugs added to the README
* Code cleaning (0 -> NULL when needed, indentation, spaces, ...)
author | thib |
---|---|
date | Sat, 18 Apr 2009 18:35:39 +0000 |
parents | ed6c21dde840 |
children | 4416cfac86ae |
comparison
equal
deleted
inserted
replaced
51:cbb301016a4e | 52:15a18fbe6f21 |
---|---|
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 */ | 26 */ |
27 | 27 |
28 #include"SDL.h" | 28 #include "SDL.h" |
29 #include"event.h" | 29 #include "event.h" |
30 #include<vector> | 30 #include <vector> |
31 #include<list> | 31 #include <list> |
32 #include<algorithm> | 32 #include <algorithm> |
33 #include<iostream> | 33 #include <iostream> |
34 #include<sys/stat.h> | 34 #include <sys/stat.h> |
35 | 35 |
36 using namespace std; | 36 using namespace std; |
37 | 37 |
38 bool save_req = false, load_req = false, grpdump_req = false; // scn2k/scn2k_impl.cc: キーボードからセーブ・ロードできるように | 38 bool save_req = false, load_req = false, grpdump_req = false; // scn2k/scn2k_impl.cc: キーボードからセーブ・ロードできるように |
39 bool pressAreq=false,pressFreq=false,pressDreq=false; | 39 bool pressAreq=false,pressFreq=false,pressDreq=false; |
127 } | 127 } |
128 void ContainerImplTime::Delete(Time* delete_event) { | 128 void ContainerImplTime::Delete(Time* delete_event) { |
129 iterator it = find(begin(), end(), delete_event); | 129 iterator it = find(begin(), end(), delete_event); |
130 if (it != end()) { | 130 if (it != end()) { |
131 it->valid = false; | 131 it->valid = false; |
132 it->instance = 0; | 132 it->instance = NULL; |
133 return; | 133 return; |
134 } | 134 } |
135 it = find(new_item.begin(), new_item.end(), delete_event); | 135 it = find(new_item.begin(), new_item.end(), delete_event); |
136 if (it != end()) { | 136 if (it != end()) { |
137 it->valid = false; | 137 it->valid = false; |
138 it->instance = 0; | 138 it->instance = NULL; |
139 return; | 139 return; |
140 } | 140 } |
141 return; | 141 } |
142 } | 142 |
143 bool ContainerImplTime::Exec(unsigned int current_time) { | 143 bool ContainerImplTime::Exec(unsigned int current_time) { |
144 if (current_time == Time::NEVER_WAKE) return true; | 144 if (current_time == Time::NEVER_WAKE) return true; |
145 // 呼び出しまでに作製されたitemを追加 | 145 // 呼び出しまでに作製されたitemを追加 |
146 insert(end(), new_item.begin(), new_item.end()); | 146 insert(end(), new_item.begin(), new_item.end()); |
147 new_item.clear(); | 147 new_item.clear(); |
171 return true; | 171 return true; |
172 } | 172 } |
173 | 173 |
174 | 174 |
175 class ContainerImplVideo : private vector<Video*> { | 175 class ContainerImplVideo : private vector<Video*> { |
176 public: | 176 public: |
177 bool Exec(void); | 177 bool Exec(void); |
178 | 178 |
179 ContainerImplVideo(void); | 179 ContainerImplVideo(void); |
180 ~ContainerImplVideo(); | 180 ~ContainerImplVideo(); |
181 void Add(Video* item); | 181 void Add(Video* item); |
182 void Delete(Video* item); | 182 void Delete(Video* item); |
183 void RegisterGlobalMotionFunc(Container::motionfunc, void* pointer); | 183 void RegisterGlobalMotionFunc(Container::motionfunc, void* pointer); |
184 void DeleteGlobalMotionFunc(Container::motionfunc, void* pointer); | 184 void DeleteGlobalMotionFunc(Container::motionfunc, void* pointer); |
185 void RegisterGlobalPressFunc(Container::motionfunc, void* pointer); | 185 void RegisterGlobalPressFunc(Container::motionfunc, void* pointer); |
186 void DeleteGlobalPressFunc(Container::motionfunc, void* pointer); | 186 void DeleteGlobalPressFunc(Container::motionfunc, void* pointer); |
187 private: | 187 private: |
188 struct Motionfunc { | 188 struct Motionfunc { |
189 Container::motionfunc func; | 189 Container::motionfunc func; |
190 void* pointer; | 190 void* pointer; |
191 bool operator ==(const Motionfunc& m) const { return func == m.func && pointer == m.pointer;} | 191 bool operator ==(const Motionfunc& m) const { return func == m.func && pointer == m.pointer;} |
192 }; | 192 }; |
193 list<Motionfunc> motion_vec; | 193 list<Motionfunc> motion_vec; |
194 list<Motionfunc> press_vec; | 194 list<Motionfunc> press_vec; |
195 typedef list<Motionfunc>::iterator MotionIterator; | 195 typedef list<Motionfunc>::iterator MotionIterator; |
196 bool is_sorted; | 196 bool is_sorted; |
197 public: | 197 public: |
198 int button_pressed; | 198 int button_pressed; |
199 int button_released; | 199 int button_released; |
200 int mouse_x, mouse_y; | 200 int mouse_x, mouse_y; |
201 int new_mouse_x, new_mouse_y; | 201 int new_mouse_x, new_mouse_y; |
202 private: | 202 private: |
203 void SetChanged(void); | 203 void SetChanged(void); |
204 static bool SortLess(const Video* pos1, const Video* pos2) { | 204 static bool SortLess(const Video* pos1, const Video* pos2) { |
205 return pos1 < pos2; | 205 return pos1 < pos2; |
206 } | 206 } |
207 void Sort(void); | 207 void Sort(void); |
208 void Motion(int x, int y); // mouse motion | 208 void Motion(int x, int y); // mouse motion |
209 void Press(void); | 209 void Press(void); |
210 void TakeScreenshot(void); | 210 void TakeScreenshot(void); |
211 iterator cur_pos; | 211 iterator cur_pos; |
212 Video* cur_item; // 現在のフォーカス位置 | 212 Video* cur_item; // 現在のフォーカス位置 |
213 int cur_pressed_x, cur_pressed_y; | 213 int cur_pressed_x, cur_pressed_y; |
214 }; | 214 }; |
215 | 215 |
216 void ContainerImplVideo::SetChanged(void) { | 216 void ContainerImplVideo::SetChanged(void) { |
217 if (is_sorted) { | 217 if (is_sorted) { |
218 if (cur_item) { | 218 if (cur_item != NULL) { |
219 cur_pos = find(begin(), end(), cur_item); | 219 cur_pos = find(begin(), end(), cur_item); |
220 if (cur_pos == end()) cur_item = 0; | 220 if (cur_pos == end()) cur_item = NULL; |
221 } | 221 } |
222 is_sorted = false; | 222 is_sorted = false; |
223 } | 223 } |
224 } | 224 } |
225 | 225 |
226 void ContainerImplVideo::Sort(void) { | 226 void ContainerImplVideo::Sort(void) { |
227 sort(begin(), end(), SortLess); | 227 sort(begin(), end(), SortLess); |
228 if (cur_item) { | 228 if (cur_item != NULL) { |
229 cur_pos = lower_bound(begin(), end(), cur_item, SortLess); | 229 cur_pos = lower_bound(begin(), end(), cur_item, SortLess); |
230 } else { | 230 } else { |
231 cur_pos = end(); | 231 cur_pos = end(); |
232 } | 232 } |
233 is_sorted = true; | 233 is_sorted = true; |
235 | 235 |
236 ContainerImplVideo::ContainerImplVideo(void) { | 236 ContainerImplVideo::ContainerImplVideo(void) { |
237 is_sorted = false; | 237 is_sorted = false; |
238 button_pressed = 0; | 238 button_pressed = 0; |
239 button_released = 0; | 239 button_released = 0; |
240 cur_item = 0; | 240 cur_item = NULL; |
241 mouse_x = 0; mouse_y = 0; | 241 mouse_x = 0; mouse_y = 0; |
242 new_mouse_x = 0; new_mouse_y = 0; | 242 new_mouse_x = 0; new_mouse_y = 0; |
243 } | 243 } |
244 | |
244 ContainerImplVideo::~ContainerImplVideo(void) { | 245 ContainerImplVideo::~ContainerImplVideo(void) { |
245 }; | 246 }; |
247 | |
246 void ContainerImplVideo::Add(Video* event) { | 248 void ContainerImplVideo::Add(Video* event) { |
247 push_back(event); | 249 push_back(event); |
248 SetChanged(); | 250 SetChanged(); |
249 } | 251 } |
252 | |
250 void ContainerImplVideo::Delete(Video* delete_event) { | 253 void ContainerImplVideo::Delete(Video* delete_event) { |
251 iterator it = find(begin(), end(), delete_event); | 254 iterator it = find(begin(), end(), delete_event); |
252 if (it != end()) { | 255 if (it != end()) { |
253 erase(it); | 256 erase(it); |
254 SetChanged(); | 257 SetChanged(); |
262 } | 265 } |
263 fprintf(stderr,"\n"); | 266 fprintf(stderr,"\n"); |
264 } | 267 } |
265 if (delete_event == cur_item) { | 268 if (delete_event == cur_item) { |
266 cur_pos = end(); | 269 cur_pos = end(); |
267 cur_item = 0; | 270 cur_item = NULL; |
268 Motion(mouse_x, mouse_y); | 271 Motion(mouse_x, mouse_y); |
269 } | 272 } |
270 return; | 273 } |
271 } | 274 |
272 void ContainerImplVideo::RegisterGlobalMotionFunc(Container::motionfunc func, void* pointer) { | 275 void ContainerImplVideo::RegisterGlobalMotionFunc(Container::motionfunc func, void* pointer) { |
273 Motionfunc f; | 276 Motionfunc f; |
274 f.func = func; | 277 f.func = func; |
275 f.pointer = pointer; | 278 f.pointer = pointer; |
276 if (find(motion_vec.begin(), motion_vec.end(), f) == motion_vec.end()) { | 279 if (find(motion_vec.begin(), motion_vec.end(), f) == motion_vec.end()) { |
277 motion_vec.push_back(f); | 280 motion_vec.push_back(f); |
278 } | 281 } |
279 } | 282 } |
283 | |
280 void ContainerImplVideo::DeleteGlobalMotionFunc(Container::motionfunc func, void* pointer) { | 284 void ContainerImplVideo::DeleteGlobalMotionFunc(Container::motionfunc func, void* pointer) { |
281 Motionfunc f; | 285 Motionfunc f; |
282 f.func = func; | 286 f.func = func; |
283 f.pointer = pointer; | 287 f.pointer = pointer; |
284 list<Motionfunc>::iterator it = find(motion_vec.begin(), motion_vec.end(), f); | 288 list<Motionfunc>::iterator it = find(motion_vec.begin(), motion_vec.end(), f); |
285 if (it != motion_vec.end()) | 289 if (it != motion_vec.end()) |
286 motion_vec.erase(it); | 290 motion_vec.erase(it); |
287 return; | 291 } |
288 } | 292 |
289 void ContainerImplVideo::RegisterGlobalPressFunc(Container::motionfunc func, void* pointer) { | 293 void ContainerImplVideo::RegisterGlobalPressFunc(Container::motionfunc func, void* pointer) { |
290 Motionfunc f; | 294 Motionfunc f; |
291 f.func = func; | 295 f.func = func; |
292 f.pointer = pointer; | 296 f.pointer = pointer; |
293 if (find(press_vec.begin(), press_vec.end(), f) == press_vec.end()) { | 297 if (find(press_vec.begin(), press_vec.end(), f) == press_vec.end()) { |
294 press_vec.push_back(f); | 298 press_vec.push_back(f); |
295 } | 299 } |
296 } | 300 } |
301 | |
297 void ContainerImplVideo::DeleteGlobalPressFunc(Container::motionfunc func, void* pointer) { | 302 void ContainerImplVideo::DeleteGlobalPressFunc(Container::motionfunc func, void* pointer) { |
298 Motionfunc f; | 303 Motionfunc f; |
299 f.func = func; | 304 f.func = func; |
300 f.pointer = pointer; | 305 f.pointer = pointer; |
301 list<Motionfunc>::iterator it = find(press_vec.begin(), press_vec.end(), f); | 306 list<Motionfunc>::iterator it = find(press_vec.begin(), press_vec.end(), f); |
302 if (it != press_vec.end()) | 307 if (it != press_vec.end()) |
303 press_vec.erase(it); | 308 press_vec.erase(it); |
304 return; | 309 } |
305 } | 310 |
306 void ContainerImplVideo::Motion(int x, int y) { | 311 void ContainerImplVideo::Motion(int x, int y) { |
307 mouse_x = x; mouse_y = y; | 312 mouse_x = x; mouse_y = y; |
308 MotionIterator mit; | 313 MotionIterator mit; |
309 for (mit=motion_vec.begin(); mit != motion_vec.end();) { | 314 for (mit=motion_vec.begin(); mit != motion_vec.end();) { |
310 MotionIterator mit_next = mit; | 315 MotionIterator mit_next = mit; |
317 /* @@@ ドラッグ処理とマウスを押す処理のバッティングで「二回ボタンを押さないと云々」関連のバグの可能性あり */ | 322 /* @@@ ドラッグ処理とマウスを押す処理のバッティングで「二回ボタンを押さないと云々」関連のバグの可能性あり */ |
318 if (button_pressed & (1<<MOUSE_LEFT)) { | 323 if (button_pressed & (1<<MOUSE_LEFT)) { |
319 if (cur_item) cur_item->Drag(cur_pressed_x, cur_pressed_y, x, y); | 324 if (cur_item) cur_item->Drag(cur_pressed_x, cur_pressed_y, x, y); |
320 return; | 325 return; |
321 } | 326 } |
322 if (cur_item) cur_item->Motion(x,y); | 327 if (cur_item != NULL) cur_item->Motion(x,y); |
323 int z = -1; iterator z_it; | 328 int z = -1; iterator z_it; |
324 iterator it; | 329 iterator it; |
325 for (it = begin(); it != end(); it++) { | 330 for (it = begin(); it != end(); it++) { |
326 int new_z = (*it)->point_in(x, y); | 331 int new_z = (*it)->point_in(x, y); |
327 if (z < new_z) { | 332 if (z < new_z) { |
337 cur_item->In(); | 342 cur_item->In(); |
338 return; | 343 return; |
339 } else { | 344 } else { |
340 if (cur_item) cur_item->Out(); | 345 if (cur_item) cur_item->Out(); |
341 cur_pos = end(); | 346 cur_pos = end(); |
342 cur_item = 0; | 347 cur_item = NULL; |
343 } | 348 } |
344 return; | 349 return; |
345 } | 350 } |
346 | 351 |
347 void ContainerImplVideo::Press(void) { | 352 void ContainerImplVideo::Press(void) { |
359 press_vec.erase(mit); | 364 press_vec.erase(mit); |
360 } | 365 } |
361 mit = mit_next; | 366 mit = mit_next; |
362 } | 367 } |
363 } | 368 } |
369 | |
364 void ContainerImplVideo::TakeScreenshot(void) { | 370 void ContainerImplVideo::TakeScreenshot(void) { |
365 int n=0; | 371 int n=0; |
366 char filename[1024]; | 372 char filename[1024]; |
367 struct stat buffer; | 373 struct stat buffer; |
368 for(n=0; n<9999; n++) { | 374 for(n=0; n<9999; n++) { |
370 sprintf(filename, "xclannad_%04i.bmp", n); | 376 sprintf(filename, "xclannad_%04i.bmp", n); |
371 if(stat(filename, &buffer) == -1) break; | 377 if(stat(filename, &buffer) == -1) break; |
372 } | 378 } |
373 SDL_SaveBMP(SDL_GetVideoSurface(), filename); | 379 SDL_SaveBMP(SDL_GetVideoSurface(), filename); |
374 } | 380 } |
381 | |
375 bool ContainerImplVideo::Exec(void) { | 382 bool ContainerImplVideo::Exec(void) { |
376 | |
377 bool is_mouse_motion = false; | 383 bool is_mouse_motion = false; |
378 int motion_x = 0, motion_y = 0; | 384 int motion_x = 0, motion_y = 0; |
379 SDL_Event event; | 385 SDL_Event event; |
380 SDL_PumpEvents(); | 386 SDL_PumpEvents(); |
381 while(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_ALLEVENTS) == 1) { | 387 while(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_ALLEVENTS) == 1) { |
382 switch(event.type) { | 388 switch(event.type) { |
383 case SDL_QUIT: return false; // @@@ なにかやらないと | 389 case SDL_QUIT: return false; // @@@ なにかやらないと |
384 case SDL_ACTIVEEVENT: // なにもしない | 390 case SDL_ACTIVEEVENT: // なにもしない |
385 // cout<<"active : gain "<<int(event.active.gain)<<", state "<<int(event.active.state)<<endl; | 391 // cout<<"active : gain "<<int(event.active.gain)<<", state "<<int(event.active.state)<<endl; |
386 break; | |
387 case SDL_KEYDOWN: | |
388 if (!is_sorted) Sort(); | |
389 switch(event.key.keysym.sym) { | |
390 case SDLK_F12: | |
391 case SDLK_PRINT: | |
392 case SDLK_p: // for Zaurus | |
393 TakeScreenshot(); | |
394 break; | 392 break; |
395 // Some window managers (eg enlightenment) use Alt-Enter for | 393 case SDL_KEYDOWN: |
396 // themselves, F11 is a good alternative | 394 if (!is_sorted) Sort(); |
397 case SDLK_F11: | 395 switch(event.key.keysym.sym) { |
398 SDL_WM_ToggleFullScreen(SDL_GetVideoSurface()); | 396 case SDLK_F12: |
399 break; | 397 case SDLK_PRINT: |
400 case SDLK_RETURN: | 398 case SDLK_p: // for Zaurus |
401 if (SDL_GetModState() & KMOD_ALT) { | 399 TakeScreenshot(); |
402 SDL_WM_ToggleFullScreen(SDL_GetVideoSurface()); | 400 break; |
403 break; | 401 // Some window managers (eg enlightenment) use Alt-Enter for |
404 } | 402 // themselves, F11 is a good alternative |
405 case SDLK_SPACE: | 403 case SDLK_F11: |
406 Press(); | 404 SDL_WM_ToggleFullScreen(SDL_GetVideoSurface()); |
407 break; | 405 break; |
408 case SDLK_TAB: // move to next widget | 406 case SDLK_RETURN: |
409 if (cur_pos != end()) cur_pos++; | 407 if (SDL_GetModState() & KMOD_ALT) { |
410 if (cur_pos == end()) cur_pos = begin(); | 408 SDL_WM_ToggleFullScreen(SDL_GetVideoSurface()); |
411 if (cur_pos != end()) { | 409 break; |
412 cur_item = *cur_pos; | 410 } |
413 cur_item->In(); | 411 case SDLK_SPACE: |
414 } else { | 412 Press(); |
415 cur_item = 0; | 413 break; |
414 case SDLK_TAB: // move to next widget | |
415 if (cur_pos != end()) cur_pos++; | |
416 if (cur_pos == end()) cur_pos = begin(); | |
417 if (cur_pos != end()) { | |
418 cur_item = *cur_pos; | |
419 cur_item->In(); | |
420 } else { | |
421 cur_item = NULL; | |
422 } | |
423 break; | |
424 case SDLK_LEFT: if (cur_pos != end()) (*cur_pos)->KeyLeft(); break; | |
425 case SDLK_RIGHT:if (cur_pos != end()) (*cur_pos)->KeyRight(); break; | |
426 case SDLK_LSHIFT: case SDLK_RSHIFT: button_pressed |= (1<<KEY_SHIFT); break; | |
427 case SDLK_ESCAPE: button_pressed |= (1<<MOUSE_RIGHT); break; /* for Zaurus */ | |
428 case SDLK_s: save_req = true; break; | |
429 case SDLK_l: load_req = true; break; | |
430 case SDLK_g: grpdump_req = true; break; | |
431 case SDLK_a: pressAreq = true; break; | |
432 case SDLK_d: pressDreq = true; break; | |
433 case SDLK_f: pressFreq = true; break; | |
416 } | 434 } |
417 break; | 435 break; |
418 case SDLK_LEFT: if (cur_pos != end()) (*cur_pos)->KeyLeft(); break; | 436 case SDL_KEYUP: |
419 case SDLK_RIGHT:if (cur_pos != end()) (*cur_pos)->KeyRight(); break; | 437 // cout << "keyup which "<<int(event.key.which)<<", sym "<<int(event.key.keysym.sym)<<endl; |
420 case SDLK_LSHIFT: case SDLK_RSHIFT: button_pressed |= (1<<KEY_SHIFT); break; | 438 switch(event.key.keysym.sym) { |
421 case SDLK_ESCAPE: button_pressed |= (1<<MOUSE_RIGHT); break; /* for Zaurus */ | 439 case SDLK_RETURN: case SDLK_SPACE: |
422 case SDLK_s: save_req = true; break; | 440 if (cur_item) cur_item->Release(); |
423 case SDLK_l: load_req = true; break; | 441 case SDLK_LSHIFT: case SDLK_RSHIFT: button_pressed &= ~(1<<KEY_SHIFT); button_released |= 1<<KEY_SHIFT; break; |
424 case SDLK_g: grpdump_req = true; break; | 442 case SDLK_ESCAPE: button_pressed &= ~(1<<MOUSE_RIGHT); button_released |= 1<<MOUSE_RIGHT; break; /* for Zaurus */ |
425 case SDLK_a: pressAreq = true; break; | 443 } |
426 case SDLK_d: pressDreq = true; break; | 444 break; |
427 case SDLK_f: pressFreq = true; break; | 445 case SDL_MOUSEMOTION: |
428 } | 446 motion_x = event.motion.x; |
429 break; | 447 motion_y = event.motion.y; |
430 case SDL_KEYUP: | 448 is_mouse_motion = true; |
431 // cout << "keyup which "<<int(event.key.which)<<", sym "<<int(event.key.keysym.sym)<<endl; | 449 // Motion(event.motion.x, event.motion.y); |
432 switch(event.key.keysym.sym) { | 450 // cout<< "motion which "<<int(event.motion.which)<< |
433 case SDLK_RETURN: case SDLK_SPACE: | 451 // "x "<<event.motion.x << "y "<<event.motion.y<<endl; |
434 if (cur_item) cur_item->Release(); | 452 break; |
435 case SDLK_LSHIFT: case SDLK_RSHIFT: button_pressed &= ~(1<<KEY_SHIFT); button_released |= 1<<KEY_SHIFT; break; | 453 case SDL_MOUSEBUTTONUP: |
436 case SDLK_ESCAPE: button_pressed &= ~(1<<MOUSE_RIGHT); button_released |= 1<<MOUSE_RIGHT; break; /* for Zaurus */ | 454 if (event.button.button == 1) { |
437 } | 455 Motion(event.button.x, event.button.y); |
438 break; | 456 is_mouse_motion = false; |
439 case SDL_MOUSEMOTION: | 457 if (cur_item) cur_item->Release(); |
440 motion_x = event.motion.x; | 458 } |
441 motion_y = event.motion.y; | 459 switch(event.button.button) { |
442 is_mouse_motion = true; | 460 case 1: |
443 // Motion(event.motion.x, event.motion.y); | 461 button_pressed &= ~(1<<MOUSE_LEFT); |
444 // cout<< "motion which "<<int(event.motion.which)<< | 462 button_released |= 1<<MOUSE_LEFT; |
445 // "x "<<event.motion.x << "y "<<event.motion.y<<endl; | 463 break; |
446 break; | 464 case 2: |
447 case SDL_MOUSEBUTTONUP: | 465 button_pressed &= ~(1<<MOUSE_MIDDLE); |
448 if (event.button.button == 1) { | 466 button_released |= 1<<MOUSE_MIDDLE; |
449 Motion(event.button.x, event.button.y); | 467 break; |
450 is_mouse_motion = false; | 468 case 3: |
451 if (cur_item) cur_item->Release(); | 469 button_pressed &= ~(1<<MOUSE_RIGHT); |
452 } | 470 button_released |= 1<<MOUSE_RIGHT; |
453 switch(event.button.button) { | 471 break; |
454 case 1: button_pressed &= ~(1<<MOUSE_LEFT); button_released |= 1<<MOUSE_LEFT; break; | 472 case 4: |
455 case 2: button_pressed &= ~(1<<MOUSE_MIDDLE); button_released |= 1<<MOUSE_MIDDLE; break; | 473 button_pressed &= ~(1<<MOUSE_UP); |
456 case 3: button_pressed &= ~(1<<MOUSE_RIGHT); button_released |= 1<<MOUSE_RIGHT; break; | 474 button_released |= 1<<MOUSE_UP; |
457 case 4: button_pressed &= ~(1<<MOUSE_UP); button_released |= 1<<MOUSE_UP; break; | 475 break; |
458 case 5: button_pressed &= ~(1<<MOUSE_DOWN); button_released |= 1<<MOUSE_DOWN; break; | 476 case 5: |
459 } | 477 button_pressed &= ~(1<<MOUSE_DOWN); |
460 break; | 478 button_released |= 1<<MOUSE_DOWN; |
461 case SDL_MOUSEBUTTONDOWN: | 479 break; |
462 if (event.button.button == 1) { | 480 } |
463 Motion(event.button.x, event.button.y); | 481 break; |
464 is_mouse_motion = false; | 482 case SDL_MOUSEBUTTONDOWN: |
465 Press(); | 483 if (event.button.button == 1) { |
466 } | 484 Motion(event.button.x, event.button.y); |
467 switch(event.button.button) { | 485 is_mouse_motion = false; |
468 case 1: button_pressed |= (1<<MOUSE_LEFT); break; | 486 Press(); |
469 case 2: button_pressed |= (1<<MOUSE_MIDDLE); break; | 487 } |
470 case 3: button_pressed |= (1<<MOUSE_RIGHT); break; | 488 switch(event.button.button) { |
471 case 4: button_pressed |= (1<<MOUSE_UP); break; | 489 case 1: button_pressed |= (1<<MOUSE_LEFT); break; |
472 case 5: button_pressed |= (1<<MOUSE_DOWN); break; | 490 case 2: button_pressed |= (1<<MOUSE_MIDDLE); break; |
473 } | 491 case 3: button_pressed |= (1<<MOUSE_RIGHT); break; |
474 // cout << "mouse which "<<int(event.button.which)<<"button "<<int(event.button.button)<< | 492 case 4: button_pressed |= (1<<MOUSE_UP); break; |
475 // "state "<<int(event.button.state)<<"x "<<event.button.x << "y "<<event.button.y<<endl; | 493 case 5: button_pressed |= (1<<MOUSE_DOWN); break; |
476 break; | 494 } |
477 case SDL_VIDEOEXPOSE: // redraw の必要がある? | 495 // cout << "mouse which "<<int(event.button.which)<<"button "<<int(event.button.button)<< |
478 // cout<<"expose."<<endl; | 496 // "state "<<int(event.button.state)<<"x "<<event.button.x << "y "<<event.button.y<<endl; |
479 break; | 497 break; |
498 case SDL_VIDEOEXPOSE: // redraw の必要がある? | |
499 // cout<<"expose."<<endl; | |
500 break; | |
480 } | 501 } |
481 } | 502 } |
482 // Motion 呼び出しは一回だけ | 503 // Motion 呼び出しは一回だけ |
483 if (is_mouse_motion) | 504 if (is_mouse_motion) |
484 Motion(motion_x, motion_y); | 505 Motion(motion_x, motion_y); |
485 return true; | 506 return true; |
486 }; | 507 } |
508 | |
487 /* Impl: struct Event::Container */ | 509 /* Impl: struct Event::Container */ |
488 Container::Container(void) { | 510 Container::Container(void) { |
489 pimpl_video = new ContainerImplVideo; | 511 pimpl_video = new ContainerImplVideo; |
490 try { | 512 try { |
491 pimpl_time = new ContainerImplTime; | 513 pimpl_time = new ContainerImplTime; |
493 delete pimpl_video; | 515 delete pimpl_video; |
494 throw; | 516 throw; |
495 } | 517 } |
496 button_pressed = 0; | 518 button_pressed = 0; |
497 current_time = 0; | 519 current_time = 0; |
498 int i; for (i=0; i<BUTTON_MAX; i++) button_presscount[i] = 0; | 520 int i; |
499 return; | 521 for (i=0; i<BUTTON_MAX; i++) button_presscount[i] = 0; |
500 } | 522 } |
523 | |
501 Container::~Container(void) { | 524 Container::~Container(void) { |
502 delete pimpl_video; | 525 delete pimpl_video; |
503 delete pimpl_time; | 526 delete pimpl_time; |
504 } | 527 } |
528 | |
505 void Container::Add(Video* item) { | 529 void Container::Add(Video* item) { |
506 pimpl_video->Add(item); | 530 pimpl_video->Add(item); |
507 } | 531 } |
532 | |
508 void Container::Delete(Video* item) { | 533 void Container::Delete(Video* item) { |
509 pimpl_video->Delete(item); | 534 pimpl_video->Delete(item); |
510 } | 535 } |
536 | |
511 void Container::Add(Time* item) { | 537 void Container::Add(Time* item) { |
512 pimpl_time->Add(item); | 538 pimpl_time->Add(item); |
513 } | 539 } |
540 | |
514 void Container::Delete(Time* item) { | 541 void Container::Delete(Time* item) { |
515 pimpl_time->Delete(item); | 542 pimpl_time->Delete(item); |
516 } | 543 } |
544 | |
517 void Container::RegisterGlobalMotionFunc(Container::motionfunc f, void* pointer) { | 545 void Container::RegisterGlobalMotionFunc(Container::motionfunc f, void* pointer) { |
518 pimpl_video->RegisterGlobalMotionFunc(f, pointer); | 546 pimpl_video->RegisterGlobalMotionFunc(f, pointer); |
519 } | 547 } |
548 | |
520 void Container::DeleteGlobalMotionFunc(Container::motionfunc f, void* pointer) { | 549 void Container::DeleteGlobalMotionFunc(Container::motionfunc f, void* pointer) { |
521 pimpl_video->DeleteGlobalMotionFunc(f, pointer); | 550 pimpl_video->DeleteGlobalMotionFunc(f, pointer); |
522 } | 551 } |
552 | |
523 void Container::RegisterGlobalPressFunc(Container::motionfunc f, void* pointer) { | 553 void Container::RegisterGlobalPressFunc(Container::motionfunc f, void* pointer) { |
524 pimpl_video->RegisterGlobalPressFunc(f, pointer); | 554 pimpl_video->RegisterGlobalPressFunc(f, pointer); |
525 } | 555 } |
556 | |
526 void Container::DeleteGlobalPressFunc(Container::motionfunc f, void* pointer) { | 557 void Container::DeleteGlobalPressFunc(Container::motionfunc f, void* pointer) { |
527 pimpl_video->DeleteGlobalPressFunc(f, pointer); | 558 pimpl_video->DeleteGlobalPressFunc(f, pointer); |
528 } | 559 } |
560 | |
529 bool Container::Exec(unsigned int time) { | 561 bool Container::Exec(unsigned int time) { |
530 current_time = time; | 562 current_time = time; |
531 bool ret = true; | 563 bool ret = true; |
532 ret = ret && pimpl_video->Exec(); | 564 ret = ret && pimpl_video->Exec(); |
533 ret = ret && pimpl_time->Exec(time); | 565 ret = ret && pimpl_time->Exec(time); |
551 | 583 |
552 bool Container::pressed(int mask) { | 584 bool Container::pressed(int mask) { |
553 if (mask < 0 || mask >= BUTTON_MAX) return 0; | 585 if (mask < 0 || mask >= BUTTON_MAX) return 0; |
554 return (button_pressed & (1<<mask)) != 0; | 586 return (button_pressed & (1<<mask)) != 0; |
555 } | 587 } |
588 | |
556 bool Container::presscount(int mask) { | 589 bool Container::presscount(int mask) { |
557 if (mask < 0 || mask >= BUTTON_MAX) return 0; | 590 if (mask < 0 || mask >= BUTTON_MAX) return 0; |
558 int count = button_presscount[mask]; | 591 int count = button_presscount[mask]; |
559 button_presscount[mask] = 0; | 592 button_presscount[mask] = 0; |
560 return count; | 593 return count; |
561 } | 594 } |
562 | 595 |
563 }; /* end of namespace Container */ | 596 } /* end of namespace Container */ |
564 | 597 |
565 // 問題: | 598 // 問題: |
566 // z 軸と xy 軸の相互干渉;高速化 | 599 // z 軸と xy 軸の相互干渉;高速化 |
567 // 移動するウィジット描画の高速化 | 600 // 移動するウィジット描画の高速化 |
568 // キャッシュ | 601 // キャッシュ |