2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
38 #define W_BACKGROUND (wnd->background )
41 #define W_WIDTH (wnd->width)
42 #define W_HEIGHT (wnd->height)
43 #define W_OLDCANVAS (wnd->oldcanvas)
44 #define W_CANVAS (wnd->canvas)
45 #define W_GADGET (wnd->gadget)
46 #define W_TEXT_X (wnd->text_x)
47 #define W_TEXT_Y (wnd->text_y)
48 #define W_NEXT (wnd->next)
49 #define W_PREV (wnd->prev)
52 UI_WINDOW * CurWindow = NULL;
53 UI_WINDOW * FirstWindow = NULL;
54 UI_WINDOW * LastWindow = NULL;
56 int last_keypress = 0;
58 #define BORDER_WIDTH 8
60 static unsigned int FrameCount = 0;
61 unsigned int ui_event_counter = 0;
62 unsigned int ui_number_of_events = 0;
63 static UI_EVENT * EventBuffer = NULL;
64 static int Record = 0;
65 static int RecordFlags = 0;
67 static short MouseDX=0, MouseDY=0, MouseButtons=0;
69 static unsigned char SavedState[256];
71 static int PlaybackSpeed = 1;
73 extern void ui_draw_frame( short x1, short y1, short x2, short y2 );
75 // 1=1x faster, 2=2x faster, etc
76 void ui_set_playback_speed( int speed )
78 PlaybackSpeed = speed;
81 int ui_record_events( int NumberOfEvents, UI_EVENT * buffer, int Flags )
83 if ( Record > 0 || buffer==NULL ) return 1;
89 ui_number_of_events = NumberOfEvents;
94 int ui_play_events_realtime( int NumberOfEvents, UI_EVENT * buffer )
96 if ( buffer == NULL ) return 1;
100 ui_event_counter = 0;
101 ui_number_of_events = NumberOfEvents;
104 keyd_last_released= 0;
105 keyd_last_pressed= 0;
106 for (i=0; i<256; i++ )
107 SavedState[i] = keyd_pressed[i];
113 int ui_play_events_fast( int NumberOfEvents, UI_EVENT * buffer )
116 if ( buffer == NULL ) return 1;
118 EventBuffer = buffer;
120 ui_event_counter = 0;
121 ui_number_of_events = NumberOfEvents;
124 keyd_last_released= 0;
125 keyd_last_pressed= 0;
127 //mprintf( 0, "Before: ", i );
128 for (i=0; i<256; i++ )
130 //if (keyd_pressed[i]) mprintf( 0, "%d ", i );
131 SavedState[i] = keyd_pressed[i];
133 //mprintf( 0, "\n" );
139 // Returns: 0=Normal, 1=Recording, 2=Playback normal, 3=Playback fast
140 int ui_recorder_status()
145 void add_window_to_end( UI_WINDOW * wnd )
149 LastWindow->next = wnd;
156 void add_window_to_beg( UI_WINDOW * wnd )
159 W_NEXT = FirstWindow;
160 FirstWindow->prev = wnd;
168 void add_window_after( UI_WINDOW * w1, UI_WINDOW * w2 )
173 if (w1->next == NULL )
181 UI_WINDOW *sav, *wnd = LastWindow;
186 ui_close_window(wnd);
191 void remove_window( UI_WINDOW * wnd )
194 W_NEXT->prev = W_PREV;
196 W_PREV->next = W_NEXT;
197 if (FirstWindow == wnd )
198 FirstWindow = W_NEXT;
199 if (LastWindow == wnd )
201 W_NEXT = W_PREV = NULL;
206 UI_WINDOW * ui_open_window( short x, short y, short w, short h, int flags )
209 int sw, sh, req_w, req_h;
211 wnd = (UI_WINDOW *) d_malloc(sizeof(UI_WINDOW));
212 if (wnd==NULL) exit(1);
217 add_window_to_end( wnd );
219 sw = grd_curscreen->sc_w;
220 sh = grd_curscreen->sc_h;
222 //mouse_set_limits(0, 0, sw - 1, sh - 1);
227 if (flags & WIN_BORDER)
236 if ( (x+w-1) >= sw ) x = sw - w;
238 if ( (y+h-1) >= sh ) y = sh - h;
244 W_OLDCANVAS = grd_curcanv;
246 wnd->keyboard_focus_gadget = NULL;
250 if (flags & WIN_SAVE_BG)
252 W_BACKGROUND = gr_create_bitmap( w, h );
253 gr_bm_ubitblt(w, h, 0, 0, x, y, &(grd_curscreen->sc_canvas.cv_bitmap), W_BACKGROUND );
258 if (flags & WIN_BORDER)
260 W_CANVAS = gr_create_sub_canvas( &(grd_curscreen->sc_canvas), x+BORDER_WIDTH, y+BORDER_WIDTH, req_w, req_h );
261 gr_set_current_canvas( NULL );
262 ui_draw_frame( x, y, x+w-1, y+h-1 );
265 W_CANVAS = gr_create_sub_canvas( &(grd_curscreen->sc_canvas), x, y, req_w, req_h );
267 gr_set_current_canvas( W_CANVAS );
269 if (flags & WIN_FILLED)
270 ui_draw_box_out( 0, 0, req_w-1, req_h-1 );
272 gr_set_fontcolor( CBLACK, CWHITE );
274 selected_gadget = NULL;
283 void ui_close_window( UI_WINDOW * wnd )
288 ui_gadget_delete_all( wnd );
292 gr_bm_ubitblt(W_WIDTH, W_HEIGHT, W_X, W_Y, 0, 0, W_BACKGROUND, &(grd_curscreen->sc_canvas.cv_bitmap));
293 gr_free_bitmap( W_BACKGROUND );
296 gr_set_current_canvas( NULL );
297 gr_setcolor( CBLACK );
298 gr_rect( W_X, W_Y, W_X+W_WIDTH-1, W_Y+W_HEIGHT-1 );
301 gr_free_sub_canvas( W_CANVAS );
303 gr_set_current_canvas( W_OLDCANVAS );
305 selected_gadget = NULL;
307 remove_window( wnd );
321 //mprintf( 0, "After: " );
322 for (i=0; i<256; i++ )
324 //if (SavedState[i]) mprintf( 0, "%d ", i );
325 keyd_pressed[i] = SavedState[i];
327 //mprintf( 0, "\n" );
334 void ui_reset_idle_seconds()
336 last_event = timer_get_fixed_seconds();
339 int ui_get_idle_seconds()
341 return (timer_get_fixed_seconds() - last_event)/F1_0;
344 void ui_mega_process()
352 mouse_get_delta( &mx, &my, &mz );
355 Mouse.new_buttons = mouse_get_btns();
356 last_keypress = key_inkey();
358 if ( Mouse.new_buttons || last_keypress || Mouse.new_dx || Mouse.new_dy ) {
365 if (ui_event_counter==0 )
367 EventBuffer[ui_event_counter].frame = 0;
368 EventBuffer[ui_event_counter].type = 7;
369 EventBuffer[ui_event_counter].data = ui_number_of_events;
374 if (ui_event_counter==1 && (RecordFlags & UI_RECORD_MOUSE) )
376 Mouse.new_buttons = 0;
377 EventBuffer[ui_event_counter].frame = FrameCount;
378 EventBuffer[ui_event_counter].type = 6;
379 EventBuffer[ui_event_counter].data = ((Mouse.y & 0xFFFF) << 16) | (Mouse.x & 0xFFFF);
383 mouse_get_delta( &mx, &my, &mz );
386 MouseButtons = mouse_get_btns();
388 Mouse.new_dx = MouseDX;
389 Mouse.new_dy = MouseDY;
391 if ((MouseDX != 0 || MouseDY != 0) && (RecordFlags & UI_RECORD_MOUSE) )
393 if (ui_event_counter < ui_number_of_events-1 )
395 EventBuffer[ui_event_counter].frame = FrameCount;
396 EventBuffer[ui_event_counter].type = 1;
397 EventBuffer[ui_event_counter].data = ((MouseDY & 0xFFFF) << 16) | (MouseDX & 0xFFFF);
399 //mprintf( 0, "EVENT:%d, Mouse moved %d,%d\n", ui_event_counter, MouseDX, MouseDY );
406 if ( (MouseButtons != Mouse.new_buttons) && (RecordFlags & UI_RECORD_MOUSE) )
408 Mouse.new_buttons = MouseButtons;
410 if (ui_event_counter < ui_number_of_events-1 )
412 EventBuffer[ui_event_counter].frame = FrameCount;
413 EventBuffer[ui_event_counter].type = 2;
414 EventBuffer[ui_event_counter].data = MouseButtons;
416 //mprintf( 0, "EVENT:%d, Mouse buttons changed %d\n", ui_event_counter, MouseButtons );
424 if ( keyd_last_pressed && (RecordFlags & UI_RECORD_KEYS) )
427 k = keyd_last_pressed;
428 keyd_last_pressed= 0;
431 if (ui_event_counter < ui_number_of_events-1 )
433 EventBuffer[ui_event_counter].frame = FrameCount;
434 EventBuffer[ui_event_counter].type = 3;
435 EventBuffer[ui_event_counter].data = k;
437 //mprintf( 0, "EVENT:%d, Key %d pressed\n", ui_event_counter, k );
444 if ( keyd_last_released && (RecordFlags & UI_RECORD_KEYS) )
447 k = keyd_last_released;
448 keyd_last_released= 0;
451 if (ui_event_counter < ui_number_of_events-1 )
453 EventBuffer[ui_event_counter].frame = FrameCount;
454 EventBuffer[ui_event_counter].type = 4;
455 EventBuffer[ui_event_counter].data = k;
457 //mprintf( 0, "EVENT:%d, Key %d released\n", ui_event_counter, k );
463 last_keypress = key_inkey();
465 if (last_keypress == KEY_F12 )
467 ui_number_of_events = ui_event_counter;
473 if ((last_keypress != 0) && (RecordFlags & UI_RECORD_KEYS) )
475 if (ui_event_counter < ui_number_of_events-1 )
477 EventBuffer[ui_event_counter].frame = FrameCount;
478 EventBuffer[ui_event_counter].type = 5;
479 EventBuffer[ui_event_counter].data = last_keypress;
481 //mprintf( 0, "EVENT:%d, Keypressed %d\n", ui_event_counter, last_keypress );
494 Mouse.new_buttons = 0;
497 if ( keyd_last_pressed ) {
499 k = keyd_last_pressed;
500 keyd_last_pressed = 0;
505 if ( keyd_last_released )
508 k = keyd_last_released;
509 keyd_last_released = 0;
514 if (key_inkey() == KEY_F12 )
516 //mprintf( 0, "Playing stopped.\n" );
522 if (EventBuffer==NULL) {
528 while( (ui_event_counter < ui_number_of_events) && (EventBuffer[ui_event_counter].frame <= FrameCount) )
530 switch ( EventBuffer[ui_event_counter].type )
532 case 1: // Mouse moved
533 Mouse.new_dx = EventBuffer[ui_event_counter].data & 0xFFFF;
534 Mouse.new_dy = (EventBuffer[ui_event_counter].data >> 16) & 0xFFFF;
536 case 2: // Mouse buttons changed
537 Mouse.new_buttons = EventBuffer[ui_event_counter].data;
539 case 3: // Key moved down
540 keyd_pressed[ EventBuffer[ui_event_counter].data ] = 1;
542 case 4: // Key moved up
543 keyd_pressed[ EventBuffer[ui_event_counter].data ] = 0;
545 case 5: // Key pressed
546 last_keypress = EventBuffer[ui_event_counter].data;
548 case 6: // Initial Mouse X position
549 Mouse.x = EventBuffer[ui_event_counter].data & 0xFFFF;
550 Mouse.y = (EventBuffer[ui_event_counter].data >> 16) & 0xFFFF;
556 if (ui_event_counter >= ui_number_of_events )
560 //( 0, "Done playing %d events.\n", ui_number_of_events );
570 if ( ui_event_counter < ui_number_of_events )
572 next_frame = EventBuffer[ui_event_counter].frame;
574 if ( (FrameCount+PlaybackSpeed) < next_frame )
575 FrameCount = next_frame - PlaybackSpeed;
585 if ( ui_event_counter < ui_number_of_events )
586 FrameCount = EventBuffer[ui_event_counter].frame;
599 void ui_wprintf( UI_WINDOW * wnd, char * format, ... )
604 va_start(args, format );
605 vsprintf(buffer,format,args);
607 gr_set_current_canvas( W_CANVAS );
610 W_TEXT_X = gr_string( W_TEXT_X, W_TEXT_Y, buffer );
614 void ui_wprintf_at( UI_WINDOW * wnd, short x, short y, char * format, ... )
619 va_start(args, format );
620 vsprintf(buffer,format,args);
622 gr_set_current_canvas( W_CANVAS );
625 gr_string( x, y, buffer );