src/video/x11/SDL_x11events.c
author Sam Lantinga <slouken@libsdl.org>
Sun, 20 Oct 2013 09:58:37 -0700
changeset 7839 d2804f8153fe
parent 7838 909b0d7fe4dd
child 7857 6388f5229bb7
permissions -rw-r--r--
Fixed compiling with the new X11 symbol wrapping
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: 5530
diff changeset
     2
  Simple DirectMedia Layer
6885
700f1b25f77f Happy New Year!
Sam Lantinga <slouken@libsdl.org>
parents: 6817
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: 5530
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: 5530
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: 5530
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: 5530
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: 5530
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: 5530
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: 5530
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: 5530
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: 5530
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: 5530
diff changeset
    16
     appreciated but is not required.
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5530
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: 5530
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: 5530
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: 5408
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: 5408
diff changeset
    24
2046
da8332c8f480 Replaced strncmp for SDL_VIDEODRIVER test with strcasecmp
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
    25
#include <sys/types.h>
da8332c8f480 Replaced strncmp for SDL_VIDEODRIVER test with strcasecmp
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
    26
#include <sys/time.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: 4429
diff changeset
    27
#include <signal.h>
2046
da8332c8f480 Replaced strncmp for SDL_VIDEODRIVER test with strcasecmp
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
    28
#include <unistd.h>
4558
4d95152d9e39 Applied the same logic as the fix for bug 894.
Sam Lantinga <slouken@libsdl.org>
parents: 4556
diff changeset
    29
#include <limits.h> /* For INT_MAX */
2046
da8332c8f480 Replaced strncmp for SDL_VIDEODRIVER test with strcasecmp
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
    30
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    31
#include "SDL_x11video.h"
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
    32
#include "SDL_x11video.h"
4934
a5b86644c208 Fixed compiling X11 touch interface
Sam Lantinga <slouken@libsdl.org>
parents: 4902
diff changeset
    33
#include "SDL_x11touch.h"
6316
a89c79a3f0cd 1.Moved all xinput2 functionality to its own file
Dimitris Zenios <dimitris.zenios@gmail.com>
parents: 6311
diff changeset
    34
#include "SDL_x11xinput2.h"
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    35
#include "../../events/SDL_events_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: 2859
diff changeset
    36
#include "../../events/SDL_mouse_c.h"
4642
057e8762d2a1 Added reading of event* for touch events.
Jim Grandpre <jim.tla@gmail.com>
parents: 4640
diff changeset
    37
#include "../../events/SDL_touch_c.h"
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    38
4465
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 4429
diff changeset
    39
#include "SDL_timer.h"
3241
08c5964f2a34 Fixed a few issues compiling with Mac OS X 10.6
Sam Lantinga <slouken@libsdl.org>
parents: 3195
diff changeset
    40
#include "SDL_syswm.h"
08c5964f2a34 Fixed a few issues compiling with Mac OS X 10.6
Sam Lantinga <slouken@libsdl.org>
parents: 3195
diff changeset
    41
4642
057e8762d2a1 Added reading of event* for touch events.
Jim Grandpre <jim.tla@gmail.com>
parents: 4640
diff changeset
    42
#include <stdio.h>
057e8762d2a1 Added reading of event* for touch events.
Jim Grandpre <jim.tla@gmail.com>
parents: 4640
diff changeset
    43
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    44
typedef struct {
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
    45
    unsigned char *data;
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
    46
    int format, count;
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
    47
    Atom type;
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    48
} SDL_x11Prop;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    49
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    50
/* Reads property
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
    51
   Must call X11_XFree on results
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    52
 */
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
    53
static void X11_ReadProperty(SDL_x11Prop *p, Display *disp, Window w, Atom prop)
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    54
{
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    55
    unsigned char *ret=NULL;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    56
    Atom type;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    57
    int fmt;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    58
    unsigned long count;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    59
    unsigned long bytes_left;
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
    60
    int bytes_fetch = 0;
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
    61
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    62
    do {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
    63
        if (ret != 0) X11_XFree(ret);
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
    64
        X11_XGetWindowProperty(disp, w, prop, 0, bytes_fetch, False, AnyPropertyType, &type, &fmt, &count, &bytes_left, &ret);
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    65
        bytes_fetch += bytes_left;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    66
    } while (bytes_left != 0);
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
    67
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    68
    p->data=ret;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    69
    p->format=fmt;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    70
    p->count=count;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    71
    p->type=type;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    72
}
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    73
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    74
/* Find text-uri-list in a list of targets and return it's atom
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    75
   if available, else return None */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    76
static Atom X11_PickTarget(Display *disp, Atom list[], int list_count)
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    77
{
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    78
    Atom request = None;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    79
    char *name;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    80
    int i;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    81
    for (i=0; i < list_count && request == None; i++) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
    82
        name = X11_XGetAtomName(disp, list[i]);
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    83
        if (strcmp("text/uri-list", name)==0) request = list[i];
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
    84
        X11_XFree(name);
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    85
    }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    86
    return request;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    87
}
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    88
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    89
/* Wrapper for X11_PickTarget for a maximum of three targets, a special
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    90
   case in the Xdnd protocol */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    91
static Atom X11_PickTargetFromAtoms(Display *disp, Atom a0, Atom a1, Atom a2)
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    92
{
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    93
    int count=0;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    94
    Atom atom[3];
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    95
    if (a0 != None) atom[count++] = a0;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    96
    if (a1 != None) atom[count++] = a1;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    97
    if (a2 != None) atom[count++] = a2;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    98
    return X11_PickTarget(disp, atom, count);
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
    99
}
7678
286c42d7c5ed OCD fixes: Adds a space after /* (glory to regular expressions!)
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7677
diff changeset
   100
/* #define DEBUG_XEVENTS */
6474
39087ac884d7 Added debug define (commented out)
Sam Lantinga <slouken@libsdl.org>
parents: 6432
diff changeset
   101
7475
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   102
struct KeyRepeatCheckData
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   103
{
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   104
    XEvent *event;
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   105
    SDL_bool found;
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   106
};
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   107
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   108
static Bool X11_KeyRepeatCheckIfEvent(Display *display, XEvent *chkev,
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   109
    XPointer arg)
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   110
{
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   111
    struct KeyRepeatCheckData *d = (struct KeyRepeatCheckData *) arg;
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   112
    if (chkev->type == KeyPress &&
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   113
        chkev->xkey.keycode == d->event->xkey.keycode &&
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   114
        chkev->xkey.time - d->event->xkey.time < 2)
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   115
        d->found = SDL_TRUE;
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   116
    return False;
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   117
}
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   118
4565
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   119
/* Check to see if this is a repeated key.
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   120
   (idea shamelessly lifted from GII -- thanks guys! :)
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   121
 */
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   122
static SDL_bool X11_KeyRepeat(Display *display, XEvent *event)
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   123
{
7475
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   124
    XEvent dummyev;
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   125
    struct KeyRepeatCheckData d;
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   126
    d.event = event;
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   127
    d.found = SDL_FALSE;
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   128
    if (X11_XPending(display))
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   129
        X11_XCheckIfEvent(display, &dummyev, X11_KeyRepeatCheckIfEvent,
7475
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   130
            (XPointer) &d);
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   131
    return d.found;
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   132
}
4565
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   133
7475
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   134
static Bool X11_IsWheelCheckIfEvent(Display *display, XEvent *chkev,
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   135
    XPointer arg)
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   136
{
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   137
    XEvent *event = (XEvent *) arg;
7749
6073ad385c9b # User Darren Salt <devspam@moreofthesa.me.uk>
Sam Lantinga <slouken@libsdl.org>
parents: 7679
diff changeset
   138
    /* we only handle buttons 4 and 5 - false positive avoidance */
7475
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   139
    if (chkev->type == ButtonRelease &&
7749
6073ad385c9b # User Darren Salt <devspam@moreofthesa.me.uk>
Sam Lantinga <slouken@libsdl.org>
parents: 7679
diff changeset
   140
        (event->xbutton.button == Button4 || event->xbutton.button == Button5) &&
7475
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   141
        chkev->xbutton.button == event->xbutton.button &&
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   142
        chkev->xbutton.time == event->xbutton.time)
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   143
        return True;
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   144
    return False;
4565
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   145
}
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   146
5530
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   147
static SDL_bool X11_IsWheelEvent(Display * display,XEvent * event,int * ticks)
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   148
{
7475
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   149
    XEvent relevent;
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   150
    if (X11_XPending(display)) {
5530
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   151
        /* according to the xlib docs, no specific mouse wheel events exist.
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   152
           however, mouse wheel events trigger a button press and a button release
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   153
           immediately. thus, checking if the same button was released at the same
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
   154
           time as it was pressed, should be an adequate hack to derive a mouse
7749
6073ad385c9b # User Darren Salt <devspam@moreofthesa.me.uk>
Sam Lantinga <slouken@libsdl.org>
parents: 7679
diff changeset
   155
           wheel event.
6073ad385c9b # User Darren Salt <devspam@moreofthesa.me.uk>
Sam Lantinga <slouken@libsdl.org>
parents: 7679
diff changeset
   156
           However, there is broken and unusual hardware out there...
6073ad385c9b # User Darren Salt <devspam@moreofthesa.me.uk>
Sam Lantinga <slouken@libsdl.org>
parents: 7679
diff changeset
   157
           - False positive: a button for which a release event is
6073ad385c9b # User Darren Salt <devspam@moreofthesa.me.uk>
Sam Lantinga <slouken@libsdl.org>
parents: 7679
diff changeset
   158
             generated (or synthesised) immediately.
6073ad385c9b # User Darren Salt <devspam@moreofthesa.me.uk>
Sam Lantinga <slouken@libsdl.org>
parents: 7679
diff changeset
   159
           - False negative: a wheel which, when rolled, doesn't have
6073ad385c9b # User Darren Salt <devspam@moreofthesa.me.uk>
Sam Lantinga <slouken@libsdl.org>
parents: 7679
diff changeset
   160
             a release event generated immediately. */
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   161
        if (X11_XCheckIfEvent(display, &relevent, X11_IsWheelCheckIfEvent,
7475
c244bc85fb84 Workaround crash bug in libXi <= 1.4.1 (thanks, Steve!).
Ryan C. Gordon <icculus@icculus.org>
parents: 7402
diff changeset
   162
            (XPointer) event)) {
5530
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   163
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   164
            /* by default, X11 only knows 5 buttons. on most 3 button + wheel mouse,
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   165
               Button4 maps to wheel up, Button5 maps to wheel down. */
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   166
            if (event->xbutton.button == Button4) {
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   167
                *ticks = 1;
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   168
            }
6184
976d9ec6c290 Fixed bug 1305 - mouse wheel scroll-down event created when mouse wheel is pressed down
Sam Lantinga <slouken@libsdl.org>
parents: 6138
diff changeset
   169
            else if (event->xbutton.button == Button5) {
5530
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   170
                *ticks = -1;
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   171
            }
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   172
            return SDL_TRUE;
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   173
        }
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   174
    }
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   175
    return SDL_FALSE;
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   176
}
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   177
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   178
/* Convert URI to local filename
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   179
   return filename if possible, else NULL
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   180
*/
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   181
static char* X11_URIToLocal(char* uri) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   182
    char *file = NULL;
