nel-X11-modesetting.patch

ThibG, 05/22/2010 01:14 pm

Download (8.2 kB)

b/code/nel/src/3d/driver/opengl/driver_opengl.cpp Sat May 22 12:18:02 2010 +0200
1612 1612
	_WindowX = clientRect.left;
1613 1613
	_WindowY = clientRect.top;
1614 1614
	_FullScreen = !mode.Windowed;
1615
#else
1616
	// TODO linux version !!!
1617
#endif
1615

1616
#elif defined(NL_OS_UNIX) // NL_OS_WINDOWS
1617

1618
	// Update WM hints (update size and disallow resizing)
1619
	XSizeHints size_hints;
1620
	size_hints.x = 0;
1621
	size_hints.y = 0;
1622
	size_hints.width = mode.Width;
1623
	size_hints.height = mode.Height;
1624
	size_hints.flags = PSize | PMinSize | PMaxSize;
1625
	size_hints.min_width = mode.Width;
1626
	size_hints.min_height = mode.Height;
1627
	size_hints.max_width = mode.Width;
1628
	size_hints.max_height = mode.Height;
1629

1630
	XSetWMNormalHints(dpy, win, &size_hints);
1631

1632
	// Toggle fullscreen
1633
	if (mode.Windowed == _FullScreen)
1634
	{
1635
		XEvent xev;
1636
		memset(&xev, 0, sizeof(xev));
1637
		xev.type = ClientMessage;
1638
		xev.xclient.window = win;
1639
		xev.xclient.message_type =  XInternAtom(dpy, "_NET_WM_STATE", false);
1640
		xev.xclient.format = 32;
1641
		xev.xclient.data.l[0] = !mode.Windowed;
1642
		xev.xclient.data.l[1] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", false);
1643
		xev.xclient.data.l[2] = 0;
1644
		XSendEvent(dpy, DefaultRootWindow(dpy), false, SubstructureNotifyMask, &xev);
1645

1646
		//TODO: Change X display mode
1647
	}
1648
	_FullScreen = !mode.Windowed;
1649

1650
	// Resize and update the window
1651
	XResizeWindow(dpy, win, mode.Width, mode.Height);
1652
	XMapWindow(dpy, win);
1653

1654
#endif // NL_OS_UNIX
1618 1655
	return true;
1619 1656
}
1620 1657

b/code/nel/src/3d/driver/opengl/driver_opengl.cpp Sat May 22 12:54:26 2010 +0200
1096 1096
	XSetWindowAttributes attr;
1097 1097
	attr.colormap = cmap;
1098 1098
	attr.background_pixel = BlackPixel(dpy, DefaultScreen(dpy));
1099

1100
#ifdef XF86VIDMODE
1101
	// If we're going to attempt fullscreen, we need to set redirect to True,
1102
	// This basically places the window with no borders in the top left
1103
	// corner of the screen.
1104
	if (mode.Windowed)
1105
	{
1106
		attr.override_redirect = False;
1107
	}
1108
	else
1109
	{
1110
		attr.override_redirect = True;
1111
	}
1112
#else
1113 1099
	attr.override_redirect = False;
1114
#endif
1115 1100

1116 1101
	int attr_flags = CWOverrideRedirect | CWColormap | CWBackPixel;
1117 1102

......
1615 1600

1616 1601
#elif defined(NL_OS_UNIX) // NL_OS_WINDOWS
1617 1602

1603
#ifdef XF86VIDMODE
1604
	if (!mode.Windowed)
1605
	{
1606
		if (mode.Windowed == _FullScreen)
1607
		{
1608
			memset(&_OldScreenMode, 0, sizeof(_OldScreenMode));
1609
			XF86VidModeGetModeLine(dpy, DefaultScreen(dpy), &_OldDotClock, &_OldScreenMode);
1610
			XF86VidModeGetViewPort(dpy, DefaultScreen(dpy), &_OldX, &_OldY);
1611
		}
1612

1613
		XF86VidModeModeInfo **modes;
1614
		int nmodes;
1615
		if (XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &nmodes, &modes))
1616
		{
1617
			for (int i = 0; i < nmodes; i++)
1618
			{
1619
				nldebug("3D: Available mode - %dx%d", modes[i]->hdisplay, modes[i]->vdisplay);
1620
				if(modes[i]->hdisplay == mode.Width && modes[i]->vdisplay == mode.Height)
1621
				{
1622
					if(XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), modes[i]))
1623
					{
1624
						nlinfo("3D: Switching to mode %dx%d", modes[i]->hdisplay, modes[i]->vdisplay);
1625
						XF86VidModeSetViewPort(dpy, DefaultScreen(dpy), 0, 0);
1626
					}
1627
					break;
1628
				}
1629
			}
1630
		}
1631
	}
1632
	else if (mode.Windowed == _FullScreen)
