diff --git a/0001-fix-connect-Fix-some-possible-crash-problems-caused-.patch b/0001-fix-connect-Fix-some-possible-crash-problems-caused-.patch new file mode 100644 index 0000000..93de67b --- /dev/null +++ b/0001-fix-connect-Fix-some-possible-crash-problems-caused-.patch @@ -0,0 +1,204 @@ +From ee1e902961b07f16b22916338bc37b98ba9d9060 Mon Sep 17 00:00:00 2001 +From: tangjie02 +Date: Tue, 9 Aug 2022 09:41:35 +0800 +Subject: [PATCH 1/2] fix(connect): Fix some possible crash problems caused by + sigc::slot. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修复一些可能存在的崩溃问题,这些崩溃问题是因为槽函数绑定的对象已经被释放导致 + +Signed-off-by: tangjie02 +--- + src/menu/menu-app-item.cpp | 52 ++++++++++++++++++++------------ + src/menu/menu-app-item.h | 5 +++ + src/menu/menu-applet-window.cpp | 3 +- + src/menu/menu-apps-container.cpp | 12 ++------ + src/menu/menu-apps-container.h | 7 ----- + 5 files changed, 40 insertions(+), 39 deletions(-) + +diff --git a/src/menu/menu-app-item.cpp b/src/menu/menu-app-item.cpp +index fba3994..fa672c2 100644 +--- a/src/menu/menu-app-item.cpp ++++ b/src/menu/menu-app-item.cpp +@@ -68,11 +68,7 @@ void MenuAppItem::init_drag_and_drop() + targets.push_back(target); + drag_source_set(targets, Gdk::BUTTON1_MASK, Gdk::ACTION_COPY); + +- signal_drag_failed().connect( +- [this](const Glib::RefPtr &context, Gtk::DragResult result) -> bool { +- KLOG_DEBUG("drag failed, result %d\n", (int)result); +- return true; +- }); ++ signal_drag_failed().connect(sigc::mem_fun(*this, &MenuAppItem::on_drag_failed)); + } + + bool MenuAppItem::on_button_press_event(GdkEventButton *button_event) +@@ -131,14 +127,22 @@ void MenuAppItem::on_drag_end(const Glib::RefPtr &context) + // 如果拖拽被取消,拖拽的ungrab操作可能在drag-end信号之后,所以这里的grab操作放入到后面的事件循环处理。 + if (this->idle_drag_connection_.empty()) + { +- this->idle_drag_connection_ = Glib::signal_idle().connect([this]() -> bool { +- Gtk::Container *toplevel = this->get_toplevel(); +- KiranHelper::grab_input(*toplevel); +- return false; +- }); ++ this->idle_drag_connection_ = Glib::signal_idle().connect( ++ [this]() -> bool ++ { ++ Gtk::Container *toplevel = this->get_toplevel(); ++ KiranHelper::grab_input(*toplevel); ++ return false; ++ }); + } + } + ++bool MenuAppItem::on_drag_failed(const Glib::RefPtr &context, Gtk::DragResult result) ++{ ++ KLOG_DEBUG("drag failed, result %d\n", (int)result); ++ return true; ++} ++ + bool MenuAppItem::on_key_press_event(GdkEventKey *key_event) + { + if (key_event->keyval == GDK_KEY_Menu) +@@ -181,20 +185,12 @@ void MenuAppItem::create_context_menu() + if (!is_in_favorite()) + { + item = Gtk::make_managed(_("Add to favorites")); +- item->signal_activate().connect( +- [this]() -> void { +- if (!app.expired()) +- Kiran::MenuSkeleton::get_instance()->add_favorite_app(app.lock()->get_desktop_id()); +- }); ++ item->signal_activate().connect(sigc::mem_fun(*this, &MenuAppItem::on_add_favorite_app)); + } + else + { + item = Gtk::make_managed(_("Remove from favorites")); +- item->signal_activate().connect( +- [this]() -> void { +- if (!app.expired()) +- Kiran::MenuSkeleton::get_instance()->del_favorite_app(app.lock()->get_desktop_id()); +- }); ++ item->signal_activate().connect(sigc::mem_fun(*this, &MenuAppItem::on_del_favorite_app)); + } + context_menu.append(*item); + +@@ -345,3 +341,19 @@ void MenuAppItem::launch_app() + signal_launched().emit(); + app.lock()->launch(); + } ++ ++void MenuAppItem::on_add_favorite_app() ++{ ++ if (!this->app.expired()) ++ { ++ Kiran::MenuSkeleton::get_instance()->add_favorite_app(app.lock()->get_desktop_id()); ++ } ++} ++ ++void MenuAppItem::on_del_favorite_app() ++{ ++ if (!app.expired()) ++ { ++ Kiran::MenuSkeleton::get_instance()->del_favorite_app(app.lock()->get_desktop_id()); ++ } ++} +\ No newline at end of file +diff --git a/src/menu/menu-app-item.h b/src/menu/menu-app-item.h +index 39f3767..6caadd7 100644 +--- a/src/menu/menu-app-item.h ++++ b/src/menu/menu-app-item.h +@@ -37,6 +37,7 @@ protected: + virtual void on_drag_begin(const Glib::RefPtr &context) override; + virtual void on_drag_data_get(const Glib::RefPtr &context, Gtk::SelectionData &selection, guint info, guint timestamp) override; + virtual void on_drag_end(const Glib::RefPtr &context) override; ++ bool on_drag_failed(const Glib::RefPtr &context, Gtk::DragResult result); + + virtual void init_drag_and_drop(); + +@@ -46,6 +47,10 @@ protected: + void create_context_menu(); + bool add_app_to_desktop(); + ++private: ++ void on_add_favorite_app(); ++ void on_del_favorite_app(); ++ + private: + KiranOpacityMenu context_menu; + Gtk::MenuItem *items; +diff --git a/src/menu/menu-applet-window.cpp b/src/menu/menu-applet-window.cpp +index 941c2b8..eea61c9 100644 +--- a/src/menu/menu-applet-window.cpp ++++ b/src/menu/menu-applet-window.cpp +@@ -63,8 +63,7 @@ MenuAppletWindow::MenuAppletWindow(Gtk::WindowType window_type) : Glib::ObjectBa + /* 监控工作区域大小变化 */ + auto screen = get_screen(); + monitor = new WorkareaMonitor(screen); +- monitor->signal_size_changed().connect( +- sigc::mem_fun(*this, &MenuAppletWindow::on_workarea_size_changed)); ++ monitor->signal_size_changed().connect(sigc::mem_fun(*this, &MenuAppletWindow::on_workarea_size_changed)); + + //加载当前用户信息 + set_display_mode(profile.get_display_mode()); +diff --git a/src/menu/menu-apps-container.cpp b/src/menu/menu-apps-container.cpp +index 4930e46..b849397 100644 +--- a/src/menu/menu-apps-container.cpp ++++ b/src/menu/menu-apps-container.cpp +@@ -32,7 +32,8 @@ MenuAppsContainer::MenuAppsContainer(MenuAppsContainer::AppIconMode mode_, + apps_box.get_style_context()->add_class("menu-apps-box"); + + category_box.signal_clicked().connect_notify( +- [this]() -> void { ++ [this]() -> void ++ { + signal_category_clicked().emit(category_box.get_category_name()); + }); + +@@ -142,11 +143,6 @@ bool MenuAppsContainer::get_category_clickable() const + return category_box.get_clickable(); + } + +-sigc::signal MenuAppsContainer::signal_app_launched() +-{ +- return m_signal_app_launched; +-} +- + sigc::signal MenuAppsContainer::signal_category_clicked() + { + return m_signal_category_clicked; +@@ -157,10 +153,6 @@ MenuAppItem *MenuAppsContainer::create_app_item(std::shared_ptr app, + auto item = new MenuAppItem(app); + + item->set_orientation(orient); +- item->signal_launched().connect( +- [this]() -> void { +- signal_app_launched().emit(); +- }); + + return item; + } +diff --git a/src/menu/menu-apps-container.h b/src/menu/menu-apps-container.h +index d5bfcfe..85148e3 100644 +--- a/src/menu/menu-apps-container.h ++++ b/src/menu/menu-apps-container.h +@@ -83,13 +83,6 @@ public: + */ + virtual bool load_applications(const Kiran::AppVec &apps); + +- /** +- * @brief signal_app_launched 信号,容器内的应用按钮启动时触发 +- * +- * @return 返回应用启动信号 +- */ +- sigc::signal signal_app_launched(); +- + /** + * @brief siganl_category_clicked 信号,容器内的应用分类标签点击后触发 + */ +-- +2.33.0 + diff --git a/0002-fix-coredump-Fix-the-coredump-problem-caused-by-null.patch b/0002-fix-coredump-Fix-the-coredump-problem-caused-by-null.patch new file mode 100644 index 0000000..1a9d92e --- /dev/null +++ b/0002-fix-coredump-Fix-the-coredump-problem-caused-by-null.patch @@ -0,0 +1,33 @@ +From dc5e56b311f49532213a6a6445dc77e1f0cc4661 Mon Sep 17 00:00:00 2001 +From: tangjie02 +Date: Tue, 9 Aug 2022 10:49:36 +0800 +Subject: [PATCH 2/2] fix(coredump): Fix the coredump problem caused by + nullpointer to UserIcon. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修复由于访问用户图标对象为空导致的崩溃问题 + +Signed-off-by: tangjie02 +--- + src/menu/menu-avatar-widget.cpp | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/menu/menu-avatar-widget.cpp b/src/menu/menu-avatar-widget.cpp +index 194a55e..74f8c49 100644 +--- a/src/menu/menu-avatar-widget.cpp ++++ b/src/menu/menu-avatar-widget.cpp +@@ -82,7 +82,8 @@ bool MenuAvatarWidget::on_draw(const ::Cairo::RefPtr &cr) + auto radius = image_size / 2.0; + try + { +- pixbuf = Gdk::Pixbuf::create_from_file(user_info.get_iconfile(), ++ auto icon_file = user_info.get_iconfile(); ++ pixbuf = Gdk::Pixbuf::create_from_file(icon_file ? icon_file : std::string(), + allocation.get_width() * scale, + allocation.get_height() * scale); + } +-- +2.33.0 + diff --git a/kiran-menu.spec b/kiran-menu.spec index 0fd77f5..5adde44 100644 --- a/kiran-menu.spec +++ b/kiran-menu.spec @@ -1,15 +1,17 @@ Name: kiran-menu Version: 2.3.0 -Release: 5 +Release: 6 Summary: Applets for mate panel from Kiran Desktop -License: Mulan PSL v2 +License: MulanPSL-2.0 Source0: %{name}-%{version}.tar.gz Patch1000: 0001-fix-menu-Fix-the-switch-user-error-by-xdmcp-logging.patch Patch1001: 0001-fix-menu-Fix-the-problem-that-some-apps-are-show-rep.patch Patch1002: 0002-fix-tray-Fix-the-problem-that-fcitx-doesn-t-show-in-.patch Patch1003: 0001-fix-menu-fix-the-grab-problem-when-popup-menu-on-sea.patch +Patch1004: 0001-fix-connect-Fix-some-possible-crash-problems-caused-.patch +Patch1005: 0002-fix-coredump-Fix-the-coredump-problem-caused-by-null.patch BuildRequires: cmake > 3.0 @@ -89,6 +91,10 @@ gtk-update-icon-cache -f /usr/share/icons/hicolor/ %changelog +* Tue Aug 09 2022 tangjie02 - 2.3.0-6 +- KYOS-B: Fix the coredump problem caused by nullpointer to UserIcon. +- KYOS-B: Fix some possible crash problems caused by sigc::slot. + * Tue Aug 02 2022 tangjie02 - 2.3.0-5 - KYOS-B: fix the grab problem when popup menu on search entry or drag menu app icon.