src/video/x11/SDL_x11window.c
author Sam Lantinga <slouken@libsdl.org>
Fri, 27 Sep 2013 23:47:57 -0700
changeset 7750 48acb5c00c4b
parent 7741 199d77d7bf1c
child 7808 627f256b0e56
permissions -rw-r--r--
Fixed bug 2101 - CWBackPixel causes weird window flickering on window resize aBothe I tried to experiment a bit with SDL2 and OpenGL today and noticed that something caused some weird flickering when resizing my nicely drawn SDL2/OpenGL window: Just after resizing, the background went black and I had to let my OpenGL code redraw the contents.. However, after some hours spent with googling I found out that in OpenGL examples where this CWBackPixel flag was not used when creating X windows, there was no flickering while resizing the window. See http://www.sbin.org/doc/Xlib/chapt_04.html @ "The Window Background" for more info.
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
6885
700f1b25f77f Happy New Year!
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
     3
  Copyright (C) 1997-2013 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
7523
9e9ab1dc3811 Fixed bug 1919 - Window icon disappears as soon as a renderer is created
Sam Lantinga <slouken@libsdl.org>
parents: 7522
diff changeset
    25
#include "SDL_assert.h"
6662
698c2e533a7e SDL no longer grabs the keyboard by default on X11.
Sam Lantinga <slouken@libsdl.org>
parents: 6638
diff changeset
    26
#include "SDL_hints.h"
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    27
#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
    28
#include "../SDL_pixels_c.h"
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    29
#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
    30
#include "../../events/SDL_mouse_c.h"
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    31
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    32
#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
    33
#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
    34
#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
    35
#include "SDL_x11xinput2.h"
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    36
7659
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
    37
#if SDL_VIDEO_OPENGL_EGL
3161
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
    38
#include "SDL_x11opengles.h"
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
    39
#endif
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
    40
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
    41
#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
    42
#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
    43
#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
    44
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
    45
#define _NET_WM_STATE_REMOVE    0l
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
    46
#define _NET_WM_STATE_ADD       1l
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
    47
#define _NET_WM_STATE_TOGGLE    2l
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
    48
6467
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    49
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
    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
    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
    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
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
    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
    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
    56
}
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    57
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
    58
{
6480
d02a4369b3f5 Hopefully improved legacy fullscreen handling (it works now on my Ubuntu Unity system)
Sam Lantinga <slouken@libsdl.org>
parents: 6479
diff changeset
    59
    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
    60
}
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
    61
7632
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    62
/*
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    63
static Bool
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    64
XIfEventTimeout(Display *display, XEvent *event_return, Bool (*predicate)(), XPointer arg, int timeoutMS)
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    65
{
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    66
    Uint32 start = SDL_GetTicks();
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    67
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    68
    while (!XCheckIfEvent(display, event_return, predicate, arg)) {
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    69
        if ((SDL_GetTicks() - start) >= timeoutMS) {
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    70
            return False;
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    71
        }
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    72
    }
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    73
    return True;
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    74
}
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    75
*/
d6a8fa507a45 Fixed bug 2027 - Full-screen appears to be broken - hang in SDL_DestroyWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 7617
diff changeset
    76
6467
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    77
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
    78
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
    79
{
ec5a04e921d4 X11: Attempt to go fullscreen the way SDL 1.2 did it.
Ryan C. Gordon <icculus@icculus.org>
parents: 6466
diff changeset
    80
    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
    81
    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
    82
}
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
    83
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
    84
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
    85
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
    86
{
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
    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
    88
    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
    89
    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
    90
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    91
    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
    92
    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
    93
        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
    94
    } 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
    95
        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
    96
    }
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    97
}
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
    98
6540
44459e2f6e4d Fix the size to the windowed mode, not the fullscreen mode.
Sam Lantinga <slouken@libsdl.org>
parents: 6539
diff changeset
    99
#if 0
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
   100
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
   101
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
   102
{
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
   103
    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
   104
    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
   105
    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
   106
    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
   107
    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
   108
    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
   109
    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
   110
    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
   111
    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
   112
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
    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
   114
    {
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
        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
   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
            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
   118
                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
   119
                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
   120
            }
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
        }
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
        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
   123
    }
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
    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
   125
}
6540
44459e2f6e4d Fix the size to the windowed mode, not the fullscreen mode.
Sam Lantinga <slouken@libsdl.org>
parents: 6539
diff changeset
   126
#endif /* 0 */
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
   127
6487
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   128
void
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   129
X11_SetNetWMState(_THIS, Window xwindow, Uint32 flags)
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
   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
    SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
6487
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   132
    Display *display = videodata->display;
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   133
    Atom _NET_WM_STATE = videodata->_NET_WM_STATE;
7678
286c42d7c5ed OCD fixes: Adds a space after /* (glory to regular expressions!)
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7677
diff changeset
   134
    /* Atom _NET_WM_STATE_HIDDEN = videodata->_NET_WM_STATE_HIDDEN; */
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
   135
    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
   136
    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
   137
    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
   138
    Atom _NET_WM_STATE_FULLSCREEN = videodata->_NET_WM_STATE_FULLSCREEN;
6487
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   139
    Atom atoms[5];
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
    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
   141
6486
e3264eea9607 Don't set the hidden netwm state, that would mean we don't want to be shown, which is bad.
Sam Lantinga <slouken@libsdl.org>
parents: 6485
diff changeset
   142
    /* The window manager sets this property, we shouldn't set it.
e3264eea9607 Don't set the hidden netwm state, that would mean we don't want to be shown, which is bad.
Sam Lantinga <slouken@libsdl.org>
parents: 6485
diff changeset
   143
       If we did, this would indicate to the window manager that we don't
e3264eea9607 Don't set the hidden netwm state, that would mean we don't want to be shown, which is bad.
Sam Lantinga <slouken@libsdl.org>
parents: 6485
diff changeset
   144
       actually want to be mapped during XMapRaised(), which would be bad.
e3264eea9607 Don't set the hidden netwm state, that would mean we don't want to be shown, which is bad.
Sam Lantinga <slouken@libsdl.org>
parents: 6485
diff changeset
   145
     *
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
   146
    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
   147
        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
   148
    }
6486
e3264eea9607 Don't set the hidden netwm state, that would mean we don't want to be shown, which is bad.
Sam Lantinga <slouken@libsdl.org>
parents: 6485
diff changeset
   149
    */
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
   150
    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
   151
        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
   152
    }
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
   153
    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
   154
        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
   155
        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
   156
    }
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
    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
   158
        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
   159
    }
