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