7679
b1fe132bc6a4 Fixes for -Wdeclaration-after-statement
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7678
diff changeset
   183
    SDL_bool local;
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   184
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   185
    if (memcmp(uri,"file:/",6) == 0) uri += 6;      /* local file? */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   186
    else if (strstr(uri,":/") != NULL) return file; /* wrong scheme */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   187
7679
b1fe132bc6a4 Fixes for -Wdeclaration-after-statement
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7678
diff changeset
   188
    local = uri[0] != '/' || ( uri[0] != '\0' && uri[1] == '/' );
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   189
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   190
    /* got a hostname? */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   191
    if ( !local && uri[0] == '/' && uri[2] != '/' ) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   192
      char* hostname_end = strchr( uri+1, '/' );
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   193
      if ( hostname_end != NULL ) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   194
          char hostname[ 257 ];
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   195
          if ( gethostname( hostname, 255 ) == 0 ) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   196
            hostname[ 256 ] = '\0';
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   197
            if ( memcmp( uri+1, hostname, hostname_end - ( uri+1 )) == 0 ) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   198
                uri = hostname_end + 1;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   199
                local = SDL_TRUE;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   200
            }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   201
          }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   202
      }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   203
    }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   204
    if ( local ) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   205
      file = uri;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   206
      if ( uri[1] == '/' ) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   207
          file++;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   208
      } else {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   209
          file--;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   210
      }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   211
    }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   212
    return file;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   213
}
6311
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   214
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   215
#if SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   216
static void X11_HandleGenericEvent(SDL_VideoData *videodata,XEvent event)
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   217
{
7402
235c9aaeefd1 Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents: 7396
diff changeset
   218
    /* event is a union, so cookie == &event, but this is type safe. */
235c9aaeefd1 Fixed compiler warning.
Ryan C. Gordon <icculus@icculus.org>
parents: 7396
diff changeset
   219
    XGenericEventCookie *cookie = &event.xcookie;
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   220
    if (X11_XGetEventData(videodata->display, cookie)) {
7214
5b31583ecf9e Only free EventData if it's successfully retrieved.
Edward Rudd <urkle@outoforder.cc>
parents: 7199
diff changeset
   221
        X11_HandleXinput2Event(videodata, cookie);
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   222
        X11_XFreeEventData(videodata->display, cookie);
7214
5b31583ecf9e Only free EventData if it's successfully retrieved.
Edward Rudd <urkle@outoforder.cc>
parents: 7199
diff changeset
   223
    }
6311
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   224
}
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   225
#endif /* SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS */
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   226
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   227
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: 6476
diff changeset
   228
static void
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   229
X11_DispatchFocusIn(SDL_WindowData *data)
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   230
{
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   231
#ifdef DEBUG_XEVENTS
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   232
    printf("window %p: Dispatching FocusIn\n", data);
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   233
#endif
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   234
    SDL_SetKeyboardFocus(data->window);
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   235
#ifdef X_HAVE_UTF8_STRING
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   236
    if (data->ic) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   237
        X11_XSetICFocus(data->ic);
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   238
    }
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   239
#endif
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   240
}
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   241
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   242
static void
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   243
X11_DispatchFocusOut(SDL_WindowData *data)
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   244
{
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   245
#ifdef DEBUG_XEVENTS
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   246
    printf("window %p: Dispatching FocusOut\n", data);
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   247
#endif
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   248
    SDL_SetKeyboardFocus(NULL);
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   249
#ifdef X_HAVE_UTF8_STRING
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   250
    if (data->ic) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   251
        X11_XUnsetICFocus(data->ic);
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   252
    }
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   253
#endif
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   254
}
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   255
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   256
static void
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: 6476
diff changeset
   257
X11_DispatchMapNotify(SDL_WindowData *data)
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6476
diff changeset
   258
{
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: 6476
diff changeset
   259
    SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_SHOWN, 0, 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: 6476
diff changeset
   260
    SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_RESTORED, 0, 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: 6476
diff changeset
   261
}
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: 6476
diff changeset
   262
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: 6476
diff changeset
   263
static void
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: 6476
diff changeset
   264
X11_DispatchUnmapNotify(SDL_WindowData *data)
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6476
diff changeset
   265
{
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: 6476
diff changeset
   266
    SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_HIDDEN, 0, 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: 6476
diff changeset
   267
    SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_MINIMIZED, 0, 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: 6476
diff changeset
   268
}
6311
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   269
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   270
static void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   271
X11_DispatchEvent(_THIS)
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
    SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4508
diff changeset
   274
    Display *display = videodata->display;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   275
    SDL_WindowData *data;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   276
    XEvent xevent;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   277
    int i;
7679
b1fe132bc6a4 Fixes for -Wdeclaration-after-statement
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7678
diff changeset
   278
    XClientMessageEvent m;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   279
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   280
    SDL_zero(xevent);           /* valgrind fix. --ryan. */
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   281
    X11_XNextEvent(display, &xevent);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   282
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
   283
    /* filter events catchs XIM events and sends them to the correct
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
   284
       handler */
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   285
    if (X11_XFilterEvent(&xevent, None) == True) {
2327
7b53a8401195 In testdyngl.c the event type was being anded (&) with SDL_KEYDOWN and if the result was none zero the program was quiting. This is very weird because it was
Bob Pendleton <bob@pendleton.com>
parents: 2326
diff changeset
   286
#if 0
2328
91e601d9df8b re: bug#563. checking in some commented out trace code and a fix so that the in testalpha.c the background only flashes when alpha == 255. The problem that is being
Bob Pendleton <bob@pendleton.com>
parents: 2327
diff changeset
   287
        printf("Filtered event type = %d display = %d window = %d\n",
91e601d9df8b re: bug#563. checking in some commented out trace code and a fix so that the in testalpha.c the background only flashes when alpha == 255. The problem that is being
Bob Pendleton <bob@pendleton.com>
parents: 2327
diff changeset
   288
               xevent.type, xevent.xany.display, xevent.xany.window);
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
   289
#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
   290
        return;
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
   291
    }
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
   292
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   293
    /* Send a SDL_SYSWMEVENT if the application wants them */
