src/video/x11/SDL_x11video.c
author Ryan C. Gordon <icculus@icculus.org>
Sun, 08 Jul 2007 01:50:26 +0000
branchSDL-1.2
changeset 4016 3f93ccc2c01e
parent 4014 a6264945ac52
child 4067 07d621a03a94
permissions -rw-r--r--
Clear the NOFRAME and RESIZABLE flags in the X11 target before setting their new values, so multiple calls to SetVideoMode() that toggle these will end up with the right data. Fixes Bugzilla #441.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     1
/*
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     4
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     9
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    10
    This library is distributed in the hope that it will be useful,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    18
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    23
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    24
/* X11 based SDL video driver implementation.
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    25
   Note:  This implementation does not currently need X11 thread locking,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    26
          since the event thread uses a separate X connection and any
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    27
          additional locking necessary is handled internally.  However,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    28
          if full locking is neccessary, take a look at XInitThreads().
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    29
*/
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    30
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    31
#include <unistd.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    32
#include <sys/ioctl.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    33
#ifdef MTRR_SUPPORT
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    34
#include <asm/mtrr.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    35
#include <sys/fcntl.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    36
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    39
#include "SDL_timer.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    40
#include "SDL_thread.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    41
#include "SDL_video.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    46
#include "SDL_x11video.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    47
#include "SDL_x11wm_c.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    48
#include "SDL_x11mouse_c.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    49
#include "SDL_x11events_c.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    50
#include "SDL_x11modes_c.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    51
#include "SDL_x11image_c.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    52
#include "SDL_x11yuv_c.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    53
#include "SDL_x11gl_c.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    56
3978
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
    57
#ifdef X_HAVE_UTF8_STRING
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
    58
#include <locale.h>
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
    59
#endif
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
    60
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    61
/* Initialization/Query functions */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    62
static int X11_VideoInit(_THIS, SDL_PixelFormat *vformat);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    63
static SDL_Surface *X11_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    64
static int X11_ToggleFullScreen(_THIS, int on);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    65
static void X11_UpdateMouse(_THIS);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    66
static int X11_SetColors(_THIS, int firstcolor, int ncolors,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    67
			 SDL_Color *colors);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    68
