initializing maximized/fullscreen windows in x11 would start normal, then maximize...
[blender.git] / intern / ghost / intern / GHOST_WindowX11.cpp
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file ghost/intern/GHOST_WindowX11.cpp
29  *  \ingroup GHOST
30  */
31
32
33 #include "GHOST_WindowX11.h"
34 #include "GHOST_SystemX11.h"
35 #include "STR_String.h"
36 #include "GHOST_Debug.h"
37
38 #ifdef WITH_XDND
39 #include "GHOST_DropTargetX11.h"
40 #endif
41
42 /* For standard X11 cursors */
43 #include <X11/cursorfont.h>
44 #include <X11/Xatom.h>
45
46 #if defined(__sun__) || defined(__sun) || defined(__sparc) || defined(__sparc__) || defined(_AIX)
47 #include <strings.h>
48 #endif
49
50 #include <cstring>
51 #include <cstdio>
52
53 #include <algorithm>
54 #include <string>
55
56 /* For obscure full screen mode stuuf
57  * lifted verbatim from blut. */
58
59 typedef struct {
60         long flags;
61         long functions;
62         long decorations;
63         long input_mode;
64 } MotifWmHints;
65
66 #define MWM_HINTS_DECORATIONS         (1L << 1)
67
68
69 // #define GHOST_X11_GRAB
70
71 /*
72  * A Client can't change the window property, that is
73  * the work of the window manager. In case, we send
74  * a ClientMessage to the RootWindow with the property
75  * and the Action (WM-spec define this):
76  */
77 #define _NET_WM_STATE_REMOVE 0
78 #define _NET_WM_STATE_ADD 1
79 // #define _NET_WM_STATE_TOGGLE 2 // UNUSED
80
81 /*
82    import bpy
83    I = bpy.data.images['blender.png'] # the 48x48 icon
84
85  # Write to a file that can be
86  # used within static unsigned char BLENDER_ICON_48x48x24[] = {...}
87    f = open('/myicon.txt', 'w')
88    for j in xrange(48):
89         for k in xrange(48):
90                 v = I.getPixelI(j,47-k)
91                 v.pop()
92                 for p in v:
93                         f.write(str(hex(p))+',')
94
95         f.write('\n')
96  */
97
98 /* See the python script above to regenerate the 48x48 icon within blender */
99 #define BLENDER_ICON_WIDTH 48
100 #define BLENDER_ICON_HEIGHT 48
101 static unsigned char BLENDER_ICON_48x48x24[] = {
102         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
103         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x4f, 0x2a, 0xd, 0xa7, 0x5b, 0x1f, 0xb8, 0x66, 0x22, 0x6c, 0x3b, 0x14, 0x5, 0x3, 0x1, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
104         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x6f, 0x3a, 0x13, 0xea, 0x7f, 0x2c, 0xee, 0x7e, 0x2b, 0xee, 0x7e, 0x2b, 0xef, 0x85, 0x2e, 0x5f, 0x35, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
105         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x43, 0x22, 0xb, 0xed, 0x7f, 0x2c, 0xed, 0x7c, 0x2b, 0xee, 0x7f, 0x2c, 0xee, 0x80, 0x2c, 0xee, 0x80, 0x2c, 0xa8, 0x5f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
106         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x2e, 0x16, 0x6, 0xd0, 0x6f, 0x26, 0xed, 0x7b, 0x2a, 0xed, 0x7d, 0x2b, 0xee, 0x7f, 0x2c, 0xee, 0x80, 0x2c, 0xee, 0x82, 0x2d, 0x9a, 0x57, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
107         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x17, 0xb, 0x4, 0xb9, 0x60, 0x21, 0xed, 0x7a, 0x2a, 0xed, 0x7b, 0x2a, 0xed, 0x7e, 0x2b, 0xee, 0x7f, 0x2c, 0xee, 0x7f, 0x2c, 0xee, 0x86, 0x2e, 0x4e, 0x2b, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
108         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x1, 0x0, 0x0, 0x96, 0x4d, 0x19, 0xee, 0x7a, 0x2a, 0xed, 0x79, 0x2a, 0xed, 0x7c, 0x2b, 0xed, 0x7e, 0x2b, 0xed, 0x7e, 0x2b, 0xef, 0x83, 0x2d, 0x98, 0x55, 0x1c, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
109         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x20, 0xf, 0x5, 0x4b, 0x27, 0xe, 0x21, 0x11, 0x5, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x67, 0x34, 0x11, 0xed, 0x7b, 0x2a, 0xec, 0x79, 0x29, 0xed, 0x7b, 0x2a, 0xed, 0x7c, 0x2b, 0xed, 0x7d, 0x2b, 0xee, 0x7f, 0x2c, 0xbb, 0x69, 0x24, 0x11, 0x9, 0x3, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
110         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x38, 0x1c, 0x9, 0xc9, 0x6d, 0x2c, 0xf1, 0x86, 0x36, 0xd7, 0x79, 0x2a, 0x22, 0x12, 0x5, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x3b, 0x1d, 0x9, 0xe0, 0x74, 0x27, 0xed, 0x7a, 0x2a, 0xed, 0x7c, 0x2a, 0xed, 0x7d, 0x2b, 0xed, 0x7d, 0x2b, 0xed, 0x7d, 0x2b, 0xdc, 0x7a, 0x2a, 0x1e, 0xf, 0x5, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
111         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xa6, 0x56, 0x23, 0xee, 0x83, 0x3b, 0xed, 0x7d, 0x2c, 0xf0, 0x85, 0x2e, 0x75, 0x43, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x25, 0x12, 0x5, 0xc9, 0x68, 0x24, 0xed, 0x7b, 0x2a, 0xed, 0x7d, 0x2b, 0xed, 0x7e, 0x2b, 0xee, 0x7e, 0x2c, 0xed, 0x7d, 0x2b, 0xe3, 0x7d, 0x2b, 0x3b, 0x1f, 0xa, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
112         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x1c, 0xd, 0x4, 0xd9, 0x74, 0x35, 0xee, 0x83, 0x3a, 0xee, 0x7f, 0x2b, 0xf0, 0x86, 0x2e, 0x83, 0x4d, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xa, 0x5, 0x1, 0xa1, 0x54, 0x1c, 0xee, 0x7e, 0x2c, 0xed, 0x7e, 0x2c, 0xed, 0x7f, 0x2c, 0xed, 0x80, 0x2c, 0xed, 0x7f, 0x2b, 0xec, 0x81, 0x2d, 0x60, 0x33, 0x11, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
113         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x24, 0x11, 0x5, 0xe0, 0x7a, 0x38, 0xee, 0x84, 0x3a, 0xee, 0x82, 0x2c, 0xf0, 0x88, 0x2f, 0x82, 0x4d, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x6f, 0x39, 0x13, 0xef, 0x82, 0x30, 0xed, 0x82, 0x2f, 0xee, 0x82, 0x2e, 0xee, 0x82, 0x2d, 0xee, 0x81, 0x2c, 0xf0, 0x83, 0x2d, 0x88, 0x49, 0x18, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
114         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x24, 0x11, 0x5, 0xe0, 0x7c, 0x3a, 0xee, 0x86, 0x3b, 0xee, 0x84, 0x2d, 0xf1, 0x8b, 0x30, 0x82, 0x4d, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x54, 0x2b, 0xf, 0xe9, 0x80, 0x30, 0xee, 0x87, 0x33, 0xef, 0x88, 0x32, 0xef, 0x88, 0x30, 0xee, 0x85, 0x2f, 0xef, 0x83, 0x2e, 0xae, 0x5f, 0x20, 0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
115         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x24, 0x11, 0x5, 0xe0, 0x7e, 0x3d, 0xef, 0x8a, 0x3d, 0xef, 0x88, 0x2e, 0xf1, 0x8d, 0x31, 0x81, 0x4d, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x29, 0x15, 0x7, 0xd2, 0x74, 0x2d, 0xf0, 0x8b, 0x36, 0xf0, 0x8d, 0x35, 0xef, 0x8d, 0x35, 0xef, 0x8b, 0x33, 0xef, 0x88, 0x30, 0xc4, 0x6d, 0x26, 0x18, 0xc, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
116         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x24, 0x11, 0x5, 0xe1, 0x80, 0x3f, 0xf0, 0x8d, 0x3f, 0xef, 0x8a, 0x2f, 0xf1, 0x8f, 0x32, 0x81, 0x4e, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x3, 0x0, 0xb1, 0x61, 0x26, 0xf1, 0x8e, 0x3a, 0xf1, 0x90, 0x3a, 0xf0, 0x90, 0x38, 0xf0, 0x90, 0x36, 0xef, 0x8e, 0x35, 0xd3, 0x7a, 0x2c, 0x22, 0x11, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
117         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x24, 0x12, 0x5, 0xe1, 0x83, 0x42, 0xf0, 0x90, 0x42, 0xf0, 0x8d, 0x30, 0xf2, 0x92, 0x33, 0x80, 0x4e, 0x1b, 0x0, 0x0, 0x0, 0x3, 0x2, 0x0, 0x81, 0x45, 0x1b, 0xf1, 0x90, 0x3e, 0xf1, 0x94, 0x3d, 0xf1, 0x95, 0x3c, 0xf0, 0x94, 0x3b, 0xf0, 0x92, 0x39, 0xf0, 0x90, 0x35, 0xd0, 0x7b, 0x2b, 0xc2, 0x6e, 0x26, 0xbe, 0x6c, 0x25, 0x94, 0x54, 0x1c, 0x5b, 0x33, 0x11, 0x1a, 0xe, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
118         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x25, 0x14, 0x6, 0xe2, 0x86, 0x44, 0xf1, 0x94, 0x45, 0xf0, 0x90, 0x31, 0xf2, 0x94, 0x33, 0x80, 0x4e, 0x1b, 0x0, 0x0, 0x0, 0x60, 0x34, 0x14, 0xed, 0x8c, 0x3e, 0xf0, 0x96, 0x42, 0xf1, 0x97, 0x40, 0xf1, 0x95, 0x3f, 0xf0, 0x91, 0x39, 0xef, 0x8e, 0x33, 0xef, 0x8d, 0x31, 0xf0, 0x8d, 0x31, 0xef, 0x8c, 0x30, 0xef, 0x8c, 0x30, 0xf0, 0x8d, 0x31, 0xf1, 0x8e, 0x31, 0xe1, 0x85, 0x2e, 0x92, 0x55, 0x1d, 0x25, 0x14, 0x7, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
119         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe2, 0x89, 0x46, 0xf2, 0x97, 0x47, 0xf1, 0x92, 0x32, 0xf2, 0x96, 0x34, 0x80, 0x4e, 0x1a, 0x32, 0x1a, 0xa, 0xe3, 0x87, 0x3d, 0xf1, 0x97, 0x45, 0xf1, 0x98, 0x44, 0xf1, 0x95, 0x41, 0xf0, 0x90, 0x39, 0xef, 0x8d, 0x30, 0xef, 0x8f, 0x31, 0xf0, 0x90, 0x32, 0xf0, 0x92, 0x33, 0xf1, 0x93, 0x33, 0xf1, 0x94, 0x34, 0xf1, 0x94, 0x34, 0xf0, 0x93, 0x34, 0xf0, 0x91, 0x32, 0xf1, 0x91, 0x33, 0xe2, 0x8a, 0x30, 0x6b, 0x3f, 0x15, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
120         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe3, 0x8b, 0x49, 0xf2, 0x9a, 0x49, 0xf1, 0x93, 0x32, 0xf2, 0x98, 0x35, 0x8f, 0x57, 0x1d, 0xcf, 0x7c, 0x38, 0xf2, 0x99, 0x48, 0xf1, 0x98, 0x47, 0xf1, 0x96, 0x44, 0xf0, 0x90, 0x39, 0xef, 0x8d, 0x31, 0xf0, 0x90, 0x31, 0xf0, 0x92, 0x33, 0xf1, 0x94, 0x33, 0xf1, 0x96, 0x35, 0xf1, 0x98, 0x35, 0xf1, 0x9a, 0x36, 0xf1, 0x9c, 0x37, 0xf2, 0x9d, 0x37, 0xf2, 0x9c, 0x37, 0xf2, 0x99, 0x36, 0xf0, 0x94, 0x34, 0xf3, 0x97, 0x35, 0x9f, 0x60, 0x21, 0x13, 0xb, 0x3, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
121         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe3, 0x8d, 0x4b, 0xf2, 0x9b, 0x4c, 0xf1, 0x93, 0x32, 0xf1, 0x97, 0x35, 0xea, 0x98, 0x43, 0xf2, 0x9d, 0x4d, 0xf1, 0x9a, 0x4b, 0xf1, 0x99, 0x49, 0xf0, 0x93, 0x3d, 0xf0, 0x8d, 0x30, 0xf0, 0x90, 0x32, 0xf0, 0x92, 0x32, 0xf0, 0x94, 0x34, 0xf1, 0x96, 0x34, 0xf1, 0x98, 0x36, 0xf1, 0x9a, 0x36, 0xf2, 0x9c, 0x38, 0xf2, 0x9f, 0x38, 0xf2, 0xa2, 0x39, 0xf3, 0xa2, 0x39, 0xf3, 0xa2, 0x39, 0xf2, 0x9f, 0x38, 0xf1, 0x99, 0x35, 0xf2, 0x97, 0x35, 0xba, 0x74, 0x29, 0x13, 0xb, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
122         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe4, 0x8e, 0x4d, 0xf2, 0x9d, 0x4e, 0xf1, 0x93, 0x32, 0xf2, 0x9d, 0x3f, 0xf3, 0xa4, 0x54, 0xf2, 0x9d, 0x50, 0xf1, 0x9b, 0x4d, 0xf2, 0x98, 0x46, 0xef, 0x8d, 0x31, 0xf0, 0x8f, 0x31, 0xf0, 0x91, 0x32, 0xf0, 0x93, 0x32, 0xf1, 0x94, 0x32, 0xf1, 0x95, 0x32, 0xf1, 0x98, 0x34, 0xf1, 0x9b, 0x36, 0xf2, 0x9e, 0x38, 0xf2, 0xa1, 0x39, 0xf2, 0xa4, 0x3a, 0xf3, 0xa6, 0x3b, 0xf4, 0xa8, 0x3c, 0xf3, 0xa7, 0x3c, 0xf3, 0xa4, 0x3a, 0xf2, 0x9c, 0x37, 0xf2, 0x99, 0x36, 0xa9, 0x69, 0x25, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
123         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe4, 0x90, 0x50, 0xf2, 0x9e, 0x51, 0xf1, 0x95, 0x35, 0xf4, 0xa6, 0x54, 0xf3, 0xa2, 0x55, 0xf2, 0x9e, 0x51, 0xf2, 0x9c, 0x4e, 0xf0, 0x8f, 0x35, 0xf0, 0x8e, 0x31, 0xf0, 0x90, 0x32, 0xf3, 0xa5, 0x56, 0xf7, 0xc4, 0x8e, 0xfa, 0xd8, 0xb6, 0xfb, 0xdf, 0xc2, 0xfa, 0xd8, 0xb2, 0xf7, 0xc4, 0x89, 0xf4, 0xae, 0x59, 0xf2, 0xa1, 0x38, 0xf3, 0xa5, 0x3b, 0xf4, 0xa8, 0x3c, 0xf4, 0xab, 0x3d, 0xf4, 0xac, 0x3e, 0xf4, 0xab, 0x3d, 0xf3, 0xa7, 0x3b, 0xf2, 0x9e, 0x38, 0xf4, 0x9e, 0x38, 0x6f, 0x45, 0x17, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
124         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x19, 0xc, 0x5, 0x63, 0x36, 0x18, 0x3f, 0x20, 0x9, 0x2, 0x1, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe4, 0x91, 0x52, 0xf3, 0xa2, 0x55, 0xf2, 0x9d, 0x43, 0xf4, 0xa7, 0x5b, 0xf3, 0xa2, 0x57, 0xf3, 0xa0, 0x55, 0xf1, 0x97, 0x43, 0xf0, 0x8d, 0x30, 0xf2, 0x9d, 0x4c, 0xfa, 0xda, 0xbc, 0xfe, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0xf6, 0xfa, 0xdc, 0xb5, 0xf4, 0xae, 0x4e, 0xf4, 0xa9, 0x3c, 0xf4, 0xac, 0x3d, 0xf4, 0xae, 0x3f, 0xf4, 0xaf, 0x3f, 0xf4, 0xad, 0x3f, 0xf3, 0xa8, 0x3d, 0xf2, 0x9d, 0x38, 0xe2, 0x94, 0x34, 0x23, 0x14, 0x6, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
125         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x11, 0x8, 0x3, 0x9e, 0x62, 0x39, 0xf2, 0x91, 0x4e, 0xe7, 0x79, 0x29, 0x48, 0x25, 0xc, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x27, 0x13, 0x6, 0xe5, 0x93, 0x54, 0xf3, 0xa7, 0x59, 0xf4, 0xa6, 0x56, 0xf4, 0xa7, 0x5d, 0xf3, 0xa4, 0x59, 0xf3, 0xa2, 0x57, 0xf1, 0x90, 0x36, 0xf4, 0xa7, 0x5d, 0xfe, 0xf4, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf2, 0xe3, 0xf6, 0xb8, 0x5f, 0xf4, 0xac, 0x3e, 0xf4, 0xaf, 0x3f, 0xf4, 0xb1, 0x40, 0xf4, 0xb2, 0x40, 0xf5, 0xaf, 0x3f, 0xf3, 0xa6, 0x3c, 0xf3, 0x9f, 0x38, 0x90, 0x5d, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
126         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x3d, 0x1f, 0xf, 0xed, 0x9c, 0x6a, 0xef, 0x8b, 0x4a, 0xec, 0x78, 0x29, 0xe4, 0x79, 0x2a, 0x29, 0x15, 0x7, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x28, 0x14, 0x6, 0xe6, 0x97, 0x57, 0xf5, 0xad, 0x63, 0xf5, 0xac, 0x62, 0xf4, 0xa8, 0x5f, 0xf4, 0xa6, 0x5c, 0xf3, 0xa0, 0x53, 0xf4, 0xa9, 0x64, 0xfe, 0xf8, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xf2, 0xf7, 0xfa, 0xed, 0xf4, 0xf8, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xed, 0xf5, 0xb5, 0x53, 0xf5, 0xb0, 0x3f, 0xf5, 0xb3, 0x41, 0xf5, 0xb4, 0x42, 0xf5, 0xb3, 0x41, 0xf4, 0xad, 0x3f, 0xf3, 0xa1, 0x39, 0xe4, 0x98, 0x37, 0x1d, 0x11, 0x5, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
127         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x43, 0x23, 0x10, 0xf2, 0xa1, 0x70, 0xf1, 0x99, 0x61, 0xec, 0x78, 0x2a, 0xed, 0x7b, 0x2a, 0xc4, 0x69, 0x23, 0x15, 0xa, 0x3, 0x0, 0x0, 0x0, 0x1d, 0xf, 0x5, 0xe7, 0x9b, 0x5b, 0xf5, 0xb1, 0x68, 0xf5, 0xad, 0x65, 0xf4, 0xaa, 0x62, 0xf4, 0xa8, 0x5f, 0xf3, 0xa4, 0x59, 0xfd, 0xec, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfd, 0xfe, 0xc3, 0xda, 0xe9, 0x5c, 0x9a, 0xc5, 0x2a, 0x7b, 0xb4, 0x17, 0x6f, 0xae, 0x36, 0x81, 0xb8, 0x91, 0xbb, 0xd9, 0xf0, 0xf6, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe7, 0xc7, 0xf5, 0xb2, 0x43, 0xf6, 0xb3, 0x41, 0xf5, 0xb5, 0x43, 0xf5, 0xb6, 0x43, 0xf5, 0xb3, 0x42, 0xf4, 0xa8, 0x3c, 0xf4, 0xa2, 0x3a, 0x66, 0x41, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
128         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x22, 0x10, 0x7, 0xd6, 0x88, 0x5b, 0xf2, 0xa5, 0x76, 0xee, 0x84, 0x3f, 0xed, 0x7a, 0x2a, 0xee, 0x80, 0x2c, 0xa5, 0x59, 0x1e, 0x7, 0x3, 0x1, 0x19, 0xd, 0x4, 0xe7, 0x9e, 0x5e, 0xf6, 0xb2, 0x6b, 0xf5, 0xae, 0x67, 0xf5, 0xac, 0x65, 0xf4, 0xa9, 0x61, 0xf8, 0xcc, 0xa1, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xfe, 0x97, 0xbf, 0xdb, 0x33, 0x83, 0xbb, 0x24, 0x7e, 0xb9, 0x3, 0x6a, 0xae, 0x0, 0x66, 0xab, 0x0, 0x64, 0xa9, 0x1, 0x63, 0xa9, 0x3c, 0x87, 0xbd, 0xee, 0xf5, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xf8, 0xc7, 0x76, 0xf6, 0xb4, 0x41, 0xf5, 0xb7, 0x43, 0xf6, 0xb8, 0x44, 0xf6, 0xb6, 0x43, 0xf5, 0xae, 0x3f, 0xf3, 0xa2, 0x3a, 0xac, 0x71, 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
129         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x52, 0x2c, 0x16, 0xf0, 0xa1, 0x71, 0xf2, 0xa2, 0x6f, 0xed, 0x7e, 0x32, 0xed, 0x7e, 0x2b, 0xef, 0x82, 0x2d, 0x8a, 0x49, 0x18, 0x1b, 0xe, 0x4, 0xe7, 0xa2, 0x61, 0xf6, 0xb3, 0x6e, 0xf6, 0xb0, 0x6a, 0xf5, 0xae, 0x67, 0xf5, 0xab, 0x64, 0xfe, 0xf4, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0xd1, 0xe5, 0x3e, 0x8d, 0xc3, 0x37, 0x8e, 0xc5, 0x16, 0x7a, 0xb9, 0x0, 0x6b, 0xaf, 0x0, 0x68, 0xac, 0x0, 0x65, 0xaa, 0x0, 0x65, 0xab, 0x0, 0x66, 0xac, 0x4d, 0x93, 0xc4, 0xf8, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe7, 0xc5, 0xf6, 0xb3, 0x40, 0xf6, 0xb7, 0x43, 0xf6, 0xb9, 0x44, 0xf6, 0xb8, 0x45, 0xf5, 0xb2, 0x41, 0xf3, 0xa5, 0x3b, 0xe2, 0x98, 0x37, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
130         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x86, 0x4e, 0x2e, 0xf3, 0xa6, 0x77, 0xf1, 0x9e, 0x66, 0xed, 0x7e, 0x2d, 0xee, 0x82, 0x2c, 0xf0, 0x85, 0x2d, 0x7e, 0x47, 0x17, 0xe8, 0xa6, 0x64, 0xf6, 0xb5, 0x70, 0xf6, 0xb2, 0x6d, 0xf5, 0xb0, 0x6a, 0xf7, 0xbb, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xfb, 0xfd, 0x5b, 0x9c, 0xca, 0x42, 0x96, 0xcb, 0x3c, 0x93, 0xc9, 0x9, 0x73, 0xb6, 0x0, 0x6b, 0xb0, 0x0, 0x69, 0xad, 0x0, 0x66, 0xab, 0x0, 0x66, 0xab, 0x0, 0x67, 0xad, 0x4, 0x6a, 0xaf, 0xbb, 0xd7, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf8, 0xee, 0xf6, 0xb9, 0x4f, 0xf6, 0xb7, 0x44, 0xf6, 0xba, 0x45, 0xf6, 0xba, 0x45, 0xf5, 0xb5, 0x43, 0xf4, 0xa8, 0x3d, 0xf5, 0xa7, 0x3d, 0x1b, 0xf, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
131         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x11, 0x8, 0x3, 0xb0, 0x6d, 0x45, 0xf4, 0xaa, 0x7b, 0xf1, 0x9a, 0x5b, 0xee, 0x82, 0x2d, 0xef, 0x86, 0x2e, 0xee, 0x91, 0x36, 0xf5, 0xb5, 0x70, 0xf6, 0xb7, 0x73, 0xf6, 0xb4, 0x70, 0xf5, 0xb1, 0x6c, 0xf9, 0xcc, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xe2, 0xef, 0x4b, 0x97, 0xca, 0x47, 0x9a, 0xce, 0x3f, 0x95, 0xcb, 0x3, 0x71, 0xb5, 0x0, 0x6c, 0xb0, 0x0, 0x69, 0xae, 0x0, 0x67, 0xac, 0x0, 0x66, 0xac, 0x0, 0x67, 0xad, 0x0, 0x69, 0xaf, 0x66, 0xa5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfa, 0xf8, 0xc3, 0x67, 0xf6, 0xb8, 0x44, 0xf6, 0xba, 0x45, 0xf6, 0xbb, 0x46, 0xf6, 0xb7, 0x44, 0xf4, 0xab, 0x3e, 0xf8, 0xab, 0x3f, 0x2a, 0x19, 0x8, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
132         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x2b, 0x15, 0x9, 0xd4, 0x8a, 0x5c, 0xf4, 0xac, 0x7c, 0xf1, 0x98, 0x54, 0xee, 0x85, 0x2e, 0xf1, 0x93, 0x38, 0xf6, 0xba, 0x75, 0xf6, 0xb9, 0x75, 0xf6, 0xb6, 0x72, 0xf6, 0xb3, 0x6f, 0xfa, 0xd5, 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xcf, 0xe5, 0x51, 0x9e, 0xcf, 0x4b, 0x9d, 0xd0, 0x43, 0x97, 0xcc, 0x3, 0x71, 0xb5, 0x0, 0x6d, 0xb1, 0x0, 0x6a, 0xae, 0x0, 0x67, 0xac, 0x0, 0x67, 0xad, 0x0, 0x68, 0xae, 0x0, 0x6a, 0xb0, 0x3b, 0x8c, 0xc2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf9, 0xc9, 0x77, 0xf6, 0xb8, 0x44, 0xf6, 0xba, 0x45, 0xf6, 0xbc, 0x46, 0xf6, 0xb8, 0x44, 0xf4, 0xad, 0x3f, 0xf8, 0xac, 0x3f, 0x2a, 0x1a, 0x8, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
133         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x47, 0x26, 0x12, 0xee, 0xa3, 0x72, 0xf4, 0xae, 0x7b, 0xf1, 0x97, 0x4e, 0xf1, 0x92, 0x38, 0xf6, 0xbb, 0x78, 0xf6, 0xbb, 0x78, 0xf6, 0xb7, 0x75, 0xf6, 0xb5, 0x71, 0xfa, 0xd6, 0xb2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xcd, 0xe4, 0x54, 0xa0, 0xd1, 0x4e, 0xa0, 0xd1, 0x48, 0x9b, 0xce, 0xb, 0x76, 0xb8, 0x0, 0x6d, 0xb2, 0x0, 0x6a, 0xaf, 0x0, 0x68, 0xad, 0x0, 0x68, 0xad, 0x0, 0x69, 0xae, 0x0, 0x6b, 0xb1, 0x36, 0x89, 0xc1, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xf9, 0xc9, 0x76, 0xf6, 0xb9, 0x44, 0xf6, 0xbb, 0x46, 0xf6, 0xbc, 0x47, 0xf6, 0xb9, 0x44, 0xf4, 0xad, 0x3f, 0xf8, 0xad, 0x40, 0x2a, 0x1a, 0x8, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
134         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x70, 0x42, 0x26, 0xf4, 0xad, 0x7b, 0xf5, 0xb1, 0x7d, 0xf3, 0x9f, 0x50, 0xf7, 0xbc, 0x7b, 0xf7, 0xbc, 0x7b, 0xf6, 0xb9, 0x78, 0xf6, 0xb7, 0x74, 0xf9, 0xd0, 0xa6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xda, 0xeb, 0x56, 0xa0, 0xd0, 0x51, 0xa1, 0xd2, 0x4a, 0x9c, 0xcf, 0x20, 0x82, 0xbf, 0x0, 0x6e, 0xb2, 0x0, 0x6b, 0xb0, 0x0, 0x68, 0xae, 0x0, 0x68, 0xae, 0x0, 0x69, 0xaf, 0x0, 0x6b, 0xb1, 0x50, 0x98, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf9, 0xf8, 0xc3, 0x66, 0xf6, 0xb9, 0x45, 0xf7, 0xbb, 0x46, 0xf6, 0xbc, 0x47, 0xf6, 0xb8, 0x45, 0xf4, 0xad, 0x3f, 0xf8, 0xac, 0x3f, 0x2a, 0x19, 0x7, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
135         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xc, 0x5, 0x0, 0xa5, 0x67, 0x40, 0xf5, 0xb1, 0x7f, 0xf5, 0xb7, 0x7e, 0xf7, 0xbf, 0x80, 0xf7, 0xbe, 0x7d, 0xf7, 0xbb, 0x7b, 0xf6, 0xb9, 0x78, 0xf8, 0xc2, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xf5, 0xf9, 0x5b, 0xa0, 0xce, 0x53, 0xa2, 0xd2, 0x4c, 0x9e, 0xd0, 0x3c, 0x93, 0xc8, 0x6, 0x71, 0xb4, 0x0, 0x6c, 0xb0, 0x0, 0x69, 0xae, 0x0, 0x69, 0xae, 0x0, 0x6a, 0xaf, 0x0, 0x6b, 0xb1, 0x9b, 0xc5, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xec, 0xf6, 0xba, 0x4e, 0xf6, 0xb9, 0x45, 0xf7, 0xbb, 0x46, 0xf6, 0xbc, 0x47, 0xf5, 0xb7, 0x44, 0xf4, 0xab, 0x3e, 0xf5, 0xa8, 0x3e, 0x18, 0xd, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
136         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x1f, 0x10, 0x7, 0xc9, 0x84, 0x56, 0xf5, 0xb5, 0x81, 0xf7, 0xbf, 0x82, 0xf8, 0xc0, 0x80, 0xf7, 0xbd, 0x7d, 0xf7, 0xba, 0x7a, 0xf6, 0xb8, 0x77, 0xfe, 0xf5, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xc2, 0xdf, 0x55, 0x9f, 0xd0, 0x4e, 0x9f, 0xd0, 0x47, 0x99, 0xcc, 0x2a, 0x87, 0xc1, 0x3, 0x6d, 0xb1, 0x0, 0x69, 0xaf, 0x0, 0x6a, 0xaf, 0x0, 0x6a, 0xb0, 0x27, 0x80, 0xbc, 0xec, 0xf4, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe5, 0xbf, 0xf6, 0xb6, 0x42, 0xf6, 0xba, 0x46, 0xf7, 0xbb, 0x46, 0xf7, 0xbb, 0x47, 0xf5, 0xb5, 0x43, 0xf3, 0xa8, 0x3d, 0xdd, 0x97, 0x37, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
137         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x32, 0x1a, 0xb, 0xe4, 0x9d, 0x6a, 0xf7, 0xbd, 0x84, 0xf8, 0xc1, 0x83, 0xf8, 0xbe, 0x80, 0xf7, 0xbd, 0x7d, 0xf7, 0xba, 0x79, 0xfa, 0xd9, 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf6, 0xfa, 0x74, 0xac, 0xd4, 0x4f, 0x9b, 0xcd, 0x48, 0x99, 0xcc, 0x41, 0x94, 0xc8, 0x2c, 0x85, 0xbe, 0xb, 0x70, 0xb3, 0x1, 0x6a, 0xb0, 0xb, 0x6e, 0xb2, 0xbf, 0xd9, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xf8, 0xc8, 0x74, 0xf6, 0xb7, 0x44, 0xf6, 0xba, 0x46, 0xf7, 0xbb, 0x46, 0xf7, 0xb9, 0x46, 0xf6, 0xb2, 0x42, 0xf4, 0xa7, 0x3d, 0xa6, 0x70, 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
138         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x4f, 0x2e, 0x18, 0xef, 0xaf, 0x78, 0xf8, 0xc1, 0x85, 0xf8, 0xc0, 0x82, 0xf7, 0xbe, 0x7f, 0xf7, 0xbc, 0x7d, 0xf7, 0xbe, 0x81, 0xfe, 0xf3, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf7, 0xfa, 0x91, 0xbd, 0xdb, 0x4f, 0x97, 0xc8, 0x40, 0x8e, 0xc3, 0x37, 0x8a, 0xc0, 0x34, 0x88, 0xbf, 0x57, 0x9c, 0xca, 0xcc, 0xe1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe4, 0xbf, 0xf5, 0xb6, 0x45, 0xf6, 0xb8, 0x45, 0xf6, 0xba, 0x46, 0xf7, 0xba, 0x46, 0xf6, 0xb7, 0x45, 0xf5, 0xad, 0x3f, 0xf4, 0xa9, 0x40, 0x5c, 0x3d, 0x18, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
139         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x85, 0x55, 0x31, 0xf7, 0xbd, 0x84, 0xf8, 0xc2, 0x85, 0xf8, 0xc0, 0x82, 0xf7, 0xbe, 0x80, 0xf7, 0xbc, 0x7d, 0xf9, 0xcb, 0x99, 0xfe, 0xf9, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xfe, 0xe5, 0xef, 0xf6, 0xc1, 0xda, 0xeb, 0xba, 0xd5, 0xe9, 0xd8, 0xe8, 0xf2, 0xf9, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf3, 0xe4, 0xf6, 0xb9, 0x51, 0xf5, 0xb5, 0x43, 0xf6, 0xb8, 0x45, 0xf6, 0xb9, 0x46, 0xf6, 0xb8, 0x46, 0xf6, 0xb3, 0x43, 0xf4, 0xa7, 0x3e, 0xdf, 0x9d, 0x43, 0x17, 0xd, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
140         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x14, 0xa, 0x4, 0xb2, 0x7b, 0x4b, 0xf8, 0xc2, 0x88, 0xf8, 0xc1, 0x85, 0xf7, 0xbf, 0x82, 0xf7, 0xbe, 0x80, 0xf7, 0xbd, 0x7d, 0xf9, 0xca, 0x97, 0xfe, 0xf9, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf2, 0xe1, 0xf7, 0xbc, 0x5d, 0xf5, 0xb3, 0x42, 0xf5, 0xb6, 0x44, 0xf5, 0xb7, 0x45, 0xf6, 0xb8, 0x45, 0xf6, 0xb5, 0x44, 0xf5, 0xad, 0x40, 0xf6, 0xae, 0x4c, 0x88, 0x5d, 0x27, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
141         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x1d, 0x10, 0x6, 0xdb, 0xa0, 0x68, 0xf8, 0xc3, 0x88, 0xf7, 0xc1, 0x85, 0xf7, 0xc0, 0x82, 0xf7, 0xbf, 0x80, 0xf7, 0xbe, 0x7e, 0xf8, 0xc4, 0x88, 0xfc, 0xe6, 0xcc, 0xfe, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfa, 0xf3, 0xfa, 0xda, 0xa9, 0xf5, 0xb3, 0x4a, 0xf5, 0xb2, 0x42, 0xf5, 0xb3, 0x43, 0xf5, 0xb6, 0x44, 0xf5, 0xb7, 0x45, 0xf5, 0xb5, 0x44, 0xf5, 0xb0, 0x42, 0xf5, 0xad, 0x4d, 0xdd, 0x9e, 0x4a, 0x19, 0xf, 0x5, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
142         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x50, 0x33, 0x19, 0xec, 0xb4, 0x7a, 0xf8, 0xc2, 0x87, 0xf7, 0xc1, 0x85, 0xf7, 0xc1, 0x83, 0xf7, 0xc0, 0x80, 0xf7, 0xc0, 0x7f, 0xf7, 0xc0, 0x7c, 0xf7, 0xc2, 0x7e, 0xf8, 0xcc, 0x92, 0xfa, 0xda, 0xb0, 0xfb, 0xdf, 0xb9, 0xfa, 0xd9, 0xad, 0xf7, 0xc8, 0x84, 0xf5, 0xb4, 0x54, 0xf4, 0xad, 0x3f, 0xf4, 0xaf, 0x41, 0xf5, 0xb2, 0x42, 0xf5, 0xb4, 0x43, 0xf5, 0xb5, 0x44, 0xf5, 0xb4, 0x44, 0xf5, 0xb2, 0x46, 0xf5, 0xb2, 0x54, 0xf5, 0xb4, 0x5a, 0x5e, 0x3e, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
143         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x71, 0x4b, 0x29, 0xf8, 0xc0, 0x86, 0xf7, 0xc3, 0x87, 0xf7, 0xc2, 0x85, 0xf7, 0xc1, 0x83, 0xf7, 0xc2, 0x82, 0xf7, 0xc2, 0x7f, 0xf7, 0xc2, 0x7e, 0xf6, 0xc0, 0x76, 0xf4, 0xb4, 0x59, 0xf3, 0xa8, 0x3e, 0xf3, 0xa7, 0x39, 0xf3, 0xa9, 0x3d, 0xf4, 0xab, 0x3e, 0xf4, 0xad, 0x40, 0xf4, 0xb0, 0x41, 0xf4, 0xb2, 0x42, 0xf5, 0xb2, 0x42, 0xf5, 0xb3, 0x45, 0xf6, 0xb7, 0x54, 0xf6, 0xb7, 0x60, 0xf6, 0xb5, 0x5f, 0x9d, 0x6b, 0x31, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
144         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x8b, 0x5f, 0x36, 0xf9, 0xc1, 0x87, 0xf7, 0xc3, 0x88, 0xf8, 0xc3, 0x86, 0xf7, 0xc3, 0x84, 0xf8, 0xc3, 0x81, 0xf7, 0xc4, 0x80, 0xf7, 0xc4, 0x7e, 0xf7, 0xc4, 0x7d, 0xf7, 0xc3, 0x7a, 0xf6, 0xbd, 0x6c, 0xf5, 0xb7, 0x5c, 0xf5, 0xb5, 0x54, 0xf5, 0xb4, 0x50, 0xf5, 0xb6, 0x52, 0xf6, 0xb9, 0x58, 0xf6, 0xbd, 0x62, 0xf7, 0xbf, 0x6a, 0xf6, 0xba, 0x66, 0xf6, 0xb6, 0x63, 0xab, 0x78, 0x39, 0xa, 0x6, 0x2, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
145         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x83, 0x58, 0x32, 0xf0, 0xb9, 0x7f, 0xf7, 0xc3, 0x88, 0xf7, 0xc3, 0x86, 0xf8, 0xc4, 0x84, 0xf7, 0xc5, 0x82, 0xf7, 0xc5, 0x80, 0xf7, 0xc5, 0x7f, 0xf8, 0xc5, 0x7d, 0xf7, 0xc4, 0x7b, 0xf7, 0xc4, 0x79, 0xf7, 0xc4, 0x78, 0xf7, 0xc3, 0x76, 0xf7, 0xc3, 0x74, 0xf7, 0xc2, 0x71, 0xf6, 0xbe, 0x6d, 0xf6, 0xba, 0x6a, 0xf4, 0xb6, 0x65, 0x8a, 0x5e, 0x2c, 0xc, 0x7, 0x3, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
146         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x4f, 0x33, 0x1a, 0xd2, 0x99, 0x60, 0xf8, 0xc4, 0x89, 0xf8, 0xc3, 0x86, 0xf8, 0xc4, 0x84, 0xf7, 0xc5, 0x82, 0xf7, 0xc5, 0x80, 0xf7, 0xc5, 0x7f, 0xf7, 0xc4, 0x7e, 0xf7, 0xc4, 0x7b, 0xf7, 0xc3, 0x79, 0xf7, 0xc2, 0x77, 0xf6, 0xc0, 0x74, 0xf6, 0xbd, 0x71, 0xf6, 0xbb, 0x6e, 0xe1, 0xa4, 0x59, 0x5c, 0x3d, 0x1b, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
147         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xe, 0x6, 0x0, 0x72, 0x4b, 0x28, 0xd0, 0x9a, 0x62, 0xf7, 0xbf, 0x80, 0xf8, 0xc4, 0x85, 0xf7, 0xc3, 0x82, 0xf7, 0xc3, 0x80, 0xf7, 0xc3, 0x7e, 0xf7, 0xc1, 0x7c, 0xf6, 0xc0, 0x7a, 0xf7, 0xbf, 0x78, 0xf8, 0xbc, 0x72, 0xde, 0xa2, 0x5d, 0x80, 0x57, 0x2b, 0x13, 0xb, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
148         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x19, 0xe, 0x5, 0x44, 0x2c, 0x15, 0x81, 0x59, 0x32, 0xb2, 0x80, 0x4c, 0xcb, 0x95, 0x5b, 0xd2, 0x9c, 0x5f, 0xcd, 0x97, 0x5a, 0xb9, 0x86, 0x4d, 0x8b, 0x61, 0x34, 0x4a, 0x30, 0x17, 0x15, 0xc, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
149         0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff,
150 };
151
152
153 GLXContext GHOST_WindowX11::s_firstContext = NULL;
154
155 GHOST_WindowX11::
156 GHOST_WindowX11(
157     GHOST_SystemX11 *system,
158     Display *display,
159     const STR_String& title,
160     GHOST_TInt32 left,
161     GHOST_TInt32 top,
162     GHOST_TUns32 width,
163     GHOST_TUns32 height,
164     GHOST_TWindowState state,
165     const GHOST_TEmbedderWindowID parentWindow,
166     GHOST_TDrawingContextType type,
167     const bool stereoVisual,
168     const GHOST_TUns16 numOfAASamples
169     ) :
170         GHOST_Window(width, height, state, type, stereoVisual, numOfAASamples),
171         m_context(NULL),
172         m_display(display),
173         m_normal_state(GHOST_kWindowStateNormal),
174         m_system(system),
175         m_valid_setup(false),
176         m_invalid_window(false),
177         m_empty_cursor(None),
178         m_custom_cursor(None)
179 {
180         
181         /* Set up the minimum atrributes that we require and see if
182          * X can find us a visual matching those requirements. */
183
184         int attributes[40], i, samples;
185         Atom atoms[2];
186         int natom;
187         int glxVersionMajor, glxVersionMinor; /* As in GLX major.minor */
188
189         m_visual = NULL;
190
191         if (!glXQueryVersion(m_display, &glxVersionMajor, &glxVersionMinor)) {
192                 printf("%s:%d: X11 glXQueryVersion() failed, verify working openGL system!\n", __FILE__, __LINE__);
193                 
194                 /* exit if this is the first window */
195                 if (s_firstContext == NULL) {
196                         printf("initial window could not find the GLX extension, exit!\n");
197                         exit(1);
198                 }
199
200                 return;
201         }
202
203         /* Find the display with highest samples, starting at level requested */
204         for (samples = m_numOfAASamples; samples >= 0; samples--) {
205                 i = 0; /* Reusing attributes array, so reset counter */
206
207                 if (m_stereoVisual)
208                         attributes[i++] = GLX_STEREO;
209
210                 attributes[i++] = GLX_RGBA;
211                 attributes[i++] = GLX_DOUBLEBUFFER;
212                 attributes[i++] = GLX_RED_SIZE;   attributes[i++] = 1;
213                 attributes[i++] = GLX_BLUE_SIZE;  attributes[i++] = 1;
214                 attributes[i++] = GLX_GREEN_SIZE; attributes[i++] = 1;
215                 attributes[i++] = GLX_DEPTH_SIZE; attributes[i++] = 1;
216                 /* GLX >= 1.4 required for multi-sample */
217                 if (samples && (glxVersionMajor >= 1) && (glxVersionMinor >= 4)) {
218                         attributes[i++] = GLX_SAMPLE_BUFFERS; attributes[i++] = 1;
219                         attributes[i++] = GLX_SAMPLES; attributes[i++] = samples;
220                 }
221                 attributes[i] = None;
222
223                 m_visual = glXChooseVisual(m_display, DefaultScreen(m_display), attributes);
224
225                 /* Any sample level or even zero, which means oversampling disabled, is good
226                  * but we need a valid visual to continue */
227                 if (m_visual == NULL) {
228                         if (samples == 0) {
229                                 /* All options exhausted, cannot continue */
230                                 printf("%s:%d: X11 glXChooseVisual() failed, verify working openGL system!\n", __FILE__, __LINE__);
231                                 
232                                 if (s_firstContext == NULL) {
233                                         printf("initial window could not find the GLX extension, exit!\n");
234                                         exit(1);
235                                 }
236                                 
237                                 return;
238                         }
239                 }
240                 else {
241                         if (m_numOfAASamples && (m_numOfAASamples > samples)) {
242                                 printf("%s:%d: oversampling requested %i but using %i samples\n",
243                                        __FILE__, __LINE__, m_numOfAASamples, samples);
244                         }
245                         break;
246                 }
247         }
248
249         /* Create a bunch of attributes needed to create an X window. */
250
251
252         /* First create a colormap for the window and visual.
253          * This seems pretty much a legacy feature as we are in rgba mode anyway. */
254
255         XSetWindowAttributes xattributes;
256         memset(&xattributes, 0, sizeof(xattributes));
257
258         xattributes.colormap = XCreateColormap(m_display,
259                                                RootWindow(m_display, m_visual->screen),
260                                                m_visual->visual,
261                                                AllocNone
262                                                );
263
264         xattributes.border_pixel = 0;
265
266         /* Specify which events we are interested in hearing. */
267
268         xattributes.event_mask =
269                 ExposureMask | StructureNotifyMask |
270                 KeyPressMask | KeyReleaseMask |
271                 EnterWindowMask | LeaveWindowMask |
272                 ButtonPressMask | ButtonReleaseMask |
273                 PointerMotionMask | FocusChangeMask |
274                 PropertyChangeMask | KeymapStateMask;
275
276         /* create the window! */
277         if (parentWindow == 0) {
278                 m_window =  XCreateWindow(m_display,
279                                           RootWindow(m_display, m_visual->screen),
280                                           left,
281                                           top,
282                                           width,
283                                           height,
284                                           0,  /* no border. */
285                                           m_visual->depth,
286                                           InputOutput,
287                                           m_visual->visual,
288                                           CWBorderPixel | CWColormap | CWEventMask,
289                                           &xattributes
290                                           );
291         }
292         else {
293
294                 Window root_return;
295                 int x_return, y_return;
296                 unsigned int w_return, h_return, border_w_return, depth_return;
297                 
298                 XGetGeometry(m_display, parentWindow, &root_return, &x_return, &y_return,
299                              &w_return, &h_return, &border_w_return, &depth_return);
300
301                 left = 0;
302                 top = 0;
303                 width = w_return;
304                 height = h_return;
305
306
307                 m_window = XCreateWindow(m_display,
308                                          parentWindow,  /* reparent against embedder */
309                                          left,
310                                          top,
311                                          width,
312                                          height,
313                                          0,     /* no border. */
314                                          m_visual->depth,
315                                          InputOutput,
316                                          m_visual->visual,
317                                          CWBorderPixel | CWColormap | CWEventMask,
318                                          &xattributes
319                                          );
320
321                 XSelectInput(m_display, parentWindow, SubstructureNotifyMask);
322                 
323         }       
324
325 #ifdef WITH_XDND
326         /* initialize drop target for newly created window */
327         m_dropTarget = new GHOST_DropTargetX11(this, m_system);
328         GHOST_PRINT("Set drop target\n");
329 #endif
330
331         if (state == GHOST_kWindowStateMaximized || state == GHOST_kWindowStateFullScreen) {
332                 Atom _NET_WM_STATE = XInternAtom(m_display, "_NET_WM_STATE", False);
333                 Atom _NET_WM_STATE_MAXIMIZED_VERT = XInternAtom(m_display, "_NET_WM_STATE_MAXIMIZED_VERT", False);
334                 Atom _NET_WM_STATE_MAXIMIZED_HORZ = XInternAtom(m_display, "_NET_WM_STATE_MAXIMIZED_HORZ", False);
335                 Atom _NET_WM_STATE_FULLSCREEN     = XInternAtom(m_display, "_NET_WM_STATE_FULLSCREEN", False);
336                 Atom atoms[2];
337                 int count = 0;
338
339                 if (state == GHOST_kWindowStateMaximized) {
340                         atoms[count++] = _NET_WM_STATE_MAXIMIZED_VERT;
341                         atoms[count++] = _NET_WM_STATE_MAXIMIZED_HORZ;
342                 }
343                 else {
344                         atoms[count++] = _NET_WM_STATE_FULLSCREEN;
345                 }
346
347                 XChangeProperty(m_display, m_window, _NET_WM_STATE, XA_ATOM, 32,
348                                 PropModeReplace, (unsigned char *)atoms, count);
349                 m_post_init = False;
350         }
351         /*
352          * One of the problem with WM-spec is that can't set a property
353          * to a window that isn't mapped. That is why we can't "just
354          * call setState" here.
355          *
356          * To fix this, we first need know that the window is really
357          * map waiting for the MapNotify event.
358          *
359          * So, m_post_init indicate that we need wait for the MapNotify
360          * event and then set the Window state to the m_post_state.
361          */
362         else if ((state != GHOST_kWindowStateNormal) && (state != GHOST_kWindowStateMinimized)) {
363                 m_post_init = True;
364                 m_post_state = state;
365         }
366         else {
367                 m_post_init = False;
368                 m_post_state = GHOST_kWindowStateNormal;
369         }
370
371         /* Create some hints for the window manager on how
372          * we want this window treated. */
373
374         XSizeHints *xsizehints = XAllocSizeHints();
375         xsizehints->flags = PPosition | PSize | PMinSize | PMaxSize;
376         xsizehints->x = left;
377         xsizehints->y = top;
378         xsizehints->width = width;
379         xsizehints->height = height;
380         xsizehints->min_width = 320;     /* size hints, could be made apart of the ghost api */
381         xsizehints->min_height = 240;    /* limits are also arbitrary, but should not allow 1x1 window */
382         xsizehints->max_width = 65535;
383         xsizehints->max_height = 65535;
384         XSetWMNormalHints(m_display, m_window, xsizehints);
385         XFree(xsizehints);
386
387         XClassHint *xclasshint = XAllocClassHint();
388         const int len = title.Length() + 1;
389         char *wmclass = (char *)malloc(sizeof(char) * len);
390         strncpy(wmclass, (const char *)title, sizeof(char) * len);
391         xclasshint->res_name = wmclass;
392         xclasshint->res_class = wmclass;
393         XSetClassHint(m_display, m_window, xclasshint);
394         free(wmclass);
395         XFree(xclasshint);
396
397         /* The basic for a good ICCCM "work" */
398         if (m_system->m_wm_protocols) {
399                 natom = 0;
400
401                 if (m_system->m_delete_window_atom) {
402                         atoms[natom] = m_system->m_delete_window_atom;
403                         natom++;
404                 }
405
406                 if (m_system->m_wm_take_focus) {
407                         atoms[natom] = m_system->m_wm_take_focus;
408                         natom++;
409                 }
410
411                 if (natom) {
412                         /* printf("Register atoms: %d\n", natom); */
413                         XSetWMProtocols(m_display, m_window, atoms, natom);
414                 }
415         }
416
417 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
418         m_xic = NULL;
419 #endif
420
421         /* Set the window icon */
422         XWMHints *xwmhints = XAllocWMHints();
423         XImage *x_image, *mask_image;
424         Pixmap icon_pixmap, mask_pixmap;
425         icon_pixmap = XCreatePixmap(display, m_window, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 24);
426         mask_pixmap = XCreatePixmap(display, m_window, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 1);
427         GC gc_icon = XCreateGC(display, icon_pixmap, 0, NULL);
428         GC gc_mask = XCreateGC(display, mask_pixmap, 0, NULL);
429         
430         x_image = XCreateImage(display, m_visual->visual, 24, ZPixmap, 0, NULL, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 32, 0);
431         mask_image = XCreateImage(display, m_visual->visual, 1, ZPixmap, 0, NULL,  BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 8, 0);
432         
433         x_image->data = (char *)calloc(x_image->bytes_per_line * BLENDER_ICON_HEIGHT, 1);
434         mask_image->data = (char *)calloc(mask_image->bytes_per_line * BLENDER_ICON_HEIGHT, 1);
435         
436         /* copy the BLENDER_ICON_48x48x24 into the XImage */
437         unsigned char *col = BLENDER_ICON_48x48x24;
438         int px, py;
439         for (px = 0; px < BLENDER_ICON_WIDTH; px++) {
440                 for (py = 0; py < BLENDER_ICON_HEIGHT; py++, col += 3) {
441                         /* mask out pink */
442                         if (col[0] == 255 && col[1] == 0 && col[2] == 255) {
443 #if 0
444                                 /* instead, use calloc above */
445                                 XPutPixel(x_image, px, py, 0); /* avoid uninitialized memory, otherwise not needed */
446                                 XPutPixel(mask_image, px, py, 0);
447 #endif
448                         }
449                         else {
450                                 XPutPixel(x_image, px, py, (col[0] << 16) + (col[1] << 8) + col[2]);
451                                 XPutPixel(mask_image, px, py, 1);
452                         }
453                 }
454         }
455         
456         XPutImage(display, icon_pixmap, gc_icon, x_image, 0, 0, 0, 0, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT);
457         XPutImage(display, mask_pixmap, gc_mask, mask_image, 0, 0, 0, 0, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT);
458         
459         /* Now the pixmap is ok to assign to the window as a hint */
460         xwmhints->icon_pixmap = icon_pixmap;
461         xwmhints->icon_mask = mask_pixmap;
462         XFreeGC(display, gc_icon);
463         XFreeGC(display, gc_mask);
464         XDestroyImage(x_image);   /* frees x_image->data too */
465         XDestroyImage(mask_image);
466         
467         xwmhints->initial_state = NormalState;
468         xwmhints->input = True;
469         xwmhints->flags = InputHint | IconPixmapHint | IconMaskHint | StateHint;
470         XSetWMHints(display, m_window, xwmhints);
471         XFree(xwmhints);
472         /* done setting the icon */
473
474         setTitle(title);
475
476 #ifdef WITH_X11_XINPUT
477         initXInputDevices();
478
479         m_tabletData.Active = GHOST_kTabletModeNone;
480 #endif
481
482         /* now set up the rendering context. */
483         if (installDrawingContext(type) == GHOST_kSuccess) {
484                 m_valid_setup = true;
485                 GHOST_PRINT("Created window\n");
486         }
487
488         XMapWindow(m_display, m_window);
489         GHOST_PRINT("Mapped window\n");
490
491         XFlush(m_display);
492 }
493
494 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
495 static void destroyICCallback(XIC xic, XPointer ptr, XPointer data)
496 {
497         GHOST_PRINT("XIM input context destroyed\n");
498
499         if (ptr) {
500                 *(XIC *)ptr = NULL;
501         }
502 }
503
504 bool GHOST_WindowX11::createX11_XIC()
505 {
506         XIM xim = m_system->getX11_XIM();
507         if (!xim)
508                 return false;
509
510         XICCallback destroy;
511         destroy.callback = (XICProc)destroyICCallback;
512         destroy.client_data = (XPointer)&m_xic;
513         m_xic = XCreateIC(xim, XNClientWindow, m_window, XNFocusWindow, m_window,
514                           XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
515                           XNResourceName, GHOST_X11_RES_NAME,
516                           XNResourceClass, GHOST_X11_RES_CLASS,
517                           XNDestroyCallback, &destroy,
518                           NULL);
519         if (!m_xic)
520                 return false;
521
522         unsigned long fevent;
523         XGetICValues(m_xic, XNFilterEvents, &fevent, NULL);
524         XSelectInput(m_display, m_window,
525                      ExposureMask | StructureNotifyMask |
526                      KeyPressMask | KeyReleaseMask |
527                      EnterWindowMask | LeaveWindowMask |
528                      ButtonPressMask | ButtonReleaseMask |
529                      PointerMotionMask | FocusChangeMask |
530                      PropertyChangeMask | KeymapStateMask | fevent);
531         return true;
532 }
533 #endif
534
535 #ifdef WITH_X11_XINPUT
536 void GHOST_WindowX11::initXInputDevices()
537 {
538         XExtensionVersion *version = XGetExtensionVersion(m_display, INAME);
539
540         if (version && (version != (XExtensionVersion *)NoSuchExtension)) {
541                 if (version->present) {
542                         GHOST_SystemX11::GHOST_TabletX11 &xtablet = m_system->GetXTablet();
543                         XEventClass xevents[10], ev;
544                         int dcount = 0;
545
546                         if (xtablet.StylusDevice) {
547                                 DeviceMotionNotify(xtablet.StylusDevice, xtablet.MotionEvent, ev);
548                                 if (ev) xevents[dcount++] = ev;
549                                 ProximityIn(xtablet.StylusDevice, xtablet.ProxInEvent, ev);
550                                 if (ev) xevents[dcount++] = ev;
551                                 ProximityOut(xtablet.StylusDevice, xtablet.ProxOutEvent, ev);
552                                 if (ev) xevents[dcount++] = ev;
553                         }
554                         if (xtablet.EraserDevice) {
555                                 DeviceMotionNotify(xtablet.EraserDevice, xtablet.MotionEvent, ev);
556                                 if (ev) xevents[dcount++] = ev;
557                                 ProximityIn(xtablet.EraserDevice, xtablet.ProxInEvent, ev);
558                                 if (ev) xevents[dcount++] = ev;
559                                 ProximityOut(xtablet.EraserDevice, xtablet.ProxOutEvent, ev);
560                                 if (ev) xevents[dcount++] = ev;
561                         }
562
563                         XSelectExtensionEvent(m_display, m_window, xevents, dcount);
564                 }
565                 XFree(version);
566         }
567 }
568
569 #endif /* WITH_X11_XINPUT */
570
571 Window
572 GHOST_WindowX11::
573 getXWindow()
574 {
575         return m_window;
576 }
577
578 bool
579 GHOST_WindowX11::
580 getValid() const
581 {
582         return m_valid_setup;
583 }
584
585 void
586 GHOST_WindowX11::
587 setTitle(
588                 const STR_String& title)
589 {
590         Atom name = XInternAtom(m_display, "_NET_WM_NAME", 0);
591         Atom utf8str = XInternAtom(m_display, "UTF8_STRING", 0);
592         XChangeProperty(m_display, m_window,
593                         name, utf8str, 8, PropModeReplace,
594                         (const unsigned char *) title.ReadPtr(),
595                         title.Length());
596
597         /* This should convert to valid x11 string
598          * and getTitle would need matching change */
599         XStoreName(m_display, m_window, title);
600
601         XFlush(m_display);
602 }
603
604 void
605 GHOST_WindowX11::
606 getTitle(
607                 STR_String& title) const
608 {
609         char *name = NULL;
610         
611         XFetchName(m_display, m_window, &name);
612         title = name ? name : "untitled";
613         XFree(name);
614 }
615         
616 void
617 GHOST_WindowX11::
618 getWindowBounds(
619                 GHOST_Rect& bounds) const
620 {
621         /* Getting the window bounds under X11 is not
622          * really supported (nor should it be desired). */
623         getClientBounds(bounds);
624 }
625
626 void
627 GHOST_WindowX11::
628 getClientBounds(
629                 GHOST_Rect& bounds) const
630 {
631         Window root_return;
632         int x_return, y_return;
633         unsigned int w_return, h_return, border_w_return, depth_return;
634         GHOST_TInt32 screen_x, screen_y;
635         
636         XGetGeometry(m_display, m_window, &root_return, &x_return, &y_return,
637                      &w_return, &h_return, &border_w_return, &depth_return);
638
639         clientToScreen(0, 0, screen_x, screen_y);
640         
641         bounds.m_l = screen_x;
642         bounds.m_r = bounds.m_l + w_return;
643         bounds.m_t = screen_y;
644         bounds.m_b = bounds.m_t + h_return;
645
646 }
647
648 GHOST_TSuccess
649 GHOST_WindowX11::
650 setClientWidth(
651                 GHOST_TUns32 width)
652 {
653         XWindowChanges values;
654         unsigned int value_mask = CWWidth;
655         values.width = width;
656         XConfigureWindow(m_display, m_window, value_mask, &values);
657
658         return GHOST_kSuccess;
659 }
660
661 GHOST_TSuccess
662 GHOST_WindowX11::
663 setClientHeight(
664                 GHOST_TUns32 height)
665 {
666         XWindowChanges values;
667         unsigned int value_mask = CWHeight;
668         values.height = height;
669         XConfigureWindow(m_display, m_window, value_mask, &values);
670         return GHOST_kSuccess;
671
672 }
673
674 GHOST_TSuccess
675 GHOST_WindowX11::
676 setClientSize(
677                 GHOST_TUns32 width,
678                 GHOST_TUns32 height)
679 {
680         XWindowChanges values;
681         unsigned int value_mask = CWWidth | CWHeight;
682         values.width = width;
683         values.height = height;
684         XConfigureWindow(m_display, m_window, value_mask, &values);
685         return GHOST_kSuccess;
686
687 }       
688
689 void
690 GHOST_WindowX11::
691 screenToClient(
692                 GHOST_TInt32 inX,
693                 GHOST_TInt32 inY,
694                 GHOST_TInt32& outX,
695                 GHOST_TInt32& outY) const
696 {
697         /* This is correct! */
698
699         int ax, ay;
700         Window temp;
701
702         XTranslateCoordinates(m_display,
703                               RootWindow(m_display, m_visual->screen),
704                               m_window,
705                               inX, inY,
706                               &ax, &ay,
707                               &temp);
708         outX = ax;
709         outY = ay;
710 }
711                  
712 void
713 GHOST_WindowX11::
714 clientToScreen(
715                 GHOST_TInt32 inX,
716                 GHOST_TInt32 inY,
717                 GHOST_TInt32& outX,
718                 GHOST_TInt32& outY) const
719 {
720         int ax, ay;
721         Window temp;
722
723         XTranslateCoordinates(
724             m_display,
725             m_window,
726             RootWindow(m_display, m_visual->screen),
727             inX, inY,
728             &ax, &ay,
729             &temp);
730         outX = ax;
731         outY = ay;
732 }
733
734 void GHOST_WindowX11::icccmSetState(int state)
735 {
736         XEvent xev;
737
738         if (state != IconicState)
739                 return;
740
741         xev.xclient.type = ClientMessage;
742         xev.xclient.serial = 0;
743         xev.xclient.send_event = True;
744         xev.xclient.display = m_display;
745         xev.xclient.window = m_window;
746         xev.xclient.format = 32;
747         xev.xclient.message_type = m_system->m_wm_change_state;
748         xev.xclient.data.l[0] = state;
749         XSendEvent(m_display, RootWindow(m_display, DefaultScreen(m_display)),
750                    False, SubstructureNotifyMask | SubstructureRedirectMask, &xev);
751 }
752
753 int GHOST_WindowX11::icccmGetState(void) const
754 {
755         unsigned char *prop_ret;
756         unsigned long bytes_after, num_ret;
757         Atom type_ret;
758         int format_ret, st;
759
760         prop_ret = NULL;
761         st = XGetWindowProperty(m_display, m_window, m_system->m_wm_state, 0,
762                                 0x7fffffff, False, m_system->m_wm_state, &type_ret,
763                                 &format_ret, &num_ret, &bytes_after, &prop_ret);
764
765         if ((st == Success) && (prop_ret) && (num_ret == 2))
766                 st = prop_ret[0];
767         else
768                 st = NormalState;
769
770         if (prop_ret)
771                 XFree(prop_ret);
772         return (st);
773 }
774
775 void GHOST_WindowX11::netwmMaximized(bool set)
776 {
777         XEvent xev;
778
779         xev.xclient.type = ClientMessage;
780         xev.xclient.serial = 0;
781         xev.xclient.send_event = True;
782         xev.xclient.window = m_window;
783         xev.xclient.message_type = m_system->m_net_state;
784         xev.xclient.format = 32;
785
786         if (set == True)
787                 xev.xclient.data.l[0] = _NET_WM_STATE_ADD;
788         else
789                 xev.xclient.data.l[0] = _NET_WM_STATE_REMOVE;
790
791         xev.xclient.data.l[1] = m_system->m_net_max_horz;
792         xev.xclient.data.l[2] = m_system->m_net_max_vert;
793         xev.xclient.data.l[3] = 0;
794         xev.xclient.data.l[4] = 0;
795         XSendEvent(m_display, RootWindow(m_display, DefaultScreen(m_display)),
796                    False, SubstructureRedirectMask | SubstructureNotifyMask, &xev);
797 }
798
799 bool GHOST_WindowX11::netwmIsMaximized(void) const
800 {
801         unsigned char *prop_ret;
802         unsigned long bytes_after, num_ret, i;
803         Atom type_ret;
804         bool st;
805         int format_ret, ret, count;
806
807         prop_ret = NULL;
808         st = False;
809         ret = XGetWindowProperty(m_display, m_window, m_system->m_net_state, 0,
810                                  0x7fffffff, False, XA_ATOM, &type_ret, &format_ret,
811                                  &num_ret, &bytes_after, &prop_ret);
812         if ((ret == Success) && (prop_ret) && (format_ret == 32)) {
813                 count = 0;
814                 for (i = 0; i < num_ret; i++) {
815                         if (((unsigned long *) prop_ret)[i] == m_system->m_net_max_horz)
816                                 count++;
817                         if (((unsigned long *) prop_ret)[i] == m_system->m_net_max_vert)
818                                 count++;
819                         if (count == 2) {
820                                 st = True;
821                                 break;
822                         }
823                 }
824         }
825
826         if (prop_ret)
827                 XFree(prop_ret);
828         return (st);
829 }
830
831 void GHOST_WindowX11::netwmFullScreen(bool set)
832 {
833         XEvent xev;
834
835         xev.xclient.type = ClientMessage;
836         xev.xclient.serial = 0;
837         xev.xclient.send_event = True;
838         xev.xclient.window = m_window;
839         xev.xclient.message_type = m_system->m_net_state;
840         xev.xclient.format = 32;
841
842         if (set == True)
843                 xev.xclient.data.l[0] = _NET_WM_STATE_ADD;
844         else
845                 xev.xclient.data.l[0] = _NET_WM_STATE_REMOVE;
846
847         xev.xclient.data.l[1] = m_system->m_net_fullscreen;
848         xev.xclient.data.l[2] = 0;
849         xev.xclient.data.l[3] = 0;
850         xev.xclient.data.l[4] = 0;
851         XSendEvent(m_display, RootWindow(m_display, DefaultScreen(m_display)),
852                    False, SubstructureRedirectMask | SubstructureNotifyMask, &xev);
853 }
854
855 bool GHOST_WindowX11::netwmIsFullScreen(void) const
856 {
857         unsigned char *prop_ret;
858         unsigned long bytes_after, num_ret, i;
859         Atom type_ret;
860         bool st;
861         int format_ret, ret;
862
863         prop_ret = NULL;
864         st = False;
865         ret = XGetWindowProperty(m_display, m_window, m_system->m_net_state, 0,
866                                  0x7fffffff, False, XA_ATOM, &type_ret, &format_ret,
867                                  &num_ret, &bytes_after, &prop_ret);
868         if ((ret == Success) && (prop_ret) && (format_ret == 32)) {
869                 for (i = 0; i < num_ret; i++) {
870                         if (((unsigned long *) prop_ret)[i] == m_system->m_net_fullscreen) {
871                                 st = True;
872                                 break;
873                         }
874                 }
875         }
876
877         if (prop_ret)
878                 XFree(prop_ret);
879         return (st);
880 }
881
882 void GHOST_WindowX11::motifFullScreen(bool set)
883 {
884         MotifWmHints hints;
885
886         hints.flags = MWM_HINTS_DECORATIONS;
887         if (set == True)
888                 hints.decorations = 0;
889         else
890                 hints.decorations = 1;
891
892         XChangeProperty(m_display, m_window, m_system->m_motif,
893                         m_system->m_motif, 32, PropModeReplace,
894                         (unsigned char *) &hints, 4);
895 }
896
897 bool GHOST_WindowX11::motifIsFullScreen(void) const
898 {
899         unsigned char *prop_ret;
900         unsigned long bytes_after, num_ret;
901         MotifWmHints *hints;
902         Atom type_ret;
903         bool state;
904         int format_ret, st;
905
906         prop_ret = NULL;
907         state = False;
908         st = XGetWindowProperty(m_display, m_window, m_system->m_motif, 0,
909                                 0x7fffffff, False, m_system->m_motif,
910                                 &type_ret, &format_ret, &num_ret,
911                                 &bytes_after, &prop_ret);
912         if ((st == Success) && (prop_ret)) {
913                 hints = (MotifWmHints *) prop_ret;
914                 if (hints->flags & MWM_HINTS_DECORATIONS) {
915                         if (!hints->decorations)
916                                 state = True;
917                 }
918         }
919
920         if (prop_ret)
921                 XFree(prop_ret);
922         return (state);
923 }
924
925 GHOST_TWindowState GHOST_WindowX11::getState() const
926 {
927         GHOST_TWindowState state_ret;
928         int state;
929
930         state_ret = GHOST_kWindowStateNormal;
931         state = icccmGetState();
932         /*
933          * In the Iconic and Withdrawn state, the window
934          * is unmaped, so only need return a Minimized state.
935          */
936         if ((state == IconicState) || (state == WithdrawnState))
937                 state_ret = GHOST_kWindowStateMinimized;
938         else if (netwmIsMaximized() == True)
939                 state_ret = GHOST_kWindowStateMaximized;
940         else if (netwmIsFullScreen() == True)
941                 state_ret = GHOST_kWindowStateFullScreen;
942         else if (motifIsFullScreen() == True)
943                 state_ret = GHOST_kWindowStateFullScreen;
944         return (state_ret);
945 }
946
947 GHOST_TSuccess GHOST_WindowX11::setState(GHOST_TWindowState state)
948 {
949         GHOST_TWindowState cur_state;
950         bool is_max, is_full, is_motif_full;
951
952         cur_state = getState();
953         if (state == (int)cur_state)
954                 return GHOST_kSuccess;
955
956         if (cur_state != GHOST_kWindowStateMinimized) {
957                 /*
958                  * The window don't have this property's
959                  * if it's not mapped.
960                  */
961                 is_max = netwmIsMaximized();
962                 is_full = netwmIsFullScreen();
963         }
964         else {
965                 is_max = False;
966                 is_full = False;
967         }
968
969         is_motif_full = motifIsFullScreen();
970
971         if (state == GHOST_kWindowStateNormal)
972                 state = m_normal_state;
973
974         if (state == GHOST_kWindowStateNormal) {
975                 if (is_max == True)
976                         netwmMaximized(False);
977                 if (is_full == True)
978                         netwmFullScreen(False);
979                 if (is_motif_full == True)
980                         motifFullScreen(False);
981                 icccmSetState(NormalState);
982                 return (GHOST_kSuccess);
983         }
984
985         if (state == GHOST_kWindowStateFullScreen) {
986                 /*
987                  * We can't change to full screen if the window
988                  * isn't mapped.
989                  */
990                 if (cur_state == GHOST_kWindowStateMinimized)
991                         return (GHOST_kFailure);
992
993                 m_normal_state = cur_state;
994
995                 if (is_max == True)
996                         netwmMaximized(False);
997                 if (is_full == False)
998                         netwmFullScreen(True);
999                 if (is_motif_full == False)
1000                         motifFullScreen(True);
1001                 return (GHOST_kSuccess);
1002         }
1003
1004         if (state == GHOST_kWindowStateMaximized) {
1005                 /*
1006                  * We can't change to Maximized if the window
1007                  * isn't mapped.
1008                  */
1009                 if (cur_state == GHOST_kWindowStateMinimized)
1010                         return (GHOST_kFailure);
1011
1012                 if (is_full == True)
1013                         netwmFullScreen(False);
1014                 if (is_motif_full == True)
1015                         motifFullScreen(False);
1016                 if (is_max == False)
1017                         netwmMaximized(True);
1018                 return (GHOST_kSuccess);
1019         }
1020
1021         if (state == GHOST_kWindowStateMinimized) {
1022                 /*
1023                  * The window manager need save the current state of
1024                  * the window (maximized, full screen, etc).
1025                  */
1026                 icccmSetState(IconicState);
1027                 return (GHOST_kSuccess);
1028         }
1029
1030         return (GHOST_kFailure);
1031 }
1032
1033 #include <iostream>
1034
1035 GHOST_TSuccess
1036 GHOST_WindowX11::
1037 setOrder(
1038                 GHOST_TWindowOrder order)
1039 {
1040         if (order == GHOST_kWindowOrderTop) {
1041                 XWindowAttributes attr;   
1042                 Atom atom;
1043
1044                 /* We use both XRaiseWindow and _NET_ACTIVE_WINDOW, since some
1045                  * window managers ignore the former (e.g. kwin from kde) and others
1046                  * don't implement the latter (e.g. fluxbox pre 0.9.9) */
1047
1048                 XRaiseWindow(m_display, m_window);
1049
1050                 atom = XInternAtom(m_display, "_NET_ACTIVE_WINDOW", True);
1051
1052                 if (atom != None) {
1053                         Window root;
1054                         XEvent xev;
1055                         long eventmask;
1056
1057                         xev.xclient.type = ClientMessage;
1058                         xev.xclient.serial = 0;
1059                         xev.xclient.send_event = True;
1060                         xev.xclient.window = m_window;
1061                         xev.xclient.message_type = atom;
1062
1063                         xev.xclient.format = 32;
1064                         xev.xclient.data.l[0] = 1;
1065                         xev.xclient.data.l[1] = CurrentTime;
1066                         xev.xclient.data.l[2] = m_window;
1067                         xev.xclient.data.l[3] = 0;
1068                         xev.xclient.data.l[4] = 0;
1069
1070                         root = RootWindow(m_display, m_visual->screen),
1071                         eventmask = SubstructureRedirectMask | SubstructureNotifyMask;
1072
1073                         XSendEvent(m_display, root, False, eventmask, &xev);
1074                 }
1075
1076                 XGetWindowAttributes(m_display, m_window, &attr);
1077
1078                 /* iconized windows give bad match error */
1079                 if (attr.map_state == IsViewable)
1080                         XSetInputFocus(m_display, m_window, RevertToPointerRoot,
1081                                        CurrentTime);
1082                 XFlush(m_display);
1083         }
1084         else if (order == GHOST_kWindowOrderBottom) {
1085                 XLowerWindow(m_display, m_window);
1086                 XFlush(m_display);
1087         }
1088         else {
1089                 return GHOST_kFailure;
1090         }
1091         
1092         return GHOST_kSuccess;
1093 }
1094
1095 GHOST_TSuccess
1096 GHOST_WindowX11::
1097 swapBuffers()
1098 {
1099         if (getDrawingContextType() == GHOST_kDrawingContextTypeOpenGL) {
1100                 glXSwapBuffers(m_display, m_window);
1101                 return GHOST_kSuccess;
1102         }
1103         else {
1104                 return GHOST_kFailure;
1105         }
1106 }
1107
1108 GHOST_TSuccess
1109 GHOST_WindowX11::
1110 activateDrawingContext()
1111 {
1112         if (m_context != NULL) {
1113                 glXMakeCurrent(m_display, m_window, m_context);
1114                 /* Disable AA by default */
1115                 if (m_numOfAASamples > 0) {
1116                         glDisable(GL_MULTISAMPLE_ARB);
1117                 }
1118                 return GHOST_kSuccess;
1119         } 
1120         return GHOST_kFailure;
1121 }
1122
1123 GHOST_TSuccess
1124 GHOST_WindowX11::
1125 invalidate()
1126 {
1127         /* So the idea of this function is to generate an expose event
1128          * for the window.
1129          * Unfortunately X does not handle expose events for you and
1130          * it is the client's job to refresh the dirty part of the window.
1131          * We need to queue up invalidate calls and generate GHOST events
1132          * for them in the system.
1133          *
1134          * We implement this by setting a boolean in this class to concatenate
1135          * all such calls into a single event for this window.
1136          *
1137          * At the same time we queue the dirty windows in the system class
1138          * and generate events for them at the next processEvents call. */
1139
1140         if (m_invalid_window == false) {
1141                 m_system->addDirtyWindow(this);
1142                 m_invalid_window = true;
1143         } 
1144  
1145         return GHOST_kSuccess;
1146 }
1147
1148 /**
1149  * called by the X11 system implementation when expose events
1150  * for the window have been pushed onto the GHOST queue
1151  */
1152  
1153 void
1154 GHOST_WindowX11::
1155 validate()
1156 {
1157         m_invalid_window = false;
1158 }       
1159  
1160  
1161 /**
1162  * Destructor.
1163  * Closes the window and disposes resources allocated.
1164  */
1165
1166 GHOST_WindowX11::
1167 ~GHOST_WindowX11()
1168 {
1169         static Atom Primary_atom, Clipboard_atom;
1170         Window p_owner, c_owner;
1171         /*Change the owner of the Atoms to None if we are the owner*/
1172         Primary_atom = XInternAtom(m_display, "PRIMARY", False);
1173         Clipboard_atom = XInternAtom(m_display, "CLIPBOARD", False);
1174         
1175         p_owner = XGetSelectionOwner(m_display, Primary_atom);
1176         c_owner = XGetSelectionOwner(m_display, Clipboard_atom);
1177         
1178         std::map<unsigned int, Cursor>::iterator it = m_standard_cursors.begin();
1179         for (; it != m_standard_cursors.end(); ++it) {
1180                 XFreeCursor(m_display, it->second);
1181         }
1182
1183         if (m_empty_cursor) {
1184                 XFreeCursor(m_display, m_empty_cursor);
1185         }
1186         if (m_custom_cursor) {
1187                 XFreeCursor(m_display, m_custom_cursor);
1188         }
1189
1190         if (m_context != s_firstContext) {
1191                 glXDestroyContext(m_display, m_context);
1192         }
1193         
1194         if (p_owner == m_window) {
1195                 XSetSelectionOwner(m_display, Primary_atom, None, CurrentTime);
1196         }
1197         if (c_owner == m_window) {
1198                 XSetSelectionOwner(m_display, Clipboard_atom, None, CurrentTime);
1199         }
1200         
1201 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
1202         if (m_xic) {
1203                 XDestroyIC(m_xic);
1204         }
1205 #endif
1206
1207 #ifdef WITH_XDND
1208         delete m_dropTarget;
1209 #endif
1210
1211         XDestroyWindow(m_display, m_window);
1212         XFree(m_visual);
1213 }
1214
1215
1216
1217
1218 /**
1219  * Tries to install a rendering context in this window.
1220  * \param type  The type of rendering context installed.
1221  * \return Indication as to whether installation has succeeded.
1222  */
1223 GHOST_TSuccess
1224 GHOST_WindowX11::
1225 installDrawingContext(
1226                 GHOST_TDrawingContextType type)
1227 {
1228         /* only support openGL for now. */
1229         GHOST_TSuccess success;
1230         switch (type) {
1231                 case GHOST_kDrawingContextTypeOpenGL:
1232                 {
1233 #ifdef WITH_X11_XINPUT
1234                         /* use our own event handlers to avoid exiting blender,
1235                          * this would happen for eg:
1236                          * if you open blender, unplug a tablet, then open a new window. */
1237                         XErrorHandler old_handler      = XSetErrorHandler(GHOST_X11_ApplicationErrorHandler);
1238                         XIOErrorHandler old_handler_io = XSetIOErrorHandler(GHOST_X11_ApplicationIOErrorHandler);
1239 #endif
1240
1241                         m_context = glXCreateContext(m_display, m_visual, s_firstContext, True);
1242                         if (m_context != NULL) {
1243                                 if (!s_firstContext) {
1244                                         s_firstContext = m_context;
1245                                 }
1246                                 glXMakeCurrent(m_display, m_window, m_context);
1247                                 glClearColor(0.447, 0.447, 0.447, 0);
1248                                 glClear(GL_COLOR_BUFFER_BIT);
1249                                 success = GHOST_kSuccess;
1250                         }
1251                         else {
1252                                 success = GHOST_kFailure;
1253                         }
1254
1255 #ifdef WITH_X11_XINPUT
1256                         /* Restore handler */
1257                         (void) XSetErrorHandler(old_handler);
1258                         (void) XSetIOErrorHandler(old_handler_io);
1259 #endif
1260                         break;
1261                 }
1262                 case GHOST_kDrawingContextTypeNone:
1263                 {
1264                         success = GHOST_kSuccess;
1265                         break;
1266                 }
1267                 default:
1268                         success = GHOST_kFailure;
1269         }
1270         return success;
1271 }
1272
1273
1274
1275 /**
1276  * Removes the current drawing context.
1277  * \return Indication as to whether removal has succeeded.
1278  */
1279 GHOST_TSuccess
1280 GHOST_WindowX11::
1281 removeDrawingContext()
1282 {
1283         GHOST_TSuccess success;
1284
1285         if (m_context != NULL) {
1286                 glXDestroyContext(m_display, m_context);
1287                 success = GHOST_kSuccess;
1288         }
1289         else {
1290                 success = GHOST_kFailure;
1291         }
1292         return success; 
1293 }
1294
1295
1296 Cursor
1297 GHOST_WindowX11::
1298 getStandardCursor(
1299                 GHOST_TStandardCursor g_cursor)
1300 {
1301         unsigned int xcursor_id;
1302
1303 #define GtoX(gcurs, xcurs)  case gcurs: xcursor_id = xcurs
1304         switch (g_cursor) {
1305                 GtoX(GHOST_kStandardCursorRightArrow, XC_arrow); break;
1306                 GtoX(GHOST_kStandardCursorLeftArrow, XC_top_left_arrow); break;
1307                 GtoX(GHOST_kStandardCursorInfo, XC_hand1); break;
1308                 GtoX(GHOST_kStandardCursorDestroy, XC_pirate); break;
1309                 GtoX(GHOST_kStandardCursorHelp, XC_question_arrow); break;
1310                 GtoX(GHOST_kStandardCursorCycle, XC_exchange); break;
1311                 GtoX(GHOST_kStandardCursorSpray, XC_spraycan); break;
1312                 GtoX(GHOST_kStandardCursorWait, XC_watch); break;
1313                 GtoX(GHOST_kStandardCursorText, XC_xterm); break;
1314                 GtoX(GHOST_kStandardCursorCrosshair, XC_crosshair); break;
1315                 GtoX(GHOST_kStandardCursorUpDown, XC_sb_v_double_arrow); break;
1316                 GtoX(GHOST_kStandardCursorLeftRight, XC_sb_h_double_arrow); break;
1317                 GtoX(GHOST_kStandardCursorTopSide, XC_top_side); break;
1318                 GtoX(GHOST_kStandardCursorBottomSide, XC_bottom_side); break;
1319                 GtoX(GHOST_kStandardCursorLeftSide, XC_left_side); break;
1320                 GtoX(GHOST_kStandardCursorRightSide, XC_right_side); break;
1321                 GtoX(GHOST_kStandardCursorTopLeftCorner, XC_top_left_corner); break;
1322                 GtoX(GHOST_kStandardCursorTopRightCorner, XC_top_right_corner); break;
1323                 GtoX(GHOST_kStandardCursorBottomRightCorner, XC_bottom_right_corner); break;
1324                 GtoX(GHOST_kStandardCursorBottomLeftCorner, XC_bottom_left_corner); break;
1325                 GtoX(GHOST_kStandardCursorPencil, XC_pencil); break;
1326                 GtoX(GHOST_kStandardCursorCopy, XC_arrow); break;
1327                 default:
1328                         xcursor_id = 0;
1329         }
1330 #undef GtoX
1331
1332         if (xcursor_id) {
1333                 Cursor xcursor = m_standard_cursors[xcursor_id];
1334                 
1335                 if (!xcursor) {
1336                         xcursor = XCreateFontCursor(m_display, xcursor_id);
1337
1338                         m_standard_cursors[xcursor_id] = xcursor;
1339                 }
1340                 
1341                 return xcursor;
1342         }
1343         else {
1344                 return None;
1345         }
1346 }
1347
1348 Cursor
1349 GHOST_WindowX11::
1350 getEmptyCursor(
1351         ) {
1352         if (!m_empty_cursor) {
1353                 Pixmap blank;
1354                 XColor dummy;
1355                 char data[1] = {0};
1356                         
1357                 /* make a blank cursor */
1358                 blank = XCreateBitmapFromData(
1359                     m_display,
1360                     RootWindow(m_display, DefaultScreen(m_display)),
1361                     data, 1, 1
1362                     );
1363
1364                 m_empty_cursor = XCreatePixmapCursor(m_display, blank, blank, &dummy, &dummy, 0, 0);
1365                 XFreePixmap(m_display, blank);
1366         }
1367
1368         return m_empty_cursor;
1369 }
1370
1371 GHOST_TSuccess
1372 GHOST_WindowX11::
1373 setWindowCursorVisibility(
1374                 bool visible)
1375 {
1376         Cursor xcursor;
1377         
1378         if (visible) {
1379                 xcursor = getStandardCursor(getCursorShape() );
1380         }
1381         else {
1382                 xcursor = getEmptyCursor();
1383         }
1384
1385         XDefineCursor(m_display, m_window, xcursor);
1386         XFlush(m_display);
1387         
1388         return GHOST_kSuccess;
1389 }
1390
1391 GHOST_TSuccess
1392 GHOST_WindowX11::
1393 setWindowCursorGrab(
1394                 GHOST_TGrabCursorMode mode)
1395 {
1396         if (mode != GHOST_kGrabDisable) {
1397                 if (mode != GHOST_kGrabNormal) {
1398                         m_system->getCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]);
1399                         setCursorGrabAccum(0, 0);
1400
1401                         if (mode == GHOST_kGrabHide)
1402                                 setWindowCursorVisibility(false);
1403
1404                 }
1405 #ifdef GHOST_X11_GRAB
1406                 XGrabPointer(m_display, m_window, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
1407                              GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
1408 #endif
1409         }
1410         else {
1411                 if (m_cursorGrab == GHOST_kGrabHide) {
1412                         m_system->setCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]);
1413                         setWindowCursorVisibility(true);
1414                 }
1415
1416                 if (m_cursorGrab != GHOST_kGrabNormal) {
1417                         /* use to generate a mouse move event, otherwise the last event
1418                          * blender gets can be outside the screen causing menus not to show
1419                          * properly unless the user moves the mouse */
1420                         XWarpPointer(m_display, None, None, 0, 0, 0, 0, 0, 0);
1421                 }
1422
1423                 /* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */
1424                 setCursorGrabAccum(0, 0);
1425                 m_cursorGrabBounds.m_l = m_cursorGrabBounds.m_r = -1; /* disable */
1426 #ifdef GHOST_X11_GRAB
1427                 XUngrabPointer(m_display, CurrentTime);
1428 #endif
1429         }
1430
1431         XFlush(m_display);
1432         
1433         return GHOST_kSuccess;
1434 }
1435
1436 GHOST_TSuccess
1437 GHOST_WindowX11::
1438 setWindowCursorShape(
1439                 GHOST_TStandardCursor shape)
1440 {
1441         Cursor xcursor = getStandardCursor(shape);
1442         
1443         XDefineCursor(m_display, m_window, xcursor);
1444         XFlush(m_display);
1445
1446         return GHOST_kSuccess;
1447 }
1448
1449 GHOST_TSuccess
1450 GHOST_WindowX11::
1451 setWindowCustomCursorShape(
1452                 GHOST_TUns8 bitmap[16][2],
1453                 GHOST_TUns8 mask[16][2],
1454                 int hotX,
1455                 int hotY)
1456 {
1457         setWindowCustomCursorShape((GHOST_TUns8 *)bitmap, (GHOST_TUns8 *)mask,
1458                                    16, 16, hotX, hotY, 0, 1);
1459         return GHOST_kSuccess;
1460 }
1461
1462 GHOST_TSuccess
1463 GHOST_WindowX11::
1464 setWindowCustomCursorShape(     
1465                 GHOST_TUns8 *bitmap,
1466                 GHOST_TUns8 *mask,
1467                 int sizex,
1468                 int sizey,
1469                 int hotX,
1470                 int hotY,
1471                 int fg_color,
1472                 int bg_color)
1473 {
1474         Colormap colormap = DefaultColormap(m_display, DefaultScreen(m_display));
1475         Pixmap bitmap_pix, mask_pix;
1476         XColor fg, bg;
1477         
1478         if (XAllocNamedColor(m_display, colormap, "White", &fg, &fg) == 0) return GHOST_kFailure;
1479         if (XAllocNamedColor(m_display, colormap, "Black", &bg, &bg) == 0) return GHOST_kFailure;
1480
1481         if (m_custom_cursor) {
1482                 XFreeCursor(m_display, m_custom_cursor);
1483         }
1484
1485         bitmap_pix = XCreateBitmapFromData(m_display, m_window, (char *) bitmap, sizex, sizey);
1486         mask_pix = XCreateBitmapFromData(m_display, m_window, (char *) mask, sizex, sizey);
1487                 
1488         m_custom_cursor = XCreatePixmapCursor(m_display, bitmap_pix, mask_pix, &fg, &bg, hotX, hotY);
1489         XDefineCursor(m_display, m_window, m_custom_cursor);
1490         XFlush(m_display);
1491         
1492         XFreePixmap(m_display, bitmap_pix);
1493         XFreePixmap(m_display, mask_pix);
1494
1495         XFreeColors(m_display, colormap, &fg.pixel, 1, 0L);
1496         XFreeColors(m_display, colormap, &bg.pixel, 1, 0L);
1497
1498         return GHOST_kSuccess;
1499 }