[WRTjs][VD] Add PopupFocusOutCb when popup lost focus 22/321122/3
authorChunling <chunling.ye@samsung.com>
Fri, 14 Mar 2025 05:35:47 +0000 (13:35 +0800)
committerBot Blink <blinkbot@samsung.com>
Tue, 25 Mar 2025 13:35:01 +0000 (13:35 +0000)
Fix popup still show issue when poup lost focus and focus change to
app. Add PopupFocusOutCb, in this case, hide popup like press the
popup button1.

Change-Id: I4d48f366c2e59eba54523e53d0cb61d112c944b6
Signed-off-by: Chunling <chunling.ye@samsung.com>
wrt/src/browser/tv/popup_tv.cc
wrt/src/browser/tv/popup_tv.h

index 5865ab4cc7393d2f1ef68f068d2623a238a522c8..383400fe7410ef05d1fa22704f87d74f756e0580 100644 (file)
@@ -17,6 +17,7 @@
 #include "wrt/src/browser/tv/popup_tv.h"
 
 #include <aul.h>
+#include <aul_window.h>
 
 #include "base/files/file_path.h"
 #include "base/path_service.h"
@@ -206,6 +207,31 @@ void PopupTV::HideVoiceRecognitionToast() {
   }
 }
 
+// static
+void PopupTV::PopupFocusOutCb(void* data, Evas_Object* obj, void* event_info) {
+  int self_pid = getpid();
+  int focus_pid = 0;
+  int ret = aul_window_get_focused_pid(&focus_pid);
+  if (0 != ret) {
+    LOG(ERROR) << " aul_window_get_focused_pid fail, ret = " << ret;
+    return;
+  }
+  LOG(INFO) << "self_pid is " << self_pid << ", focus_pid is " << focus_pid;
+
+  if (self_pid != focus_pid)
+    return;
+
+  for (auto iterator = opened_popups_.begin(); iterator != opened_popups_.end();
+       ++iterator) {
+    if (iterator->get() == data) {
+      PopupTV* popup = static_cast<PopupTV*>(data);
+      elm_object_signal_emit(popup->button1_, "elm,action,click", "elm");
+      return;
+    }
+  }
+  LOG(ERROR) << "Fail to get Popup instance";
+}
+
 // static
 std::unique_ptr<PopupTV> PopupTV::GetPopupById(int id) {
   LOG(INFO) << "get popup id: " << id;
@@ -223,11 +249,13 @@ std::unique_ptr<PopupTV> PopupTV::GetPopupById(int id) {
 
 PopupTV::PopupTV(Evas_Object* popup, Evas_Object* box, Evas_Object* window)
     : Popup(popup, box), window_(window) {
+  LOG(INFO) << "PopupTV!";
   auto main_native_window = WRTNativeWindow::GetMainNativeWindow();
   if (main_native_window)
     main_native_window->AddObserver(this);
-
   popup_id_ = ++popup_id_counter;
+  evas_object_smart_callback_add(popup, "unfocused", PopupTV::PopupFocusOutCb,
+                                 this);
 }
 
 PopupTV::~PopupTV() {
index ce8363b58f4a3e3a921809b491ffbff54bdaebd6..f3266b78cdd5e198dc5252a7fe499c55e246d763 100644 (file)
@@ -34,6 +34,7 @@ class PopupTV : public Popup, public electron::NativeWindowObserver {
   static std::unique_ptr<PopupTV> GetPopupById(int id);
   static void ShowVoiceRecognitionToast(const std::string& app_title);
   static void HideVoiceRecognitionToast();
+  static void PopupFocusOutCb(void* data, Evas_Object* obj, void* event_info);
 
   // Popup
   void SetButtonType(ButtonType type) override;