src/video/x11/SDL_x11window.c
author Sam Lantinga <slouken@libsdl.org>
Thu, 27 Sep 2012 23:55:38 -0700
changeset 6481 fab4b15b17e9
parent 6480 d02a4369b3f5
child 6483 4b51ff3dcf74
permissions -rw-r--r--
Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening. Also refactored the netwm state code so it's consistent between the places that use it.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     1
/*
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
     2
  Simple DirectMedia Layer
6138
4c64952a58fb Happy New Year!
Sam Lantinga <slouken@libsdl.org>
parents: 6045
diff changeset
     3
  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     4
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
     5
  This software is provided 'as-is', without any express or implied
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
     6
  warranty.  In no event will the authors be held liable for any damages
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
     7
  arising from the use of this software.
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     8
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
     9
  Permission is granted to anyone to use this software for any purpose,
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
    10
  including commercial applications, and to alter it and redistribute it
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
    11
  freely, subject to the following restrictions:
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    12
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
    13
  1. The origin of this software must not be misrepresented; you must not
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
    14
     claim that you wrote the original software. If you use this software
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
    15
     in a product, an acknowledgment in the product documentation would be
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
    16
     appreciated but is not required.
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
    17
  2. Altered source versions must be plainly marked as such, and must not be
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
    18
     misrepresented as being the original software.
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5531
diff changeset
    19
  3. This notice may not be removed or altered from any source distribution.
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    20
*/
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    21
#include "SDL_config.h"
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    22
5481
22dfc3958dc3 Fixed so code will compile with SDL_config_minimal.h
Sam Lantinga <slouken@libsdl.org>
parents: 5478
diff changeset
    23
#if SDL_VIDEO_DRIVER_X11
22dfc3958dc3 Fixed so code will compile with SDL_config_minimal.h
Sam Lantinga <slouken@libsdl.org>
parents: 5478
diff changeset
    24
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    25
#include "../SDL_sysvideo.h"
4465
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 3697
diff changeset
    26
#include "../SDL_pixels_c.h"
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    27
#include "../../events/SDL_keyboard_c.h"
2940
b93965a16fe0 Fixed X11 mouse motion/button events - it's not actually safe to cast mouse events to device events.
Sam Lantinga <slouken@libsdl.org>
parents: 2931
diff changeset
    28
#include "../../events/SDL_mouse_c.h"
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    29
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    30
#include "SDL_x11video.h"
2940
b93965a16fe0 Fixed X11 mouse motion/button events - it's not actually safe to cast mouse events to device events.
Sam Lantinga <slouken@libsdl.org>
parents: 2931
diff changeset
    31
#include "SDL_x11mouse.h"
4782
b6930aefd008 Finished X11 shaped-window functionality and removed ellipse+polygon rendering.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 3697
diff changeset
    32
#include "SDL_x11shape.h"
6316
a89c79a3f0cd 1.Moved all xinput2 functionality to its own file
Dimitris Zenios <dimitris.zenios@gmail.com>
parents: 6275
diff changeset
    33
#include "SDL_x11xinput2.h"
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    34
6188
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6167
diff changeset
    35
#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
3161
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
    36
#include "SDL_x11opengles.h"
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
    37
#endif
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
    38
4465
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 3697
diff changeset
    39
#include "SDL_timer.h"
3241
08c5964f2a34 Fixed a few issues compiling with Mac OS X 10.6
Sam Lantinga <slouken@libsdl.org>
parents: 3225
diff changeset
    40
#include "SDL_syswm.h"
6467
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    41
#include "SDL_assert.h"
3241
08c5964f2a34 Fixed a few issues compiling with Mac OS X 10.6
Sam Lantinga <slouken@libsdl.org>
parents: 3225
diff changeset
    42
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
    43
#define _NET_WM_STATE_REMOVE    0l
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
    44
#define _NET_WM_STATE_ADD       1l
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
    45
#define _NET_WM_STATE_TOGGLE    2l
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
    46
6467
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    47
static Bool isMapNotify(Display *dpy, XEvent *ev, XPointer win)
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    48
{
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    49
    return ev->type == MapNotify && ev->xmap.window == *((Window*)win);
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    50
}
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    51
static Bool isUnmapNotify(Display *dpy, XEvent *ev, XPointer win)
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    52
{
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    53
    return ev->type == UnmapNotify && ev->xunmap.window == *((Window*)win);
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    54
}
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    55
static Bool isConfigureNotify(Display *dpy, XEvent *ev, XPointer win)
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
    56
{
6480
d02a4369b3f5 Hopefully improved legacy fullscreen handling (it works now on my Ubuntu Unity system)
Sam Lantinga <slouken@libsdl.org>
parents: 6479
diff changeset
    57
    return ev->type == ConfigureNotify && ev->xconfigure.window == *((Window*)win);
d02a4369b3f5 Hopefully improved legacy fullscreen handling (it works now on my Ubuntu Unity system)
Sam Lantinga <slouken@libsdl.org>
parents: 6479
diff changeset
    58
}
d02a4369b3f5 Hopefully improved legacy fullscreen handling (it works now on my Ubuntu Unity system)
Sam Lantinga <slouken@libsdl.org>
parents: 6479
diff changeset
    59
static Bool isFocusIn(Display *dpy, XEvent *ev, XPointer win)
d02a4369b3f5 Hopefully improved legacy fullscreen handling (it works now on my Ubuntu Unity system)
Sam Lantinga <slouken@libsdl.org>
parents: 6479
diff changeset
    60
{
d02a4369b3f5 Hopefully improved legacy fullscreen handling (it works now on my Ubuntu Unity system)
Sam Lantinga <slouken@libsdl.org>
parents: 6479
diff changeset
    61
    return ev->type == FocusIn && ev->xfocus.window == *((Window*)win);
d02a4369b3f5 Hopefully improved legacy fullscreen handling (it works now on my Ubuntu Unity system)
Sam Lantinga <slouken@libsdl.org>
parents: 6479
diff changeset
    62
}
d02a4369b3f5 Hopefully improved legacy fullscreen handling (it works now on my Ubuntu Unity system)
Sam Lantinga <slouken@libsdl.org>
parents: 6479
diff changeset
    63
static Bool isFocusOut(Display *dpy, XEvent *ev, XPointer win)
d02a4369b3f5 Hopefully improved legacy fullscreen handling (it works now on my Ubuntu Unity system)
Sam Lantinga <slouken@libsdl.org>
parents: 6479
diff changeset
    64
{
d02a4369b3f5 Hopefully improved legacy fullscreen handling (it works now on my Ubuntu Unity system)
Sam Lantinga <slouken@libsdl.org>
parents: 6479
diff changeset
    65
    return ev->type == FocusOut && ev->xfocus.window == *((Window*)win);
6467
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    66
}
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
    67
6467
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    68
static SDL_bool
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    69
X11_IsWindowLegacyFullscreen(_THIS, SDL_Window * window)
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    70
{
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    71
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    72
    return (data->fswindow != 0);
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
    73
}
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
    74
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    75
static SDL_bool
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    76
X11_IsWindowMapped(_THIS, SDL_Window * window)
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    77
{
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    78
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    79
    SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    80
    XWindowAttributes attr;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    81
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    82
    XGetWindowAttributes(videodata->display, data->xwindow, &attr);
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    83
    if (attr.map_state != IsUnmapped) {
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    84
        return SDL_TRUE;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    85
    } else {
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    86
        return SDL_FALSE;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    87
    }
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    88
}
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    89
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
    90
