Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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);
	}
}
Beispiel #4
0
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;
}