mirror of https://github.com/adamdruppe/arsd.git
wow bug on posixfdreader! and new notification area stuff
This commit is contained in:
parent
9ac9de2e74
commit
e04fc2a510
|
@ -2891,10 +2891,6 @@ struct EventLoopImpl {
|
||||||
// (if you want other fds, use arsd.eventloop and compile with -version=with_eventloop), it offers a fuller api for arbitrary stuff.
|
// (if you want other fds, use arsd.eventloop and compile with -version=with_eventloop), it offers a fuller api for arbitrary stuff.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(flags & ep.EPOLLIN) {
|
|
||||||
if(PosixFdReader* pfr = fd in PosixFdReader.mapping)
|
|
||||||
(*pfr).ready(flags);
|
|
||||||
}
|
|
||||||
/+
|
/+
|
||||||
} else {
|
} else {
|
||||||
// not interested in OUT, we are just reading here.
|
// not interested in OUT, we are just reading here.
|
||||||
|
@ -3023,6 +3019,10 @@ struct EventLoopImpl {
|
||||||
Provides an icon on the system notification area (also known as the system tray).
|
Provides an icon on the system notification area (also known as the system tray).
|
||||||
|
|
||||||
|
|
||||||
|
If a notification area is not available with the NotificationIcon object is created,
|
||||||
|
it will silently succeed and simply attempt to create one when an area becomes available.
|
||||||
|
|
||||||
|
|
||||||
NotificationAreaIcon on Windows assumes you are on Windows Vista or later.
|
NotificationAreaIcon on Windows assumes you are on Windows Vista or later.
|
||||||
If this is wrong, pass -version=WindowsXP to dmd when compiling and it will
|
If this is wrong, pass -version=WindowsXP to dmd when compiling and it will
|
||||||
use the older version.
|
use the older version.
|
||||||
|
@ -3187,16 +3187,40 @@ class NotificationAreaIcon : CapableOfHandlingNativeEvent {
|
||||||
XSendEvent(XDisplayConnection.get, to, false, EventMask.NoEventMask, &ev);
|
XSendEvent(XDisplayConnection.get, to, false, EventMask.NoEventMask, &ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static NotificationAreaIcon[] activeIcons;
|
||||||
|
|
||||||
|
// FIXME: possible leak with this stuff, should be able to clear it and stuff.
|
||||||
|
private void newManager() {
|
||||||
|
close();
|
||||||
|
createXWin();
|
||||||
|
|
||||||
|
if(this.clippixmap)
|
||||||
|
XFreePixmap(XDisplayConnection.get, clippixmap);
|
||||||
|
if(this.originalMemoryImage)
|
||||||
|
this.icon = this.originalMemoryImage;
|
||||||
|
else if(this.img)
|
||||||
|
this.icon = this.img;
|
||||||
|
}
|
||||||
|
|
||||||
private void createXWin () {
|
private void createXWin () {
|
||||||
// FIXME: check for MANAGER on root window to catch new/changed tray owners
|
|
||||||
auto trayOwner = getTrayOwner();
|
|
||||||
if(trayOwner == None)
|
|
||||||
throw new Exception("No notification area found");
|
|
||||||
|
|
||||||
|
|
||||||
// create window
|
// create window
|
||||||
auto display = XDisplayConnection.get;
|
auto display = XDisplayConnection.get;
|
||||||
|
|
||||||
|
// to check for MANAGER on root window to catch new/changed tray owners
|
||||||
|
XDisplayConnection.addRootInput(EventMask.StructureNotifyMask);
|
||||||
|
// so if a thing does appear, we can handle it
|
||||||
|
foreach(ai; activeIcons)
|
||||||
|
if(ai is this)
|
||||||
|
goto alreadythere;
|
||||||
|
activeIcons ~= this;
|
||||||
|
alreadythere:
|
||||||
|
|
||||||
|
// and check for an existing tray
|
||||||
|
auto trayOwner = getTrayOwner();
|
||||||
|
if(trayOwner == None)
|
||||||
|
return;
|
||||||
|
//throw new Exception("No notification area found");
|
||||||
|
|
||||||
Visual* v = cast(Visual*) CopyFromParent;
|
Visual* v = cast(Visual*) CopyFromParent;
|
||||||
/+
|
/+
|
||||||
auto visualProp = getX11PropertyData(trayOwner, GetAtom!("_NET_SYSTEM_TRAY_VISUAL", true)(display));
|
auto visualProp = getX11PropertyData(trayOwner, GetAtom!("_NET_SYSTEM_TRAY_VISUAL", true)(display));
|
||||||
|
@ -3545,9 +3569,12 @@ class NotificationAreaIcon : CapableOfHandlingNativeEvent {
|
||||||
return name_;
|
return name_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private MemoryImage originalMemoryImage;
|
||||||
|
|
||||||
///
|
///
|
||||||
@property void icon(MemoryImage i) {
|
@property void icon(MemoryImage i) {
|
||||||
version(X11) {
|
version(X11) {
|
||||||
|
this.originalMemoryImage = i;
|
||||||
if (!active) return;
|
if (!active) return;
|
||||||
if (i !is null) {
|
if (i !is null) {
|
||||||
this.img = Image.fromMemoryImage(i);
|
this.img = Image.fromMemoryImage(i);
|
||||||
|
@ -3578,6 +3605,7 @@ class NotificationAreaIcon : CapableOfHandlingNativeEvent {
|
||||||
version(X11) {
|
version(X11) {
|
||||||
if (!active) return;
|
if (!active) return;
|
||||||
if (i !is img) {
|
if (i !is img) {
|
||||||
|
originalMemoryImage = null;
|
||||||
img = i;
|
img = i;
|
||||||
redraw();
|
redraw();
|
||||||
}
|
}
|
||||||
|
@ -4589,7 +4617,7 @@ version(X11) {
|
||||||
auto dpy = XDisplayConnection.get;
|
auto dpy = XDisplayConnection.get;
|
||||||
auto root = RootWindow(dpy, DefaultScreen(dpy));
|
auto root = RootWindow(dpy, DefaultScreen(dpy));
|
||||||
CapableOfHandlingNativeEvent.nativeHandleMapping[root] = this;
|
CapableOfHandlingNativeEvent.nativeHandleMapping[root] = this;
|
||||||
XSelectInput(dpy, root, EventMask.KeyPressMask);
|
XDisplayConnection.addRootInput(EventMask.KeyPressMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Register new global hotkey with initialized `GlobalHotkey` object.
|
/// Register new global hotkey with initialized `GlobalHotkey` object.
|
||||||
|
@ -8794,6 +8822,24 @@ version(X11) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private __gshared EventMask rootEventMask;
|
||||||
|
|
||||||
|
/++
|
||||||
|
Requests the specified input from the root window on the connection, in addition to any other request.
|
||||||
|
|
||||||
|
|
||||||
|
Since plain XSelectInput will replace the existing mask, adding input from multiple locations is tricky. This central function will combine all the masks for you.
|
||||||
|
|
||||||
|
$(WARNING it calls XSelectInput itself, which will override any other root window input you have!)
|
||||||
|
+/
|
||||||
|
static void addRootInput(EventMask mask) {
|
||||||
|
auto old = rootEventMask;
|
||||||
|
rootEventMask |= mask;
|
||||||
|
get(); // to ensure display connected
|
||||||
|
if(display !is null && rootEventMask != old)
|
||||||
|
XSelectInput(display, RootWindow(display, DefaultScreen(display)), rootEventMask);
|
||||||
|
}
|
||||||
|
|
||||||
static void discardState() {
|
static void discardState() {
|
||||||
freeImages();
|
freeImages();
|
||||||
|
|
||||||
|
@ -9464,7 +9510,6 @@ version(X11) {
|
||||||
XSetWMProtocols(display, window, &atom, 1);
|
XSetWMProtocols(display, window, &atom, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// FIXME: windowType and customizationFlags
|
// FIXME: windowType and customizationFlags
|
||||||
Atom[8] wsatoms; // here, due to goto
|
Atom[8] wsatoms; // here, due to goto
|
||||||
int wmsacount = 0; // here, due to goto
|
int wmsacount = 0; // here, due to goto
|
||||||
|
@ -9685,6 +9730,7 @@ version(X11) {
|
||||||
writeln("event for: ", e.xany.window, "; type is ", to!string(cast(EventType)e.type));
|
writeln("event for: ", e.xany.window, "; type is ", to!string(cast(EventType)e.type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// filter out compose events
|
// filter out compose events
|
||||||
if (XFilterEvent(&e, None)) {
|
if (XFilterEvent(&e, None)) {
|
||||||
//{ import core.stdc.stdio : printf; printf("XFilterEvent filtered!\n"); }
|
//{ import core.stdc.stdio : printf; printf("XFilterEvent filtered!\n"); }
|
||||||
|
@ -9978,6 +10024,9 @@ version(X11) {
|
||||||
scope(exit) XLockDisplay(display);
|
scope(exit) XLockDisplay(display);
|
||||||
if ((*win).closeQuery !is null) (*win).closeQuery(); else (*win).close();
|
if ((*win).closeQuery !is null) (*win).closeQuery(); else (*win).close();
|
||||||
}
|
}
|
||||||
|
} else if(e.xclient.message_type == GetAtom!"MANAGER"(e.xany.display)) {
|
||||||
|
foreach(nai; NotificationAreaIcon.activeIcons)
|
||||||
|
nai.newManager();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EventType.MapNotify:
|
case EventType.MapNotify:
|
||||||
|
|
Loading…
Reference in New Issue