1633
	{
1634
		XF86VidModeModeInfo info;
1635
		nlinfo("3D: Switching back to original mode");
1636

1637
		// This is a bit ugly - a quick hack to copy the ModeLine structure
1638
		// into the modeInfo structure.
1639
		memcpy((XF86VidModeModeLine *)((char *)&info + sizeof(info.dotclock)),&_OldScreenMode, sizeof(XF86VidModeModeLine));
1640
		info.dotclock = _OldDotClock;
1641

1642
		nlinfo("3D: Switching back mode to %dx%d", info.hdisplay, info.vdisplay);
1643
		XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), &info);
1644
		nlinfo("3D: Switching back viewport to %d,%d",_OldX, _OldY);
1645
		XF86VidModeSetViewPort(dpy, DefaultScreen(dpy), _OldX, _OldY);
1646
	}
1647
#endif // XF86VIDMODE
1648

1618 1649
	// Update WM hints (update size and disallow resizing)
1619 1650
	XSizeHints size_hints;
1620 1651
	size_hints.x = 0;
......
1642 1673
		xev.xclient.data.l[1] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", false);
1643 1674
		xev.xclient.data.l[2] = 0;
1644 1675
		XSendEvent(dpy, DefaultRootWindow(dpy), false, SubstructureNotifyMask, &xev);
1645

1646
		//TODO: Change X display mode
1647 1676
	}
1648 1677
	_FullScreen = !mode.Windowed;
1649 1678

b/code/nel/src/3d/driver/opengl/driver_opengl.cpp Sat May 22 13:06:56 2010 +0200
1141 1141
//	XEvent event;
1142 1142
//	XIfEvent(dpy, &event, WaitForNotify, (char *)this);
1143 1143

1144
#ifdef XF86VIDMODE
1145
	if (!mode.Windowed)
1146
	{
1147
		// Set window to the right size, map it to the display, and raise it to the front
1148
		XResizeWindow(dpy, win, width, height);
1149
		XMapRaised(dpy, win);
1150
		XRaiseWindow(dpy, win);
1151

1152
		// grab the mouse and keyboard on the fullscreen window
1153
		if ((XGrabPointer(dpy, win, True, 0, GrabModeAsync, GrabModeAsync, win, None, CurrentTime) != GrabSuccess) ||
1154
			(XGrabKeyboard(dpy, win, True, GrabModeAsync, GrabModeAsync, CurrentTime) != 0) )
1155
		{
1156
			// Until I work out how to deal with this nicely, it just gives
1157
			// an error and exits the prorgam.
1158
			nlerror("Unable to grab keyboard and mouse");
1159
		}
1160
		else
1161
		{
1162
			// Save the old screen mode and dotclock and viewport
1163
			memset(&_OldScreenMode, 0, sizeof(_OldScreenMode));
1164
			XF86VidModeGetModeLine(dpy, DefaultScreen(dpy), &_OldDotClock, &_OldScreenMode);
1165
			XF86VidModeGetViewPort(dpy, DefaultScreen(dpy), &_OldX, &_OldY);
1166

1167
			// Get a list of modes, search for an appropriate one.
1168
			XF86VidModeModeInfo **modes;
1169
			int nmodes;
1170
			if (XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &nmodes, &modes))
1171
			{
1172
				int mode_index = -1; // Gah, magic numbers all bad.
1173
				for (int i = 0; i < nmodes; i++)
1174
				{
1175
					nldebug("3D: Available mode - %dx%d", modes[i]->hdisplay, modes[i]->vdisplay);
1176
					if(modes[i]->hdisplay == width && modes[i]->vdisplay == height)
1177
					{
1178
						mode_index = i;
1179
						break;
1180
					}
1181
				}
1182
				// Switch to the mode
1183
				if (mode_index != -1)
1184
				{
1185
					if(XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), modes[mode_index]))
1186
					{
1187
						nlinfo("3D: Switching to mode %dx%d", modes[mode_index]->hdisplay, modes[mode_index]->vdisplay);
1188
						XF86VidModeSetViewPort(dpy, DefaultScreen(dpy), 0, 0);
1189
						_FullScreen = true;
1190
					}
1191
				}
1192
				else
1193
				{
1194
					// This is a problem, since we've nuked the border from
1195
					// window in the setup stage, until I work out how
1196
					// to get it back (recreate window? seems excessive)
1197
					nlerror("Couldn't find an appropriate mode %dx%d", width, height);
1198
				}
1199
			}
1200
		}
1201
	}
1202

1203
#endif // XF86VIDMODE
1144
	setMode(mode);
1204 1145

1205 1146
#endif // NL_OS_UNIX
1206 1147

......
1603 1544
#ifdef XF86VIDMODE
1604 1545
	if (!mode.Windowed)
1605 1546
	{
1547
		// Store old mdoe in order to restore it when leaving fullscreen
1606 1548
		if (mode.Windowed == _FullScreen)
1607 1549
		{
1608 1550
			memset(&_OldScreenMode, 0, sizeof(_OldScreenMode));
......
1610 1552
			XF86VidModeGetViewPort(dpy, DefaultScreen(dpy), &_OldX, &_OldY);
1611 1553
		}
1612 1554

1555
		// Find the requested mode and use it
1613 1556
		XF86VidModeModeInfo **modes;
1614 1557
		int nmodes;
1615 1558
		if (XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &nmodes, &modes))