6487
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   160
    if (count > 0) {
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   161
        XChangeProperty(display, xwindow, _NET_WM_STATE, XA_ATOM, 32,
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   162
                        PropModeReplace, (unsigned char *)atoms, count);
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   163
    } else {
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   164
        XDeleteProperty(display, xwindow, _NET_WM_STATE);
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   165
    }
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
   166
}
a4da6b906abb Fixed setting fullscreen and maximized states for windows that haven't been mapped yet.
Sam Lantinga <slouken@libsdl.org>
parents: 4521
diff changeset
   167
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
   168
Uint32
6487
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   169
X11_GetNetWMState(_THIS, Window xwindow)
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
   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
    SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
6487
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   172
    Display *display = videodata->display;
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
   173
    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
   174
    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
   175
    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
   176
    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
   177
    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
   178
    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
   179
    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
   180
    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
   181
    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
   182
    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
   183
    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
   184
    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
   185
6487
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   186
    if (XGetWindowProperty(display, xwindow, _NET_WM_STATE,
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
   187
                           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
   188
                           &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
   189
                           &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
   190
        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
   191
        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
   192
        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
   193
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
        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
   195
            if (atoms[i] == _NET_WM_STATE_HIDDEN) {
6486
e3264eea9607 Don't set the hidden netwm state, that would mean we don't want to be shown, which is bad.
Sam Lantinga <slouken@libsdl.org>
parents: 6485
diff changeset
   196
                flags |= SDL_WINDOW_HIDDEN;
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
   197
            } 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
   198
                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
   199
            } 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
   200
                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
   201
            } 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
   202
                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
   203
            } 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
   204
                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
   205
            }
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
   206
        }
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
   207
        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
   208
            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
   209
        }  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
   210
            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
   211
        }
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
   212
        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
   213
    }
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
6484
b904bb684095 Don't base our resizable state on what the window manager decided, instead we want to base it on the size hints which we set.
Sam Lantinga <slouken@libsdl.org>
parents: 6483
diff changeset
   215
    /* FIXME, check the size hints for resizable */
7678
286c42d7c5ed OCD fixes: Adds a space after /* (glory to regular expressions!)
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7677
diff changeset
   216
    /* flags |= SDL_WINDOW_RESIZABLE; */
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
   217
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
   218
    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
   219
}
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
   220
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   221
static int
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   222
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
   223
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   224
    SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   225
    SDL_WindowData *data;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   226
    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
   227
    int windowlistlength = videodata->windowlistlength;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   228
    SDL_WindowData **windowlist = videodata->windowlist;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   229
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   230
    /* Allocate the window data */
2323
4ac07ae446d3 Fixed many valgrind errors. But, I broke testdyngl.
Bob Pendleton <bob@pendleton.com>
parents: 2322
diff changeset
   231
    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
   232
    if (!data) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7007
diff changeset
   233
        return SDL_OutOfMemory();
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   234
    }
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
   235
    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
   236
    data->xwindow = w;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   237