4429
faa9fc8e7f67 General improvements for user custom event registration
Sam Lantinga <slouken@libsdl.org>
parents: 3697
diff changeset
   294
    if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) {
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   295
        SDL_SysWMmsg wmmsg;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   296
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   297
        SDL_VERSION(&wmmsg.version);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   298
        wmmsg.subsystem = SDL_SYSWM_X11;
5056
8b7988f42fcb Added the ability to get the UIKit window through the SDL API.
Sam Lantinga <slouken@libsdl.org>
parents: 4934
diff changeset
   299
        wmmsg.msg.x11.event = xevent;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   300
        SDL_SendSysWMEvent(&wmmsg);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   301
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   302
6311
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   303
#if SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   304
    if(xevent.type == GenericEvent) {
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   305
        X11_HandleGenericEvent(videodata,xevent);
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   306
        return;
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   307
    }
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   308
#endif
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   309
6476
9010d6830cdf Show events from all windows (for the legacy fullscreen case)
Sam Lantinga <slouken@libsdl.org>
parents: 6474
diff changeset
   310
#if 0
9010d6830cdf Show events from all windows (for the legacy fullscreen case)
Sam Lantinga <slouken@libsdl.org>
parents: 6474
diff changeset
   311
    printf("type = %d display = %d window = %d\n",
9010d6830cdf Show events from all windows (for the legacy fullscreen case)
Sam Lantinga <slouken@libsdl.org>
parents: 6474
diff changeset
   312
           xevent.type, xevent.xany.display, xevent.xany.window);
9010d6830cdf Show events from all windows (for the legacy fullscreen case)
Sam Lantinga <slouken@libsdl.org>
parents: 6474
diff changeset
   313
#endif
9010d6830cdf Show events from all windows (for the legacy fullscreen case)
Sam Lantinga <slouken@libsdl.org>
parents: 6474
diff changeset
   314
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   315
    data = NULL;
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
   316
    if (videodata && videodata->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
   317
        for (i = 0; i < videodata->numwindows; ++i) {
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   318
            if ((videodata->windowlist[i] != NULL) &&
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: 3322
diff changeset
   319
                (videodata->windowlist[i]->xwindow == xevent.xany.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
   320
                data = videodata->windowlist[i];
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   321
                break;
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2323
diff changeset
   322
            }
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   323
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   324
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   325
    if (!data) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   326
        return;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   327
    }
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4508
diff changeset
   328
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   329
    switch (xevent.type) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   330
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   331
        /* Gaining mouse coverage? */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   332
    case EnterNotify:{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   333
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   334
            printf("window %p: EnterNotify! (%d,%d,%d)\n", data,
4558
4d95152d9e39 Applied the same logic as the fix for bug 894.
Sam Lantinga <slouken@libsdl.org>
parents: 4556
diff changeset
   335
                   xevent.xcrossing.x,
4d95152d9e39 Applied the same logic as the fix for bug 894.
Sam Lantinga <slouken@libsdl.org>
parents: 4556
diff changeset
   336
                   xevent.xcrossing.y,
3195
08747e24a50f Mouse events now report the correct window id and window enter/leave events are now reported.
Bob Pendleton <bob@pendleton.com>
parents: 3188
diff changeset
   337
                   xevent.xcrossing.mode);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   338
            if (xevent.xcrossing.mode == NotifyGrab)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   339
                printf("Mode: NotifyGrab\n");
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   340
            if (xevent.xcrossing.mode == NotifyUngrab)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   341
                printf("Mode: NotifyUngrab\n");
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   342
#endif
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: 4429
diff changeset
   343
            SDL_SetMouseFocus(data->window);
7097
84bbd421d62f Make sure to send MOUSEMOTION on window enter.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 7089
diff changeset
   344
84bbd421d62f Make sure to send MOUSEMOTION on window enter.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 7089
diff changeset
   345
            if (!SDL_GetMouse()->relative_mode) {
84bbd421d62f Make sure to send MOUSEMOTION on window enter.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 7089
diff changeset
   346
                SDL_SendMouseMotion(data->window, 0, 0, xevent.xcrossing.x, xevent.xcrossing.y);
84bbd421d62f Make sure to send MOUSEMOTION on window enter.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 7089
diff changeset
   347
            }
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   348
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   349
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   350
        /* Losing mouse coverage? */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   351
    case LeaveNotify:{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   352
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   353
            printf("window %p: LeaveNotify! (%d,%d,%d)\n", data,
4558
4d95152d9e39 Applied the same logic as the fix for bug 894.
Sam Lantinga <slouken@libsdl.org>
parents: 4556
diff changeset
   354
                   xevent.xcrossing.x,
4d95152d9e39 Applied the same logic as the fix for bug 894.
Sam Lantinga <slouken@libsdl.org>
parents: 4556
diff changeset
   355
                   xevent.xcrossing.y,
3195
08747e24a50f Mouse events now report the correct window id and window enter/leave events are now reported.
Bob Pendleton <bob@pendleton.com>
parents: 3188
diff changeset
   356
                   xevent.xcrossing.mode);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   357
            if (xevent.xcrossing.mode == NotifyGrab)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   358
                printf("Mode: NotifyGrab\n");
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   359
            if (xevent.xcrossing.mode == NotifyUngrab)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   360
                printf("Mode: NotifyUngrab\n");
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   361
#endif
7089
257fc4e541e1 Send mouse leave updates for Windows and X11.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 7021
diff changeset
   362
            if (!SDL_GetMouse()->relative_mode) {
257fc4e541e1 Send mouse leave updates for Windows and X11.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 7021
diff changeset
   363
                SDL_SendMouseMotion(data->window, 0, 0, xevent.xcrossing.x, xevent.xcrossing.y);
257fc4e541e1 Send mouse leave updates for Windows and X11.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 7021
diff changeset
   364
            }
257fc4e541e1 Send mouse leave updates for Windows and X11.
Jørgen P. Tjernø <jorgen@valvesoftware.com>
parents: 7021
diff changeset
   365
4558
4d95152d9e39 Applied the same logic as the fix for bug 894.
Sam Lantinga <slouken@libsdl.org>
parents: 4556
diff changeset
   366
            if (xevent.xcrossing.mode != NotifyGrab &&
4d95152d9e39 Applied the same logic as the fix for bug 894.
Sam Lantinga <slouken@libsdl.org>
parents: 4556
diff changeset
   367
                xevent.xcrossing.mode != NotifyUngrab &&
4d95152d9e39 Applied the same logic as the fix for bug 894.
Sam Lantinga <slouken@libsdl.org>
parents: 4556
diff changeset
   368
                xevent.xcrossing.detail != NotifyInferior) {
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: 4429
diff changeset
   369
                SDL_SetMouseFocus(NULL);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   370
            }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   371
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   372
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   373
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   374
        /* Gaining input focus? */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   375
    case FocusIn:{
6660
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   376
            if (xevent.xfocus.detail == NotifyInferior) {
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   377
#ifdef DEBUG_XEVENTS
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   378
                printf("window %p: FocusIn (NotifierInferior, ignoring)\n", data);
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   379
#endif
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   380
                break;
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   381
            }
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   382
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   383
            printf("window %p: FocusIn!\n", data);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   384
#endif
6661
cd8befc0a969 Reset the keyboard when we lose input focus
Sam Lantinga <slouken@libsdl.org>
parents: 6660
diff changeset
   385
            if (data->pending_focus == PENDING_FOCUS_OUT &&
cd8befc0a969 Reset the keyboard when we lose input focus
Sam Lantinga <slouken@libsdl.org>
parents: 6660
diff changeset
   386
                data->window == SDL_GetKeyboardFocus()) {
cd8befc0a969 Reset the keyboard when we lose input focus
Sam Lantinga <slouken@libsdl.org>
parents: 6660
diff changeset
   387
                /* We want to reset the keyboard here, because we may have
cd8befc0a969 Reset the keyboard when we lose input focus
Sam Lantinga <slouken@libsdl.org>
parents: 6660
diff changeset
   388
                   missed keyboard messages after our previous FocusOut.
cd8befc0a969 Reset the keyboard when we lose input focus
Sam Lantinga <slouken@libsdl.org>
parents: 6660
diff changeset
   389
                 */
7199
6d4cad3fb837 Fixed losing ALT key modifiers on Unity
Sam Lantinga <slouken@libsdl.org>
parents: 7191
diff changeset
   390
                /* Actually, if we do this we clear the ALT key on Unity
6d4cad3fb837 Fixed losing ALT key modifiers on Unity
Sam Lantinga <slouken@libsdl.org>
parents: 7191
diff changeset
   391
                   because it briefly takes focus for their dashboard.
6d4cad3fb837 Fixed losing ALT key modifiers on Unity
Sam Lantinga <slouken@libsdl.org>
parents: 7191
diff changeset
   392
6d4cad3fb837 Fixed losing ALT key modifiers on Unity
Sam Lantinga <slouken@libsdl.org>
parents: 7191
diff changeset
   393
                   I think it's better to think the ALT key is held down
6d4cad3fb837 Fixed losing ALT key modifiers on Unity
Sam Lantinga <slouken@libsdl.org>
parents: 7191
diff changeset
   394
                   when it's not, then always lose the ALT modifier on Unity.
6d4cad3fb837 Fixed losing ALT key modifiers on Unity
Sam Lantinga <slouken@libsdl.org>
parents: 7191
diff changeset
   395
                 */
7678
286c42d7c5ed OCD fixes: Adds a space after /* (glory to regular expressions!)
Gabriel Jacobo <gabomdq@gmail.com>
parents: 7677
diff changeset
   396
                /* SDL_ResetKeyboard(); */
6661
cd8befc0a969 Reset the keyboard when we lose input focus
Sam Lantinga <slouken@libsdl.org>
parents: 6660
diff changeset
   397
            }
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   398
            data->pending_focus = PENDING_FOCUS_IN;
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   399
            data->pending_focus_time = SDL_GetTicks() + PENDING_FOCUS_IN_TIME;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   400
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   401
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   402
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   403
        /* Losing input focus? */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   404
    case FocusOut:{
6660
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   405
            if (xevent.xfocus.detail == NotifyInferior) {
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   406
                /* We still have focus if a child gets focus */
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   407
#ifdef DEBUG_XEVENTS
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   408
                printf("window %p: FocusOut (NotifierInferior, ignoring)\n", data);
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   409
#endif
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   410
                break;
4fa0723e6874 Don't lose focus if a child window gains focus
Sam Lantinga <slouken@libsdl.org>
parents: 6659
diff changeset
   411
            }
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   412
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   413
            printf("window %p: FocusOut!\n", data);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   414
#endif
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   415
            data->pending_focus = PENDING_FOCUS_OUT;
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   416
            data->pending_focus_time = SDL_GetTicks() + PENDING_FOCUS_OUT_TIME;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   417
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   418
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   419
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   420
        /* Generated upon EnterWindow and FocusIn */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   421
    case KeymapNotify:{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   422
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   423
            printf("window %p: KeymapNotify!\n", data);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   424
#endif
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   425
            /* FIXME:
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   426
               X11_SetKeyboardState(SDL_Display, xevent.xkeymap.key_vector);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   427
             */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   428
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   429
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   430
2305
fbe8ff44c519 First pass of new SDL scancode concept for X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2300
diff changeset
   431
        /* Has the keyboard layout changed? */
fbe8ff44c519 First pass of new SDL scancode concept for X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2300
diff changeset
   432
    case MappingNotify:{
fbe8ff44c519 First pass of new SDL scancode concept for X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2300
diff changeset
   433
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   434
            printf("window %p: MappingNotify!\n", data);
2305
fbe8ff44c519 First pass of new SDL scancode concept for X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2300
diff changeset
   435
#endif
2306
1a8bab15a45d Fixed compile errors
Sam Lantinga <slouken@libsdl.org>
parents: 2305
diff changeset
   436
            X11_UpdateKeymap(_this);
2305
fbe8ff44c519 First pass of new SDL scancode concept for X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2300
diff changeset
   437
        }
fbe8ff44c519 First pass of new SDL scancode concept for X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2300
diff changeset
   438
        break;
fbe8ff44c519 First pass of new SDL scancode concept for X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2300
diff changeset
   439
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   440
        /* Key press? */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   441
    case KeyPress:{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   442
            KeyCode keycode = xevent.xkey.keycode;
2300
c97ad1abe05b Minimal implementation of textinput events for x11. It only works for latin-1.
Bob Pendleton <bob@pendleton.com>
parents: 2299
diff changeset
   443
            KeySym keysym = NoSymbol;
2306
1a8bab15a45d Fixed compile errors
Sam Lantinga <slouken@libsdl.org>
parents: 2305
diff changeset
   444
            char text[SDL_TEXTINPUTEVENT_TEXT_SIZE];
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
   445
            Status status = 0;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   446
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   447
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   448
            printf("window %p: KeyPress (X11 keycode = 0x%X)\n", data, xevent.xkey.keycode);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   449
#endif
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: 4429
diff changeset
   450
            SDL_SendKeyboardKey(SDL_PRESSED, videodata->key_layout[keycode]);
4535
ce811c9247da Added back in a little more debugging for the X11 keyboard code
Sam Lantinga <slouken@libsdl.org>
parents: 4524
diff changeset
   451
#if 1
7638
783d1cff9b20 Don't print "unrecognized key" message for an X11 keycode of 0. This can happen with composed characters.
Sam Lantinga <slouken@libsdl.org>
parents: 7475
diff changeset
   452
            if (videodata->key_layout[keycode] == SDL_SCANCODE_UNKNOWN && keycode) {
2305
fbe8ff44c519 First pass of new SDL scancode concept for X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2300
diff changeset
   453
                int min_keycode, max_keycode;
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   454
                X11_XDisplayKeycodes(display, &min_keycode, &max_keycode);
6318
49b2cb56db6e 1.Fixed a memory leak inside XInput2 code
Dimitris Zenios <dimitris.zenios@gmail.com>
parents: 6316
diff changeset
   455
#if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   456
                keysym = X11_XkbKeycodeToKeysym(display, keycode, 0, 0);
6318
49b2cb56db6e 1.Fixed a memory leak inside XInput2 code
Dimitris Zenios <dimitris.zenios@gmail.com>
parents: 6316
diff changeset
   457
#else
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4508
diff changeset
   458
                keysym = XKeycodeToKeysym(display, keycode, 0);
6318
49b2cb56db6e 1.Fixed a memory leak inside XInput2 code
Dimitris Zenios <dimitris.zenios@gmail.com>
parents: 6316
diff changeset
   459
#endif
2299
a7cbc25071b6 Enabled key board auto repeat in X11_InitKeyboard.c. Had to add a couple of new Xlib symbols.
Bob Pendleton <bob@pendleton.com>
parents: 2295
diff changeset
   460
                fprintf(stderr,
4556
cc06f306c053 Fixed X error when showing debug info about a deleted property
Sam Lantinga <slouken@libsdl.org>
parents: 4535
diff changeset
   461
                        "The key you just pressed is not recognized by SDL. To help get this fixed, please report this to the SDL mailing list <sdl@libsdl.org> X11 KeyCode %d (%d), X11 KeySym 0x%lX (%s).\n",
2305
fbe8ff44c519 First pass of new SDL scancode concept for X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2300
diff changeset
   462
                        keycode, keycode - min_keycode, keysym,
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   463
                        X11_XKeysymToString(keysym));
2299
a7cbc25071b6 Enabled key board auto repeat in X11_InitKeyboard.c. Had to add a couple of new Xlib symbols.
Bob Pendleton <bob@pendleton.com>
parents: 2295
diff changeset
   464
            }
2295
dbc6d1893869 Checking in Christian Walther's patch for x11 keyboard input. Minor code tweaks by Bob.
Bob Pendleton <bob@pendleton.com>
parents: 2046
diff changeset
   465
#endif
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
   466
            /* */
2305
fbe8ff44c519 First pass of new SDL scancode concept for X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2300
diff changeset
   467
            SDL_zero(text);
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
   468
#ifdef X_HAVE_UTF8_STRING
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
   469
            if (data->ic) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   470
                X11_Xutf8LookupString(data->ic, &xevent.xkey, text, sizeof(text),
2738
79c1bd651f04 Fixed a bunch of compile warnings on Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 2710
diff changeset
   471
                                  &keysym, &status);
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
   472
            }
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
   473
#else
2306
1a8bab15a45d Fixed compile errors
Sam Lantinga <slouken@libsdl.org>
parents: 2305
diff changeset
   474
            XLookupString(&xevent.xkey, text, sizeof(text), &keysym, NULL);
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
   475
#endif
2305
fbe8ff44c519 First pass of new SDL scancode concept for X11.
Sam Lantinga <slouken@libsdl.org>
parents: 2300
diff changeset
   476
            if (*text) {
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: 4429
diff changeset
   477
                SDL_SendKeyboardText(text);
2300
c97ad1abe05b Minimal implementation of textinput events for x11. It only works for latin-1.
Bob Pendleton <bob@pendleton.com>
parents: 2299
diff changeset
   478
            }
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   479
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   480
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   481
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   482
        /* Key release? */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   483
    case KeyRelease:{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   484
            KeyCode keycode = xevent.xkey.keycode;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   485
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   486
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   487
            printf("window %p: KeyRelease (X11 keycode = 0x%X)\n", data, xevent.xkey.keycode);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   488
#endif
4565
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   489
            if (X11_KeyRepeat(display, &xevent)) {
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   490
                /* We're about to get a repeated key down, ignore the key up */
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   491
                break;
e2d46c5c7483 Fixed key repeat detection on X11, and simplified the code for everyone else.
Sam Lantinga <slouken@libsdl.org>
parents: 4560
diff changeset
   492
            }
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: 4429
diff changeset
   493
            SDL_SendKeyboardKey(SDL_RELEASED, videodata->key_layout[keycode]);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   494
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   495
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   496
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   497
        /* Have we been iconified? */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   498
    case UnmapNotify:{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   499
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   500
            printf("window %p: UnmapNotify!\n", data);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   501
#endif
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: 6476
diff changeset
   502
            X11_DispatchUnmapNotify(data);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   503
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   504
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   505
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   506
        /* Have we been restored? */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   507
    case MapNotify:{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   508
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   509
            printf("window %p: MapNotify!\n", data);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   510
#endif
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: 6476
diff changeset
   511
            X11_DispatchMapNotify(data);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   512
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   513
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   514
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   515
        /* Have we been resized or moved? */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   516
    case ConfigureNotify:{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   517
#ifdef DEBUG_XEVENTS
6542
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   518
            printf("window %p: ConfigureNotify! (position: %d,%d, size: %dx%d)\n", data,
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   519
                   xevent.xconfigure.x, xevent.xconfigure.y,
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   520
                   xevent.xconfigure.width, xevent.xconfigure.height);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   521
#endif
7838
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   522
            long border_left = 0;
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   523
            long border_right = 0;
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   524
            long border_top = 0;
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   525
            long border_bottom = 0;
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   526
            if (data->xwindow) {
7839
d2804f8153fe Fixed compiling with the new X11 symbol wrapping
Sam Lantinga <slouken@libsdl.org>
parents: 7838
diff changeset
   527
                Atom _net_frame_extents = X11_XInternAtom(display, "_NET_FRAME_EXTENTS", 0);
7838
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   528
                Atom type;
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   529
                int format;
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   530
                unsigned long nitems, bytes_after;
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   531
                unsigned char *property;
7839
d2804f8153fe Fixed compiling with the new X11 symbol wrapping
Sam Lantinga <slouken@libsdl.org>
parents: 7838
diff changeset
   532
                X11_XGetWindowProperty(display, data->xwindow,
7838
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   533
                    _net_frame_extents, 0, 16, 0,
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   534
                    XA_CARDINAL, &type, &format,
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   535
                    &nitems, &bytes_after, &property);
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   536
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   537
                border_left = ((long*)property)[0];
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   538
                border_right = ((long*)property)[1];
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   539
                border_top = ((long*)property)[2];
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   540
                border_bottom = ((long*)property)[3];
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   541
            }
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   542
6542
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   543
            if (xevent.xconfigure.x != data->last_xconfigure.x ||
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   544
                xevent.xconfigure.y != data->last_xconfigure.y) {
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   545
                SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_MOVED,
7838
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   546
                                    xevent.xconfigure.x - border_left,
909b0d7fe4dd Fix bug 1300 by querying current border size in ConfigureNotify, and adjusting window coordinates accordingly.
Stefanos Apostolopoulos <stapostol@gmail.com>
parents: 7827
diff changeset
   547
                                    xevent.xconfigure.y - border_top);
6542
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   548
            }
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   549
            if (xevent.xconfigure.width != data->last_xconfigure.width ||
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   550
                xevent.xconfigure.height != data->last_xconfigure.height) {
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   551
                SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_RESIZED,
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   552
                                    xevent.xconfigure.width,
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   553
                                    xevent.xconfigure.height);
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   554
            }
5c1b8ed19212 Keep track of the configure events we've received from the X server.
Sam Lantinga <slouken@libsdl.org>
parents: 6504
diff changeset
   555
            data->last_xconfigure = xevent.xconfigure;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   556
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   557
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   558
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   559
        /* Have we been requested to quit (or another client message?) */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   560
    case ClientMessage:{
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   561
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   562
            int xdnd_version=0;
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
   563
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   564
            if (xevent.xclient.message_type == videodata->XdndEnter) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   565
                SDL_bool use_list = xevent.xclient.data.l[1] & 1;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   566
                data->xdnd_source = xevent.xclient.data.l[0];
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   567
                xdnd_version = ( xevent.xclient.data.l[1] >> 24);
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   568
                if (use_list) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   569
                    /* fetch conversion targets */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   570
                    SDL_x11Prop p;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   571
                    X11_ReadProperty(&p, display, data->xdnd_source, videodata->XdndTypeList);
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   572
                    /* pick one */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   573
                    data->xdnd_req = X11_PickTarget(display, (Atom*)p.data, p.count);
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   574
                    X11_XFree(p.data);
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   575
                } else {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   576
                    /* pick from list of three */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   577
                    data->xdnd_req = X11_PickTargetFromAtoms(display, xevent.xclient.data.l[2], xevent.xclient.data.l[3], xevent.xclient.data.l[4]);
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   578
                }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   579
            }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   580
            else if (xevent.xclient.message_type == videodata->XdndPosition) {
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
   581
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   582
                /* reply with status */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   583
                memset(&m, 0, sizeof(XClientMessageEvent));
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   584
                m.type = ClientMessage;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   585
                m.display = xevent.xclient.display;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   586
                m.window = xevent.xclient.data.l[0];
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   587
                m.message_type = videodata->XdndStatus;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   588
                m.format=32;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   589
                m.data.l[0] = data->xwindow;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   590
                m.data.l[1] = (data->xdnd_req != None);
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   591
                m.data.l[2] = 0; /* specify an empty rectangle */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   592
                m.data.l[3] = 0;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   593
                m.data.l[4] = videodata->XdndActionCopy; /* we only accept copying anyway */
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
   594
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   595
                X11_XSendEvent(display, xevent.xclient.data.l[0], False, NoEventMask, (XEvent*)&m);
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   596
                X11_XFlush(display);
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   597
            }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   598
            else if(xevent.xclient.message_type == videodata->XdndDrop) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   599
                if (data->xdnd_req == None) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   600
                    /* say again - not interested! */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   601
                    memset(&m, 0, sizeof(XClientMessageEvent));
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   602
                    m.type = ClientMessage;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   603
                    m.display = xevent.xclient.display;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   604
                    m.window = xevent.xclient.data.l[0];
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   605
                    m.message_type = videodata->XdndFinished;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   606
                    m.format=32;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   607
                    m.data.l[0] = data->xwindow;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   608
                    m.data.l[1] = 0;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   609
                    m.data.l[2] = None; /* fail! */
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   610
                    X11_XSendEvent(display, xevent.xclient.data.l[0], False, NoEventMask, (XEvent*)&m);
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   611
                } else {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   612
                    /* convert */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   613
                    if(xdnd_version >= 1) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   614
                        X11_XConvertSelection(display, videodata->XdndSelection, data->xdnd_req, videodata->PRIMARY, data->xwindow, xevent.xclient.data.l[2]);
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   615
                    } else {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   616
                        X11_XConvertSelection(display, videodata->XdndSelection, data->xdnd_req, videodata->PRIMARY, data->xwindow, CurrentTime);
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   617
                    }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   618
                }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   619
            }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   620
            else if ((xevent.xclient.message_type == videodata->WM_PROTOCOLS) &&
6637
31e3f5b04120 WM_DELETE_WINDOW should check that the event message_type is WM_PROTOCOLS.
Ryan C. Gordon <icculus@icculus.org>
parents: 6542
diff changeset
   621
                (xevent.xclient.format == 32) &&
6638
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   622
                (xevent.xclient.data.l[0] == videodata->_NET_WM_PING)) {
6659
4016ef96095a Fixed XBadWindow error when iconified under Unity3D
Sam Lantinga <slouken@libsdl.org>
parents: 6638
diff changeset
   623
                Window root = DefaultRootWindow(display);
6638
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   624
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   625
#ifdef DEBUG_XEVENTS
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   626
                printf("window %p: _NET_WM_PING\n", data);
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   627
#endif
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   628
                xevent.xclient.window = root;
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   629
                X11_XSendEvent(display, root, False, SubstructureRedirectMask | SubstructureNotifyMask, &xevent);
6638
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   630
                break;
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   631
            }
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   632
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   633
            else if ((xevent.xclient.message_type == videodata->WM_PROTOCOLS) &&
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   634
                (xevent.xclient.format == 32) &&
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   635
                (xevent.xclient.data.l[0] == videodata->WM_DELETE_WINDOW)) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   636
6638
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   637
#ifdef DEBUG_XEVENTS
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   638
                printf("window %p: WM_DELETE_WINDOW\n", data);
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   639
#endif
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: 3322
diff changeset
   640
                SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_CLOSE, 0, 0);
6638
3d221da309d3 X11: Handle _NET_WM_PING protocol, so window manager knows when app is hung up.
Ryan C. Gordon <icculus@icculus.org>
parents: 6637
diff changeset
   641
                break;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   642
            }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   643
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   644
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   645
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   646
        /* Do we need to refresh ourselves? */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   647
    case Expose:{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   648
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   649
            printf("window %p: Expose (count = %d)\n", data, xevent.xexpose.count);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   650
#endif
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: 3322
diff changeset
   651
            SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_EXPOSED, 0, 0);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   652
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   653
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   654
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: 4429
diff changeset
   655
    case MotionNotify:{
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
   656
            SDL_Mouse *mouse = SDL_GetMouse();
6311
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   657
            if(!mouse->relative_mode) {
2710
44e49d3fa6cf Final merge of Google Summer of Code 2008 work...
Sam Lantinga <slouken@libsdl.org>
parents: 2328
diff changeset
   658
#ifdef DEBUG_MOTION
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   659
                printf("window %p: X11 motion: %d,%d\n", xevent.xmotion.x, xevent.xmotion.y);
2710
44e49d3fa6cf Final merge of Google Summer of Code 2008 work...
Sam Lantinga <slouken@libsdl.org>
parents: 2328
diff changeset
   660
#endif
6311
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   661
6950
1ddb72193079 Added a mouse ID to the mouse events, which set to the special value SDL_TOUCH_MOUSEID for mouse events simulated by touch input.
Sam Lantinga <slouken@libsdl.org>
parents: 6885
diff changeset
   662
                SDL_SendMouseMotion(data->window, 0, 0, xevent.xmotion.x, xevent.xmotion.y);
6311
4e5e46f43438 Initial support for XInput2 by Dimitris Zenios
Sam Lantinga <slouken@libsdl.org>
parents: 6184
diff changeset
   663
            }
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: 4429
diff changeset
   664
        }
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 4429
diff changeset
   665
        break;
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 4429
diff changeset
   666
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 4429
diff changeset
   667
    case ButtonPress:{
5530
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   668
            int ticks = 0;
6950
1ddb72193079 Added a mouse ID to the mouse events, which set to the special value SDL_TOUCH_MOUSEID for mouse events simulated by touch input.
Sam Lantinga <slouken@libsdl.org>
parents: 6885
diff changeset
   669
            if (X11_IsWheelEvent(display,&xevent,&ticks)) {
1ddb72193079 Added a mouse ID to the mouse events, which set to the special value SDL_TOUCH_MOUSEID for mouse events simulated by touch input.
Sam Lantinga <slouken@libsdl.org>
parents: 6885
diff changeset
   670
                SDL_SendMouseWheel(data->window, 0, 0, ticks);
1ddb72193079 Added a mouse ID to the mouse events, which set to the special value SDL_TOUCH_MOUSEID for mouse events simulated by touch input.
Sam Lantinga <slouken@libsdl.org>
parents: 6885
diff changeset
   671
            } else {
1ddb72193079 Added a mouse ID to the mouse events, which set to the special value SDL_TOUCH_MOUSEID for mouse events simulated by touch input.
Sam Lantinga <slouken@libsdl.org>
parents: 6885
diff changeset
   672
                SDL_SendMouseButton(data->window, 0, SDL_PRESSED, xevent.xbutton.button);
5530
4e46a7b6773d Fixed bug 1173 (No mouse wheel event on linux/x11)
Sam Lantinga <slouken@libsdl.org>
parents: 5481
diff changeset
   673
            }
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: 4429
diff changeset
   674
        }
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 4429
diff changeset
   675
        break;
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 4429
diff changeset
   676
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 4429
diff changeset
   677
    case ButtonRelease:{
6950
1ddb72193079 Added a mouse ID to the mouse events, which set to the special value SDL_TOUCH_MOUSEID for mouse events simulated by touch input.
Sam Lantinga <slouken@libsdl.org>
parents: 6885
diff changeset
   678
            SDL_SendMouseButton(data->window, 0, SDL_RELEASED, xevent.xbutton.button);
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: 4429
diff changeset
   679
        }
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 4429
diff changeset
   680
        break;
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 4429
diff changeset
   681
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4508
diff changeset
   682
    case PropertyNotify:{
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4508
diff changeset
   683
#ifdef DEBUG_XEVENTS
4520
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   684
            unsigned char *propdata;
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   685
            int status, real_format;
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   686
            Atom real_type;
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   687
            unsigned long items_read, items_left, i;
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   688
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   689
            char *name = X11_XGetAtomName(display, xevent.xproperty.atom);
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4508
diff changeset
   690
            if (name) {
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   691
                printf("window %p: PropertyNotify: %s %s\n", data, name, (xevent.xproperty.state == PropertyDelete) ? "deleted" : "changed");
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   692
                X11_XFree(name);
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4508
diff changeset
   693
            }
4520
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   694
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   695
            status = X11_XGetWindowProperty(display, data->xwindow, xevent.xproperty.atom, 0L, 8192L, False, AnyPropertyType, &real_type, &real_format, &items_read, &items_left, &propdata);
4556
cc06f306c053 Fixed X error when showing debug info about a deleted property
Sam Lantinga <slouken@libsdl.org>
parents: 4535
diff changeset
   696
            if (status == Success && items_read > 0) {
4520
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   697
                if (real_type == XA_INTEGER) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   698
                    int *values = (int *)propdata;
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   699
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   700
                    printf("{");
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   701
                    for (i = 0; i < items_read; i++) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   702
                        printf(" %d", values[i]);
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   703
                    }
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   704
                    printf(" }\n");
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   705
                } else if (real_type == XA_CARDINAL) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   706
                    if (real_format == 32) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   707
                        Uint32 *values = (Uint32 *)propdata;
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   708
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   709
                        printf("{");
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   710
                        for (i = 0; i < items_read; i++) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   711
                            printf(" %d", values[i]);
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   712
                        }
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   713
                        printf(" }\n");
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   714
                    } else if (real_format == 16) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   715
                        Uint16 *values = (Uint16 *)propdata;
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   716
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   717
                        printf("{");
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   718
                        for (i = 0; i < items_read; i++) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   719
                            printf(" %d", values[i]);
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   720
                        }
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   721
                        printf(" }\n");
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   722
                    } else if (real_format == 8) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   723
                        Uint8 *values = (Uint8 *)propdata;
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   724
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   725
                        printf("{");
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   726
                        for (i = 0; i < items_read; i++) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   727
                            printf(" %d", values[i]);
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   728
                        }
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   729
                        printf(" }\n");
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   730
                    }
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   731
                } else if (real_type == XA_STRING ||
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   732
                           real_type == videodata->UTF8_STRING) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   733
                    printf("{ \"%s\" }\n", propdata);
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   734
                } else if (real_type == XA_ATOM) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   735
                    Atom *atoms = (Atom *)propdata;
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   736
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   737
                    printf("{");
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   738
                    for (i = 0; i < items_read; i++) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   739
                        char *name = X11_XGetAtomName(display, atoms[i]);
