Mercurial > otakunoraifu
annotate window/event.cc @ 66:d112357a0ec1
Fix a bug with savegames introduced with changeset c7bcc0ec2267.
Warning: savegames created since c7bcc0ec2267 are probably corrupted,
you may have to start the game over.
If you chose not to do so, you should replace all occurrences of 'TextWindow' by 'TextImplWindow',
and 'Text Window' by 'TextImpl Window' in your save files.
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Sat, 11 Dec 2010 18:36:20 +0100 |
parents | 4416cfac86ae |
children |
rev | line source |
---|---|
0 | 1 /* |
2 * Copyright (c) 2004-2006 Kazunori "jagarl" Ueno | |
3 * All rights reserved. | |
4 * | |
5 * Redistribution and use in source and binary forms, with or without | |
6 * modification, are permitted provided that the following conditions | |
7 * are met: | |
8 * 1. Redistributions of source code must retain the above copyright | |
9 * notice, this list of conditions and the following disclaimer. | |
10 * 2. Redistributions in binary form must reproduce the above copyright | |
11 * notice, this list of conditions and the following disclaimer in the | |
12 * documentation and/or other materials provided with the distribution. | |
13 * 3. The name of the author may not be used to endorse or promote products | |
14 * derived from this software without specific prior written permission. | |
15 * | |
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | |
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | |
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | |
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
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 | |
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
26 */ | |
27 | |
52 | 28 #include "SDL.h" |
29 #include "event.h" | |
30 #include <vector> | |
31 #include <list> | |
32 #include <algorithm> | |
33 #include <iostream> | |
34 #include <sys/stat.h> | |
0 | 35 |
36 using namespace std; | |
37 | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
38 bool save_req = false, load_req = false, grpdump_req = false; // scn2k/scn2k_impl.cc: キーボードからセーブ・ロードできるように |
43
01aa5ddf7dc8
A lot of very minor improvements (deleted some unused variables, and other things like that...)
thib
parents:
0
diff
changeset
|
39 bool pressAreq=false,pressFreq=false,pressDreq=false; |
0 | 40 namespace Event { |
41 /* Impl: struct Event::Video */ | |
42 | |
43 Video::Video(Container& container) : region(0, 0, 0, 0), z(0), parent(container) { | |
44 activated = false; | |
45 parent.Add(this); | |
46 } | |
47 Video::Video(Container& container, const Rect& init_rect) : region(init_rect), z(0), parent(container) { | |
48 activated = false; | |
49 parent.Add(this); | |
50 } | |
51 Video::Video(Container& container, const Rect& init_rect, int _z) : region(init_rect), z(_z), parent(container) { | |
52 activated = false; | |
53 parent.Add(this); | |
54 } | |
55 Video::~Video() { | |
56 parent.Delete(this); | |
57 }; | |
58 void Video::SetRegion(const Rect& new_rect) { | |
59 region = new_rect; | |
60 } | |
61 void Video::SetZ(int new_z) { | |
62 z = new_z; | |
63 } | |
64 void Video::activate(void) { | |
65 activated = true; | |
66 } | |
67 void Video::deactivate(void) { | |
68 activated = false; | |
69 } | |
70 inline int Video::point_in(int x, int y) { | |
71 if (!activated) return -1; | |
72 if (region.point_in(x,y)) return z; | |
73 else return -1; | |
74 } | |
75 | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
76 /* カーソルの動く順序:上、左の順に準位付け */ |
0 | 77 bool operator <(const Video& pos1, const Video& pos2) { |
78 if (pos1.region.ty < pos2.region.ty) return true; | |
79 if (pos1.region.ty == pos2.region.ty) return pos1.region.lx < pos2.region.lx; | |
80 if (pos1.region.by >= pos2.region.by) return pos1.region.lx <= pos2.region.lx; | |
81 return false; | |
82 } | |
83 | |
84 | |
85 /* Impl: struct Event::Time */ | |
86 Time::Time(Container& container) : wakeup_time(container.current_time), parent(container) { | |
87 parent.Add(this); | |
88 } | |
89 Time::~Time() { | |
90 parent.Delete(this); | |
91 } | |
92 /* Define: struct Event::ContainerImpl */ | |
93 | |
94 struct ContainerImplTime_Item { | |
95 Time* instance; | |
96 bool valid; | |
97 bool operator ==(Time* const& to) const { | |
98 return to == instance; | |
99 } | |
100 ContainerImplTime_Item(Time* _time) : | |
101 instance(_time), valid(true) { | |
102 } | |
103 }; | |
104 | |
105 class ContainerImplTime : private vector<ContainerImplTime_Item> { | |
106 public: | |
107 ContainerImplTime(void); | |
108 bool Exec(unsigned int current_time); | |
109 void Add(Time* new_event); | |
110 void Delete(Time* delete_event); | |
111 private: | |
112 static vector<ContainerImplTime_Item> new_item; | |
113 unsigned int prev_execed_time; | |
114 static bool is_invalid(const_reference value) { | |
115 return !value.valid; | |
116 } | |
117 }; | |
118 | |
119 vector<ContainerImplTime_Item> ContainerImplTime::new_item; | |
120 | |
121 ContainerImplTime::ContainerImplTime(void) { | |
122 prev_execed_time = 0; | |
123 } | |
124 void ContainerImplTime::Add(Time* event) { | |
125 ContainerImplTime_Item item(event); | |
126 new_item.push_back(item); | |
127 } | |
128 void ContainerImplTime::Delete(Time* delete_event) { | |
129 iterator it = find(begin(), end(), delete_event); | |
130 if (it != end()) { | |
131 it->valid = false; | |
52 | 132 it->instance = NULL; |
0 | 133 return; |
134 } | |
135 it = find(new_item.begin(), new_item.end(), delete_event); | |
136 if (it != end()) { | |
137 it->valid = false; | |
52 | 138 it->instance = NULL; |
0 | 139 return; |
140 } | |
141 } | |
52 | 142 |
0 | 143 bool ContainerImplTime::Exec(unsigned int current_time) { |
144 if (current_time == Time::NEVER_WAKE) return true; | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
145 // 呼び出しまでに作製されたitemを追加 |
0 | 146 insert(end(), new_item.begin(), new_item.end()); |
147 new_item.clear(); | |
148 if (empty()) return true; | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
149 if (current_time == Time::FRAME_UPDATE) { // ビデオフレームの更新時 |
0 | 150 for (iterator it = begin(); it != end(); it++) { |
151 if (! it->valid) continue; | |
152 | |
153 unsigned tm = it->instance->Wakeup(); | |
154 if (tm == Time::FRAME_UPDATE) { | |
155 it->instance->Elapsed(prev_execed_time); | |
156 } | |
157 } | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
158 } else { // 時間変化時 |
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
159 if (current_time < prev_execed_time) prev_execed_time = 0; /* 時間が一回りして0に戻ったとき */ |
0 | 160 for (iterator it = begin(); it != end(); it++) { |
161 if (! it->valid) continue; | |
162 unsigned tm = it->instance->Wakeup(); | |
163 if (tm >= prev_execed_time && tm < current_time) { | |
164 it->instance->Elapsed(current_time); | |
165 } | |
166 } | |
167 prev_execed_time = current_time; | |
168 } | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
169 // 処理中に削除された item を実際に削除 |
0 | 170 erase(remove_if(begin(), end(), is_invalid), end()); |
171 return true; | |
172 } | |
173 | |
174 | |
175 class ContainerImplVideo : private vector<Video*> { | |
52 | 176 public: |
177 bool Exec(void); | |
0 | 178 |
52 | 179 ContainerImplVideo(void); |
180 ~ContainerImplVideo(); | |
181 void Add(Video* item); | |
182 void Delete(Video* item); | |
183 void RegisterGlobalMotionFunc(Container::motionfunc, void* pointer); | |
184 void DeleteGlobalMotionFunc(Container::motionfunc, void* pointer); | |
185 void RegisterGlobalPressFunc(Container::motionfunc, void* pointer); | |
186 void DeleteGlobalPressFunc(Container::motionfunc, void* pointer); | |
187 private: | |
188 struct Motionfunc { | |
189 Container::motionfunc func; | |
190 void* pointer; | |
191 bool operator ==(const Motionfunc& m) const { return func == m.func && pointer == m.pointer;} | |
192 }; | |
193 list<Motionfunc> motion_vec; | |
194 list<Motionfunc> press_vec; | |
195 typedef list<Motionfunc>::iterator MotionIterator; | |
196 bool is_sorted; | |
197 public: | |
198 int button_pressed; | |
199 int button_released; | |
200 int mouse_x, mouse_y; | |
201 int new_mouse_x, new_mouse_y; | |
202 private: | |
203 void SetChanged(void); | |
204 static bool SortLess(const Video* pos1, const Video* pos2) { | |
205 return pos1 < pos2; | |
206 } | |
207 void Sort(void); | |
208 void Motion(int x, int y); // mouse motion | |
209 void Press(void); | |
210 void TakeScreenshot(void); | |
211 iterator cur_pos; | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
212 Video* cur_item; // 現在のフォーカス位置 |
52 | 213 int cur_pressed_x, cur_pressed_y; |
0 | 214 }; |
215 | |
216 void ContainerImplVideo::SetChanged(void) { | |
217 if (is_sorted) { | |
52 | 218 if (cur_item != NULL) { |
0 | 219 cur_pos = find(begin(), end(), cur_item); |
52 | 220 if (cur_pos == end()) cur_item = NULL; |
0 | 221 } |
222 is_sorted = false; | |
223 } | |
224 } | |
225 | |
226 void ContainerImplVideo::Sort(void) { | |
227 sort(begin(), end(), SortLess); | |
52 | 228 if (cur_item != NULL) { |
0 | 229 cur_pos = lower_bound(begin(), end(), cur_item, SortLess); |
230 } else { | |
231 cur_pos = end(); | |
232 } | |
233 is_sorted = true; | |
234 } | |
235 | |
236 ContainerImplVideo::ContainerImplVideo(void) { | |
237 is_sorted = false; | |
238 button_pressed = 0; | |
239 button_released = 0; | |
52 | 240 cur_item = NULL; |
0 | 241 mouse_x = 0; mouse_y = 0; |
242 new_mouse_x = 0; new_mouse_y = 0; | |
243 } | |
52 | 244 |
0 | 245 ContainerImplVideo::~ContainerImplVideo(void) { |
246 }; | |
52 | 247 |
0 | 248 void ContainerImplVideo::Add(Video* event) { |
249 push_back(event); | |
250 SetChanged(); | |
251 } | |
52 | 252 |
0 | 253 void ContainerImplVideo::Delete(Video* delete_event) { |
254 iterator it = find(begin(), end(), delete_event); | |
255 if (it != end()) { | |
256 erase(it); | |
257 SetChanged(); | |
258 } else { | |
259 fprintf(stderr,"\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); | |
48 | 260 fprintf(stderr,"X ContainerImplVideo: Cannot delete node %p\n",delete_event); |
0 | 261 fprintf(stderr,"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n\n"); |
262 fprintf(stderr,"vector from:\n"); | |
263 for(it=begin(); it!=end(); it++) { | |
48 | 264 fprintf(stderr,"%p, ",*it); |
0 | 265 } |
266 fprintf(stderr,"\n"); | |
267 } | |
268 if (delete_event == cur_item) { | |
269 cur_pos = end(); | |
52 | 270 cur_item = NULL; |
0 | 271 Motion(mouse_x, mouse_y); |
272 } | |
273 } | |
52 | 274 |
0 | 275 void ContainerImplVideo::RegisterGlobalMotionFunc(Container::motionfunc func, void* pointer) { |
276 Motionfunc f; | |
277 f.func = func; | |
278 f.pointer = pointer; | |
279 if (find(motion_vec.begin(), motion_vec.end(), f) == motion_vec.end()) { | |
280 motion_vec.push_back(f); | |
281 } | |
282 } | |
52 | 283 |
0 | 284 void ContainerImplVideo::DeleteGlobalMotionFunc(Container::motionfunc func, void* pointer) { |
285 Motionfunc f; | |
286 f.func = func; | |
287 f.pointer = pointer; | |
288 list<Motionfunc>::iterator it = find(motion_vec.begin(), motion_vec.end(), f); | |
289 if (it != motion_vec.end()) | |
290 motion_vec.erase(it); | |
291 } | |
52 | 292 |
0 | 293 void ContainerImplVideo::RegisterGlobalPressFunc(Container::motionfunc func, void* pointer) { |
294 Motionfunc f; | |
295 f.func = func; | |
296 f.pointer = pointer; | |
297 if (find(press_vec.begin(), press_vec.end(), f) == press_vec.end()) { | |
298 press_vec.push_back(f); | |
299 } | |
300 } | |
52 | 301 |
0 | 302 void ContainerImplVideo::DeleteGlobalPressFunc(Container::motionfunc func, void* pointer) { |
303 Motionfunc f; | |
304 f.func = func; | |
305 f.pointer = pointer; | |
306 list<Motionfunc>::iterator it = find(press_vec.begin(), press_vec.end(), f); | |
307 if (it != press_vec.end()) | |
308 press_vec.erase(it); | |
309 } | |
52 | 310 |
0 | 311 void ContainerImplVideo::Motion(int x, int y) { |
312 mouse_x = x; mouse_y = y; | |
313 MotionIterator mit; | |
314 for (mit=motion_vec.begin(); mit != motion_vec.end();) { | |
315 MotionIterator mit_next = mit; | |
316 mit_next++; | |
317 if (!(*mit->func)(x, y, mit->pointer)) motion_vec.erase(mit); | |
318 mit = mit_next; | |
319 | |
320 } | |
321 | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
322 /* @@@ ドラッグ処理とマウスを押す処理のバッティングで「二回ボタンを押さないと云々」関連のバグの可能性あり */ |
0 | 323 if (button_pressed & (1<<MOUSE_LEFT)) { |
324 if (cur_item) cur_item->Drag(cur_pressed_x, cur_pressed_y, x, y); | |
325 return; | |
326 } | |
52 | 327 if (cur_item != NULL) cur_item->Motion(x,y); |
0 | 328 int z = -1; iterator z_it; |
329 iterator it; | |
330 for (it = begin(); it != end(); it++) { | |
331 int new_z = (*it)->point_in(x, y); | |
332 if (z < new_z) { | |
333 z = new_z; | |
334 z_it = it; | |
335 } | |
336 } | |
337 if (z != -1) { | |
338 if (cur_item == *z_it) return; | |
339 if (cur_item) cur_item->Out(); | |
340 cur_pos = z_it; | |
341 cur_item = *z_it; | |
342 cur_item->In(); | |
343 return; | |
344 } else { | |
345 if (cur_item) cur_item->Out(); | |
346 cur_pos = end(); | |
52 | 347 cur_item = NULL; |
0 | 348 } |
349 return; | |
350 } | |
351 | |
352 void ContainerImplVideo::Press(void) { | |
353 if (cur_item) { | |
354 cur_pressed_x = mouse_x; | |
355 cur_pressed_y = mouse_y; | |
356 cur_item->Press(); | |
357 return; | |
358 } | |
359 MotionIterator mit; | |
360 for (mit=press_vec.begin(); mit != press_vec.end(); ) { | |
361 MotionIterator mit_next = mit; | |
362 mit_next++; | |
363 if (!(*mit->func)(mouse_x, mouse_y, mit->pointer)) { | |
364 press_vec.erase(mit); | |
365 } | |
366 mit = mit_next; | |
367 } | |
368 } | |
52 | 369 |
0 | 370 void ContainerImplVideo::TakeScreenshot(void) { |
371 int n=0; | |
372 char filename[1024]; | |
373 struct stat buffer; | |
374 for(n=0; n<9999; n++) { | |
375 // XXX: put screenshots in a seperate dir? | |
376 sprintf(filename, "xclannad_%04i.bmp", n); | |
377 if(stat(filename, &buffer) == -1) break; | |
378 } | |
379 SDL_SaveBMP(SDL_GetVideoSurface(), filename); | |
380 } | |
52 | 381 |
0 | 382 bool ContainerImplVideo::Exec(void) { |
383 bool is_mouse_motion = false; | |
384 int motion_x = 0, motion_y = 0; | |
385 SDL_Event event; | |
386 SDL_PumpEvents(); | |
387 while(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_ALLEVENTS) == 1) { | |
388 switch(event.type) { | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
389 case SDL_QUIT: return false; // @@@ なにかやらないと |
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
390 case SDL_ACTIVEEVENT: // なにもしない |
52 | 391 // cout<<"active : gain "<<int(event.active.gain)<<", state "<<int(event.active.state)<<endl; |
0 | 392 break; |
52 | 393 case SDL_KEYDOWN: |
394 if (!is_sorted) Sort(); | |
395 switch(event.key.keysym.sym) { | |
396 case SDLK_F12: | |
397 case SDLK_PRINT: | |
398 case SDLK_p: // for Zaurus | |
399 TakeScreenshot(); | |
400 break; | |
401 // Some window managers (eg enlightenment) use Alt-Enter for | |
402 // themselves, F11 is a good alternative | |
403 case SDLK_F11: | |
404 SDL_WM_ToggleFullScreen(SDL_GetVideoSurface()); | |
405 break; | |
406 case SDLK_RETURN: | |
407 if (SDL_GetModState() & KMOD_ALT) { | |
408 SDL_WM_ToggleFullScreen(SDL_GetVideoSurface()); | |
409 break; | |
410 } | |
411 case SDLK_SPACE: | |
412 Press(); | |
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; | |
0 | 434 } |
435 break; | |
52 | 436 case SDL_KEYUP: |
437 // cout << "keyup which "<<int(event.key.which)<<", sym "<<int(event.key.keysym.sym)<<endl; | |
438 switch(event.key.keysym.sym) { | |
439 case SDLK_RETURN: case SDLK_SPACE: | |
440 if (cur_item) cur_item->Release(); | |
441 case SDLK_LSHIFT: case SDLK_RSHIFT: button_pressed &= ~(1<<KEY_SHIFT); button_released |= 1<<KEY_SHIFT; break; | |
442 case SDLK_ESCAPE: button_pressed &= ~(1<<MOUSE_RIGHT); button_released |= 1<<MOUSE_RIGHT; break; /* for Zaurus */ | |
0 | 443 } |
444 break; | |
52 | 445 case SDL_MOUSEMOTION: |
446 motion_x = event.motion.x; | |
447 motion_y = event.motion.y; | |
448 is_mouse_motion = true; | |
449 // Motion(event.motion.x, event.motion.y); | |
450 // cout<< "motion which "<<int(event.motion.which)<< | |
451 // "x "<<event.motion.x << "y "<<event.motion.y<<endl; | |
452 break; | |
453 case SDL_MOUSEBUTTONUP: | |
454 if (event.button.button == 1) { | |
455 Motion(event.button.x, event.button.y); | |
456 is_mouse_motion = false; | |
457 if (cur_item) cur_item->Release(); | |
458 } | |
459 switch(event.button.button) { | |
460 case 1: | |
461 button_pressed &= ~(1<<MOUSE_LEFT); | |
462 button_released |= 1<<MOUSE_LEFT; | |
463 break; | |
464 case 2: | |
465 button_pressed &= ~(1<<MOUSE_MIDDLE); | |
466 button_released |= 1<<MOUSE_MIDDLE; | |
467 break; | |
468 case 3: | |
469 button_pressed &= ~(1<<MOUSE_RIGHT); | |
470 button_released |= 1<<MOUSE_RIGHT; | |
471 break; | |
472 case 4: | |
473 button_pressed &= ~(1<<MOUSE_UP); | |
474 button_released |= 1<<MOUSE_UP; | |
475 break; | |
476 case 5: | |
477 button_pressed &= ~(1<<MOUSE_DOWN); | |
478 button_released |= 1<<MOUSE_DOWN; | |
479 break; | |
480 } | |
481 break; | |
482 case SDL_MOUSEBUTTONDOWN: | |
483 if (event.button.button == 1) { | |
484 Motion(event.button.x, event.button.y); | |
485 is_mouse_motion = false; | |
486 Press(); | |
487 } | |
488 switch(event.button.button) { | |
489 case 1: button_pressed |= (1<<MOUSE_LEFT); break; | |
490 case 2: button_pressed |= (1<<MOUSE_MIDDLE); break; | |
491 case 3: button_pressed |= (1<<MOUSE_RIGHT); break; | |
492 case 4: button_pressed |= (1<<MOUSE_UP); break; | |
493 case 5: button_pressed |= (1<<MOUSE_DOWN); break; | |
494 } | |
495 // cout << "mouse which "<<int(event.button.which)<<"button "<<int(event.button.button)<< | |
496 // "state "<<int(event.button.state)<<"x "<<event.button.x << "y "<<event.button.y<<endl; | |
497 break; | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
498 case SDL_VIDEOEXPOSE: // redraw の必要がある? |
52 | 499 // cout<<"expose."<<endl; |
500 break; | |
0 | 501 } |
502 } | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
503 // Motion 呼び出しは一回だけ |
0 | 504 if (is_mouse_motion) |
505 Motion(motion_x, motion_y); | |
506 return true; | |
52 | 507 } |
508 | |
0 | 509 /* Impl: struct Event::Container */ |
510 Container::Container(void) { | |
511 pimpl_video = new ContainerImplVideo; | |
512 try { | |
513 pimpl_time = new ContainerImplTime; | |
514 } catch(...) { | |
515 delete pimpl_video; | |
516 throw; | |
517 } | |
518 button_pressed = 0; | |
519 current_time = 0; | |
52 | 520 int i; |
521 for (i=0; i<BUTTON_MAX; i++) button_presscount[i] = 0; | |
0 | 522 } |
52 | 523 |
0 | 524 Container::~Container(void) { |
525 delete pimpl_video; | |
526 delete pimpl_time; | |
527 } | |
52 | 528 |
0 | 529 void Container::Add(Video* item) { |
530 pimpl_video->Add(item); | |
531 } | |
52 | 532 |
0 | 533 void Container::Delete(Video* item) { |
534 pimpl_video->Delete(item); | |
535 } | |
52 | 536 |
0 | 537 void Container::Add(Time* item) { |
538 pimpl_time->Add(item); | |
539 } | |
52 | 540 |
0 | 541 void Container::Delete(Time* item) { |
542 pimpl_time->Delete(item); | |
543 } | |
52 | 544 |
0 | 545 void Container::RegisterGlobalMotionFunc(Container::motionfunc f, void* pointer) { |
546 pimpl_video->RegisterGlobalMotionFunc(f, pointer); | |
547 } | |
52 | 548 |
0 | 549 void Container::DeleteGlobalMotionFunc(Container::motionfunc f, void* pointer) { |
550 pimpl_video->DeleteGlobalMotionFunc(f, pointer); | |
551 } | |
52 | 552 |
0 | 553 void Container::RegisterGlobalPressFunc(Container::motionfunc f, void* pointer) { |
554 pimpl_video->RegisterGlobalPressFunc(f, pointer); | |
555 } | |
52 | 556 |
0 | 557 void Container::DeleteGlobalPressFunc(Container::motionfunc f, void* pointer) { |
558 pimpl_video->DeleteGlobalPressFunc(f, pointer); | |
559 } | |
52 | 560 |
0 | 561 bool Container::Exec(unsigned int time) { |
562 current_time = time; | |
563 bool ret = true; | |
564 ret = ret && pimpl_video->Exec(); | |
565 ret = ret && pimpl_time->Exec(time); | |
566 int i; int mask = 1; | |
43
01aa5ddf7dc8
A lot of very minor improvements (deleted some unused variables, and other things like that...)
thib
parents:
0
diff
changeset
|
567 |
0 | 568 for (i=0; i<BUTTON_MAX; i++) { |
569 if (pimpl_video->button_released&mask) { | |
570 button_presscount[i]++; | |
571 } | |
572 mask <<= 1; | |
573 } | |
574 pimpl_video->button_released = 0; | |
575 button_pressed = pimpl_video->button_pressed; | |
576 return ret; | |
577 } | |
578 | |
579 void Container::MousePos(int& x, int& y) { | |
580 x = pimpl_video->mouse_x; | |
581 y = pimpl_video->mouse_y; | |
582 } | |
583 | |
584 bool Container::pressed(int mask) { | |
585 if (mask < 0 || mask >= BUTTON_MAX) return 0; | |
586 return (button_pressed & (1<<mask)) != 0; | |
587 } | |
52 | 588 |
0 | 589 bool Container::presscount(int mask) { |
590 if (mask < 0 || mask >= BUTTON_MAX) return 0; | |
591 int count = button_presscount[mask]; | |
592 button_presscount[mask] = 0; | |
593 return count; | |
594 } | |
595 | |
52 | 596 } /* end of namespace Container */ |
0 | 597 |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
598 // 問題: |
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
599 // z 軸と xy 軸の相互干渉;高速化 |
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
600 // 移動するウィジット描画の高速化 |
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
601 // キャッシュ |
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
602 // 文字列の一部のみ更新の高速化 |
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
603 // 「階層 z で x なる領域無効化、y なる領域生成」で良い?>Expose |