#ifdef X_HAVE_UTF8_STRING
7007
2381f4d531d1 Fixed XIM crash when locale is set to something not supported by X11.
Sam Lantinga <slouken@libsdl.org>
parents: 7001
diff changeset
   238
    if (SDL_X11_HAVE_UTF8 && videodata->im) {
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   239
        data->ic =
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   240
            pXCreateIC(videodata->im, XNClientWindow, w, XNFocusWindow, w,
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   241
                       XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   242
                       XNResourceName, videodata->classname, XNResourceClass,
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   243
                       videodata->classname, NULL);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   244
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   245
#endif
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   246
    data->created = created;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   247
    data->videodata = videodata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   248
2323
4ac07ae446d3 Fixed many valgrind errors. But, I broke testdyngl.
Bob Pendleton <bob@pendleton.com>
parents: 2322
diff changeset
   249
    /* 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
   250
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   251
    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
   252
        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
   253
        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
   254
    } 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
   255
        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
   256
            (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
   257
                                            (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
   258
                                             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
   259
        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
   260
            SDL_free(data);
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7007
diff changeset
   261
            return SDL_OutOfMemory();
2323
4ac07ae446d3 Fixed many valgrind errors. But, I broke testdyngl.
Bob Pendleton <bob@pendleton.com>
parents: 2322
diff changeset
   262
        }
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
   263
        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
   264
        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
   265
        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
   266
        videodata->windowlist = windowlist;
2323
4ac07ae446d3 Fixed many valgrind errors. But, I broke testdyngl.
Bob Pendleton <bob@pendleton.com>
parents: 2322
diff changeset
   267
    }
4ac07ae446d3 Fixed many valgrind errors. But, I broke testdyngl.
Bob Pendleton <bob@pendleton.com>
parents: 2322
diff changeset
   268
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   269
    /* 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
   270
    {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   271
        XWindowAttributes attrib;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   272
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   273
        XGetWindowAttributes(data->videodata->display, w, &attrib);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   274
        window->x = attrib.x;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   275
        window->y = attrib.y;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   276
        window->w = attrib.width;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   277
        window->h = attrib.height;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   278
        if (attrib.map_state != IsUnmapped) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   279
            window->flags |= SDL_WINDOW_SHOWN;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   280
        } else {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   281
            window->flags &= ~SDL_WINDOW_SHOWN;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   282
        }
5182
073b86030262 Added the X11 framebuffer implementation. Simple! :)
Sam Lantinga <slouken@libsdl.org>
parents: 5088
diff changeset
   283
        data->visual = attrib.visual;
5466
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   284
        data->colormap = attrib.colormap;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   285
    }
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   286
6487
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   287
    window->flags |= X11_GetNetWMState(_this, w);
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   288
6024
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   289
    {
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   290
        Window FocalWindow;
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   291
        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
   292
        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
   293
        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
   294
        {
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   295
            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
   296
        }
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
   297
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
   298
        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
   299
            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
   300
        }
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   301
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   302
        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
   303
            /* 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
   304
        }
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   305
    }
38e2f4644548 Set up window focus correctly when using an existing X11 window.
Ryan C. Gordon <icculus@icculus.org>
parents: 6023
diff changeset
   306
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   307
    /* All done! */
6487
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   308
    window->driverdata = data;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   309
    return 0;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   310
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   311
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   312
static void
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   313
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
   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
     * 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
   317
     *  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
   318
     *  Gnome is similar: just use the Motif atom.
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   319
     */
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   320
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   321
    Atom WM_HINTS = XInternAtom(display, "_MOTIF_WM_HINTS", True);
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   322
    if (WM_HINTS != None) {
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   323
        /* Hints used by Motif compliant window managers */
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   324
        struct
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   325
        {
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   326
            unsigned long flags;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   327
            unsigned long functions;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   328
            unsigned long decorations;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   329
            long input_mode;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   330
            unsigned long status;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   331
        } MWMHints = {
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   332
            (1L << 1), 0, border ? 1 : 0, 0, 0
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   333
        };
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   334
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   335
        XChangeProperty(display, window, WM_HINTS, WM_HINTS, 32,
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   336
                        PropModeReplace, (unsigned char *) &MWMHints,
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   337
                        sizeof(MWMHints) / 4);
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   338
    } else {  /* set the transient hints instead, if necessary */
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   339
        XSetTransientForHint(display, window, RootWindow(display, screen));
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   340
    }
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   341
}
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   342
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   343
int
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   344
X11_CreateWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   345
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   346
    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   347
    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
   348
        (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata;
7683
f7c061286490 Fixed crash if the IC isn't set up for some reason (bad X11 locale?)
Sam Lantinga <slouken@libsdl.org>
parents: 7678
diff changeset
   349
    SDL_WindowData *windowdata;
4521
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   350
    Display *display = data->display;
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   351
    int screen = displaydata->screen;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   352
    Visual *visual;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   353
    int depth;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   354
    XSetWindowAttributes xattr;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   355
    Window w;
6462
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   356
    XSizeHints *sizehints;
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   357
    XWMHints *wmhints;
5e09ac1aba80 allocate *Hint structures per Xlib docs
Edward Rudd <urkle@outoforder.cc>
parents: 6423
diff changeset
   358
    XClassHint *classhints;
7490
fc864efbc1a6 Add support for the _NET_WM_BYPASS_COMPOSITOR hint
Jasper St. Pierre <jstpierre@mecheye.net>
parents: 7445
diff changeset
   359
    const long _NET_WM_BYPASS_COMPOSITOR_HINT_ON = 1;
fc864efbc1a6 Add support for the _NET_WM_BYPASS_COMPOSITOR hint
Jasper St. Pierre <jstpierre@mecheye.net>
parents: 7445
diff changeset
   360
    Atom _NET_WM_BYPASS_COMPOSITOR;
4521
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   361
    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
   362
    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
   363
    Atom _NET_WM_PID;
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6970
diff changeset
   364
    Atom XdndAware, xdnd_version = 5;
6045
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   365
    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
   366
7659
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   367
#if SDL_VIDEO_OPENGL_GLX || SDL_VIDEO_OPENGL_EGL
7737
e9d463cb5b49 [SDL] X11+GL: Allow Visual override for GL windows.
pgriffais@spaceport
parents: 7723
diff changeset
   368
    if ((window->flags & SDL_WINDOW_OPENGL) &&
e9d463cb5b49 [SDL] X11+GL: Allow Visual override for GL windows.
pgriffais@spaceport
parents: 7723
diff changeset
   369
        !SDL_getenv("SDL_VIDEO_X11_VISUALID")) {
7723
aea98cc3e696 Fixes bug #2040, prepare SDL_GL_CONTEXT_EGL for deprecation on v2.1
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7683
diff changeset
   370
        XVisualInfo *vinfo = NULL;
1952
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   371
7659
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   372
#if SDL_VIDEO_OPENGL_EGL
7723
aea98cc3e696 Fixes bug #2040, prepare SDL_GL_CONTEXT_EGL for deprecation on v2.1
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7683
diff changeset
   373
        if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES && 
aea98cc3e696 Fixes bug #2040, prepare SDL_GL_CONTEXT_EGL for deprecation on v2.1
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7683
diff changeset
   374
            ( !_this->gl_data || ! _this->gl_data->HAS_GLX_EXT_create_context_es2_profile )) {
6369
a92fbd27127b Fix OpenGL initialization when OpenGL and OpenGLES are both available.
Sam Lantinga <slouken@libsdl.org>
parents: 6343
diff changeset
   375
            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
   376
        } else
a92fbd27127b Fix OpenGL initialization when OpenGL and OpenGLES are both available.
Sam Lantinga <slouken@libsdl.org>
parents: 6343
diff changeset
   377
#endif
a92fbd27127b Fix OpenGL initialization when OpenGL and OpenGLES are both available.
Sam Lantinga <slouken@libsdl.org>
parents: 6343
diff changeset
   378
        {
6370
93187f7f7d5d Improved simultaneous support for OpenGL and OpenGL ES
Sam Lantinga <slouken@libsdl.org>
parents: 6369
diff changeset
   379
#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
   380
            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
   381
#endif
1952
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   382
        }
7723
aea98cc3e696 Fixes bug #2040, prepare SDL_GL_CONTEXT_EGL for deprecation on v2.1
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7683
diff changeset
   383
3161
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   384
        if (!vinfo) {
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   385
            return -1;
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   386
        }
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   387
        visual = vinfo->visual;
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   388
        depth = vinfo->depth;
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   389
        XFree(vinfo);
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   390
    } else
494559cc723b OpenPandora support added by David Carré
Sam Lantinga <slouken@libsdl.org>
parents: 3078
diff changeset
   391
