Mercurial > sdl-ios-xcode
annotate src/video/x11/SDL_x11video.c @ 4106:12bb6311fd5d SDL-1.2
Hans de Goede fixed bug #495
When running boswars: http://www.boswars.org/ on a machine with intel
integrathed graphics it crashes when it tries to play the initial theora
splashscreen video:
X Error of failed request: BadAlloc (insufficient resources for operation)
Major opcode of failed request: 140 (XVideo)
Minor opcode of failed request: 19 ()
Serial number of failed request: 25
Current serial number in output stream: 26
boswars: xcb_xlib.c:41: xcb_xlib_lock: Assertion `!c->xlib.lock' failed.
Aborted
I recognized this problem from a few years back, when I encountered it while
working on the Xv blitter for xmame. The problem is that for some reason
creation the Xvport and XvImage succeeds, and failure (lack of resources / hw
capability?) is only indicated during the first XvPut[Shm]Image. I've written a
patch for SDL using the work around for this I developed for xmame (and which
is still used successfully in xmame after many years of usage).
I'll admit it isn't very pretty, but after investigating several possibilities
this was the best option, any other fixes would need changes to the SDL api and
abi.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 29 Dec 2007 02:23:48 +0000 |
parents | 07d621a03a94 |
children | df2f562890a0 |
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 |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
57 #ifdef X_HAVE_UTF8_STRING |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
58 #include <locale.h> |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
59 #endif |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
60 |
0 | 61 /* Initialization/Query functions */ |
62 static int X11_VideoInit(_THIS, SDL_PixelFormat *vformat); | |
63 static SDL_Surface *X11_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags); | |
64 static int X11_ToggleFullScreen(_THIS, int on); | |
65 static void X11_UpdateMouse(_THIS); | |
66 static int X11_SetColors(_THIS, int firstcolor, int ncolors, | |
67 SDL_Color *colors); | |
68 static int X11_SetGammaRamp(_THIS, Uint16 *ramp); | |
69 static void X11_VideoQuit(_THIS); | |
70 | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
71 |
0 | 72 /* X11 driver bootstrap functions */ |
73 | |
74 static int X11_Available(void) | |
75 { | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
76 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
|
77 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
|
78 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
|
79 if ( display != NULL ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
80 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
|
81 } |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
82 SDL_X11_UnloadSymbols(); |
0 | 83 } |
84 return(display != NULL); | |
85 } | |
86 | |
87 static void X11_DeleteDevice(SDL_VideoDevice *device) | |
88 { | |
89 if ( device ) { | |
90 if ( device->hidden ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
91 SDL_free(device->hidden); |
0 | 92 } |
93 if ( device->gl_data ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
94 SDL_free(device->gl_data); |
0 | 95 } |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
96 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
|
97 SDL_X11_UnloadSymbols(); |
0 | 98 } |
99 } | |
100 | |
101 static SDL_VideoDevice *X11_CreateDevice(int devindex) | |
102 { | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
103 SDL_VideoDevice *device = NULL; |
0 | 104 |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
105 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
|
106 /* 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
|
107 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
|
108 if ( device ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
109 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
|
110 device->hidden = (struct SDL_PrivateVideoData *) |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
111 SDL_malloc((sizeof *device->hidden)); |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
112 SDL_memset(device->hidden, 0, (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
|
113 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
|
114 SDL_malloc((sizeof *device->gl_data)); |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
115 SDL_memset(device->gl_data, 0, (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
|
116 } |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
117 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
|
118 (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
|
119 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
|
120 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
|
121 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
|
122 } |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
123 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
|
124 SDL_memset(device->gl_data, 0, (sizeof *device->gl_data)); |
0 | 125 |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
126 /* 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
|
127 device->handles_any_size = 1; |
0 | 128 |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
129 /* 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
|
130 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
|
131 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
|
132 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
|
133 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
|
134 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
|
135 #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
|
136 device->CreateYUVOverlay = X11_CreateYUVOverlay; |
0 | 137 #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
|
138 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
|
139 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
|
140 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
|
141 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
|
142 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
|
143 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
|
144 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
|
145 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
|
146 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
|
147 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
|
148 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
|
149 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
|
150 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
|
151 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
|
152 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
|
153 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
|
154 #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
|
155 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
|
156 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
|
157 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
|
158 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
|
159 device->GL_SwapBuffers = X11_GL_SwapBuffers; |
0 | 160 #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
|
161 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
|
162 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
|
163 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
|
164 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
|
165 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
|
166 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
|
167 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
|
168 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
|
169 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
|
170 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
|
171 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
|
172 device->PumpEvents = X11_PumpEvents; |
0 | 173 |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
867
diff
changeset
|
174 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
|
175 } |
0 | 176 |
177 return device; | |
178 } | |
179 | |
180 VideoBootStrap X11_bootstrap = { | |
181 "x11", "X Window System", | |
182 X11_Available, X11_CreateDevice | |
183 }; | |
184 | |
185 /* Normal X11 error handler routine */ | |
186 static int (*X_handler)(Display *, XErrorEvent *) = NULL; | |
187 static int x_errhandler(Display *d, XErrorEvent *e) | |
188 { | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
189 #if SDL_VIDEO_DRIVER_X11_VIDMODE |
0 | 190 extern int vm_error; |
191 #endif | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
192 #if SDL_VIDEO_DRIVER_X11_DGAMOUSE |
0 | 193 extern int dga_error; |
194 #endif | |
195 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
196 #if SDL_VIDEO_DRIVER_X11_VIDMODE |
0 | 197 /* VidMode errors are non-fatal. :) */ |
198 /* Are the errors offset by one from the error base? | |
199 e.g. the error base is 143, the code is 148, and the | |
200 actual error is XF86VidModeExtensionDisabled (4) ? | |
201 */ | |
202 if ( (vm_error >= 0) && | |
203 (((e->error_code == BadRequest)&&(e->request_code == vm_error)) || | |
204 ((e->error_code > vm_error) && | |
205 (e->error_code <= (vm_error+XF86VidModeNumberErrors)))) ) { | |
1765 | 206 #ifdef X11_DEBUG |
0 | 207 { char errmsg[1024]; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
208 XGetErrorText(d, e->error_code, errmsg, sizeof(errmsg)); |
0 | 209 printf("VidMode error: %s\n", errmsg); |
210 } | |
211 #endif | |
212 return(0); | |
213 } | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
214 #endif /* SDL_VIDEO_DRIVER_X11_VIDMODE */ |
0 | 215 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
216 #if SDL_VIDEO_DRIVER_X11_DGAMOUSE |
0 | 217 /* DGA errors can be non-fatal. :) */ |
218 if ( (dga_error >= 0) && | |
219 ((e->error_code > dga_error) && | |
220 (e->error_code <= (dga_error+XF86DGANumberErrors))) ) { | |
1765 | 221 #ifdef X11_DEBUG |
0 | 222 { char errmsg[1024]; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
223 XGetErrorText(d, e->error_code, errmsg, sizeof(errmsg)); |
0 | 224 printf("DGA error: %s\n", errmsg); |
225 } | |
226 #endif | |
227 return(0); | |
228 } | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
229 #endif /* SDL_VIDEO_DRIVER_X11_DGAMOUSE */ |
0 | 230 |
231 return(X_handler(d,e)); | |
232 } | |
233 | |
234 /* X11 I/O error handler routine */ | |
235 static int (*XIO_handler)(Display *) = NULL; | |
236 static int xio_errhandler(Display *d) | |
237 { | |
238 /* Ack! Lost X11 connection! */ | |
239 | |
240 /* We will crash if we try to clean up our display */ | |
241 if ( current_video->hidden->Ximage ) { | |
242 SDL_VideoSurface->pixels = NULL; | |
243 } | |
244 current_video->hidden->X11_Display = NULL; | |
245 | |
246 /* Continue with the standard X11 error handler */ | |
247 return(XIO_handler(d)); | |
248 } | |
249 | |
1609
c3b5d17277d4
Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents:
1575
diff
changeset
|
250 static int (*Xext_handler)(Display *, _Xconst char *, _Xconst char *) = NULL; |
c3b5d17277d4
Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents:
1575
diff
changeset
|
251 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
|
252 { |
1765 | 253 #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
|
254 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
|
255 printf(" Extension \"%s\" %s on display \"%s\".\n", |
1609
c3b5d17277d4
Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents:
1575
diff
changeset
|
256 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
|
257 #endif |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
258 |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
259 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
|
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 * 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
|
262 * 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
|
263 * 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
|
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 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
|
266 } |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
267 |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
268 /* Everything else goes to the default handler... */ |
1609
c3b5d17277d4
Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents:
1575
diff
changeset
|
269 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
|
270 } |
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
271 |
1325 | 272 /* Find out what class name we should use */ |
273 static char *get_classname(char *classname, int maxlen) | |
274 { | |
275 char *spot; | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
276 #if defined(__LINUX__) || defined(__FREEBSD__) |
1325 | 277 char procfile[1024]; |
278 char linkfile[1024]; | |
279 int linksize; | |
280 #endif | |
281 | |
282 /* First allow environment variable override */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
283 spot = SDL_getenv("SDL_VIDEO_X11_WMCLASS"); |
1325 | 284 if ( spot ) { |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
285 SDL_strlcpy(classname, spot, maxlen); |
1325 | 286 return classname; |
287 } | |
288 | |
289 /* 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
|
290 #if defined(__LINUX__) || defined(__FREEBSD__) |
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
291 #if defined(__LINUX__) |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
292 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
|
293 #elif defined(__FREEBSD__) |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
294 SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/file", getpid()); |
1325 | 295 #else |
296 #error Where can we find the executable name? | |
297 #endif | |
298 linksize = readlink(procfile, linkfile, sizeof(linkfile)-1); | |
299 if ( linksize > 0 ) { | |
300 linkfile[linksize] = '\0'; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
301 spot = SDL_strrchr(linkfile, '/'); |
1325 | 302 if ( spot ) { |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
303 SDL_strlcpy(classname, spot+1, maxlen); |
1325 | 304 } else { |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
305 SDL_strlcpy(classname, linkfile, maxlen); |
1325 | 306 } |
307 return classname; | |
308 } | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
309 #endif /* __LINUX__ */ |
1325 | 310 |
311 /* Finally use the default we've used forever */ | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
312 SDL_strlcpy(classname, "SDL_App", maxlen); |
1325 | 313 return classname; |
314 } | |
315 | |
0 | 316 /* Create auxiliary (toplevel) windows with the current visual */ |
317 static void create_aux_windows(_THIS) | |
318 { | |
1765 | 319 int x = 0, y = 0; |
1325 | 320 char classname[1024]; |
0 | 321 XSetWindowAttributes xattr; |
322 XWMHints *hints; | |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
323 unsigned long app_event_mask; |
0 | 324 int def_vis = (SDL_Visual == DefaultVisual(SDL_Display, SDL_Screen)); |
325 | |
1558 | 326 /* 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
|
327 WM_DELETE_WINDOW = XInternAtom(SDL_Display, "WM_DELETE_WINDOW", False); |
1558 | 328 |
0 | 329 /* Don't create any extra windows if we are being managed */ |
330 if ( SDL_windowid ) { | |
331 FSwindow = 0; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
332 WMwindow = SDL_strtol(SDL_windowid, NULL, 0); |
0 | 333 return; |
334 } | |
335 | |
336 if(FSwindow) | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
337 XDestroyWindow(SDL_Display, FSwindow); |
0 | 338 |
1863 | 339 #if SDL_VIDEO_DRIVER_X11_XINERAMA |
1765 | 340 if ( use_xinerama ) { |
341 x = xinerama_info.x_org; | |
342 y = xinerama_info.y_org; | |
343 } | |
344 #endif | |
0 | 345 xattr.override_redirect = True; |
346 xattr.background_pixel = def_vis ? BlackPixel(SDL_Display, SDL_Screen) : 0; | |
347 xattr.border_pixel = 0; | |
348 xattr.colormap = SDL_XColorMap; | |
349 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
350 FSwindow = XCreateWindow(SDL_Display, SDL_Root, |
1765 | 351 x, y, 32, 32, 0, |
0 | 352 this->hidden->depth, InputOutput, SDL_Visual, |
353 CWOverrideRedirect | CWBackPixel | CWBorderPixel | |
354 | CWColormap, | |
355 &xattr); | |
356 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
357 XSelectInput(SDL_Display, FSwindow, StructureNotifyMask); |
0 | 358 |
359 /* Tell KDE to keep the fullscreen window on top */ | |
360 { | |
361 XEvent ev; | |
362 long mask; | |
363 | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
364 SDL_memset(&ev, 0, sizeof(ev)); |
0 | 365 ev.xclient.type = ClientMessage; |
366 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
|
367 ev.xclient.message_type = XInternAtom(SDL_Display, |
0 | 368 "KWM_KEEP_ON_TOP", False); |
369 ev.xclient.format = 32; | |
370 ev.xclient.data.l[0] = FSwindow; | |
371 ev.xclient.data.l[1] = CurrentTime; | |
372 mask = SubstructureRedirectMask; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
373 XSendEvent(SDL_Display, SDL_Root, False, mask, &ev); |
0 | 374 } |
375 | |
376 hints = NULL; | |
377 if(WMwindow) { | |
378 /* 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
|
379 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
|
380 XDestroyWindow(SDL_Display, WMwindow); |
0 | 381 } |
382 | |
383 /* Create the window for windowed management */ | |
384 /* (reusing the xattr structure above) */ | |
1765 | 385 WMwindow = XCreateWindow(SDL_Display, SDL_Root, |
386 x, y, 32, 32, 0, | |
0 | 387 this->hidden->depth, InputOutput, SDL_Visual, |
388 CWBackPixel | CWBorderPixel | CWColormap, | |
389 &xattr); | |
390 | |
391 /* Set the input hints so we get keyboard input */ | |
392 if(!hints) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
393 hints = XAllocWMHints(); |
0 | 394 hints->input = True; |
395 hints->flags = InputHint; | |
396 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
397 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
|
398 XFree(hints); |
1767 | 399 X11_SetCaptionNoLock(this, this->wm_title, this->wm_icon); |
0 | 400 |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
401 app_event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
402 | PropertyChangeMask | StructureNotifyMask | KeymapStateMask; |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
403 XSelectInput(SDL_Display, WMwindow, app_event_mask); |
0 | 404 |
405 /* Set the class hints so we can get an icon (AfterStep) */ | |
1325 | 406 get_classname(classname, sizeof(classname)); |
0 | 407 { |
408 XClassHint *classhints; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
409 classhints = XAllocClassHint(); |
0 | 410 if(classhints != NULL) { |
449
8a687496061f
Added an environment variable SDL_VIDEO_X11_WMCLASS
Sam Lantinga <slouken@libsdl.org>
parents:
444
diff
changeset
|
411 classhints->res_name = classname; |
8a687496061f
Added an environment variable SDL_VIDEO_X11_WMCLASS
Sam Lantinga <slouken@libsdl.org>
parents:
444
diff
changeset
|
412 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
|
413 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
|
414 XFree(classhints); |
0 | 415 } |
416 } | |
417 | |
3964
3dc92ff218dd
Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents:
3936
diff
changeset
|
418 /* Setup the communication with the IM server */ |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
419 /* create_aux_windows may be called several times against the same |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
420 Display. We should reuse the SDL_IM if one has been opened for |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
421 the Display, so we should not simply reset SDL_IM here. */ |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
422 |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
423 #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
|
424 if (SDL_X11_HAVE_UTF8) { |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
425 /* Discard obsolete resources if any. */ |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
426 if (SDL_IM != NULL && SDL_Display != XDisplayOfIM(SDL_IM)) { |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
427 /* Just a double check. I don't think this |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
428 code is ever executed. */ |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
429 SDL_SetError("display has changed while an IM is kept"); |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
430 if (SDL_IC) { |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
431 XUnsetICFocus(SDL_IC); |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
432 XDestroyIC(SDL_IC); |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
433 SDL_IC = NULL; |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
434 } |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
435 XCloseIM(SDL_IM); |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
436 SDL_IM = NULL; |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
437 } |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
438 |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
439 /* Open an input method. */ |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
440 if (SDL_IM == NULL) { |
4067
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
441 char *old_locale = NULL, *old_modifiers = NULL; |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
442 const char *p; |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
443 size_t n; |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
444 /* I'm not comfortable to do locale setup |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
445 here. However, we need C library locale |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
446 (and xlib modifiers) to be set based on the |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
447 user's preference to use XIM, and many |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
448 existing game programs doesn't take care of |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
449 users' locale preferences, so someone other |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
450 than the game program should do it. |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
451 Moreover, ones say that some game programs |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
452 heavily rely on the C locale behaviour, |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
453 e.g., strcol()'s, and we can't change the C |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
454 library locale. Given the situation, I |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
455 couldn't find better place to do the |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
456 job... */ |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
457 |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
458 /* Save the current (application program's) |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
459 locale settings. */ |
4067
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
460 p = setlocale(LC_ALL, NULL); |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
461 if ( p ) { |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
462 n = SDL_strlen(p)+1; |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
463 old_locale = SDL_stack_alloc(char, n); |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
464 if ( old_locale ) { |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
465 SDL_strlcpy(old_locale, p, n); |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
466 } |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
467 } |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
468 p = XSetLocaleModifiers(NULL); |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
469 if ( p ) { |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
470 n = SDL_strlen(p)+1; |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
471 old_modifiers = SDL_stack_alloc(char, n); |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
472 if ( old_modifiers ) { |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
473 SDL_strlcpy(old_modifiers, p, n); |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
474 } |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
475 } |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
476 |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
477 /* Fetch the user's preferences and open the |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
478 input method with them. */ |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
479 setlocale(LC_ALL, ""); |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
480 XSetLocaleModifiers(""); |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
481 SDL_IM = XOpenIM(SDL_Display, NULL, classname, classname); |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
482 |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
483 /* Restore the application's locale settings |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
484 so that we don't break the application's |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
485 expected behaviour. */ |
4067
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
486 if ( old_locale ) { |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
487 /* We need to restore the C library |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
488 locale first, since the |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
489 interpretation of the X modifier |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
490 may depend on it. */ |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
491 setlocale(LC_ALL, old_locale); |
4067
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
492 SDL_stack_free(old_locale); |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
493 } |
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
494 if ( old_modifiers ) { |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
495 XSetLocaleModifiers(old_modifiers); |
4067
07d621a03a94
Use SDL C functions (fixes security warnings on OpenBSD)
Sam Lantinga <slouken@libsdl.org>
parents:
4016
diff
changeset
|
496 SDL_stack_free(old_modifiers); |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
497 } |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
498 } |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
499 |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
500 /* Create a new input context for the new window just created. */ |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
501 if (SDL_IM == NULL) { |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
502 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
|
503 } else { |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
504 if (SDL_IC != NULL) { |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
505 /* Discard the old IC before creating new one. */ |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
506 XUnsetICFocus(SDL_IC); |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
507 XDestroyIC(SDL_IC); |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
508 } |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
509 /* Theoretically we should check the current IM supports |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
510 PreeditNothing+StatusNothing style (i.e., root window method) |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
511 before creating the IC. However, it is the bottom line method, |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
512 and we supports any other options. If the IM didn't support |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
513 root window method, the following call fails, and SDL falls |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
514 back to pre-XIM keyboard handling. */ |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
515 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
|
516 XNClientWindow, WMwindow, |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
517 XNFocusWindow, WMwindow, |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
518 XNInputStyle, XIMPreeditNothing | XIMStatusNothing, |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
519 XNResourceName, classname, |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
520 XNResourceClass, classname, |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
521 NULL); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
522 |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
523 if (SDL_IC == NULL) { |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
524 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
|
525 XCloseIM(SDL_IM); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
526 SDL_IM = NULL; |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
527 } else { |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
528 /* We need to receive X events that an IM wants and to pass |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
529 them to the IM through XFilterEvent. The set of events may |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
530 vary depending on the IM implementation and the options |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
531 specified through various routes. Although unlikely, the |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
532 xlib specification allows IM to change the event requirement |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
533 with its own circumstances, it is safe to call SelectInput |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
534 whenever we re-create an IC. */ |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
535 unsigned long mask = 0; |
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
536 char *ret = pXGetICValues(SDL_IC, XNFilterEvents, &mask, NULL); |
4014
a6264945ac52
Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents:
4008
diff
changeset
|
537 if (ret != NULL) { |
a6264945ac52
Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents:
4008
diff
changeset
|
538 XUnsetICFocus(SDL_IC); |
a6264945ac52
Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents:
4008
diff
changeset
|
539 XDestroyIC(SDL_IC); |
a6264945ac52
Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents:
4008
diff
changeset
|
540 SDL_IC = NULL; |
a6264945ac52
Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents:
4008
diff
changeset
|
541 SDL_SetError("no input context could be created"); |
a6264945ac52
Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents:
4008
diff
changeset
|
542 XCloseIM(SDL_IM); |
a6264945ac52
Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents:
4008
diff
changeset
|
543 SDL_IM = NULL; |
a6264945ac52
Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents:
4008
diff
changeset
|
544 } else { |
a6264945ac52
Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents:
4008
diff
changeset
|
545 XSelectInput(SDL_Display, WMwindow, app_event_mask | mask); |
a6264945ac52
Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents:
4008
diff
changeset
|
546 XSetICFocus(SDL_IC); |
a6264945ac52
Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents:
4008
diff
changeset
|
547 } |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
548 } |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
549 } |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
550 } |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
551 #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
|
552 |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
553 /* 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
|
554 XSetWMProtocols(SDL_Display, WMwindow, &WM_DELETE_WINDOW, 1); |
0 | 555 } |
556 | |
557 static int X11_VideoInit(_THIS, SDL_PixelFormat *vformat) | |
558 { | |
3936
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
3885
diff
changeset
|
559 const char *env = NULL; |
0 | 560 char *display; |
561 int i; | |
562 | |
563 /* Open the X11 display */ | |
564 display = NULL; /* Get it from DISPLAY environment variable */ | |
565 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
566 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
|
567 (SDL_strncmp(XDisplayName(display), "unix:", 5) == 0) ) { |
0 | 568 local_X11 = 1; |
569 } else { | |
570 local_X11 = 0; | |
571 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
572 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
|
573 #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
|
574 /* 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
|
575 * 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
|
576 * 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
|
577 * |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
578 * 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
|
579 * 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
|
580 * |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
581 */ |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
582 if ( SDL_Display == NULL ) { |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
583 SDL_Delay(1000); |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
584 SDL_Display = XOpenDisplay(display); |
1299
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
585 } |
2bf9dda618e5
Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents:
1248
diff
changeset
|
586 #endif |
0 | 587 if ( SDL_Display == NULL ) { |
588 SDL_SetError("Couldn't open X11 display"); | |
589 return(-1); | |
590 } | |
591 #ifdef X11_DEBUG | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
592 XSynchronize(SDL_Display, True); |
0 | 593 #endif |
594 | |
595 /* Create an alternate X display for graphics updates -- allows us | |
596 to do graphics updates in a separate thread from event handling. | |
597 Thread-safe X11 doesn't seem to exist. | |
598 */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
599 GFX_Display = XOpenDisplay(display); |
0 | 600 if ( GFX_Display == NULL ) { |
3964
3dc92ff218dd
Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents:
3936
diff
changeset
|
601 XCloseDisplay(SDL_Display); |
3dc92ff218dd
Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents:
3936
diff
changeset
|
602 SDL_Display = NULL; |
0 | 603 SDL_SetError("Couldn't open X11 display"); |
604 return(-1); | |
605 } | |
606 | |
607 /* 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
|
608 X_handler = XSetErrorHandler(x_errhandler); |
0 | 609 |
610 /* 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
|
611 XIO_handler = XSetIOErrorHandler(xio_errhandler); |
0 | 612 |
1248
d2c6881935be
Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents:
1206
diff
changeset
|
613 /* 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
|
614 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
|
615 |
0 | 616 /* use default screen (from $DISPLAY) */ |
617 SDL_Screen = DefaultScreen(SDL_Display); | |
618 | |
619 #ifndef NO_SHARED_MEMORY | |
620 /* 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
|
621 use_mitshm = 0; |
0 | 622 if ( local_X11 ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
623 use_mitshm = XShmQueryExtension(SDL_Display); |
0 | 624 } |
625 #endif /* NO_SHARED_MEMORY */ | |
626 | |
627 /* Get the available video modes */ | |
3964
3dc92ff218dd
Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents:
3936
diff
changeset
|
628 if(X11_GetVideoModes(this) < 0) { |
3dc92ff218dd
Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents:
3936
diff
changeset
|
629 XCloseDisplay(GFX_Display); |
3dc92ff218dd
Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents:
3936
diff
changeset
|
630 GFX_Display = NULL; |
3dc92ff218dd
Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents:
3936
diff
changeset
|
631 XCloseDisplay(SDL_Display); |
3dc92ff218dd
Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents:
3936
diff
changeset
|
632 SDL_Display = NULL; |
0 | 633 return -1; |
3964
3dc92ff218dd
Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents:
3936
diff
changeset
|
634 } |
0 | 635 |
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
|
636 /* 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
|
637 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
|
638 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
|
639 |
0 | 640 /* Determine the default screen depth: |
641 Use the default visual (or at least one with the same depth) */ | |
642 SDL_DisplayColormap = DefaultColormap(SDL_Display, SDL_Screen); | |
643 for(i = 0; i < this->hidden->nvisuals; i++) | |
644 if(this->hidden->visuals[i].depth == DefaultDepth(SDL_Display, | |
645 SDL_Screen)) | |
646 break; | |
647 if(i == this->hidden->nvisuals) { | |
648 /* default visual was useless, take the deepest one instead */ | |
649 i = 0; | |
650 } | |
651 SDL_Visual = this->hidden->visuals[i].visual; | |
652 if ( SDL_Visual == DefaultVisual(SDL_Display, SDL_Screen) ) { | |
653 SDL_XColorMap = SDL_DisplayColormap; | |
654 } else { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
655 SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root, |
0 | 656 SDL_Visual, AllocNone); |
657 } | |
658 this->hidden->depth = this->hidden->visuals[i].depth; | |
659 vformat->BitsPerPixel = this->hidden->visuals[i].bpp; | |
660 if ( vformat->BitsPerPixel > 8 ) { | |
661 vformat->Rmask = SDL_Visual->red_mask; | |
662 vformat->Gmask = SDL_Visual->green_mask; | |
663 vformat->Bmask = SDL_Visual->blue_mask; | |
664 } | |
1641 | 665 if ( this->hidden->depth == 32 ) { |
666 vformat->Amask = (0xFFFFFFFF & ~(vformat->Rmask|vformat->Gmask|vformat->Bmask)); | |
667 } | |
0 | 668 X11_SaveVidModeGamma(this); |
669 | |
1783 | 670 /* 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
|
671 X11_SaveScreenSaver(SDL_Display, &screensaver_timeout, &dpms_enabled); |
3936
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
3885
diff
changeset
|
672 X11_DisableScreenSaver(this, SDL_Display); |
1783 | 673 |
0 | 674 /* 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
|
675 SDL_windowid = SDL_getenv("SDL_WINDOWID"); |
0 | 676 |
677 /* Create the fullscreen and managed windows */ | |
678 create_aux_windows(this); | |
679 | |
680 /* Create the blank cursor */ | |
681 SDL_BlankCursor = this->CreateWMCursor(this, blank_cdata, blank_cmask, | |
682 BLANK_CWIDTH, BLANK_CHEIGHT, | |
683 BLANK_CHOTX, BLANK_CHOTY); | |
684 | |
685 /* Fill in some window manager capabilities */ | |
686 this->info.wm_available = 1; | |
687 | |
3936
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
3885
diff
changeset
|
688 /* Allow environment override of screensaver disable. */ |
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
3885
diff
changeset
|
689 env = SDL_getenv("SDL_VIDEO_ALLOW_SCREENSAVER"); |
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
3885
diff
changeset
|
690 this->hidden->allow_screensaver = ( (env && SDL_atoi(env)) ? 1 : 0 ); |
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
3885
diff
changeset
|
691 |
0 | 692 /* We're done! */ |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
693 XFlush(SDL_Display); |
0 | 694 return(0); |
695 } | |
696 | |
697 static void X11_DestroyWindow(_THIS, SDL_Surface *screen) | |
698 { | |
699 /* Clean up OpenGL */ | |
700 if ( screen ) { | |
701 screen->flags &= ~(SDL_OPENGL|SDL_OPENGLBLIT); | |
702 } | |
703 X11_GL_Shutdown(this); | |
704 | |
705 if ( ! SDL_windowid ) { | |
706 /* Hide the managed window */ | |
707 if ( WMwindow ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
708 XUnmapWindow(SDL_Display, WMwindow); |
0 | 709 } |
710 if ( screen && (screen->flags & SDL_FULLSCREEN) ) { | |
711 screen->flags &= ~SDL_FULLSCREEN; | |
712 X11_LeaveFullScreen(this); | |
713 } | |
714 | |
715 /* Destroy the output window */ | |
716 if ( SDL_Window ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
717 XDestroyWindow(SDL_Display, SDL_Window); |
0 | 718 } |
719 | |
720 /* Free the colormap entries */ | |
721 if ( SDL_XPixels ) { | |
722 int numcolors; | |
723 unsigned long pixel; | |
724 numcolors = SDL_Visual->map_entries; | |
725 for ( pixel=0; pixel<numcolors; ++pixel ) { | |
726 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
|
727 XFreeColors(GFX_Display, |
0 | 728 SDL_DisplayColormap,&pixel,1,0); |
729 --SDL_XPixels[pixel]; | |
730 } | |
731 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
732 SDL_free(SDL_XPixels); |
0 | 733 SDL_XPixels = NULL; |
734 } | |
735 | |
736 /* Free the graphics context */ | |
737 if ( SDL_GC ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
738 XFreeGC(SDL_Display, SDL_GC); |
0 | 739 SDL_GC = 0; |
740 } | |
741 } | |
742 } | |
743 | |
497
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
744 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
|
745 { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
746 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
|
747 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
|
748 if ( window ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
749 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
|
750 return SDL_TRUE; |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
751 } |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
752 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
|
753 center = window; |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
754 } |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
755 } |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
756 if ( center ) { |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
757 *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
|
758 *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
|
759 return SDL_TRUE; |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
760 } |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
761 return SDL_FALSE; |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
762 } |
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
763 |
0 | 764 static void X11_SetSizeHints(_THIS, int w, int h, Uint32 flags) |
765 { | |
766 XSizeHints *hints; | |
767 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
768 hints = XAllocSizeHints(); |
0 | 769 if ( hints ) { |
770 if ( flags & SDL_RESIZABLE ) { | |
771 hints->min_width = 32; | |
772 hints->min_height = 32; | |
773 hints->max_height = 4096; | |
774 hints->max_width = 4096; | |
775 } else { | |
776 hints->min_width = hints->max_width = w; | |
777 hints->min_height = hints->max_height = h; | |
778 } | |
779 hints->flags = PMaxSize | PMinSize; | |
780 if ( flags & SDL_FULLSCREEN ) { | |
781 hints->x = 0; | |
782 hints->y = 0; | |
783 hints->flags |= USPosition; | |
784 } else | |
785 /* Center it, if desired */ | |
497
bb2d68294e81
Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents:
485
diff
changeset
|
786 if ( X11_WindowPosition(this, &hints->x, &hints->y, w, h) ) { |
0 | 787 hints->flags |= USPosition; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
788 XMoveWindow(SDL_Display, WMwindow, hints->x, hints->y); |
0 | 789 |
790 /* 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
|
791 XSync(SDL_Display, True); |
0 | 792 } |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
793 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
|
794 XFree(hints); |
0 | 795 } |
796 | |
797 /* Respect the window caption style */ | |
798 if ( flags & SDL_NOFRAME ) { | |
799 SDL_bool set; | |
800 Atom WM_HINTS; | |
801 | |
802 /* We haven't modified the window manager hints yet */ | |
803 set = SDL_FALSE; | |
804 | |
805 /* 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
|
806 WM_HINTS = XInternAtom(SDL_Display, "_MOTIF_WM_HINTS", True); |
0 | 807 if ( WM_HINTS != None ) { |
808 /* Hints used by Motif compliant window managers */ | |
809 struct { | |
810 unsigned long flags; | |
811 unsigned long functions; | |
812 unsigned long decorations; | |
813 long input_mode; | |
814 unsigned long status; | |
815 } MWMHints = { (1L << 1), 0, 0, 0, 0 }; | |
816 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
817 XChangeProperty(SDL_Display, WMwindow, |
0 | 818 WM_HINTS, WM_HINTS, 32, |
819 PropModeReplace, | |
820 (unsigned char *)&MWMHints, | |
821 sizeof(MWMHints)/sizeof(long)); | |
822 set = SDL_TRUE; | |
823 } | |
824 /* 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
|
825 WM_HINTS = XInternAtom(SDL_Display, "KWM_WIN_DECORATION", True); |
0 | 826 if ( WM_HINTS != None ) { |
827 long KWMHints = 0; | |
828 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
829 XChangeProperty(SDL_Display, WMwindow, |
0 | 830 WM_HINTS, WM_HINTS, 32, |
831 PropModeReplace, | |
832 (unsigned char *)&KWMHints, | |
833 sizeof(KWMHints)/sizeof(long)); | |
834 set = SDL_TRUE; | |
835 } | |
836 /* 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
|
837 WM_HINTS = XInternAtom(SDL_Display, "_WIN_HINTS", True); |
0 | 838 if ( WM_HINTS != None ) { |
839 long GNOMEHints = 0; | |
840 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
841 XChangeProperty(SDL_Display, WMwindow, |
0 | 842 WM_HINTS, WM_HINTS, 32, |
843 PropModeReplace, | |
844 (unsigned char *)&GNOMEHints, | |
845 sizeof(GNOMEHints)/sizeof(long)); | |
846 set = SDL_TRUE; | |
847 } | |
848 /* Finally set the transient hints if necessary */ | |
849 if ( ! set ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
850 XSetTransientForHint(SDL_Display, WMwindow, SDL_Root); |
0 | 851 } |
852 } else { | |
853 SDL_bool set; | |
854 Atom WM_HINTS; | |
855 | |
856 /* We haven't modified the window manager hints yet */ | |
857 set = SDL_FALSE; | |
858 | |
859 /* 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
|
860 WM_HINTS = XInternAtom(SDL_Display, "_MOTIF_WM_HINTS", True); |
0 | 861 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
|
862 XDeleteProperty(SDL_Display, WMwindow, WM_HINTS); |
0 | 863 set = SDL_TRUE; |
864 } | |
865 /* 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
|
866 WM_HINTS = XInternAtom(SDL_Display, "KWM_WIN_DECORATION", True); |
0 | 867 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
|
868 XDeleteProperty(SDL_Display, WMwindow, WM_HINTS); |
0 | 869 set = SDL_TRUE; |
870 } | |
871 /* 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
|
872 WM_HINTS = XInternAtom(SDL_Display, "_WIN_HINTS", True); |
0 | 873 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
|
874 XDeleteProperty(SDL_Display, WMwindow, WM_HINTS); |
0 | 875 set = SDL_TRUE; |
876 } | |
877 /* Finally unset the transient hints if necessary */ | |
878 if ( ! set ) { | |
879 /* 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
|
880 XSetTransientForHint(SDL_Display, WMwindow, None); |
0 | 881 } |
882 } | |
883 } | |
884 | |
885 static int X11_CreateWindow(_THIS, SDL_Surface *screen, | |
886 int w, int h, int bpp, Uint32 flags) | |
887 { | |
888 int i, depth; | |
889 Visual *vis; | |
890 int vis_change; | |
1641 | 891 Uint32 Amask; |
0 | 892 |
893 /* If a window is already present, destroy it and start fresh */ | |
894 if ( SDL_Window ) { | |
895 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
|
896 switch_waiting = 0; /* Prevent jump back to now-meaningless state. */ |
0 | 897 } |
898 | |
899 /* See if we have been given a window id */ | |
900 if ( SDL_windowid ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
901 SDL_Window = SDL_strtol(SDL_windowid, NULL, 0); |
0 | 902 } else { |
903 SDL_Window = 0; | |
904 } | |
905 | |
906 /* find out which visual we are going to use */ | |
907 if ( flags & SDL_OPENGL ) { | |
908 XVisualInfo *vi; | |
909 | |
910 vi = X11_GL_GetVisual(this); | |
911 if( !vi ) { | |
912 return -1; | |
913 } | |
914 vis = vi->visual; | |
915 depth = vi->depth; | |
916 } else if ( SDL_windowid ) { | |
917 XWindowAttributes a; | |
918 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
919 XGetWindowAttributes(SDL_Display, SDL_Window, &a); |
0 | 920 vis = a.visual; |
921 depth = a.depth; | |
922 } else { | |
923 for ( i = 0; i < this->hidden->nvisuals; i++ ) { | |
924 if ( this->hidden->visuals[i].bpp == bpp ) | |
925 break; | |
926 } | |
927 if ( i == this->hidden->nvisuals ) { | |
928 SDL_SetError("No matching visual for requested depth"); | |
929 return -1; /* should never happen */ | |
930 } | |
931 vis = this->hidden->visuals[i].visual; | |
932 depth = this->hidden->visuals[i].depth; | |
933 } | |
934 #ifdef X11_DEBUG | |
935 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); | |
936 #endif | |
937 vis_change = (vis != SDL_Visual); | |
938 SDL_Visual = vis; | |
939 this->hidden->depth = depth; | |
940 | |
941 /* Allocate the new pixel format for this video mode */ | |
1641 | 942 if ( this->hidden->depth == 32 ) { |
943 Amask = (0xFFFFFFFF & ~(vis->red_mask|vis->green_mask|vis->blue_mask)); | |
944 } else { | |
945 Amask = 0; | |
946 } | |
0 | 947 if ( ! SDL_ReallocFormat(screen, bpp, |
1641 | 948 vis->red_mask, vis->green_mask, vis->blue_mask, Amask) ) { |
0 | 949 return -1; |
1641 | 950 } |
0 | 951 |
952 /* Create the appropriate colormap */ | |
953 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
|
954 XFreeColormap(SDL_Display, SDL_XColorMap); |
0 | 955 } |
956 if ( SDL_Visual->class == PseudoColor ) { | |
957 int ncolors; | |
958 | |
959 /* Allocate the pixel flags */ | |
960 ncolors = SDL_Visual->map_entries; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
961 SDL_XPixels = SDL_malloc(ncolors * sizeof(int)); |
0 | 962 if(SDL_XPixels == NULL) { |
963 SDL_OutOfMemory(); | |
964 return -1; | |
965 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
966 SDL_memset(SDL_XPixels, 0, ncolors * sizeof(*SDL_XPixels)); |
0 | 967 |
968 /* always allocate a private colormap on non-default visuals */ | |
969 if ( SDL_Visual != DefaultVisual(SDL_Display, SDL_Screen) ) { | |
970 flags |= SDL_HWPALETTE; | |
971 } | |
972 if ( flags & SDL_HWPALETTE ) { | |
973 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
|
974 SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root, |
0 | 975 SDL_Visual, AllocAll); |
976 } else { | |
977 SDL_XColorMap = SDL_DisplayColormap; | |
978 } | |
979 } else if ( SDL_Visual->class == DirectColor ) { | |
980 | |
981 /* 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
|
982 SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root, |
0 | 983 SDL_Visual, AllocAll); |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
984 XSync(SDL_Display, False); |
0 | 985 |
986 /* Initialize the colormap to the identity mapping */ | |
987 SDL_GetGammaRamp(0, 0, 0); | |
988 this->screen = screen; | |
989 X11_SetGammaRamp(this, this->gamma); | |
990 this->screen = NULL; | |
991 } else { | |
992 /* 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
|
993 SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root, |
0 | 994 SDL_Visual, AllocNone); |
995 } | |
996 | |
997 /* Recreate the auxiliary windows, if needed (required for GL) */ | |
998 if ( vis_change ) | |
999 create_aux_windows(this); | |
1000 | |
1001 if(screen->flags & SDL_HWPALETTE) { | |
1002 /* Since the full-screen window might have got a nonzero background | |
1003 colour (0 is white on some displays), we should reset the | |
1004 background to 0 here since that is what the user expects | |
1005 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
|
1006 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
|
1007 XClearWindow(SDL_Display, FSwindow); |
0 | 1008 } |
1009 | |
1010 /* resize the (possibly new) window manager window */ | |
1011 if( !SDL_windowid ) { | |
1012 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
|
1013 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
|
1014 window_h = h; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1015 XResizeWindow(SDL_Display, WMwindow, w, h); |
0 | 1016 } |
1017 | |
1018 /* Create (or use) the X11 display window */ | |
1019 if ( !SDL_windowid ) { | |
1020 if ( flags & SDL_OPENGL ) { | |
1021 if ( X11_GL_CreateWindow(this, w, h) < 0 ) { | |
1022 return(-1); | |
1023 } | |
1024 } else { | |
1025 XSetWindowAttributes swa; | |
1026 | |
1027 swa.background_pixel = 0; | |
1028 swa.border_pixel = 0; | |
1029 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
|
1030 SDL_Window = XCreateWindow(SDL_Display, WMwindow, |
0 | 1031 0, 0, w, h, 0, depth, |
1032 InputOutput, SDL_Visual, | |
1033 CWBackPixel | CWBorderPixel | |
1034 | CWColormap, &swa); | |
1035 } | |
1036 /* 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
|
1037 XSelectInput(SDL_Display, SDL_Window, |
0 | 1038 ( EnterWindowMask | LeaveWindowMask |
1039 | ButtonPressMask | ButtonReleaseMask | |
1040 | PointerMotionMask | ExposureMask )); | |
1041 } | |
1042 /* Create the graphics context here, once we have a window */ | |
1043 if ( flags & SDL_OPENGL ) { | |
1044 if ( X11_GL_CreateContext(this) < 0 ) { | |
1045 return(-1); | |
1046 } else { | |
1047 screen->flags |= SDL_OPENGL; | |
1048 } | |
1049 } else { | |
1050 XGCValues gcv; | |
1051 | |
1052 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
|
1053 SDL_GC = XCreateGC(SDL_Display, SDL_Window, |
0 | 1054 GCGraphicsExposures, &gcv); |
1055 if ( ! SDL_GC ) { | |
1056 SDL_SetError("Couldn't create graphics context"); | |
1057 return(-1); | |
1058 } | |
1059 } | |
1060 | |
1061 /* Set our colormaps when not setting a GL mode */ | |
1062 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
|
1063 XSetWindowColormap(SDL_Display, SDL_Window, SDL_XColorMap); |
0 | 1064 if( !SDL_windowid ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1065 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
|
1066 XSetWindowColormap(SDL_Display, WMwindow, SDL_XColorMap); |
0 | 1067 } |
1068 } | |
1069 | |
1070 #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
|
1071 if ( SDL_getenv("SDL_VIDEO_X11_BACKINGSTORE") ) |
0 | 1072 #endif |
1073 /* Cache the window in the server, when possible */ | |
1074 { | |
1075 Screen *xscreen; | |
1076 XSetWindowAttributes a; | |
1077 | |
1078 xscreen = ScreenOfDisplay(SDL_Display, SDL_Screen); | |
1079 a.backing_store = DoesBackingStore(xscreen); | |
1080 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
|
1081 XChangeWindowAttributes(SDL_Display, SDL_Window, |
0 | 1082 CWBackingStore, &a); |
1083 } | |
1084 } | |
1085 | |
1086 /* Map them both and go fullscreen, if requested */ | |
1087 if ( ! SDL_windowid ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1088 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
|
1089 XMapWindow(SDL_Display, WMwindow); |
160 | 1090 X11_WaitMapped(this, WMwindow); |
0 | 1091 if ( flags & SDL_FULLSCREEN ) { |
1092 screen->flags |= SDL_FULLSCREEN; | |
1093 X11_EnterFullScreen(this); | |
1094 } else { | |
1095 screen->flags &= ~SDL_FULLSCREEN; | |
1096 } | |
1097 } | |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1098 |
0 | 1099 return(0); |
1100 } | |
1101 | |
1102 static int X11_ResizeWindow(_THIS, | |
1103 SDL_Surface *screen, int w, int h, Uint32 flags) | |
1104 { | |
1105 if ( ! SDL_windowid ) { | |
1106 /* Resize the window manager window */ | |
1107 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
|
1108 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
|
1109 window_h = h; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1110 XResizeWindow(SDL_Display, WMwindow, w, h); |
0 | 1111 |
1112 /* Resize the fullscreen and display windows */ | |
1113 if ( flags & SDL_FULLSCREEN ) { | |
1114 if ( screen->flags & SDL_FULLSCREEN ) { | |
1115 X11_ResizeFullScreen(this); | |
1116 } else { | |
1117 screen->flags |= SDL_FULLSCREEN; | |
1118 X11_EnterFullScreen(this); | |
1119 } | |
1120 } else { | |
1121 if ( screen->flags & SDL_FULLSCREEN ) { | |
1122 screen->flags &= ~SDL_FULLSCREEN; | |
1123 X11_LeaveFullScreen(this); | |
1124 } | |
1125 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1126 XResizeWindow(SDL_Display, SDL_Window, w, h); |
0 | 1127 } |
1128 return(0); | |
1129 } | |
1130 | |
1131 SDL_Surface *X11_SetVideoMode(_THIS, SDL_Surface *current, | |
1132 int width, int height, int bpp, Uint32 flags) | |
1133 { | |
1134 Uint32 saved_flags; | |
1135 | |
1136 /* Lock the event thread, in multi-threading environments */ | |
1137 SDL_Lock_EventThread(); | |
1138 | |
1139 /* Check the combination of flags we were passed */ | |
1140 if ( flags & SDL_FULLSCREEN ) { | |
1141 /* Clear fullscreen flag if not supported */ | |
1142 if ( SDL_windowid ) { | |
1143 flags &= ~SDL_FULLSCREEN; | |
1144 } | |
1145 } | |
1146 | |
1147 /* 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
|
1148 XSync(GFX_Display, False); |
0 | 1149 |
1150 /* Set up the X11 window */ | |
1151 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
|
1152 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
|
1153 && (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
|
1154 && ((saved_flags&SDL_NOFRAME) == (flags&SDL_NOFRAME)) ) { |
0 | 1155 if (X11_ResizeWindow(this, current, width, height, flags) < 0) { |
1156 current = NULL; | |
1157 goto done; | |
1158 } | |
1159 } else { | |
1160 if (X11_CreateWindow(this,current,width,height,bpp,flags) < 0) { | |
1161 current = NULL; | |
1162 goto done; | |
1163 } | |
1164 } | |
1165 | |
4008 | 1166 /* Update the internal keyboard state */ |
1167 X11_SetKeyboardState(SDL_Display, NULL); | |
1168 | |
1169 /* When the window is first mapped, ignore non-modifier keys */ | |
1170 if ( !current->w && !current->h ) { | |
1171 Uint8 *keys = SDL_GetKeyState(NULL); | |
1172 int i; | |
1173 for ( i = 0; i < SDLK_LAST; ++i ) { | |
1174 switch (i) { | |
1175 case SDLK_NUMLOCK: | |
1176 case SDLK_CAPSLOCK: | |
1177 case SDLK_LCTRL: | |
1178 case SDLK_RCTRL: | |
1179 case SDLK_LSHIFT: | |
1180 case SDLK_RSHIFT: | |
1181 case SDLK_LALT: | |
1182 case SDLK_RALT: | |
1183 case SDLK_LMETA: | |
1184 case SDLK_RMETA: | |
1185 case SDLK_MODE: | |
1186 break; | |
1187 default: | |
1188 keys[i] = SDL_RELEASED; | |
1189 break; | |
1190 } | |
1191 } | |
1192 } | |
1193 | |
0 | 1194 /* Set up the new mode framebuffer */ |
1195 if ( ((current->w != width) || (current->h != height)) || | |
1196 ((saved_flags&SDL_OPENGL) != (flags&SDL_OPENGL)) ) { | |
1197 current->w = width; | |
1198 current->h = height; | |
1199 current->pitch = SDL_CalculatePitch(current); | |
1200 X11_ResizeImage(this, current, flags); | |
1201 } | |
4016
3f93ccc2c01e
Clear the NOFRAME and RESIZABLE flags in the X11 target before setting their
Ryan C. Gordon <icculus@icculus.org>
parents:
4014
diff
changeset
|
1202 |
3f93ccc2c01e
Clear the NOFRAME and RESIZABLE flags in the X11 target before setting their
Ryan C. Gordon <icculus@icculus.org>
parents:
4014
diff
changeset
|
1203 /* Clear these flags and set them only if they are in the new set. */ |
3f93ccc2c01e
Clear the NOFRAME and RESIZABLE flags in the X11 target before setting their
Ryan C. Gordon <icculus@icculus.org>
parents:
4014
diff
changeset
|
1204 current->flags &= ~(SDL_RESIZABLE|SDL_NOFRAME); |
0 | 1205 current->flags |= (flags&(SDL_RESIZABLE|SDL_NOFRAME)); |
1206 | |
1207 done: | |
1208 /* 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
|
1209 XSync(SDL_Display, False); |
0 | 1210 SDL_Unlock_EventThread(); |
1211 | |
1212 /* We're done! */ | |
1213 return(current); | |
1214 } | |
1215 | |
1216 static int X11_ToggleFullScreen(_THIS, int on) | |
1217 { | |
1218 Uint32 event_thread; | |
1219 | |
1220 /* Don't switch if we don't own the window */ | |
1221 if ( SDL_windowid ) { | |
1222 return(0); | |
1223 } | |
1224 | |
1225 /* Don't lock if we are the event thread */ | |
1226 event_thread = SDL_EventThreadID(); | |
1227 if ( event_thread && (SDL_ThreadID() == event_thread) ) { | |
1228 event_thread = 0; | |
1229 } | |
1230 if ( event_thread ) { | |
1231 SDL_Lock_EventThread(); | |
1232 } | |
1233 if ( on ) { | |
1234 this->screen->flags |= SDL_FULLSCREEN; | |
1235 X11_EnterFullScreen(this); | |
1236 } else { | |
1237 this->screen->flags &= ~SDL_FULLSCREEN; | |
1238 X11_LeaveFullScreen(this); | |
1239 } | |
1240 X11_RefreshDisplay(this); | |
1241 if ( event_thread ) { | |
1242 SDL_Unlock_EventThread(); | |
1243 } | |
1244 SDL_ResetKeyboard(); | |
1245 return(1); | |
1246 } | |
1247 | |
1248 /* Update the current mouse state and position */ | |
1249 static void X11_UpdateMouse(_THIS) | |
1250 { | |
1251 Window u1; int u2; | |
1252 Window current_win; | |
1253 int x, y; | |
1254 unsigned int mask; | |
1255 | |
1256 /* Lock the event thread, in multi-threading environments */ | |
1257 SDL_Lock_EventThread(); | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1258 if ( XQueryPointer(SDL_Display, SDL_Window, &u1, ¤t_win, |
0 | 1259 &u2, &u2, &x, &y, &mask) ) { |
1260 if ( (x >= 0) && (x < SDL_VideoSurface->w) && | |
1261 (y >= 0) && (y < SDL_VideoSurface->h) ) { | |
1262 SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); | |
1263 SDL_PrivateMouseMotion(0, 0, x, y); | |
1264 } else { | |
1265 SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); | |
1266 } | |
1267 } | |
1268 SDL_Unlock_EventThread(); | |
1269 } | |
1270 | |
1271 /* simple colour distance metric. Supposed to be better than a plain | |
1272 Euclidian distance anyway. */ | |
1273 #define COLOUR_FACTOR 3 | |
1274 #define LIGHT_FACTOR 1 | |
1275 #define COLOUR_DIST(r1, g1, b1, r2, g2, b2) \ | |
1276 (COLOUR_FACTOR * (abs(r1 - r2) + abs(g1 - g2) + abs(b1 - b2)) \ | |
1277 + LIGHT_FACTOR * abs(r1 + g1 + b1 - (r2 + g2 + b2))) | |
1278 | |
1279 static void allocate_nearest(_THIS, SDL_Color *colors, | |
1280 SDL_Color *want, int nwant) | |
1281 { | |
1282 /* | |
1283 * There is no way to know which ones to choose from, so we retrieve | |
1284 * the entire colormap and try the nearest possible, until we find one | |
1285 * that is shared. | |
1286 */ | |
1287 XColor all[256]; | |
1288 int i; | |
1289 for(i = 0; i < 256; i++) | |
1290 all[i].pixel = i; | |
1291 /* | |
1292 * XQueryColors sets the flags in the XColor struct, so we use | |
1293 * that to keep track of which colours are available | |
1294 */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1295 XQueryColors(GFX_Display, SDL_XColorMap, all, 256); |
0 | 1296 |
1297 for(i = 0; i < nwant; i++) { | |
1298 XColor *c; | |
1299 int j; | |
1300 int best = 0; | |
1301 int mindist = 0x7fffffff; | |
1302 int ri = want[i].r; | |
1303 int gi = want[i].g; | |
1304 int bi = want[i].b; | |
1305 for(j = 0; j < 256; j++) { | |
1306 int rj, gj, bj, d2; | |
1307 if(!all[j].flags) | |
1308 continue; /* unavailable colour cell */ | |
1309 rj = all[j].red >> 8; | |
1310 gj = all[j].green >> 8; | |
1311 bj = all[j].blue >> 8; | |
1312 d2 = COLOUR_DIST(ri, gi, bi, rj, gj, bj); | |
1313 if(d2 < mindist) { | |
1314 mindist = d2; | |
1315 best = j; | |
1316 } | |
1317 } | |
1318 if(SDL_XPixels[best]) | |
1319 continue; /* already allocated, waste no more time */ | |
1320 c = all + best; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1321 if(XAllocColor(GFX_Display, SDL_XColorMap, c)) { |
0 | 1322 /* got it */ |
236
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1323 colors[c->pixel].r = c->red >> 8; |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1324 colors[c->pixel].g = c->green >> 8; |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1325 colors[c->pixel].b = c->blue >> 8; |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1326 ++SDL_XPixels[c->pixel]; |
0 | 1327 } else { |
1328 /* | |
1329 * The colour couldn't be allocated, probably being | |
1330 * owned as a r/w cell by another client. Flag it as | |
1331 * unavailable and try again. The termination of the | |
1332 * loop is guaranteed since at least black and white | |
1333 * are always there. | |
1334 */ | |
1335 c->flags = 0; | |
1336 i--; | |
1337 } | |
1338 } | |
1339 } | |
1340 | |
1341 int X11_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) | |
1342 { | |
1343 int nrej = 0; | |
1344 | |
1345 /* Check to make sure we have a colormap allocated */ | |
1346 if ( SDL_XPixels == NULL ) { | |
1347 return(0); | |
1348 } | |
1349 if ( (this->screen->flags & SDL_HWPALETTE) == SDL_HWPALETTE ) { | |
1350 /* private writable colormap: just set the colours we need */ | |
1351 XColor *xcmap; | |
1352 int i; | |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1353 xcmap = SDL_stack_alloc(XColor, ncolors); |
0 | 1354 if(xcmap == NULL) |
1355 return 0; | |
1356 for ( i=0; i<ncolors; ++i ) { | |
1357 xcmap[i].pixel = i + firstcolor; | |
1358 xcmap[i].red = (colors[i].r<<8)|colors[i].r; | |
1359 xcmap[i].green = (colors[i].g<<8)|colors[i].g; | |
1360 xcmap[i].blue = (colors[i].b<<8)|colors[i].b; | |
1361 xcmap[i].flags = (DoRed|DoGreen|DoBlue); | |
1362 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1363 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
|
1364 XSync(GFX_Display, False); |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1365 SDL_stack_free(xcmap); |
0 | 1366 } else { |
1367 /* | |
1368 * Shared colormap: We only allocate read-only cells, which | |
1369 * increases the likelyhood of colour sharing with other | |
1370 * clients. The pixel values will almost certainly be | |
1371 * different from the requested ones, so the user has to | |
1372 * walk the colormap and see which index got what colour. | |
1373 * | |
1374 * We can work directly with the logical palette since it | |
1375 * has already been set when we get here. | |
1376 */ | |
1377 SDL_Color *want, *reject; | |
1378 unsigned long *freelist; | |
1379 int i; | |
1380 int nfree = 0; | |
1381 int nc = this->screen->format->palette->ncolors; | |
1382 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
|
1383 freelist = SDL_stack_alloc(unsigned long, nc); |
0 | 1384 /* make sure multiple allocations of the same cell are freed */ |
1385 for(i = 0; i < ncolors; i++) { | |
1386 int pixel = firstcolor + i; | |
1387 while(SDL_XPixels[pixel]) { | |
1388 freelist[nfree++] = pixel; | |
1389 --SDL_XPixels[pixel]; | |
1390 } | |
1391 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1392 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
|
1393 SDL_stack_free(freelist); |
0 | 1394 |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1395 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
|
1396 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
|
1397 SDL_memcpy(want, colors + firstcolor, ncolors * sizeof(SDL_Color)); |
0 | 1398 /* make sure the user isn't fooled by her own wishes |
1399 (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
|
1400 SDL_memset(colors + firstcolor, 0, ncolors * sizeof(SDL_Color)); |
0 | 1401 |
1402 /* now try to allocate the colours */ | |
1403 for(i = 0; i < ncolors; i++) { | |
1404 XColor col; | |
1405 col.red = want[i].r << 8; | |
1406 col.green = want[i].g << 8; | |
1407 col.blue = want[i].b << 8; | |
1408 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
|
1409 if(XAllocColor(GFX_Display, SDL_XColorMap, &col)) { |
0 | 1410 /* We got the colour, or at least the nearest |
1411 the hardware could get. */ | |
1412 colors[col.pixel].r = col.red >> 8; | |
1413 colors[col.pixel].g = col.green >> 8; | |
1414 colors[col.pixel].b = col.blue >> 8; | |
1415 ++SDL_XPixels[col.pixel]; | |
1416 } else { | |
1417 /* | |
1418 * no more free cells, add it to the list | |
1419 * of rejected colours | |
1420 */ | |
1421 reject[nrej++] = want[i]; | |
1422 } | |
1423 } | |
1424 if(nrej) | |
1425 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
|
1426 SDL_stack_free(reject); |
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
1427 SDL_stack_free(want); |
0 | 1428 } |
1429 return nrej == 0; | |
1430 } | |
1431 | |
1432 int X11_SetGammaRamp(_THIS, Uint16 *ramp) | |
1433 { | |
1434 int i, ncolors; | |
1435 XColor xcmap[256]; | |
1436 | |
1437 /* See if actually setting the gamma is supported */ | |
1438 if ( SDL_Visual->class != DirectColor ) { | |
1439 SDL_SetError("Gamma correction not supported on this visual"); | |
1440 return(-1); | |
1441 } | |
1442 | |
1443 /* Calculate the appropriate palette for the given gamma ramp */ | |
1444 ncolors = SDL_Visual->map_entries; | |
1445 for ( i=0; i<ncolors; ++i ) { | |
1446 Uint8 c = (256 * i / ncolors); | |
1447 xcmap[i].pixel = SDL_MapRGB(this->screen->format, c, c, c); | |
1448 xcmap[i].red = ramp[0*256+c]; | |
1449 xcmap[i].green = ramp[1*256+c]; | |
1450 xcmap[i].blue = ramp[2*256+c]; | |
1451 xcmap[i].flags = (DoRed|DoGreen|DoBlue); | |
1452 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1453 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
|
1454 XSync(GFX_Display, False); |
0 | 1455 return(0); |
1456 } | |
1457 | |
1458 /* Note: If we are terminated, this could be called in the middle of | |
1459 another SDL video routine -- notably UpdateRects. | |
1460 */ | |
1461 void X11_VideoQuit(_THIS) | |
1462 { | |
1463 /* Shutdown everything that's still up */ | |
1464 /* The event thread should be done, so we can touch SDL_Display */ | |
1465 if ( SDL_Display != NULL ) { | |
1466 /* 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
|
1467 XSync(GFX_Display, False); |
0 | 1468 |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1469 /* 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
|
1470 #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
|
1471 if (SDL_IC != NULL) { |
3978
b966761fef6c
Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents:
3964
diff
changeset
|
1472 XUnsetICFocus(SDL_IC); |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1473 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
|
1474 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
|
1475 } |
1319
66f6c64c2c69
Logic bug in X11 Unicode input shutdown...was checking for == NULL
Ryan C. Gordon <icculus@icculus.org>
parents:
1312
diff
changeset
|
1476 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
|
1477 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
|
1478 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
|
1479 } |
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1480 #endif |
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1481 |
0 | 1482 /* Start shutting down the windows */ |
1483 X11_DestroyImage(this, this->screen); | |
1484 X11_DestroyWindow(this, this->screen); | |
1485 X11_FreeVideoModes(this); | |
1486 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
|
1487 XFreeColormap(SDL_Display, SDL_XColorMap); |
0 | 1488 } |
1489 if ( SDL_iconcolors ) { | |
1490 unsigned long pixel; | |
236
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1491 Colormap dcmap = DefaultColormap(SDL_Display, |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1492 SDL_Screen); |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1493 for(pixel = 0; pixel < 256; ++pixel) { |
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1494 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
|
1495 XFreeColors(GFX_Display, |
236
3f09f52ac2cc
Fixed X11 icon color allocation (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
160
diff
changeset
|
1496 dcmap, &pixel, 1, 0); |
0 | 1497 --SDL_iconcolors[pixel]; |
1498 } | |
1499 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
1500 SDL_free(SDL_iconcolors); |
0 | 1501 SDL_iconcolors = NULL; |
1502 } | |
1783 | 1503 |
0 | 1504 /* Restore gamma settings if they've changed */ |
1505 if ( SDL_GetAppState() & SDL_APPACTIVE ) { | |
1506 X11_SwapVidModeGamma(this); | |
1507 } | |
1508 | |
1783 | 1509 /* Restore DPMS and screensaver settings */ |
3936
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
3885
diff
changeset
|
1510 X11_RestoreScreenSaver(this, SDL_Display, screensaver_timeout, dpms_enabled); |
1783 | 1511 |
0 | 1512 /* Free that blank cursor */ |
1513 if ( SDL_BlankCursor != NULL ) { | |
1514 this->FreeWMCursor(this, SDL_BlankCursor); | |
1515 SDL_BlankCursor = NULL; | |
1516 } | |
1517 | |
1518 /* Close the X11 graphics connection */ | |
1519 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
|
1520 XCloseDisplay(GFX_Display); |
0 | 1521 GFX_Display = NULL; |
1522 } | |
1523 | |
1524 /* 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
|
1525 XCloseDisplay(SDL_Display); |
0 | 1526 SDL_Display = NULL; |
1527 | |
1528 /* Reset the X11 error handlers */ | |
1529 if ( XIO_handler ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1530 XSetIOErrorHandler(XIO_handler); |
0 | 1531 } |
1532 if ( X_handler ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1558
diff
changeset
|
1533 XSetErrorHandler(X_handler); |
0 | 1534 } |
1535 | |
1536 /* Unload GL library after X11 shuts down */ | |
1537 X11_GL_UnloadLibrary(this); | |
1538 } | |
1539 if ( this->screen && (this->screen->flags & SDL_HWSURFACE) ) { | |
1540 /* Direct screen access, no memory buffer */ | |
1541 this->screen->pixels = NULL; | |
1542 } | |
3885
a10bddfdc40f
Closing minor memory leak in XME code.
Ryan C. Gordon <icculus@icculus.org>
parents:
1863
diff
changeset
|
1543 |
a10bddfdc40f
Closing minor memory leak in XME code.
Ryan C. Gordon <icculus@icculus.org>
parents:
1863
diff
changeset
|
1544 #if SDL_VIDEO_DRIVER_X11_XME |
a10bddfdc40f
Closing minor memory leak in XME code.
Ryan C. Gordon <icculus@icculus.org>
parents:
1863
diff
changeset
|
1545 XiGMiscDestroy(); |
a10bddfdc40f
Closing minor memory leak in XME code.
Ryan C. Gordon <icculus@icculus.org>
parents:
1863
diff
changeset
|
1546 #endif |
0 | 1547 } |
1548 |