static SDL_bool
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
    91
X11_IsActionAllowed(SDL_Window *window, Atom action)
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    92
{
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
    93
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
    94
    Atom _NET_WM_ALLOWED_ACTIONS = data->videodata->_NET_WM_ALLOWED_ACTIONS;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
    95
    Atom type;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
    96
    Display *display = data->videodata->display;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
    97
    int form;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
    98
    unsigned long remain;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
    99
    unsigned long len, i;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   100
    Atom *list;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   101
    SDL_bool ret = SDL_FALSE;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   102
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   103
    if (XGetWindowProperty(display, data->xwindow, _NET_WM_ALLOWED_ACTIONS, 0, 1024, False, XA_ATOM, &type, &form, &len, &remain, (unsigned char **)&list) == Success)
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   104
    {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   105
        for (i=0; i<len; ++i)
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   106
        {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   107
            if (list[i] == action) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   108
                ret = SDL_TRUE;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   109
                break;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   110
            }
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   111
        }
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   112
        XFree(list);
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   113
    }
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   114
    return ret;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   115
}
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   116
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   117
int
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   118
X11_GetWMStateProperty(_THIS, Uint32 flags, Atom atoms[5])
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   119
{
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   120
    SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   121
    Atom _NET_WM_STATE_HIDDEN = videodata->_NET_WM_STATE_HIDDEN;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   122
    Atom _NET_WM_STATE_FOCUSED = videodata->_NET_WM_STATE_FOCUSED;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   123
    Atom _NET_WM_STATE_MAXIMIZED_VERT = videodata->_NET_WM_STATE_MAXIMIZED_VERT;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   124
    Atom _NET_WM_STATE_MAXIMIZED_HORZ = videodata->_NET_WM_STATE_MAXIMIZED_HORZ;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   125
    Atom _NET_WM_STATE_FULLSCREEN = videodata->_NET_WM_STATE_FULLSCREEN;
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   126
    int count = 0;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   127
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   128
    if (flags & SDL_WINDOW_HIDDEN) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   129
        atoms[count++] = _NET_WM_STATE_HIDDEN;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   130
    }
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   131
    if (flags & SDL_WINDOW_INPUT_FOCUS) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   132
        atoms[count++] = _NET_WM_STATE_FOCUSED;
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   133
    }
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   134
    if (flags & SDL_WINDOW_MAXIMIZED) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   135
        atoms[count++] = _NET_WM_STATE_MAXIMIZED_VERT;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   136
        atoms[count++] = _NET_WM_STATE_MAXIMIZED_HORZ;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   137
    }
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   138
    if (flags & SDL_WINDOW_FULLSCREEN) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   139
        atoms[count++] = _NET_WM_STATE_FULLSCREEN;
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   140
    }
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   141
    return count;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   142
}
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   143
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   144
Uint32
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   145
X11_GetNetWMState(_THIS, SDL_Window * window)
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   146
{
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   147
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   148
    SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   149
    Atom _NET_WM_STATE = videodata->_NET_WM_STATE;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   150
    Atom _NET_WM_STATE_HIDDEN = videodata->_NET_WM_STATE_HIDDEN;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   151
    Atom _NET_WM_STATE_FOCUSED = videodata->_NET_WM_STATE_FOCUSED;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   152
    Atom _NET_WM_STATE_MAXIMIZED_VERT = videodata->_NET_WM_STATE_MAXIMIZED_VERT;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   153
    Atom _NET_WM_STATE_MAXIMIZED_HORZ = videodata->_NET_WM_STATE_MAXIMIZED_HORZ;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   154
    Atom _NET_WM_STATE_FULLSCREEN = videodata->_NET_WM_STATE_FULLSCREEN;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   155
    Atom _NET_WM_ACTION_RESIZE = videodata->_NET_WM_ACTION_RESIZE;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   156
    Atom actualType;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   157
    int actualFormat;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   158
    unsigned long i, numItems, bytesAfter;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   159
    unsigned char *propertyValue = NULL;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   160
    long maxLength = 1024;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   161
    Uint32 flags = 0;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   162
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   163
    if (XGetWindowProperty(videodata->display, data->xwindow, _NET_WM_STATE,
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   164
                           0l, maxLength, False, XA_ATOM, &actualType,
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   165
                           &actualFormat, &numItems, &bytesAfter,
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   166
                           &propertyValue) == Success) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   167
        Atom *atoms = (Atom *) propertyValue;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   168
        int maximized = 0;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   169
        int fullscreen = 0;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   170
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   171
        for (i = 0; i < numItems; ++i) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   172
            if (atoms[i] == _NET_WM_STATE_HIDDEN) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   173
                flags |= (SDL_WINDOW_HIDDEN|SDL_WINDOW_MINIMIZED);
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   174
            } else if (atoms[i] == _NET_WM_STATE_FOCUSED) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   175
                flags |= SDL_WINDOW_INPUT_FOCUS;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   176
            } else if (atoms[i] == _NET_WM_STATE_MAXIMIZED_VERT) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   177
                maximized |= 1;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   178
            } else if (atoms[i] == _NET_WM_STATE_MAXIMIZED_HORZ) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   179
                maximized |= 2;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   180
            } else if ( atoms[i] == _NET_WM_STATE_FULLSCREEN) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   181
                fullscreen = 1;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   182
            }
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   183
        }
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   184
        if (maximized == 3) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   185
            flags |= SDL_WINDOW_MAXIMIZED;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   186
        }  else if (fullscreen == 1) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   187
            flags |= SDL_WINDOW_FULLSCREEN;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   188
        }
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   189
        XFree(propertyValue);
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   190
    }
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   191
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   192
    if (X11_IsActionAllowed(window, _NET_WM_ACTION_RESIZE)) {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   193
        flags |= SDL_WINDOW_RESIZABLE;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   194
    }
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   195
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   196
    return flags;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   197
}
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   198
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   199
static int
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   200
SetupWindowData(_THIS, SDL_Window * window, Window w, BOOL created)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   201
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   202
    SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   203
    SDL_WindowData *data;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   204
    int numwindows = videodata->numwindows;
2324
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   205
    int windowlistlength = videodata->windowlistlength;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   206
    SDL_WindowData **windowlist = videodata->windowlist;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   207
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   208
    /* Allocate the window data */
2323
4ac07ae446d3 Fixed many valgrind errors. But, I broke testdyngl.
Bob Pendleton <bob@pendleton.com>
parents: 2322
diff changeset
   209
    data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data));
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   210
    if (!data) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   211
        SDL_OutOfMemory();
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   212
        return -1;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   213
    }
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   214
    window->driverdata = data;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   215
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3241
diff changeset
   216
    data->window = window;
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3241
diff changeset
   217
    data->xwindow = w;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   218
#ifdef X_HAVE_UTF8_STRING
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   219
    if (SDL_X11_HAVE_UTF8) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   220
        data->ic =
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   221
            pXCreateIC(videodata->im, XNClientWindow, w, XNFocusWindow, w,
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   222
                       XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   223
                       XNResourceName, videodata->classname, XNResourceClass,
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   224
                       videodata->classname, NULL);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   225
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   226
#endif
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   227
    data->created = created;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   228
    data->videodata = videodata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   229
2323
4ac07ae446d3 Fixed many valgrind errors. But, I broke testdyngl.
Bob Pendleton <bob@pendleton.com>
parents: 2322
diff changeset
   230
    /* Associate the data with the window */