#endif
1952
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   392
    {
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   393
        visual = displaydata->visual;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   394
        depth = displaydata->depth;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   395
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   396
5386
762e67f81fc7 Simplified the X11 window creation
Sam Lantinga <slouken@libsdl.org>
parents: 5305
diff changeset
   397
    xattr.override_redirect = False;
7750
48acb5c00c4b Fixed bug 2101 - CWBackPixel causes weird window flickering on window resize
Sam Lantinga <slouken@libsdl.org>
parents: 7741
diff changeset
   398
    xattr.background_pixmap = None;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   399
    xattr.border_pixel = 0;
5466
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
    if (visual->class == DirectColor) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   402
        XColor *colorcells;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   403
        int i;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   404
        int ncolors;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   405
        int rmax, gmax, bmax;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   406
        int rmask, gmask, bmask;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   407
        int rshift, gshift, bshift;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   408
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   409
        xattr.colormap =
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   410
            XCreateColormap(display, RootWindow(display, screen),
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   411
                            visual, AllocAll);
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
        /* 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
   414
        if (!xattr.colormap) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7007
diff changeset
   415
            return SDL_SetError("Could not create writable colormap");
5466
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   416
        }
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   417
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   418
        /* 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
   419
        colorcells = SDL_malloc(visual->map_entries * sizeof(XColor));
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   420
        if (!colorcells) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7007
diff changeset
   421
            return SDL_OutOfMemory();
5466
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   422
        }
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   423
        ncolors = visual->map_entries;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   424
        rmax = 0xffff;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   425
        gmax = 0xffff;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   426
        bmax = 0xffff;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   427
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   428
        rshift = 0;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   429
        rmask = visual->red_mask;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   430
        while (0 == (rmask & 1)) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   431
            rshift++;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   432
            rmask >>= 1;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   433
        }
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   434
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   435
        gshift = 0;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   436
        gmask = visual->green_mask;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   437
        while (0 == (gmask & 1)) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   438
            gshift++;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   439
            gmask >>= 1;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   440
        }
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
        bshift = 0;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   443
        bmask = visual->blue_mask;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   444
        while (0 == (bmask & 1)) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   445
            bshift++;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   446
            bmask >>= 1;
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
        /* build the color table pixel values */
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   450
        for (i = 0; i < ncolors; i++) {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   451
            Uint32 red = (rmax * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   452
            Uint32 green = (gmax * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   453
            Uint32 blue = (bmax * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   454
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   455
            Uint32 rbits = (rmask * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   456
            Uint32 gbits = (gmask * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   457
            Uint32 bbits = (bmask * i) / (ncolors - 1);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   458
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   459
            Uint32 pix =
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   460
                (rbits << rshift) | (gbits << gshift) | (bbits << bshift);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   461
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   462
            colorcells[i].pixel = pix;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   463
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   464
            colorcells[i].red = red;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   465
            colorcells[i].green = green;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   466
            colorcells[i].blue = blue;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   467
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   468
            colorcells[i].flags = DoRed | DoGreen | DoBlue;
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   469
        }
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   470
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   471
        XStoreColors(display, xattr.colormap, colorcells, ncolors);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   472
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   473
        SDL_free(colorcells);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   474
    } else {
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   475
        xattr.colormap =
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   476
            XCreateColormap(display, RootWindow(display, screen),
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   477
                            visual, AllocNone);
006883d5fa51 Gamma support is back!
Sam Lantinga <slouken@libsdl.org>
parents: 5386
diff changeset
   478
    }
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   479
5386
762e67f81fc7 Simplified the X11 window creation
Sam Lantinga <slouken@libsdl.org>
parents: 5305
diff changeset
   480
    w = XCreateWindow(display, RootWindow(display, screen),
762e67f81fc7 Simplified the X11 window creation
Sam Lantinga <slouken@libsdl.org>
parents: 5305
diff changeset
   481
                      window->x, window->y, window->w, window->h,
762e67f81fc7 Simplified the X11 window creation
Sam Lantinga <slouken@libsdl.org>
parents: 5305
diff changeset
   482
                      0, depth, InputOutput, visual,
7750
48acb5c00c4b Fixed bug 2101 - CWBackPixel causes weird window flickering on window resize
Sam Lantinga <slouken@libsdl.org>
parents: 7741
diff changeset
   483
                      (CWOverrideRedirect | CWBackPixmap | CWBorderPixel |
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   484
                       CWColormap), &xattr);
1952
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   485
    if (!w) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7007
diff changeset
   486
        return SDL_SetError("Couldn't create window");
1952
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
   487
    }
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 */
6487
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6486
diff changeset
   528
    X11_SetNetWMState(_this, w, window->flags);
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
   529
4521
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   530
    /* 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
   531
    _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
   532
    _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
   533
    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
   534
                    PropModeReplace,
50125e8aab94 Let the window manager know we're a "normal" window
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   535
                    (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
   536
7490
fc864efbc1a6 Add support for the _NET_WM_BYPASS_COMPOSITOR hint
Jasper St. Pierre <jstpierre@mecheye.net>
parents: 7445
diff changeset
   537
    _NET_WM_BYPASS_COMPOSITOR = XInternAtom(display, "_NET_WM_BYPASS_COMPOSITOR", False);
fc864efbc1a6 Add support for the _NET_WM_BYPASS_COMPOSITOR hint
Jasper St. Pierre <jstpierre@mecheye.net>
parents: 7445
diff changeset
   538
    XChangeProperty(display, w, _NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32,
fc864efbc1a6 Add support for the _NET_WM_BYPASS_COMPOSITOR hint
Jasper St. Pierre <jstpierre@mecheye.net>
parents: 7445
diff changeset
   539
                    PropModeReplace,
fc864efbc1a6 Add support for the _NET_WM_BYPASS_COMPOSITOR hint
Jasper St. Pierre <jstpierre@mecheye.net>
parents: 7445
diff changeset
   540
                    (unsigned char *)&_NET_WM_BYPASS_COMPOSITOR_HINT_ON, 1);
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7037
diff changeset
   541
6638
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6575
diff changeset
   542
    {
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6575
diff changeset
   543
        Atom protocols[] = {
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6575
diff changeset
   544
            data->WM_DELETE_WINDOW, /* Allow window to be deleted by the WM */
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6575
diff changeset
   545
            data->_NET_WM_PING, /* Respond so WM knows we're alive */
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6575
diff changeset
   546
        };
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6575
diff changeset
   547
        XSetWMProtocols(display, w, protocols, sizeof (protocols) / sizeof (protocols[0]));
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6575
diff changeset
   548
    }
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   549
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   550
    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
   551
        XDestroyWindow(display, w);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   552
        return -1;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   553
    }
7683
f7c061286490 Fixed crash if the IC isn't set up for some reason (bad X11 locale?)
Sam Lantinga <slouken@libsdl.org>
parents: 7678
diff changeset
   554
    windowdata = (SDL_WindowData *) window->driverdata;
5386
762e67f81fc7 Simplified the X11 window creation
Sam Lantinga <slouken@libsdl.org>
parents: 5305
diff changeset
   555
7659
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   556
#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
7723
aea98cc3e696 Fixes bug #2040, prepare SDL_GL_CONTEXT_EGL for deprecation on v2.1
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7683
diff changeset
   557
    if ((window->flags & SDL_WINDOW_OPENGL) && 
aea98cc3e696 Fixes bug #2040, prepare SDL_GL_CONTEXT_EGL for deprecation on v2.1
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7683
diff changeset
   558
        _this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES && 
aea98cc3e696 Fixes bug #2040, prepare SDL_GL_CONTEXT_EGL for deprecation on v2.1
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7683
diff changeset
   559
        (!_this->gl_data || ! _this->gl_data->HAS_GLX_EXT_create_context_es2_profile) ) {
7659
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   560
        if (!_this->egl_data) {
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   561
            XDestroyWindow(display, w);
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   562
            return -1;
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   563
        }
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   564
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   565
        /* Create the GLES window surface */
7683
f7c061286490 Fixed crash if the IC isn't set up for some reason (bad X11 locale?)
Sam Lantinga <slouken@libsdl.org>
parents: 7678
diff changeset
   566
        windowdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) w);
