/* FIXME : get focus window for keyboard from DSWindowManager/DSWindowPolicy later */
if (__keyboard)
{
- std::shared_ptr<DSWindow> focusWin = getTopWindow(__focusWin);
- DSLOG_INF("DSSeat", "keyboard focus : %p -> %p", __focusWin ? __focusWin.get() : nullptr, focusWin ? focusWin.get() : nullptr);
+ std::shared_ptr<DSWindow> focusWin = getTopWindow(nullptr);
+ DSWindow *currentWin = __focusWin ? __focusWin.get() : nullptr;
+ DSWindow *newWin = focusWin ? focusWin.get() : nullptr;
- if (focusWin)
- __keyboard->setFocus(focusWin);
+ if (currentWin != newWin)
+ {
+ DSLOG_INF("DSSeat", "keyboard focus : %p -> %p", currentWin, newWin);
+
+ if (focusWin)
+ {
+ if (__focusWin && __focusWin->hasFocus())
+ __focusWin->unsetFocus();
+
+ __focusWin = focusWin;
+ __keyboard->setFocus(focusWin);
+ focusWin->setFocus();
+ }
+ }
}
}
if (__keyboard)
{
std::shared_ptr<DSWindow> focusWin = getTopWindow(window);
- DSLOG_INF("DSSeat", "keyboard focus : %p -> %p", __focusWin ? __focusWin.get() : nullptr, focusWin ? focusWin.get() : nullptr);
+ DSWindow *currentWin = __focusWin ? __focusWin.get() : nullptr;
+ DSWindow *newWin = focusWin ? focusWin.get() : nullptr;
- if (focusWin)
- __keyboard->setFocus(focusWin);
+ if (currentWin != newWin)
+ {
+ DSLOG_INF("DSSeat", "keyboard focus : %p -> %p", currentWin, newWin);
+
+ if (focusWin)
+ {
+ if (__focusWin && __focusWin->hasFocus())
+ __focusWin->unsetFocus();
+
+ __focusWin = focusWin;
+ __keyboard->setFocus(focusWin);
+ focusWin->setFocus();
+ }
+ }
}
}
{
for (std::shared_ptr<DSWindow> w : __zone->getWindowList())
{
- if (w && w.get() == winExcl.get())
+ /* skip if w is not valid or has skip focus */
+ if (!w || w->getSkipFocus())
+ continue;
+ /* skip if w equals to winExcl */
+ if (winExcl && winExcl.get() == w.get())
continue;
/* We suppose that the window located at the top of the window stack is at the front of the list. */