2324
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   231
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   232
    if (numwindows < windowlistlength) {
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   233
        windowlist[numwindows] = data;
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   234
        videodata->numwindows++;
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   235
    } else {
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   236
        windowlist =
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   237
            (SDL_WindowData **) SDL_realloc(windowlist,
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   238
                                            (numwindows +
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   239
                                             1) * sizeof(*windowlist));
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   240
        if (!windowlist) {
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   241
            SDL_OutOfMemory();
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   242
            SDL_free(data);
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   243
            return -1;
2323
4ac07ae446d3 Fixed many valgrind errors. But, I broke testdyngl.
Bob Pendleton <bob@pendleton.com>
parents: 2322
diff changeset
   244
        }
2324
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   245
        windowlist[numwindows] = data;
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   246
        videodata->numwindows++;
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   247
        videodata->windowlistlength++;
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   248
        videodata->windowlist = windowlist;
2323
4ac07ae446d3 Fixed many valgrind errors. But, I broke testdyngl.
Bob Pendleton <bob@pendleton.com>
parents: 2322
diff changeset
   249
    }
4ac07ae446d3 Fixed many valgrind errors. But, I broke testdyngl.
Bob Pendleton <bob@pendleton.com>
parents: 2322
diff changeset
   250
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   251
    /* Fill in the SDL window with the window data */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   252
    {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   253
        XWindowAttributes attrib;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   254
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   255
        XGetWindowAttributes(data->videodata->display, w, &attrib);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   256
        window->x = attrib.x;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   257
        window->y = attrib.y;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   258
        window->w = attrib.width;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   259
        window->h = attrib.height;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   260
        if (attrib.map_state != IsUnmapped) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   261
            window->flags |= SDL_WINDOW_SHOWN;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   262
        } else {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   263
            window->flags &= ~SDL_WINDOW_SHOWN;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   264
        }
5182
073b86030262 Added the X11 framebuffer implementation. Simple! :)
Sam Lantinga <slouken@libsdl.org>
parents: 5088
diff changeset
   265
        data->visual = attrib.visual;
5466
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   266
        data->colormap = attrib.colormap;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   267
    }
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   268
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   269
    window->flags |= X11_GetNetWMState(_this, window);
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   270
6024
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   271
    {
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   272
        Window FocalWindow;
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   273
        int RevertTo=0;
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   274
        XGetInputFocus(data->videodata->display, &FocalWindow, &RevertTo);
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   275
        if (FocalWindow==w)
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   276
        {
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   277
            window->flags |= SDL_WINDOW_INPUT_FOCUS;
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   278
        }
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   279
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   280
        if (window->flags & SDL_WINDOW_INPUT_FOCUS) {
6024
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   281
            SDL_SetKeyboardFocus(data->window);
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   282
        }
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   283
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   284
        if (window->flags & SDL_WINDOW_INPUT_GRABBED) {
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   285
            /* Tell x11 to clip mouse */
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   286
        }
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   287
    }
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   288
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   289
    /* All done! */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   290
    return 0;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   291
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   292
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   293
static void
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   294
SetWindowBordered(Display *display, int screen, Window window, SDL_bool border)
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   295
{
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   296
    /*
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   297
     * this code used to check for KWM_WIN_DECORATION, but KDE hasn't
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   298
     *  supported it for years and years. It now respects _MOTIF_WM_HINTS.
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   299
     *  Gnome is similar: just use the Motif atom.
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   300
     */
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   301
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   302
    Atom WM_HINTS = XInternAtom(display, "_MOTIF_WM_HINTS", True);
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   303
    if (WM_HINTS != None) {
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   304
        /* Hints used by Motif compliant window managers */
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   305
        struct
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   306
        {
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   307
            unsigned long flags;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   308
            unsigned long functions;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   309
            unsigned long decorations;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   310
            long input_mode;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   311
            unsigned long status;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   312
        } MWMHints = {
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   313
            (1L << 1), 0, border ? 1 : 0, 0, 0
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   314
        };
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   315
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   316
        XChangeProperty(display, window, WM_HINTS, WM_HINTS, 32,
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   317
                        PropModeReplace, (unsigned char *) &MWMHints,
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   318
                        sizeof(MWMHints) / 4);
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   319
    } else {  /* set the transient hints instead, if necessary */
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   320
        XSetTransientForHint(display, window, RootWindow(display, screen));
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   321
    }
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   322
}
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   323
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   324
int
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   325
X11_CreateWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   326
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   327
    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   328
    SDL_DisplayData *displaydata =