7659
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   567
7683
f7c061286490 Fixed crash if the IC isn't set up for some reason (bad X11 locale?)
Sam Lantinga <slouken@libsdl.org>
parents: 7678
diff changeset
   568
        if (windowdata->egl_surface == EGL_NO_SURFACE) {
7659
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   569
            XDestroyWindow(display, w);
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   570
            return SDL_SetError("Could not create GLES window surface");
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   571
        }
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   572
    }
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   573
#endif
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   574
    
ac4ce59c40e7 Fixes bug #2037, common EGL code for Android and X11
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7632
diff changeset
   575
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
   576
#ifdef X_HAVE_UTF8_STRING
7683
f7c061286490 Fixed crash if the IC isn't set up for some reason (bad X11 locale?)
Sam Lantinga <slouken@libsdl.org>
parents: 7678
diff changeset
   577
    if (SDL_X11_HAVE_UTF8 && windowdata->ic) {
f7c061286490 Fixed crash if the IC isn't set up for some reason (bad X11 locale?)
Sam Lantinga <slouken@libsdl.org>
parents: 7678
diff changeset
   578
        pXGetICValues(windowdata->ic, 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
   579
    }
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
   580
#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
   581
6316
a89c79a3f0cd 1.Moved all xinput2 functionality to its own file
Dimitris Zenios <dimitris.zenios@gmail.com>
parents: 6275
diff changeset
   582
    X11_Xinput2SelectTouch(_this, window);
a89c79a3f0cd 1.Moved all xinput2 functionality to its own file
Dimitris Zenios <dimitris.zenios@gmail.com>
parents: 6275
diff changeset
   583
6045
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   584
    XSelectInput(display, w,
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   585
                 (FocusChangeMask | EnterWindowMask | LeaveWindowMask |
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   586
                 ExposureMask | ButtonPressMask | ButtonReleaseMask |
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   587
                 PointerMotionMask | KeyPressMask | KeyReleaseMask |
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   588
                 PropertyChangeMask | StructureNotifyMask |
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   589
                 KeymapStateMask | fevent));
b8e995dab018 Fix crash on X servers without UTF-8 support.
Ryan C. Gordon <icculus@icculus.org>
parents: 6024
diff changeset
   590
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6970
diff changeset
   591
    XdndAware = XInternAtom(display, "XdndAware", False);
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6970
diff changeset
   592
    XChangeProperty(display, w, XdndAware, XA_ATOM, 32,
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6970
diff changeset
   593
                 PropModeReplace,
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7037
diff changeset
   594
                 (unsigned char*)&xdnd_version, 1);
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6970
diff changeset
   595
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
   596
    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
   597
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   598
    return 0;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   599
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   600
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   601
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
   602
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
   603
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   604
    Window w = (Window) data;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   605
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
   606
    window->title = X11_GetWindowTitle(_this, w);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   607
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   608
    if (SetupWindowData(_this, window, w, SDL_FALSE) < 0) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   609
        return -1;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   610
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   611
    return 0;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   612
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   613
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
   614
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
   615
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
   616
{
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
   617
    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
   618
    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
   619
    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
   620
    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
   621
    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
   622
    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
   623
    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
   624
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
   625
    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
   626
                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
   627
                &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
   628
    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
   629
        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
   630
        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
   631
    } 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
   632
        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
   633
                    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
   634
                    &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
   635
        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
   636
            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
   637
        } 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
   638
            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
   639
        }
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
   640
    }
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
   641
    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
   642
}
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
   643
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   644
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   645
X11_SetWindowTitle(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   646
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   647
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   648
    Display *display = data->videodata->display;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   649
    XTextProperty titleprop, iconprop;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   650
    Status status;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   651
    const char *title = window->title;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   652
    const char *icon = NULL;
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
#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
   655
    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
   656
    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
   657
#endif
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   658
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   659
    if (title != NULL) {
2143
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   660
        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
   661
        if (!title_locale) {
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   662
            SDL_OutOfMemory();
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   663
            return;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   664
        }
2143
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   665
        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
   666
        SDL_free(title_locale);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   667
        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
   668
            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
   669
            XFree(titleprop.value);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   670
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   671
#ifdef X_HAVE_UTF8_STRING
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   672
        if (SDL_X11_HAVE_UTF8) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   673
            status =
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   674
                Xutf8TextListToTextProperty(display, (char **) &title, 1,
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   675
                                            XUTF8StringStyle, &titleprop);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   676
            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
   677
                XSetTextProperty(display, data->xwindow, &titleprop,
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   678
                                 _NET_WM_NAME);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   679
                XFree(titleprop.value);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   680
            }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   681
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   682
#endif
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
    if (icon != NULL) {
2143
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   685
        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
   686
        if (!icon_locale) {
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   687
            SDL_OutOfMemory();
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   688
            return;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   689
        }
2143
e906da4414a3 Fix for bug #447 merged from SDL 1.2
Sam Lantinga <slouken@libsdl.org>
parents: 1956
diff changeset
   690
        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
   691
        SDL_free(icon_locale);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   692
        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
   693
            XSetTextProperty(display, data->xwindow, &iconprop,
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   694
                             XA_WM_ICON_NAME);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   695
            XFree(iconprop.value);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   696
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   697
#ifdef X_HAVE_UTF8_STRING
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   698
        if (SDL_X11_HAVE_UTF8) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   699
            status =
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   700
                Xutf8TextListToTextProperty(display, (char **) &icon, 1,
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   701
                                            XUTF8StringStyle, &iconprop);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   702
            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
   703
                XSetTextProperty(display, data->xwindow, &iconprop,
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   704
                                 _NET_WM_ICON_NAME);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   705
                XFree(iconprop.value);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   706
            }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   707
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   708
#endif
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   709
    }
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
   710
    XFlush(display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   711
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   712
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   713
void
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   714
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
   715
{
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   716
    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
   717
    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
   718
    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
   719
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   720
    if (icon) {
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   721
        int propsize;
4528
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   722
        long *propdata;
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   723
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   724
        /* Set the _NET_WM_ICON property */
7523
9e9ab1dc3811 Fixed bug 1919 - Window icon disappears as soon as a renderer is created
Sam Lantinga <slouken@libsdl.org>
parents: 7522
diff changeset
   725
        SDL_assert(icon->format->format == SDL_PIXELFORMAT_ARGB8888);
2990
Sam Lantinga <slouken@libsdl.org>
parents: 2967
diff changeset
   726
        propsize = 2 + (icon->w * icon->h);
4566
40c833d951a1 Fixed memory corruption on AMD64
Sam Lantinga <slouken@libsdl.org>
parents: 4555
diff changeset
   727
        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
   728
        if (propdata) {
4528
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   729
            int x, y;
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   730
            Uint32 *src;
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   731
            long *dst;
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   732
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   733
            propdata[0] = icon->w;
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   734
            propdata[1] = icon->h;
4528
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   735
            dst = &propdata[2];
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   736
            for (y = 0; y < icon->h; ++y) {
7523
9e9ab1dc3811 Fixed bug 1919 - Window icon disappears as soon as a renderer is created
Sam Lantinga <slouken@libsdl.org>
parents: 7522
diff changeset
   737
                src = (Uint32*)((Uint8*)icon->pixels + y * icon->pitch);
4528
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   738
                for (x = 0; x < icon->w; ++x) {
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   739
                    *dst++ = *src++;
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   740
                }
f06faa886423 Fixed bug 1022
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   741
            }
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
   742
            XChangeProperty(display, data->xwindow, _NET_WM_ICON, XA_CARDINAL,
2990
Sam Lantinga <slouken@libsdl.org>
parents: 2967
diff changeset
   743
                            32, PropModeReplace, (unsigned char *) propdata,
Sam Lantinga <slouken@libsdl.org>
parents: 2967
diff changeset
   744
                            propsize);
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   745
        }
6562
c52863165594 Fixed memory leak in X11_SetWindowIcon().
Ryan C. Gordon <icculus@icculus.org>
parents: 6541
diff changeset
   746
        SDL_free(propdata);
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   747
    } 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
   748
        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
   749
    }
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
   750
    XFlush(display);
2967
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   751
}
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   752
e4a469d6ddab Implemented SDL_SetWindowIcon(), with translucent icon support under X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2945
diff changeset
   753
