mirror of
https://github.com/moparisthebest/FireTray
synced 2024-12-22 13:58:48 -05:00
successful interception of _NET_WM_STATE_HIDDEN
for minimize event interception (WORK IN PROGRESS)
This commit is contained in:
parent
f260c6bd0a
commit
0ade38b267
@ -273,12 +273,11 @@ firetray.IconLinux = {
|
||||
let actual_format = new ctypes.int;
|
||||
let nitems = new ctypes.unsigned_long;
|
||||
let bytes_after = new ctypes.unsigned_long;
|
||||
let prop_value = new x11.xpropArray_t;
|
||||
let prop_value = new ctypes.unsigned_char.ptr;
|
||||
|
||||
// look for _NET_WM_STATE_HIDDEN (408)
|
||||
let bufSize = ctypes.long(XPROP_MAX_COUNT*XPROP_BASE_TYPE_LONG_PROPORTION*XPROP_BASE_TYPE.size); // cast not necessary
|
||||
let offset = ctypes.long(0);
|
||||
let res = x11.XGetWindowProperty( // FIXME: needs to be XFree'd
|
||||
let bufSize = XATOMS_EWMH_WM_STATES.length*ctypes.unsigned_long.size;
|
||||
let offset = 0;
|
||||
let res = x11.XGetWindowProperty(
|
||||
x11.current.Display, xwin, prop, offset, bufSize, 0, x11.AnyPropertyType,
|
||||
actual_type.address(), actual_format.address(), nitems.address(), bytes_after.address(), prop_value.address());
|
||||
LOG("XGetWindowProperty res="+res+", actual_type="+actual_type.value+", actual_format="+actual_format.value+", bytes_after="+bytes_after.value+", nitems="+nitems.value);
|
||||
@ -293,26 +292,23 @@ firetray.IconLinux = {
|
||||
}
|
||||
|
||||
LOG("prop_value="+prop_value+", size="+prop_value.constructor.size);
|
||||
// LOG("prop_value.str="+prop_value.readString());
|
||||
/* If the returned format is 32, the property data will be stored as an
|
||||
array of longs (which in a 64-bit application will be 64-bit values
|
||||
that are padded in the upper 4 bytes). [man XGetWindowProperty] */
|
||||
if (actual_format.value == 32) {
|
||||
var props = ctypes.cast(prop_value, ctypes.unsigned_long.array(nitems.value));
|
||||
if (actual_format.value === 32) {
|
||||
LOG("format OK");
|
||||
var props = ctypes.cast(prop_value, ctypes.unsigned_long.array(nitems.value).ptr);
|
||||
} else
|
||||
ERROR("unsupported format: "+actual_format.value);
|
||||
LOG("props="+props+", size="+props.constructor.size);
|
||||
LOG("props.length="+props.length);
|
||||
// LOG("props.source="+props[0].toSource());
|
||||
// LOG("props.hi="+ctypes.UInt64.hi(props[0]));
|
||||
// LOG("props.lo="+ctypes.UInt64.lo(props[0]));
|
||||
|
||||
// for (let i=0; i<nitems.value; ++i) {
|
||||
// // LOG(props[i]);
|
||||
// // let p = props[i];
|
||||
// // let p_ulong = ctypes.cast(p, ctypes.unsigned_long);
|
||||
// // LOG(p_ulong);
|
||||
// }
|
||||
for (let i=0; i<nitems.value; ++i) {
|
||||
LOG(props.contents[i]);
|
||||
if (strEquals(props.contents[i], x11.current.Atoms._NET_WM_STATE_HIDDEN))
|
||||
LOG("window hidden");
|
||||
}
|
||||
|
||||
x11.XFree(prop_value);
|
||||
|
||||
break;
|
||||
|
||||
@ -320,10 +316,10 @@ firetray.IconLinux = {
|
||||
LOG("ClientMessage");
|
||||
let xclient = ctypes.cast(xev, x11.XClientMessageEvent.ptr);
|
||||
LOG("xclient.contents.data="+xclient.contents.data);
|
||||
if (strEquals(xclient.contents.data[0], x11.current.Atoms.WM_DELETE_WINDOW)) {
|
||||
LOG("Delete Window prevented");
|
||||
return gdk.GDK_FILTER_REMOVE;
|
||||
}
|
||||
// if (strEquals(xclient.contents.data[0], x11.current.Atoms.WM_DELETE_WINDOW)) {
|
||||
// LOG("Delete Window prevented");
|
||||
// return gdk.GDK_FILTER_REMOVE;
|
||||
// }
|
||||
LOG("xclient.contents.send_event="+xclient.contents.send_event);
|
||||
if (strEquals(xclient.contents.send_event, x11.current.Atoms.WM_CHANGE_STATE))
|
||||
LOG("FOUDIL");
|
||||
|
@ -35,12 +35,6 @@ const XATOMS_EWMH_WM_STATES = [
|
||||
];
|
||||
const XATOMS = XATOMS_ICCCM.concat(XATOMS_EWMH_WM_STATES).concat(XATOMS_EWMH_GENERAL);
|
||||
|
||||
/* needed for XGetWindowProperty: we need to use a fixed sized array for ctypes
|
||||
casting */
|
||||
const XPROP_MAX_COUNT = XATOMS_EWMH_WM_STATES.length;
|
||||
const XPROP_BASE_TYPE = ctypes.unsigned_char;
|
||||
const XPROP_BASE_TYPE_LONG_PROPORTION = ctypes.unsigned_long.size / XPROP_BASE_TYPE.size;
|
||||
|
||||
|
||||
function x11_defines(lib) {
|
||||
/* fundamental types need to be guessed :-( */
|
||||
@ -114,15 +108,9 @@ function x11_defines(lib) {
|
||||
{ "state": ctypes.int } /* NewValue or Deleted */
|
||||
]);
|
||||
|
||||
// custom type needed for XGetWindowProperty
|
||||
this.xpropArray_t = XPROP_BASE_TYPE.array(XPROP_MAX_COUNT*XPROP_BASE_TYPE_LONG_PROPORTION);
|
||||
|
||||
lib.lazy_bind("XFree", ctypes.int, ctypes.void_t.ptr);
|
||||
lib.lazy_bind("XInternAtom", this.Atom, this.Display.ptr, ctypes.char.ptr, this.Bool); // only_if_exsits
|
||||
// int XGetWindowProperty(
|
||||
// Display *display, Window w, Atom property, long long_offset, long long_length, Bool delete, Atom req_type,
|
||||
// Atom *actual_type_return, int *actual_format_return, unsigned long *nitems_return, unsigned long *bytes_after_return, unsigned char **prop_return);
|
||||
lib.lazy_bind("XGetWindowProperty", ctypes.int, this.Display.ptr, this.Window, this.Atom, ctypes.long, ctypes.long, this.Bool, this.Atom, this.Atom.ptr, ctypes.int.ptr, ctypes.unsigned_long.ptr, ctypes.unsigned_long.ptr, XPROP_BASE_TYPE.array(XPROP_MAX_COUNT*XPROP_BASE_TYPE_LONG_PROPORTION).ptr);
|
||||
lib.lazy_bind("XGetWindowProperty", ctypes.int, this.Display.ptr, this.Window, this.Atom, ctypes.long, ctypes.long, this.Bool, this.Atom, this.Atom.ptr, ctypes.int.ptr, ctypes.unsigned_long.ptr, ctypes.unsigned_long.ptr, ctypes.unsigned_char.ptr.ptr);
|
||||
lib.lazy_bind("XChangeProperty", ctypes.int, this.Display.ptr, this.Window, this.Atom, this.Atom, ctypes.int, ctypes.int, ctypes.unsigned_char.ptr, ctypes.int);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user