4520
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   740
                        if (name) {
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   741
                            printf(" %s", name);
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   742
                            X11_XFree(name);
4520
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   743
                        }
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   744
                    }
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   745
                    printf(" }\n");
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   746
                } else {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   747
                    char *name = X11_XGetAtomName(display, real_type);
4520
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   748
                    printf("Unknown type: %ld (%s)\n", real_type, name ? name : "UNKNOWN");
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   749
                    if (name) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   750
                        X11_XFree(name);
4520
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   751
                    }
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   752
                }
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   753
            }
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: 6476
diff changeset
   754
            if (status == Success) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   755
                X11_XFree(propdata);
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: 6476
diff changeset
   756
            }
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: 6476
diff changeset
   757
#endif /* DEBUG_XEVENTS */
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: 6476
diff changeset
   758
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: 6476
diff changeset
   759
            if (xevent.xproperty.atom == data->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: 6476
diff changeset
   760
                /* Get the new state from the window manager.
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: 6476
diff changeset
   761
                   Compositing window managers can alter visibility of windows
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: 6476
diff changeset
   762
                   without ever mapping / unmapping them, so we handle that here,
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: 6476
diff changeset
   763
                   because they use the NETWM protocol to notify us of changes.
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: 6476
diff changeset
   764
                 */
6487
b18a011ecc45 Simplified the NetWM code a little bit, and it now operates on X11 Window
Sam Lantinga <slouken@libsdl.org>
parents: 6481
diff changeset
   765
                Uint32 flags = X11_GetNetWMState(_this, xevent.xproperty.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: 6476
diff changeset
   766
                if ((flags^data->window->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: 6476
diff changeset
   767
                    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: 6476
diff changeset
   768
                        X11_DispatchUnmapNotify(data);
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6476
diff changeset
   769
                    } else {
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6476
diff changeset
   770
                        X11_DispatchMapNotify(data);
fab4b15b17e9 Compositing window managers can show and hide windows without ever affecting the mapped state. However they do send NetWM protocol messages to indicate this is happening.
Sam Lantinga <slouken@libsdl.org>
parents: 6476
diff changeset
   771
                    }
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: 6476
diff changeset
   772
                }
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: 6476
diff changeset
   773
            }
4518
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4508
diff changeset
   774
        }
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4508
diff changeset
   775
        break;
