code cleanup: quiet uninitialized memory use warning for X11 - harmless in this case...
[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
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 #ifdef WITH_X11_XINPUT
190         /* initialize incase X11 fails to load */
191         memset(&m_xtablet, 0, sizeof(m_xtablet));
192 #endif
193
194         m_visual = NULL;
195
196         if (!glXQueryVersion(m_display, &glxVersionMajor, &glxVersionMinor)) {
197                 printf("%s:%d: X11 glXQueryVersion() failed, verify working openGL system!\n", __FILE__, __LINE__);
198                 
199                 /* exit if this is the first window */
200                 if (s_firstContext == NULL) {
201                         printf("initial window could not find the GLX extension, exit!\n");
202                         exit(1);
203                 }
204
205                 return;
206         }
207
208         /* Find the display with highest samples, starting at level requested */
209         for (samples = m_numOfAASamples; samples >= 0; samples--) {
210                 i = 0; /* Reusing attributes array, so reset counter */
211
212                 if (m_stereoVisual)
213                         attributes[i++] = GLX_STEREO;
214
215                 attributes[i++] = GLX_RGBA;
216                 attributes[i++] = GLX_DOUBLEBUFFER;
217                 attributes[i++] = GLX_RED_SIZE;   attributes[i++] = 1;
218                 attributes[i++] = GLX_BLUE_SIZE;  attributes[i++] = 1;
219                 attributes[i++] = GLX_GREEN_SIZE; attributes[i++] = 1;
220                 attributes[i++] = GLX_DEPTH_SIZE; attributes[i++] = 1;
221                 /* GLX >= 1.4 required for multi-sample */
222                 if (samples && (glxVersionMajor >= 1) && (glxVersionMinor >= 4)) {
223                         attributes[i++] = GLX_SAMPLE_BUFFERS; attributes[i++] = 1;
224                         attributes[i++] = GLX_SAMPLES; attributes[i++] = samples;
225                 }
226                 attributes[i] = None;
227
228                 m_visual = glXChooseVisual(m_display, DefaultScreen(m_display), attributes);
229
230                 /* Any sample level or even zero, which means oversampling disabled, is good
231                  * but we need a valid visual to continue */
232                 if (m_visual == NULL) {
233                         if (samples == 0) {
234                                 /* All options exhausted, cannot continue */
235                                 printf("%s:%d: X11 glXChooseVisual() failed, verify working openGL system!\n", __FILE__, __LINE__);
236                                 
237                                 if (s_firstContext == NULL) {
238                                         printf("initial window could not find the GLX extension, exit!\n");
239                                         exit(1);
240                                 }
241                                 
242                                 return;
243                         }
244                 }
245                 else {
246                         if (m_numOfAASamples && (m_numOfAASamples > samples)) {
247                                 printf("%s:%d: oversampling requested %i but using %i samples\n",
248                                        __FILE__, __LINE__, m_numOfAASamples, samples);
249                         }
250                         break;
251                 }
252         }
253
254         // Create a bunch of attributes needed to create an X window.
255
256
257         // First create a colormap for the window and visual. 
258         // This seems pretty much a legacy feature as we are in rgba mode anyway.
259
260         XSetWindowAttributes xattributes;
261         memset(&xattributes, 0, sizeof(xattributes));
262
263         xattributes.colormap = XCreateColormap(m_display,
264                                                RootWindow(m_display, m_visual->screen),
265                                                m_visual->visual,
266                                                AllocNone
267                                                );
268
269         xattributes.border_pixel = 0;
270
271         // Specify which events we are interested in hearing.   
272
273         xattributes.event_mask =
274             ExposureMask | StructureNotifyMask |
275             KeyPressMask | KeyReleaseMask |
276             EnterWindowMask | LeaveWindowMask |
277             ButtonPressMask | ButtonReleaseMask |
278             PointerMotionMask | FocusChangeMask | PropertyChangeMask;
279
280         // create the window!
281
282         ;
283         if (parentWindow == 0) {
284                 m_window =  XCreateWindow(m_display,
285                                           RootWindow(m_display, m_visual->screen),
286                                           left,
287                                           top,
288                                           width,
289                                           height,
290                                           0, // no border.
291                                           m_visual->depth,
292                                           InputOutput,
293                                           m_visual->visual,
294                                           CWBorderPixel | CWColormap | CWEventMask,
295                                           &xattributes
296                                           );
297         }
298         else {
299
300                 Window root_return;
301                 int x_return, y_return;
302                 unsigned int w_return, h_return, border_w_return, depth_return;
303                 
304                 XGetGeometry(m_display, parentWindow, &root_return, &x_return, &y_return,
305                              &w_return, &h_return, &border_w_return, &depth_return);
306
307                 left = 0;
308                 top = 0;
309                 width = w_return;
310                 height = h_return;
311
312
313                 m_window = XCreateWindow(m_display,
314                                          parentWindow,      // reparent against embedder
315                                          left,
316                                          top,
317                                          width,
318                                          height,
319                                          0,     // no border.
320                                          m_visual->depth,
321                                          InputOutput,
322                                          m_visual->visual,
323                                          CWBorderPixel | CWColormap | CWEventMask,
324                                          &xattributes
325                                          );
326
327                 XSelectInput(m_display, parentWindow, SubstructureNotifyMask);
328                 
329         }       
330
331 #ifdef WITH_XDND
332         /* initialize drop target for newly created window */
333         m_dropTarget = new GHOST_DropTargetX11(this, m_system);
334         GHOST_PRINT("Set drop target\n");
335 #endif
336
337         /*
338          * One of the problem with WM-spec is that can't set a property
339          * to a window that isn't mapped. That is why we can't "just
340          * call setState" here.
341          *
342          * To fix this, we first need know that the window is really
343          * map waiting for the MapNotify event.
344          *
345          * So, m_post_init indicate that we need wait for the MapNotify
346          * event and then set the Window state to the m_post_state.
347          */
348         if ((state != GHOST_kWindowStateNormal) && (state != GHOST_kWindowStateMinimized)) {
349                 m_post_init = True;
350                 m_post_state = state;
351         }
352         else {
353                 m_post_init = False;
354                 m_post_state = GHOST_kWindowStateNormal;
355         }
356         
357         // Create some hints for the window manager on how
358         // we want this window treated.
359
360         XSizeHints *xsizehints = XAllocSizeHints();
361         xsizehints->flags = PPosition | PSize | PMinSize | PMaxSize;
362         xsizehints->x = left;
363         xsizehints->y = top;
364         xsizehints->width = width;
365         xsizehints->height = height;
366         xsizehints->min_width = 320;     // size hints, could be made apart of the ghost api
367         xsizehints->min_height = 240;    // limits are also arbitrary, but should not allow 1x1 window
368         xsizehints->max_width = 65535;
369         xsizehints->max_height = 65535;
370         XSetWMNormalHints(m_display, m_window, xsizehints);
371         XFree(xsizehints);
372
373         XClassHint *xclasshint = XAllocClassHint();
374         const int len = title.Length() + 1;
375         char *wmclass = (char *)malloc(sizeof(char) * len);
376         strncpy(wmclass, (const char *)title, sizeof(char) * len);
377         xclasshint->res_name = wmclass;
378         xclasshint->res_class = wmclass;
379         XSetClassHint(m_display, m_window, xclasshint);
380         free(wmclass);
381         XFree(xclasshint);
382
383         /* The basic for a good ICCCM "work" */
384         if (m_system->m_wm_protocols) {
385                 natom = 0;
386
387                 if (m_system->m_delete_window_atom) {
388                         atoms[natom] = m_system->m_delete_window_atom;
389                         natom++;
390                 }
391
392                 if (m_system->m_wm_take_focus) {
393                         atoms[natom] = m_system->m_wm_take_focus;
394                         natom++;
395                 }
396
397                 if (natom) {
398                         /* printf("Register atoms: %d\n", natom); */
399                         XSetWMProtocols(m_display, m_window, atoms, natom);
400                 }
401         }
402
403 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
404         m_xic = XCreateIC(m_system->getX11_XIM(), XNClientWindow, m_window, XNFocusWindow, m_window,
405                           XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
406                           XNResourceName, GHOST_X11_RES_NAME, XNResourceClass,
407                           GHOST_X11_RES_CLASS, NULL);
408 #endif
409
410         // Set the window icon
411         XWMHints *xwmhints = XAllocWMHints();
412         XImage *x_image, *mask_image;
413         Pixmap icon_pixmap, mask_pixmap;
414         icon_pixmap = XCreatePixmap(display, m_window, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 24);
415         mask_pixmap = XCreatePixmap(display, m_window, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 1);
416         GC gc_icon = XCreateGC(display, icon_pixmap, 0, NULL);
417         GC gc_mask = XCreateGC(display, mask_pixmap, 0, NULL);
418         
419         x_image = XCreateImage(display, m_visual->visual, 24, ZPixmap, 0, NULL, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 32, 0);
420         mask_image = XCreateImage(display, m_visual->visual, 1, ZPixmap, 0, NULL,  BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 8, 0);
421         
422         x_image->data = (char *)calloc(x_image->bytes_per_line * BLENDER_ICON_HEIGHT, 1);
423         mask_image->data = (char *)calloc(mask_image->bytes_per_line * BLENDER_ICON_HEIGHT, 1);
424         
425         /* copy the BLENDER_ICON_48x48x24 into the XImage */
426         unsigned char *col = BLENDER_ICON_48x48x24;
427         int px, py;
428         for (px = 0; px < BLENDER_ICON_WIDTH; px++) {
429                 for (py = 0; py < BLENDER_ICON_HEIGHT; py++, col += 3) {
430                         /* mask out pink */
431                         if (col[0] == 255 && col[1] == 0 && col[2] == 255) {
432 #if 0
433                                 /* instead, use calloc above */
434                                 XPutPixel(x_image, px, py, 0); /* avoid uninitialized memory, otherwise not needed */
435                                 XPutPixel(mask_image, px, py, 0);
436 #endif
437                         }
438                         else {
439                                 XPutPixel(x_image, px, py, (col[0] << 16) + (col[1] << 8) + col[2]);
440                                 XPutPixel(mask_image, px, py, 1);
441                         }
442                 }
443         }
444         
445         XPutImage(display, icon_pixmap, gc_icon, x_image, 0, 0, 0, 0, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT);
446         XPutImage(display, mask_pixmap, gc_mask, mask_image, 0, 0, 0, 0, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT);
447         
448         // Now the pixmap is ok to assign to the window as a hint
449         xwmhints->icon_pixmap = icon_pixmap;
450         xwmhints->icon_mask = mask_pixmap;
451         XFreeGC(display, gc_icon);
452         XFreeGC(display, gc_mask);
453         XDestroyImage(x_image);   /* frees x_image->data too */
454         XDestroyImage(mask_image);
455         
456         xwmhints->initial_state = NormalState;
457         xwmhints->input = True;
458         xwmhints->flags = InputHint | IconPixmapHint | IconMaskHint | StateHint;
459         XSetWMHints(display, m_window, xwmhints);
460         XFree(xwmhints);
461         // done setting the icon
462
463         setTitle(title);
464
465 #ifdef WITH_X11_XINPUT
466         initXInputDevices();
467 #endif
468
469         // now set up the rendering context.
470         if (installDrawingContext(type) == GHOST_kSuccess) {
471                 m_valid_setup = true;
472                 GHOST_PRINT("Created window\n");
473         }
474
475         XMapWindow(m_display, m_window);
476         GHOST_PRINT("Mapped window\n");
477
478         XFlush(m_display);
479 }
480
481 #ifdef WITH_X11_XINPUT
482 /* 
483  * Dummy function to get around IO Handler exiting if device invalid
484  * Basically it will not crash blender now if you have a X device that
485  * is configured but not plugged in.
486  */
487 static int ApplicationErrorHandler(Display *display, XErrorEvent *theEvent)
488 {
489         fprintf(stderr, "Ignoring Xlib error: error code %d request code %d\n",
490                 theEvent->error_code, theEvent->request_code);
491
492         /* No exit! - but keep lint happy */
493         return 0;
494 }
495
496 /* These C functions are copied from Wine 1.1.13's wintab.c */
497 #define BOOL int
498 #define TRUE 1
499 #define FALSE 0
500
501 static bool match_token(const char *haystack, const char *needle)
502 {
503         const char *p, *q;
504         for (p = haystack; *p; )
505         {
506                 while (*p && isspace(*p))
507                         p++;
508                 if (!*p)
509                         break;
510
511                 for (q = needle; *q && *p && tolower(*p) == tolower(*q); q++)
512                         p++;
513                 if (!*q && (isspace(*p) || !*p))
514                         return TRUE;
515
516                 while (*p && !isspace(*p))
517                         p++;
518         }
519         return FALSE;
520 }
521
522
523 /* Determining if an X device is a Tablet style device is an imperfect science.
524  * We rely on common conventions around device names as well as the type reported
525  * by Wacom tablets.  This code will likely need to be expanded for alternate tablet types
526  *
527  * Wintab refers to any device that interacts with the tablet as a cursor,
528  * (stylus, eraser, tablet mouse, airbrush, etc)
529  * this is not to be confused with wacom x11 configuration "cursor" device.
530  * Wacoms x11 config "cursor" refers to its device slot (which we mirror with
531  * our gSysCursors) for puck like devices (tablet mice essentially).
532  */
533 #if 0 // unused
534 static BOOL is_tablet_cursor(const char *name, const char *type)
535 {
536         int i;
537         static const char *tablet_cursor_whitelist[] = {
538                 "wacom",
539                 "wizardpen",
540                 "acecad",
541                 "tablet",
542                 "cursor",
543                 "stylus",
544                 "eraser",
545                 "pad",
546                 NULL
547         };
548
549         for (i = 0; tablet_cursor_whitelist[i] != NULL; i++) {
550                 if (name && match_token(name, tablet_cursor_whitelist[i]))
551                         return TRUE;
552                 if (type && match_token(type, tablet_cursor_whitelist[i]))
553                         return TRUE;
554         }
555         return FALSE;
556 }
557 #endif
558 static BOOL is_stylus(const char *name, const char *type)
559 {
560         int i;
561         static const char *tablet_stylus_whitelist[] = {
562                 "stylus",
563                 "wizardpen",
564                 "acecad",
565                 NULL
566         };
567
568         for (i = 0; tablet_stylus_whitelist[i] != NULL; i++) {
569                 if (name && match_token(name, tablet_stylus_whitelist[i]))
570                         return TRUE;
571                 if (type && match_token(type, tablet_stylus_whitelist[i]))
572                         return TRUE;
573         }
574
575         return FALSE;
576 }
577
578 static BOOL is_eraser(const char *name, const char *type)
579 {
580         if (name && match_token(name, "eraser"))
581                 return TRUE;
582         if (type && match_token(type, "eraser"))
583                 return TRUE;
584         return FALSE;
585 }
586 #undef BOOL
587 #undef TRUE
588 #undef FALSE
589 /* end code copied from wine */
590
591 void GHOST_WindowX11::initXInputDevices()
592 {
593         static XErrorHandler old_handler = (XErrorHandler) 0;
594         XExtensionVersion *version = XGetExtensionVersion(m_display, INAME);
595
596         if (version && (version != (XExtensionVersion *)NoSuchExtension)) {
597                 if (version->present) {
598                         int device_count;
599                         XDeviceInfo *device_info = XListInputDevices(m_display, &device_count);
600                         m_xtablet.StylusDevice = NULL;
601                         m_xtablet.EraserDevice = NULL;
602                         m_xtablet.CommonData.Active = GHOST_kTabletModeNone;
603
604                         /* Install our error handler to override Xlib's termination behavior */
605                         old_handler = XSetErrorHandler(ApplicationErrorHandler);
606
607                         for (int i = 0; i < device_count; ++i) {
608                                 char *device_type = device_info[i].type ? XGetAtomName(m_display, device_info[i].type) : NULL;
609                                 
610 //                              printf("Tablet type:'%s', name:'%s', index:%d\n", device_type, device_info[i].name, i);
611
612
613                                 if (m_xtablet.StylusDevice == NULL && is_stylus(device_info[i].name, device_type)) {
614 //                                      printf("\tfound stylus\n");
615                                         m_xtablet.StylusID = device_info[i].id;
616                                         m_xtablet.StylusDevice = XOpenDevice(m_display, m_xtablet.StylusID);
617
618                                         if (m_xtablet.StylusDevice != NULL) {
619                                                 /* Find how many pressure levels tablet has */
620                                                 XAnyClassPtr ici = device_info[i].inputclassinfo;
621                                                 for (int j = 0; j < m_xtablet.StylusDevice->num_classes; ++j) {
622                                                         if (ici->c_class == ValuatorClass) {
623 //                                                              printf("\t\tfound ValuatorClass\n");
624                                                                 XValuatorInfo *xvi = (XValuatorInfo *)ici;
625                                                                 m_xtablet.PressureLevels = xvi->axes[2].max_value;
626                                                         
627                                                                 /* this is assuming that the tablet has the same tilt resolution in both
628                                                                  * positive and negative directions. It would be rather weird if it didn't.. */
629                                                                 m_xtablet.XtiltLevels = xvi->axes[3].max_value;
630                                                                 m_xtablet.YtiltLevels = xvi->axes[4].max_value;
631                                                                 break;
632                                                         }
633                                                 
634                                                         ici = (XAnyClassPtr)(((char *)ici) + ici->length);
635                                                 }
636                                         }
637                                         else {
638                                                 m_xtablet.StylusID = 0;
639                                         }
640                                 }
641                                 else if (m_xtablet.EraserDevice == NULL && is_eraser(device_info[i].name, device_type)) {
642 //                                      printf("\tfound eraser\n");
643                                         m_xtablet.EraserID = device_info[i].id;
644                                         m_xtablet.EraserDevice = XOpenDevice(m_display, m_xtablet.EraserID);
645                                         if (m_xtablet.EraserDevice == NULL) m_xtablet.EraserID = 0;
646                                 }
647
648                                 if (device_type) {
649                                         XFree((void *)device_type);
650                                 }
651                         }
652
653                         /* Restore handler */
654                         (void) XSetErrorHandler(old_handler);
655
656                         XFreeDeviceList(device_info);
657
658
659                         XEventClass xevents[10], ev;
660                         int dcount = 0;
661
662                         if (m_xtablet.StylusDevice) {
663                                 DeviceMotionNotify(m_xtablet.StylusDevice, m_xtablet.MotionEvent, ev);
664                                 if (ev) xevents[dcount++] = ev;
665                                 ProximityIn(m_xtablet.StylusDevice, m_xtablet.ProxInEvent, ev);
666                                 if (ev) xevents[dcount++] = ev;
667                                 ProximityOut(m_xtablet.StylusDevice, m_xtablet.ProxOutEvent, ev);
668                                 if (ev) xevents[dcount++] = ev;
669                         }
670                         if (m_xtablet.EraserDevice) {
671                                 DeviceMotionNotify(m_xtablet.EraserDevice, m_xtablet.MotionEvent, ev);
672                                 if (ev) xevents[dcount++] = ev;
673                                 ProximityIn(m_xtablet.EraserDevice, m_xtablet.ProxInEvent, ev);
674                                 if (ev) xevents[dcount++] = ev;
675                                 ProximityOut(m_xtablet.EraserDevice, m_xtablet.ProxOutEvent, ev);
676                                 if (ev) xevents[dcount++] = ev;
677                         }
678
679                         XSelectExtensionEvent(m_display, m_window, xevents, dcount);
680                 }
681                 XFree(version);
682         }
683 }
684
685 #endif /* WITH_X11_XINPUT */
686
687 Window
688 GHOST_WindowX11::
689 getXWindow()
690 {
691         return m_window;
692 }
693
694 bool
695 GHOST_WindowX11::
696 getValid() const
697 {
698         return m_valid_setup;
699 }
700
701 void
702 GHOST_WindowX11::
703 setTitle(
704                 const STR_String& title)
705 {
706         Atom name = XInternAtom(m_display, "_NET_WM_NAME", 0);
707         Atom utf8str = XInternAtom(m_display, "UTF8_STRING", 0);
708         XChangeProperty(m_display, m_window,
709                         name, utf8str, 8, PropModeReplace,
710                         (const unsigned char *) title.ReadPtr(),
711                         title.Length());
712
713 // This should convert to valid x11 string
714 //  and getTitle would need matching change
715         XStoreName(m_display, m_window, title);
716
717         XFlush(m_display);
718 }
719
720 void
721 GHOST_WindowX11::
722 getTitle(
723                 STR_String& title) const
724 {
725         char *name = NULL;
726         
727         XFetchName(m_display, m_window, &name);
728         title = name ? name : "untitled";
729         XFree(name);
730 }
731         
732 void
733 GHOST_WindowX11::
734 getWindowBounds(
735                 GHOST_Rect& bounds) const
736 {
737         // Getting the window bounds under X11 is not
738         // really supported (nor should it be desired).
739         getClientBounds(bounds);
740 }
741
742 void
743 GHOST_WindowX11::
744 getClientBounds(
745                 GHOST_Rect& bounds) const
746 {
747         Window root_return;
748         int x_return, y_return;
749         unsigned int w_return, h_return, border_w_return, depth_return;
750         GHOST_TInt32 screen_x, screen_y;
751         
752         XGetGeometry(m_display, m_window, &root_return, &x_return, &y_return,
753                      &w_return, &h_return, &border_w_return, &depth_return);
754
755         clientToScreen(0, 0, screen_x, screen_y);
756         
757         bounds.m_l = screen_x;
758         bounds.m_r = bounds.m_l + w_return;
759         bounds.m_t = screen_y;
760         bounds.m_b = bounds.m_t + h_return;
761
762 }
763
764 GHOST_TSuccess
765 GHOST_WindowX11::
766 setClientWidth(
767                 GHOST_TUns32 width)
768 {
769         XWindowChanges values;
770         unsigned int value_mask = CWWidth;
771         values.width = width;
772         XConfigureWindow(m_display, m_window, value_mask, &values);
773
774         return GHOST_kSuccess;
775 }
776
777 GHOST_TSuccess
778 GHOST_WindowX11::
779 setClientHeight(
780                 GHOST_TUns32 height)
781 {
782         XWindowChanges values;
783         unsigned int value_mask = CWHeight;
784         values.height = height;
785         XConfigureWindow(m_display, m_window, value_mask, &values);
786         return GHOST_kSuccess;
787
788 }
789
790 GHOST_TSuccess
791 GHOST_WindowX11::
792 setClientSize(
793                 GHOST_TUns32 width,
794                 GHOST_TUns32 height)
795 {
796         XWindowChanges values;
797         unsigned int value_mask = CWWidth | CWHeight;
798         values.width = width;
799         values.height = height;
800         XConfigureWindow(m_display, m_window, value_mask, &values);
801         return GHOST_kSuccess;
802
803 }       
804
805 void
806 GHOST_WindowX11::
807 screenToClient(
808                 GHOST_TInt32 inX,
809                 GHOST_TInt32 inY,
810                 GHOST_TInt32& outX,
811                 GHOST_TInt32& outY) const
812 {
813         // This is correct!
814
815         int ax, ay;
816         Window temp;
817
818         XTranslateCoordinates(m_display,
819                               RootWindow(m_display, m_visual->screen),
820                               m_window,
821                               inX, inY,
822                               &ax, &ay,
823                               &temp);
824         outX = ax;
825         outY = ay;
826 }
827                  
828 void
829 GHOST_WindowX11::
830 clientToScreen(
831                 GHOST_TInt32 inX,
832                 GHOST_TInt32 inY,
833                 GHOST_TInt32& outX,
834                 GHOST_TInt32& outY) const
835 {
836         int ax, ay;
837         Window temp;
838
839         XTranslateCoordinates(
840             m_display,
841             m_window,
842             RootWindow(m_display, m_visual->screen),
843             inX, inY,
844             &ax, &ay,
845             &temp);
846         outX = ax;
847         outY = ay;
848 }
849
850 void GHOST_WindowX11::icccmSetState(int state)
851 {
852         XEvent xev;
853
854         if (state != IconicState)
855                 return;
856
857         xev.xclient.type = ClientMessage;
858         xev.xclient.serial = 0;
859         xev.xclient.send_event = True;
860         xev.xclient.display = m_display;
861         xev.xclient.window = m_window;
862         xev.xclient.format = 32;
863         xev.xclient.message_type = m_system->m_wm_change_state;
864         xev.xclient.data.l[0] = state;
865         XSendEvent(m_display, RootWindow(m_display, DefaultScreen(m_display)),
866                    False, SubstructureNotifyMask | SubstructureRedirectMask, &xev);
867 }
868
869 int GHOST_WindowX11::icccmGetState(void) const
870 {
871         unsigned char *prop_ret;
872         unsigned long bytes_after, num_ret;
873         Atom type_ret;
874         int format_ret, st;
875
876         prop_ret = NULL;
877         st = XGetWindowProperty(m_display, m_window, m_system->m_wm_state, 0,
878                                 0x7fffffff, False, m_system->m_wm_state, &type_ret,
879                                 &format_ret, &num_ret, &bytes_after, &prop_ret);
880
881         if ((st == Success) && (prop_ret) && (num_ret == 2))
882                 st = prop_ret[0];
883         else
884                 st = NormalState;
885
886         if (prop_ret)
887                 XFree(prop_ret);
888         return (st);
889 }
890
891 void GHOST_WindowX11::netwmMaximized(bool set)
892 {
893         XEvent xev;
894
895         xev.xclient.type = ClientMessage;
896         xev.xclient.serial = 0;
897         xev.xclient.send_event = True;
898         xev.xclient.window = m_window;
899         xev.xclient.message_type = m_system->m_net_state;
900         xev.xclient.format = 32;
901
902         if (set == True)
903                 xev.xclient.data.l[0] = _NET_WM_STATE_ADD;
904         else
905                 xev.xclient.data.l[0] = _NET_WM_STATE_REMOVE;
906
907         xev.xclient.data.l[1] = m_system->m_net_max_horz;
908         xev.xclient.data.l[2] = m_system->m_net_max_vert;
909         xev.xclient.data.l[3] = 0;
910         xev.xclient.data.l[4] = 0;
911         XSendEvent(m_display, RootWindow(m_display, DefaultScreen(m_display)),
912                    False, SubstructureRedirectMask | SubstructureNotifyMask, &xev);
913 }
914
915 bool GHOST_WindowX11::netwmIsMaximized(void) const
916 {
917         unsigned char *prop_ret;
918         unsigned long bytes_after, num_ret, i;
919         Atom type_ret;
920         bool st;
921         int format_ret, ret, count;
922
923         prop_ret = NULL;
924         st = False;
925         ret = XGetWindowProperty(m_display, m_window, m_system->m_net_state, 0,
926                                  0x7fffffff, False, XA_ATOM, &type_ret, &format_ret,
927                                  &num_ret, &bytes_after, &prop_ret);
928         if ((ret == Success) && (prop_ret) && (format_ret == 32)) {
929                 count = 0;
930                 for (i = 0; i < num_ret; i++) {
931                         if (((unsigned long *) prop_ret)[i] == m_system->m_net_max_horz)
932                                 count++;
933                         if (((unsigned long *) prop_ret)[i] == m_system->m_net_max_vert)
934                                 count++;
935                         if (count == 2) {
936                                 st = True;
937                                 break;
938                         }
939                 }
940         }
941
942         if (prop_ret)
943                 XFree(prop_ret);
944         return (st);
945 }
946
947 void GHOST_WindowX11::netwmFullScreen(bool set)
948 {
949         XEvent xev;
950
951         xev.xclient.type = ClientMessage;
952         xev.xclient.serial = 0;
953         xev.xclient.send_event = True;
954         xev.xclient.window = m_window;
955         xev.xclient.message_type = m_system->m_net_state;
956         xev.xclient.format = 32;
957
958         if (set == True)
959                 xev.xclient.data.l[0] = _NET_WM_STATE_ADD;
960         else
961                 xev.xclient.data.l[0] = _NET_WM_STATE_REMOVE;
962
963         xev.xclient.data.l[1] = m_system->m_net_fullscreen;
964         xev.xclient.data.l[2] = 0;
965         xev.xclient.data.l[3] = 0;
966         xev.xclient.data.l[4] = 0;
967         XSendEvent(m_display, RootWindow(m_display, DefaultScreen(m_display)),
968                    False, SubstructureRedirectMask | SubstructureNotifyMask, &xev);
969 }
970
971 bool GHOST_WindowX11::netwmIsFullScreen(void) const
972 {
973         unsigned char *prop_ret;
974         unsigned long bytes_after, num_ret, i;
975         Atom type_ret;
976         bool st;
977         int format_ret, ret;
978
979         prop_ret = NULL;
980         st = False;
981         ret = XGetWindowProperty(m_display, m_window, m_system->m_net_state, 0,
982                                  0x7fffffff, False, XA_ATOM, &type_ret, &format_ret,
983                                  &num_ret, &bytes_after, &prop_ret);
984         if ((ret == Success) && (prop_ret) && (format_ret == 32)) {
985                 for (i = 0; i < num_ret; i++) {
986                         if (((unsigned long *) prop_ret)[i] == m_system->m_net_fullscreen) {
987                                 st = True;
988                                 break;
989                         }
990                 }
991         }
992
993         if (prop_ret)
994                 XFree(prop_ret);
995         return (st);
996 }
997
998 void GHOST_WindowX11::motifFullScreen(bool set)
999 {
1000         MotifWmHints hints;
1001
1002         hints.flags = MWM_HINTS_DECORATIONS;
1003         if (set == True)
1004                 hints.decorations = 0;
1005         else
1006                 hints.decorations = 1;
1007
1008         XChangeProperty(m_display, m_window, m_system->m_motif,
1009                         m_system->m_motif, 32, PropModeReplace,
1010                         (unsigned char *) &hints, 4);
1011 }
1012
1013 bool GHOST_WindowX11::motifIsFullScreen(void) const
1014 {
1015         unsigned char *prop_ret;
1016         unsigned long bytes_after, num_ret;
1017         MotifWmHints *hints;
1018         Atom type_ret;
1019         bool state;
1020         int format_ret, st;
1021
1022         prop_ret = NULL;
1023         state = False;
1024         st = XGetWindowProperty(m_display, m_window, m_system->m_motif, 0,
1025                                 0x7fffffff, False, m_system->m_motif,
1026                                 &type_ret, &format_ret, &num_ret,
1027                                 &bytes_after, &prop_ret);
1028         if ((st == Success) && (prop_ret)) {
1029                 hints = (MotifWmHints *) prop_ret;
1030                 if (hints->flags & MWM_HINTS_DECORATIONS) {
1031                         if (!hints->decorations)
1032                                 state = True;
1033                 }
1034         }
1035
1036         if (prop_ret)
1037                 XFree(prop_ret);
1038         return (state);
1039 }
1040
1041 GHOST_TWindowState GHOST_WindowX11::getState() const
1042 {
1043         GHOST_TWindowState state_ret;
1044         int state;
1045
1046         state_ret = GHOST_kWindowStateNormal;
1047         state = icccmGetState();
1048         /*
1049          * In the Iconic and Withdrawn state, the window
1050          * is unmaped, so only need return a Minimized state.
1051          */
1052         if ((state == IconicState) || (state == WithdrawnState))
1053                 state_ret = GHOST_kWindowStateMinimized;
1054         else if (netwmIsMaximized() == True)
1055                 state_ret = GHOST_kWindowStateMaximized;
1056         else if (netwmIsFullScreen() == True)
1057                 state_ret = GHOST_kWindowStateFullScreen;
1058         else if (motifIsFullScreen() == True)
1059                 state_ret = GHOST_kWindowStateFullScreen;
1060         return (state_ret);
1061 }
1062
1063 GHOST_TSuccess GHOST_WindowX11::setState(GHOST_TWindowState state)
1064 {
1065         GHOST_TWindowState cur_state;
1066         bool is_max, is_full, is_motif_full;
1067
1068         cur_state = getState();
1069         if (state == (int)cur_state)
1070                 return GHOST_kSuccess;
1071
1072         if (cur_state != GHOST_kWindowStateMinimized) {
1073                 /*
1074                  * The window don't have this property's
1075                  * if it's not mapped.
1076                  */
1077                 is_max = netwmIsMaximized();
1078                 is_full = netwmIsFullScreen();
1079         }
1080         else {
1081                 is_max = False;
1082                 is_full = False;
1083         }
1084
1085         is_motif_full = motifIsFullScreen();
1086
1087         if (state == GHOST_kWindowStateNormal)
1088                 state = m_normal_state;
1089
1090         if (state == GHOST_kWindowStateNormal) {
1091                 if (is_max == True)
1092                         netwmMaximized(False);
1093                 if (is_full == True)
1094                         netwmFullScreen(False);
1095                 if (is_motif_full == True)
1096                         motifFullScreen(False);
1097                 icccmSetState(NormalState);
1098                 return (GHOST_kSuccess);
1099         }
1100
1101         if (state == GHOST_kWindowStateFullScreen) {
1102                 /*
1103                  * We can't change to full screen if the window
1104                  * isn't mapped.
1105                  */
1106                 if (cur_state == GHOST_kWindowStateMinimized)
1107                         return (GHOST_kFailure);
1108
1109                 m_normal_state = cur_state;
1110
1111                 if (is_max == True)
1112                         netwmMaximized(False);
1113                 if (is_full == False)
1114                         netwmFullScreen(True);
1115                 if (is_motif_full == False)
1116                         motifFullScreen(True);
1117                 return (GHOST_kSuccess);
1118         }
1119
1120         if (state == GHOST_kWindowStateMaximized) {
1121                 /*
1122                  * We can't change to Maximized if the window
1123                  * isn't mapped.
1124                  */
1125                 if (cur_state == GHOST_kWindowStateMinimized)
1126                         return (GHOST_kFailure);
1127
1128                 if (is_full == True)
1129                         netwmFullScreen(False);
1130                 if (is_motif_full == True)
1131                         motifFullScreen(False);
1132                 if (is_max == False)
1133                         netwmMaximized(True);
1134                 return (GHOST_kSuccess);
1135         }
1136
1137         if (state == GHOST_kWindowStateMinimized) {
1138                 /*
1139                  * The window manager need save the current state of
1140                  * the window (maximized, full screen, etc).
1141                  */
1142                 icccmSetState(IconicState);
1143                 return (GHOST_kSuccess);
1144         }
1145
1146         return (GHOST_kFailure);
1147 }
1148
1149 #include <iostream>
1150
1151 GHOST_TSuccess
1152 GHOST_WindowX11::
1153 setOrder(
1154                 GHOST_TWindowOrder order)
1155 {
1156         if (order == GHOST_kWindowOrderTop) {
1157                 XWindowAttributes attr;   
1158                 Atom atom;
1159
1160                 /* We use both XRaiseWindow and _NET_ACTIVE_WINDOW, since some
1161                  * window managers ignore the former (e.g. kwin from kde) and others
1162                  * don't implement the latter (e.g. fluxbox pre 0.9.9) */
1163
1164                 XRaiseWindow(m_display, m_window);
1165
1166                 atom = XInternAtom(m_display, "_NET_ACTIVE_WINDOW", True);
1167
1168                 if (atom != None) {
1169                         Window root;
1170                         XEvent xev;
1171                         long eventmask;
1172
1173                         xev.xclient.type = ClientMessage;
1174                         xev.xclient.serial = 0;
1175                         xev.xclient.send_event = True;
1176                         xev.xclient.window = m_window;
1177                         xev.xclient.message_type = atom;
1178
1179                         xev.xclient.format = 32;
1180                         xev.xclient.data.l[0] = 1;
1181                         xev.xclient.data.l[1] = CurrentTime;
1182                         xev.xclient.data.l[2] = m_window;
1183                         xev.xclient.data.l[3] = 0;
1184                         xev.xclient.data.l[4] = 0;
1185
1186                         root = RootWindow(m_display, m_visual->screen),
1187                         eventmask = SubstructureRedirectMask | SubstructureNotifyMask;
1188
1189                         XSendEvent(m_display, root, False, eventmask, &xev);
1190                 }
1191
1192                 XGetWindowAttributes(m_display, m_window, &attr);
1193
1194                 /* iconized windows give bad match error */
1195                 if (attr.map_state == IsViewable)
1196                         XSetInputFocus(m_display, m_window, RevertToPointerRoot,
1197                                        CurrentTime);
1198                 XFlush(m_display);
1199         }
1200         else if (order == GHOST_kWindowOrderBottom) {
1201                 XLowerWindow(m_display, m_window);
1202                 XFlush(m_display);
1203         }
1204         else {
1205                 return GHOST_kFailure;
1206         }
1207         
1208         return GHOST_kSuccess;
1209 }
1210
1211 GHOST_TSuccess
1212 GHOST_WindowX11::
1213 swapBuffers()
1214 {
1215         if (getDrawingContextType() == GHOST_kDrawingContextTypeOpenGL) {
1216                 glXSwapBuffers(m_display, m_window);
1217                 return GHOST_kSuccess;
1218         }
1219         else {
1220                 return GHOST_kFailure;
1221         }
1222 }
1223
1224 GHOST_TSuccess
1225 GHOST_WindowX11::
1226 activateDrawingContext()
1227 {
1228         if (m_context != NULL) {
1229                 glXMakeCurrent(m_display, m_window, m_context);
1230                 return GHOST_kSuccess;
1231         } 
1232         return GHOST_kFailure;
1233 }
1234
1235 GHOST_TSuccess
1236 GHOST_WindowX11::
1237 invalidate()
1238 {
1239         // So the idea of this function is to generate an expose event
1240         // for the window.
1241         // Unfortunately X does not handle expose events for you and 
1242         // it is the client's job to refresh the dirty part of the window.
1243         // We need to queue up invalidate calls and generate GHOST events 
1244         // for them in the system.
1245
1246         // We implement this by setting a boolean in this class to concatenate 
1247         // all such calls into a single event for this window.
1248
1249         // At the same time we queue the dirty windows in the system class
1250         // and generate events for them at the next processEvents call.
1251
1252         if (m_invalid_window == false) {
1253                 m_system->addDirtyWindow(this);
1254                 m_invalid_window = true;
1255         } 
1256  
1257         return GHOST_kSuccess;
1258 }
1259
1260 /**
1261  * called by the X11 system implementation when expose events
1262  * for the window have been pushed onto the GHOST queue
1263  */
1264  
1265 void
1266 GHOST_WindowX11::
1267 validate()
1268 {
1269         m_invalid_window = false;
1270 }       
1271  
1272  
1273 /**
1274  * Destructor.
1275  * Closes the window and disposes resources allocated.
1276  */
1277
1278 GHOST_WindowX11::
1279 ~GHOST_WindowX11(
1280     ){
1281         static Atom Primary_atom, Clipboard_atom;
1282         Window p_owner, c_owner;
1283         /*Change the owner of the Atoms to None if we are the owner*/
1284         Primary_atom = XInternAtom(m_display, "PRIMARY", False);
1285         Clipboard_atom = XInternAtom(m_display, "CLIPBOARD", False);
1286         
1287         p_owner = XGetSelectionOwner(m_display, Primary_atom);
1288         c_owner = XGetSelectionOwner(m_display, Clipboard_atom);
1289         
1290         std::map<unsigned int, Cursor>::iterator it = m_standard_cursors.begin();
1291         for (; it != m_standard_cursors.end(); it++) {
1292                 XFreeCursor(m_display, it->second);
1293         }
1294
1295         if (m_empty_cursor) {
1296                 XFreeCursor(m_display, m_empty_cursor);
1297         }
1298         if (m_custom_cursor) {
1299                 XFreeCursor(m_display, m_custom_cursor);
1300         }
1301
1302 #ifdef WITH_X11_XINPUT
1303         /* close tablet devices */
1304         if (m_xtablet.StylusDevice)
1305                 XCloseDevice(m_display, m_xtablet.StylusDevice);
1306         
1307         if (m_xtablet.EraserDevice)
1308                 XCloseDevice(m_display, m_xtablet.EraserDevice);
1309 #endif /* WITH_X11_XINPUT */
1310
1311         if (m_context != s_firstContext) {
1312                 glXDestroyContext(m_display, m_context);
1313         }
1314         
1315         if (p_owner == m_window) {
1316                 XSetSelectionOwner(m_display, Primary_atom, None, CurrentTime);
1317         }
1318         if (c_owner == m_window) {
1319                 XSetSelectionOwner(m_display, Clipboard_atom, None, CurrentTime);
1320         }
1321         
1322 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
1323         if (m_xic) {
1324                 XDestroyIC(m_xic);
1325         }
1326 #endif
1327
1328 #ifdef WITH_XDND
1329         delete m_dropTarget;
1330 #endif
1331
1332         XDestroyWindow(m_display, m_window);
1333         XFree(m_visual);
1334 }
1335
1336
1337
1338
1339 /**
1340  * Tries to install a rendering context in this window.
1341  * @param type  The type of rendering context installed.
1342  * @return Indication as to whether installation has succeeded.
1343  */
1344 GHOST_TSuccess
1345 GHOST_WindowX11::
1346 installDrawingContext(
1347                 GHOST_TDrawingContextType type)
1348 {
1349         // only support openGL for now.
1350         GHOST_TSuccess success;
1351         switch (type) {
1352                 case GHOST_kDrawingContextTypeOpenGL:
1353                         m_context = glXCreateContext(m_display, m_visual, s_firstContext, True);
1354                         if (m_context != NULL) {
1355                                 if (!s_firstContext) {
1356                                         s_firstContext = m_context;
1357                                 }
1358                                 glXMakeCurrent(m_display, m_window, m_context);
1359                                 glClearColor(0.447, 0.447, 0.447, 0);
1360                                 glClear(GL_COLOR_BUFFER_BIT);
1361                                 success = GHOST_kSuccess;
1362                         }
1363                         else {
1364                                 success = GHOST_kFailure;
1365                         }
1366
1367                         break;
1368
1369                 case GHOST_kDrawingContextTypeNone:
1370                         success = GHOST_kSuccess;
1371                         break;
1372
1373                 default:
1374                         success = GHOST_kFailure;
1375         }
1376         return success;
1377 }
1378
1379
1380
1381 /**
1382  * Removes the current drawing context.
1383  * @return Indication as to whether removal has succeeded.
1384  */
1385 GHOST_TSuccess
1386 GHOST_WindowX11::
1387 removeDrawingContext()
1388 {
1389         GHOST_TSuccess success;
1390
1391         if (m_context != NULL) {
1392                 glXDestroyContext(m_display, m_context);
1393                 success = GHOST_kSuccess;
1394         }
1395         else {
1396                 success = GHOST_kFailure;
1397         }
1398         return success; 
1399 }
1400
1401
1402 Cursor
1403 GHOST_WindowX11::
1404 getStandardCursor(
1405                 GHOST_TStandardCursor g_cursor)
1406 {
1407         unsigned int xcursor_id;
1408
1409 #define GtoX(gcurs, xcurs)  case gcurs: xcursor_id = xcurs
1410         switch (g_cursor) {
1411                 GtoX(GHOST_kStandardCursorRightArrow, XC_arrow); break;
1412                 GtoX(GHOST_kStandardCursorLeftArrow, XC_top_left_arrow); break;
1413                 GtoX(GHOST_kStandardCursorInfo, XC_hand1); break;
1414                 GtoX(GHOST_kStandardCursorDestroy, XC_pirate); break;
1415                 GtoX(GHOST_kStandardCursorHelp, XC_question_arrow); break;
1416                 GtoX(GHOST_kStandardCursorCycle, XC_exchange); break;
1417                 GtoX(GHOST_kStandardCursorSpray, XC_spraycan); break;
1418                 GtoX(GHOST_kStandardCursorWait, XC_watch); break;
1419                 GtoX(GHOST_kStandardCursorText, XC_xterm); break;
1420                 GtoX(GHOST_kStandardCursorCrosshair, XC_crosshair); break;
1421                 GtoX(GHOST_kStandardCursorUpDown, XC_sb_v_double_arrow); break;
1422                 GtoX(GHOST_kStandardCursorLeftRight, XC_sb_h_double_arrow); break;
1423                 GtoX(GHOST_kStandardCursorTopSide, XC_top_side); break;
1424                 GtoX(GHOST_kStandardCursorBottomSide, XC_bottom_side); break;
1425                 GtoX(GHOST_kStandardCursorLeftSide, XC_left_side); break;
1426                 GtoX(GHOST_kStandardCursorRightSide, XC_right_side); break;
1427                 GtoX(GHOST_kStandardCursorTopLeftCorner, XC_top_left_corner); break;
1428                 GtoX(GHOST_kStandardCursorTopRightCorner, XC_top_right_corner); break;
1429                 GtoX(GHOST_kStandardCursorBottomRightCorner, XC_bottom_right_corner); break;
1430                 GtoX(GHOST_kStandardCursorBottomLeftCorner, XC_bottom_left_corner); break;
1431                 GtoX(GHOST_kStandardCursorPencil, XC_pencil); break;
1432                 GtoX(GHOST_kStandardCursorCopy, XC_arrow); break;
1433                 default:
1434                         xcursor_id = 0;
1435         }
1436 #undef GtoX
1437
1438         if (xcursor_id) {
1439                 Cursor xcursor = m_standard_cursors[xcursor_id];
1440                 
1441                 if (!xcursor) {
1442                         xcursor = XCreateFontCursor(m_display, xcursor_id);
1443
1444                         m_standard_cursors[xcursor_id] = xcursor;
1445                 }
1446                 
1447                 return xcursor;
1448         }
1449         else {
1450                 return None;
1451         }
1452 }
1453
1454 Cursor
1455 GHOST_WindowX11::
1456 getEmptyCursor(
1457         ) {
1458         if (!m_empty_cursor) {
1459                 Pixmap blank;
1460                 XColor dummy;
1461                 char data[1] = {0};
1462                         
1463                 /* make a blank cursor */
1464                 blank = XCreateBitmapFromData(
1465                     m_display,
1466                     RootWindow(m_display, DefaultScreen(m_display)),
1467                     data, 1, 1
1468                     );
1469
1470                 m_empty_cursor = XCreatePixmapCursor(m_display, blank, blank, &dummy, &dummy, 0, 0);
1471                 XFreePixmap(m_display, blank);
1472         }
1473
1474         return m_empty_cursor;
1475 }
1476
1477 GHOST_TSuccess
1478 GHOST_WindowX11::
1479 setWindowCursorVisibility(
1480                 bool visible)
1481 {
1482         Cursor xcursor;
1483         
1484         if (visible) {
1485                 xcursor = getStandardCursor(getCursorShape() );
1486         }
1487         else {
1488                 xcursor = getEmptyCursor();
1489         }
1490
1491         XDefineCursor(m_display, m_window, xcursor);
1492         XFlush(m_display);
1493         
1494         return GHOST_kSuccess;
1495 }
1496
1497 GHOST_TSuccess
1498 GHOST_WindowX11::
1499 setWindowCursorGrab(
1500                 GHOST_TGrabCursorMode mode)
1501 {
1502         if (mode != GHOST_kGrabDisable) {
1503                 if (mode != GHOST_kGrabNormal) {
1504                         m_system->getCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]);
1505                         setCursorGrabAccum(0, 0);
1506
1507                         if (mode == GHOST_kGrabHide)
1508                                 setWindowCursorVisibility(false);
1509
1510                 }
1511 #ifdef GHOST_X11_GRAB
1512                 XGrabPointer(m_display, m_window, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
1513                              GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
1514 #endif
1515         }
1516         else {
1517                 if (m_cursorGrab == GHOST_kGrabHide) {
1518                         m_system->setCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]);
1519                         setWindowCursorVisibility(true);
1520                 }
1521
1522                 if (m_cursorGrab != GHOST_kGrabNormal) {
1523                         /* use to generate a mouse move event, otherwise the last event
1524                          * blender gets can be outside the screen causing menus not to show
1525                          * properly unless the user moves the mouse */
1526                         XWarpPointer(m_display, None, None, 0, 0, 0, 0, 0, 0);
1527                 }
1528
1529                 /* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */
1530                 setCursorGrabAccum(0, 0);
1531                 m_cursorGrabBounds.m_l = m_cursorGrabBounds.m_r = -1; /* disable */
1532 #ifdef GHOST_X11_GRAB
1533                 XUngrabPointer(m_display, CurrentTime);
1534 #endif
1535         }
1536
1537         XFlush(m_display);
1538         
1539         return GHOST_kSuccess;
1540 }
1541
1542 GHOST_TSuccess
1543 GHOST_WindowX11::
1544 setWindowCursorShape(
1545                 GHOST_TStandardCursor shape)
1546 {
1547         Cursor xcursor = getStandardCursor(shape);
1548         
1549         XDefineCursor(m_display, m_window, xcursor);
1550         XFlush(m_display);
1551
1552         return GHOST_kSuccess;
1553 }
1554
1555 GHOST_TSuccess
1556 GHOST_WindowX11::
1557 setWindowCustomCursorShape(
1558                 GHOST_TUns8 bitmap[16][2],
1559                 GHOST_TUns8 mask[16][2],
1560                 int hotX,
1561                 int hotY)
1562 {
1563         setWindowCustomCursorShape((GHOST_TUns8 *)bitmap, (GHOST_TUns8 *)mask,
1564                                    16, 16, hotX, hotY, 0, 1);
1565         return GHOST_kSuccess;
1566 }
1567
1568 GHOST_TSuccess
1569 GHOST_WindowX11::
1570 setWindowCustomCursorShape(     
1571                 GHOST_TUns8 *bitmap,
1572                 GHOST_TUns8 *mask,
1573                 int sizex,
1574                 int sizey,
1575                 int hotX,
1576                 int hotY,
1577                 int fg_color,
1578                 int bg_color)
1579 {
1580         Colormap colormap = DefaultColormap(m_display, DefaultScreen(m_display));
1581         Pixmap bitmap_pix, mask_pix;
1582         XColor fg, bg;
1583         
1584         if (XAllocNamedColor(m_display, colormap, "White", &fg, &fg) == 0) return GHOST_kFailure;
1585         if (XAllocNamedColor(m_display, colormap, "Black", &bg, &bg) == 0) return GHOST_kFailure;
1586
1587         if (m_custom_cursor) {
1588                 XFreeCursor(m_display, m_custom_cursor);
1589         }
1590
1591         bitmap_pix = XCreateBitmapFromData(m_display, m_window, (char *) bitmap, sizex, sizey);
1592         mask_pix = XCreateBitmapFromData(m_display, m_window, (char *) mask, sizex, sizey);
1593                 
1594         m_custom_cursor = XCreatePixmapCursor(m_display, bitmap_pix, mask_pix, &fg, &bg, hotX, hotY);
1595         XDefineCursor(m_display, m_window, m_custom_cursor);
1596         XFlush(m_display);
1597         
1598         XFreePixmap(m_display, bitmap_pix);
1599         XFreePixmap(m_display, mask_pix);
1600
1601         XFreeColors(m_display, colormap, &fg.pixel, 1, 0L);
1602         XFreeColors(m_display, colormap, &bg.pixel, 1, 0L);
1603
1604         return GHOST_kSuccess;
1605 }