Mercurial > sdl-ios-xcode
annotate src/video/x11/SDL_x11video.c @ 3914:4fd12011d8d6 SDL-1.2
Quartz code should use F13, F14, and F15 keys instead of PrintScreen,
ScrollLock, and Pause, since that's what's on the standard Apple keyboards
(minus the laptops, which have neither set). Ideally we'll find a better way
to distinguish this...the keys being replaced would be correct on a USB
keyboard for Windows. Sigh.
Fixes Bugzilla #301.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Wed, 14 Feb 2007 10:23:23 +0000 |
parents | a10bddfdc40f |
children | c5c3c772f5aa |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1299
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1299
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1299
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 9 |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1299
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1299
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1299
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1299
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
236
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 /* X11 based SDL video driver implementation. | |
25 Note: This implementation does not currently need X11 thread locking, | |
26 since the event thread uses a separate X connection and any | |
27 additional locking necessary is handled internally. However, | |
28 if full locking is neccessary, take a look at XInitThreads(). | |
29 */ | |
30 | |
31 #include <unistd.h> | |
32 #include <sys/ioctl.h> | |
33 #ifdef MTRR_SUPPORT | |
34 #include <asm/mtrr.h> | |
35 #include <sys/fcntl.h> | |
36 #endif | |
37 | |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
38 #include "SDL_endian.h" |
0 | 39 #include "SDL_timer.h" |
40 #include "SDL_thread.h" | |
41 #include "SDL_video.h" | |
42 #include "SDL_mouse.h" | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
43 #include "../SDL_sysvideo.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
44 #include "../SDL_pixels_c.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
45 #include "../../events/SDL_events_c.h" |
0 | 46 #include "SDL_x11video.h" |
47 #include "SDL_x11wm_c.h" | |
48 #include "SDL_x11mouse_c.h" | |
49 #include "SDL_x11events_c.h" | |
50 #include "SDL_x11modes_c.h" | |
51 #include "SDL_x11image_c.h" | |
52 #include "SDL_x11yuv_c.h" | |
53 #include "SDL_x11gl_c.h" | |
54 #include "SDL_x11gamma_c.h" | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
55 #include "../blank_cursor.h" |
0 | 56 |
57 /* Initialization/Query functions */ | |
58 static int X11_VideoInit(_THIS, SDL_PixelFormat *vformat); | |
59 static SDL_Surface *X11_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags); | |
60 static int X11_ToggleFullScreen(_THIS, int on); | |
61 static void X11_UpdateMouse(_THIS); | |
62 static int X11_SetColors(_THIS, int firstcolor, int ncolors, | |
63 SDL_Color *colors); | |
64 static int X11_SetGammaRamp(_THIS, Uint16 *ramp); | |
65 static void X11_VideoQuit(_THIS); | |
66 | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
67 |
0 | 68 /* X11 driver bootstrap functions */ |
69 | |
70 static int X11_Available(void) | |
71 { | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
72 Display *display = NULL; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
73 if ( SDL_X11_LoadSymbols() ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
74 display = XOpenDisplay(NULL); |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
75 if ( display != NULL ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
76 XCloseDisplay(display); |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
77 } |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
78 SDL_X11_UnloadSymbols(); |
0 | 79 } |
80 return(display != NULL); | |
81 } | |
82 | |
83 static void X11_DeleteDevice(SDL_VideoDevice *device) | |
84 { | |
85 if ( device ) { | |
86 if ( device->hidden ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
87 SDL_free(device->hidden); |
0 | 88 } |
89 if ( device->gl_data ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
90 SDL_free(device->gl_data); |
0 | 91 } |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
92 SDL_free(device); |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
93 SDL_X11_UnloadSymbols(); |
0 | 94 } |
95 } | |
96 | |
97 static SDL_VideoDevice *X11_CreateDevice(int devindex) | |
98 { | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
99 SDL_VideoDevice *device = NULL; |
0 | 100 |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
101 if ( SDL_X11_LoadSymbols() ) { |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
102 /* Initialize all variables that we clean on shutdown */ |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
103 device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice)); |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
104 if ( device ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
105 SDL_memset(device, 0, (sizeof *device)); |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
106 device->hidden = (struct SDL_PrivateVideoData *) |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
107 SDL_malloc((sizeof *device->hidden)); |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
108 device->gl_data = (struct SDL_PrivateGLData *) |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
109 SDL_malloc((sizeof *device->gl_data)); |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
110 } |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
111 if ( (device == NULL) || (device->hidden == NULL) || |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
112 (device->gl_data == NULL) ) { |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
113 SDL_OutOfMemory(); |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
114 X11_DeleteDevice(device); /* calls SDL_X11_UnloadSymbols(). */ |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
115 return(0); |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
116 } |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
117 SDL_memset(device->hidden, 0, (sizeof *device->hidden)); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
118 SDL_memset(device->gl_data, 0, (sizeof *device->gl_data)); |
0 | 119 |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
120 /* Set the driver flags */ |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
121 device->handles_any_size = 1; |
0 | 122 |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
123 /* Set the function pointers */ |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
124 device->VideoInit = X11_VideoInit; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
125 device->ListModes = X11_ListModes; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
126 device->SetVideoMode = X11_SetVideoMode; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
127 device->ToggleFullScreen = X11_ToggleFullScreen; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
128 device->UpdateMouse = X11_UpdateMouse; |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
129 #if SDL_VIDEO_DRIVER_X11_XV |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
130 device->CreateYUVOverlay = X11_CreateYUVOverlay; |
0 | 131 #endif |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
132 device->SetColors = X11_SetColors; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
133 device->UpdateRects = NULL; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
134 device->VideoQuit = X11_VideoQuit; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
135 device->AllocHWSurface = X11_AllocHWSurface; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
136 device->CheckHWBlit = NULL; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
137 device->FillHWRect = NULL; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
138 device->SetHWColorKey = NULL; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
139 device->SetHWAlpha = NULL; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
140 device->LockHWSurface = X11_LockHWSurface; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
141 device->UnlockHWSurface = X11_UnlockHWSurface; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
142 device->FlipHWSurface = X11_FlipHWSurface; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
143 device->FreeHWSurface = X11_FreeHWSurface; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
144 device->SetGamma = X11_SetVidModeGamma; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
145 device->GetGamma = X11_GetVidModeGamma; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
146 device->SetGammaRamp = X11_SetGammaRamp; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
147 device->GetGammaRamp = NULL; |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
148 #if SDL_VIDEO_OPENGL_GLX |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
149 device->GL_LoadLibrary = X11_GL_LoadLibrary; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
150 device->GL_GetProcAddress = X11_GL_GetProcAddress; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
151 device->GL_GetAttribute = X11_GL_GetAttribute; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
152 device->GL_MakeCurrent = X11_GL_MakeCurrent; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
153 device->GL_SwapBuffers = X11_GL_SwapBuffers; |
0 | 154 #endif |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
155 device->SetCaption = X11_SetCaption; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
156 device->SetIcon = X11_SetIcon; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
157 device->IconifyWindow = X11_IconifyWindow; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
158 device->GrabInput = X11_GrabInput; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
159 device->GetWMInfo = X11_GetWMInfo; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
160 device->FreeWMCursor = X11_FreeWMCursor; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
161 device->CreateWMCursor = X11_CreateWMCursor; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
162 device->ShowWMCursor = X11_ShowWMCursor; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
163 device->WarpWMCursor = X11_WarpWMCursor; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
164 device->CheckMouseMode = X11_CheckMouseMode; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
165 device->InitOSKeymap = X11_InitOSKeymap; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
166 device->PumpEvents = X11_PumpEvents; |
0 | 167 |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
168 device->free = X11_DeleteDevice; |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
169 } |
0 | 170 |
171 return device; | |
172 } | |
173 | |
174 VideoBootStrap X11_bootstrap = { | |
175 "x11", "X Window System", | |
176 X11_Available, X11_CreateDevice | |
177 }; | |
178 | |
179 /* Normal X11 error handler routine */ | |
180 static int (*X_handler)(Display *, XErrorEvent *) = NULL; | |
181 static int x_errhandler(Display *d, XErrorEvent *e) | |
182 { | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
183 #if SDL_VIDEO_DRIVER_X11_VIDMODE |
0 | 184 extern int vm_error; |
185 #endif | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
186 #if SDL_VIDEO_DRIVER_X11_DGAMOUSE |
0 | 187 extern int dga_error; |
188 #endif | |
189 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
190 #if SDL_VIDEO_DRIVER_X11_VIDMODE |
0 | 191 /* VidMode errors are non-fatal. :) */ |
192 /* Are the errors offset by one from the error base? | |
193 e.g. the error base is 143, the code is 148, and the | |
194 actual error is XF86VidModeExtensionDisabled (4) ? | |
195 */ | |
196 if ( (vm_error >= 0) && | |
197 (((e->error_code == BadRequest)&&(e->request_code == vm_error)) || | |
198 ((e->error_code > vm_error) && | |
199 (e->error_code <= (vm_error+XF86VidModeNumberErrors)))) ) { | |
1765 | 200 #ifdef X11_DEBUG |
0 | 201 { char errmsg[1024]; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
202 XGetErrorText(d, e->error_code, errmsg, sizeof(errmsg)); |
0 | 203 printf("VidMode error: %s\n", errmsg); |
204 } | |
205 #endif | |
206 return(0); | |
207 } | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
208 #endif /* SDL_VIDEO_DRIVER_X11_VIDMODE */ |
0 | 209 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
210 #if SDL_VIDEO_DRIVER_X11_DGAMOUSE |
0 | 211 /* DGA errors can be non-fatal. :) */ |
212 if ( (dga_error >= 0) && | |
213 ((e->error_code > dga_error) && | |
214 (e->error_code <= (dga_error+XF86DGANumberErrors))) ) { | |
1765 | 215 #ifdef X11_DEBUG |
0 | 216 { char errmsg[1024]; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
217 XGetErrorText(d, e->error_code, errmsg, sizeof(errmsg)); |
0 | 218 printf("DGA error: %s\n", errmsg); |
219 } | |
220 #endif | |
221 return(0); | |
222 } | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
223 #endif /* SDL_VIDEO_DRIVER_X11_DGAMOUSE */ |
0 | 224 |
225 return(X_handler(d,e)); | |
226 } | |
227 | |
228 /* X11 I/O error handler routine */ | |
229 static int (*XIO_handler)(Display *) = NULL; | |
230 static int xio_errhandler(Display *d) | |
231 { | |
232 /* Ack! Lost X11 connection! */ | |
233 | |
234 /* We will crash if we try to clean up our display */ | |
235 if ( current_video->hidden->Ximage ) { | |
236 SDL_VideoSurface->pixels = NULL; | |
237 } | |
238 current_video->hidden->X11_Display = NULL; | |
239 | |
240 /* Continue with the standard X11 error handler */ | |
241 return(XIO_handler(d)); | |
242 } | |
243 | |
1609
c3b5d17277d4
Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents:
1575
diff
changeset
|
244 static int (*Xext_handler)(Display *, _Xconst char *, _Xconst char *) = NULL; |
c3b5d17277d4
Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents:
1575
diff
changeset
|
245 static int xext_errhandler(Display *d, _Xconst char *ext, _Xconst char *reason) |
1248
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
246 { |
1765 | 247 #ifdef X11_DEBUG |
1248
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
248 printf("Xext error inside SDL (may be harmless):\n"); |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
249 printf(" Extension \"%s\" %s on display \"%s\".\n", |
1609
c3b5d17277d4
Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents:
1575
diff
changeset
|
250 ext, reason, XDisplayString(d)); |
1248
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
251 #endif |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
252 |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
253 if (SDL_strcmp(reason, "missing") == 0) { |
1248
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
254 /* |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
255 * Since the query itself, elsewhere, can handle a missing extension |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
256 * and the default behaviour in Xlib is to write to stderr, which |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
257 * generates unnecessary bug reports, we just ignore these. |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
258 */ |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
259 return 0; |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
260 } |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
261 |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
262 /* Everything else goes to the default handler... */ |
1609
c3b5d17277d4
Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents:
1575
diff
changeset
|
263 return Xext_handler(d, ext, reason); |
1248
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
264 } |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
265 |
1325 | 266 /* Find out what class name we should use */ |
267 static char *get_classname(char *classname, int maxlen) | |
268 { | |
269 char *spot; | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
270 #if defined(__LINUX__) || defined(__FREEBSD__) |
1325 | 271 char procfile[1024]; |
272 char linkfile[1024]; | |
273 int linksize; | |
274 #endif | |
275 | |
276 /* First allow environment variable override */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
277 spot = SDL_getenv("SDL_VIDEO_X11_WMCLASS"); |
1325 | 278 if ( spot ) { |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
279 SDL_strlcpy(classname, spot, maxlen); |
1325 | 280 return classname; |
281 } | |
282 | |
283 /* Next look at the application's executable name */ | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
284 #if defined(__LINUX__) || defined(__FREEBSD__) |
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
285 #if defined(__LINUX__) |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
286 SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/exe", getpid()); |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
287 #elif defined(__FREEBSD__) |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
288 SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/file", getpid()); |
1325 | 289 #else |
290 #error Where can we find the executable name? | |
291 #endif | |
292 linksize = readlink(procfile, linkfile, sizeof(linkfile)-1); | |
293 if ( linksize > 0 ) { | |
294 linkfile[linksize] = '\0'; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
295 spot = SDL_strrchr(linkfile, '/'); |
1325 | 296 if ( spot ) { |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
297 SDL_strlcpy(classname, spot+1, maxlen); |
1325 | 298 } else { |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
299 SDL_strlcpy(classname, linkfile, maxlen); |
1325 | 300 } |
301 return classname; | |
302 } | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
303 #endif /* __LINUX__ */ |
1325 | 304 |
305 /* Finally use the default we've used forever */ | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
306 SDL_strlcpy(classname, "SDL_App", maxlen); |
1325 | 307 return classname; |
308 } | |
309 | |
0 | 310 /* Create auxiliary (toplevel) windows with the current visual */ |
311 static void create_aux_windows(_THIS) | |
312 { | |
1765 | 313 int x = 0, y = 0; |
1325 | 314 char classname[1024]; |
0 | 315 XSetWindowAttributes xattr; |
316 XWMHints *hints; | |
317 int def_vis = (SDL_Visual == DefaultVisual(SDL_Display, SDL_Screen)); | |
318 | |
1558 | 319 /* Look up some useful Atoms */ |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
320 WM_DELETE_WINDOW = XInternAtom(SDL_Display, "WM_DELETE_WINDOW", False); |
1558 | 321 |
0 | 322 /* Don't create any extra windows if we are being managed */ |
323 if ( SDL_windowid ) { | |
324 FSwindow = 0; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
325 WMwindow = SDL_strtol(SDL_windowid, NULL, 0); |
0 | 326 return; |
327 } | |
328 | |
329 if(FSwindow) | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
330 XDestroyWindow(SDL_Display, FSwindow); |
0 | 331 |
1863 | 332 #if SDL_VIDEO_DRIVER_X11_XINERAMA |
1765 | 333 if ( use_xinerama ) { |
334 x = xinerama_info.x_org; | |
335 y = xinerama_info.y_org; | |
336 } | |
337 #endif | |
0 | 338 xattr.override_redirect = True; |
339 xattr.background_pixel = def_vis ? BlackPixel(SDL_Display, SDL_Screen) : 0; | |
340 xattr.border_pixel = 0; | |
341 xattr.colormap = SDL_XColorMap; | |
342 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
343 FSwindow = XCreateWindow(SDL_Display, SDL_Root, |
1765 | 344 x, y, 32, 32, 0, |
0 | 345 this->hidden->depth, InputOutput, SDL_Visual, |
346 CWOverrideRedirect | CWBackPixel | CWBorderPixel | |
347 | CWColormap, | |
348 &xattr); | |
349 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
350 XSelectInput(SDL_Display, FSwindow, StructureNotifyMask); |
0 | 351 |
352 /* Tell KDE to keep the fullscreen window on top */ | |
353 { | |
354 XEvent ev; | |
355 long mask; | |
356 | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
357 SDL_memset(&ev, 0, sizeof(ev)); |
0 | 358 ev.xclient.type = ClientMessage; |
359 ev.xclient.window = SDL_Root; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
360 ev.xclient.message_type = XInternAtom(SDL_Display, |
0 | 361 "KWM_KEEP_ON_TOP", False); |
362 ev.xclient.format = 32; | |
363 ev.xclient.data.l[0] = FSwindow; | |
364 ev.xclient.data.l[1] = CurrentTime; | |
365 mask = SubstructureRedirectMask; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
366 XSendEvent(SDL_Display, SDL_Root, False, mask, &ev); |
0 | 367 } |
368 | |
369 hints = NULL; | |
370 if(WMwindow) { | |
371 /* All window attributes must survive the recreation */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
372 hints = XGetWMHints(SDL_Display, WMwindow); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
373 XDestroyWindow(SDL_Display, WMwindow); |
0 | 374 } |
375 | |
376 /* Create the window for windowed management */ | |
377 /* (reusing the xattr structure above) */ | |
1765 | 378 WMwindow = XCreateWindow(SDL_Display, SDL_Root, |
379 x, y, 32, 32, 0, | |
0 | 380 this->hidden->depth, InputOutput, SDL_Visual, |
381 CWBackPixel | CWBorderPixel | CWColormap, | |
382 &xattr); | |
383 | |
384 /* Set the input hints so we get keyboard input */ | |
385 if(!hints) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
386 hints = XAllocWMHints(); |
0 | 387 hints->input = True; |
388 hints->flags = InputHint; | |
389 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
390 XSetWMHints(SDL_Display, WMwindow, hints); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
391 XFree(hints); |
1767 | 392 X11_SetCaptionNoLock(this, this->wm_title, this->wm_icon); |
0 | 393 |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
394 XSelectInput(SDL_Display, WMwindow, |
0 | 395 FocusChangeMask | KeyPressMask | KeyReleaseMask |
396 | PropertyChangeMask | StructureNotifyMask | KeymapStateMask); | |
397 | |
398 /* Set the class hints so we can get an icon (AfterStep) */ | |
1325 | 399 get_classname(classname, sizeof(classname)); |
0 | 400 { |
401 XClassHint *classhints; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
402 classhints = XAllocClassHint(); |
0 | 403 if(classhints != NULL) { |
449
8a687496061f
Added an environment variable SDL_VIDEO_X11_WMCLASS
Sam Lantinga <slouken@libsdl.org>
parents:
444
diff
changeset
|
404 classhints->res_name = classname; |
8a687496061f
Added an environment variable SDL_VIDEO_X11_WMCLASS
Sam Lantinga <slouken@libsdl.org>
parents:
444
diff
changeset
|
405 classhints->res_class = classname; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
406 XSetClassHint(SDL_Display, WMwindow, classhints); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
407 XFree(classhints); |
0 | 408 } |
409 } | |
410 | |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
411 /* Setup the communication with the IM server */ |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
412 SDL_IM = NULL; |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
413 SDL_IC = NULL; |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
414 |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
415 #ifdef X_HAVE_UTF8_STRING |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
416 if (SDL_X11_HAVE_UTF8) { |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
417 SDL_IM = XOpenIM(SDL_Display, NULL, classname, classname); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
418 if (SDL_IM == NULL) { |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
419 SDL_SetError("no input method could be opened"); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
420 } else { |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
421 SDL_IC = pXCreateIC(SDL_IM, |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
422 XNClientWindow, WMwindow, |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
423 XNFocusWindow, WMwindow, |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
424 XNInputStyle, XIMPreeditNothing | XIMStatusNothing, |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
425 XNResourceName, classname, |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
426 XNResourceClass, classname, |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
427 NULL); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
428 |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
429 if (SDL_IC == NULL) { |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
430 SDL_SetError("no input context could be created"); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
431 XCloseIM(SDL_IM); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
432 SDL_IM = NULL; |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
433 } |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
434 } |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
435 } |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
436 #endif |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
437 |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
438 /* Allow the window to be deleted by the window manager */ |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
439 XSetWMProtocols(SDL_Display, WMwindow, &WM_DELETE_WINDOW, 1); |
0 | 440 } |
441 | |
442 static int X11_VideoInit(_THIS, SDL_PixelFormat *vformat) | |
443 { | |
444 char *display; | |
445 int i; | |
446 | |
447 /* Open the X11 display */ | |
448 display = NULL; /* Get it from DISPLAY environment variable */ | |
449 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
450 if ( (SDL_strncmp(XDisplayName(display), ":", 1) == 0) || |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
451 (SDL_strncmp(XDisplayName(display), "unix:", 5) == 0) ) { |
0 | 452 local_X11 = 1; |
453 } else { | |
454 local_X11 = 0; | |
455 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
456 SDL_Display = XOpenDisplay(display); |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
457 #if defined(__osf__) && defined(SDL_VIDEO_DRIVER_X11_DYNAMIC) |
1299
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
458 /* On Tru64 if linking without -lX11, it fails and you get following message. |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
459 * Xlib: connection to ":0.0" refused by server |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
460 * Xlib: XDM authorization key matches an existing client! |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
461 * |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
462 * It succeeds if retrying 1 second later |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
463 * or if running xhost +localhost on shell. |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
464 * |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
465 */ |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
466 if ( SDL_Display == NULL ) { |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
467 SDL_Delay(1000); |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
468 SDL_Display = XOpenDisplay(display); |
1299
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
469 } |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
470 #endif |
0 | 471 if ( SDL_Display == NULL ) { |
472 SDL_SetError("Couldn't open X11 display"); | |
473 return(-1); | |
474 } | |
475 #ifdef X11_DEBUG | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
476 XSynchronize(SDL_Display, True); |
0 | 477 #endif |
478 | |
479 /* Create an alternate X display for graphics updates -- allows us | |
480 to do graphics updates in a separate thread from event handling. | |
481 Thread-safe X11 doesn't seem to exist. | |
482 */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
483 GFX_Display = XOpenDisplay(display); |
0 | 484 if ( GFX_Display == NULL ) { |
485 SDL_SetError("Couldn't open X11 display"); | |
486 return(-1); | |
487 } | |
488 | |
489 /* Set the normal X error handler */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
490 X_handler = XSetErrorHandler(x_errhandler); |
0 | 491 |
492 /* Set the error handler if we lose the X display */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
493 XIO_handler = XSetIOErrorHandler(xio_errhandler); |
0 | 494 |
1248
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
495 /* Set the X extension error handler */ |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
496 Xext_handler = XSetExtensionErrorHandler(xext_errhandler); |
1248
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
497 |
0 | 498 /* use default screen (from $DISPLAY) */ |
499 SDL_Screen = DefaultScreen(SDL_Display); | |
500 | |
501 #ifndef NO_SHARED_MEMORY | |
502 /* Check for MIT shared memory extension */ | |
556
08588ee79a67
Fixed compile error if there is no X11 shared memory support.
Sam Lantinga <slouken@libsdl.org>
parents:
499
diff
changeset
|
503 use_mitshm = 0; |
0 | 504 if ( local_X11 ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
505 use_mitshm = XShmQueryExtension(SDL_Display); |
0 | 506 } |
507 #endif /* NO_SHARED_MEMORY */ | |
508 | |
509 /* Get the available video modes */ | |
510 if(X11_GetVideoModes(this) < 0) | |
511 return -1; | |
512 | |
1545
8d9bb0cf2c2a
Added current_w and current_h to the SDL_VideoInfo structure, which is set to the desktop resolution during video intialization, and then set to the current resolution when a video mode is set.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
513 /* Determine the current screen size */ |
8d9bb0cf2c2a
Added current_w and current_h to the SDL_VideoInfo structure, which is set to the desktop resolution during video intialization, and then set to the current resolution when a video mode is set.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
514 this->info.current_w = DisplayWidth(SDL_Display, SDL_Screen); |
8d9bb0cf2c2a
Added current_w and current_h to the SDL_VideoInfo structure, which is set to the desktop resolution during video intialization, and then set to the current resolution when a video mode is set.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
515 this->info.current_h = DisplayHeight(SDL_Display, SDL_Screen); |
8d9bb0cf2c2a
Added current_w and current_h to the SDL_VideoInfo structure, which is set to the desktop resolution during video intialization, and then set to the current resolution when a video mode is set.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
516 |
0 | 517 /* Determine the default screen depth: |
518 Use the default visual (or at least one with the same depth) */ | |
519 SDL_DisplayColormap = DefaultColormap(SDL_Display, SDL_Screen); | |
520 for(i = 0; i < this->hidden->nvisuals; i++) | |
521 if(this->hidden->visuals[i].depth == DefaultDepth(SDL_Display, | |
522 SDL_Screen)) | |
523 break; | |
524 if(i == this->hidden->nvisuals) { | |
525 /* default visual was useless, take the deepest one instead */ | |
526 i = 0; | |
527 } | |
528 SDL_Visual = this->hidden->visuals[i].visual; | |
529 if ( SDL_Visual == DefaultVisual(SDL_Display, SDL_Screen) ) { | |
530 SDL_XColorMap = SDL_DisplayColormap; | |
531 } else { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
532 SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root, |
0 | 533 SDL_Visual, AllocNone); |
534 } | |
535 this->hidden->depth = this->hidden->visuals[i].depth; | |
536 vformat->BitsPerPixel = this->hidden->visuals[i].bpp; | |
537 if ( vformat->BitsPerPixel > 8 ) { | |
538 vformat->Rmask = SDL_Visual->red_mask; | |
539 vformat->Gmask = SDL_Visual->green_mask; | |
540 vformat->Bmask = SDL_Visual->blue_mask; | |
541 } | |
1641 | 542 if ( this->hidden->depth == 32 ) { |
543 vformat->Amask = (0xFFFFFFFF & ~(vformat->Rmask|vformat->Gmask|vformat->Bmask)); | |
544 } | |
0 | 545 X11_SaveVidModeGamma(this); |
546 | |
1783 | 547 /* Save DPMS and screensaver settings */ |
1784
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
548 X11_SaveScreenSaver(SDL_Display, &screensaver_timeout, &dpms_enabled); |
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
549 X11_DisableScreenSaver(SDL_Display); |
1783 | 550 |
0 | 551 /* See if we have been passed a window to use */ |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
552 SDL_windowid = SDL_getenv("SDL_WINDOWID"); |
0 | 553 |
554 /* Create the fullscreen and managed windows */ | |
555 create_aux_windows(this); | |
556 | |
557 /* Create the blank cursor */ | |
558 SDL_BlankCursor = this->CreateWMCursor(this, blank_cdata, blank_cmask, | |
559 BLANK_CWIDTH, BLANK_CHEIGHT, | |
560 BLANK_CHOTX, BLANK_CHOTY); | |
561 | |
562 /* Fill in some window manager capabilities */ | |
563 this->info.wm_available = 1; | |
564 | |
565 /* We're done! */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
566 XFlush(SDL_Display); |
0 | 567 return(0); |
568 } | |
569 | |
570 static void X11_DestroyWindow(_THIS, SDL_Surface *screen) | |
571 { | |
572 /* Clean up OpenGL */ | |
573 if ( screen ) { | |
574 screen->flags &= ~(SDL_OPENGL|SDL_OPENGLBLIT); | |
575 } | |
576 X11_GL_Shutdown(this); | |
577 | |
578 if ( ! SDL_windowid ) { | |
579 /* Hide the managed window */ | |
580 if ( WMwindow ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
581 XUnmapWindow(SDL_Display, WMwindow); |
0 | 582 } |
583 if ( screen && (screen->flags & SDL_FULLSCREEN) ) { | |
584 screen->flags &= ~SDL_FULLSCREEN; | |
585 X11_LeaveFullScreen(this); | |
586 } | |
587 | |
588 /* Destroy the output window */ | |
589 if ( SDL_Window ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
590 XDestroyWindow(SDL_Display, SDL_Window); |
0 | 591 } |
592 | |
593 /* Free the colormap entries */ | |
594 if ( SDL_XPixels ) { | |
595 int numcolors; | |
596 unsigned long pixel; | |
597 numcolors = SDL_Visual->map_entries; | |
598 for ( pixel=0; pixel<numcolors; ++pixel ) { | |
599 while ( SDL_XPixels[pixel] > 0 ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
600 XFreeColors(GFX_Display, |
0 | 601 SDL_DisplayColormap,&pixel,1,0); |
602 --SDL_XPixels[pixel]; | |
603 } | |
604 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
605 SDL_free(SDL_XPixels); |
0 | 606 SDL_XPixels = NULL; |
607 } | |
608 | |
609 /* Free the graphics context */ | |
610 if ( SDL_GC ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
611 XFreeGC(SDL_Display, SDL_GC); |
0 | 612 SDL_GC = 0; |
613 } | |
614 } | |
615 } | |
616 | |
497
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
617 static SDL_bool X11_WindowPosition(_THIS, int *x, int *y, int w, int h) |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
618 { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
619 const char *window = SDL_getenv("SDL_VIDEO_WINDOW_POS"); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
620 const char *center = SDL_getenv("SDL_VIDEO_CENTERED"); |
497
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
621 if ( window ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
622 if ( SDL_sscanf(window, "%d,%d", x, y) == 2 ) { |
497
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
623 return SDL_TRUE; |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
624 } |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
625 if ( SDL_strcmp(window, "center") == 0 ) { |
497
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
626 center = window; |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
627 } |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
628 } |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
629 if ( center ) { |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
630 *x = (DisplayWidth(SDL_Display, SDL_Screen) - w)/2; |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
631 *y = (DisplayHeight(SDL_Display, SDL_Screen) - h)/2; |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
632 return SDL_TRUE; |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
633 } |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
634 return SDL_FALSE; |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
635 } |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
636 |
0 | 637 static void X11_SetSizeHints(_THIS, int w, int h, Uint32 flags) |
638 { | |
639 XSizeHints *hints; | |
640 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
641 hints = XAllocSizeHints(); |
0 | 642 if ( hints ) { |
643 if ( flags & SDL_RESIZABLE ) { | |
644 hints->min_width = 32; | |
645 hints->min_height = 32; | |
646 hints->max_height = 4096; | |
647 hints->max_width = 4096; | |
648 } else { | |
649 hints->min_width = hints->max_width = w; | |
650 hints->min_height = hints->max_height = h; | |
651 } | |
652 hints->flags = PMaxSize | PMinSize; | |
653 if ( flags & SDL_FULLSCREEN ) { | |
654 hints->x = 0; | |
655 hints->y = 0; | |
656 hints->flags |= USPosition; | |
657 } else | |
658 /* Center it, if desired */ | |
497
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
659 if ( X11_WindowPosition(this, &hints->x, &hints->y, w, h) ) { |
0 | 660 hints->flags |= USPosition; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
661 XMoveWindow(SDL_Display, WMwindow, hints->x, hints->y); |
0 | 662 |
663 /* Flush the resize event so we don't catch it later */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
664 XSync(SDL_Display, True); |
0 | 665 } |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
666 XSetWMNormalHints(SDL_Display, WMwindow, hints); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
667 XFree(hints); |
0 | 668 } |
669 | |
670 /* Respect the window caption style */ | |
671 if ( flags & SDL_NOFRAME ) { | |
672 SDL_bool set; | |
673 Atom WM_HINTS; | |
674 | |
675 /* We haven't modified the window manager hints yet */ | |
676 set = SDL_FALSE; | |
677 | |
678 /* First try to set MWM hints */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
679 WM_HINTS = XInternAtom(SDL_Display, "_MOTIF_WM_HINTS", True); |
0 | 680 if ( WM_HINTS != None ) { |
681 /* Hints used by Motif compliant window managers */ | |
682 struct { | |
683 unsigned long flags; | |
684 unsigned long functions; | |
685 unsigned long decorations; | |
686 long input_mode; | |
687 unsigned long status; | |
688 } MWMHints = { (1L << 1), 0, 0, 0, 0 }; | |
689 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
690 XChangeProperty(SDL_Display, WMwindow, |
0 | 691 WM_HINTS, WM_HINTS, 32, |
692 PropModeReplace, | |
693 (unsigned char *)&MWMHints, | |
694 sizeof(MWMHints)/sizeof(long)); | |
695 set = SDL_TRUE; | |
696 } | |
697 /* Now try to set KWM hints */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
698 WM_HINTS = XInternAtom(SDL_Display, "KWM_WIN_DECORATION", True); |
0 | 699 if ( WM_HINTS != None ) { |
700 long KWMHints = 0; | |
701 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
702 XChangeProperty(SDL_Display, WMwindow, |
0 | 703 WM_HINTS, WM_HINTS, 32, |
704 PropModeReplace, | |
705 (unsigned char *)&KWMHints, | |
706 sizeof(KWMHints)/sizeof(long)); | |
707 set = SDL_TRUE; | |
708 } | |
709 /* Now try to set GNOME hints */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
710 WM_HINTS = XInternAtom(SDL_Display, "_WIN_HINTS", True); |
0 | 711 if ( WM_HINTS != None ) { |
712 long GNOMEHints = 0; | |
713 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
714 XChangeProperty(SDL_Display, WMwindow, |
0 | 715 WM_HINTS, WM_HINTS, 32, |
716 PropModeReplace, | |
717 (unsigned char *)&GNOMEHints, | |
718 sizeof(GNOMEHints)/sizeof(long)); | |
719 set = SDL_TRUE; | |
720 } | |
721 /* Finally set the transient hints if necessary */ | |
722 if ( ! set ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
723 XSetTransientForHint(SDL_Display, WMwindow, SDL_Root); |
0 | 724 } |
725 } else { | |
726 SDL_bool set; | |
727 Atom WM_HINTS; | |
728 | |
729 /* We haven't modified the window manager hints yet */ | |
730 set = SDL_FALSE; | |
731 | |
732 /* First try to unset MWM hints */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
733 WM_HINTS = XInternAtom(SDL_Display, "_MOTIF_WM_HINTS", True); |
0 | 734 if ( WM_HINTS != None ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
735 XDeleteProperty(SDL_Display, WMwindow, WM_HINTS); |
0 | 736 set = SDL_TRUE; |
737 } | |
738 /* Now try to unset KWM hints */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
739 WM_HINTS = XInternAtom(SDL_Display, "KWM_WIN_DECORATION", True); |
0 | 740 if ( WM_HINTS != None ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
741 XDeleteProperty(SDL_Display, WMwindow, WM_HINTS); |
0 | 742 set = SDL_TRUE; |
743 } | |
744 /* Now try to unset GNOME hints */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
745 WM_HINTS = XInternAtom(SDL_Display, "_WIN_HINTS", True); |
0 | 746 if ( WM_HINTS != None ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
747 XDeleteProperty(SDL_Display, WMwindow, WM_HINTS); |
0 | 748 set = SDL_TRUE; |
749 } | |
750 /* Finally unset the transient hints if necessary */ | |
751 if ( ! set ) { | |
752 /* NOTE: Does this work? */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
753 XSetTransientForHint(SDL_Display, WMwindow, None); |
0 | 754 } |
755 } | |
756 } | |
757 | |
758 static int X11_CreateWindow(_THIS, SDL_Surface *screen, | |
759 int w, int h, int bpp, Uint32 flags) | |
760 { | |
761 int i, depth; | |
762 Visual *vis; | |
763 int vis_change; | |
1641 | 764 Uint32 Amask; |
0 | 765 |
766 /* If a window is already present, destroy it and start fresh */ | |
767 if ( SDL_Window ) { | |
768 X11_DestroyWindow(this, screen); | |
860
2bac79e27868
Create a 2D window and then manually focus a different window on your desktop,
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
769 switch_waiting = 0; /* Prevent jump back to now-meaningless state. */ |
0 | 770 } |
771 | |
772 /* See if we have been given a window id */ | |
773 if ( SDL_windowid ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
774 SDL_Window = SDL_strtol(SDL_windowid, NULL, 0); |
0 | 775 } else { |
776 SDL_Window = 0; | |
777 } | |
778 | |
779 /* find out which visual we are going to use */ | |
780 if ( flags & SDL_OPENGL ) { | |
781 XVisualInfo *vi; | |
782 | |
783 vi = X11_GL_GetVisual(this); | |
784 if( !vi ) { | |
785 return -1; | |
786 } | |
787 vis = vi->visual; | |
788 depth = vi->depth; | |
789 } else if ( SDL_windowid ) { | |
790 XWindowAttributes a; | |
791 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
792 XGetWindowAttributes(SDL_Display, SDL_Window, &a); |
0 | 793 vis = a.visual; |
794 depth = a.depth; | |
795 } else { | |
796 for ( i = 0; i < this->hidden->nvisuals; i++ ) { | |
797 if ( this->hidden->visuals[i].bpp == bpp ) | |
798 break; | |
799 } | |
800 if ( i == this->hidden->nvisuals ) { | |
801 SDL_SetError("No matching visual for requested depth"); | |
802 return -1; /* should never happen */ | |
803 } | |
804 vis = this->hidden->visuals[i].visual; | |
805 depth = this->hidden->visuals[i].depth; | |
806 } | |
807 #ifdef X11_DEBUG | |
808 printf("Choosing %s visual at %d bpp - %d colormap entries\n", vis->class == PseudoColor ? "PseudoColor" : (vis->class == TrueColor ? "TrueColor" : (vis->class == DirectColor ? "DirectColor" : "Unknown")), depth, vis->map_entries); | |
809 #endif | |
810 vis_change = (vis != SDL_Visual); | |
811 SDL_Visual = vis; | |
812 this->hidden->depth = depth; | |
813 | |
814 /* Allocate the new pixel format for this video mode */ | |
1641 | 815 if ( this->hidden->depth == 32 ) { |
816 Amask = (0xFFFFFFFF & ~(vis->red_mask|vis->green_mask|vis->blue_mask)); | |
817 } else { | |
818 Amask = 0; | |
819 } | |
0 | 820 if ( ! SDL_ReallocFormat(screen, bpp, |
1641 | 821 vis->red_mask, vis->green_mask, vis->blue_mask, Amask) ) { |
0 | 822 return -1; |
1641 | 823 } |
0 | 824 |
825 /* Create the appropriate colormap */ | |
826 if ( SDL_XColorMap != SDL_DisplayColormap ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
827 XFreeColormap(SDL_Display, SDL_XColorMap); |
0 | 828 } |
829 if ( SDL_Visual->class == PseudoColor ) { | |
830 int ncolors; | |
831 | |
832 /* Allocate the pixel flags */ | |
833 ncolors = SDL_Visual->map_entries; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
834 SDL_XPixels = SDL_malloc(ncolors * sizeof(int)); |
0 | 835 if(SDL_XPixels == NULL) { |
836 SDL_OutOfMemory(); | |
837 return -1; | |
838 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
839 SDL_memset(SDL_XPixels, 0, ncolors * sizeof(*SDL_XPixels)); |
0 | 840 |
841 /* always allocate a private colormap on non-default visuals */ | |
842 if ( SDL_Visual != DefaultVisual(SDL_Display, SDL_Screen) ) { | |
843 flags |= SDL_HWPALETTE; | |
844 } | |
845 if ( flags & SDL_HWPALETTE ) { | |
846 screen->flags |= SDL_HWPALETTE; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
847 SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root, |
0 | 848 SDL_Visual, AllocAll); |
849 } else { | |
850 SDL_XColorMap = SDL_DisplayColormap; | |
851 } | |
852 } else if ( SDL_Visual->class == DirectColor ) { | |
853 | |
854 /* Create a colormap which we can manipulate for gamma */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
855 SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root, |
0 | 856 SDL_Visual, AllocAll); |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
857 XSync(SDL_Display, False); |
0 | 858 |
859 /* Initialize the colormap to the identity mapping */ | |
860 SDL_GetGammaRamp(0, 0, 0); | |
861 this->screen = screen; | |
862 X11_SetGammaRamp(this, this->gamma); | |
863 this->screen = NULL; | |
864 } else { | |
865 /* Create a read-only colormap for our window */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
866 SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root, |
0 | 867 SDL_Visual, AllocNone); |
868 } | |
869 | |
870 /* Recreate the auxiliary windows, if needed (required for GL) */ | |
871 if ( vis_change ) | |
872 create_aux_windows(this); | |
873 | |
874 if(screen->flags & SDL_HWPALETTE) { | |
875 /* Since the full-screen window might have got a nonzero background | |
876 colour (0 is white on some displays), we should reset the | |
877 background to 0 here since that is what the user expects | |
878 with a private colormap */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
879 XSetWindowBackground(SDL_Display, FSwindow, 0); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
880 XClearWindow(SDL_Display, FSwindow); |
0 | 881 } |
882 | |
883 /* resize the (possibly new) window manager window */ | |
884 if( !SDL_windowid ) { | |
885 X11_SetSizeHints(this, w, h, flags); | |
1545
8d9bb0cf2c2a
Added current_w and current_h to the SDL_VideoInfo structure, which is set to the desktop resolution during video intialization, and then set to the current resolution when a video mode is set.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
886 window_w = w; |
8d9bb0cf2c2a
Added current_w and current_h to the SDL_VideoInfo structure, which is set to the desktop resolution during video intialization, and then set to the current resolution when a video mode is set.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
887 window_h = h; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
888 XResizeWindow(SDL_Display, WMwindow, w, h); |
0 | 889 } |
890 | |
891 /* Create (or use) the X11 display window */ | |
892 if ( !SDL_windowid ) { | |
893 if ( flags & SDL_OPENGL ) { | |
894 if ( X11_GL_CreateWindow(this, w, h) < 0 ) { | |
895 return(-1); | |
896 } | |
897 } else { | |
898 XSetWindowAttributes swa; | |
899 | |
900 swa.background_pixel = 0; | |
901 swa.border_pixel = 0; | |
902 swa.colormap = SDL_XColorMap; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
903 SDL_Window = XCreateWindow(SDL_Display, WMwindow, |
0 | 904 0, 0, w, h, 0, depth, |
905 InputOutput, SDL_Visual, | |
906 CWBackPixel | CWBorderPixel | |
907 | CWColormap, &swa); | |
908 } | |
909 /* Only manage our input if we own the window */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
910 XSelectInput(SDL_Display, SDL_Window, |
0 | 911 ( EnterWindowMask | LeaveWindowMask |
912 | ButtonPressMask | ButtonReleaseMask | |
913 | PointerMotionMask | ExposureMask )); | |
914 } | |
915 /* Create the graphics context here, once we have a window */ | |
916 if ( flags & SDL_OPENGL ) { | |
917 if ( X11_GL_CreateContext(this) < 0 ) { | |
918 return(-1); | |
919 } else { | |
920 screen->flags |= SDL_OPENGL; | |
921 } | |
922 } else { | |
923 XGCValues gcv; | |
924 | |
925 gcv.graphics_exposures = False; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
926 SDL_GC = XCreateGC(SDL_Display, SDL_Window, |
0 | 927 GCGraphicsExposures, &gcv); |
928 if ( ! SDL_GC ) { | |
929 SDL_SetError("Couldn't create graphics context"); | |
930 return(-1); | |
931 } | |
932 } | |
933 | |
934 /* Set our colormaps when not setting a GL mode */ | |
935 if ( ! (flags & SDL_OPENGL) ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
936 XSetWindowColormap(SDL_Display, SDL_Window, SDL_XColorMap); |
0 | 937 if( !SDL_windowid ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
938 XSetWindowColormap(SDL_Display, FSwindow, SDL_XColorMap); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
939 XSetWindowColormap(SDL_Display, WMwindow, SDL_XColorMap); |
0 | 940 } |
941 } | |
942 | |
943 #if 0 /* This is an experiment - are the graphics faster now? - nope. */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
944 if ( SDL_getenv("SDL_VIDEO_X11_BACKINGSTORE") ) |
0 | 945 #endif |
946 /* Cache the window in the server, when possible */ | |
947 { | |
948 Screen *xscreen; | |
949 XSetWindowAttributes a; | |
950 | |
951 xscreen = ScreenOfDisplay(SDL_Display, SDL_Screen); | |
952 a.backing_store = DoesBackingStore(xscreen); | |
953 if ( a.backing_store != NotUseful ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
954 XChangeWindowAttributes(SDL_Display, SDL_Window, |
0 | 955 CWBackingStore, &a); |
956 } | |
957 } | |
958 | |
959 /* Update the internal keyboard state */ | |
1327 | 960 X11_SetKeyboardState(SDL_Display, NULL); |
0 | 961 |
444
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
962 /* When the window is first mapped, ignore non-modifier keys */ |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
963 { |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
964 Uint8 *keys = SDL_GetKeyState(NULL); |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
965 for ( i = 0; i < SDLK_LAST; ++i ) { |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
966 switch (i) { |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
967 case SDLK_NUMLOCK: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
968 case SDLK_CAPSLOCK: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
969 case SDLK_LCTRL: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
970 case SDLK_RCTRL: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
971 case SDLK_LSHIFT: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
972 case SDLK_RSHIFT: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
973 case SDLK_LALT: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
974 case SDLK_RALT: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
975 case SDLK_LMETA: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
976 case SDLK_RMETA: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
977 case SDLK_MODE: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
978 break; |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
979 default: |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
980 keys[i] = SDL_RELEASED; |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
981 break; |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
982 } |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
983 } |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
984 } |
406b12a17b15
Only modifier key state is noted when X11 window opens
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
985 |
0 | 986 /* Map them both and go fullscreen, if requested */ |
987 if ( ! SDL_windowid ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
988 XMapWindow(SDL_Display, SDL_Window); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
989 XMapWindow(SDL_Display, WMwindow); |
160 | 990 X11_WaitMapped(this, WMwindow); |
0 | 991 if ( flags & SDL_FULLSCREEN ) { |
992 screen->flags |= SDL_FULLSCREEN; | |
993 X11_EnterFullScreen(this); | |
994 } else { | |
995 screen->flags &= ~SDL_FULLSCREEN; | |
996 } | |
997 } | |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
998 |
0 | 999 return(0); |
1000 } | |
1001 | |
1002 static int X11_ResizeWindow(_THIS, | |
1003 SDL_Surface *screen, int w, int h, Uint32 flags) | |
1004 { | |
1005 if ( ! SDL_windowid ) { | |
1006 /* Resize the window manager window */ | |
1007 X11_SetSizeHints(this, w, h, flags); | |
1545
8d9bb0cf2c2a
Added current_w and current_h to the SDL_VideoInfo structure, which is set to the desktop resolution during video intialization, and then set to the current resolution when a video mode is set.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
1008 window_w = w; |
8d9bb0cf2c2a
Added current_w and current_h to the SDL_VideoInfo structure, which is set to the desktop resolution during video intialization, and then set to the current resolution when a video mode is set.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
1009 window_h = h; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1010 XResizeWindow(SDL_Display, WMwindow, w, h); |
0 | 1011 |
1012 /* Resize the fullscreen and display windows */ | |
1013 if ( flags & SDL_FULLSCREEN ) { | |
1014 if ( screen->flags & SDL_FULLSCREEN ) { | |
1015 X11_ResizeFullScreen(this); | |
1016 } else { | |
1017 screen->flags |= SDL_FULLSCREEN; | |
1018 X11_EnterFullScreen(this); | |
1019 } | |
1020 } else { | |
1021 if ( screen->flags & SDL_FULLSCREEN ) { | |
1022 screen->flags &= ~SDL_FULLSCREEN; | |
1023 X11_LeaveFullScreen(this); | |
1024 } | |
1025 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1026 XResizeWindow(SDL_Display, SDL_Window, w, h); |
0 | 1027 } |
1028 return(0); | |
1029 } | |
1030 | |
1031 SDL_Surface *X11_SetVideoMode(_THIS, SDL_Surface *current, | |
1032 int width, int height, int bpp, Uint32 flags) | |
1033 { | |
1034 Uint32 saved_flags; | |
1035 | |
1036 /* Lock the event thread, in multi-threading environments */ | |
1037 SDL_Lock_EventThread(); | |
1038 | |
1039 /* Check the combination of flags we were passed */ | |
1040 if ( flags & SDL_FULLSCREEN ) { | |
1041 /* Clear fullscreen flag if not supported */ | |
1042 if ( SDL_windowid ) { | |
1043 flags &= ~SDL_FULLSCREEN; | |
1044 } | |
1045 } | |
1046 | |
1047 /* Flush any delayed updates */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1048 XSync(GFX_Display, False); |
0 | 1049 |
1050 /* Set up the X11 window */ | |
1051 saved_flags = current->flags; | |
867
5c7859610bc4
Force recreation of X11 window if going to or from a SDL_NOFRAME vidmode.
Ryan C. Gordon <icculus@icculus.org>
parents:
860
diff
changeset
|
1052 if ( (SDL_Window) && ((saved_flags&SDL_OPENGL) == (flags&SDL_OPENGL)) |
5c7859610bc4
Force recreation of X11 window if going to or from a SDL_NOFRAME vidmode.
Ryan C. Gordon <icculus@icculus.org>
parents:
860
diff
changeset
|
1053 && (bpp == current->format->BitsPerPixel) |
5c7859610bc4
Force recreation of X11 window if going to or from a SDL_NOFRAME vidmode.
Ryan C. Gordon <icculus@icculus.org>
parents:
860
diff
changeset
|
1054 && ((saved_flags&SDL_NOFRAME) == (flags&SDL_NOFRAME)) ) { |
0 | 1055 if (X11_ResizeWindow(this, current, width, height, flags) < 0) { |
1056 current = NULL; | |
1057 goto done; | |
1058 } | |
1059 } else { | |
1060 if (X11_CreateWindow(this,current,width,height,bpp,flags) < 0) { | |
1061 current = NULL; | |
1062 goto done; | |
1063 } | |
1064 } | |
1065 | |
1066 /* Set up the new mode framebuffer */ | |
1067 if ( ((current->w != width) || (current->h != height)) || | |
1068 ((saved_flags&SDL_OPENGL) != (flags&SDL_OPENGL)) ) { | |
1069 current->w = width; | |
1070 current->h = height; | |
1071 current->pitch = SDL_CalculatePitch(current); | |
1072 X11_ResizeImage(this, current, flags); | |
1073 } | |
1074 current->flags |= (flags&(SDL_RESIZABLE|SDL_NOFRAME)); | |
1075 | |
1076 done: | |
1077 /* Release the event thread */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1078 XSync(SDL_Display, False); |
0 | 1079 SDL_Unlock_EventThread(); |
1080 | |
1081 /* We're done! */ | |
1082 return(current); | |
1083 } | |
1084 | |
1085 static int X11_ToggleFullScreen(_THIS, int on) | |
1086 { | |
1087 Uint32 event_thread; | |
1088 | |
1089 /* Don't switch if we don't own the window */ | |
1090 if ( SDL_windowid ) { | |
1091 return(0); | |
1092 } | |
1093 | |
1094 /* Don't lock if we are the event thread */ | |
1095 event_thread = SDL_EventThreadID(); | |
1096 if ( event_thread && (SDL_ThreadID() == event_thread) ) { | |
1097 event_thread = 0; | |
1098 } | |
1099 if ( event_thread ) { | |
1100 SDL_Lock_EventThread(); | |
1101 } | |
1102 if ( on ) { | |
1103 this->screen->flags |= SDL_FULLSCREEN; | |
1104 X11_EnterFullScreen(this); | |
1105 } else { | |
1106 this->screen->flags &= ~SDL_FULLSCREEN; | |
1107 X11_LeaveFullScreen(this); | |
1108 } | |
1109 X11_RefreshDisplay(this); | |
1110 if ( event_thread ) { | |
1111 SDL_Unlock_EventThread(); | |
1112 } | |
1113 SDL_ResetKeyboard(); | |
1114 return(1); | |
1115 } | |
1116 | |
1117 /* Update the current mouse state and position */ | |
1118 static void X11_UpdateMouse(_THIS) | |
1119 { | |
1120 Window u1; int u2; | |
1121 Window current_win; | |
1122 int x, y; | |
1123 unsigned int mask; | |
1124 | |
1125 /* Lock the event thread, in multi-threading environments */ | |
1126 SDL_Lock_EventThread(); | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1127 if ( XQueryPointer(SDL_Display, SDL_Window, &u1, ¤t_win, |
0 | 1128 &u2, &u2, &x, &y, &mask) ) { |
1129 if ( (x >= 0) && (x < SDL_VideoSurface->w) && | |
1130 (y >= 0) && (y < SDL_VideoSurface->h) ) { | |
1131 SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); | |
1132 SDL_PrivateMouseMotion(0, 0, x, y); | |
1133 } else { | |
1134 SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); | |
1135 } | |
1136 } | |
1137 SDL_Unlock_EventThread(); | |
1138 } | |
1139 | |
1140 /* simple colour distance metric. Supposed to be better than a plain | |
1141 Euclidian distance anyway. */ | |
1142 #define COLOUR_FACTOR 3 | |
1143 #define LIGHT_FACTOR 1 | |
1144 #define COLOUR_DIST(r1, g1, b1, r2, g2, b2) \ | |
1145 (COLOUR_FACTOR * (abs(r1 - r2) + abs(g1 - g2) + abs(b1 - b2)) \ | |
1146 + LIGHT_FACTOR * abs(r1 + g1 + b1 - (r2 + g2 + b2))) | |
1147 | |
1148 static void allocate_nearest(_THIS, SDL_Color *colors, | |
1149 SDL_Color *want, int nwant) | |
1150 { | |
1151 /* | |
1152 * There is no way to know which ones to choose from, so we retrieve | |
1153 * the entire colormap and try the nearest possible, until we find one | |
1154 * that is shared. | |
1155 */ | |
1156 XColor all[256]; | |
1157 int i; | |
1158 for(i = 0; i < 256; i++) | |
1159 all[i].pixel = i; | |
1160 /* | |
1161 * XQueryColors sets the flags in the XColor struct, so we use | |
1162 * that to keep track of which colours are available | |
1163 */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1164 XQueryColors(GFX_Display, SDL_XColorMap, all, 256); |
0 | 1165 |
1166 for(i = 0; i < nwant; i++) { | |
1167 XColor *c; | |
1168 int j; | |
1169 int best = 0; | |
1170 int mindist = 0x7fffffff; | |
1171 int ri = want[i].r; | |
1172 int gi = want[i].g; | |
1173 int bi = want[i].b; | |
1174 for(j = 0; j < 256; j++) { | |
1175 int rj, gj, bj, d2; | |
1176 if(!all[j].flags) | |
1177 continue; /* unavailable colour cell */ | |
1178 rj = all[j].red >> 8; | |
1179 gj = all[j].green >> 8; | |
1180 bj = all[j].blue >> 8; | |
1181 d2 = COLOUR_DIST(ri, gi, bi, rj, gj, bj); | |
1182 if(d2 < mindist) { | |
1183 mindist = d2; | |
1184 best = j; | |
1185 } | |
1186 } | |
1187 if(SDL_XPixels[best]) | |
1188 continue; /* already allocated, waste no more time */ | |
1189 c = all + best; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1190 if(XAllocColor(GFX_Display, SDL_XColorMap, c)) { |
0 | 1191 /* got it */ |
236
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1192 colors[c->pixel].r = c->red >> 8; |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1193 colors[c->pixel].g = c->green >> 8; |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1194 colors[c->pixel].b = c->blue >> 8; |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1195 ++SDL_XPixels[c->pixel]; |
0 | 1196 } else { |
1197 /* | |
1198 * The colour couldn't be allocated, probably being | |
1199 * owned as a r/w cell by another client. Flag it as | |
1200 * unavailable and try again. The termination of the | |
1201 * loop is guaranteed since at least black and white | |
1202 * are always there. | |
1203 */ | |
1204 c->flags = 0; | |
1205 i--; | |
1206 } | |
1207 } | |
1208 } | |
1209 | |
1210 int X11_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) | |
1211 { | |
1212 int nrej = 0; | |
1213 | |
1214 /* Check to make sure we have a colormap allocated */ | |
1215 if ( SDL_XPixels == NULL ) { | |
1216 return(0); | |
1217 } | |
1218 if ( (this->screen->flags & SDL_HWPALETTE) == SDL_HWPALETTE ) { | |
1219 /* private writable colormap: just set the colours we need */ | |
1220 XColor *xcmap; | |
1221 int i; | |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1222 xcmap = SDL_stack_alloc(XColor, ncolors); |
0 | 1223 if(xcmap == NULL) |
1224 return 0; | |
1225 for ( i=0; i<ncolors; ++i ) { | |
1226 xcmap[i].pixel = i + firstcolor; | |
1227 xcmap[i].red = (colors[i].r<<8)|colors[i].r; | |
1228 xcmap[i].green = (colors[i].g<<8)|colors[i].g; | |
1229 xcmap[i].blue = (colors[i].b<<8)|colors[i].b; | |
1230 xcmap[i].flags = (DoRed|DoGreen|DoBlue); | |
1231 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1232 XStoreColors(GFX_Display, SDL_XColorMap, xcmap, ncolors); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1233 XSync(GFX_Display, False); |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1234 SDL_stack_free(xcmap); |
0 | 1235 } else { |
1236 /* | |
1237 * Shared colormap: We only allocate read-only cells, which | |
1238 * increases the likelyhood of colour sharing with other | |
1239 * clients. The pixel values will almost certainly be | |
1240 * different from the requested ones, so the user has to | |
1241 * walk the colormap and see which index got what colour. | |
1242 * | |
1243 * We can work directly with the logical palette since it | |
1244 * has already been set when we get here. | |
1245 */ | |
1246 SDL_Color *want, *reject; | |
1247 unsigned long *freelist; | |
1248 int i; | |
1249 int nfree = 0; | |
1250 int nc = this->screen->format->palette->ncolors; | |
1251 colors = this->screen->format->palette->colors; | |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1252 freelist = SDL_stack_alloc(unsigned long, nc); |
0 | 1253 /* make sure multiple allocations of the same cell are freed */ |
1254 for(i = 0; i < ncolors; i++) { | |
1255 int pixel = firstcolor + i; | |
1256 while(SDL_XPixels[pixel]) { | |
1257 freelist[nfree++] = pixel; | |
1258 --SDL_XPixels[pixel]; | |
1259 } | |
1260 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1261 XFreeColors(GFX_Display, SDL_XColorMap, freelist, nfree, 0); |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1262 SDL_stack_free(freelist); |
0 | 1263 |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1264 want = SDL_stack_alloc(SDL_Color, ncolors); |
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1265 reject = SDL_stack_alloc(SDL_Color, ncolors); |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
1266 SDL_memcpy(want, colors + firstcolor, ncolors * sizeof(SDL_Color)); |
0 | 1267 /* make sure the user isn't fooled by her own wishes |
1268 (black is safe, always available in the default colormap) */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
1269 SDL_memset(colors + firstcolor, 0, ncolors * sizeof(SDL_Color)); |
0 | 1270 |
1271 /* now try to allocate the colours */ | |
1272 for(i = 0; i < ncolors; i++) { | |
1273 XColor col; | |
1274 col.red = want[i].r << 8; | |
1275 col.green = want[i].g << 8; | |
1276 col.blue = want[i].b << 8; | |
1277 col.flags = DoRed | DoGreen | DoBlue; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1278 if(XAllocColor(GFX_Display, SDL_XColorMap, &col)) { |
0 | 1279 /* We got the colour, or at least the nearest |
1280 the hardware could get. */ | |
1281 colors[col.pixel].r = col.red >> 8; | |
1282 colors[col.pixel].g = col.green >> 8; | |
1283 colors[col.pixel].b = col.blue >> 8; | |
1284 ++SDL_XPixels[col.pixel]; | |
1285 } else { | |
1286 /* | |
1287 * no more free cells, add it to the list | |
1288 * of rejected colours | |
1289 */ | |
1290 reject[nrej++] = want[i]; | |
1291 } | |
1292 } | |
1293 if(nrej) | |
1294 allocate_nearest(this, colors, reject, nrej); | |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1295 SDL_stack_free(reject); |
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1296 SDL_stack_free(want); |
0 | 1297 } |
1298 return nrej == 0; | |
1299 } | |
1300 | |
1301 int X11_SetGammaRamp(_THIS, Uint16 *ramp) | |
1302 { | |
1303 int i, ncolors; | |
1304 XColor xcmap[256]; | |
1305 | |
1306 /* See if actually setting the gamma is supported */ | |
1307 if ( SDL_Visual->class != DirectColor ) { | |
1308 SDL_SetError("Gamma correction not supported on this visual"); | |
1309 return(-1); | |
1310 } | |
1311 | |
1312 /* Calculate the appropriate palette for the given gamma ramp */ | |
1313 ncolors = SDL_Visual->map_entries; | |
1314 for ( i=0; i<ncolors; ++i ) { | |
1315 Uint8 c = (256 * i / ncolors); | |
1316 xcmap[i].pixel = SDL_MapRGB(this->screen->format, c, c, c); | |
1317 xcmap[i].red = ramp[0*256+c]; | |
1318 xcmap[i].green = ramp[1*256+c]; | |
1319 xcmap[i].blue = ramp[2*256+c]; | |
1320 xcmap[i].flags = (DoRed|DoGreen|DoBlue); | |
1321 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1322 XStoreColors(GFX_Display, SDL_XColorMap, xcmap, ncolors); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1323 XSync(GFX_Display, False); |
0 | 1324 return(0); |
1325 } | |
1326 | |
1327 /* Note: If we are terminated, this could be called in the middle of | |
1328 another SDL video routine -- notably UpdateRects. | |
1329 */ | |
1330 void X11_VideoQuit(_THIS) | |
1331 { | |
1332 /* Shutdown everything that's still up */ | |
1333 /* The event thread should be done, so we can touch SDL_Display */ | |
1334 if ( SDL_Display != NULL ) { | |
1335 /* Flush any delayed updates */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1336 XSync(GFX_Display, False); |
0 | 1337 |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1338 /* Close the connection with the IM server */ |
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1339 #ifdef X_HAVE_UTF8_STRING |
1319
66f6c64c2c69
Logic bug in X11 Unicode input shutdown...was checking for == NULL
Ryan C. Gordon <icculus@icculus.org>
parents:
1312
diff
changeset
|
1340 if (SDL_IC != NULL) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1341 XDestroyIC(SDL_IC); |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1342 SDL_IC = NULL; |
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1343 } |
1319
66f6c64c2c69
Logic bug in X11 Unicode input shutdown...was checking for == NULL
Ryan C. Gordon <icculus@icculus.org>
parents:
1312
diff
changeset
|
1344 if (SDL_IM != NULL) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1345 XCloseIM(SDL_IM); |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1346 SDL_IM = NULL; |
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1347 } |
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1348 #endif |
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1349 |
0 | 1350 /* Start shutting down the windows */ |
1351 X11_DestroyImage(this, this->screen); | |
1352 X11_DestroyWindow(this, this->screen); | |
1353 X11_FreeVideoModes(this); | |
1354 if ( SDL_XColorMap != SDL_DisplayColormap ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1355 XFreeColormap(SDL_Display, SDL_XColorMap); |
0 | 1356 } |
1357 if ( SDL_iconcolors ) { | |
1358 unsigned long pixel; | |
236
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1359 Colormap dcmap = DefaultColormap(SDL_Display, |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1360 SDL_Screen); |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1361 for(pixel = 0; pixel < 256; ++pixel) { |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1362 while(SDL_iconcolors[pixel] > 0) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1363 XFreeColors(GFX_Display, |
236
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1364 dcmap, &pixel, 1, 0); |
0 | 1365 --SDL_iconcolors[pixel]; |
1366 } | |
1367 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
1368 SDL_free(SDL_iconcolors); |
0 | 1369 SDL_iconcolors = NULL; |
1370 } | |
1783 | 1371 |
0 | 1372 /* Restore gamma settings if they've changed */ |
1373 if ( SDL_GetAppState() & SDL_APPACTIVE ) { | |
1374 X11_SwapVidModeGamma(this); | |
1375 } | |
1376 | |
1783 | 1377 /* Restore DPMS and screensaver settings */ |
1784
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1378 X11_RestoreScreenSaver(SDL_Display, screensaver_timeout, dpms_enabled); |
1783 | 1379 |
0 | 1380 /* Free that blank cursor */ |
1381 if ( SDL_BlankCursor != NULL ) { | |
1382 this->FreeWMCursor(this, SDL_BlankCursor); | |
1383 SDL_BlankCursor = NULL; | |
1384 } | |
1385 | |
1386 /* Close the X11 graphics connection */ | |
1387 if ( GFX_Display != NULL ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1388 XCloseDisplay(GFX_Display); |
0 | 1389 GFX_Display = NULL; |
1390 } | |
1391 | |
1392 /* Close the X11 display connection */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1393 XCloseDisplay(SDL_Display); |
0 | 1394 SDL_Display = NULL; |
1395 | |
1396 /* Reset the X11 error handlers */ | |
1397 if ( XIO_handler ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1398 XSetIOErrorHandler(XIO_handler); |
0 | 1399 } |
1400 if ( X_handler ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1401 XSetErrorHandler(X_handler); |
0 | 1402 } |
1403 | |
1404 /* Unload GL library after X11 shuts down */ | |
1405 X11_GL_UnloadLibrary(this); | |
1406 } | |
1407 if ( this->screen && (this->screen->flags & SDL_HWSURFACE) ) { | |
1408 /* Direct screen access, no memory buffer */ | |
1409 this->screen->pixels = NULL; | |
1410 } | |
3885
a10bddfdc40f
Closing minor memory leak in XME code.
Ryan C. Gordon <icculus@icculus.org>
parents:
1863
diff
changeset
|
1411 |
a10bddfdc40f
Closing minor memory leak in XME code.
Ryan C. Gordon <icculus@icculus.org>
parents:
1863
diff
changeset
|
1412 #if SDL_VIDEO_DRIVER_X11_XME |
a10bddfdc40f
Closing minor memory leak in XME code.
Ryan C. Gordon <icculus@icculus.org>
parents:
1863
diff
changeset
|
1413 XiGMiscDestroy(); |
a10bddfdc40f
Closing minor memory leak in XME code.
Ryan C. Gordon <icculus@icculus.org>
parents:
1863
diff
changeset
|
1414 #endif |
0 | 1415 } |
1416 |