static int X11_SetGammaRamp(_THIS, Uint16 *ramp);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    69
static void X11_VideoQuit(_THIS);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    70
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
    71
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    72
/* X11 driver bootstrap functions */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    73
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    74
static int X11_Available(void)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    75
{
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
    76
	Display *display = NULL;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
    77
	if ( SDL_X11_LoadSymbols() ) {
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
    78
		display = XOpenDisplay(NULL);
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
    79
		if ( display != NULL ) {
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
    80
			XCloseDisplay(display);
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
    81
		}
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
    82
		SDL_X11_UnloadSymbols();
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    83
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    84
	return(display != NULL);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    85
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    86
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    87
static void X11_DeleteDevice(SDL_VideoDevice *device)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    88
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    89
	if ( device ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    90
		if ( device->hidden ) {
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
    91
			SDL_free(device->hidden);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    92
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    93
		if ( device->gl_data ) {
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
    94
			SDL_free(device->gl_data);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    95
		}
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
    96
		SDL_free(device);
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
    97
		SDL_X11_UnloadSymbols();
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    98
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    99
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   100
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   101
static SDL_VideoDevice *X11_CreateDevice(int devindex)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   102
{
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   103
	SDL_VideoDevice *device = NULL;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   104
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   105
	if ( SDL_X11_LoadSymbols() ) {
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   106
		/* Initialize all variables that we clean on shutdown */
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   107
		device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice));
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   108
		if ( device ) {
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   109
			SDL_memset(device, 0, (sizeof *device));
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   110
			device->hidden = (struct SDL_PrivateVideoData *)
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   111
					SDL_malloc((sizeof *device->hidden));
3978
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   112
			SDL_memset(device->hidden, 0, (sizeof *device->hidden));
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   113
			device->gl_data = (struct SDL_PrivateGLData *)
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   114
					SDL_malloc((sizeof *device->gl_data));
3978
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   115
			SDL_memset(device->gl_data, 0, (sizeof *device->gl_data));
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   116
		}
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   117
		if ( (device == NULL) || (device->hidden == NULL) ||
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   118
		                         (device->gl_data == NULL) ) {
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   119
			SDL_OutOfMemory();
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   120
			X11_DeleteDevice(device); /* calls SDL_X11_UnloadSymbols(). */
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   121
			return(0);
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   122
		}
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   123
		SDL_memset(device->hidden, 0, (sizeof *device->hidden));
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   124
		SDL_memset(device->gl_data, 0, (sizeof *device->gl_data));
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   125
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   126
		/* Set the driver flags */
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   127
		device->handles_any_size = 1;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   128
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   129
		/* Set the function pointers */
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   130
		device->VideoInit = X11_VideoInit;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   131
		device->ListModes = X11_ListModes;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   132
		device->SetVideoMode = X11_SetVideoMode;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   133
		device->ToggleFullScreen = X11_ToggleFullScreen;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   134
		device->UpdateMouse = X11_UpdateMouse;
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
   135
#if SDL_VIDEO_DRIVER_X11_XV
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   136
		device->CreateYUVOverlay = X11_CreateYUVOverlay;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   137
#endif
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   138
		device->SetColors = X11_SetColors;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   139
		device->UpdateRects = NULL;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   140
		device->VideoQuit = X11_VideoQuit;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   141
		device->AllocHWSurface = X11_AllocHWSurface;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   142
		device->CheckHWBlit = NULL;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   143
		device->FillHWRect = NULL;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   144
		device->SetHWColorKey = NULL;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   145
		device->SetHWAlpha = NULL;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   146
		device->LockHWSurface = X11_LockHWSurface;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   147
		device->UnlockHWSurface = X11_UnlockHWSurface;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   148
		device->FlipHWSurface = X11_FlipHWSurface;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   149
		device->FreeHWSurface = X11_FreeHWSurface;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   150
		device->SetGamma = X11_SetVidModeGamma;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   151
		device->GetGamma = X11_GetVidModeGamma;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   152
		device->SetGammaRamp = X11_SetGammaRamp;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   153
		device->GetGammaRamp = NULL;
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
   154
#if SDL_VIDEO_OPENGL_GLX
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   155
		device->GL_LoadLibrary = X11_GL_LoadLibrary;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   156
		device->GL_GetProcAddress = X11_GL_GetProcAddress;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   157
		device->GL_GetAttribute = X11_GL_GetAttribute;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   158
		device->GL_MakeCurrent = X11_GL_MakeCurrent;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   159
		device->GL_SwapBuffers = X11_GL_SwapBuffers;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   160
#endif
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   161
		device->SetCaption = X11_SetCaption;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   162
		device->SetIcon = X11_SetIcon;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   163
		device->IconifyWindow = X11_IconifyWindow;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   164
		device->GrabInput = X11_GrabInput;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   165
		device->GetWMInfo = X11_GetWMInfo;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   166
		device->FreeWMCursor = X11_FreeWMCursor;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   167
		device->CreateWMCursor = X11_CreateWMCursor;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   168
		device->ShowWMCursor = X11_ShowWMCursor;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   169
		device->WarpWMCursor = X11_WarpWMCursor;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   170
		device->CheckMouseMode = X11_CheckMouseMode;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   171
		device->InitOSKeymap = X11_InitOSKeymap;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   172
		device->PumpEvents = X11_PumpEvents;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   173
1168
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   174
		device->free = X11_DeleteDevice;
045f186426e1 Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 867
diff changeset
   175
	}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   176
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   177
	return device;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   178
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   179
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   180
VideoBootStrap X11_bootstrap = {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   181
	"x11", "X Window System",
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   182
	X11_Available, X11_CreateDevice
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   183
};
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   184
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   185
/* Normal X11 error handler routine */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   186
static int (*X_handler)(Display *, XErrorEvent *) = NULL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   187
static int x_errhandler(Display *d, XErrorEvent *e)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   188
{
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
   189
#if SDL_VIDEO_DRIVER_X11_VIDMODE
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   190
	extern int vm_error;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   191
#endif
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
   192
#if SDL_VIDEO_DRIVER_X11_DGAMOUSE
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   193
	extern int dga_error;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   194
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   195
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
   196
#if SDL_VIDEO_DRIVER_X11_VIDMODE
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   197
	/* VidMode errors are non-fatal. :) */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   198
	/* Are the errors offset by one from the error base?
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   199
	   e.g. the error base is 143, the code is 148, and the
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   200
	        actual error is XF86VidModeExtensionDisabled (4) ?
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   201
	 */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   202
        if ( (vm_error >= 0) &&
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   203
	     (((e->error_code == BadRequest)&&(e->request_code == vm_error)) ||
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   204
	      ((e->error_code > vm_error) &&
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   205
	       (e->error_code <= (vm_error+XF86VidModeNumberErrors)))) ) {
1765
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   206
#ifdef X11_DEBUG
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   207
{ char errmsg[1024];
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   208
  XGetErrorText(d, e->error_code, errmsg, sizeof(errmsg));
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   209
printf("VidMode error: %s\n", errmsg);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   210
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   211
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   212
        	return(0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   213
        }
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
   214
#endif /* SDL_VIDEO_DRIVER_X11_VIDMODE */
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   215
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
   216
#if SDL_VIDEO_DRIVER_X11_DGAMOUSE
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   217
	/* DGA errors can be non-fatal. :) */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   218
        if ( (dga_error >= 0) &&
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   219
	     ((e->error_code > dga_error) &&
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   220
	      (e->error_code <= (dga_error+XF86DGANumberErrors))) ) {
1765
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   221
#ifdef X11_DEBUG
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   222
{ char errmsg[1024];
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   223
  XGetErrorText(d, e->error_code, errmsg, sizeof(errmsg));
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   224
printf("DGA error: %s\n", errmsg);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   225
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   226
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   227
        	return(0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   228
        }
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
   229
#endif /* SDL_VIDEO_DRIVER_X11_DGAMOUSE */
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   230
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   231
	return(X_handler(d,e));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   232
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   233
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   234
/* X11 I/O error handler routine */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   235
static int (*XIO_handler)(Display *) = NULL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   236
static int xio_errhandler(Display *d)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   237
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   238
	/* Ack!  Lost X11 connection! */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   239
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   240
	/* We will crash if we try to clean up our display */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   241
	if ( current_video->hidden->Ximage ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   242
		SDL_VideoSurface->pixels = NULL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   243
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   244
	current_video->hidden->X11_Display = NULL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   245
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   246
	/* Continue with the standard X11 error handler */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   247
	return(XIO_handler(d));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   248
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   249
1609
c3b5d17277d4 Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents: 1575
diff changeset
   250
static int (*Xext_handler)(Display *, _Xconst char *, _Xconst char *) = NULL;
c3b5d17277d4 Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents: 1575
diff changeset
   251
static int xext_errhandler(Display *d, _Xconst char *ext, _Xconst char *reason)
1248
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   252
{
1765
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   253
#ifdef X11_DEBUG
1248
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   254
	printf("Xext error inside SDL (may be harmless):\n");
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   255
	printf("  Extension \"%s\" %s on display \"%s\".\n",
1609
c3b5d17277d4 Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents: 1575
diff changeset
   256
	       ext, reason, XDisplayString(d));
1248
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   257
#endif
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   258
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   259
	if (SDL_strcmp(reason, "missing") == 0) {
1248
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   260
		/*
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   261
		 * Since the query itself, elsewhere, can handle a missing extension
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   262
		 *  and the default behaviour in Xlib is to write to stderr, which
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   263
		 *  generates unnecessary bug reports, we just ignore these.
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   264
		 */
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   265
		return 0;
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   266
	}
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   267
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   268
	/* Everything else goes to the default handler... */
1609
c3b5d17277d4 Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents: 1575
diff changeset
   269
	return Xext_handler(d, ext, reason);
1248
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   270
}
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   271
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   272
/* Find out what class name we should use */
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   273
static char *get_classname(char *classname, int maxlen)
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   274
{
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   275
	char *spot;
1402
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1379
diff changeset
   276
#if defined(__LINUX__) || defined(__FREEBSD__)
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   277
	char procfile[1024];
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   278
	char linkfile[1024];
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   279
	int linksize;
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   280
#endif
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   281
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   282
	/* First allow environment variable override */
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   283
	spot = SDL_getenv("SDL_VIDEO_X11_WMCLASS");
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   284
	if ( spot ) {
1379
c0a74f199ecf Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents: 1361
diff changeset
   285
		SDL_strlcpy(classname, spot, maxlen);
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   286
		return classname;
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   287
	}
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   288
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   289
	/* Next look at the application's executable name */
1402
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1379
diff changeset
   290
#if defined(__LINUX__) || defined(__FREEBSD__)
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1379
diff changeset
   291
#if defined(__LINUX__)
1338
604d73db6802 Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents: 1336
diff changeset
   292
	SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/exe", getpid());
1402
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1379
diff changeset
   293
#elif defined(__FREEBSD__)
1338
604d73db6802 Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents: 1336
diff changeset
   294
	SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/file", getpid());
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   295
#else
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   296
#error Where can we find the executable name?
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   297
#endif
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   298
	linksize = readlink(procfile, linkfile, sizeof(linkfile)-1);
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   299
	if ( linksize > 0 ) {
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   300
		linkfile[linksize] = '\0';
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   301
		spot = SDL_strrchr(linkfile, '/');
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   302
		if ( spot ) {
1379
c0a74f199ecf Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents: 1361
diff changeset
   303
			SDL_strlcpy(classname, spot+1, maxlen);
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   304
		} else {
1379
c0a74f199ecf Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents: 1361
diff changeset
   305
			SDL_strlcpy(classname, linkfile, maxlen);
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   306
		}
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   307
		return classname;
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   308
	}
1402
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1379
diff changeset
   309
#endif /* __LINUX__ */
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   310
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   311
	/* Finally use the default we've used forever */
1379
c0a74f199ecf Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents: 1361
diff changeset
   312
	SDL_strlcpy(classname, "SDL_App", maxlen);
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   313
	return classname;
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   314
}
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   315
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   316
/* Create auxiliary (toplevel) windows with the current visual */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   317
static void create_aux_windows(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   318
{
1765
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   319
    int x = 0, y = 0;
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   320
    char classname[1024];
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   321
    XSetWindowAttributes xattr;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   322
    XWMHints *hints;
3978
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   323
    unsigned long app_event_mask;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   324
    int def_vis = (SDL_Visual == DefaultVisual(SDL_Display, SDL_Screen));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   325
1558
b46bb79cc197 Fixed bug #113:
Sam Lantinga <slouken@libsdl.org>
parents: 1545
diff changeset
   326
    /* Look up some useful Atoms */
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   327
    WM_DELETE_WINDOW = XInternAtom(SDL_Display, "WM_DELETE_WINDOW", False);
1558
b46bb79cc197 Fixed bug #113:
Sam Lantinga <slouken@libsdl.org>
parents: 1545
diff changeset
   328
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   329
    /* Don't create any extra windows if we are being managed */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   330
    if ( SDL_windowid ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   331
	FSwindow = 0;
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   332
	WMwindow = SDL_strtol(SDL_windowid, NULL, 0);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   333
        return;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   334
    }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   335
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   336
    if(FSwindow)
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   337
	XDestroyWindow(SDL_Display, FSwindow);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   338
1863
0e44c6f90b95 Fixed bug #241
Sam Lantinga <slouken@libsdl.org>
parents: 1784
diff changeset
   339
#if SDL_VIDEO_DRIVER_X11_XINERAMA
1765
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   340
    if ( use_xinerama ) {
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   341
        x = xinerama_info.x_org;
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   342
        y = xinerama_info.y_org;
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   343
    }
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   344
#endif
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   345
    xattr.override_redirect = True;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   346
    xattr.background_pixel = def_vis ? BlackPixel(SDL_Display, SDL_Screen) : 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   347
    xattr.border_pixel = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   348
    xattr.colormap = SDL_XColorMap;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   349
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   350
    FSwindow = XCreateWindow(SDL_Display, SDL_Root,
1765
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   351
                             x, y, 32, 32, 0,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   352
			     this->hidden->depth, InputOutput, SDL_Visual,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   353
			     CWOverrideRedirect | CWBackPixel | CWBorderPixel
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   354
			     | CWColormap,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   355
			     &xattr);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   356
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   357
    XSelectInput(SDL_Display, FSwindow, StructureNotifyMask);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   358
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   359
    /* Tell KDE to keep the fullscreen window on top */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   360
    {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   361
	XEvent ev;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   362
	long mask;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   363
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   364
	SDL_memset(&ev, 0, sizeof(ev));
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   365
	ev.xclient.type = ClientMessage;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   366
	ev.xclient.window = SDL_Root;
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   367
	ev.xclient.message_type = XInternAtom(SDL_Display,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   368
					      "KWM_KEEP_ON_TOP", False);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   369
	ev.xclient.format = 32;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   370
	ev.xclient.data.l[0] = FSwindow;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   371
	ev.xclient.data.l[1] = CurrentTime;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   372
	mask = SubstructureRedirectMask;
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   373
	XSendEvent(SDL_Display, SDL_Root, False, mask, &ev);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   374
    }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   375
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   376
    hints = NULL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   377
    if(WMwindow) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   378
	/* All window attributes must survive the recreation */
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   379
	hints = XGetWMHints(SDL_Display, WMwindow);
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   380
	XDestroyWindow(SDL_Display, WMwindow);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   381
    }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   382
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   383
    /* Create the window for windowed management */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   384
    /* (reusing the xattr structure above) */
1765
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   385
    WMwindow = XCreateWindow(SDL_Display, SDL_Root,
c2c6ff414ef5 Fixed bug #45
Sam Lantinga <slouken@libsdl.org>
parents: 1641
diff changeset
   386
                             x, y, 32, 32, 0,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   387
			     this->hidden->depth, InputOutput, SDL_Visual,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   388
			     CWBackPixel | CWBorderPixel | CWColormap,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   389
			     &xattr);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   390
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   391
    /* Set the input hints so we get keyboard input */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   392
    if(!hints) {
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   393
	hints = XAllocWMHints();
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   394
	hints->input = True;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   395
	hints->flags = InputHint;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   396
    }
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   397
    XSetWMHints(SDL_Display, WMwindow, hints);
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   398
    XFree(hints);
1767
ae9f6be81810 Fixed bug #196
Sam Lantinga <slouken@libsdl.org>
parents: 1765
diff changeset
   399
    X11_SetCaptionNoLock(this, this->wm_title, this->wm_icon);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   400
3978
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   401
    app_event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   402
	| PropertyChangeMask | StructureNotifyMask | KeymapStateMask;
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   403
    XSelectInput(SDL_Display, WMwindow, app_event_mask);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   404
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   405
    /* Set the class hints so we can get an icon (AfterStep) */
1325
1dfc85090d07 Resolve bug #120
Sam Lantinga <slouken@libsdl.org>
parents: 1319
diff changeset
   406
    get_classname(classname, sizeof(classname));
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   407
    {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   408
	XClassHint *classhints;
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   409
	classhints = XAllocClassHint();
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   410
	if(classhints != NULL) {
449
8a687496061f Added an environment variable SDL_VIDEO_X11_WMCLASS
Sam Lantinga <slouken@libsdl.org>
parents: 444
diff changeset
   411
	    classhints->res_name = classname;
8a687496061f Added an environment variable SDL_VIDEO_X11_WMCLASS
Sam Lantinga <slouken@libsdl.org>
parents: 444
diff changeset
   412
	    classhints->res_class = classname;
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   413
	    XSetClassHint(SDL_Display, WMwindow, classhints);
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   414
	    XFree(classhints);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   415
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   416
    }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   417
3964
3dc92ff218dd Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents: 3936
diff changeset
   418
	/* Setup the communication with the IM server */
3978
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   419
	/* create_aux_windows may be called several times against the same
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   420
	   Display.  We should reuse the SDL_IM if one has been opened for
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   421
	   the Display, so we should not simply reset SDL_IM here.  */
1178
9867f3d86e44 Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents: 1168
diff changeset
   422
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   423
	#ifdef X_HAVE_UTF8_STRING
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   424
	if (SDL_X11_HAVE_UTF8) {
3978
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   425
		/* Discard obsolete resources if any.  */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   426
		if (SDL_IM != NULL && SDL_Display != XDisplayOfIM(SDL_IM)) {
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   427
			/* Just a double check. I don't think this
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   428
		           code is ever executed. */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   429
			SDL_SetError("display has changed while an IM is kept");
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   430
			if (SDL_IC) {
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   431
				XUnsetICFocus(SDL_IC);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   432
				XDestroyIC(SDL_IC);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   433
				SDL_IC = NULL;
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   434
			}
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   435
			XCloseIM(SDL_IM);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   436
			SDL_IM = NULL;
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   437
		}
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   438
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   439
		/* Open an input method.  */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   440
		if (SDL_IM == NULL) {
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   441
			char *old_locale, *old_modifiers;
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   442
			/* I'm not comfortable to do locale setup
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   443
			   here.  However, we need C library locale
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   444
			   (and xlib modifiers) to be set based on the
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   445
			   user's preference to use XIM, and many
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   446
			   existing game programs doesn't take care of
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   447
			   users' locale preferences, so someone other
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   448
			   than the game program should do it.
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   449
			   Moreover, ones say that some game programs
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   450
			   heavily rely on the C locale behaviour,
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   451
			   e.g., strcol()'s, and we can't change the C
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   452
			   library locale.  Given the situation, I
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   453
			   couldn't find better place to do the
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   454
			   job... */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   455
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   456
			/* Save the current (application program's)
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   457
			   locale settings.  */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   458
			old_locale = setlocale(LC_ALL, NULL);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   459
			old_modifiers = XSetLocaleModifiers(NULL);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   460
			if (old_locale == NULL || old_modifiers == NULL) {
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   461
				/* The specs guarantee that the query
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   462
				   calls to above functions never
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   463
				   fail, so we should never come
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   464
				   here.  */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   465
				SDL_SetError("failed to retreive current locale settings");
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   466
				old_locale = NULL;
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   467
				old_modifiers = NULL;
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   468
			} else {
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   469
				/* Save retreived values in our own
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   470
				   storage, since they may be
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   471
				   overwritten by the successive calls
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   472
				   to
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   473
				   setlocale/XSetLocaleModifiers.  */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   474
				char const *p;
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   475
				p = old_locale;
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   476
				old_locale = SDL_malloc(strlen(p) + 1);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   477
				strcpy(old_locale, p);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   478
				p = old_modifiers;
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   479
				old_modifiers = SDL_malloc(strlen(p) + 1);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   480
				strcpy(old_modifiers, p);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   481
			}
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   482
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   483
			/* Fetch the user's preferences and open the
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   484
			   input method with them.  */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   485
			setlocale(LC_ALL, "");
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   486
			XSetLocaleModifiers("");
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   487
			SDL_IM = XOpenIM(SDL_Display, NULL, classname, classname);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   488
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   489
			/* Restore the application's locale settings
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   490
			   so that we don't break the application's
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   491
			   expected behaviour.  */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   492
			if (old_locale != NULL && old_modifiers != NULL) {
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   493
				/* We need to restore the C library
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   494
				   locale first, since the
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   495
				   interpretation of the X modifier
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   496
				   may depend on it.  */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   497
				setlocale(LC_ALL, old_locale);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   498
				SDL_free(old_locale);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   499
				XSetLocaleModifiers(old_modifiers);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   500
				SDL_free(old_modifiers);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   501
			}
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   502
		}
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   503
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   504
		/* Create a new input context for the new window just created.  */
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   505
		if (SDL_IM == NULL) {
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   506
			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
   507
		} else {
3978
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   508
			if (SDL_IC != NULL) {
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   509
				/* Discard the old IC before creating new one.  */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   510
			    XUnsetICFocus(SDL_IC);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   511
			    XDestroyIC(SDL_IC);
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   512
			}
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   513
			/* Theoretically we should check the current IM supports
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   514
			   PreeditNothing+StatusNothing style (i.e., root window method)
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   515
			   before creating the IC.  However, it is the bottom line method,
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   516
			   and we supports any other options.  If the IM didn't support
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   517
			   root window method, the following call fails, and SDL falls
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   518
			   back to pre-XIM keyboard handling.  */
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   519
			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
   520
					XNClientWindow, WMwindow,
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   521
					XNFocusWindow, WMwindow,
3978
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   522
					XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   523
					XNResourceName, classname,
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   524
					XNResourceClass, classname,
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   525
					NULL);
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   526
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   527
			if (SDL_IC == NULL) {
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   528
				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
   529
				XCloseIM(SDL_IM);
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   530
				SDL_IM = NULL;
3978
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   531
			} else {
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   532
				/* We need to receive X events that an IM wants and to pass
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   533
				   them to the IM through XFilterEvent. The set of events may
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   534
				   vary depending on the IM implementation and the options
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   535
				   specified through various routes. Although unlikely, the
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   536
				   xlib specification allows IM to change the event requirement
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   537
				   with its own circumstances, it is safe to call SelectInput
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   538
				   whenever we re-create an IC.  */
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   539
				unsigned long mask = 0;
b966761fef6c Significantly improved XIM support.
Ryan C. Gordon <icculus@icculus.org>
parents: 3964
diff changeset
   540
				char *ret = pXGetICValues(SDL_IC, XNFilterEvents, &mask, NULL);
4014
a6264945ac52 Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents: 4008
diff changeset
   541
				if (ret != NULL) {
a6264945ac52 Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents: 4008
diff changeset
   542
					XUnsetICFocus(SDL_IC);
a6264945ac52 Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents: 4008
diff changeset
   543
					XDestroyIC(SDL_IC);
a6264945ac52 Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents: 4008
diff changeset
   544
					SDL_IC = NULL;
a6264945ac52 Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents: 4008
diff changeset
   545
					SDL_SetError("no input context could be created");
a6264945ac52 Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents: 4008
diff changeset
   546
					XCloseIM(SDL_IM);
a6264945ac52 Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents: 4008
diff changeset
   547
					SDL_IM = NULL;
a6264945ac52 Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents: 4008
diff changeset
   548
				} else {
a6264945ac52 Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents: 4008
diff changeset
   549
					XSelectInput(SDL_Display, WMwindow, app_event_mask | mask);
a6264945ac52 Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents: 4008
diff changeset
   550
					XSetICFocus(SDL_IC);
a6264945ac52 Fixed compiler warning (gcc w/ -Wall) for unused variable, and checked for
Ryan C. Gordon <icculus@icculus.org>
parents: 4008
diff changeset
   551
				}
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   552
			}
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   553
		}
1178
9867f3d86e44 Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents: 1168
diff changeset
   554
	}
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   555
	#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
   556
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   557
	/* 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
   558
	XSetWMProtocols(SDL_Display, WMwindow, &WM_DELETE_WINDOW, 1);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   559
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   560
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   561
static int X11_VideoInit(_THIS, SDL_PixelFormat *vformat)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   562
{
3936
c5c3c772f5aa Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents: 3885
diff changeset
   563
	const char *env = NULL;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   564
	char *display;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   565
	int i;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   566
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   567
	/* Open the X11 display */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   568
	display = NULL;		/* Get it from DISPLAY environment variable */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   569
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   570
	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
   571
	     (SDL_strncmp(XDisplayName(display), "unix:", 5) == 0) ) {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   572
		local_X11 = 1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   573
	} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   574
		local_X11 = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   575
	}
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   576
	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
   577
#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
   578
	/* 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
   579
	 * 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
   580
	 * 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
   581
	 *
2bf9dda618e5 Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents: 1248
diff changeset
   582
	 * 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
   583
	 * 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
   584
	 *
2bf9dda618e5 Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents: 1248
diff changeset
   585
	 */
2bf9dda618e5 Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents: 1248
diff changeset
   586
	if ( SDL_Display == NULL ) {
2bf9dda618e5 Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents: 1248
diff changeset
   587
		SDL_Delay(1000);
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   588
		SDL_Display = XOpenDisplay(display);
1299
2bf9dda618e5 Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents: 1248
diff changeset
   589
	}
2bf9dda618e5 Corrects dynamic X11 code on Tru64 systems.
Ryan C. Gordon <icculus@icculus.org>
parents: 1248
diff changeset
   590
#endif
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   591
	if ( SDL_Display == NULL ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   592
		SDL_SetError("Couldn't open X11 display");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   593
		return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   594
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   595
#ifdef X11_DEBUG
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   596
	XSynchronize(SDL_Display, True);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   597
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   598
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   599
	/* Create an alternate X display for graphics updates -- allows us
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   600
	   to do graphics updates in a separate thread from event handling.
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   601
	   Thread-safe X11 doesn't seem to exist.
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   602
	 */
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   603
	GFX_Display = XOpenDisplay(display);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   604
	if ( GFX_Display == NULL ) {
3964
3dc92ff218dd Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents: 3936
diff changeset
   605
		XCloseDisplay(SDL_Display);
3dc92ff218dd Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents: 3936
diff changeset
   606
		SDL_Display = NULL;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   607
		SDL_SetError("Couldn't open X11 display");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   608
		return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   609
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   610
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   611
	/* 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
   612
	X_handler = XSetErrorHandler(x_errhandler);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   613
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   614
	/* 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
   615
	XIO_handler = XSetIOErrorHandler(xio_errhandler);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   616
1248
d2c6881935be Catch X11 extension errors...since most of these are notifications that we
Ryan C. Gordon <icculus@icculus.org>
parents: 1206
diff changeset
   617
	/* 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
   618
	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
   619
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   620
	/* use default screen (from $DISPLAY) */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   621
	SDL_Screen = DefaultScreen(SDL_Display);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   622
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   623
#ifndef NO_SHARED_MEMORY
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   624
	/* 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
   625
	use_mitshm = 0;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   626
	if ( local_X11 ) {
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   627
		use_mitshm = XShmQueryExtension(SDL_Display);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   628
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   629
#endif /* NO_SHARED_MEMORY */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   630
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   631
	/* Get the available video modes */
3964
3dc92ff218dd Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents: 3936
diff changeset
   632
	if(X11_GetVideoModes(this) < 0) {
3dc92ff218dd Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents: 3936
diff changeset
   633
		XCloseDisplay(GFX_Display);
3dc92ff218dd Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents: 3936
diff changeset
   634
		GFX_Display = NULL;
3dc92ff218dd Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents: 3936
diff changeset
   635
		XCloseDisplay(SDL_Display);
3dc92ff218dd Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents: 3936
diff changeset
   636
		SDL_Display = NULL;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   637
	    return -1;
3964
3dc92ff218dd Clean up have-initialized resources in some failing edge cases.
Ryan C. Gordon <icculus@icculus.org>
parents: 3936
diff changeset
   638
	}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   639
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
   640
	/* 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
   641
	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
   642
	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
   643
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   644
	/* Determine the default screen depth:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   645
	   Use the default visual (or at least one with the same depth) */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   646
	SDL_DisplayColormap = DefaultColormap(SDL_Display, SDL_Screen);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   647
	for(i = 0; i < this->hidden->nvisuals; i++)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   648
	    if(this->hidden->visuals[i].depth == DefaultDepth(SDL_Display,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   649
							      SDL_Screen))
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   650
		break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   651
	if(i == this->hidden->nvisuals) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   652
	    /* default visual was useless, take the deepest one instead */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   653
	    i = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   654
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   655
	SDL_Visual = this->hidden->visuals[i].visual;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   656
	if ( SDL_Visual == DefaultVisual(SDL_Display, SDL_Screen) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   657
	    SDL_XColorMap = SDL_DisplayColormap;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   658
	} else {
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   659
	    SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   660
					    SDL_Visual, AllocNone);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   661
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   662
	this->hidden->depth = this->hidden->visuals[i].depth;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   663
	vformat->BitsPerPixel = this->hidden->visuals[i].bpp;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   664
	if ( vformat->BitsPerPixel > 8 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   665
		vformat->Rmask = SDL_Visual->red_mask;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   666
	  	vformat->Gmask = SDL_Visual->green_mask;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   667
	  	vformat->Bmask = SDL_Visual->blue_mask;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   668
	}
1641
5cf11b00b900 Fixed bug #197
Sam Lantinga <slouken@libsdl.org>
parents: 1609
diff changeset
   669
	if ( this->hidden->depth == 32 ) {
5cf11b00b900 Fixed bug #197
Sam Lantinga <slouken@libsdl.org>
parents: 1609
diff changeset
   670
		vformat->Amask = (0xFFFFFFFF & ~(vformat->Rmask|vformat->Gmask|vformat->Bmask));
5cf11b00b900 Fixed bug #197
Sam Lantinga <slouken@libsdl.org>
parents: 1609
diff changeset
   671
	}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   672
	X11_SaveVidModeGamma(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   673
1783
c546353b1ad4 Fixed bug #203
Sam Lantinga <slouken@libsdl.org>
parents: 1767
diff changeset
   674
	/* Save DPMS and screensaver settings */
1784
45669d4efd02 Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents: 1783
diff changeset
   675
	X11_SaveScreenSaver(SDL_Display, &screensaver_timeout, &dpms_enabled);
3936
c5c3c772f5aa Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents: 3885
diff changeset
   676
	X11_DisableScreenSaver(this, SDL_Display);
1783
c546353b1ad4 Fixed bug #203
Sam Lantinga <slouken@libsdl.org>
parents: 1767
diff changeset
   677
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   678
	/* 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
   679
	SDL_windowid = SDL_getenv("SDL_WINDOWID");
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   680
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   681
	/* Create the fullscreen and managed windows */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   682
	create_aux_windows(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   683
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   684
	/* Create the blank cursor */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   685
	SDL_BlankCursor = this->CreateWMCursor(this, blank_cdata, blank_cmask,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   686
					BLANK_CWIDTH, BLANK_CHEIGHT,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   687
						BLANK_CHOTX, BLANK_CHOTY);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   688
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   689
	/* Fill in some window manager capabilities */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   690
	this->info.wm_available = 1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   691
3936
c5c3c772f5aa Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents: 3885
diff changeset
   692
	/* Allow environment override of screensaver disable. */
c5c3c772f5aa Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents: 3885
diff changeset
   693
	env = SDL_getenv("SDL_VIDEO_ALLOW_SCREENSAVER");
c5c3c772f5aa Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents: 3885
diff changeset
   694
	this->hidden->allow_screensaver = ( (env && SDL_atoi(env)) ? 1 : 0 );
c5c3c772f5aa Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents: 3885
diff changeset
   695
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   696
	/* We're done! */
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   697
	XFlush(SDL_Display);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   698
	return(0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   699
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   700
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   701
static void X11_DestroyWindow(_THIS, SDL_Surface *screen)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   702
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   703
	/* Clean up OpenGL */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   704
	if ( screen ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   705
		screen->flags &= ~(SDL_OPENGL|SDL_OPENGLBLIT);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   706
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   707
	X11_GL_Shutdown(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   708
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   709
	if ( ! SDL_windowid ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   710
		/* Hide the managed window */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   711
		if ( WMwindow ) {
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   712
			XUnmapWindow(SDL_Display, WMwindow);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   713
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   714
		if ( screen && (screen->flags & SDL_FULLSCREEN) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   715
			screen->flags &= ~SDL_FULLSCREEN;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   716
			X11_LeaveFullScreen(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   717
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   718
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   719
		/* Destroy the output window */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   720
		if ( SDL_Window ) {
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   721
			XDestroyWindow(SDL_Display, SDL_Window);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   722
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   723
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   724
		/* Free the colormap entries */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   725
		if ( SDL_XPixels ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   726
			int numcolors;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   727
			unsigned long pixel;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   728
			numcolors = SDL_Visual->map_entries;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   729
			for ( pixel=0; pixel<numcolors; ++pixel ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   730
				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
   731
					XFreeColors(GFX_Display,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   732
						SDL_DisplayColormap,&pixel,1,0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   733
					--SDL_XPixels[pixel];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   734
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   735
			}
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   736
			SDL_free(SDL_XPixels);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   737
			SDL_XPixels = NULL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   738
		} 
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   739
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   740
		/* Free the graphics context */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   741
		if ( SDL_GC ) {
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   742
			XFreeGC(SDL_Display, SDL_GC);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   743
			SDL_GC = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   744
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   745
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   746
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   747
497
bb2d68294e81 Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents: 485
diff changeset
   748
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
   749
{
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   750
	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
   751
	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
   752
	if ( window ) {
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   753
		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
   754
			return SDL_TRUE;
bb2d68294e81 Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents: 485
diff changeset
   755
		}
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   756
		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
   757
			center = window;
bb2d68294e81 Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents: 485
diff changeset
   758
		}
bb2d68294e81 Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents: 485
diff changeset
   759
	}
bb2d68294e81 Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents: 485
diff changeset
   760
	if ( center ) {
bb2d68294e81 Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents: 485
diff changeset
   761
		*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
   762
		*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
   763
		return SDL_TRUE;
bb2d68294e81 Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents: 485
diff changeset
   764
	}
bb2d68294e81 Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents: 485
diff changeset
   765
	return SDL_FALSE;
bb2d68294e81 Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents: 485
diff changeset
   766
}
bb2d68294e81 Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents: 485
diff changeset
   767
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   768
static void X11_SetSizeHints(_THIS, int w, int h, Uint32 flags)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   769
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   770
	XSizeHints *hints;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   771
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   772
	hints = XAllocSizeHints();
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   773
	if ( hints ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   774
		if ( flags & SDL_RESIZABLE ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   775
			hints->min_width = 32;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   776
			hints->min_height = 32;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   777
			hints->max_height = 4096;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   778
			hints->max_width = 4096;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   779
		} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   780
			hints->min_width = hints->max_width = w;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   781
			hints->min_height = hints->max_height = h;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   782
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   783
		hints->flags = PMaxSize | PMinSize;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   784
		if ( flags & SDL_FULLSCREEN ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   785
			hints->x = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   786
			hints->y = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   787
			hints->flags |= USPosition;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   788
		} else
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   789
		/* Center it, if desired */
497
bb2d68294e81 Cleaned up the SDL_VIDEO_WINDOW_POS variable support
Sam Lantinga <slouken@libsdl.org>
parents: 485
diff changeset
   790
		if ( X11_WindowPosition(this, &hints->x, &hints->y, w, h) ) {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   791
			hints->flags |= USPosition;
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   792
			XMoveWindow(SDL_Display, WMwindow, hints->x, hints->y);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   793
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   794
			/* 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
   795
			XSync(SDL_Display, True);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   796
		}
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   797
		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
   798
		XFree(hints);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   799
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   800
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   801
	/* Respect the window caption style */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   802
	if ( flags & SDL_NOFRAME ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   803
		SDL_bool set;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   804
		Atom WM_HINTS;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   805
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   806
		/* We haven't modified the window manager hints yet */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   807
		set = SDL_FALSE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   808
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   809
		/* 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
   810
		WM_HINTS = XInternAtom(SDL_Display, "_MOTIF_WM_HINTS", True);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   811
		if ( WM_HINTS != None ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   812
			/* Hints used by Motif compliant window managers */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   813
			struct {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   814
				unsigned long flags;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   815
				unsigned long functions;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   816
				unsigned long decorations;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   817
				long input_mode;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   818
				unsigned long status;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   819
			} MWMHints = { (1L << 1), 0, 0, 0, 0 };
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   820
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   821
			XChangeProperty(SDL_Display, WMwindow,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   822
			                WM_HINTS, WM_HINTS, 32,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   823
			                PropModeReplace,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   824
					(unsigned char *)&MWMHints,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   825
					sizeof(MWMHints)/sizeof(long));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   826
			set = SDL_TRUE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   827
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   828
		/* 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
   829
		WM_HINTS = XInternAtom(SDL_Display, "KWM_WIN_DECORATION", True);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   830
		if ( WM_HINTS != None ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   831
			long KWMHints = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   832
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   833
			XChangeProperty(SDL_Display, WMwindow,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   834
			                WM_HINTS, WM_HINTS, 32,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   835
			                PropModeReplace,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   836
					(unsigned char *)&KWMHints,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   837
					sizeof(KWMHints)/sizeof(long));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   838
			set = SDL_TRUE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   839
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   840
		/* 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
   841
		WM_HINTS = XInternAtom(SDL_Display, "_WIN_HINTS", True);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   842
		if ( WM_HINTS != None ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   843
			long GNOMEHints = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   844
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   845
			XChangeProperty(SDL_Display, WMwindow,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   846
			                WM_HINTS, WM_HINTS, 32,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   847
			                PropModeReplace,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   848
					(unsigned char *)&GNOMEHints,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   849
					sizeof(GNOMEHints)/sizeof(long));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   850
			set = SDL_TRUE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   851
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   852
		/* Finally set the transient hints if necessary */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   853
		if ( ! set ) {
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   854
			XSetTransientForHint(SDL_Display, WMwindow, SDL_Root);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   855
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   856
	} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   857
		SDL_bool set;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   858
		Atom WM_HINTS;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   859
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   860
		/* We haven't modified the window manager hints yet */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   861
		set = SDL_FALSE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   862
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   863
		/* 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
   864
		WM_HINTS = XInternAtom(SDL_Display, "_MOTIF_WM_HINTS", True);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   865
		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
   866
			XDeleteProperty(SDL_Display, WMwindow, WM_HINTS);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   867
			set = SDL_TRUE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   868
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   869
		/* 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
   870
		WM_HINTS = XInternAtom(SDL_Display, "KWM_WIN_DECORATION", True);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   871
		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
   872
			XDeleteProperty(SDL_Display, WMwindow, WM_HINTS);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   873
			set = SDL_TRUE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   874
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   875
		/* 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
   876
		WM_HINTS = XInternAtom(SDL_Display, "_WIN_HINTS", True);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   877
		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
   878
			XDeleteProperty(SDL_Display, WMwindow, WM_HINTS);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   879
			set = SDL_TRUE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   880
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   881
		/* Finally unset the transient hints if necessary */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   882
		if ( ! set ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   883
			/* 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
   884
			XSetTransientForHint(SDL_Display, WMwindow, None);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   885
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   886
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   887
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   888
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   889
static int X11_CreateWindow(_THIS, SDL_Surface *screen,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   890
			    int w, int h, int bpp, Uint32 flags)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   891
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   892
	int i, depth;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   893
	Visual *vis;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   894
	int vis_change;
1641
5cf11b00b900 Fixed bug #197
Sam Lantinga <slouken@libsdl.org>
parents: 1609
diff changeset
   895
	Uint32 Amask;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   896
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   897
	/* If a window is already present, destroy it and start fresh */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   898
	if ( SDL_Window ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   899
		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
   900
		switch_waiting = 0; /* Prevent jump back to now-meaningless state. */
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   901
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   902
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   903
	/* See if we have been given a window id */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   904
	if ( SDL_windowid ) {
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   905
		SDL_Window = SDL_strtol(SDL_windowid, NULL, 0);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   906
	} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   907
		SDL_Window = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   908
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   909
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   910
	/* find out which visual we are going to use */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   911
	if ( flags & SDL_OPENGL ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   912
		XVisualInfo *vi;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   913
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   914
		vi = X11_GL_GetVisual(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   915
		if( !vi ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   916
			return -1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   917
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   918
		vis = vi->visual;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   919
		depth = vi->depth;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   920
	} else if ( SDL_windowid ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   921
		XWindowAttributes a;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   922
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   923
		XGetWindowAttributes(SDL_Display, SDL_Window, &a);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   924
		vis = a.visual;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   925
		depth = a.depth;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   926
	} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   927
		for ( i = 0; i < this->hidden->nvisuals; i++ ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   928
			if ( this->hidden->visuals[i].bpp == bpp )
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   929
				break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   930
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   931
		if ( i == this->hidden->nvisuals ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   932
			SDL_SetError("No matching visual for requested depth");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   933
			return -1;	/* should never happen */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   934
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   935
		vis = this->hidden->visuals[i].visual;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   936
		depth = this->hidden->visuals[i].depth;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   937
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   938
#ifdef X11_DEBUG
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   939
        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);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   940
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   941
	vis_change = (vis != SDL_Visual);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   942
	SDL_Visual = vis;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   943
	this->hidden->depth = depth;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   944
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   945
	/* Allocate the new pixel format for this video mode */
1641
5cf11b00b900 Fixed bug #197
Sam Lantinga <slouken@libsdl.org>
parents: 1609
diff changeset
   946
	if ( this->hidden->depth == 32 ) {
5cf11b00b900 Fixed bug #197
Sam Lantinga <slouken@libsdl.org>
parents: 1609
diff changeset
   947
		Amask = (0xFFFFFFFF & ~(vis->red_mask|vis->green_mask|vis->blue_mask));
5cf11b00b900 Fixed bug #197
Sam Lantinga <slouken@libsdl.org>
parents: 1609
diff changeset
   948
	} else {
5cf11b00b900 Fixed bug #197
Sam Lantinga <slouken@libsdl.org>
parents: 1609
diff changeset
   949
		Amask = 0;
5cf11b00b900 Fixed bug #197
Sam Lantinga <slouken@libsdl.org>
parents: 1609
diff changeset
   950
	}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   951
	if ( ! SDL_ReallocFormat(screen, bpp,
1641
5cf11b00b900 Fixed bug #197
Sam Lantinga <slouken@libsdl.org>
parents: 1609
diff changeset
   952
			vis->red_mask, vis->green_mask, vis->blue_mask, Amask) ) {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   953
		return -1;
1641
5cf11b00b900 Fixed bug #197
Sam Lantinga <slouken@libsdl.org>
parents: 1609
diff changeset
   954
	}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   955
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   956
	/* Create the appropriate colormap */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   957
	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
   958
		XFreeColormap(SDL_Display, SDL_XColorMap);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   959
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   960
	if ( SDL_Visual->class == PseudoColor ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   961
	    int ncolors;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   962
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   963
	    /* Allocate the pixel flags */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   964
	    ncolors = SDL_Visual->map_entries;
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   965
	    SDL_XPixels = SDL_malloc(ncolors * sizeof(int));
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   966
	    if(SDL_XPixels == NULL) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   967
		SDL_OutOfMemory();
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   968
		return -1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   969
	    }
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1327
diff changeset
   970
	    SDL_memset(SDL_XPixels, 0, ncolors * sizeof(*SDL_XPixels));
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   971
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   972
	    /* always allocate a private colormap on non-default visuals */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   973
	    if ( SDL_Visual != DefaultVisual(SDL_Display, SDL_Screen) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   974
		flags |= SDL_HWPALETTE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   975
	    }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   976
	    if ( flags & SDL_HWPALETTE ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   977
		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
   978
		SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   979
		                                SDL_Visual, AllocAll);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   980
	    } else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   981
		SDL_XColorMap = SDL_DisplayColormap;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   982
	    }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   983
	} else if ( SDL_Visual->class == DirectColor ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   984
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   985
	    /* 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
   986
	    SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   987
		                            SDL_Visual, AllocAll);
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
   988
            XSync(SDL_Display, False);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   989
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   990
	    /* Initialize the colormap to the identity mapping */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   991
	    SDL_GetGammaRamp(0, 0, 0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   992
	    this->screen = screen;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   993
	    X11_SetGammaRamp(this, this->gamma);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   994
	    this->screen = NULL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   995
	} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   996
	    /* 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
   997
	    SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   998
	                                    SDL_Visual, AllocNone);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   999
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1000
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1001
	/* Recreate the auxiliary windows, if needed (required for GL) */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1002
	if ( vis_change )
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1003
	    create_aux_windows(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1004
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1005
	if(screen->flags & SDL_HWPALETTE) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1006
	    /* Since the full-screen window might have got a nonzero background
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1007
	       colour (0 is white on some displays), we should reset the
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1008
	       background to 0 here since that is what the user expects
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1009
	       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
  1010
	    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
  1011
	    XClearWindow(SDL_Display, FSwindow);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1012
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1013
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1014
	/* resize the (possibly new) window manager window */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1015
	if( !SDL_windowid ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1016
	        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
  1017
		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
  1018
		window_h = h;
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
  1019
		XResizeWindow(SDL_Display, WMwindow, w, h);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1020
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1021
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1022
	/* Create (or use) the X11 display window */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1023
	if ( !SDL_windowid ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1024
		if ( flags & SDL_OPENGL ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1025
			if ( X11_GL_CreateWindow(this, w, h) < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1026
				return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1027
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1028
		} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1029
			XSetWindowAttributes swa;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1030
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1031
			swa.background_pixel = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1032
			swa.border_pixel = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1033
			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
  1034
			SDL_Window = XCreateWindow(SDL_Display, WMwindow,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1035
		                           	0, 0, w, h, 0, depth,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1036
		                           	InputOutput, SDL_Visual,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1037
		                           	CWBackPixel | CWBorderPixel
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1038
		                           	| CWColormap, &swa);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1039
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1040
		/* 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
  1041
		XSelectInput(SDL_Display, SDL_Window,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1042
					( EnterWindowMask | LeaveWindowMask
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1043
					| ButtonPressMask | ButtonReleaseMask
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1044
					| PointerMotionMask | ExposureMask ));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1045
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1046
	/* Create the graphics context here, once we have a window */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1047
	if ( flags & SDL_OPENGL ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1048
		if ( X11_GL_CreateContext(this) < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1049
			return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1050
		} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1051
			screen->flags |= SDL_OPENGL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1052
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1053
	} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1054
		XGCValues gcv;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1055
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1056
		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
  1057
		SDL_GC = XCreateGC(SDL_Display, SDL_Window,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1058
		                   GCGraphicsExposures, &gcv);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1059
		if ( ! SDL_GC ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1060
			SDL_SetError("Couldn't create graphics context");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1061
			return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1062
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1063
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1064
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1065
	/* Set our colormaps when not setting a GL mode */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1066
	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
  1067
		XSetWindowColormap(SDL_Display, SDL_Window, SDL_XColorMap);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1068
		if( !SDL_windowid ) {
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
  1069
		    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
  1070
		    XSetWindowColormap(SDL_Display, WMwindow, SDL_XColorMap);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1071
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1072
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1073
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1074
#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
  1075
	if ( SDL_getenv("SDL_VIDEO_X11_BACKINGSTORE") )
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1076
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1077
	/* Cache the window in the server, when possible */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1078
	{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1079
		Screen *xscreen;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1080
		XSetWindowAttributes a;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1081
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1082
		xscreen = ScreenOfDisplay(SDL_Display, SDL_Screen);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1083
		a.backing_store = DoesBackingStore(xscreen);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1084
		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
  1085
			XChangeWindowAttributes(SDL_Display, SDL_Window,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1086
			                        CWBackingStore, &a);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1087
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1088
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1089
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1090
	/* Map them both and go fullscreen, if requested */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1091
	if ( ! SDL_windowid ) {
1575
3ba88cb7eb1b Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents: 1558
diff changeset
  1092
		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
  1093
		XMapWindow(SDL_Display, WMwindow);
160
2a8d929f50e0 Fix title bar setting bug
Sam Lantinga <slouken@libsdl.org>
parents: 88
diff changeset
  1094
		X11_WaitMapped(this, WMwindow);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1095
		if ( flags & SDL_FULLSCREEN ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1096
			screen->flags |= SDL_FULLSCREEN;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1097
			X11_EnterFullScreen(this);