point map::get_mouse_mappos(void) { point mouse, mappos; mouse = vultures_get_mouse_pos(); mappos.x = (mouse.x - abs_x - 39) / SYMBOL_WIDTH; mappos.y = (mouse.y - abs_y - 91) / SYMBOL_HEIGHT; if (mappos.x < 1 || mappos.x >= COLNO || mappos.y < 0 || mappos.y >= ROWNO) { mappos.x = -1; mappos.y = -1; } return mappos; }
eventresult minimap::handle_mousebuttonup_event(window* target, void* result, int mouse_x, int mouse_y, int button, int state) { point mouse, mappos; int offs_x, offs_y; /* translate the mouse position to a map coordinate */ mouse = vultures_get_mouse_pos(); offs_x = mouse.x - abs_x - 6 - 40; offs_y = mouse.y - abs_y - 6; mappos.x = ( offs_x + 2*offs_y)/4; mappos.y = (-offs_x + 2*offs_y)/4; if (mappos.x < 1 || mappos.x > COLNO || mappos.y < 0 || mappos.y > ROWNO) return V_EVENT_UNHANDLED; /* limited mouse event handling, due to the fact that the minimap * is too small for precise targeting */ /* left button: direct selection of a location (for very imprecise teleport) */ if (button == SDL_BUTTON_LEFT) { if (vultures_whatis_active) { ((vultures_event*)result)->num = 0; ((vultures_event*)result)->x = mappos.x; ((vultures_event*)result)->y = mappos.y; return V_EVENT_HANDLED_FINAL; } ((vultures_event*)result)->num = map_data->perform_map_action(V_ACTION_TRAVEL, mappos); return V_EVENT_HANDLED_FINAL; } /* right button: travel to location */ else if(button == SDL_BUTTON_RIGHT) { levwin->set_view(mappos.x, mappos.y); levwin->need_redraw = 1; return V_EVENT_HANDLED_REDRAW; } return V_EVENT_HANDLED_NOREDRAW; }
void vultures_event_dispatcher(void * result, int resulttype, window * topwin) { vultures_event * queued_event; int event_result = V_EVENT_UNHANDLED; point mouse; SDL_Event event; int redraw; window *win; /* first, check whether we have an autoresponse queued */ while ( (queued_event = vultures_eventstack_get())) { if (queued_event->rtype == resulttype || queued_event->rtype == V_RESPOND_ANY) { /* suppress some messages during automatic actions */ vultures_suppress_helpmsg = 1; if (resulttype == V_RESPOND_POSKEY) *(vultures_event*)result = *queued_event; else if (resulttype == V_RESPOND_CHARACTER) *(char*)result = (char)queued_event->num; else *(int*)result = queued_event->num; return; } } /* this block will take us out of singleshot-whatis mode (triggered by the context menu) */ if (vultures_whatis_singleshot && resulttype == V_RESPOND_POSKEY) { ((vultures_event*)result)->num = ' '; vultures_whatis_singleshot = 0; return; } /* check whether we want to draw the "enhance" icon */ if (enhancebtn) enhancebtn->check_enhance(); /* nothing queued, do normal event processing */ if (!topwin) topwin = ROOTWIN; if (!vultures_whatis_singleshot) /* no need to suppress messages now... */ vultures_suppress_helpmsg = 0; /* kill the tooltip */ vultures_mouse_invalidate_tooltip(1); /* fake a mousemotion event, to make the window set its preferred cursor before we draw */ memset(&event, 0, sizeof(event)); event.type = SDL_MOUSEMOTION; mouse = vultures_get_mouse_pos(); win = topwin->get_window_from_point(mouse); vultures_handle_event(topwin, win, result, &event, &redraw); /* draw windows, if necessary */ topwin->draw_windows(); vultures_mouse_draw(); vultures_refresh_window_region(); vultures_mouse_refresh(); vultures_mouse_restore_bg(); while (event_result != V_EVENT_HANDLED_FINAL) { /* Get next event OR wait 100ms */ vultures_wait_event(&event, 100); event_result = vultures_event_dispatcher_core(&event, result, topwin); SDL_Delay(20); } }
static int vultures_event_dispatcher_core(SDL_Event * event, void * result, window * topwin) { window *win, *win_old; int event_result = V_EVENT_UNHANDLED; int redraw = 0, hovertime_prev = 0; static int hovertime = 0; point mouse, mouse_old = vultures_get_mouse_prev_pos(); if (event->type == SDL_TIMEREVENT) { hovertime_prev = hovertime; hovertime += 150; /* 100 ms event timeout + 20 ms delay after the last event */ event->user.code = hovertime; } else { hovertime = 0; event->user.code = 0; } /* keyboard events are always given to topwin, because mouse cursor * position has nothing to do with keyboard input */ if (event->type == SDL_KEYDOWN) { event_result = topwin->event_handler(topwin, result, event); if (event_result == V_EVENT_HANDLED_REDRAW || event_result == V_EVENT_UNHANDLED_REDRAW) redraw = 1; } else { /* find out what window the mouse is over now */ mouse = vultures_get_mouse_pos(); win = topwin->get_window_from_point(mouse); /* All other events belong to the window under the mouse cursor */ if (event->type == SDL_MOUSEMOTION) { /* delete tooltip; if the mouse gets moved somewhere interesting * the window it is over will set up a new tooltip */ vultures_mouse_invalidate_tooltip(0); /* notify the window the mouse got moved out of */ win_old = topwin->get_window_from_point(mouse_old); if (win_old && win != win_old && win_old != win->parent) { event->type = SDL_MOUSEMOVEOUT; event_result = vultures_handle_event(topwin, win_old, result, event, &redraw); event->type = SDL_MOUSEMOTION; } } /* the mouse might be outside the window of interest (topwin). * if so win is NULL and we can go wait for the next event now... */ if (!win) return V_EVENT_UNHANDLED; event_result = vultures_handle_event(topwin, win, result, event, &redraw); } if (redraw) topwin->draw_windows(); if (redraw || event->type != SDL_TIMEREVENT || (hovertime > HOVERTIMEOUT && hovertime_prev < HOVERTIMEOUT)) vultures_mouse_draw(); /* refresh all regions (except mouse & tt) needing a refresh here, * do NOT do so in draw() functions */ if (redraw || vultures_invrects_num) vultures_refresh_window_region(); if (redraw || event->type != SDL_TIMEREVENT || (hovertime > HOVERTIMEOUT && hovertime_prev < HOVERTIMEOUT)) { vultures_mouse_refresh(); vultures_mouse_restore_bg(); } return event_result; }