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
This commit is contained in:
parent
c62d310c4c
commit
1ff3f56c1c
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
172
main/kconfig.c
172
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; i<menu->nitems; 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; i<menu->nitems; 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<<i) )
|
||||
code = i;
|
||||
}
|
||||
if (code!=255) {
|
||||
for (i=0; i<menu->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; i<menu->nitems; 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 )
|
||||
|
|
619
main/newmenu.c
619
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; i<menu->max_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; i<menu->nitems; 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-4<menu->scroll_offset && menu->scroll_offset > 0)
|
||||
{
|
||||
menu->scroll_offset--;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (menu->scroll_offset+menu->max_displayable<menu->nitems) {
|
||||
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; i<menu->max_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; i<menu->nitems; 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; i<menu->max_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; i<menu->nitems; 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-4<menu->scroll_offset && menu->scroll_offset > 0)
|
||||
{
|
||||
menu->scroll_offset--;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (menu->scroll_offset+menu->max_displayable<menu->nitems) {
|
||||
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; i<menu->max_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; i<menu->nitems; 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; i<lb->first_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; i<lb->first_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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue