annotate dynamin/gui/x_window.d @ 25:0577e8738dc8

Handle EnterNotify and LeaveNotify in the X backend, so that if a window is activated or deactivated without the mouse moving, state is still updated.
author Jordan Miner <jminer7@gmail.com>
date Sat, 25 Jul 2009 15:03:39 -0500
parents 43a88caead16
children b48d3f2f570d
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:
25
0577e8738dc8 Handle EnterNotify and LeaveNotify in the X backend,
Jordan Miner <jminer7@gmail.com>
parents: 24
diff changeset
358 auto enterEv = ev.xcrossing;
0577e8738dc8 Handle EnterNotify and LeaveNotify in the X backend,
Jordan Miner <jminer7@gmail.com>
parents: 24
diff changeset
359 scope args = new MouseEventArgs(enterEv.x+c.borderSize.left,
0577e8738dc8 Handle EnterNotify and LeaveNotify in the X backend,
Jordan Miner <jminer7@gmail.com>
parents: 24
diff changeset
360 enterEv.y+c.borderSize.top, MouseButton.None);
0577e8738dc8 Handle EnterNotify and LeaveNotify in the X backend,
Jordan Miner <jminer7@gmail.com>
parents: 24
diff changeset
361 c.mouseMoved(args);
0
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 LeaveNotify:
25
0577e8738dc8 Handle EnterNotify and LeaveNotify in the X backend,
Jordan Miner <jminer7@gmail.com>
parents: 24
diff changeset
364 setHotControl(null);
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
365 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
366 case FocusIn:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
367 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
368 case FocusOut:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
369 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
370 case Expose:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
371 // TODO: move the painting code out of here and:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
372 // make a PaintQueue class and put this here:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
373 // PaintQueue.add(c, exposeEv.x, exposeEv.y, exposeEv.width, exposeEv.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
374 // then, in Window.repaint(), have this:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
375 // 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
376 // Have a PaintQueue.Compress method that merges
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
377 // all invalidated rects that touch or overlap.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
378 // In the if(!XPending(..)) above, just loop over all the
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
379 // rects in the PaintQueue, painting them.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
380 auto exposeEv = ev.xexpose;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
381 if(exposeEv.count != -2) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
382 c.repaint(exposeEv.x, exposeEv.y, exposeEv.width, exposeEv.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
383 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
384 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
385 //printf("repainting x=%d, y=%d, width=%d, height=%d\n",
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
386 // exposeEv.x, exposeEv.y, exposeEv.width, exposeEv.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
387
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
388 auto surfaceWin = cairo_xlib_surface_create(
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
389 evDisplay, evWindow,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
390 XDefaultVisual(evDisplay, XDefaultScreen(evDisplay)),
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
391 cast(int)c.width, cast(int)c.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
392 // TODO: ^ should be contentWidth/height or got from evWindow
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
393 auto crWin = cairo_create(surfaceWin);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
394 cairo_surface_destroy(surfaceWin);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
395
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
396 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
397 // TODO: use cairo_translate instead, I guess, as
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
398 // I had to change the Windows backend to it...
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
399 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
400 auto crBuff = cairo_create(surfaceBuff);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
401 cairo_surface_destroy(surfaceBuff);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
402
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
403 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
404 cairo_paint(crBuff);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
405
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
406 cairo_set_source_rgb(crBuff, 0, 0, 0);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
407 cairo_set_line_width(crBuff, 1.0);
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 auto g = new Graphics(crBuff);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
410 scope args = new PaintingEventArgs(g);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
411 c.painting(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
412 delete g;
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_surface_set_device_offset(surfaceBuff, -exposeEv.x, -exposeEv.y);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
415 cairo_set_source_surface(crWin, surfaceBuff, 0, 0);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
416 cairo_rectangle(crWin, exposeEv.x, exposeEv.y, exposeEv.width, exposeEv.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
417 cairo_fill(crWin);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
418
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
419 cairo_destroy(crBuff);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
420 cairo_destroy(crWin);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
421 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
422 case PropertyNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
423 auto propertyEv = ev.xproperty;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
424 if(propertyEv.atom == XA._NET_FRAME_EXTENTS &&
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
425 propertyEv.state != PropertyDelete)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
426 c.backend_nativeToBorderSize();
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 ConfigureNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
429 auto configureEv = ev.xconfigure;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
430 c.repaint();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
431 c.backend_nativeToLocationSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
432 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
433 case SelectionRequest:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
434 auto selReqEv = ev.xselectionrequest;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
435 XEvent fullEv;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
436 auto selEv = &fullEv.xselection;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
437 selEv.type = SelectionNotify;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
438 selEv.requestor = selReqEv.requestor;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
439 selEv.selection = selReqEv.selection;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
440 selEv.target = selReqEv.target;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
441 if(selReqEv.property != None)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
442 selEv.property = selReqEv.property;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
443 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
444 selEv.property = XA.DYNAMIN_SELECTION;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
445 selEv.time = selReqEv.time;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
446 Stdout.format("requestor: {}", selReqEv.requestor).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
447 Stdout.format("target: {}", selReqEv.target).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
448 ClipboardData* data; // change to array when supporting multiple
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
449 if(selReqEv.selection == XA.CLIPBOARD)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
450 data = &Clipboard.data;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
451 else if(selReqEv.selection == XA.PRIMARY)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
452 data = &Selection.data;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
453 else {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
454 selEv.property = None;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
455 XSendEvent(display, selEv.requestor, false, 0, &fullEv);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
456 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
457 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
458 if(selReqEv.target == XA.TARGETS) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
459 XChangeProperty(display, selEv.requestor, selEv.property,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
460 selEv.target, 32, PropModeReplace, &data.target, 1);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
461 XSendEvent(display, selEv.requestor, false, 0, &fullEv);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
462 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
463 } else if(selReqEv.target != data.target) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
464 selEv.property = None;
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;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
467 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
468 XChangeProperty(display, selEv.requestor, selEv.property,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
469 data.target, 8, PropModeReplace, data.data, data.length);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
470 XSendEvent(display, selEv.requestor, false, 0, &fullEv);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
471 break;
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
472 case MappingNotify:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
473 XRefreshKeyboardMapping(&ev.xmapping);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
474 break;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
475 default:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
476 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
477 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
478 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
479 }
18
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
480 void backend_invoke(void delegate() dg) {
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
481 // TODO:
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
482 }
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
483 void backend_invokeNow(void delegate() dg) {
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
484 // TODO:
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
485 }
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
486
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
487 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
488 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
489
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
490 //{{{ KeysymToKey()
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
491 Key KeysymToKey(int sym) {
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
492 switch(sym) {
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
493 case XK_parenright:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
494 case XK_0: return Key.D0;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
495 case XK_exclam:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
496 case XK_1: return Key.D1;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
497 case XK_at:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
498 case XK_2: return Key.D2;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
499 case XK_numbersign:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
500 case XK_3: return Key.D3;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
501 case XK_dollar:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
502 case XK_4: return Key.D4;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
503 case XK_percent:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
504 case XK_5: return Key.D5;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
505 case XK_asciicircum:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
506 case XK_6: return Key.D6;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
507 case XK_ampersand:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
508 case XK_7: return Key.D7;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
509 case XK_asterisk:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
510 case XK_8: return Key.D8;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
511 case XK_parenleft:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
512 case XK_9: return Key.D9;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
513
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
514 case XK_F1: return Key.F1;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
515 case XK_F2: return Key.F2;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
516 case XK_F3: return Key.F3;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
517 case XK_F4: return Key.F4;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
518 case XK_F5: return Key.F5;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
519 case XK_F6: return Key.F6;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
520 case XK_F7: return Key.F7;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
521 case XK_F8: return Key.F8;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
522 case XK_F9: return Key.F9;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
523 case XK_F10: return Key.F10;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
524 case XK_F11: return Key.F11;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
525 case XK_F12: return Key.F12;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
526
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
527 case XK_Escape: return Key.Escape;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
528 case XK_Tab: return Key.Tab;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
529 case XK_BackSpace: return Key.Backspace;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
530 case XK_Return: return Key.Enter;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
531 case XK_KP_Enter: return Key.Enter;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
532 case XK_space: return Key.Space;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
533
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
534 case XK_KP_Left:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
535 case XK_Left: return Key.Left;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
536 case XK_KP_Right:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
537 case XK_Right: return Key.Right;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
538 case XK_KP_Up:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
539 case XK_Up: return Key.Up;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
540 case XK_KP_Down:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
541 case XK_Down: return Key.Down;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
542
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
543 case XK_KP_Insert:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
544 case XK_Insert: return Key.Insert;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
545 case XK_KP_Delete:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
546 case XK_Delete: return Key.Delete;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
547 case XK_KP_Home:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
548 case XK_Home: return Key.Home;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
549 case XK_KP_End:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
550 case XK_End: return Key.End;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
551 case XK_KP_Prior:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
552 case XK_Prior: return Key.PageUp;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
553 case XK_KP_Next:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
554 case XK_Next: return Key.PageDown;
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_Print:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
557 case XK_Sys_Req: return Key.PrintScreen;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
558 case XK_Pause:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
559 case XK_Break: return Key.Pause;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
560
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
561 case XK_Caps_Lock: return Key.CapsLock;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
562 case XK_Num_Lock: return Key.NumLock;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
563 case XK_Scroll_Lock: return Key.ScrollLock;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
564
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
565 case XK_KP_0: return Key.NumPad0;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
566 case XK_KP_1: return Key.NumPad1;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
567 case XK_KP_2: return Key.NumPad2;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
568 case XK_KP_3: return Key.NumPad3;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
569 case XK_KP_4: return Key.NumPad4;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
570 case XK_KP_5: return Key.NumPad5;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
571 case XK_KP_6: return Key.NumPad6;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
572 case XK_KP_7: return Key.NumPad7;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
573 case XK_KP_8: return Key.NumPad8;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
574 case XK_KP_9: return Key.NumPad9;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
575 case XK_KP_Divide: return Key.NumPadDivide;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
576 case XK_KP_Multiply: return Key.NumPadMultiply;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
577 case XK_KP_Subtract: return Key.NumPadSubtract;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
578 case XK_KP_Add: return Key.NumPadAdd;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
579 case XK_KP_Decimal: return Key.NumPadDecimal;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
580
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
581 case XK_grave:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
582 case XK_asciitilde: return Key.Backquote;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
583 case XK_minus:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
584 case XK_underscore: return Key.Minus;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
585 case XK_equal:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
586 case XK_plus: return Key.Equals;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
587 case XK_bracketleft:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
588 case XK_braceleft: return Key.OpenBracket;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
589 case XK_bracketright:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
590 case XK_braceright: return Key.CloseBracket;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
591 case XK_backslash:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
592 case XK_bar: return Key.Backslash;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
593 case XK_semicolon:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
594 case XK_colon: return Key.Semicolon;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
595 case XK_apostrophe:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
596 case XK_quotedbl: return Key.Quote;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
597 case XK_comma:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
598 case XK_less: return Key.Comma;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
599 case XK_period:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
600 case XK_greater: return Key.Period;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
601 case XK_slash:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
602 case XK_question: return Key.Slash;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
603
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
604 //case XK_Menu: return Key.Menu;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
605
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
606 case XK_Shift_L:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
607 case XK_Shift_R: return Key.Shift;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
608 case XK_Control_L:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
609 case XK_Control_R: return Key.Control;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
610 case XK_Alt_L:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
611 case XK_Alt_R: return Key.Alt;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
612
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
613 //case XK_: return Key.;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
614 default:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
615 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
616 return cast(Key)sym;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
617 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
618 return cast(Key)(sym-32);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
619 return cast(Key)0;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
620 }
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
621 }
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
622 //}}}
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
623
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
624 public import tango.stdc.time;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
625 template WindowBackend() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
626 invariant {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
627 //if(_handle == 0)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
628 // return;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
629 //XWindow root, parent;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
630 //XWindow* children;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
631 //uint numChildren;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
632 //XQueryTree(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
633 // &root, &parent, &children, &numChildren);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
634 //XFree(children);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
635 //int x, y;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
636 //XWindow child;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
637 //XTranslateCoordinates(display, _handle, root, 0, 0, &x, &y, &child);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
638 //assert(_location.X == x-_borderSize.Left);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
639 //assert(_location.Y == y-_borderSize.Top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
640 //XWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
641 //XGetWindowAttributes(display, _handle, &attribs);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
642 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
643 XWindow _handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
644 bool mapped = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
645 bool backend_handleCreated() { return _handle > 0; }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
646 void backend_recreateHandle() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
647 auto primaryScreenNum = XDefaultScreen(display);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
648 //XColor color;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
649 //color.red = 65535*backColor.R/255;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
650 //color.green = 65535*backColor.G/255;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
651 //color.blue = 65535*backColor.B/255;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
652 //if(XAllocColor(display, XDefaultColormap(display, primaryScreenNum), &color))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
653 // printf("XAllocColor() failed\n");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
654
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
655 XSetWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
656 attribs.bit_gravity = NorthWestGravity;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
657 // TODO: should be backColor, and should change when backColor changes
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
658 // call XSetWindowBackground() for this
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
659 attribs.background_pixel = XWhitePixel(display, primaryScreenNum);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
660 attribs.event_mask =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
661 KeyPressMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
662 KeyReleaseMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
663 ButtonPressMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
664 ButtonReleaseMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
665 EnterWindowMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
666 LeaveWindowMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
667 PointerMotionMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
668 ButtonMotionMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
669 ExposureMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
670 FocusChangeMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
671 StructureNotifyMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
672 PropertyChangeMask;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
673 XWindow newHandle = XCreateWindow(
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
674 display, root,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
675 cast(int)x, cast(int)y,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
676 backend_insideWidth, backend_insideHeight,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
677 0, CopyFromParent, InputOutput, null,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
678 CWBitGravity | CWBackPixel | CWEventMask, &attribs);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
679
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
680 setControl(newHandle, this);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
681 auto protocols = [XA.WM_DELETE_WINDOW];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
682 XSetWMProtocols(display, newHandle, protocols.ptr, protocols.length);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
683 if(handleCreated) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
684 XDestroyWindow(display, _handle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
685 XSync(display, false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
686 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
687 _handle = newHandle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
688 text = _text; // move the text over to the new window
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
689 visible = _visible;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
690 borderStyle = _borderStyle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
691 //backend_nativeToBorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
692 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
693 Graphics backend_quickCreateGraphics() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
694 auto surface = cairo_xlib_surface_create(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
695 XDefaultVisual(display, XDefaultScreen(display)),
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
696 cast(int)width, cast(int)height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
697 auto cr = cairo_create(surface);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
698 cairo_surface_destroy(surface);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
699 cairo_translate(cr, -borderSize.left, -borderSize.top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
700 auto g = new Graphics(cr);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
701 cairo_destroy(cr);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
702 return g;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
703 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
704 void backend_visible(bool b) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
705 if(b)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
706 // if not created, create the handle by calling handle()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
707 XMapWindow(display, handle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
708 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
709 XUnmapWindow(display, _handle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
710 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
711 void backend_borderStyle(WindowBorderStyle border) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
712 backend_update_NET_WM_WINDOW_TYPE();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
713 backend_update_MOTIF_WM_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
714 backend_nativeToBorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
715 }
23
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
716 void backend_setCurrentCursor(Cursor cur) {
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
717 XDefineCursor(display, _handle, cur.handle);
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
718 }
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
719
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
720 static _InvalidRect[] invalidRects;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
721 void backend_repaint(Rect rect) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
722 invalidRects.length = invalidRects.length+1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
723 invalidRects[$-1].window = _handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
724 invalidRects[$-1].x = cast(int)(rect.x-borderSize.left);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
725 invalidRects[$-1].y = cast(int)(rect.y-borderSize.top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
726 invalidRects[$-1].width = cast(int)rect.width+1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
727 invalidRects[$-1].height = cast(int)rect.height+1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
728 //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
729 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
730 void backend_resizable(bool b) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
731 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
732 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
733 void backend_contentMinSizeChanged() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
734 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
735 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
736 void backend_contentMaxSizeChanged() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
737 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
738 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
739 void backend_location(Point pt) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
740 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
741 backend_locationSizeToNative();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
742 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
743 void backend_size(Size size) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
744 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
745 backend_locationSizeToNative();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
746 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
747 void backend_text(string str) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
748 //auto tmp = str.ToCharPtr();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
749 //XTextProperty strProperty;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
750 //if(!XStringListToTextProperty(&tmp, 1, &strProperty))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
751 //printf("XStringListToTextProperty() failed - out of memory\n");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
752 //XSetWMName(display, _handle, &strProperty);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
753 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
754 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
755 //{{{ backend specific
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
756 void backend_updateWM_NORMAL_HINTS() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
757 XSizeHints* sizeHints = XAllocSizeHints();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
758 scope(exit) XFree(sizeHints);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
759 sizeHints.flags = PMinSize | PMaxSize | PPosition | PSize;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
760 if(resizable) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
761 sizeHints.min_width = cast(int)content.minWidth;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
762 sizeHints.min_height = cast(int)content.minHeight;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
763 sizeHints.max_width =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
764 content.maxWidth > 0 ? cast(int)content.maxWidth : 30_000;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
765 sizeHints.max_height =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
766 content.maxHeight > 0 ? cast(int)content.maxHeight : 30_000;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
767 } else {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
768 sizeHints.min_width = sizeHints.max_width = backend_insideWidth;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
769 sizeHints.min_height = sizeHints.max_height = backend_insideHeight;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
770 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
771 sizeHints.x = cast(int)x;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
772 sizeHints.y = cast(int)y;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
773 sizeHints.width = backend_insideWidth;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
774 sizeHints.height = backend_insideHeight;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
775 XSetWMNormalHints(display, _handle, sizeHints);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
776 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
777 void backend_update_MOTIF_WM_HINTS() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
778 int[4] mwmHints;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
779 mwmHints[0] = 1 << 1; // flags
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
780 mwmHints[2] = borderStyle == WindowBorderStyle.None ? 0 : 1; // decor
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
781 XChangeProperty(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
782 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
783 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
784 void backend_update_NET_WM_WINDOW_TYPE() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
785 XAtom[] atoms;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
786 // with Metacity, the decor is not being repainted from normal>dialog
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
787 // because they are the same size
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
788 if(borderStyle == WindowBorderStyle.Dialog)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
789 atoms = [XA._NET_WM_WINDOW_TYPE_DIALOG];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
790 else if(borderStyle == WindowBorderStyle.Tool)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
791 atoms = [XA._NET_WM_WINDOW_TYPE_UTILITY];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
792 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
793 atoms = [XA._NET_WM_WINDOW_TYPE_NORMAL];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
794 XChangeProperty(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
795 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
796 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
797 // returns what width the x window should be...not including borders
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
798 int backend_insideWidth() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
799 return cast(int)(size.width-borderSize.left-borderSize.right);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
800 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
801 // returns what height the x window should be...not including borders
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
802 int backend_insideHeight() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
803 return cast(int)(size.height-borderSize.top-borderSize.bottom);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
804 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
805 // 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
806 void backend_locationSizeToNative() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
807 Point pt = _location;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
808 if(!isTopLevelReparented(_handle)) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
809 pt.x = pt.x + _borderSize.left;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
810 pt.y = pt.y + _borderSize.top;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
811 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
812 XMoveResizeWindow(display, _handle, cast(int)pt.x, cast(int)pt.y,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
813 backend_insideWidth, backend_insideHeight);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
814 // XMoveWindow:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
815 // Under Metacity, sets the location of the WM's frame.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
816 // Under Compiz, sets the location of the window.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
817 // XResizeWindow:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
818 // Under Metacity and Compiz, sets the size of the window not
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
819 // including the WM's frame.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
820 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
821 // 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
822 void backend_nativeToLocationSize() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
823 XWindow root, parent;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
824 XWindow* children;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
825 uint numChildren;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
826 XQueryTree(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
827 &root, &parent, &children, &numChildren);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
828 XFree(children);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
829
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
830 int x, y;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
831 XWindow child;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
832 XTranslateCoordinates(display, _handle, root, 0, 0, &x, &y, &child);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
833 _location.x = x - _borderSize.left;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
834 _location.y = y - _borderSize.top;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
835 scope args = new EventArgs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
836 moved(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
837 XWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
838 XGetWindowAttributes(display, _handle, &attribs);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
839 _size.width = attribs.width+_borderSize.left+_borderSize.right;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
840 _size.height = attribs.height+_borderSize.top+_borderSize.bottom;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
841 resized(args);
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 //content._location = Point(_borderSize.Left, _borderSize.Top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
844 //content._size = Size(attribs.width, attribs.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
845 //Stdout.format("location updated to {}", _location).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
846 //Stdout.format("size updated to {}", _size).newline;
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 void backend_nativeToBorderSize() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
849 _borderSize = backend_getBorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
850 //Stdout("borderSize updated to ", _borderSize).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
851 backend_nativeToLocationSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
852 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
853 BorderSize backend_getBorderSize() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
854 if(!isWMPropertySupported(XA._NET_FRAME_EXTENTS) ||
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
855 borderStyle == WindowBorderStyle.None)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
856 return BorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
857 // create handle if necessary
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
858 auto reqHandle = handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
859 bool requested = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
860
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
861 //{{{ requestExtents()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
862 void requestExtents() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
863 if(isWMPropertySupported(XA._NET_REQUEST_FRAME_EXTENTS)) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
864 XEvent ev;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
865 ev.xclient.type = ClientMessage;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
866 ev.xclient.window = handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
867 ev.xclient.message_type = XA._NET_REQUEST_FRAME_EXTENTS;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
868 ev.xclient.format = 8;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
869 XSendEvent(display, root, false,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
870 SubstructureNotifyMask | SubstructureRedirectMask, &ev);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
871 } else { // compiz and beryl do not yet support requesting
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
872 XSetWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
873 reqHandle = XCreateWindow(display,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
874 root, 0, 0, 1, 1,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
875 0, CopyFromParent, InputOnly, null, 0, &attribs);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
876
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
877 XWMHints* hints = XAllocWMHints();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
878 scope(exit) XFree(hints);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
879 hints.flags = InputHint;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
880 hints.input = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
881 XSetWMHints(display, reqHandle, hints);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
882
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
883 auto mainHandle = _handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
884 _handle = reqHandle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
885 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
886 backend_update_NET_WM_WINDOW_TYPE();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
887 backend_update_MOTIF_WM_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
888 backend_visible = true;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
889 backend_visible = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
890 _handle = mainHandle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
891 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
892 requested = true;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
893 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
894 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
895
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
896 if(!mapped)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
897 requestExtents();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
898 int* extents;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
899 while(true) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
900 XSync(display, false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
901 extents = cast(int*)getXWindowProperty(display, reqHandle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
902 XA._NET_FRAME_EXTENTS);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
903 if(extents !is null)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
904 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
905 if(!requested)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
906 requestExtents();
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 scope(exit) XFree(extents);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
909 if(reqHandle != _handle)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
910 XDestroyWindow(display, reqHandle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
911 return BorderSize(extents[0], extents[2], extents[1], extents[3]);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
912 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
913 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
914 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
915