annotate dynamin/gui/x_window.d @ 24:43a88caead16

Implement keyDown and keyUp events with X.
author Jordan Miner <jminer7@gmail.com>
date Sat, 25 Jul 2009 15:01:46 -0500
parents d55b5b998412
children 0577e8738dc8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
1 // Written in the D programming language
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
2 // www.digitalmars.com/d/
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
3
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
4 /*
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
5 * The contents of this file are subject to the Mozilla Public License Version
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
6 * 1.1 (the "License"); you may not use this file except in compliance with
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
7 * the License. You may obtain a copy of the License at
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
8 * http://www.mozilla.org/MPL/
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
9 *
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
10 * Software distributed under the License is distributed on an "AS IS" basis,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
12 * for the specific language governing rights and limitations under the
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
13 * License.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
14 *
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
15 * The Original Code is the Dynamin library.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
16 *
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
17 * The Initial Developer of the Original Code is Jordan Miner.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
18 * Portions created by the Initial Developer are Copyright (C) 2007-2009
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
19 * the Initial Developer. All Rights Reserved.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
20 *
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
21 * Contributor(s):
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
22 * Jordan Miner <jminer7@gmail.com>
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
23 *
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
24 */
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
25
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
26 module dynamin.gui.x_window;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
27
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
28 public import dynamin.core.string;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
29 public import dynamin.core.global;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
30 public import dynamin.core.math;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
31 public import dynamin.gui.window;
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
32 public import dynamin.gui.key;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
33 public import dynamin.c.xlib;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
34 public import dynamin.c.xlib : XWindow = Window;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
35 public import dynamin.c.xmu;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
36 public import dynamin.c.cairo;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
37 public import dynamin.c.cairo_xlib;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
38 public import tango.stdc.string;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
39 public import tango.io.Stdout;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
40
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
41 /*
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
42 ** Window property:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
43 ** _NET_FRAME_EXTENTS(CARDINAL) = 4, 4, 23, 4
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
44 ** left, right, top and bottom border sizes
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
45 */
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
46
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
47 Window[XWindow] windows;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
48 void setControl(XWindow handle, Window win) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
49 if(win is null)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
50 windows.remove(handle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
51 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
52 windows[handle] = win;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
53 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
54
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
55 Window getControl(XWindow handle) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
56 auto tmp = handle in windows;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
57 return tmp is null ? null : *tmp;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
58 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
59
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
60 /**
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
61 * A simpler method that returns all the data in a property.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
62 * NOTE: the returned data still has to be freed with XFree()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
63 */
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
64 void* getXWindowProperty(XDisplay* d, XWindow w, XAtom prop, int* numRet = null) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
65 XAtom actualType;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
66 int actualFormat;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
67 uint nitems, bytesAfter;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
68 void* ptr;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
69 XGetWindowProperty(d, w, prop,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
70 0, 0xFFFFFFFF, false, AnyPropertyType,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
71 &actualType, &actualFormat, &nitems, &bytesAfter,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
72 &ptr);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
73 if(numRet) *numRet = nitems;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
74 return ptr;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
75 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
76 bool isWMPropertySupported(XAtom prop) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
77 int count;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
78 XAtom* atoms = cast(XAtom*)getXWindowProperty(display,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
79 root, XA._NET_SUPPORTED, &count);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
80 scope(exit) XFree(atoms);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
81 for(int i = 0; i < count; ++i)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
82 if(atoms[i] == prop)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
83 return true;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
84 return false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
85 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
86 bool isTopLevelReparented(XWindow w) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
87 XWindow root, parent;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
88 XWindow* children;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
89 uint numChildren;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
90 XQueryTree(display, w,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
91 &root, &parent, &children, &numChildren);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
92 return parent != root;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
93 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
94
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
95 XDisplay* display;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
96 XWindow root;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
97 XWindow msgWin;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
98 abstract class XA { // X atoms
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
99 static:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
100 XAtom _NET_SUPPORTED, _NET_WM_NAME, _NET_WORKAREA, _NET_FRAME_EXTENTS;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
101 XAtom _NET_REQUEST_FRAME_EXTENTS;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
102 XAtom _NET_MOVERESIZE_WINDOW;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
103 XAtom _NET_WM_WINDOW_TYPE;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
104 XAtom _NET_WM_WINDOW_TYPE_MENU, _NET_WM_WINDOW_TYPE_UTILITY;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
105 XAtom _NET_WM_WINDOW_TYPE_SPLASH;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
106 XAtom _NET_WM_WINDOW_TYPE_DIALOG, _NET_WM_WINDOW_TYPE_NORMAL;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
107 XAtom WM_PROTOCOLS, WM_DELETE_WINDOW, _NET_WM_SYNC_REQUEST;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
108 XAtom UTF8_STRING, ATOM;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
109 XAtom _MOTIF_WM_HINTS;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
110 XAtom CLIPBOARD, PRIMARY, TARGETS, CLIPBOARD_MANAGER, SAVE_TARGETS;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
111 XAtom DYNAMIN_SELECTION;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
112 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
113 static this() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
114 display = XOpenDisplay(null);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
115 if(!display)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
116 Stdout("XOpenDisplay() failed").newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
117 root = XRootWindow(display, XDefaultScreen(display));
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
118
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
119 msgWin = XCreateSimpleWindow(display, root, 0, 0, 1, 1, 0, 0, 0);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
120
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
121 XA._NET_SUPPORTED = XInternAtom(display, "_NET_SUPPORTED", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
122 XA._NET_WM_NAME = XInternAtom(display, "_NET_WM_NAME", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
123 XA._NET_WORKAREA = XInternAtom(display, "_NET_WORKAREA", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
124 XA._NET_FRAME_EXTENTS = XInternAtom(display, "_NET_FRAME_EXTENTS", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
125 XA._NET_REQUEST_FRAME_EXTENTS =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
126 XInternAtom(display, "_NET_REQUEST_FRAME_EXTENTS", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
127 XA._NET_MOVERESIZE_WINDOW =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
128 XInternAtom(display, "_NET_MOVERESIZE_WINDOW", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
129 XA._NET_WM_WINDOW_TYPE =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
130 XInternAtom(display, "_NET_WM_WINDOW_TYPE", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
131 XA._NET_WM_WINDOW_TYPE_MENU =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
132 XInternAtom(display, "_NET_WM_WINDOW_TYPE_MENU", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
133 XA._NET_WM_WINDOW_TYPE_UTILITY =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
134 XInternAtom(display, "_NET_WM_WINDOW_TYPE_UTILITY", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
135 XA._NET_WM_WINDOW_TYPE_SPLASH =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
136 XInternAtom(display, "_NET_WM_WINDOW_TYPE_SPLASH", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
137 XA._NET_WM_WINDOW_TYPE_DIALOG =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
138 XInternAtom(display, "_NET_WM_WINDOW_TYPE_DIALOG", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
139 XA._NET_WM_WINDOW_TYPE_NORMAL =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
140 XInternAtom(display, "_NET_WM_WINDOW_TYPE_NORMAL", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
141 XA.WM_PROTOCOLS = XInternAtom(display, "WM_PROTOCOLS", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
142 XA.WM_DELETE_WINDOW = XInternAtom(display, "WM_DELETE_WINDOW", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
143 XA._NET_WM_SYNC_REQUEST =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
144 XInternAtom(display, "_NET_WM_SYNC_REQUEST", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
145 XA.UTF8_STRING = XInternAtom(display, "UTF8_STRING", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
146 XA.ATOM = XInternAtom(display, "ATOM", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
147 XA._MOTIF_WM_HINTS = XInternAtom(display, "_MOTIF_WM_HINTS", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
148 XA.CLIPBOARD = XInternAtom(display, "CLIPBOARD", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
149 XA.PRIMARY = XInternAtom(display, "PRIMARY", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
150 XA.TARGETS = XInternAtom(display, "TARGETS", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
151 XA.CLIPBOARD_MANAGER = XInternAtom(display, "CLIPBOARD_MANAGER", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
152 XA.SAVE_TARGETS = XInternAtom(display, "SAVE_TARGETS", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
153
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
154 XA.DYNAMIN_SELECTION = XInternAtom(display, "DYNAMIN_SELECTION", false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
155 if(!isWMPropertySupported(XA._NET_WM_NAME))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
156 Stdout("warning: WM does not support _NET_WM_NAME").newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
157 if(!isWMPropertySupported(XA._NET_WORKAREA))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
158 Stdout("warning: WM does not support _NET_WORKAREA").newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
159 if(!isWMPropertySupported(XA._NET_FRAME_EXTENTS))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
160 Stdout("warning: WM does not support _NET_FRAME_EXTENTS").newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
161 if(!isWMPropertySupported(XA._NET_WORKAREA))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
162 Stdout("warning: WM does not support _NET_WORKAREA").newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
163 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
164
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
165 struct _InvalidRect {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
166 XWindow window;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
167 int x, y, width, height;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
168 _InvalidRect getUnion(_InvalidRect rect) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
169 auto x2 = min(x, rect.x);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
170 auto y2 = min(y, rect.y);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
171 _InvalidRect rect2;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
172 rect2.window = window;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
173 rect2.width = max(x+width, rect.x+rect.width)-x2;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
174 rect2.height = max(y+height, rect.y+rect.height)-y2;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
175 rect2.x = x2;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
176 rect2.y = y2;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
177 return rect2;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
178 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
179 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
180 /+struct InvalidRect {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
181 XWindow window;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
182 int x, y, width, height;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
183 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
184
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
185 static class PaintQueue {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
186 static:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
187 //LinkedList!(InvalidRect) rects;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
188 InvalidRect[] rects;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
189 static this() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
190 //rects = new LinkedList!(InvalidRect)(20);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
191 rects.length = 20;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
192 rects.length = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
193 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
194 void add(XWindow win, int x, int y, int width, int height) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
195 rects.length = rects.length + 1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
196 rects[$-1].window = win;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
197 rects[$-1].x = x;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
198 rects[$-1].y = y;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
199 rects[$-1].width = width;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
200 rects[$-1].height = height;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
201 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
202 bool shouldMerge(int x1, int y1, int width1, int height1,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
203 int x2, int y2, int width2, int height2) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
204 return x2 <= x1 + width1 && y2 <= y1 + height1 &&
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
205 x2 + width2 >= x1 && y2 + height2 >= y1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
206 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
207 void Union(inout int x, inout int y, inout int width, inout int height,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
208 int x2, int y2, int width2, int height2) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
209 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
210 void compress() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
211 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
212 }+/
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
213
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
214 Key prevKey = Key.None;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
215
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
216 //{{{ ApplicationBackend
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
217 template ApplicationBackend() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
218 void backend_run(Window w) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
219 bool isWindowVisible() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
220 if(w is null) return true;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
221 return w.visible;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
222 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
223 XEvent ev;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
224 while(isWindowVisible()) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
225 if(XEventsQueued(display, QueuedAlready) == 0) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
226 _InvalidRect[] rects = Window.invalidRects;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
227 Window.invalidRects.length = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
228 while(rects.length > 0) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
229 auto rect = rects[0];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
230 // TODO: fix this...right now it gens one Expose with
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
231 // the union of invalid rects
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
232 for(int i = rects.length-1; i >= 0; --i) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
233 if(rect.window == rects[i].window) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
234 rect = rect.getUnion(rects[i]);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
235
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
236 arrayCopy!(_InvalidRect)(rects, i+1, rects, i, rects.length-i-1);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
237 rects.length = rects.length-1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
238 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
239 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
240 ev.xexpose.type = Expose;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
241 ev.xexpose.display = display;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
242 ev.xexpose.window = rect.window;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
243 ev.xexpose.x = rect.x;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
244 ev.xexpose.y = rect.y;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
245 ev.xexpose.width = rect.width;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
246 ev.xexpose.height = rect.height;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
247 ev.xexpose.count = -2; // came from here
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
248 XPutBackEvent(display, &ev);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
249 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
250 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
251 XNextEvent(display, &ev);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
252 auto evDisplay = ev.xany.display;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
253 auto evWindow = ev.xany.window;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
254 Window c = getControl(evWindow);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
255 // c will be null for SelectionRequest events
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
256 //if(c is null)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
257 // continue;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
258 //{{{ helper functions
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
259 void createMouseEvent(void delegate(MouseEventArgs args) func) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
260 MouseButton button;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
261 auto buttonEv = ev.xbutton;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
262 switch(buttonEv.button) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
263 case 1: button = MouseButton.Left; break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
264 case 2: button = MouseButton.Middle; break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
265 case 3: button = MouseButton.Right; break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
266 default: return;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
267 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
268 scope args = new MouseEventArgs(buttonEv.x+c._borderSize.left, buttonEv.y+c._borderSize.top, button);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
269 func(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
270 }
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
271 bool isKeyDown(uint keycode) {
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
272 ubyte[32] keys;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
273 XQueryKeymap(display, keys.ptr);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
274 return cast(bool)( (keys[keycode / 8] >> (keycode % 8)) & 1 );
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
275 }
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
276 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
277 switch(ev.type) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
278 case MapNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
279 c.mapped = true;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
280 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
281 case UnmapNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
282 _InvalidRect[] rects = Window.invalidRects;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
283 for(int i = rects.length-1; i >= 0; --i) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
284 if(rects[i].window == evWindow) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
285 arrayCopy!(_InvalidRect)(
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
286 rects, i+1, rects, i, rects.length-i-1);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
287 rects.length = rects.length-1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
288 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
289 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
290 Window.invalidRects = rects;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
291 c.mapped = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
292 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
293 case DestroyNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
294 setControl(evWindow, null);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
295 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
296 case ClientMessage:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
297 auto clientEv = ev.xclient;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
298 if(clientEv.message_type != XA.WM_PROTOCOLS)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
299 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
300 if(clientEv.data.l[0] == XA.WM_DELETE_WINDOW) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
301 XDestroyWindow(evDisplay, evWindow);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
302 return; // TODO: check event, and figure out what to do
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
303 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
304 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
305 case KeyPress:
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
306 auto sym = XLookupKeysym(&ev.xkey, 0);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
307 if(sym == NoSymbol)
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
308 break;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
309 // Since X gives no way to tell if a KeyPress is generated by
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
310 // auto-repeat, prevKey is used here to tell.
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
311 auto k = KeysymToKey(sym);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
312 scope args = new KeyEventArgs(k, k == prevKey);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
313 prevKey = k;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
314 Control focused = c.focusedControl ? c.focusedControl : c;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
315 focused.keyDown(args);
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
316 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
317 case KeyRelease:
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
318 // When X does auto-repeat for a held down key, it sends
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
319 // a KeyPress and KeyRelease every time, even though the key is
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
320 // down constantly. Here we check if the key is down, and if so,
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
321 // not send a keyUp event.
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
322 if(isKeyDown(ev.xkey.keycode))
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
323 break;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
324 auto sym = XLookupKeysym(&ev.xkey, 0);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
325 if(sym == NoSymbol)
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
326 break;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
327 auto k = KeysymToKey(sym);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
328 if(k == prevKey)
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
329 prevKey = Key.None; // can't repeat after released
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
330 scope args = new KeyEventArgs(k, false);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
331 Control focused = c.focusedControl ? c.focusedControl : c;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
332 focused.keyUp(args);
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
333 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
334 case ButtonPress:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
335 //Button4 is wheel scroll up
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
336 //Button5 is wheel scroll down
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
337 createMouseEvent((MouseEventArgs args) { c.mouseDown(args); });
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
338 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
339 case ButtonRelease:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
340 createMouseEvent((MouseEventArgs args) { c.mouseUp(args); });
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
341 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
342 case MotionNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
343 auto motionEv = ev.xmotion;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
344 Control captor = getCaptorControl();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
345 Point pt = Point(motionEv.x+c.borderSize.left, motionEv.y+c.borderSize.top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
346 if(captor)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
347 pt = c.contentToContent(pt, captor);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
348 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
349 captor = c;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
350 scope args = new MouseEventArgs(pt.x, pt.y, MouseButton.None);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
351 if(motionEv.state &
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
352 (Button1Mask | Button2Mask | Button3Mask)) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
353 captor.mouseDragged(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
354 } else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
355 captor.mouseMoved(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
356 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
357 case EnterNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
358 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
359 case LeaveNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
360 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
361 case FocusIn:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
362 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
363 case FocusOut:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
364 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
365 case Expose:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
366 // TODO: move the painting code out of here and:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
367 // make a PaintQueue class and put this here:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
368 // PaintQueue.add(c, exposeEv.x, exposeEv.y, exposeEv.width, exposeEv.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
369 // then, in Window.repaint(), have this:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
370 // PaintQueue.add(this, cast(int)x, cast(int)exposeEv.y, cast(int)exposeEv.width, cast(int)exposeEv.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
371 // Have a PaintQueue.Compress method that merges
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
372 // all invalidated rects that touch or overlap.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
373 // In the if(!XPending(..)) above, just loop over all the
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
374 // rects in the PaintQueue, painting them.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
375 auto exposeEv = ev.xexpose;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
376 if(exposeEv.count != -2) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
377 c.repaint(exposeEv.x, exposeEv.y, exposeEv.width, exposeEv.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
378 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
379 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
380 //printf("repainting x=%d, y=%d, width=%d, height=%d\n",
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
381 // exposeEv.x, exposeEv.y, exposeEv.width, exposeEv.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
382
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
383 auto surfaceWin = cairo_xlib_surface_create(
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
384 evDisplay, evWindow,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
385 XDefaultVisual(evDisplay, XDefaultScreen(evDisplay)),
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
386 cast(int)c.width, cast(int)c.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
387 // TODO: ^ should be contentWidth/height or got from evWindow
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
388 auto crWin = cairo_create(surfaceWin);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
389 cairo_surface_destroy(surfaceWin);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
390
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
391 auto surfaceBuff = cairo_surface_create_similar(surfaceWin, CAIRO_CONTENT_COLOR, exposeEv.width, exposeEv.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
392 // TODO: use cairo_translate instead, I guess, as
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
393 // I had to change the Windows backend to it...
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
394 cairo_surface_set_device_offset(surfaceBuff, -exposeEv.x-c._borderSize.left, -exposeEv.y-c._borderSize.top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
395 auto crBuff = cairo_create(surfaceBuff);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
396 cairo_surface_destroy(surfaceBuff);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
397
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
398 cairo_set_source_rgb(crBuff, w.content.backColor.R/255.0, w.content.backColor.G/255.0, w.content.backColor.B/255.0);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
399 cairo_paint(crBuff);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
400
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
401 cairo_set_source_rgb(crBuff, 0, 0, 0);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
402 cairo_set_line_width(crBuff, 1.0);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
403
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
404 auto g = new Graphics(crBuff);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
405 scope args = new PaintingEventArgs(g);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
406 c.painting(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
407 delete g;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
408
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
409 cairo_surface_set_device_offset(surfaceBuff, -exposeEv.x, -exposeEv.y);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
410 cairo_set_source_surface(crWin, surfaceBuff, 0, 0);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
411 cairo_rectangle(crWin, exposeEv.x, exposeEv.y, exposeEv.width, exposeEv.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
412 cairo_fill(crWin);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
413
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
414 cairo_destroy(crBuff);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
415 cairo_destroy(crWin);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
416 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
417 case PropertyNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
418 auto propertyEv = ev.xproperty;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
419 if(propertyEv.atom == XA._NET_FRAME_EXTENTS &&
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
420 propertyEv.state != PropertyDelete)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
421 c.backend_nativeToBorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
422 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
423 case ConfigureNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
424 auto configureEv = ev.xconfigure;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
425 c.repaint();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
426 c.backend_nativeToLocationSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
427 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
428 case SelectionRequest:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
429 auto selReqEv = ev.xselectionrequest;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
430 XEvent fullEv;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
431 auto selEv = &fullEv.xselection;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
432 selEv.type = SelectionNotify;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
433 selEv.requestor = selReqEv.requestor;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
434 selEv.selection = selReqEv.selection;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
435 selEv.target = selReqEv.target;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
436 if(selReqEv.property != None)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
437 selEv.property = selReqEv.property;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
438 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
439 selEv.property = XA.DYNAMIN_SELECTION;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
440 selEv.time = selReqEv.time;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
441 Stdout.format("requestor: {}", selReqEv.requestor).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
442 Stdout.format("target: {}", selReqEv.target).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
443 ClipboardData* data; // change to array when supporting multiple
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
444 if(selReqEv.selection == XA.CLIPBOARD)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
445 data = &Clipboard.data;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
446 else if(selReqEv.selection == XA.PRIMARY)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
447 data = &Selection.data;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
448 else {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
449 selEv.property = None;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
450 XSendEvent(display, selEv.requestor, false, 0, &fullEv);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
451 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
452 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
453 if(selReqEv.target == XA.TARGETS) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
454 XChangeProperty(display, selEv.requestor, selEv.property,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
455 selEv.target, 32, PropModeReplace, &data.target, 1);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
456 XSendEvent(display, selEv.requestor, false, 0, &fullEv);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
457 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
458 } else if(selReqEv.target != data.target) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
459 selEv.property = None;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
460 XSendEvent(display, selEv.requestor, false, 0, &fullEv);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
461 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
462 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
463 XChangeProperty(display, selEv.requestor, selEv.property,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
464 data.target, 8, PropModeReplace, data.data, data.length);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
465 XSendEvent(display, selEv.requestor, false, 0, &fullEv);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
466 break;
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
467 case MappingNotify:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
468 XRefreshKeyboardMapping(&ev.xmapping);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
469 break;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
470 default:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
471 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
472 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
473 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
474 }
18
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
475 void backend_invoke(void delegate() dg) {
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
476 // TODO:
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
477 }
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
478 void backend_invokeNow(void delegate() dg) {
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
479 // TODO:
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
480 }
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
481
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
482 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
483 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
484
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
485 //{{{ KeysymToKey()
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
486 Key KeysymToKey(int sym) {
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
487 switch(sym) {
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
488 case XK_parenright:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
489 case XK_0: return Key.D0;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
490 case XK_exclam:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
491 case XK_1: return Key.D1;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
492 case XK_at:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
493 case XK_2: return Key.D2;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
494 case XK_numbersign:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
495 case XK_3: return Key.D3;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
496 case XK_dollar:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
497 case XK_4: return Key.D4;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
498 case XK_percent:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
499 case XK_5: return Key.D5;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
500 case XK_asciicircum:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
501 case XK_6: return Key.D6;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
502 case XK_ampersand:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
503 case XK_7: return Key.D7;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
504 case XK_asterisk:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
505 case XK_8: return Key.D8;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
506 case XK_parenleft:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
507 case XK_9: return Key.D9;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
508
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
509 case XK_F1: return Key.F1;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
510 case XK_F2: return Key.F2;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
511 case XK_F3: return Key.F3;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
512 case XK_F4: return Key.F4;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
513 case XK_F5: return Key.F5;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
514 case XK_F6: return Key.F6;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
515 case XK_F7: return Key.F7;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
516 case XK_F8: return Key.F8;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
517 case XK_F9: return Key.F9;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
518 case XK_F10: return Key.F10;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
519 case XK_F11: return Key.F11;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
520 case XK_F12: return Key.F12;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
521
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
522 case XK_Escape: return Key.Escape;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
523 case XK_Tab: return Key.Tab;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
524 case XK_BackSpace: return Key.Backspace;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
525 case XK_Return: return Key.Enter;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
526 case XK_KP_Enter: return Key.Enter;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
527 case XK_space: return Key.Space;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
528
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
529 case XK_KP_Left:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
530 case XK_Left: return Key.Left;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
531 case XK_KP_Right:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
532 case XK_Right: return Key.Right;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
533 case XK_KP_Up:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
534 case XK_Up: return Key.Up;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
535 case XK_KP_Down:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
536 case XK_Down: return Key.Down;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
537
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
538 case XK_KP_Insert:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
539 case XK_Insert: return Key.Insert;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
540 case XK_KP_Delete:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
541 case XK_Delete: return Key.Delete;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
542 case XK_KP_Home:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
543 case XK_Home: return Key.Home;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
544 case XK_KP_End:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
545 case XK_End: return Key.End;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
546 case XK_KP_Prior:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
547 case XK_Prior: return Key.PageUp;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
548 case XK_KP_Next:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
549 case XK_Next: return Key.PageDown;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
550
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
551 case XK_Print:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
552 case XK_Sys_Req: return Key.PrintScreen;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
553 case XK_Pause:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
554 case XK_Break: return Key.Pause;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
555
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
556 case XK_Caps_Lock: return Key.CapsLock;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
557 case XK_Num_Lock: return Key.NumLock;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
558 case XK_Scroll_Lock: return Key.ScrollLock;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
559
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
560 case XK_KP_0: return Key.NumPad0;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
561 case XK_KP_1: return Key.NumPad1;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
562 case XK_KP_2: return Key.NumPad2;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
563 case XK_KP_3: return Key.NumPad3;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
564 case XK_KP_4: return Key.NumPad4;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
565 case XK_KP_5: return Key.NumPad5;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
566 case XK_KP_6: return Key.NumPad6;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
567 case XK_KP_7: return Key.NumPad7;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
568 case XK_KP_8: return Key.NumPad8;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
569 case XK_KP_9: return Key.NumPad9;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
570 case XK_KP_Divide: return Key.NumPadDivide;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
571 case XK_KP_Multiply: return Key.NumPadMultiply;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
572 case XK_KP_Subtract: return Key.NumPadSubtract;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
573 case XK_KP_Add: return Key.NumPadAdd;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
574 case XK_KP_Decimal: return Key.NumPadDecimal;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
575
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
576 case XK_grave:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
577 case XK_asciitilde: return Key.Backquote;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
578 case XK_minus:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
579 case XK_underscore: return Key.Minus;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
580 case XK_equal:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
581 case XK_plus: return Key.Equals;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
582 case XK_bracketleft:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
583 case XK_braceleft: return Key.OpenBracket;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
584 case XK_bracketright:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
585 case XK_braceright: return Key.CloseBracket;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
586 case XK_backslash:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
587 case XK_bar: return Key.Backslash;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
588 case XK_semicolon:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
589 case XK_colon: return Key.Semicolon;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
590 case XK_apostrophe:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
591 case XK_quotedbl: return Key.Quote;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
592 case XK_comma:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
593 case XK_less: return Key.Comma;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
594 case XK_period:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
595 case XK_greater: return Key.Period;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
596 case XK_slash:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
597 case XK_question: return Key.Slash;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
598
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
599 //case XK_Menu: return Key.Menu;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
600
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
601 case XK_Shift_L:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
602 case XK_Shift_R: return Key.Shift;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
603 case XK_Control_L:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
604 case XK_Control_R: return Key.Control;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
605 case XK_Alt_L:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
606 case XK_Alt_R: return Key.Alt;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
607
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
608 //case XK_: return Key.;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
609 default:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
610 if(sym >= 0x41 && sym <= 0x5A) // Key.A - Key.Z
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
611 return cast(Key)sym;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
612 if(sym >= 0x61 && sym <= 0x7A) // Key.A - Key.Z
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
613 return cast(Key)(sym-32);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
614 return cast(Key)0;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
615 }
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
616 }
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
617 //}}}
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
618
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
619 public import tango.stdc.time;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
620 template WindowBackend() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
621 invariant {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
622 //if(_handle == 0)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
623 // return;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
624 //XWindow root, parent;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
625 //XWindow* children;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
626 //uint numChildren;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
627 //XQueryTree(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
628 // &root, &parent, &children, &numChildren);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
629 //XFree(children);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
630 //int x, y;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
631 //XWindow child;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
632 //XTranslateCoordinates(display, _handle, root, 0, 0, &x, &y, &child);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
633 //assert(_location.X == x-_borderSize.Left);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
634 //assert(_location.Y == y-_borderSize.Top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
635 //XWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
636 //XGetWindowAttributes(display, _handle, &attribs);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
637 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
638 XWindow _handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
639 bool mapped = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
640 bool backend_handleCreated() { return _handle > 0; }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
641 void backend_recreateHandle() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
642 auto primaryScreenNum = XDefaultScreen(display);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
643 //XColor color;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
644 //color.red = 65535*backColor.R/255;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
645 //color.green = 65535*backColor.G/255;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
646 //color.blue = 65535*backColor.B/255;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
647 //if(XAllocColor(display, XDefaultColormap(display, primaryScreenNum), &color))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
648 // printf("XAllocColor() failed\n");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
649
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
650 XSetWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
651 attribs.bit_gravity = NorthWestGravity;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
652 // TODO: should be backColor, and should change when backColor changes
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
653 // call XSetWindowBackground() for this
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
654 attribs.background_pixel = XWhitePixel(display, primaryScreenNum);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
655 attribs.event_mask =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
656 KeyPressMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
657 KeyReleaseMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
658 ButtonPressMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
659 ButtonReleaseMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
660 EnterWindowMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
661 LeaveWindowMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
662 PointerMotionMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
663 ButtonMotionMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
664 ExposureMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
665 FocusChangeMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
666 StructureNotifyMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
667 PropertyChangeMask;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
668 XWindow newHandle = XCreateWindow(
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
669 display, root,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
670 cast(int)x, cast(int)y,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
671 backend_insideWidth, backend_insideHeight,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
672 0, CopyFromParent, InputOutput, null,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
673 CWBitGravity | CWBackPixel | CWEventMask, &attribs);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
674
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
675 setControl(newHandle, this);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
676 auto protocols = [XA.WM_DELETE_WINDOW];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
677 XSetWMProtocols(display, newHandle, protocols.ptr, protocols.length);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
678 if(handleCreated) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
679 XDestroyWindow(display, _handle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
680 XSync(display, false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
681 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
682 _handle = newHandle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
683 text = _text; // move the text over to the new window
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
684 visible = _visible;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
685 borderStyle = _borderStyle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
686 //backend_nativeToBorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
687 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
688 Graphics backend_quickCreateGraphics() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
689 auto surface = cairo_xlib_surface_create(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
690 XDefaultVisual(display, XDefaultScreen(display)),
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
691 cast(int)width, cast(int)height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
692 auto cr = cairo_create(surface);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
693 cairo_surface_destroy(surface);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
694 cairo_translate(cr, -borderSize.left, -borderSize.top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
695 auto g = new Graphics(cr);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
696 cairo_destroy(cr);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
697 return g;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
698 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
699 void backend_visible(bool b) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
700 if(b)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
701 // if not created, create the handle by calling handle()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
702 XMapWindow(display, handle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
703 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
704 XUnmapWindow(display, _handle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
705 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
706 void backend_borderStyle(WindowBorderStyle border) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
707 backend_update_NET_WM_WINDOW_TYPE();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
708 backend_update_MOTIF_WM_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
709 backend_nativeToBorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
710 }
23
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
711 void backend_setCurrentCursor(Cursor cur) {
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
712 XDefineCursor(display, _handle, cur.handle);
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
713 }
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
714
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
715 static _InvalidRect[] invalidRects;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
716 void backend_repaint(Rect rect) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
717 invalidRects.length = invalidRects.length+1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
718 invalidRects[$-1].window = _handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
719 invalidRects[$-1].x = cast(int)(rect.x-borderSize.left);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
720 invalidRects[$-1].y = cast(int)(rect.y-borderSize.top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
721 invalidRects[$-1].width = cast(int)rect.width+1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
722 invalidRects[$-1].height = cast(int)rect.height+1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
723 //printf("invalidating x=%.1f, y=%.1f, width=%.1f, height=%.1f\n", rect.X, rect.Y, rect.width, rect.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
724 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
725 void backend_resizable(bool b) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
726 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
727 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
728 void backend_contentMinSizeChanged() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
729 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
730 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
731 void backend_contentMaxSizeChanged() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
732 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
733 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
734 void backend_location(Point pt) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
735 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
736 backend_locationSizeToNative();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
737 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
738 void backend_size(Size size) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
739 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
740 backend_locationSizeToNative();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
741 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
742 void backend_text(string str) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
743 //auto tmp = str.ToCharPtr();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
744 //XTextProperty strProperty;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
745 //if(!XStringListToTextProperty(&tmp, 1, &strProperty))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
746 //printf("XStringListToTextProperty() failed - out of memory\n");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
747 //XSetWMName(display, _handle, &strProperty);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
748 XChangeProperty(display, _handle, XA._NET_WM_NAME, XA.UTF8_STRING, 8, PropModeReplace, str.ptr, str.length);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
749 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
750 //{{{ backend specific
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
751 void backend_updateWM_NORMAL_HINTS() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
752 XSizeHints* sizeHints = XAllocSizeHints();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
753 scope(exit) XFree(sizeHints);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
754 sizeHints.flags = PMinSize | PMaxSize | PPosition | PSize;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
755 if(resizable) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
756 sizeHints.min_width = cast(int)content.minWidth;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
757 sizeHints.min_height = cast(int)content.minHeight;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
758 sizeHints.max_width =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
759 content.maxWidth > 0 ? cast(int)content.maxWidth : 30_000;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
760 sizeHints.max_height =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
761 content.maxHeight > 0 ? cast(int)content.maxHeight : 30_000;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
762 } else {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
763 sizeHints.min_width = sizeHints.max_width = backend_insideWidth;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
764 sizeHints.min_height = sizeHints.max_height = backend_insideHeight;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
765 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
766 sizeHints.x = cast(int)x;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
767 sizeHints.y = cast(int)y;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
768 sizeHints.width = backend_insideWidth;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
769 sizeHints.height = backend_insideHeight;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
770 XSetWMNormalHints(display, _handle, sizeHints);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
771 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
772 void backend_update_MOTIF_WM_HINTS() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
773 int[4] mwmHints;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
774 mwmHints[0] = 1 << 1; // flags
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
775 mwmHints[2] = borderStyle == WindowBorderStyle.None ? 0 : 1; // decor
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
776 XChangeProperty(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
777 XA._MOTIF_WM_HINTS, XA._MOTIF_WM_HINTS, 32, PropModeReplace, mwmHints.ptr, mwmHints.length);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
778 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
779 void backend_update_NET_WM_WINDOW_TYPE() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
780 XAtom[] atoms;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
781 // with Metacity, the decor is not being repainted from normal>dialog
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
782 // because they are the same size
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
783 if(borderStyle == WindowBorderStyle.Dialog)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
784 atoms = [XA._NET_WM_WINDOW_TYPE_DIALOG];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
785 else if(borderStyle == WindowBorderStyle.Tool)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
786 atoms = [XA._NET_WM_WINDOW_TYPE_UTILITY];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
787 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
788 atoms = [XA._NET_WM_WINDOW_TYPE_NORMAL];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
789 XChangeProperty(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
790 XA._NET_WM_WINDOW_TYPE, XA.ATOM, 32, PropModeReplace, atoms.ptr, atoms.length);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
791 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
792 // returns what width the x window should be...not including borders
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
793 int backend_insideWidth() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
794 return cast(int)(size.width-borderSize.left-borderSize.right);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
795 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
796 // returns what height the x window should be...not including borders
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
797 int backend_insideHeight() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
798 return cast(int)(size.height-borderSize.top-borderSize.bottom);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
799 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
800 // applies the currently set location and size to the native X Window
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
801 void backend_locationSizeToNative() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
802 Point pt = _location;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
803 if(!isTopLevelReparented(_handle)) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
804 pt.x = pt.x + _borderSize.left;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
805 pt.y = pt.y + _borderSize.top;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
806 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
807 XMoveResizeWindow(display, _handle, cast(int)pt.x, cast(int)pt.y,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
808 backend_insideWidth, backend_insideHeight);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
809 // XMoveWindow:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
810 // Under Metacity, sets the location of the WM's frame.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
811 // Under Compiz, sets the location of the window.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
812 // XResizeWindow:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
813 // Under Metacity and Compiz, sets the size of the window not
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
814 // including the WM's frame.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
815 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
816 // sets location and size based on where the native X Window is
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
817 void backend_nativeToLocationSize() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
818 XWindow root, parent;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
819 XWindow* children;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
820 uint numChildren;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
821 XQueryTree(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
822 &root, &parent, &children, &numChildren);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
823 XFree(children);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
824
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
825 int x, y;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
826 XWindow child;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
827 XTranslateCoordinates(display, _handle, root, 0, 0, &x, &y, &child);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
828 _location.x = x - _borderSize.left;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
829 _location.y = y - _borderSize.top;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
830 scope args = new EventArgs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
831 moved(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
832 XWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
833 XGetWindowAttributes(display, _handle, &attribs);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
834 _size.width = attribs.width+_borderSize.left+_borderSize.right;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
835 _size.height = attribs.height+_borderSize.top+_borderSize.bottom;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
836 resized(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
837
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
838 //content._location = Point(_borderSize.Left, _borderSize.Top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
839 //content._size = Size(attribs.width, attribs.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
840 //Stdout.format("location updated to {}", _location).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
841 //Stdout.format("size updated to {}", _size).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
842 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
843 void backend_nativeToBorderSize() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
844 _borderSize = backend_getBorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
845 //Stdout("borderSize updated to ", _borderSize).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
846 backend_nativeToLocationSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
847 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
848 BorderSize backend_getBorderSize() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
849 if(!isWMPropertySupported(XA._NET_FRAME_EXTENTS) ||
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
850 borderStyle == WindowBorderStyle.None)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
851 return BorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
852 // create handle if necessary
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
853 auto reqHandle = handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
854 bool requested = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
855
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
856 //{{{ requestExtents()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
857 void requestExtents() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
858 if(isWMPropertySupported(XA._NET_REQUEST_FRAME_EXTENTS)) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
859 XEvent ev;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
860 ev.xclient.type = ClientMessage;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
861 ev.xclient.window = handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
862 ev.xclient.message_type = XA._NET_REQUEST_FRAME_EXTENTS;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
863 ev.xclient.format = 8;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
864 XSendEvent(display, root, false,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
865 SubstructureNotifyMask | SubstructureRedirectMask, &ev);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
866 } else { // compiz and beryl do not yet support requesting
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
867 XSetWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
868 reqHandle = XCreateWindow(display,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
869 root, 0, 0, 1, 1,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
870 0, CopyFromParent, InputOnly, null, 0, &attribs);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
871
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
872 XWMHints* hints = XAllocWMHints();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
873 scope(exit) XFree(hints);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
874 hints.flags = InputHint;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
875 hints.input = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
876 XSetWMHints(display, reqHandle, hints);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
877
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
878 auto mainHandle = _handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
879 _handle = reqHandle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
880 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
881 backend_update_NET_WM_WINDOW_TYPE();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
882 backend_update_MOTIF_WM_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
883 backend_visible = true;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
884 backend_visible = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
885 _handle = mainHandle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
886 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
887 requested = true;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
888 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
889 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
890
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
891 if(!mapped)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
892 requestExtents();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
893 int* extents;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
894 while(true) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
895 XSync(display, false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
896 extents = cast(int*)getXWindowProperty(display, reqHandle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
897 XA._NET_FRAME_EXTENTS);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
898 if(extents !is null)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
899 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
900 if(!requested)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
901 requestExtents();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
902 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
903 scope(exit) XFree(extents);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
904 if(reqHandle != _handle)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
905 XDestroyWindow(display, reqHandle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
906 return BorderSize(extents[0], extents[2], extents[1], extents[3]);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
907 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
908 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
909 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
910