From 1ff3f56c1c8ea69b1e2af2d612b2d7ad5a3ebee6 Mon Sep 17 00:00:00 2001 From: kreatordxx <> Date: Wed, 24 Mar 2010 07:26:52 +0000 Subject: [PATCH] Add EVENT_MOUSE_BUTTON_DOWN and EVENT_MOUSE_BUTTON_UP, use for all windows except game and editor. Fixes crash on iMac G5 when pressing keys to progress through briefing --- CHANGELOG.txt | 4 + arch/include/event.h | 6 +- arch/include/mouse.h | 3 + arch/sdl/mouse.c | 20 ++ main/kconfig.c | 172 ++++++------ main/newmenu.c | 619 ++++++++++++++++++++++--------------------- main/titles.c | 48 ++-- 7 files changed, 471 insertions(+), 401 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 63acefaca..84910fe4b 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,9 @@ D1X-Rebirth Changelog +20100324 +-------- +arch/include/event.h, arch/include/mouse.h, arch/sdl/mouse.c, main/kconfig.c, main/movie.c, main/newmenu.c, main/titles.c: Add EVENT_MOUSE_BUTTON_DOWN and EVENT_MOUSE_BUTTON_UP, use for all windows except game and editor. Fixes crash on iMac G5 when pressing keys to progress through briefing + 20100322 -------- main/credits.c: Make credits screen a window diff --git a/arch/include/event.h b/arch/include/event.h index 984336b6f..845ce449f 100644 --- a/arch/include/event.h +++ b/arch/include/event.h @@ -6,6 +6,8 @@ typedef enum event_type { EVENT_IDLE = 0, + EVENT_MOUSE_BUTTON_DOWN, + EVENT_MOUSE_BUTTON_UP, EVENT_KEY_COMMAND, EVENT_WINDOW_ACTIVATED, EVENT_WINDOW_DEACTIVATED, @@ -22,9 +24,11 @@ typedef struct d_event } d_event; int event_init(); + +// Sends input events to event handlers void event_poll(); -// Not to be confused with event_poll, which will be removed eventually, this one sends events to event handlers +// Sends input, idle and draw events to event handlers void event_process(); #endif diff --git a/arch/include/mouse.h b/arch/include/mouse.h index 235b2b25a..db63f7e1a 100644 --- a/arch/include/mouse.h +++ b/arch/include/mouse.h @@ -22,6 +22,8 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include "pstypes.h" #include "fix.h" +struct d_event; + #define MOUSE_MAX_BUTTONS 16 #define Z_SENSITIVITY 100 #define MBTN_LEFT 0 @@ -47,6 +49,7 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. extern void mouse_flush(); // clears all mice events... extern void d_mouse_init(void); +int mouse_get_button(struct d_event *event); extern void mouse_get_pos( int *x, int *y, int *z ); extern void mouse_get_delta( int *dx, int *dy, int *dz ); extern int mouse_get_btns(); diff --git a/arch/sdl/mouse.c b/arch/sdl/mouse.c index 7498addb1..7d1e50c27 100644 --- a/arch/sdl/mouse.c +++ b/arch/sdl/mouse.c @@ -27,6 +27,12 @@ static struct mouseinfo { int x,y,z; } Mouse; +typedef struct d_event_mousebutton +{ + event_type type; + int button; +} d_event_mousebutton; + void d_mouse_init(void) { memset(&Mouse,0,sizeof(Mouse)); @@ -57,6 +63,8 @@ void mouse_button_handler(SDL_MouseButtonEvent *mbe) }; int button = button_remap[mbe->button - 1]; // -1 since SDL seems to start counting at 1 + d_event_mousebutton event; + window *wind; if (mbe->state == SDL_PRESSED) { Mouse.buttons[button].pressed = 1; @@ -75,6 +83,12 @@ void mouse_button_handler(SDL_MouseButtonEvent *mbe) Mouse.buttons[button].time_held_down += timer_get_fixed_seconds() - Mouse.buttons[button].time_went_down; Mouse.buttons[button].num_ups++; } + + event.type = (mbe->state == SDL_PRESSED) ? EVENT_MOUSE_BUTTON_DOWN : EVENT_MOUSE_BUTTON_UP; + event.button = button; + + if ((wind = window_get_front())) + window_send_event(wind, (d_event *)&event); } void mouse_motion_handler(SDL_MouseMotionEvent *mme) @@ -140,6 +154,12 @@ void mouse_get_delta( int *dx, int *dy, int *dz ) Mouse.delta_z = 0; } +int mouse_get_button(d_event *event) +{ + Assert((event->type == EVENT_MOUSE_BUTTON_DOWN) || (event->type == EVENT_MOUSE_BUTTON_UP)); + return ((d_event_mousebutton *)event)->button; +} + int mouse_get_btns() { int i; diff --git a/main/kconfig.c b/main/kconfig.c index 10d96d9e7..8d05d7b35 100644 --- a/main/kconfig.c +++ b/main/kconfig.c @@ -113,9 +113,7 @@ typedef struct kc_menu int old_axis[JOY_MAX_AXES]; ubyte changing; ubyte q_fade_i; // for flashing the question mark -#ifdef NEWMENU_MOUSE - ubyte mouse_state, omouse_state; -#endif + ubyte mouse_state; } kc_menu; ubyte DefaultKeySettings[3][MAX_CONTROLS] = { @@ -287,7 +285,7 @@ kc_item kc_d1x[NUM_D1X_CONTROLS] = { void kc_drawitem( kc_item *item, int is_current ); void kc_change_key( kc_menu *menu, kc_item * item ); void kc_change_joybutton( kc_menu *menu, kc_item * item ); -void kc_change_mousebutton( kc_menu *menu, kc_item * item ); +void kc_change_mousebutton( kc_menu *menu, d_event *event, kc_item * item ); void kc_change_joyaxis( kc_menu *menu, kc_item * item ); void kc_change_mouseaxis( kc_menu *menu, kc_item * item ); void kc_change_invert( kc_menu *menu, kc_item * item ); @@ -393,7 +391,6 @@ int find_next_item_left( kc_item * items, int nitems, int citem ) } #endif -#ifdef NEWMENU_MOUSE int get_item_height(kc_item *item) { int w, h, aw; @@ -429,7 +426,6 @@ int get_item_height(kc_item *item) return h; } -#endif void nm_draw_background1(char * filename); void kc_drawquestion( kc_menu *menu, kc_item *item ); @@ -572,13 +568,64 @@ void kconfig_start_changing(kc_menu *menu) menu->changing = 1; } -int kconfig_idle(window *wind, d_event *event, kc_menu *menu) +int kconfig_mouse(window *wind, d_event *event, kc_menu *menu) { grs_canvas * save_canvas = grd_curcanv; - int i,k; -#ifdef NEWMENU_MOUSE int mx, my, mz, x1, x2, y1, y2; -#endif + int i; + int rval = 0; + + gr_set_current_canvas(window_get_canvas(wind)); + + if (menu->mouse_state) + { + int item_height; + + mouse_get_pos(&mx, &my, &mz); + for (i=0; initems; i++ ) { + item_height = get_item_height( &menu->items[i] ); + x1 = grd_curcanv->cv_bitmap.bm_x + FSPACX(menu->items[i].x) + FSPACX(menu->items[i].w1); + x2 = x1 + FSPACX(menu->items[i].w2); + y1 = grd_curcanv->cv_bitmap.bm_y + FSPACY(menu->items[i].y); + y2 = y1 + item_height; + if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { + menu->citem = i; + rval = 1; + break; + } + } + } + else if (event->type == EVENT_MOUSE_BUTTON_UP) + { + int item_height; + + mouse_get_pos(&mx, &my, &mz); + item_height = get_item_height( &menu->items[menu->citem] ); + x1 = grd_curcanv->cv_bitmap.bm_x + FSPACX(menu->items[menu->citem].x) + FSPACX(menu->items[menu->citem].w1); + x2 = x1 + FSPACX(menu->items[menu->citem].w2); + y1 = grd_curcanv->cv_bitmap.bm_y + FSPACY(menu->items[menu->citem].y); + y2 = y1 + item_height; + if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { + kconfig_start_changing(menu); + rval = 1; + } + else + { + // Click out of changing mode - kreatordxx + menu->changing = 0; + game_flush_inputs(); + rval = 1; + } + } + + gr_set_current_canvas(save_canvas); + + return rval; +} + +int kconfig_idle(window *wind, kc_menu *menu) +{ + int i,k; if (menu->changing) timer_delay(f0_1/10); @@ -590,11 +637,6 @@ int kconfig_idle(window *wind, d_event *event, kc_menu *menu) k = key_inkey(); -#ifdef NEWMENU_MOUSE - menu->omouse_state = menu->mouse_state; - menu->mouse_state = mouse_button_state(0); -#endif - if (menu->changing) { if (k == KEY_ESC) @@ -603,7 +645,6 @@ int kconfig_idle(window *wind, d_event *event, kc_menu *menu) switch( menu->items[menu->citem].type ) { case BT_KEY: kc_change_key( menu, &menu->items[menu->citem] ); break; - case BT_MOUSE_BUTTON: kc_change_mousebutton( menu, &menu->items[menu->citem] ); break; case BT_MOUSE_AXIS: kc_change_mouseaxis( menu, &menu->items[menu->citem] ); break; case BT_JOY_BUTTON: kc_change_joybutton( menu, &menu->items[menu->citem] ); break; case BT_JOY_AXIS: kc_change_joyaxis( menu, &menu->items[menu->citem] ); break; @@ -611,9 +652,7 @@ int kconfig_idle(window *wind, d_event *event, kc_menu *menu) if (!menu->changing) { - gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) ); game_flush_inputs(); - menu->mouse_state = 0; return 1; } } @@ -777,49 +816,6 @@ int kconfig_idle(window *wind, d_event *event, kc_menu *menu) break; } -#ifdef NEWMENU_MOUSE - gr_set_current_canvas(window_get_canvas(wind)); - - if ( (menu->mouse_state && !menu->omouse_state) || (menu->mouse_state && menu->omouse_state) ) { - int item_height; - - mouse_get_pos(&mx, &my, &mz); - for (i=0; initems; i++ ) { - item_height = get_item_height( &menu->items[i] ); - x1 = grd_curcanv->cv_bitmap.bm_x + FSPACX(menu->items[i].x) + FSPACX(menu->items[i].w1); - x2 = x1 + FSPACX(menu->items[i].w2); - y1 = grd_curcanv->cv_bitmap.bm_y + FSPACY(menu->items[i].y); - y2 = y1 + item_height; - if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { - menu->citem = i; - break; - } - } - } - else if ( !menu->mouse_state && menu->omouse_state ) { - int item_height; - - mouse_get_pos(&mx, &my, &mz); - item_height = get_item_height( &menu->items[menu->citem] ); - x1 = grd_curcanv->cv_bitmap.bm_x + FSPACX(menu->items[menu->citem].x) + FSPACX(menu->items[menu->citem].w1); - x2 = x1 + FSPACX(menu->items[menu->citem].w2); - y1 = grd_curcanv->cv_bitmap.bm_y + FSPACY(menu->items[menu->citem].y); - y2 = y1 + item_height; - if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { - kconfig_start_changing(menu); - } - else - { - // Click out of changing mode - kreatordxx - menu->changing = 0; - gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) ); - game_flush_inputs(); - } - } - - gr_set_current_canvas(save_canvas); -#endif // NEWMENU_MOUSE - return 0; } @@ -834,8 +830,28 @@ int kconfig_handler(window *wind, d_event *event, kc_menu *menu) newmenu_show_cursor(); break; + case EVENT_WINDOW_DEACTIVATED: + menu->mouse_state = 0; + break; + + case EVENT_MOUSE_BUTTON_DOWN: + if (menu->changing && (menu->items[menu->citem].type == BT_MOUSE_BUTTON)) + { + kc_change_mousebutton( menu, event, &menu->items[menu->citem] ); + return 1; + } + // else fall through + + case EVENT_MOUSE_BUTTON_UP: + if (mouse_get_button(event) != 0) + return 0; + + menu->mouse_state = (event->type == EVENT_MOUSE_BUTTON_DOWN); + return kconfig_mouse(wind, event, menu); + case EVENT_IDLE: - return kconfig_idle(wind, event, menu); + kconfig_mouse(wind, event, menu); + return kconfig_idle(wind, menu); break; case EVENT_WINDOW_DRAW: @@ -885,10 +901,7 @@ void kconfig_sub(kc_item * items,int nitems, char *title) menu->title = title; menu->citem = 0; menu->changing = 0; - -#ifdef NEWMENU_MOUSE - menu->mouse_state = menu->omouse_state = 0; -#endif + menu->mouse_state = 0; nm_draw_background1(NULL); @@ -1026,26 +1039,21 @@ void kc_change_joybutton( kc_menu *menu, kc_item * item ) } } -void kc_change_mousebutton( kc_menu *menu, kc_item * item ) +void kc_change_mousebutton( kc_menu *menu, d_event *event, kc_item * item ) { int n,i,b; - ubyte code = 255; - b = mouse_get_btns(); - for (i = 0; i < 16; i++ ) { - if ( b & (1<nitems; i++ ) { - n = item - menu->items; - if ( (i!=n) && (menu->items[i].type==BT_MOUSE_BUTTON) && (menu->items[i].value==code) ) { - menu->items[i].value = 255; - } - } - item->value = code; - menu->changing = 0; + b = mouse_get_button(event); + + for (i=0; initems; i++) + { + n = item - menu->items; + if ( (i!=n) && (menu->items[i].type==BT_MOUSE_BUTTON) && (menu->items[i].value==b) ) + menu->items[i].value = 255; } + + item->value = b; + menu->changing = 0; } void kc_change_joyaxis( kc_menu *menu, kc_item * item ) diff --git a/main/newmenu.c b/main/newmenu.c index 65d10a9bd..1578d09c5 100644 --- a/main/newmenu.c +++ b/main/newmenu.c @@ -86,7 +86,7 @@ struct newmenu int all_text; //set true if all text items int is_scroll_box; // Is this a scrolling box? Set to false at init int max_on_menu; - int mouse_state, omouse_state, dblclick_flag; + int mouse_state, dblclick_flag; int done; void *userdata; // For whatever - like with window system }; @@ -551,6 +551,239 @@ int newmenu_get_citem(newmenu *menu) return menu->citem; } +int newmenu_mouse(window *wind, d_event *event, newmenu *menu) +{ + int old_choice, i; + grs_canvas *menu_canvas = window_get_canvas(wind), *save_canvas = grd_curcanv; + int mx=0, my=0, mz=0, x1 = 0, x2, y1, y2; + int changed = 0; + + gr_set_current_canvas(menu_canvas); + + old_choice = menu->citem; + + if ((event->type == EVENT_MOUSE_BUTTON_DOWN) && !menu->all_text) + { + mouse_get_pos(&mx, &my, &mz); + for (i=0; imax_on_menu; i++ ) { + x1 = grd_curcanv->cv_bitmap.bm_x + menu->items[i].x-FSPACX(13) /*- menu->items[i].right_offset - 6*/; + x2 = x1 + menu->items[i].w+FSPACX(13); + y1 = grd_curcanv->cv_bitmap.bm_y + menu->items[i].y; + y2 = y1 + menu->items[i].h; + if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { + if (i+menu->scroll_offset != menu->citem) { + if(Hack_DblClick_MenuMode) menu->dblclick_flag = 0; + } + + menu->citem = i + menu->scroll_offset; + + switch( menu->items[menu->citem].type ) { + case NM_TYPE_CHECK: + if ( menu->items[menu->citem].value ) + menu->items[menu->citem].value = 0; + else + menu->items[menu->citem].value = 1; + + if (menu->is_scroll_box) + menu->last_scroll_check=-1; + changed = 1; + break; + case NM_TYPE_RADIO: + for (i=0; initems; i++ ) { + if ((i!=menu->citem) && (menu->items[i].type==NM_TYPE_RADIO) && (menu->items[i].group==menu->items[menu->citem].group) && (menu->items[i].value) ) { + menu->items[i].value = 0; + changed = 1; + } + } + menu->items[menu->citem].value = 1; + break; + case NM_TYPE_TEXT: + menu->citem=old_choice; + menu->mouse_state=0; + break; + } + break; + } + } + } + + if (menu->mouse_state && menu->all_text) + { + menu->done = 1; + gr_set_current_canvas(save_canvas); + return 1; + } + + if ( menu->mouse_state && !menu->all_text ) { + mouse_get_pos(&mx, &my, &mz); + + // check possible scrollbar stuff first + if (menu->is_scroll_box) { + int arrow_width, arrow_height, aw, ScrollAllow=0, time=timer_get_fixed_seconds(); + static fix ScrollTime=0; + if (ScrollTime + F1_0/5 < time || time < ScrollTime) + { + ScrollTime = time; + ScrollAllow = 1; + } + + if (menu->scroll_offset != 0) { + gr_get_string_size(UP_ARROW_MARKER, &arrow_width, &arrow_height, &aw); + x2 = grd_curcanv->cv_bitmap.bm_x + menu->items[menu->scroll_offset].x-FSPACX(13); + y1 = grd_curcanv->cv_bitmap.bm_y + menu->items[menu->scroll_offset].y-(((int)LINE_SPACING)*menu->scroll_offset); + x1 = x2 - arrow_width; + y2 = y1 + arrow_height; + if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) && ScrollAllow) { + menu->citem--; + menu->last_scroll_check=-1; + if (menu->citem-4scroll_offset && menu->scroll_offset > 0) + { + menu->scroll_offset--; + } + } + } + if (menu->scroll_offset+menu->max_displayablenitems) { + gr_get_string_size(DOWN_ARROW_MARKER, &arrow_width, &arrow_height, &aw); + x2 = grd_curcanv->cv_bitmap.bm_x + menu->items[menu->scroll_offset+menu->max_displayable-1].x-FSPACX(13); + y1 = grd_curcanv->cv_bitmap.bm_y + menu->items[menu->scroll_offset+menu->max_displayable-1].y-(((int)LINE_SPACING)*menu->scroll_offset); + x1 = x2 - arrow_width; + y2 = y1 + arrow_height; + if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) && ScrollAllow) { + menu->citem++; + menu->last_scroll_check=-1; + if (menu->citem+4>=menu->max_on_menu+menu->scroll_offset && menu->scroll_offset < menu->nitems-menu->max_on_menu) + { + menu->scroll_offset++; + } + } + } + } + + for (i=0; imax_on_menu; i++ ) { + x1 = grd_curcanv->cv_bitmap.bm_x + menu->items[i].x-FSPACX(13); + x2 = x1 + menu->items[i].w+FSPACX(13); + y1 = grd_curcanv->cv_bitmap.bm_y + menu->items[i].y; + y2 = y1 + menu->items[i].h; + + if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) && (menu->items[i].type != NM_TYPE_TEXT) ) { + if (i+menu->scroll_offset != menu->citem) { + if(Hack_DblClick_MenuMode) menu->dblclick_flag = 0; + } + + menu->citem = i + menu->scroll_offset; + + if ( menu->items[menu->citem].type == NM_TYPE_SLIDER ) { + char slider_text[NM_MAX_TEXT_LEN+1], *p, *s1; + int slider_width, height, aw, sleft_width, sright_width, smiddle_width; + + strcpy(slider_text, menu->items[menu->citem].saved_text); + p = strchr(slider_text, '\t'); + if (p) { + *p = '\0'; + s1 = p+1; + } + if (p) { + gr_get_string_size(s1, &slider_width, &height, &aw); + gr_get_string_size(SLIDER_LEFT, &sleft_width, &height, &aw); + gr_get_string_size(SLIDER_RIGHT, &sright_width, &height, &aw); + gr_get_string_size(SLIDER_MIDDLE, &smiddle_width, &height, &aw); + + x1 = grd_curcanv->cv_bitmap.bm_x + menu->items[menu->citem].x + menu->items[menu->citem].w - slider_width; + x2 = x1 + slider_width + sright_width; + if ( (mx > x1) && (mx < (x1 + sleft_width)) && (menu->items[menu->citem].value != menu->items[menu->citem].min_value) ) { + menu->items[menu->citem].value = menu->items[menu->citem].min_value; + changed = 1; + } else if ( (mx < x2) && (mx > (x2 - sright_width)) && (menu->items[menu->citem].value != menu->items[menu->citem].max_value) ) { + menu->items[menu->citem].value = menu->items[menu->citem].max_value; + changed = 1; + } else if ( (mx > (x1 + sleft_width)) && (mx < (x2 - sright_width)) ) { + int num_values, value_width, new_value; + + num_values = menu->items[menu->citem].max_value - menu->items[menu->citem].min_value + 1; + value_width = (slider_width - sleft_width - sright_width) / num_values; + new_value = (mx - x1 - sleft_width) / value_width; + if ( menu->items[menu->citem].value != new_value ) { + menu->items[menu->citem].value = new_value; + changed = 1; + } + } + *p = '\t'; + } + } + if (menu->citem == old_choice) + break; + if ((menu->items[menu->citem].type==NM_TYPE_INPUT) && (menu->citem!=old_choice)) + menu->items[menu->citem].value = -1; + if ((old_choice>-1) && (menu->items[old_choice].type==NM_TYPE_INPUT_MENU) && (old_choice!=menu->citem)) { + menu->items[old_choice].group=0; + strcpy(menu->items[old_choice].text, menu->items[old_choice].saved_text ); + menu->items[old_choice].value = -1; + } + break; + } + } + } + + if ((event->type == EVENT_MOUSE_BUTTON_UP) && !menu->all_text && (menu->citem != -1) && (menu->items[menu->citem].type == NM_TYPE_MENU) ) + { + mouse_get_pos(&mx, &my, &mz); + for (i=0; initems; i++ ) { + x1 = grd_curcanv->cv_bitmap.bm_x + menu->items[i].x-FSPACX(13); + x2 = x1 + menu->items[i].w+FSPACX(13); + y1 = grd_curcanv->cv_bitmap.bm_y + menu->items[i].y; + y2 = y1 + menu->items[i].h; + if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { + if (Hack_DblClick_MenuMode) { + if (menu->dblclick_flag) + { + // Tell callback, allow staying in menu + event->type = EVENT_NEWMENU_SELECTED; + if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata)) + return 1; + + menu->done = 1; + gr_set_current_canvas(save_canvas); + return 1; + } + else menu->dblclick_flag = 1; + } + else + { + // Tell callback, allow staying in menu + event->type = EVENT_NEWMENU_SELECTED; + if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata)) + return 1; + + menu->done = 1; + gr_set_current_canvas(save_canvas); + return 1; + } + } + } + } + + if ((event->type == EVENT_MOUSE_BUTTON_UP) && (menu->citem>-1) && (menu->items[menu->citem].type==NM_TYPE_INPUT_MENU) && (menu->items[menu->citem].group==0)) + { + menu->items[menu->citem].group = 1; + if ( !strnicmp( menu->items[menu->citem].saved_text, TXT_EMPTY, strlen(TXT_EMPTY) ) ) { + menu->items[menu->citem].text[0] = 0; + menu->items[menu->citem].value = -1; + } else { + strip_end_whitespace(menu->items[menu->citem].text); + } + } + + gr_set_current_canvas(save_canvas); + + if (changed && menu->subfunction) + { + event->type = EVENT_NEWMENU_CHANGED; + (*menu->subfunction)(menu, event, menu->userdata); + } + + return 0; +} + int newmenu_key_command(window *wind, d_event *event, newmenu *menu) { newmenu_item *item = &menu->items[menu->citem]; @@ -909,250 +1142,6 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) return rval; } -int newmenu_idle(window *wind, newmenu *menu) -{ - int old_choice, i; - grs_canvas *menu_canvas = window_get_canvas(wind), *save_canvas = grd_curcanv; -#ifdef NEWMENU_MOUSE - int mx=0, my=0, mz=0, x1 = 0, x2, y1, y2; -#endif - int changed = 0; - d_event event = { EVENT_NEWMENU_SELECTED }; - - timer_delay2(50); - -#ifdef NEWMENU_MOUSE - menu->omouse_state = menu->mouse_state; - menu->mouse_state = mouse_button_state(0); -#endif - - //see if redbook song needs to be restarted - RBACheckFinishedHook(); - - gr_set_current_canvas(menu_canvas); - - old_choice = menu->citem; - -#ifdef NEWMENU_MOUSE // for mouse selection of menu's etc. - if ( menu->mouse_state && !menu->omouse_state && !menu->all_text ) { - mouse_get_pos(&mx, &my, &mz); - for (i=0; imax_on_menu; i++ ) { - x1 = grd_curcanv->cv_bitmap.bm_x + menu->items[i].x-FSPACX(13) /*- menu->items[i].right_offset - 6*/; - x2 = x1 + menu->items[i].w+FSPACX(13); - y1 = grd_curcanv->cv_bitmap.bm_y + menu->items[i].y; - y2 = y1 + menu->items[i].h; - if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { - if (i+menu->scroll_offset != menu->citem) { - if(Hack_DblClick_MenuMode) menu->dblclick_flag = 0; - } - - menu->citem = i + menu->scroll_offset; - - switch( menu->items[menu->citem].type ) { - case NM_TYPE_CHECK: - if ( menu->items[menu->citem].value ) - menu->items[menu->citem].value = 0; - else - menu->items[menu->citem].value = 1; - - if (menu->is_scroll_box) - menu->last_scroll_check=-1; - changed = 1; - break; - case NM_TYPE_RADIO: - for (i=0; initems; i++ ) { - if ((i!=menu->citem) && (menu->items[i].type==NM_TYPE_RADIO) && (menu->items[i].group==menu->items[menu->citem].group) && (menu->items[i].value) ) { - menu->items[i].value = 0; - changed = 1; - } - } - menu->items[menu->citem].value = 1; - break; - case NM_TYPE_TEXT: - menu->citem=old_choice; - menu->mouse_state=0; - break; - } - break; - } - } - } - - if (menu->mouse_state && menu->all_text) - { - menu->done = 1; - gr_set_current_canvas(save_canvas); - return 1; - } - - if ( menu->mouse_state && !menu->all_text ) { - mouse_get_pos(&mx, &my, &mz); - - // check possible scrollbar stuff first - if (menu->is_scroll_box) { - int arrow_width, arrow_height, aw, ScrollAllow=0, time=timer_get_fixed_seconds(); - static fix ScrollTime=0; - if (ScrollTime + F1_0/5 < time || time < ScrollTime) - { - ScrollTime = time; - ScrollAllow = 1; - } - - if (menu->scroll_offset != 0) { - gr_get_string_size(UP_ARROW_MARKER, &arrow_width, &arrow_height, &aw); - x2 = grd_curcanv->cv_bitmap.bm_x + menu->items[menu->scroll_offset].x-FSPACX(13); - y1 = grd_curcanv->cv_bitmap.bm_y + menu->items[menu->scroll_offset].y-(((int)LINE_SPACING)*menu->scroll_offset); - x1 = x2 - arrow_width; - y2 = y1 + arrow_height; - if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) && ScrollAllow) { - menu->citem--; - menu->last_scroll_check=-1; - if (menu->citem-4scroll_offset && menu->scroll_offset > 0) - { - menu->scroll_offset--; - } - } - } - if (menu->scroll_offset+menu->max_displayablenitems) { - gr_get_string_size(DOWN_ARROW_MARKER, &arrow_width, &arrow_height, &aw); - x2 = grd_curcanv->cv_bitmap.bm_x + menu->items[menu->scroll_offset+menu->max_displayable-1].x-FSPACX(13); - y1 = grd_curcanv->cv_bitmap.bm_y + menu->items[menu->scroll_offset+menu->max_displayable-1].y-(((int)LINE_SPACING)*menu->scroll_offset); - x1 = x2 - arrow_width; - y2 = y1 + arrow_height; - if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) && ScrollAllow) { - menu->citem++; - menu->last_scroll_check=-1; - if (menu->citem+4>=menu->max_on_menu+menu->scroll_offset && menu->scroll_offset < menu->nitems-menu->max_on_menu) - { - menu->scroll_offset++; - } - } - } - } - - for (i=0; imax_on_menu; i++ ) { - x1 = grd_curcanv->cv_bitmap.bm_x + menu->items[i].x-FSPACX(13); - x2 = x1 + menu->items[i].w+FSPACX(13); - y1 = grd_curcanv->cv_bitmap.bm_y + menu->items[i].y; - y2 = y1 + menu->items[i].h; - - if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) && (menu->items[i].type != NM_TYPE_TEXT) ) { - if (i+menu->scroll_offset != menu->citem) { - if(Hack_DblClick_MenuMode) menu->dblclick_flag = 0; - } - - menu->citem = i + menu->scroll_offset; - - if ( menu->items[menu->citem].type == NM_TYPE_SLIDER ) { - char slider_text[NM_MAX_TEXT_LEN+1], *p, *s1; - int slider_width, height, aw, sleft_width, sright_width, smiddle_width; - - strcpy(slider_text, menu->items[menu->citem].saved_text); - p = strchr(slider_text, '\t'); - if (p) { - *p = '\0'; - s1 = p+1; - } - if (p) { - gr_get_string_size(s1, &slider_width, &height, &aw); - gr_get_string_size(SLIDER_LEFT, &sleft_width, &height, &aw); - gr_get_string_size(SLIDER_RIGHT, &sright_width, &height, &aw); - gr_get_string_size(SLIDER_MIDDLE, &smiddle_width, &height, &aw); - - x1 = grd_curcanv->cv_bitmap.bm_x + menu->items[menu->citem].x + menu->items[menu->citem].w - slider_width; - x2 = x1 + slider_width + sright_width; - if ( (mx > x1) && (mx < (x1 + sleft_width)) && (menu->items[menu->citem].value != menu->items[menu->citem].min_value) ) { - menu->items[menu->citem].value = menu->items[menu->citem].min_value; - changed = 1; - } else if ( (mx < x2) && (mx > (x2 - sright_width)) && (menu->items[menu->citem].value != menu->items[menu->citem].max_value) ) { - menu->items[menu->citem].value = menu->items[menu->citem].max_value; - changed = 1; - } else if ( (mx > (x1 + sleft_width)) && (mx < (x2 - sright_width)) ) { - int num_values, value_width, new_value; - - num_values = menu->items[menu->citem].max_value - menu->items[menu->citem].min_value + 1; - value_width = (slider_width - sleft_width - sright_width) / num_values; - new_value = (mx - x1 - sleft_width) / value_width; - if ( menu->items[menu->citem].value != new_value ) { - menu->items[menu->citem].value = new_value; - changed = 1; - } - } - *p = '\t'; - } - } - if (menu->citem == old_choice) - break; - if ((menu->items[menu->citem].type==NM_TYPE_INPUT) && (menu->citem!=old_choice)) - menu->items[menu->citem].value = -1; - if ((old_choice>-1) && (menu->items[old_choice].type==NM_TYPE_INPUT_MENU) && (old_choice!=menu->citem)) { - menu->items[old_choice].group=0; - strcpy(menu->items[old_choice].text, menu->items[old_choice].saved_text ); - menu->items[old_choice].value = -1; - } - break; - } - } - } - - if ( !menu->mouse_state && menu->omouse_state && !menu->all_text && (menu->citem != -1) && (menu->items[menu->citem].type == NM_TYPE_MENU) ) { - mouse_get_pos(&mx, &my, &mz); - for (i=0; initems; i++ ) { - x1 = grd_curcanv->cv_bitmap.bm_x + menu->items[i].x-FSPACX(13); - x2 = x1 + menu->items[i].w+FSPACX(13); - y1 = grd_curcanv->cv_bitmap.bm_y + menu->items[i].y; - y2 = y1 + menu->items[i].h; - if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { - if (Hack_DblClick_MenuMode) { - if (menu->dblclick_flag) - { - // Tell callback, allow staying in menu - if (menu->subfunction && (*menu->subfunction)(menu, &event, menu->userdata)) - return 1; - - menu->done = 1; - gr_set_current_canvas(save_canvas); - return 1; - } - else menu->dblclick_flag = 1; - } - else - { - // Tell callback, allow staying in menu - if (menu->subfunction && (*menu->subfunction)(menu, &event, menu->userdata)) - return 1; - - menu->done = 1; - gr_set_current_canvas(save_canvas); - return 1; - } - } - } - } - - if ( !menu->mouse_state && menu->omouse_state && (menu->citem>-1) && (menu->items[menu->citem].type==NM_TYPE_INPUT_MENU) && (menu->items[menu->citem].group==0)) { - menu->items[menu->citem].group = 1; - if ( !strnicmp( menu->items[menu->citem].saved_text, TXT_EMPTY, strlen(TXT_EMPTY) ) ) { - menu->items[menu->citem].text[0] = 0; - menu->items[menu->citem].value = -1; - } else { - strip_end_whitespace(menu->items[menu->citem].text); - } - } - -#endif // NEWMENU_MOUSE - - if (changed && menu->subfunction) - { - event.type = EVENT_NEWMENU_CHANGED; - (*menu->subfunction)(menu, &event, menu->userdata); - } - - gr_set_current_canvas(save_canvas); - - return 0; -} - int newmenu_draw(window *wind, newmenu *menu) { grs_canvas *menu_canvas = window_get_canvas(wind), *save_canvas = grd_curcanv; @@ -1271,14 +1260,28 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu) case EVENT_WINDOW_DEACTIVATED: newmenu_hide_cursor(); + menu->mouse_state = 0; break; + case EVENT_MOUSE_BUTTON_DOWN: + case EVENT_MOUSE_BUTTON_UP: + if (mouse_get_button(event) != 0) + return 0; + + menu->mouse_state = event->type == EVENT_MOUSE_BUTTON_DOWN; + return newmenu_mouse(wind, event, menu); + case EVENT_KEY_COMMAND: return newmenu_key_command(wind, event, menu); break; case EVENT_IDLE: - return newmenu_idle(wind, menu); + timer_delay2(50); + + //see if redbook song needs to be restarted + RBACheckFinishedHook(); + + return newmenu_mouse(wind, event, menu); break; case EVENT_WINDOW_DRAW: @@ -1577,9 +1580,7 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, } } -#ifdef NEWMENU_MOUSE - menu->mouse_state = menu->omouse_state = 0; -#endif + menu->mouse_state = 0; gr_set_current_canvas(save_canvas); @@ -1688,7 +1689,7 @@ struct listbox int (*listbox_callback)(listbox *lb, d_event *event, void *userdata); int citem, first_item; int box_w, height, box_x, box_y, title_height; - int mouse_state, omouse_state; + int mouse_state; void *userdata; }; @@ -1747,6 +1748,58 @@ void update_scroll_position(listbox *lb) if (lb->first_item < 0 ) lb->first_item = 0; } +int listbox_mouse(window *wind, d_event *event, listbox *lb) +{ + int i; + int mx, my, mz, x1, x2, y1, y2; //, dblclick_flag; + + if (lb->mouse_state) + { + int w, h, aw; + + mouse_get_pos(&mx, &my, &mz); + for (i=lb->first_item; ifirst_item+LB_ITEMS_ON_SCREEN; i++ ) { + if (i >= lb->nitems) + break; + gr_get_string_size(lb->item[i], &w, &h, &aw ); + x1 = lb->box_x; + x2 = lb->box_x + lb->box_w; + y1 = (i-lb->first_item)*LINE_SPACING+lb->box_y; + y2 = y1+h; + if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) { + lb->citem = i; + return 1; + } + } + } + else if (event->type == EVENT_MOUSE_BUTTON_UP) + { + int w, h, aw; + + if (lb->citem < 0) + return 0; + + mouse_get_pos(&mx, &my, &mz); + gr_get_string_size(lb->item[lb->citem], &w, &h, &aw ); + x1 = lb->box_x; + x2 = lb->box_x + lb->box_w; + y1 = (lb->citem-lb->first_item)*LINE_SPACING+lb->box_y; + y2 = y1+h; + if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) + { + // Tell callback, allow staying in menu + event->type = EVENT_NEWMENU_SELECTED; + if (lb->listbox_callback && (*lb->listbox_callback)(lb, event, lb->userdata)) + return 1; + + window_close(wind); + return 1; + } + } + + return 0; +} + int listbox_key_command(window *wind, d_event *event, listbox *lb) { int key = ((d_event_keycommand *)event)->keycode; @@ -1835,55 +1888,6 @@ int listbox_key_command(window *wind, d_event *event, listbox *lb) return rval; } -int listbox_idle(window *wind, listbox *lb) -{ - int i; -#ifdef NEWMENU_MOUSE - int mx, my, mz, x1, x2, y1, y2; //, dblclick_flag; -#endif - d_event event = { EVENT_NEWMENU_SELECTED }; - - timer_delay2(50); - -#ifdef NEWMENU_MOUSE - lb->omouse_state = lb->mouse_state; - lb->mouse_state = mouse_button_state(0); -#endif - - //see if redbook song needs to be restarted - RBACheckFinishedHook(); - -#ifdef NEWMENU_MOUSE - if (lb->mouse_state) { - int w, h, aw; - - mouse_get_pos(&mx, &my, &mz); - for (i=lb->first_item; ifirst_item+LB_ITEMS_ON_SCREEN; i++ ) { - if (i >= lb->nitems) - break; - gr_get_string_size(lb->item[i], &w, &h, &aw ); - x1 = lb->box_x; - x2 = lb->box_x + lb->box_w; - y1 = (i-lb->first_item)*LINE_SPACING+lb->box_y; - y2 = y1+h; - if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) { - lb->citem = i; - - // Tell callback, allow staying in menu - if (lb->listbox_callback && (*lb->listbox_callback)(lb, &event, lb->userdata)) - return 1; - - window_close(wind); - return 1; - break; - } - } - } -#endif - - return 0; -} - int listbox_draw(window *wind, listbox *lb) { int i; @@ -1952,12 +1956,25 @@ int listbox_handler(window *wind, d_event *event, listbox *lb) newmenu_hide_cursor(); break; + case EVENT_MOUSE_BUTTON_DOWN: + case EVENT_MOUSE_BUTTON_UP: + if (mouse_get_button(event) != 0) + return 0; + + lb->mouse_state = event->type == EVENT_MOUSE_BUTTON_DOWN; + return listbox_mouse(wind, event, lb); + case EVENT_KEY_COMMAND: return listbox_key_command(wind, event, lb); break; case EVENT_IDLE: - return listbox_idle(wind, lb); + timer_delay2(50); + + //see if redbook song needs to be restarted + RBACheckFinishedHook(); + + return listbox_mouse(wind, event, lb); break; case EVENT_WINDOW_DRAW: @@ -2042,7 +2059,7 @@ listbox *newmenu_listbox1( char * title, int nitems, char * items[], int allow_a lb->first_item = 0; update_scroll_position(lb); - lb->mouse_state = lb->omouse_state = 0; //dblclick_flag = 0; + lb->mouse_state = 0; //dblclick_flag = 0; return lb; } diff --git a/main/titles.c b/main/titles.c index 4fd71ed29..42f2e3b48 100644 --- a/main/titles.c +++ b/main/titles.c @@ -90,6 +90,16 @@ int title_handler(window *wind, d_event *event, title_screen *ts) { switch (event->type) { + case EVENT_MOUSE_BUTTON_DOWN: + if (mouse_get_button(event) != 0) + return 0; + else if (ts->allow_keys) + { + window_close(wind); + return 1; + } + break; + case EVENT_KEY_COMMAND: switch (((d_event_keycommand *)event)->keycode) { @@ -107,7 +117,7 @@ int title_handler(window *wind, d_event *event, title_screen *ts) case EVENT_IDLE: timer_delay2(50); - if ((mouse_button_state(0) && ts->allow_keys) || (timer_get_fixed_seconds() > ts->timer)) + if (timer_get_fixed_seconds() > ts->timer) { window_close(wind); return 1; @@ -1081,6 +1091,26 @@ int briefing_handler(window *wind, d_event *event, briefing *br) key_flush(); break; + case EVENT_MOUSE_BUTTON_DOWN: + if (mouse_get_button(event) == 0) + { + if (br->new_screen) + { + if (!new_briefing_screen(br, 0)) + { + window_close(wind); + return 1; + } + } + else if (br->new_page) + init_new_page(br); + else + br->delay_count = 0; + + return 1; + } + break; + case EVENT_KEY_COMMAND: { int key = ((d_event_keycommand *)event)->keycode; @@ -1129,22 +1159,6 @@ int briefing_handler(window *wind, d_event *event, briefing *br) case EVENT_IDLE: timer_delay2(50); - if (mouse_button_state(0)) - { - if (br->new_screen) - { - if (!new_briefing_screen(br, 0)) - { - window_close(wind); - return 1; - } - } - else if (br->new_page) - init_new_page(br); - - br->delay_count = 0; - } - if (!(br->new_screen || br->new_page)) while (!briefing_process_char(br) && !br->delay_count) {