DSSeat: renew focus on Window created/destroy handlers 27/242027/1
authorSung-Jin Park <sj76.park@samsung.com>
Fri, 21 Aug 2020 08:17:10 +0000 (17:17 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Fri, 21 Aug 2020 10:11:57 +0000 (19:11 +0900)
Change-Id: Ide2333d094cff0fd303fd4bedc5485070b07779e
Signed-off-by: Sung-Jin Park <sj76.park@samsung.com>
src/DSSeat/DSSeat.cpp

index 86d3cc7..8199ea2 100644 (file)
@@ -467,11 +467,24 @@ void DSSeat::__onWindowCreated(std::shared_ptr<DSWindow> window)
        /* 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();
+                       }
+               }
        }
 }
 
@@ -492,10 +505,23 @@ void DSSeat::__onWindowDestroy(std::shared_ptr<DSWindow> window)
        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();
+                       }
+               }
        }
 }
 
@@ -527,7 +553,11 @@ std::shared_ptr<DSWindow> DSSeat::getTopWindow(std::shared_ptr<DSWindow> winExcl
 {
        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. */