5246
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   329
        (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata;
4521
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   330
    Display *display = data->display;
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   331
    int screen = displaydata->screen;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   332
    Visual *visual;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   333
    int depth;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   334
    XSetWindowAttributes xattr;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   335
    Window w;
6462
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   336
    XSizeHints *sizehints;
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   337
    XWMHints *wmhints;
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   338
    XClassHint *classhints;
4521
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   339
    Atom _NET_WM_WINDOW_TYPE;
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   340
    Atom _NET_WM_WINDOW_TYPE_NORMAL;
6167
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   341
    Atom _NET_WM_PID;
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   342
    int wmstate_count;
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   343
    Atom wmstate_atoms[5];
6045
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   344
    Uint32 fevent = 0;
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   345
6369
a92fbd27127b Fix OpenGL initialization when OpenGL and OpenGLES are both available.
Sam Lantinga <slouken@libsdl.org>
parents: 6343
diff changeset
   346
#if SDL_VIDEO_OPENGL_GLX || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   347
    if (window->flags & SDL_WINDOW_OPENGL) {
1952
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   348
        XVisualInfo *vinfo;
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   349
6370
93187f7f7d5d Improved simultaneous support for OpenGL and OpenGL ES
Sam Lantinga <slouken@libsdl.org>
parents: 6369
diff changeset
   350
#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2        
93187f7f7d5d Improved simultaneous support for OpenGL and OpenGL ES
Sam Lantinga <slouken@libsdl.org>
parents: 6369
diff changeset
   351
        if (_this->gl_config.use_egl == 1) {
6369
a92fbd27127b Fix OpenGL initialization when OpenGL and OpenGLES are both available.
Sam Lantinga <slouken@libsdl.org>
parents: 6343
diff changeset
   352
            vinfo = X11_GLES_GetVisual(_this, display, screen);
a92fbd27127b Fix OpenGL initialization when OpenGL and OpenGLES are both available.
Sam Lantinga <slouken@libsdl.org>
parents: 6343
diff changeset
   353
        } else
a92fbd27127b Fix OpenGL initialization when OpenGL and OpenGLES are both available.
Sam Lantinga <slouken@libsdl.org>
parents: 6343
diff changeset
   354
#endif
a92fbd27127b Fix OpenGL initialization when OpenGL and OpenGLES are both available.
Sam Lantinga <slouken@libsdl.org>
parents: 6343
diff changeset
   355
        {
6370
93187f7f7d5d Improved simultaneous support for OpenGL and OpenGL ES
Sam Lantinga <slouken@libsdl.org>
parents: 6369
diff changeset
   356
#if SDL_VIDEO_OPENGL_GLX
6369
a92fbd27127b Fix OpenGL initialization when OpenGL and OpenGLES are both available.
Sam Lantinga <slouken@libsdl.org>
parents: 6343
diff changeset
   357
            vinfo = X11_GL_GetVisual(_this, display, screen);
6370
93187f7f7d5d Improved simultaneous support for OpenGL and OpenGL ES
Sam Lantinga <slouken@libsdl.org>
parents: 6369
diff changeset
   358
#endif
1952
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   359
        }
3161
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   360
        if (!vinfo) {
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   361
            return -1;
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   362
        }
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   363
        visual = vinfo->visual;
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   364
        depth = vinfo->depth;
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   365
        XFree(vinfo);
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   366
    } else
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   367
#endif
1952
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   368
    {
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   369
        visual = displaydata->visual;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   370
        depth = displaydata->depth;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   371
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   372
5386
762e67f81fc7 Simplified the X11 window creation
Sam Lantinga <slouken@libsdl.org>
parents: 5305
diff changeset
   373
    xattr.override_redirect = False;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   374
    xattr.background_pixel = 0;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   375
    xattr.border_pixel = 0;
5466
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   376
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   377
    if (visual->class == DirectColor) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   378
        XColor *colorcells;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   379
        int i;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   380
        int ncolors;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   381
        int rmax, gmax, bmax;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   382
        int rmask, gmask, bmask;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   383
        int rshift, gshift, bshift;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   384
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   385
        xattr.colormap =
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   386
            XCreateColormap(display, RootWindow(display, screen),
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   387
                            visual, AllocAll);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   388
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   389
        /* If we can't create a colormap, then we must die */
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   390
        if (!xattr.colormap) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   391
            SDL_SetError("Could not create writable colormap");
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   392
            return -1;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   393
        }
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   394
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   395
        /* OK, we got a colormap, now fill it in as best as we can */
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   396
        colorcells = SDL_malloc(visual->map_entries * sizeof(XColor));
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   397
        if (!colorcells) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   398
            SDL_OutOfMemory();
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   399
            return -1;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   400
        }
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   401
        ncolors = visual->map_entries;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   402
        rmax = 0xffff;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   403
        gmax = 0xffff;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   404
        bmax = 0xffff;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   405
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   406
        rshift = 0;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   407
        rmask = visual->red_mask;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   408
        while (0 == (rmask & 1)) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   409
            rshift++;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   410
            rmask >>= 1;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   411
        }
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   412
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   413
        gshift = 0;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   414
        gmask = visual->green_mask;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   415
        while (0 == (gmask & 1)) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   416
            gshift++;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   417
            gmask >>= 1;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   418
        }
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   419
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   420
        bshift = 0;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   421
        bmask = visual->blue_mask;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   422
        while (0 == (bmask & 1)) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   423
            bshift++;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   424
            bmask >>= 1;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   425
        }
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   426
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   427
        /* build the color table pixel values */
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   428
        for (i = 0; i < ncolors; i++) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   429
            Uint32 red = (rmax * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   430
            Uint32 green = (gmax * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   431
            Uint32 blue = (bmax * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   432
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   433
            Uint32 rbits = (rmask * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   434
            Uint32 gbits = (gmask * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   435
            Uint32 bbits = (bmask * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   436
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   437
            Uint32 pix =
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   438
                (rbits << rshift) | (gbits << gshift) | (bbits << bshift);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   439
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   440
            colorcells[i].pixel = pix;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   441
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   442
            colorcells[i].red = red;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   443
            colorcells[i].green = green;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   444
            colorcells[i].blue = blue;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   445
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   446
            colorcells[i].flags = DoRed | DoGreen | DoBlue;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   447
        }
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   448
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   449
        XStoreColors(display, xattr.colormap, colorcells, ncolors);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   450
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   451
        SDL_free(colorcells);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   452
    } else {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   453
        xattr.colormap =
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   454
            XCreateColormap(display, RootWindow(display, screen),
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   455
                            visual, AllocNone);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   456
    }
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   457
5386
762e67f81fc7 Simplified the X11 window creation
Sam Lantinga <slouken@libsdl.org>
parents: 5305
diff changeset
   458
    w = XCreateWindow(display, RootWindow(display, screen),
762e67f81fc7 Simplified the X11 window creation
Sam Lantinga <slouken@libsdl.org>
parents: 5305
diff changeset
   459
                      window->x, window->y, window->w, window->h,
762e67f81fc7 Simplified the X11 window creation
Sam Lantinga <slouken@libsdl.org>
parents: 5305
diff changeset
   460
                      0, depth, InputOutput, visual,
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   461
                      (CWOverrideRedirect | CWBackPixel | CWBorderPixel |
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   462
                       CWColormap), &xattr);
1952
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   463
    if (!w) {
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   464
        SDL_SetError("Couldn't create window");
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   465
        return -1;
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   466
    }
6188
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6167
diff changeset
   467
#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
6373
494e0436525f More OpenGL ES fixes from Scott Percival
Sam Lantinga <slouken@libsdl.org>
parents: 6370
diff changeset
   468
    if ((window->flags & SDL_WINDOW_OPENGL) && (_this->gl_config.use_egl == 1)) {
494e0436525f More OpenGL ES fixes from Scott Percival
Sam Lantinga <slouken@libsdl.org>
parents: 6370
diff changeset
   469
        if (!_this->gles_data) {
494e0436525f More OpenGL ES fixes from Scott Percival
Sam Lantinga <slouken@libsdl.org>
parents: 6370
diff changeset
   470
            XDestroyWindow(display, w);
494e0436525f More OpenGL ES fixes from Scott Percival
Sam Lantinga <slouken@libsdl.org>
parents: 6370
diff changeset
   471
            return -1;
494e0436525f More OpenGL ES fixes from Scott Percival
Sam Lantinga <slouken@libsdl.org>
parents: 6370
diff changeset
   472
        }
494e0436525f More OpenGL ES fixes from Scott Percival
Sam Lantinga <slouken@libsdl.org>
parents: 6370
diff changeset
   473
6188
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6167
diff changeset
   474
        /* Create the GLES window surface */
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6167
diff changeset
   475
        _this->gles_data->egl_surface =
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6167
diff changeset
   476
            _this->gles_data->eglCreateWindowSurface(_this->gles_data->
3161
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   477
                                                 egl_display,
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   478
                                                 _this->gles_data->egl_config,
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   479
                                                 (NativeWindowType) w, NULL);
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   480
6188
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6167
diff changeset
   481
        if (_this->gles_data->egl_surface == EGL_NO_SURFACE) {
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6167
diff changeset
   482
            SDL_SetError("Could not create GLES window surface");
6373
494e0436525f More OpenGL ES fixes from Scott Percival
Sam Lantinga <slouken@libsdl.org>
parents: 6370
diff changeset
   483
            XDestroyWindow(display, w);
6188
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6167
diff changeset
   484
            return -1;
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6167
diff changeset
   485
        }
3161
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   486
    }
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   487
#endif
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   488
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   489
    SetWindowBordered(display, screen, w,
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   490
                      (window->flags & SDL_WINDOW_BORDERLESS) == 0);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   491
6462
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   492
    sizehints = XAllocSizeHints();
6167
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   493
    /* Setup the normal size hints */
6462
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   494
    sizehints->flags = 0;
6167
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   495
    if (!(window->flags & SDL_WINDOW_RESIZABLE)) {
6462
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   496
        sizehints->min_width = sizehints->max_width = window->w;
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   497
        sizehints->min_height = sizehints->max_height = window->h;
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   498
        sizehints->flags |= (PMaxSize | PMinSize);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   499
    }
6462
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   500
    sizehints->x = window->x;
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   501
    sizehints->y = window->y;
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   502
    sizehints->flags |= USPosition;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   503
6167
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   504
    /* Setup the input hints so we get keyboard input */
6462
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   505
    wmhints = XAllocWMHints();
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   506
    wmhints->input = True;
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   507
    wmhints->flags = InputHint;
6167
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   508
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   509
    /* Setup the class hints so we can get an icon (AfterStep) */
6462
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   510
    classhints = XAllocClassHint();
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   511
    classhints->res_name = data->classname;
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   512
    classhints->res_class = data->classname;
6167
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   513
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   514
    /* Set the size, input and class hints, and define WM_CLIENT_MACHINE and WM_LOCALE_NAME */
6462
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   515
    XSetWMProperties(display, w, NULL, NULL, NULL, 0, sizehints, wmhints, classhints);
6167
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   516
6462
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   517
    XFree(sizehints);
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   518
    XFree(wmhints);
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   519
    XFree(classhints);
6167
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   520
    /* Set the PID related to the window for the given hostname, if possible */
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   521
    if (data->pid > 0) {
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   522
        _NET_WM_PID = XInternAtom(display, "_NET_WM_PID", False);
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   523
        XChangeProperty(display, w, _NET_WM_PID, XA_CARDINAL, 32, PropModeReplace,
c071e1372341 X11: Move to XSetWMProperties and add support to _NET_WM_PID
Marco Trevisan (Treviño) <mail@3v1n0.net>
parents: 6138
diff changeset
   524
                        (unsigned char *)&data->pid, 1);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   525
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   526
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   527
    /* Set the window manager state */
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   528
    wmstate_count = X11_GetWMStateProperty(_this, window, wmstate_atoms);
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   529
    if (wmstate_count > 0) {
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   530
        XChangeProperty(display, w, data->_NET_WM_STATE, XA_ATOM, 32,
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   531
                        PropModeReplace,
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   532
                        (unsigned char *)wmstate_atoms, wmstate_count);
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   533
    } else {
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   534
        XDeleteProperty(display, w, data->_NET_WM_STATE);
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   535
    }
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   536
4521
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   537
    /* Let the window manager know we're a "normal" window */
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   538
    _NET_WM_WINDOW_TYPE = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False);
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   539
    _NET_WM_WINDOW_TYPE_NORMAL = XInternAtom(display, "_NET_WM_WINDOW_TYPE_NORMAL", False);
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   540
    XChangeProperty(display, w, _NET_WM_WINDOW_TYPE, XA_ATOM, 32,
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   541
                    PropModeReplace,
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   542
                    (unsigned char *)&_NET_WM_WINDOW_TYPE_NORMAL, 1);
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   543
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   544
    /* Allow the window to be deleted by the window manager */
4521
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   545
    XSetWMProtocols(display, w, &data->WM_DELETE_WINDOW, 1);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   546
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   547
    if (SetupWindowData(_this, window, w, SDL_TRUE) < 0) {
4521
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   548
        XDestroyWindow(display, w);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   549
        return -1;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   550
    }
5386
762e67f81fc7 Simplified the X11 window creation
Sam Lantinga <slouken@libsdl.org>
parents: 5305
diff changeset
   551
2325
c7bcf84ba1b9 Next version of internationalized input for X11. On my machine (famous last words :-) with a US English keyboard and locale I can compose ` and e and get a text
Bob Pendleton <bob@pendleton.com>
parents: 2324
diff changeset
   552
#ifdef X_HAVE_UTF8_STRING
6045
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   553
    if (SDL_X11_HAVE_UTF8) {
2325
c7bcf84ba1b9 Next version of internationalized input for X11. On my machine (famous last words :-) with a US English keyboard and locale I can compose ` and e and get a text
Bob Pendleton <bob@pendleton.com>
parents: 2324
diff changeset
   554
        pXGetICValues(((SDL_WindowData *) window->driverdata)->ic,
c7bcf84ba1b9 Next version of internationalized input for X11. On my machine (famous last words :-) with a US English keyboard and locale I can compose ` and e and get a text
Bob Pendleton <bob@pendleton.com>
parents: 2324
diff changeset
   555
                      XNFilterEvents, &fevent, NULL);
2718
abacf2555bb4 Removed unneccesary code lines. Fixed mousename bug. Added lacking code in mousebutton
Szymon Wilczek <kazeuser@gmail.com>
parents: 2710
diff changeset
   556
    }
2325
c7bcf84ba1b9 Next version of internationalized input for X11. On my machine (famous last words :-) with a US English keyboard and locale I can compose ` and e and get a text
Bob Pendleton <bob@pendleton.com>
parents: 2324
diff changeset
   557
#endif
c7bcf84ba1b9 Next version of internationalized input for X11. On my machine (famous last words :-) with a US English keyboard and locale I can compose ` and e and get a text
Bob Pendleton <bob@pendleton.com>
parents: 2324
diff changeset
   558
6316
a89c79a3f0cd 1.Moved all xinput2 functionality to its own file
Dimitris Zenios <dimitris.zenios@gmail.com>
parents: 6275
diff changeset
   559
    X11_Xinput2SelectTouch(_this, window);
a89c79a3f0cd 1.Moved all xinput2 functionality to its own file
Dimitris Zenios <dimitris.zenios@gmail.com>
parents: 6275
diff changeset
   560
6045
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   561
    XSelectInput(display, w,
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   562
                 (FocusChangeMask | EnterWindowMask | LeaveWindowMask |
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   563
                 ExposureMask | ButtonPressMask | ButtonReleaseMask |
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   564
                 PointerMotionMask | KeyPressMask | KeyReleaseMask |
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   565
                 PropertyChangeMask | StructureNotifyMask |
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   566
                 KeymapStateMask | fevent));
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   567
5031
5e3291605ad0 Added XFlush() so changes happen immediately instead of waiting for the next event loop.
Sam Lantinga <slouken@libsdl.org>
parents: 4937
diff changeset
   568
    XFlush(display);
5e3291605ad0 Added XFlush() so changes happen immediately instead of waiting for the next event loop.
Sam Lantinga <slouken@libsdl.org>
parents: 4937
diff changeset
   569
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   570
    return 0;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   571
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   572
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   573
int
2324
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   574
X11_CreateWindowFrom(_THIS, SDL_Window * window, const void *data)
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   575
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   576
    Window w = (Window) data;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   577
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   578
    window->title = X11_GetWindowTitle(_this, w);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   579
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   580
    if (SetupWindowData(_this, window, w, SDL_FALSE) < 0) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   581
        return -1;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   582
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   583
    return 0;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   584
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   585
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   586
char *
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   587
X11_GetWindowTitle(_THIS, Window xwindow)
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   588
{
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   589
    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   590
    Display *display = data->display;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   591
    int status, real_format;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   592
    Atom real_type;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   593
    unsigned long items_read, items_left;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   594
    unsigned char *propdata;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   595
    char *title = NULL;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   596
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   597
    status = XGetWindowProperty(display, xwindow, data->_NET_WM_NAME,
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   598
                0L, 8192L, False, data->UTF8_STRING, &real_type, &real_format,
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   599
                &items_read, &items_left, &propdata);
6023
6279958d571d XGetWindowProperty() can report success but still give you a NULL pointer.
Ryan C. Gordon <icculus@icculus.org>
parents: 5981
diff changeset
   600
    if (status == Success && propdata) {
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   601
        title = SDL_strdup(SDL_static_cast(char*, propdata));
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   602
        XFree(propdata);
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   603
    } else {
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   604
        status = XGetWindowProperty(display, xwindow, XA_WM_NAME,
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   605
                    0L, 8192L, False, XA_STRING, &real_type, &real_format,
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   606
                    &items_read, &items_left, &propdata);
6023
6279958d571d XGetWindowProperty() can report success but still give you a NULL pointer.
Ryan C. Gordon <icculus@icculus.org>
parents: 5981
diff changeset
   607
        if (status == Success && propdata) {
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   608
            title = SDL_iconv_string("UTF-8", "", SDL_static_cast(char*, propdata), items_read+1);
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   609
        } else {
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   610
            title = SDL_strdup("");
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   611
        }
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   612
    }
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   613
    return title;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   614
}
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   615
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   616
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   617
X11_SetWindowTitle(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   618
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   619
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   620
    Display *display = data->videodata->display;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   621
    XTextProperty titleprop, iconprop;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   622
    Status status;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   623
    const char *title = window->title;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   624
    const char *icon = NULL;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   625
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   626
#ifdef X_HAVE_UTF8_STRING
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   627
    Atom _NET_WM_NAME = data->videodata->_NET_WM_NAME;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   628
    Atom _NET_WM_ICON_NAME = data->videodata->_NET_WM_ICON_NAME;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   629
#endif
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   630
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   631
    if (title != NULL) {
2143
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   632
        char *title_locale = SDL_iconv_utf8_locale(title);
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   633
        if (!title_locale) {
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   634
            SDL_OutOfMemory();
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   635
            return;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   636
        }
2143
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   637
        status = XStringListToTextProperty(&title_locale, 1, &titleprop);
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   638
        SDL_free(title_locale);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   639
        if (status) {
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3241
diff changeset
   640
            XSetTextProperty(display, data->xwindow, &titleprop, XA_WM_NAME);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   641
            XFree(titleprop.value);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   642
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   643
#ifdef X_HAVE_UTF8_STRING
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   644
        if (SDL_X11_HAVE_UTF8) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   645
            status =
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   646
                Xutf8TextListToTextProperty(display, (char **) &title, 1,
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   647
                                            XUTF8StringStyle, &titleprop);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   648
            if (status == Success) {
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3241
diff changeset
   649
                XSetTextProperty(display, data->xwindow, &titleprop,
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   650
                                 _NET_WM_NAME);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   651
                XFree(titleprop.value);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   652
            }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   653
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   654
#endif
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   655
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   656
    if (icon != NULL) {
2143
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   657
        char *icon_locale = SDL_iconv_utf8_locale(icon);
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   658
        if (!icon_locale) {
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   659
            SDL_OutOfMemory();
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   660
            return;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   661
        }
2143
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   662
        status = XStringListToTextProperty(&icon_locale, 1, &iconprop);
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   663
        SDL_free(icon_locale);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   664
        if (status) {
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3241
diff changeset
   665
            XSetTextProperty(display, data->xwindow, &iconprop,
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   666
                             XA_WM_ICON_NAME);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   667
            XFree(iconprop.value);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   668
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   669
#ifdef X_HAVE_UTF8_STRING
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   670
        if (SDL_X11_HAVE_UTF8) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   671
            status =
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   672
                Xutf8TextListToTextProperty(display, (char **) &icon, 1,
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   673
                                            XUTF8StringStyle, &iconprop);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   674
            if (status == Success) {
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3241
diff changeset
   675
                XSetTextProperty(display, data->xwindow, &iconprop,
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   676
                                 _NET_WM_ICON_NAME);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   677
                XFree(iconprop.value);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   678
            }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   679
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   680
#endif
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   681
    }
5031
5e3291605ad0 Added XFlush() so changes happen immediately instead of waiting for the next event loop.
Sam Lantinga <slouken@libsdl.org>
parents: 4937
diff changeset
   682
    XFlush(display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   683
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   684
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   685
void
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   686
X11_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   687
{
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   688
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   689
    Display *display = data->videodata->display;
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   690
    Atom _NET_WM_ICON = data->videodata->_NET_WM_ICON;
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   691
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   692
    if (icon) {
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   693
        SDL_PixelFormat format;
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   694
        SDL_Surface *surface;
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   695
        int propsize;
4528
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   696
        long *propdata;
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   697
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   698
        /* Convert the icon to ARGB for modern window managers */
5288
d4381f3b0d1e A few fixes:
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   699
        SDL_InitFormat(&format, SDL_PIXELFORMAT_ARGB8888);
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   700
        surface = SDL_ConvertSurface(icon, &format, 0);
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   701
        if (!surface) {
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   702
            return;
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   703
        }
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   704
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   705
        /* Set the _NET_WM_ICON property */
2990
Sam Lantinga <slouken@libsdl.org>
parents: 2967
diff changeset
   706
        propsize = 2 + (icon->w * icon->h);
4566
40c833d951a1 Fixed memory corruption on AMD64
Sam Lantinga <slouken@libsdl.org>
parents: 4555
diff changeset
   707
        propdata = SDL_malloc(propsize * sizeof(long));
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   708
        if (propdata) {
4528
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   709
            int x, y;
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   710
            Uint32 *src;
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   711
            long *dst;
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   712
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   713
            propdata[0] = icon->w;
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   714
            propdata[1] = icon->h;
4528
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   715
            dst = &propdata[2];
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   716
            for (y = 0; y < icon->h; ++y) {
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   717
                src = (Uint32*)((Uint8*)surface->pixels + y * surface->pitch);
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   718
                for (x = 0; x < icon->w; ++x) {
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   719
                    *dst++ = *src++;
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   720
                }
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   721
            }
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3241
diff changeset
   722
            XChangeProperty(display, data->xwindow, _NET_WM_ICON, XA_CARDINAL,
2990
Sam Lantinga <slouken@libsdl.org>
parents: 2967
diff changeset
   723
                            32, PropModeReplace, (unsigned char *) propdata,
Sam Lantinga <slouken@libsdl.org>
parents: 2967
diff changeset
   724
                            propsize);
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   725
        }
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   726
        SDL_FreeSurface(surface);
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   727
    } else {
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3241
diff changeset
   728
        XDeleteProperty(display, data->xwindow, _NET_WM_ICON);
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   729
    }
5031
5e3291605ad0 Added XFlush() so changes happen immediately instead of waiting for the next event loop.
Sam Lantinga <slouken@libsdl.org>
parents: 4937
diff changeset
   730
    XFlush(display);
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   731
}
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   732
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   733
void
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   734
X11_SetWindowPosition(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   735
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   736
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   737
    Display *display = data->videodata->display;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   738
5478
6b65ff3cee62 Fixed bug 1167 (SDL_WINDOWPOS_CENTERED doesn't work if used right after fullscreen -> windowed switch)
Sam Lantinga <slouken@libsdl.org>
parents: 5466
diff changeset
   739
    XMoveWindow(display, data->xwindow, window->x, window->y);
5031
5e3291605ad0 Added XFlush() so changes happen immediately instead of waiting for the next event loop.
Sam Lantinga <slouken@libsdl.org>
parents: 4937
diff changeset
   740
    XFlush(display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   741
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   742
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   743
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   744
X11_SetWindowSize(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   745
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   746
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   747
    Display *display = data->videodata->display;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   748
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   749
    if (SDL_IsShapedWindow(window)) {
4782
b6930aefd008 Finished X11 shaped-window functionality and removed ellipse+polygon rendering.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 3697
diff changeset
   750
        X11_ResizeWindowShape(window);
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   751
    }
5531
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   752
    if (!(window->flags & SDL_WINDOW_RESIZABLE)) {
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   753
         /* Apparently, if the X11 Window is set to a 'non-resizable' window, you cannot resize it using the XResizeWindow, thus
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   754
            we must set the size hints to adjust the window size.*/
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   755
         XSizeHints *sizehints = XAllocSizeHints();
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   756
         long userhints;
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   757
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   758
         XGetWMNormalHints(display, data->xwindow, sizehints, &userhints);
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   759
6343
e94f912d20b9 Fix SDL_SetWindowSize with X11 non-RESIZABLE windows, patch by Pierre-Loup.
Sam Lantinga <slouken@libsdl.org>
parents: 6336
diff changeset
   760
         sizehints->min_width = sizehints->max_width = window->w;
5531
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   761
         sizehints->min_height = sizehints->max_height = window->h;
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   762
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   763
         XSetWMNormalHints(display, data->xwindow, sizehints);
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   764
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   765
         XFree(sizehints);
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   766
    } else {
5531
477f550f6efd Fixed setting programmatically setting the size of a window on X11 for non-resizable windows.
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   767
        XResizeWindow(display, data->xwindow, window->w, window->h);
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   768
    }
5031
5e3291605ad0 Added XFlush() so changes happen immediately instead of waiting for the next event loop.
Sam Lantinga <slouken@libsdl.org>
parents: 4937
diff changeset
   769
    XFlush(display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   770
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   771
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   772
void
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   773
X11_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered)
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   774
{
6423
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   775
    const SDL_bool focused = ((window->flags & SDL_WINDOW_INPUT_FOCUS) != 0);
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   776
    const SDL_bool visible = ((window->flags & SDL_WINDOW_HIDDEN) == 0);
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   777
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   778
    SDL_DisplayData *displaydata =
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   779
        (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   780
    Display *display = data->videodata->display;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   781
    XEvent event;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   782
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   783
    SetWindowBordered(display, displaydata->screen, data->xwindow, bordered);
6423
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   784
    XFlush(display);
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   785
    XIfEvent(display, &event, &isConfigureNotify, (XPointer)&data->xwindow);
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   786
6423
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   787
    if (visible) {
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   788
        XWindowAttributes attr;
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   789
        do {
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   790
            XSync(display, False);
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   791
            XGetWindowAttributes(display, data->xwindow, &attr);
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   792
        } while (attr.map_state != IsViewable);
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   793
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   794
        if (focused) {
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   795
            XSetInputFocus(display, data->xwindow, RevertToParent, CurrentTime);
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   796
        }
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   797
    }
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   798
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   799
    /* make sure these don't make it to the real event queue if they fired here. */
6423
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   800
    XSync(display, False);
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   801
    XCheckIfEvent(display, &event, &isUnmapNotify, (XPointer)&data->xwindow);
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   802
    XCheckIfEvent(display, &event, &isMapNotify, (XPointer)&data->xwindow);
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   803
}
6336
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   804
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   805
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   806
X11_ShowWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   807
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   808
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   809
    Display *display = data->videodata->display;
6336
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   810
    XEvent event;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   811
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3241
diff changeset
   812
    XMapRaised(display, data->xwindow);
6336
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   813
    /* Blocking wait for "MapNotify" event.
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   814
     * We use XIfEvent because XWindowEvent takes a mask rather than a type, 
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   815
     * and XCheckTypedWindowEvent doesn't block */
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   816
    XIfEvent(display, &event, &isMapNotify, (XPointer)&data->xwindow);
5031
5e3291605ad0 Added XFlush() so changes happen immediately instead of waiting for the next event loop.
Sam Lantinga <slouken@libsdl.org>
parents: 4937
diff changeset
   817
    XFlush(display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   818
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   819
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   820
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   821
X11_HideWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   822
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   823
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   824
    Display *display = data->videodata->display;
6336
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   825
    XEvent event;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   826
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3241
diff changeset
   827
    XUnmapWindow(display, data->xwindow);
6336
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   828
    /* Blocking wait for "UnmapNotify" event */
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   829
    XIfEvent(display, &event, &isUnmapNotify, (XPointer)&data->xwindow);    
5031
5e3291605ad0 Added XFlush() so changes happen immediately instead of waiting for the next event loop.
Sam Lantinga <slouken@libsdl.org>
parents: 4937
diff changeset
   830
    XFlush(display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   831
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   832
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   833
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   834
X11_RaiseWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   835
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   836
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   837
    Display *display = data->videodata->display;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   838
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3241
diff changeset
   839
    XRaiseWindow(display, data->xwindow);
5031
5e3291605ad0 Added XFlush() so changes happen immediately instead of waiting for the next event loop.
Sam Lantinga <slouken@libsdl.org>
parents: 4937
diff changeset
   840
    XFlush(display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   841
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   842
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   843
static void
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   844
SetWindowMaximized(_THIS, SDL_Window * window, SDL_bool maximized)
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   845
{
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   846
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   847
    SDL_DisplayData *displaydata =
5246
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   848
        (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata;
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   849
    Display *display = data->videodata->display;
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   850
    Atom _NET_WM_STATE = data->videodata->_NET_WM_STATE;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   851
    Atom _NET_WM_STATE_MAXIMIZED_VERT = data->videodata->_NET_WM_STATE_MAXIMIZED_VERT;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   852
    Atom _NET_WM_STATE_MAXIMIZED_HORZ = data->videodata->_NET_WM_STATE_MAXIMIZED_HORZ;
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   853
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   854
    if (X11_IsWindowMapped(_this, window)) {
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   855
        XEvent e;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   856
4524
a256e1dadf3f Zero any fields not explicitly filled in.
Sam Lantinga <slouken@libsdl.org>
parents: 4522
diff changeset
   857
        SDL_zero(e);
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   858
        e.xany.type = ClientMessage;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   859
        e.xclient.message_type = _NET_WM_STATE;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   860
        e.xclient.format = 32;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   861
        e.xclient.window = data->xwindow;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   862
        e.xclient.data.l[0] =
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   863
            maximized ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   864
        e.xclient.data.l[1] = _NET_WM_STATE_MAXIMIZED_VERT;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   865
        e.xclient.data.l[2] = _NET_WM_STATE_MAXIMIZED_HORZ;
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   866
        e.xclient.data.l[3] = 0l;
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   867
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   868
        XSendEvent(display, RootWindow(display, displaydata->screen), 0,
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   869
                   SubstructureNotifyMask | SubstructureRedirectMask, &e);
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   870
    } else {
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   871
        int count;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   872
        Uint32 flags;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   873
        Atom atoms[5];
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   874
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   875
        flags = window->flags;
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   876
        if (maximized) {
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   877
            flags |= SDL_WINDOW_MAXIMIZED;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   878
        } else {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   879
            flags &= ~SDL_WINDOW_MAXIMIZED;
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   880
        }
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   881
        count = X11_GetWMStateProperty(_this, flags, atoms);
4522
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   882
        if (count > 0) {
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   883
            XChangeProperty(display, data->xwindow, _NET_WM_STATE, XA_ATOM, 32,
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   884
                            PropModeReplace, (unsigned char *)atoms, count);
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   885
        } else {
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   886
            XDeleteProperty(display, data->xwindow, _NET_WM_STATE);
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   887
        }
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   888
    }
5031
5e3291605ad0 Added XFlush() so changes happen immediately instead of waiting for the next event loop.
Sam Lantinga <slouken@libsdl.org>
parents: 4937
diff changeset
   889
    XFlush(display);
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   890
}
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   891
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   892
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   893
X11_MaximizeWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   894
{
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   895
    SetWindowMaximized(_this, window, SDL_TRUE);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   896
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   897
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   898
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   899
X11_MinimizeWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   900
{
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   901
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   902
    SDL_DisplayData *displaydata =
5246
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   903
        (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata;
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   904
    Display *display = data->videodata->display;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   905
 
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4510
diff changeset
   906
    XIconifyWindow(display, data->xwindow, displaydata->screen);
5031
5e3291605ad0 Added XFlush() so changes happen immediately instead of waiting for the next event loop.
Sam Lantinga <slouken@libsdl.org>
parents: 4937
diff changeset
   907
    XFlush(display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   908
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   909
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   910
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   911
X11_RestoreWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   912
{
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   913
    SetWindowMaximized(_this, window, SDL_FALSE);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   914
    X11_ShowWindow(_this, window);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   915
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   916
6467
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   917
/* This asks the Window Manager to handle fullscreen for us. Most don't do it right, though. */
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   918
static void
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   919
X11_SetWindowFullscreenViaWM(_THIS, SDL_Window * window, SDL_VideoDisplay * _display, SDL_bool fullscreen)
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   920
{
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   921
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
5305
75f5ff92ad08 Fixed a host of issues with Windows fullscreen modes. Toggling fullscreen OpenGL works now in my test environment.
Sam Lantinga <slouken@libsdl.org>
parents: 5302
diff changeset
   922
    SDL_DisplayData *displaydata = (SDL_DisplayData *) _display->driverdata;
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   923
    Display *display = data->videodata->display;
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   924
    Atom _NET_WM_STATE = data->videodata->_NET_WM_STATE;
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   925
    Atom _NET_WM_STATE_FULLSCREEN = data->videodata->_NET_WM_STATE_FULLSCREEN;
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   926
    Atom _NET_WM_ACTION_FULLSCREEN = data->videodata->_NET_WM_ACTION_FULLSCREEN;
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   927
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   928
    if (X11_IsWindowMapped(_this, window)) {
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   929
        XEvent e;
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   930
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   931
        if (!X11_IsActionAllowed(window, _NET_WM_ACTION_FULLSCREEN)) {
6466
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   932
            /* We aren't allowed to go into fullscreen mode... */
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   933
            if ((window->flags & SDL_WINDOW_RESIZABLE) == 0) {
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   934
                /* ...and we aren't resizable. Compiz refuses fullscreen toggle in this case. */
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   935
                XSizeHints *sizehints = XAllocSizeHints();
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   936
                long flags = 0;
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   937
                XGetWMNormalHints(display, data->xwindow, sizehints, &flags);
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   938
                /* set the resize flags on */
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   939
                sizehints->flags |= PMinSize | PMaxSize;
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   940
                if (fullscreen) {
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   941
                    /* we are going fullscreen so turn the flags off */
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   942
                    sizehints->flags ^= (PMinSize | PMaxSize);
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   943
                } else {
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   944
                    /* Reset the min/max width height to make the window non-resizable again */
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   945
                    sizehints->min_width = sizehints->max_width = window->w;
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   946
                    sizehints->min_height = sizehints->max_height = window->h;
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   947
                }
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   948
                XSetWMNormalHints(display, data->xwindow, sizehints);
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   949
                XFree(sizehints);
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   950
            }
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   951
        }
ebe165c00fab On Compiz (etc?), _NET_WM_ACTION_FULLSCREEN needs the window to be resizable.
Ryan C. Gordon <icculus@icculus.org>
parents: 6462
diff changeset
   952
        
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   953
        SDL_zero(e);
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   954
        e.xany.type = ClientMessage;
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   955
        e.xclient.message_type = _NET_WM_STATE;
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   956
        e.xclient.format = 32;
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   957
        e.xclient.window = data->xwindow;
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   958
        e.xclient.data.l[0] =
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   959
            fullscreen ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE;
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   960
        e.xclient.data.l[1] = _NET_WM_STATE_FULLSCREEN;
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   961
        e.xclient.data.l[3] = 0l;
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   962
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   963
        XSendEvent(display, RootWindow(display, displaydata->screen), 0,
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   964
                   SubstructureNotifyMask | SubstructureRedirectMask, &e);
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   965
    } else {
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   966
        int count;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   967
        Uint32 flags;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   968
        Atom atoms[5];
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   969
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   970
        flags = window->flags;
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   971
        if (fullscreen) {
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   972
            flags |= SDL_WINDOW_FULLSCREEN;
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   973
        } else {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   974
            flags &= ~SDL_WINDOW_FULLSCREEN;
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   975
        }
6481
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6480
diff changeset
   976
        count = X11_GetWMStateProperty(_this, flags, atoms);
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   977
        if (count > 0) {
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   978
            XChangeProperty(display, data->xwindow, _NET_WM_STATE, XA_ATOM, 32,
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   979
                            PropModeReplace, (unsigned char *)atoms, count);
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   980
        } else {
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   981
            XDeleteProperty(display, data->xwindow, _NET_WM_STATE);
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   982
        }
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   983
    }
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   984
    XFlush(display);
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   985
}
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   986
6467
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   987
static __inline__ int
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   988
maxint(const int a, const int b)
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   989
{
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   990
    return (a > b ? a : b);
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   991
}
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   992
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   993
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   994
/* This handles fullscreen itself, outside the Window Manager. */
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   995
static void
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   996
X11_BeginWindowFullscreenLegacy(_THIS, SDL_Window * window, SDL_VideoDisplay * _display)
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   997
{
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   998
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
   999
    SDL_DisplayData *displaydata = (SDL_DisplayData *) _display->driverdata;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1000
    Visual *visual = data->visual;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1001
    Display *display = data->videodata->display;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1002
    const int screen = displaydata->screen;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1003
    Window root = RootWindow(display, screen);
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1004
    const int def_vis = (visual == DefaultVisual(display, screen));
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1005
    unsigned long xattrmask = 0;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1006
    XSetWindowAttributes xattr;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1007
    XEvent ev;
6475
71d39944810b Fixed fullscreen origin for multi-head displays
Sam Lantinga <slouken@libsdl.org>
parents: 6473
diff changeset
  1008
    SDL_Rect rect;
6467
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1009
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1010
    if ( data->fswindow ) {
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1011
        return;  /* already fullscreen, I hope. */
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1012
    }
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1013
6475
71d39944810b Fixed fullscreen origin for multi-head displays
Sam Lantinga <slouken@libsdl.org>
parents: 6473
diff changeset
  1014
    X11_GetDisplayBounds(_this, _display, &rect);
71d39944810b Fixed fullscreen origin for multi-head displays
Sam Lantinga <slouken@libsdl.org>
parents: 6473
diff changeset
  1015
6467
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1016
    SDL_zero(xattr);
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1017
    xattr.override_redirect = True;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1018
    xattrmask |= CWOverrideRedirect;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1019
    xattr.background_pixel = def_vis ? BlackPixel(display, screen) : 0;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1020
    xattrmask |= CWBackPixel;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1021
    xattr.border_pixel = 0;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1022
    xattrmask |= CWBorderPixel;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1023
    xattr.colormap = data->colormap;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1024
    xattrmask |= CWColormap;
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
  1025
6475
71d39944810b Fixed fullscreen origin for multi-head displays
Sam Lantinga <slouken@libsdl.org>
parents: 6473
diff changeset
  1026
    data->fswindow = XCreateWindow(display, root,