Пример #1
0
static void HandleEvents(void)
{
	XEvent event;
	int key;
	Uchar unicode;
	qboolean dowarp = false;

	if (!vidx11_display)
		return;

	in_mouse_x += in_mouse_x_save;
	in_mouse_y += in_mouse_y_save;
	in_mouse_x_save = 0;
	in_mouse_y_save = 0;

	while (XPending(vidx11_display))
	{
		XNextEvent(vidx11_display, &event);

		switch (event.type)
		{
		case KeyPress:
			// key pressed
			key = XLateKey (&event.xkey, &unicode);
			Key_Event(key, unicode, true);
			break;

		case KeyRelease:
			// key released
			key = XLateKey (&event.xkey, &unicode);
			Key_Event(key, unicode, false);
			break;

		case MotionNotify:
			// mouse moved
			if (vid_usingmouse)
			{
#ifdef USEDGA
				if (vid_usingdgamouse)
				{
					in_mouse_x += event.xmotion.x_root;
					in_mouse_y += event.xmotion.y_root;
				}
				else
#endif
				{
					if (!event.xmotion.send_event)
					{
						in_mouse_x += event.xmotion.x - in_windowmouse_x;
						in_mouse_y += event.xmotion.y - in_windowmouse_y;
						//if (abs(vid.width/2 - event.xmotion.x) + abs(vid.height/2 - event.xmotion.y))
						if (vid_stick_mouse.integer || abs(vid.width/2 - event.xmotion.x) > vid.width / 4 || abs(vid.height/2 - event.xmotion.y) > vid.height / 4)
							dowarp = true;
					}
				}
			}
			in_windowmouse_x = event.xmotion.x;
			in_windowmouse_y = event.xmotion.y;
			break;

		case ButtonPress:
			// mouse button pressed
			if (event.xbutton.button <= 18)
				Key_Event(buttonremap[event.xbutton.button - 1], 0, true);
			else
				Con_Printf("HandleEvents: ButtonPress gave value %d, 1-18 expected\n", event.xbutton.button);
			break;

		case ButtonRelease:
			// mouse button released
			if (event.xbutton.button <= 18)
				Key_Event(buttonremap[event.xbutton.button - 1], 0, false);
			else
				Con_Printf("HandleEvents: ButtonRelease gave value %d, 1-18 expected\n", event.xbutton.button);
			break;

		case CreateNotify:
			// window created
			win_x = event.xcreatewindow.x;
			win_y = event.xcreatewindow.y;
			break;

		case ConfigureNotify:
			// window changed size/location
			win_x = event.xconfigure.x;
			win_y = event.xconfigure.y;
			if((vid_resizable.integer < 2 || vid_isnetwmfullscreen) && (vid.width != event.xconfigure.width || vid.height != event.xconfigure.height))
			{
				vid.width = event.xconfigure.width;
				vid.height = event.xconfigure.height;
				if(vid_isnetwmfullscreen)
					Con_Printf("NetWM fullscreen: actually using resolution %dx%d\n", vid.width, vid.height);
				else
					Con_DPrintf("Updating to ConfigureNotify resolution %dx%d\n", vid.width, vid.height);

				DPSOFTRAST_Flush();

				if(vid.softdepthpixels)
					free(vid.softdepthpixels);

				DestroyXImages();
				XSync(vidx11_display, False);
				if(!BuildXImages(vid.width, vid.height))
					return;
				XSync(vidx11_display, False);

				vid.softpixels = (unsigned int *) vidx11_ximage[vidx11_ximage_pos]->data;
				vid.softdepthpixels = (unsigned int *)calloc(4, vid.width * vid.height);
			}
			break;
		case DestroyNotify:
			// window has been destroyed
			Sys_Quit(0);
			break;
		case ClientMessage:
			// window manager messages
			if ((event.xclient.format == 32) && ((unsigned int)event.xclient.data.l[0] == wm_delete_window_atom))
				Sys_Quit(0);
			break;
		case MapNotify:
			if (vid_isoverrideredirect)
				break;
			// window restored
			vid_hidden = false;
			VID_RestoreSystemGamma();

			if(vid_isvidmodefullscreen)
			{
				// set our video mode
				XF86VidModeSwitchToMode(vidx11_display, vidx11_screen, &game_vidmode);

				// Move the viewport to top left
				XF86VidModeSetViewPort(vidx11_display, vidx11_screen, 0, 0);
			}

			if(vid_isnetwmfullscreen)
			{
				// make sure it's fullscreen
				XEvent event;
				event.type = ClientMessage;
				event.xclient.serial = 0;
				event.xclient.send_event = True;
				event.xclient.message_type = net_wm_state_atom;
				event.xclient.window = win;
				event.xclient.format = 32;
				event.xclient.data.l[0] = 1;
				event.xclient.data.l[1] = net_wm_state_fullscreen_atom;
				event.xclient.data.l[2] = 0;
				event.xclient.data.l[3] = 1;
				event.xclient.data.l[4] = 0;
				XSendEvent(vidx11_display, root, False, SubstructureRedirectMask | SubstructureNotifyMask, &event);
			}

			dowarp = true;

			break;
		case UnmapNotify:
			if (vid_isoverrideredirect)
				break;
			// window iconified/rolledup/whatever
			vid_hidden = true;
			VID_RestoreSystemGamma();

			if(vid_isvidmodefullscreen)
				XF86VidModeSwitchToMode(vidx11_display, vidx11_screen, &init_vidmode);

			break;
		case FocusIn:
			if (vid_isoverrideredirect)
				break;
			// window is now the input focus
			vid_activewindow = true;
			break;
		case FocusOut:
			if (vid_isoverrideredirect)
				break;

			if(vid_isnetwmfullscreen && event.xfocus.mode == NotifyNormal)
			{
				// iconify netwm fullscreen window when it loses focus
				// when the user selects it in the taskbar, the window manager will map it again and send MapNotify
				XEvent event;
				event.type = ClientMessage;
				event.xclient.serial = 0;
				event.xclient.send_event = True;
				event.xclient.message_type = net_wm_state_atom;
				event.xclient.window = win;
				event.xclient.format = 32;
				event.xclient.data.l[0] = 1;
				event.xclient.data.l[1] = net_wm_state_hidden_atom;
				event.xclient.data.l[2] = 0;
				event.xclient.data.l[3] = 1;
				event.xclient.data.l[4] = 0;
				XSendEvent(vidx11_display, root, False, SubstructureRedirectMask | SubstructureNotifyMask, &event);
			}

			// window is no longer the input focus
			vid_activewindow = false;
			VID_RestoreSystemGamma();

			break;
		case EnterNotify:
			// mouse entered window
			break;
		case LeaveNotify:
			// mouse left window
			break;
		default:
			if(vidx11_shmevent >= 0 && event.type == vidx11_shmevent)
				--vidx11_shmwait;
			break;
		}
	}

	if (dowarp)
	{
		/* move the mouse to the window center again */
		// we'll catch the warp motion by its send_event flag, updating the
		// stored mouse position without adding any delta motion
		XEvent event;
		event.type = MotionNotify;
		event.xmotion.display = vidx11_display;
		event.xmotion.window = win;
		event.xmotion.x = vid.width / 2;
		event.xmotion.y = vid.height / 2;
		XSendEvent(vidx11_display, win, False, PointerMotionMask, &event);
		XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, vid.width / 2, vid.height / 2);
	}
}
Пример #2
0
static void signal_handler(int sig)
{
	Con_Printf("Received signal %d, exiting...\n", sig);
	VID_RestoreSystemGamma();
	Sys_Quit(1);
}
Пример #3
0
void signal_handler(int sig)
{
	Sys_PrintfToTerminal("Received signal %d, exiting...\n", sig);
	VID_RestoreSystemGamma();
	Sys_Quit(1);
}