a956a315fe67 Lots of prep for the "real" way to support fullscreen mode on modern window managers.
Sam Lantinga <slouken@libsdl.org>
parents: 4508
diff changeset
   776
4508
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   777
    /* Copy the selection from XA_CUT_BUFFER0 to the requested property */
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   778
    case SelectionRequest: {
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   779
            XSelectionRequestEvent *req;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   780
            XEvent sevent;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   781
            int seln_format;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   782
            unsigned long nbytes;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   783
            unsigned long overflow;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   784
            unsigned char *seln_data;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   785
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   786
            req = &xevent.xselectionrequest;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   787
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   788
            printf("window %p: SelectionRequest (requestor = %ld, target = %ld)\n", data,
4508
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   789
                req->requestor, req->target);
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   790
#endif
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   791
4524
a256e1dadf3f Zero any fields not explicitly filled in.
Sam Lantinga <slouken@libsdl.org>
parents: 4520
diff changeset
   792
            SDL_zero(sevent);
4520
0c67c4328678 Much better debugging of property changes
Sam Lantinga <slouken@libsdl.org>
parents: 4519
diff changeset
   793
            sevent.xany.type = SelectionNotify;
4508
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   794
            sevent.xselection.selection = req->selection;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   795
            sevent.xselection.target = None;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   796
            sevent.xselection.property = None;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   797
            sevent.xselection.requestor = req->requestor;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   798
            sevent.xselection.time = req->time;
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   799
            if (X11_XGetWindowProperty(display, DefaultRootWindow(display),
4508
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   800
                    XA_CUT_BUFFER0, 0, INT_MAX/4, False, req->target,
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   801
                    &sevent.xselection.target, &seln_format, &nbytes,
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   802
                    &overflow, &seln_data) == Success) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   803
                Atom XA_TARGETS = X11_XInternAtom(display, "TARGETS", 0);
4508
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   804
                if (sevent.xselection.target == req->target) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   805
                    X11_XChangeProperty(display, req->requestor, req->property,
4508
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   806
                        sevent.xselection.target, seln_format, PropModeReplace,
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   807
                        seln_data, nbytes);
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   808
                    sevent.xselection.property = req->property;
7021
eba9097a07dc Make SDL support the X11 clipboard TARGETS protocol, which advertises what formats text is available in from the application. This is necessary for many Linux programs to interact well with the clipboard.
Sam Lantinga <slouken@libsdl.org>
parents: 7001
diff changeset
   809
                } else if (XA_TARGETS == req->target) {
eba9097a07dc Make SDL support the X11 clipboard TARGETS protocol, which advertises what formats text is available in from the application. This is necessary for many Linux programs to interact well with the clipboard.
Sam Lantinga <slouken@libsdl.org>
parents: 7001
diff changeset
   810
                    Atom SupportedFormats[] = { sevent.xselection.target, XA_TARGETS };
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   811
                    X11_XChangeProperty(display, req->requestor, req->property,
7021
eba9097a07dc Make SDL support the X11 clipboard TARGETS protocol, which advertises what formats text is available in from the application. This is necessary for many Linux programs to interact well with the clipboard.
Sam Lantinga <slouken@libsdl.org>
parents: 7001
diff changeset
   812
                        XA_ATOM, 32, PropModeReplace,
eba9097a07dc Make SDL support the X11 clipboard TARGETS protocol, which advertises what formats text is available in from the application. This is necessary for many Linux programs to interact well with the clipboard.
Sam Lantinga <slouken@libsdl.org>
parents: 7001
diff changeset
   813
                        (unsigned char*)SupportedFormats,
eba9097a07dc Make SDL support the X11 clipboard TARGETS protocol, which advertises what formats text is available in from the application. This is necessary for many Linux programs to interact well with the clipboard.
Sam Lantinga <slouken@libsdl.org>
parents: 7001
diff changeset
   814
                        sizeof(SupportedFormats)/sizeof(*SupportedFormats));
eba9097a07dc Make SDL support the X11 clipboard TARGETS protocol, which advertises what formats text is available in from the application. This is necessary for many Linux programs to interact well with the clipboard.
Sam Lantinga <slouken@libsdl.org>
parents: 7001
diff changeset
   815
                    sevent.xselection.property = req->property;
4508
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   816
                }
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   817
                X11_XFree(seln_data);