void
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   754
X11_SetWindowPosition(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   755
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   756
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   757
    Display *display = data->videodata->display;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   758
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
   759
    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
   760
    XFlush(display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   761
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   762
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   763
void
7617
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   764
X11_SetWindowMinimumSize(_THIS, SDL_Window * window)
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   765
{
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   766
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   767
    Display *display = data->videodata->display;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   768
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   769
    if (window->flags & SDL_WINDOW_RESIZABLE) {
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   770
         XSizeHints *sizehints = XAllocSizeHints();
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   771
         long userhints;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   772
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   773
         XGetWMNormalHints(display, data->xwindow, sizehints, &userhints);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   774
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   775
         sizehints->min_width = window->min_w;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   776
         sizehints->min_height = window->min_h;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   777
         sizehints->flags |= PMinSize;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   778
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   779
         XSetWMNormalHints(display, data->xwindow, sizehints);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   780
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   781
         XFree(sizehints);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   782
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   783
        /* See comment in X11_SetWindowSize. */
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   784
        XResizeWindow(display, data->xwindow, window->w, window->h);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   785
        XMoveWindow(display, data->xwindow, window->x, window->y);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   786
        XRaiseWindow(display, data->xwindow);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   787
    }
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   788
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   789
    XFlush(display);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   790
}
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   791
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   792
void
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   793
X11_SetWindowMaximumSize(_THIS, SDL_Window * window)
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   794
{
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   795
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   796
    Display *display = data->videodata->display;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   797
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   798
    if (window->flags & SDL_WINDOW_RESIZABLE) {
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   799
         XSizeHints *sizehints = XAllocSizeHints();
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   800
         long userhints;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   801
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   802
         XGetWMNormalHints(display, data->xwindow, sizehints, &userhints);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   803
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   804
         sizehints->max_width = window->max_w;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   805
         sizehints->max_height = window->max_h;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   806
         sizehints->flags |= PMaxSize;
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   807
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   808
         XSetWMNormalHints(display, data->xwindow, sizehints);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   809
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   810
         XFree(sizehints);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   811
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   812
        /* See comment in X11_SetWindowSize. */
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   813
        XResizeWindow(display, data->xwindow, window->w, window->h);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   814
        XMoveWindow(display, data->xwindow, window->x, window->y);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   815
        XRaiseWindow(display, data->xwindow);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   816
    }
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   817
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   818
    XFlush(display);
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   819
}
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   820
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   821
void
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   822
X11_SetWindowSize(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   823
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   824
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   825
    Display *display = data->videodata->display;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   826
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
   827
    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
   828
        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
   829
    }
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
   830
    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
   831
         /* Apparently, if the X11 Window is set to a 'non-resizable' window, you cannot resize it using the XResizeWindow, thus
7677
871d43c6968a OCD fixes: Adds a space before */
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7659
diff changeset
   832
            we must set the size hints to adjust the window size. */
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
   833
         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
   834
         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
   835
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
   836
         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
   837
6343
e94f912d20b9 Fix SDL_SetWindowSize with X11 non-RESIZABLE windows, patch by Pierre-Loup.
Sam Lantinga <slouken@libsdl.org>
parents: 6336
diff changeset
   838
         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
   839
         sizehints->min_height = sizehints->max_height = window->h;
7617
918703f5cff8 Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!)
Sam Lantinga <slouken@libsdl.org>
parents: 7566
diff changeset
   840
         sizehints->flags |= PMinSize | PMaxSize;
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
   841
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
   842
         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
   843
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
   844
         XFree(sizehints);
6541
be103236441d Poke window managers to get them to respect the resize hints.
Sam Lantinga <slouken@libsdl.org>
parents: 6540
diff changeset
   845
be103236441d Poke window managers to get them to respect the resize hints.
Sam Lantinga <slouken@libsdl.org>
parents: 6540
diff changeset
   846
        /* From Pierre-Loup:
6899
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   847
           WMs each have their little quirks with that.  When you change the
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   848
           size hints, they get a ConfigureNotify event with the
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   849
           WM_NORMAL_SIZE_HINTS Atom.  They all save the hints then, but they
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   850
           don't all resize the window right away to enforce the new hints.
6541
be103236441d Poke window managers to get them to respect the resize hints.
Sam Lantinga <slouken@libsdl.org>
parents: 6540
diff changeset
   851
6899
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   852
           Some of them resize only after:
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   853
            - A user-initiated move or resize
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   854
            - A code-initiated move or resize
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   855
            - Hiding & showing window (Unmap & map)
6541
be103236441d Poke window managers to get them to respect the resize hints.
Sam Lantinga <slouken@libsdl.org>
parents: 6540
diff changeset
   856
6899
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   857
           The following move & resize seems to help a lot of WMs that didn't
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   858
           properly update after the hints were changed. We don't do a
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   859
           hide/show, because there are supposedly subtle problems with doing so
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   860
           and transitioning from windowed to fullscreen in Unity.
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   861
         */
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   862
        XResizeWindow(display, data->xwindow, window->w, window->h);
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   863
        XMoveWindow(display, data->xwindow, window->x, window->y);
6541
be103236441d Poke window managers to get them to respect the resize hints.
Sam Lantinga <slouken@libsdl.org>
parents: 6540
diff changeset
   864
        XRaiseWindow(display, data->xwindow);
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
   865
    } 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
   866
        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
   867
    }
