annotate dynamin/gui/x_window.d @ 33:329ce1001936

Refactor painting on X by using PaintQueue.
author Jordan Miner <jminer7@gmail.com>
date Sat, 25 Jul 2009 22:49:17 -0500
parents b48d3f2f570d
children e4d290aaa7ed
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
33
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
165 struct InvalidRect {
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
166 Window window;
0
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 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
169
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
170 static class PaintQueue {
33
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
171 import tango.util.container.LinkedList;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
172 import dynamin.painting.graphics;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
173 import dynamin.gui.events;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
174 static:
33
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
175 LinkedList!(InvalidRect) rects;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
176 static this() {
33
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
177 rects = new LinkedList!(InvalidRect)();
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
178 }
33
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
179 void add(Window win, int x, int y, int width, int height) {
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
180 auto iter = rects.iterator;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
181 InvalidRect* r;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
182 while((r = iter.next()) !is null) {
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
183 if(r.window == win && shouldMerge(r.x, r.y, r.width, r.height,
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
184 x, y, width, height)) {
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
185 join(r.x, r.y, r.width, r.height,
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
186 x, y, width, height);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
187 return;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
188 }
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
189 }
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
190 InvalidRect rect;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
191 rect.window = win;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
192 rect.x = x;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
193 rect.y = y;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
194 rect.width = width;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
195 rect.height = height;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
196 rects.add(rect);
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
197 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
198 bool shouldMerge(int x1, int y1, int width1, int height1,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
199 int x2, int y2, int width2, int height2) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
200 return x2 <= x1 + width1 && y2 <= y1 + height1 &&
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
201 x2 + width2 >= x1 && y2 + height2 >= y1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
202 }
33
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
203 void join(inout int x, inout int y, inout int width, inout int height,
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
204 int x2, int y2, int width2, int height2) {
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
205 auto minx = min(x, x2);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
206 auto miny = min(y, y2);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
207 width = max(x+width, x2+width2)-minx;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
208 height = max(y+height, y2+height2)-miny;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
209 x = minx;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
210 y = miny;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
211 }
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
212 void paint() {
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
213 if(rects.size == 0)
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
214 return;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
215 auto iter = rects.iterator;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
216 InvalidRect* r;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
217 while((r = iter.next()) !is null)
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
218 paint(r);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
219 rects.clear();
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
220 }
33
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
221 void paint(InvalidRect* rect) {
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
222 auto surfaceWin = cairo_xlib_surface_create(
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
223 display, rect.window.handle,
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
224 XDefaultVisual(display, XDefaultScreen(display)),
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
225 cast(int)rect.window.width, cast(int)rect.window.height);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
226 // TODO: ^ should be contentWidth/height or got from evWindow
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
227 auto crWin = cairo_create(surfaceWin);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
228 cairo_surface_destroy(surfaceWin);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
229
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
230 auto surfaceBuff = cairo_surface_create_similar(surfaceWin, CAIRO_CONTENT_COLOR, rect.width, rect.height);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
231 auto crBuff = cairo_create(surfaceBuff);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
232 cairo_translate(crBuff,
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
233 -rect.x-rect.window.borderSize.left,
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
234 -rect.y-rect.window.borderSize.top);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
235 cairo_surface_destroy(surfaceBuff);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
236
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
237 cairo_set_source_rgb(crBuff, rect.window.content.backColor.R/255.0, rect.window.content.backColor.G/255.0, rect.window.content.backColor.B/255.0);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
238 cairo_paint(crBuff);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
239
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
240 cairo_set_source_rgb(crBuff, 0, 0, 0);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
241 cairo_set_line_width(crBuff, 1.0);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
242
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
243 auto g = new Graphics(crBuff);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
244 scope args = new PaintingEventArgs(g);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
245 rect.window.painting(args);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
246 delete g;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
247
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
248 cairo_set_source_surface(crWin, surfaceBuff, rect.x, rect.y);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
249 cairo_rectangle(crWin, rect.x, rect.y, rect.width, rect.height);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
250 cairo_fill(crWin);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
251
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
252 cairo_destroy(crBuff);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
253 cairo_destroy(crWin);
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
254 }
33
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
255 }
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
256
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
257 Key prevKey = Key.None;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
258
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
259 //{{{ ApplicationBackend
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
260 template ApplicationBackend() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
261 void backend_run(Window w) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
262 bool isWindowVisible() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
263 if(w is null) return true;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
264 return w.visible;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
265 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
266 XEvent ev;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
267 while(isWindowVisible()) {
33
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
268 if(XEventsQueued(display, QueuedAlready) == 0)
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
269 PaintQueue.paint();
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
270 XNextEvent(display, &ev);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
271 auto evDisplay = ev.xany.display;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
272 auto evWindow = ev.xany.window;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
273 Window c = getControl(evWindow);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
274 // c will be null for SelectionRequest events
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
275 //if(c is null)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
276 // continue;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
277 //{{{ helper functions
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
278 void createMouseEvent(void delegate(MouseEventArgs args) func) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
279 MouseButton button;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
280 auto buttonEv = ev.xbutton;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
281 switch(buttonEv.button) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
282 case 1: button = MouseButton.Left; break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
283 case 2: button = MouseButton.Middle; break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
284 case 3: button = MouseButton.Right; break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
285 default: return;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
286 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
287 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
288 func(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
289 }
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
290 bool isKeyDown(uint keycode) {
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
291 ubyte[32] keys;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
292 XQueryKeymap(display, keys.ptr);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
293 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
294 }
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
295 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
296 switch(ev.type) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
297 case MapNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
298 c.mapped = true;
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 case UnmapNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
301 c.mapped = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
302 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
303 case DestroyNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
304 setControl(evWindow, null);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
305 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
306 case ClientMessage:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
307 auto clientEv = ev.xclient;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
308 if(clientEv.message_type != XA.WM_PROTOCOLS)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
309 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
310 if(clientEv.data.l[0] == XA.WM_DELETE_WINDOW) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
311 XDestroyWindow(evDisplay, evWindow);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
312 return; // TODO: check event, and figure out what to do
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
313 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
314 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
315 case KeyPress:
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
316 auto sym = XLookupKeysym(&ev.xkey, 0);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
317 if(sym == NoSymbol)
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
318 break;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
319 // 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
320 // 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
321 auto k = KeysymToKey(sym);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
322 scope args = new KeyEventArgs(k, k == prevKey);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
323 prevKey = k;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
324 Control focused = c.focusedControl ? c.focusedControl : c;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
325 focused.keyDown(args);
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
326 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
327 case KeyRelease:
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
328 // 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
329 // 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
330 // 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
331 // not send a keyUp event.
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
332 if(isKeyDown(ev.xkey.keycode))
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
333 break;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
334 auto sym = XLookupKeysym(&ev.xkey, 0);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
335 if(sym == NoSymbol)
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
336 break;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
337 auto k = KeysymToKey(sym);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
338 if(k == prevKey)
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
339 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
340 scope args = new KeyEventArgs(k, false);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
341 Control focused = c.focusedControl ? c.focusedControl : c;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
342 focused.keyUp(args);
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
343 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
344 case ButtonPress:
32
b48d3f2f570d Implement mouseTurned event with X.
Jordan Miner <jminer7@gmail.com>
parents: 25
diff changeset
345 // 4 = scroll up, 5 = scroll down
b48d3f2f570d Implement mouseTurned event with X.
Jordan Miner <jminer7@gmail.com>
parents: 25
diff changeset
346 // 6 = scroll left, 7 = scroll right
b48d3f2f570d Implement mouseTurned event with X.
Jordan Miner <jminer7@gmail.com>
parents: 25
diff changeset
347 auto b = ev.xbutton.button;
b48d3f2f570d Implement mouseTurned event with X.
Jordan Miner <jminer7@gmail.com>
parents: 25
diff changeset
348 if(b == 4 || b == 5) {
b48d3f2f570d Implement mouseTurned event with X.
Jordan Miner <jminer7@gmail.com>
parents: 25
diff changeset
349 scope args = new MouseTurnedEventArgs(b == 4 ? -3:3, false);
b48d3f2f570d Implement mouseTurned event with X.
Jordan Miner <jminer7@gmail.com>
parents: 25
diff changeset
350 c.getDescendantAtPoint(
b48d3f2f570d Implement mouseTurned event with X.
Jordan Miner <jminer7@gmail.com>
parents: 25
diff changeset
351 ev.xbutton.x+c._borderSize.left,
b48d3f2f570d Implement mouseTurned event with X.
Jordan Miner <jminer7@gmail.com>
parents: 25
diff changeset
352 ev.xbutton.y+c._borderSize.top).mouseTurned(args);
b48d3f2f570d Implement mouseTurned event with X.
Jordan Miner <jminer7@gmail.com>
parents: 25
diff changeset
353 break;
b48d3f2f570d Implement mouseTurned event with X.
Jordan Miner <jminer7@gmail.com>
parents: 25
diff changeset
354 }
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
355 createMouseEvent((MouseEventArgs args) { c.mouseDown(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 ButtonRelease:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
358 createMouseEvent((MouseEventArgs args) { c.mouseUp(args); });
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
359 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
360 case MotionNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
361 auto motionEv = ev.xmotion;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
362 Control captor = getCaptorControl();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
363 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
364 if(captor)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
365 pt = c.contentToContent(pt, captor);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
366 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
367 captor = c;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
368 scope args = new MouseEventArgs(pt.x, pt.y, MouseButton.None);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
369 if(motionEv.state &
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
370 (Button1Mask | Button2Mask | Button3Mask)) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
371 captor.mouseDragged(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
372 } else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
373 captor.mouseMoved(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
374 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
375 case EnterNotify:
25
0577e8738dc8 Handle EnterNotify and LeaveNotify in the X backend,
Jordan Miner <jminer7@gmail.com>
parents: 24
diff changeset
376 auto enterEv = ev.xcrossing;
0577e8738dc8 Handle EnterNotify and LeaveNotify in the X backend,
Jordan Miner <jminer7@gmail.com>
parents: 24
diff changeset
377 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
378 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
379 c.mouseMoved(args);
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
380 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
381 case LeaveNotify:
25
0577e8738dc8 Handle EnterNotify and LeaveNotify in the X backend,
Jordan Miner <jminer7@gmail.com>
parents: 24
diff changeset
382 setHotControl(null);
0
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 case FocusIn:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
385 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
386 case FocusOut:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
387 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
388 case Expose:
33
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
389 auto exposeEv = &ev.xexpose;
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
390 PaintQueue.add(c, exposeEv.x, exposeEv.y, exposeEv.width, exposeEv.height);
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
391 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
392 case PropertyNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
393 auto propertyEv = ev.xproperty;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
394 if(propertyEv.atom == XA._NET_FRAME_EXTENTS &&
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
395 propertyEv.state != PropertyDelete)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
396 c.backend_nativeToBorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
397 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
398 case ConfigureNotify:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
399 auto configureEv = ev.xconfigure;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
400 c.repaint();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
401 c.backend_nativeToLocationSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
402 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
403 case SelectionRequest:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
404 auto selReqEv = ev.xselectionrequest;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
405 XEvent fullEv;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
406 auto selEv = &fullEv.xselection;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
407 selEv.type = SelectionNotify;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
408 selEv.requestor = selReqEv.requestor;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
409 selEv.selection = selReqEv.selection;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
410 selEv.target = selReqEv.target;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
411 if(selReqEv.property != None)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
412 selEv.property = selReqEv.property;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
413 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
414 selEv.property = XA.DYNAMIN_SELECTION;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
415 selEv.time = selReqEv.time;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
416 Stdout.format("requestor: {}", selReqEv.requestor).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
417 Stdout.format("target: {}", selReqEv.target).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
418 ClipboardData* data; // change to array when supporting multiple
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
419 if(selReqEv.selection == XA.CLIPBOARD)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
420 data = &Clipboard.data;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
421 else if(selReqEv.selection == XA.PRIMARY)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
422 data = &Selection.data;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
423 else {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
424 selEv.property = None;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
425 XSendEvent(display, selEv.requestor, false, 0, &fullEv);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
426 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
427 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
428 if(selReqEv.target == XA.TARGETS) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
429 XChangeProperty(display, selEv.requestor, selEv.property,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
430 selEv.target, 32, PropModeReplace, &data.target, 1);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
431 XSendEvent(display, selEv.requestor, false, 0, &fullEv);
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 } else if(selReqEv.target != data.target) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
434 selEv.property = None;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
435 XSendEvent(display, selEv.requestor, false, 0, &fullEv);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
436 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
437 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
438 XChangeProperty(display, selEv.requestor, selEv.property,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
439 data.target, 8, PropModeReplace, data.data, data.length);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
440 XSendEvent(display, selEv.requestor, false, 0, &fullEv);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
441 break;
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
442 case MappingNotify:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
443 XRefreshKeyboardMapping(&ev.xmapping);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
444 break;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
445 default:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
446 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
447 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
448 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
449 }
18
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
450 void backend_invoke(void delegate() dg) {
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
451 // TODO:
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
452 }
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
453 void backend_invokeNow(void delegate() dg) {
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
454 // TODO:
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
455 }
836a064828e8 Implement FileDialog/DirectoryDialog with GTK
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
456
0
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 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
459
24
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
460 //{{{ KeysymToKey()
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
461 Key KeysymToKey(int sym) {
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
462 switch(sym) {
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
463 case XK_parenright:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
464 case XK_0: return Key.D0;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
465 case XK_exclam:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
466 case XK_1: return Key.D1;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
467 case XK_at:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
468 case XK_2: return Key.D2;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
469 case XK_numbersign:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
470 case XK_3: return Key.D3;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
471 case XK_dollar:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
472 case XK_4: return Key.D4;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
473 case XK_percent:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
474 case XK_5: return Key.D5;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
475 case XK_asciicircum:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
476 case XK_6: return Key.D6;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
477 case XK_ampersand:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
478 case XK_7: return Key.D7;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
479 case XK_asterisk:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
480 case XK_8: return Key.D8;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
481 case XK_parenleft:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
482 case XK_9: return Key.D9;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
483
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
484 case XK_F1: return Key.F1;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
485 case XK_F2: return Key.F2;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
486 case XK_F3: return Key.F3;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
487 case XK_F4: return Key.F4;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
488 case XK_F5: return Key.F5;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
489 case XK_F6: return Key.F6;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
490 case XK_F7: return Key.F7;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
491 case XK_F8: return Key.F8;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
492 case XK_F9: return Key.F9;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
493 case XK_F10: return Key.F10;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
494 case XK_F11: return Key.F11;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
495 case XK_F12: return Key.F12;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
496
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
497 case XK_Escape: return Key.Escape;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
498 case XK_Tab: return Key.Tab;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
499 case XK_BackSpace: return Key.Backspace;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
500 case XK_Return: return Key.Enter;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
501 case XK_KP_Enter: return Key.Enter;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
502 case XK_space: return Key.Space;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
503
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
504 case XK_KP_Left:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
505 case XK_Left: return Key.Left;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
506 case XK_KP_Right:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
507 case XK_Right: return Key.Right;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
508 case XK_KP_Up:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
509 case XK_Up: return Key.Up;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
510 case XK_KP_Down:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
511 case XK_Down: return Key.Down;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
512
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
513 case XK_KP_Insert:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
514 case XK_Insert: return Key.Insert;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
515 case XK_KP_Delete:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
516 case XK_Delete: return Key.Delete;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
517 case XK_KP_Home:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
518 case XK_Home: return Key.Home;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
519 case XK_KP_End:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
520 case XK_End: return Key.End;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
521 case XK_KP_Prior:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
522 case XK_Prior: return Key.PageUp;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
523 case XK_KP_Next:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
524 case XK_Next: return Key.PageDown;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
525
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
526 case XK_Print:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
527 case XK_Sys_Req: return Key.PrintScreen;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
528 case XK_Pause:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
529 case XK_Break: return Key.Pause;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
530
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
531 case XK_Caps_Lock: return Key.CapsLock;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
532 case XK_Num_Lock: return Key.NumLock;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
533 case XK_Scroll_Lock: return Key.ScrollLock;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
534
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
535 case XK_KP_0: return Key.NumPad0;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
536 case XK_KP_1: return Key.NumPad1;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
537 case XK_KP_2: return Key.NumPad2;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
538 case XK_KP_3: return Key.NumPad3;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
539 case XK_KP_4: return Key.NumPad4;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
540 case XK_KP_5: return Key.NumPad5;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
541 case XK_KP_6: return Key.NumPad6;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
542 case XK_KP_7: return Key.NumPad7;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
543 case XK_KP_8: return Key.NumPad8;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
544 case XK_KP_9: return Key.NumPad9;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
545 case XK_KP_Divide: return Key.NumPadDivide;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
546 case XK_KP_Multiply: return Key.NumPadMultiply;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
547 case XK_KP_Subtract: return Key.NumPadSubtract;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
548 case XK_KP_Add: return Key.NumPadAdd;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
549 case XK_KP_Decimal: return Key.NumPadDecimal;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
550
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
551 case XK_grave:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
552 case XK_asciitilde: return Key.Backquote;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
553 case XK_minus:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
554 case XK_underscore: return Key.Minus;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
555 case XK_equal:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
556 case XK_plus: return Key.Equals;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
557 case XK_bracketleft:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
558 case XK_braceleft: return Key.OpenBracket;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
559 case XK_bracketright:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
560 case XK_braceright: return Key.CloseBracket;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
561 case XK_backslash:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
562 case XK_bar: return Key.Backslash;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
563 case XK_semicolon:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
564 case XK_colon: return Key.Semicolon;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
565 case XK_apostrophe:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
566 case XK_quotedbl: return Key.Quote;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
567 case XK_comma:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
568 case XK_less: return Key.Comma;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
569 case XK_period:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
570 case XK_greater: return Key.Period;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
571 case XK_slash:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
572 case XK_question: return Key.Slash;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
573
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
574 //case XK_Menu: return Key.Menu;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
575
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
576 case XK_Shift_L:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
577 case XK_Shift_R: return Key.Shift;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
578 case XK_Control_L:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
579 case XK_Control_R: return Key.Control;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
580 case XK_Alt_L:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
581 case XK_Alt_R: return Key.Alt;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
582
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
583 //case XK_: return Key.;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
584 default:
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
585 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
586 return cast(Key)sym;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
587 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
588 return cast(Key)(sym-32);
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
589 return cast(Key)0;
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
590 }
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
591 }
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
592 //}}}
43a88caead16 Implement keyDown and keyUp events with X.
Jordan Miner <jminer7@gmail.com>
parents: 23
diff changeset
593
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
594 public import tango.stdc.time;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
595 template WindowBackend() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
596 invariant {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
597 //if(_handle == 0)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
598 // return;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
599 //XWindow root, parent;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
600 //XWindow* children;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
601 //uint numChildren;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
602 //XQueryTree(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
603 // &root, &parent, &children, &numChildren);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
604 //XFree(children);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
605 //int x, y;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
606 //XWindow child;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
607 //XTranslateCoordinates(display, _handle, root, 0, 0, &x, &y, &child);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
608 //assert(_location.X == x-_borderSize.Left);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
609 //assert(_location.Y == y-_borderSize.Top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
610 //XWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
611 //XGetWindowAttributes(display, _handle, &attribs);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
612 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
613 XWindow _handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
614 bool mapped = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
615 bool backend_handleCreated() { return _handle > 0; }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
616 void backend_recreateHandle() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
617 auto primaryScreenNum = XDefaultScreen(display);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
618 //XColor color;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
619 //color.red = 65535*backColor.R/255;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
620 //color.green = 65535*backColor.G/255;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
621 //color.blue = 65535*backColor.B/255;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
622 //if(XAllocColor(display, XDefaultColormap(display, primaryScreenNum), &color))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
623 // printf("XAllocColor() failed\n");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
624
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
625 XSetWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
626 attribs.bit_gravity = NorthWestGravity;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
627 // TODO: should be backColor, and should change when backColor changes
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
628 // call XSetWindowBackground() for this
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
629 attribs.background_pixel = XWhitePixel(display, primaryScreenNum);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
630 attribs.event_mask =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
631 KeyPressMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
632 KeyReleaseMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
633 ButtonPressMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
634 ButtonReleaseMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
635 EnterWindowMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
636 LeaveWindowMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
637 PointerMotionMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
638 ButtonMotionMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
639 ExposureMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
640 FocusChangeMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
641 StructureNotifyMask |
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
642 PropertyChangeMask;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
643 XWindow newHandle = XCreateWindow(
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
644 display, root,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
645 cast(int)x, cast(int)y,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
646 backend_insideWidth, backend_insideHeight,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
647 0, CopyFromParent, InputOutput, null,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
648 CWBitGravity | CWBackPixel | CWEventMask, &attribs);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
649
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
650 setControl(newHandle, this);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
651 auto protocols = [XA.WM_DELETE_WINDOW];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
652 XSetWMProtocols(display, newHandle, protocols.ptr, protocols.length);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
653 if(handleCreated) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
654 XDestroyWindow(display, _handle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
655 XSync(display, false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
656 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
657 _handle = newHandle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
658 text = _text; // move the text over to the new window
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
659 visible = _visible;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
660 borderStyle = _borderStyle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
661 //backend_nativeToBorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
662 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
663 Graphics backend_quickCreateGraphics() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
664 auto surface = cairo_xlib_surface_create(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
665 XDefaultVisual(display, XDefaultScreen(display)),
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
666 cast(int)width, cast(int)height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
667 auto cr = cairo_create(surface);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
668 cairo_surface_destroy(surface);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
669 cairo_translate(cr, -borderSize.left, -borderSize.top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
670 auto g = new Graphics(cr);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
671 cairo_destroy(cr);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
672 return g;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
673 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
674 void backend_visible(bool b) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
675 if(b)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
676 // if not created, create the handle by calling handle()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
677 XMapWindow(display, handle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
678 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
679 XUnmapWindow(display, _handle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
680 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
681 void backend_borderStyle(WindowBorderStyle border) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
682 backend_update_NET_WM_WINDOW_TYPE();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
683 backend_update_MOTIF_WM_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
684 backend_nativeToBorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
685 }
23
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
686 void backend_setCurrentCursor(Cursor cur) {
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
687 XDefineCursor(display, _handle, cur.handle);
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
688 }
d55b5b998412 Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents: 18
diff changeset
689
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
690 void backend_repaint(Rect rect) {
33
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
691 PaintQueue.add(this,
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
692 cast(int)(rect.x-borderSize.left), cast(int)(rect.y-borderSize.top),
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
693 cast(int)rect.width+1, cast(int)rect.height+1);
329ce1001936 Refactor painting on X by using PaintQueue.
Jordan Miner <jminer7@gmail.com>
parents: 32
diff changeset
694 //Stdout.format("invalidating x={}, y={}, width={}, height={}", rect.x, rect.y, rect.width, rect.height).newline;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
695 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
696 void backend_resizable(bool b) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
697 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
698 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
699 void backend_contentMinSizeChanged() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
700 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
701 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
702 void backend_contentMaxSizeChanged() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
703 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
704 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
705 void backend_location(Point pt) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
706 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
707 backend_locationSizeToNative();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
708 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
709 void backend_size(Size size) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
710 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
711 backend_locationSizeToNative();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
712 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
713 void backend_text(string str) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
714 //auto tmp = str.ToCharPtr();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
715 //XTextProperty strProperty;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
716 //if(!XStringListToTextProperty(&tmp, 1, &strProperty))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
717 //printf("XStringListToTextProperty() failed - out of memory\n");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
718 //XSetWMName(display, _handle, &strProperty);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
719 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
720 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
721 //{{{ backend specific
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
722 void backend_updateWM_NORMAL_HINTS() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
723 XSizeHints* sizeHints = XAllocSizeHints();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
724 scope(exit) XFree(sizeHints);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
725 sizeHints.flags = PMinSize | PMaxSize | PPosition | PSize;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
726 if(resizable) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
727 sizeHints.min_width = cast(int)content.minWidth;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
728 sizeHints.min_height = cast(int)content.minHeight;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
729 sizeHints.max_width =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
730 content.maxWidth > 0 ? cast(int)content.maxWidth : 30_000;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
731 sizeHints.max_height =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
732 content.maxHeight > 0 ? cast(int)content.maxHeight : 30_000;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
733 } else {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
734 sizeHints.min_width = sizeHints.max_width = backend_insideWidth;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
735 sizeHints.min_height = sizeHints.max_height = backend_insideHeight;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
736 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
737 sizeHints.x = cast(int)x;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
738 sizeHints.y = cast(int)y;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
739 sizeHints.width = backend_insideWidth;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
740 sizeHints.height = backend_insideHeight;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
741 XSetWMNormalHints(display, _handle, sizeHints);
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_update_MOTIF_WM_HINTS() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
744 int[4] mwmHints;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
745 mwmHints[0] = 1 << 1; // flags
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
746 mwmHints[2] = borderStyle == WindowBorderStyle.None ? 0 : 1; // decor
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
747 XChangeProperty(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
748 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
749 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
750 void backend_update_NET_WM_WINDOW_TYPE() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
751 XAtom[] atoms;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
752 // with Metacity, the decor is not being repainted from normal>dialog
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
753 // because they are the same size
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
754 if(borderStyle == WindowBorderStyle.Dialog)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
755 atoms = [XA._NET_WM_WINDOW_TYPE_DIALOG];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
756 else if(borderStyle == WindowBorderStyle.Tool)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
757 atoms = [XA._NET_WM_WINDOW_TYPE_UTILITY];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
758 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
759 atoms = [XA._NET_WM_WINDOW_TYPE_NORMAL];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
760 XChangeProperty(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
761 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
762 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
763 // returns what width the x window should be...not including borders
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
764 int backend_insideWidth() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
765 return cast(int)(size.width-borderSize.left-borderSize.right);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
766 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
767 // returns what height the x window should be...not including borders
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
768 int backend_insideHeight() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
769 return cast(int)(size.height-borderSize.top-borderSize.bottom);
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 // 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
772 void backend_locationSizeToNative() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
773 Point pt = _location;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
774 if(!isTopLevelReparented(_handle)) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
775 pt.x = pt.x + _borderSize.left;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
776 pt.y = pt.y + _borderSize.top;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
777 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
778 XMoveResizeWindow(display, _handle, cast(int)pt.x, cast(int)pt.y,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
779 backend_insideWidth, backend_insideHeight);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
780 // XMoveWindow:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
781 // Under Metacity, sets the location of the WM's frame.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
782 // Under Compiz, sets the location of the window.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
783 // XResizeWindow:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
784 // Under Metacity and Compiz, sets the size of the window not
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
785 // including the WM's frame.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
786 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
787 // 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
788 void backend_nativeToLocationSize() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
789 XWindow root, parent;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
790 XWindow* children;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
791 uint numChildren;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
792 XQueryTree(display, _handle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
793 &root, &parent, &children, &numChildren);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
794 XFree(children);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
795
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
796 int x, y;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
797 XWindow child;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
798 XTranslateCoordinates(display, _handle, root, 0, 0, &x, &y, &child);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
799 _location.x = x - _borderSize.left;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
800 _location.y = y - _borderSize.top;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
801 scope args = new EventArgs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
802 moved(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
803 XWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
804 XGetWindowAttributes(display, _handle, &attribs);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
805 _size.width = attribs.width+_borderSize.left+_borderSize.right;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
806 _size.height = attribs.height+_borderSize.top+_borderSize.bottom;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
807 resized(args);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
808
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
809 //content._location = Point(_borderSize.Left, _borderSize.Top);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
810 //content._size = Size(attribs.width, attribs.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
811 //Stdout.format("location updated to {}", _location).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
812 //Stdout.format("size updated to {}", _size).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
813 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
814 void backend_nativeToBorderSize() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
815 _borderSize = backend_getBorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
816 //Stdout("borderSize updated to ", _borderSize).newline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
817 backend_nativeToLocationSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
818 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
819 BorderSize backend_getBorderSize() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
820 if(!isWMPropertySupported(XA._NET_FRAME_EXTENTS) ||
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
821 borderStyle == WindowBorderStyle.None)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
822 return BorderSize();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
823 // create handle if necessary
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
824 auto reqHandle = handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
825 bool requested = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
826
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
827 //{{{ requestExtents()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
828 void requestExtents() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
829 if(isWMPropertySupported(XA._NET_REQUEST_FRAME_EXTENTS)) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
830 XEvent ev;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
831 ev.xclient.type = ClientMessage;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
832 ev.xclient.window = handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
833 ev.xclient.message_type = XA._NET_REQUEST_FRAME_EXTENTS;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
834 ev.xclient.format = 8;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
835 XSendEvent(display, root, false,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
836 SubstructureNotifyMask | SubstructureRedirectMask, &ev);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
837 } else { // compiz and beryl do not yet support requesting
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
838 XSetWindowAttributes attribs;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
839 reqHandle = XCreateWindow(display,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
840 root, 0, 0, 1, 1,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
841 0, CopyFromParent, InputOnly, null, 0, &attribs);
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 XWMHints* hints = XAllocWMHints();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
844 scope(exit) XFree(hints);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
845 hints.flags = InputHint;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
846 hints.input = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
847 XSetWMHints(display, reqHandle, hints);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
848
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
849 auto mainHandle = _handle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
850 _handle = reqHandle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
851 backend_updateWM_NORMAL_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
852 backend_update_NET_WM_WINDOW_TYPE();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
853 backend_update_MOTIF_WM_HINTS();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
854 backend_visible = true;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
855 backend_visible = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
856 _handle = mainHandle;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
857 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
858 requested = true;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
859 }
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
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
862 if(!mapped)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
863 requestExtents();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
864 int* extents;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
865 while(true) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
866 XSync(display, false);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
867 extents = cast(int*)getXWindowProperty(display, reqHandle,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
868 XA._NET_FRAME_EXTENTS);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
869 if(extents !is null)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
870 break;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
871 if(!requested)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
872 requestExtents();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
873 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
874 scope(exit) XFree(extents);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
875 if(reqHandle != _handle)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
876 XDestroyWindow(display, reqHandle);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
877 return BorderSize(extents[0], extents[2], extents[1], extents[3]);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
878 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
879 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
880 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
881