4508
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   818
            }
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   819
            X11_XSendEvent(display, req->requestor, False, 0, &sevent);
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   820
            X11_XSync(display, False);
4508
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   821
        }
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   822
        break;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   823
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   824
    case SelectionNotify: {
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   825
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   826
            printf("window %p: SelectionNotify (requestor = %ld, target = %ld)\n", data,
4508
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   827
                xevent.xselection.requestor, xevent.xselection.target);
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   828
#endif
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   829
            Atom target = xevent.xselection.target;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   830
            if (target == data->xdnd_req) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   831
                /* read data */
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   832
                SDL_x11Prop p;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   833
                X11_ReadProperty(&p, display, data->xwindow, videodata->PRIMARY);
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
   834
7396
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   835
                if (p.format == 8) {
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   836
                    SDL_bool expect_lf = SDL_FALSE;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   837
                    char *start = NULL;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   838
                    char *scan = (char*)p.data;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   839
                    char *fn;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   840
                    char *uri;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   841
                    int length = 0;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   842
                    while (p.count--) {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   843
                        if (!expect_lf) {
7396
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   844
                            if (*scan == 0x0D) {
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   845
                                expect_lf = SDL_TRUE;
7396
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   846
                            }
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   847
                            if (start == NULL) {
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   848
                                start = scan;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   849
                                length = 0;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   850
                            }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   851
                            length++;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   852
                        } else {
7396
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   853
                            if (*scan == 0x0A && length > 0) {
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   854
                                uri = SDL_malloc(length--);
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   855
                                SDL_memcpy(uri, start, length);
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   856
                                uri[length] = '\0';
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   857
                                fn = X11_URIToLocal(uri);
7396
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   858
                                if (fn) {
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   859
                                    SDL_SendDropFile(fn);
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   860
                                }
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   861
                                SDL_free(uri);
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   862
                            }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   863
                            expect_lf = SDL_FALSE;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   864
                            start = NULL;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   865
                        }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   866
                        scan++;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   867
                    }
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   868
                }
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
   869
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   870
                X11_XFree(p.data);
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
   871
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   872
                /* send reply */
7396
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   873
                SDL_memset(&m, 0, sizeof(XClientMessageEvent));
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   874
                m.type = ClientMessage;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   875
                m.display = display;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   876
                m.window = data->xdnd_source;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   877
                m.message_type = videodata->XdndFinished;
7396
a36ab6149a10 Fixed bug 1953 - Crash at memcpy X11_DispatchEvent(_THIS) Function
Sam Lantinga <slouken@libsdl.org>
parents: 7214
diff changeset
   878
                m.format = 32;
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   879
                m.data.l[0] = data->xwindow;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   880
                m.data.l[1] = 1;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   881
                m.data.l[2] = videodata->XdndActionCopy;
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   882
                X11_XSendEvent(display, data->xdnd_source, False, NoEventMask, (XEvent*)&m);
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
   883
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   884
                X11_XSync(display, False);
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
   885
7001
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   886
            } else {
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   887
                videodata->selection_waiting = SDL_FALSE;
ccc0d3207639 XDnD implementation from Davey Taylor, need some cleanup
Sam Lantinga <slouken@libsdl.org>
parents: 6951
diff changeset
   888
            }
