mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2024-10-01 01:26:01 -04:00
Auto-Type: Allow selection of modal dialogs on X11
* Fix #5958 - Modal dialogs do not have WM_STATE set even though they are a valid top-level window with a valid name. In this case, we need to poll for WM_TRANSIENT_FOR which returns the top level window the dialog is a child of.
This commit is contained in:
parent
57af7c131d
commit
bc08913c61
@ -30,6 +30,8 @@ AutoTypePlatformX11::AutoTypePlatformX11()
|
||||
m_atomString = XInternAtom(m_dpy, "STRING", True);
|
||||
m_atomUtf8String = XInternAtom(m_dpy, "UTF8_STRING", True);
|
||||
m_atomNetActiveWindow = XInternAtom(m_dpy, "_NET_ACTIVE_WINDOW", True);
|
||||
m_atomTransientFor = XInternAtom(m_dpy, "WM_TRANSIENT_FOR", True);
|
||||
m_atomWindow = XInternAtom(m_dpy, "WINDOW", True);
|
||||
|
||||
m_classBlacklist << "desktop_window"
|
||||
<< "gnome-panel"; // Gnome
|
||||
@ -262,23 +264,31 @@ QStringList AutoTypePlatformX11::windowTitlesRecursive(Window window)
|
||||
|
||||
bool AutoTypePlatformX11::isTopLevelWindow(Window window)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
Atom type = None;
|
||||
int format;
|
||||
unsigned long nitems;
|
||||
unsigned long after;
|
||||
unsigned char* data = Q_NULLPTR;
|
||||
unsigned char* data = nullptr;
|
||||
|
||||
// Check if the window has WM_STATE atom and it is not Withdrawn
|
||||
int retVal = XGetWindowProperty(
|
||||
m_dpy, window, m_atomWmState, 0, 2, False, m_atomWmState, &type, &format, &nitems, &after, &data);
|
||||
|
||||
bool result = false;
|
||||
|
||||
if (retVal == 0 && data) {
|
||||
if (type == m_atomWmState && format == 32 && nitems > 0) {
|
||||
qint32 state = static_cast<qint32>(*data);
|
||||
result = (state != WithdrawnState);
|
||||
result = (static_cast<quint32>(*data) != WithdrawnState);
|
||||
}
|
||||
|
||||
XFree(data);
|
||||
} else {
|
||||
// See if this is a transient window without WM_STATE
|
||||
retVal = XGetWindowProperty(
|
||||
m_dpy, window, m_atomTransientFor, 0, 1, False, m_atomWindow, &type, &format, &nitems, &after, &data);
|
||||
if (retVal == 0 && data) {
|
||||
result = true;
|
||||
XFree(data);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
@ -68,7 +68,6 @@ private:
|
||||
void updateKeymap();
|
||||
bool isRemapKeycodeValid();
|
||||
int AddKeysym(KeySym keysym);
|
||||
void AddModifier(KeySym keysym);
|
||||
void SendKeyEvent(unsigned keycode, bool press);
|
||||
void SendModifiers(unsigned int mask, bool press);
|
||||
int GetKeycode(KeySym keysym, unsigned int* mask);
|
||||
@ -84,6 +83,8 @@ private:
|
||||
Atom m_atomString;
|
||||
Atom m_atomUtf8String;
|
||||
Atom m_atomNetActiveWindow;
|
||||
Atom m_atomTransientFor;
|
||||
Atom m_atomWindow;
|
||||
QSet<QString> m_classBlacklist;
|
||||
|
||||
XkbDescPtr m_xkb;
|
||||
|
Loading…
Reference in New Issue
Block a user