6899
f75b1bd8eabc Fix SDL_SetWindowSize on certain WMs.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 6885
diff changeset
   868
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
   869
    XFlush(display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   870
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   871
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   872
void
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   873
X11_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered)
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   874
{
6423
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   875
    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
   876
    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
   877
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   878
    SDL_DisplayData *displaydata =
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   879
        (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   880
    Display *display = data->videodata->display;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   881
    XEvent event;
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   882
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   883
    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
   884
    XFlush(display);
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   885
    XIfEvent(display, &event, &isConfigureNotify, (XPointer)&data->xwindow);
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   886
6423
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   887
    if (visible) {
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   888
        XWindowAttributes attr;
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   889
        do {
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   890
            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
   891
            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
   892
        } 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
   893
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   894
        if (focused) {
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   895
            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
   896
        }
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   897
    }
339c0ccf6250 Make the X11 SetBordered event tapdancing more robust, restore focus, etc.
Ryan C. Gordon <icculus@icculus.org>
parents: 6422
diff changeset
   898
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   899
    /* 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
   900
    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
   901
    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
   902
    XCheckIfEvent(display, &event, &isMapNotify, (XPointer)&data->xwindow);
6422
fd0ac1b56115 Added SDL_SetWindowBordered() API.
Ryan C. Gordon <icculus@icculus.org>
parents: 6373
diff changeset
   903
}
6336
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   904
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   905
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   906
X11_ShowWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   907
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   908
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   909
    Display *display = data->videodata->display;
6336
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   910
    XEvent event;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   911
6483
4b51ff3dcf74 Only map/unmap if the window isn't already in the correct state.
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   912
    if (!X11_IsWindowMapped(_this, window)) {
4b51ff3dcf74 Only map/unmap if the window isn't already in the correct state.
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   913
        XMapRaised(display, data->xwindow);
4b51ff3dcf74 Only map/unmap if the window isn't already in the correct state.
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   914
        /* Blocking wait for "MapNotify" event.
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7037
diff changeset
   915
         * We use XIfEvent because XWindowEvent takes a mask rather than a type,
6483
4b51ff3dcf74 Only map/unmap if the window isn't already in the correct state.
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   916
         * and XCheckTypedWindowEvent doesn't block */
4b51ff3dcf74 Only map/unmap if the window isn't already in the correct state.
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   917
        XIfEvent(display, &event, &isMapNotify, (XPointer)&data->xwindow);
4b51ff3dcf74 Only map/unmap if the window isn't already in the correct state.
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   918
        XFlush(display);
4b51ff3dcf74 Only map/unmap if the window isn't already in the correct state.
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   919
    }
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   920
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   921
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   922
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   923
X11_HideWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   924
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   925
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7522
b186724247dd Fixed bug 1526 - X11 - XUnmapWindow should not be called directly
Sam Lantinga <slouken@libsdl.org>
parents: 7490
diff changeset
   926
    SDL_DisplayData *displaydata = (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   927
    Display *display = data->videodata->display;
6336
6e6163b6ba69 Fixed issue with tiling window managers (bug 1246)
Sam Lantinga <slouken@libsdl.org>
parents: 6331
diff changeset
   928
    XEvent event;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   929
6483
4b51ff3dcf74 Only map/unmap if the window isn't already in the correct state.
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   930
    if (X11_IsWindowMapped(_this, window)) {
7522
b186724247dd Fixed bug 1526 - X11 - XUnmapWindow should not be called directly
Sam Lantinga <slouken@libsdl.org>
parents: 7490
diff changeset
   931
        XWithdrawWindow(display, data->xwindow, displaydata->screen);
6483
4b51ff3dcf74 Only map/unmap if the window isn't already in the correct state.
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   932
        /* Blocking wait for "UnmapNotify" event */
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7037
diff changeset
   933
        XIfEvent(display, &event, &isUnmapNotify, (XPointer)&data->xwindow);
6483
4b51ff3dcf74 Only map/unmap if the window isn't already in the correct state.
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   934
        XFlush(display);
4b51ff3dcf74 Only map/unmap if the window isn't already in the correct state.
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   935
    }
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   936
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   937
7741
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   938
static void
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   939
SetWindowActive(_THIS, SDL_Window * window)
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   940
{
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   941
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   942
    SDL_DisplayData *displaydata =
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   943
        (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata;
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   944
    Display *display = data->videodata->display;
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   945
    Atom _NET_ACTIVE_WINDOW = data->videodata->_NET_ACTIVE_WINDOW;
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   946
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   947
    if (X11_IsWindowMapped(_this, window)) {
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   948
        XEvent e;
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   949
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   950
        SDL_zero(e);
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   951
        e.xany.type = ClientMessage;
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   952
        e.xclient.message_type = _NET_ACTIVE_WINDOW;
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   953
        e.xclient.format = 32;
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   954
        e.xclient.window = data->xwindow;
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   955
        e.xclient.data.l[0] = 1;  /* source indication. 1 = application */
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   956
        e.xclient.data.l[1] = CurrentTime;
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   957
        e.xclient.data.l[2] = 0;
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   958
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   959
        XSendEvent(display, RootWindow(display, displaydata->screen), 0,
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   960
                   SubstructureNotifyMask | SubstructureRedirectMask, &e);
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   961
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   962
        XFlush(display);
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   963
    }
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   964
}
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   965
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   966
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   967
X11_RaiseWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   968
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   969
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   970
    Display *display = data->videodata->display;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   971
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
   972
    XRaiseWindow(display, data->xwindow);
7741
199d77d7bf1c Fix X11_RestoreWindow() and X11_RaiseWindow() to properly do window activation.
Sam Lantinga <slouken@libsdl.org>
parents: 7737
diff changeset
   973
    SetWindowActive(_this, window);
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
   974
    XFlush(display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   975
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   976
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   977
static void
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   978
SetWindowMaximized(_THIS, SDL_Window * window, SDL_bool maximized)
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   979
{
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   980
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   981
    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
   982
        (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata;
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
   983
    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
   984
    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
   985
    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
   986
    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
   987
7566
b14d00c30095 Some fixes for SDL_MaximizeWindow().
Ryan C. Gordon <icculus@icculus.org>
parents: 7523
diff changeset
   988
    if (maximized) {
b14d00c30095 Some fixes for SDL_MaximizeWindow().
Ryan C. Gordon <icculus@icculus.org>
parents: 7523
diff changeset
   989
        window->flags |= SDL_WINDOW_MAXIMIZED;
b14d00c30095 Some fixes for SDL_MaximizeWindow().
Ryan C. Gordon <icculus@icculus.org>
parents: 7523
diff changeset
   990
    } else {
b14d00c30095 Some fixes for SDL_MaximizeWindow().
Ryan C. Gordon <icculus@icculus.org>
parents: 7523
diff changeset
   991
        window->flags &= ~SDL_WINDOW_MAXIMIZED;
b14d00c30095 Some fixes for SDL_MaximizeWindow().
Ryan C. Gordon <icculus@icculus.org>
parents: 7523
diff changeset
   992
    }
b14d00c30095 Some fixes for SDL_MaximizeWindow().
Ryan C. Gordon <icculus@icculus.org>
parents: 7523
diff changeset
   993
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
   994
    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
   995
        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
   996
4524
a256e1dadf3f Zero any fields not explicitly filled in.
Sam Lantinga <slouken@libsdl.org>
parents: 4522
diff changeset
   997
        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
   998
        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
   999
        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
  1000
        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
  1001
        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
  1002
        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
  1003
            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
  1004
        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
  1005
        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
  1006
        e.xclient.data.l[3] = 0l;
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
  1007
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
  1008
        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
  1009
                   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
  1010
    } else {
7566
b14d00c30095 Some fixes for SDL_MaximizeWindow().
Ryan C. Gordon <icculus@icculus.org>
parents: 7523
diff changeset
  1011
        X11_SetNetWMState(_this, data->xwindow, 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
  1012
    }
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
  1013
    XFlush(display);
3077
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
  1014
}
9b58f26ede81 Implemented X11 maximized state control
Sam Lantinga <slouken@libsdl.org>
parents: 3057
diff changeset
  1015
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1016
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1017
X11_MaximizeWindow(_THIS, SDL_Window * window)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1018
{
5302
b1b9ec9874ba Implemented X11 fullscreen toggling with modern window managers
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
  1019
    SetWindowMaximized(_this, window, SDL_TRUE);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1020
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1021
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1022
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1023
X11_MinimizeWindow(_THIS, SDL_Window * window)
</