4508
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   889
        }
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   890
        break;
15d2c6f40c48 Added X11 clipboard support.
Sam Lantinga <slouken@libsdl.org>
parents: 4484
diff changeset
   891
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: 4429
diff changeset
   892
    default:{
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   893
#ifdef DEBUG_XEVENTS
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   894
            printf("window %p: Unhandled event %d\n", data, xevent.type);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   895
#endif
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   896
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   897
        break;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   898
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   899
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   900
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   901
static void
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   902
X11_HandleFocusChanges(_THIS)
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   903
{
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   904
    SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   905
    int i;
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   906
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   907
    if (videodata && videodata->windowlist) {
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   908
        for (i = 0; i < videodata->numwindows; ++i) {
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   909
            SDL_WindowData *data = videodata->windowlist[i];
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   910
            if (data && data->pending_focus != PENDING_FOCUS_NONE) {
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   911
                Uint32 now = SDL_GetTicks();
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   912
                if ( (int)(data->pending_focus_time-now) <= 0 ) {
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   913
                    if ( data->pending_focus == PENDING_FOCUS_IN ) {
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   914
                        X11_DispatchFocusIn(data);
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   915
                    } else {
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   916
                        X11_DispatchFocusOut(data);
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   917
                    }
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   918
                    data->pending_focus = PENDING_FOCUS_NONE;
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   919
                }
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   920
            }
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   921
        }
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   922
    }
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   923
}
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   924
/* Ack!  X11_XPending() actually performs a blocking read if no events available */
4472
791b3256fb22 Mostly cleaned up warnings with -Wmissing-prototypes
Sam Lantinga <slouken@libsdl.org>
parents: 4465
diff changeset
   925
static int
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   926
X11_Pending(Display * display)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   927
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   928
    /* Flush the display connection and look to see if events are queued */
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   929
    X11_XFlush(display);
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   930
    if (X11_XEventsQueued(display, QueuedAlready)) {
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   931
        return (1);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   932
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   933
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   934
    /* More drastic measures are required -- see if X is ready to talk */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   935
    {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   936
        static struct timeval zero_time;        /* static == 0 */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   937
        int x11_fd;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   938
        fd_set fdset;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   939
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   940
        x11_fd = ConnectionNumber(display);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   941
        FD_ZERO(&fdset);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   942
        FD_SET(x11_fd, &fdset);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   943
        if (select(x11_fd + 1, &fdset, NULL, NULL, &zero_time) == 1) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   944
            return (X11_XPending(display));
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   945
        }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   946
    }
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   947
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   948
    /* Oh well, nothing is ready .. */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   949
    return (0);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   950
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   951
5981
75caa8a7d559 Fixed a whole slew of compiler warnings that -Wall exposed.
Ryan C. Gordon <icculus@icculus.org>
parents: 5603
diff changeset
   952
75caa8a7d559 Fixed a whole slew of compiler warnings that -Wall exposed.
Ryan C. Gordon <icculus@icculus.org>
parents: 5603
diff changeset
   953
/* !!! FIXME: this should be exposed in a header, or something. */
75caa8a7d559 Fixed a whole slew of compiler warnings that -Wall exposed.
Ryan C. Gordon <icculus@icculus.org>
parents: 5603
diff changeset
   954
int SDL_GetNumTouch(void);
6774
ad8522052ce6 Replaced Gnome screensaver hack with D-Bus messages to org.gnome.ScreenSaver.
Ryan C. Gordon <icculus@icculus.org>
parents: 6661
diff changeset
   955
void SDL_dbus_screensaver_tickle(_THIS);
5981
75caa8a7d559 Fixed a whole slew of compiler warnings that -Wall exposed.
Ryan C. Gordon <icculus@icculus.org>
parents: 5603
diff changeset
   956
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   957
void
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   958
X11_PumpEvents(_THIS)
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   959
{
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   960
    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   961
3025
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
   962
    /* Update activity every 30 seconds to prevent screensaver */
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
   963
    if (_this->suspend_screensaver) {
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
   964
        Uint32 now = SDL_GetTicks();
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
   965
        if (!data->screensaver_activity ||
3040
Sam Lantinga <slouken@libsdl.org>
parents: 3031
diff changeset
   966
            (int) (now - data->screensaver_activity) >= 30000) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   967
            X11_XResetScreenSaver(data->display);
6774
ad8522052ce6 Replaced Gnome screensaver hack with D-Bus messages to org.gnome.ScreenSaver.
Ryan C. Gordon <icculus@icculus.org>
parents: 6661
diff changeset
   968
ad8522052ce6 Replaced Gnome screensaver hack with D-Bus messages to org.gnome.ScreenSaver.
Ryan C. Gordon <icculus@icculus.org>
parents: 6661
diff changeset
   969
            #if SDL_USE_LIBDBUS
ad8522052ce6 Replaced Gnome screensaver hack with D-Bus messages to org.gnome.ScreenSaver.
Ryan C. Gordon <icculus@icculus.org>
parents: 6661
diff changeset
   970
            SDL_dbus_screensaver_tickle(_this);
ad8522052ce6 Replaced Gnome screensaver hack with D-Bus messages to org.gnome.ScreenSaver.
Ryan C. Gordon <icculus@icculus.org>
parents: 6661
diff changeset
   971
            #endif
ad8522052ce6 Replaced Gnome screensaver hack with D-Bus messages to org.gnome.ScreenSaver.
Ryan C. Gordon <icculus@icculus.org>
parents: 6661
diff changeset
   972
3025
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
   973
            data->screensaver_activity = now;
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
   974
        }
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7097
diff changeset
   975
    }
3025
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
   976
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   977
    /* Keep processing pending events */
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   978
    while (X11_Pending(data->display)) {
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   979
        X11_DispatchEvent(_this);
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   980
    }
6504
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   981
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   982
    /* FIXME: Only need to do this when there are pending focus changes */
100c49578dba We need to queue the focus in/out changes because they may occur during video mode changes and we can respond to them by triggering more mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 6487
diff changeset
   983
    X11_HandleFocusChanges(_this);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   984
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   985
3030
f13ad181f5b2 This is so wrong, it hurts.
Sam Lantinga <slouken@libsdl.org>
parents: 3025
diff changeset
   986
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   987
void
3025
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
   988
X11_SuspendScreenSaver(_THIS)
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   989
{
5408
35a63789c3f2 Dynamically load the Xinerama and xf86vmode extensions
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   990
#if SDL_VIDEO_DRIVER_X11_XSCRNSAVER
3025
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
   991
    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
   992
    int dummy;
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
   993
    int major_version, minor_version;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   994
3030
f13ad181f5b2 This is so wrong, it hurts.
Sam Lantinga <slouken@libsdl.org>
parents: 3025
diff changeset
   995
    if (SDL_X11_HAVE_XSS) {
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   996
        /* X11_XScreenSaverSuspend was introduced in MIT-SCREEN-SAVER 1.1 */
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   997
        if (!X11_XScreenSaverQueryExtension(data->display, &dummy, &dummy) ||
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
   998
            !X11_XScreenSaverQueryVersion(data->display,
3030
f13ad181f5b2 This is so wrong, it hurts.
Sam Lantinga <slouken@libsdl.org>
parents: 3025
diff changeset
   999
                                      &major_version, &minor_version) ||
f13ad181f5b2 This is so wrong, it hurts.
Sam Lantinga <slouken@libsdl.org>
parents: 3025
diff changeset
  1000
            major_version < 1 || (major_version == 1 && minor_version < 1)) {
f13ad181f5b2 This is so wrong, it hurts.
Sam Lantinga <slouken@libsdl.org>
parents: 3025
diff changeset
  1001
            return;
f13ad181f5b2 This is so wrong, it hurts.
Sam Lantinga <slouken@libsdl.org>
parents: 3025
diff changeset
  1002
        }
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1003
7827
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
  1004
        X11_XScreenSaverSuspend(data->display, _this->suspend_screensaver);
a03ec8de0426 Don't supply duplicate X11 symbols inside SDL.
Ryan C. Gordon <icculus@icculus.org>
parents: 7749
diff changeset
  1005
        X11_XResetScreenSaver(data->display);
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1006
    }
3030
f13ad181f5b2 This is so wrong, it hurts.
Sam Lantinga <slouken@libsdl.org>
parents: 3025
diff changeset
  1007
#endif
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1008
6774
ad8522052ce6 Replaced Gnome screensaver hack with D-Bus messages to org.gnome.ScreenSaver.
Ryan C. Gordon <icculus@icculus.org>
parents: 6661
diff changeset
  1009
#if SDL_USE_LIBDBUS
3030
f13ad181f5b2 This is so wrong, it hurts.
Sam Lantinga <slouken@libsdl.org>
parents: 3025
diff changeset
  1010
    if (_this->suspend_screensaver) {
6774
ad8522052ce6 Replaced Gnome screensaver hack with D-Bus messages to org.gnome.ScreenSaver.
Ryan C. Gordon <icculus@icculus.org>
parents: 6661
diff changeset
  1011
        SDL_dbus_screensaver_tickle(_this);
3030
f13ad181f5b2 This is so wrong, it hurts.
Sam Lantinga <slouken@libsdl.org>
parents: 3025
diff changeset
  1012
    }
3025
54fac87e1f34 Added an API to enable/disable the screen saver.
Sam Lantinga <slouken@libsdl.org>
parents: 3015
diff changeset
  1013
#endif
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1014
}
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1015
5481
22dfc3958dc3 Fixed so code will compile with SDL_config_minimal.h
Sam Lantinga <slouken@libsdl.org>
parents: 5408
diff changeset
  1016
#endif /* SDL_VIDEO_DRIVER_X11 */