diff --git a/.gitignore b/.gitignore
index fa8f71b51ae3c0c2420f264609d9a800a577fea0..67c248ee9d0fb15e118ace7cf53072910116a9da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,6 @@ debian/*.debhelper.log
debian/gxde-terminal/
/gxde-terminal
*.gmo
+
+# IDE
+.cache/*
diff --git a/debian/control b/debian/control
index 6fc82cae4d4bee7699a0695b57a450c07ef31793..fb14c1e061a6666200b1e61771ae833eb3747f1e 100644
--- a/debian/control
+++ b/debian/control
@@ -35,7 +35,6 @@ Architecture: any
Depends:
${shlibs:Depends},
${misc:Depends},
- deepin-menu | dde-launchpad,
expect,
lrzsz,
zssh
diff --git a/image/menu/dark/check_disabled.png b/image/menu/dark/check_disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..574f9fbbc8fe54201d44ca2c0f4112ca9c2b14f5
Binary files /dev/null and b/image/menu/dark/check_disabled.png differ
diff --git a/image/menu/dark/check_normal.png b/image/menu/dark/check_normal.png
new file mode 100644
index 0000000000000000000000000000000000000000..5025dee090d5d6b10fabf5d9c299ca2e79de2607
Binary files /dev/null and b/image/menu/dark/check_normal.png differ
diff --git a/image/menu/dark/check_selected.png b/image/menu/dark/check_selected.png
new file mode 100644
index 0000000000000000000000000000000000000000..42945bdf3ec8856c693e40cb288ae82c76b74e3f
Binary files /dev/null and b/image/menu/dark/check_selected.png differ
diff --git a/image/menu/light/arrow-right_disabled.svg b/image/menu/light/arrow-right_disabled.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ce9ec2fefea6556f3c11349110354e4ee2cf253f
--- /dev/null
+++ b/image/menu/light/arrow-right_disabled.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/image/menu/light/arrow-right_normal.svg b/image/menu/light/arrow-right_normal.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ce9ec2fefea6556f3c11349110354e4ee2cf253f
--- /dev/null
+++ b/image/menu/light/arrow-right_normal.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/image/menu/light/arrow-right_selected.svg b/image/menu/light/arrow-right_selected.svg
new file mode 100644
index 0000000000000000000000000000000000000000..20e48cf149cdc93d2122ce0cb3905567c17f0463
--- /dev/null
+++ b/image/menu/light/arrow-right_selected.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/image/menu/light/check_disabled.svg b/image/menu/light/check_disabled.svg
new file mode 100644
index 0000000000000000000000000000000000000000..754da569d33826807b1fd2d7c6e948e872ba2006
--- /dev/null
+++ b/image/menu/light/check_disabled.svg
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/image/menu/light/check_normal.svg b/image/menu/light/check_normal.svg
new file mode 100644
index 0000000000000000000000000000000000000000..854a7d2310503bd7b701e99a0d730b3f98c6066c
--- /dev/null
+++ b/image/menu/light/check_normal.svg
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/image/menu/light/check_selected.svg b/image/menu/light/check_selected.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0974bab2cec148bd95bd4302fd5517c6b857acc6
--- /dev/null
+++ b/image/menu/light/check_selected.svg
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/lib/config.vala b/lib/config.vala
index 5ed1c425b4177008c2660b00b7015dac41879290..72f5a0f66048da10a910b17661ff93bde15cd421 100644
--- a/lib/config.vala
+++ b/lib/config.vala
@@ -142,7 +142,6 @@ namespace Config {
config_file.set_boolean("advanced", "audible_bell", false);
config_file.set_boolean("advanced", "always_hide_resize_grip", false);
config_file.set_boolean("advanced", "allow_hyperlink", false);
- config_file.set_boolean("advanced", "prefer_deepin_menu", true);
config_file.set_string("advanced", "background_image", "");
@@ -343,7 +342,6 @@ namespace Config {
check_boolean("advanced", "audible_bell", false);
check_boolean("advanced", "always_hide_resize_grip", false);
check_boolean("advanced", "allow_hyperlink", false);
- check_boolean("advanced", "prefer_deepin_menu", true);
check_boolean("advanced", "scroll_on_key", true);
check_boolean("advanced", "scroll_on_output", false);
diff --git a/lib/menu.vala b/lib/menu.vala
index 4ad851836fc0f9f3b917e5a26d4006d9e27f3fd4..49ff7e0519d7f1b3f6fba1817df816f03b6af165 100644
--- a/lib/menu.vala
+++ b/lib/menu.vala
@@ -24,18 +24,10 @@
using Gtk;
namespace Menu {
- [DBus (name = "com.deepin.menu.Manager")]
- interface MenuManagerInterface : Object {
- public abstract string RegisterMenu() throws Error;
- public abstract void UnregisterMenu(string object_path) throws Error;
- }
-
- [DBus (name = "com.deepin.menu.Menu")]
- interface MenuInterface : Object {
- public abstract void ShowMenu(string menu_json_content) throws Error;
- public signal void ItemInvoked(string item_id, bool checked);
- public signal void MenuUnregistered();
- }
+ [CCode (cheader_filename = "wayland_blur.h", cname = "gxde_set_blur_region")]
+ private extern void wayland_set_blur_region (Gdk.Window window, int x, int y, int width, int height, int radius);
+ [CCode (cheader_filename = "wayland_blur.h", cname = "gxde_blur_available")]
+ private extern bool wayland_blur_available (Gdk.Display display);
public class MenuItem : Object {
public string menu_item_id;
@@ -60,244 +52,362 @@ namespace Menu {
}
}
+ // 用 GTK 菜单复刻 deepin-menu 的外观,尺寸与颜色取自 dstyle 插件 dlight2/ddark2 与 DTK 的 DMenuEffect。
public class Menu : Object {
- MenuManagerInterface menu_manager_interface;
- MenuInterface menu_interface;
- static string? menu_object_path;
-
- private bool prefer_deepin_menu = true;
- private bool inited = false;
+ private const int RADIUS = 8;
+ private const int ITEM_HEIGHT = 22;
+ private const int CHECK_X = 10;
+ private const int TEXT_X = 27;
+ private const int TEXT_RIGHT_PADDING = 44;
+ private const int ARROW_RIGHT_MARGIN = 6;
+ private const double BLUR_BACKGROUND_ALPHA = 0.45;
+
+ private static Gtk.CssProvider? css_provider = null;
+ private static HashTable icon_cache = null;
+
+ private Gtk.Menu? gtk_menu = null;
+ private bool is_dark = false;
+ private bool blur_enabled = false;
+ private int scale_factor = 1;
public signal void click_item(string item_id);
public signal void destroy();
public Menu() {}
- public void set_prefer_deepin_menu(bool _prefer_deepin_menu) {
- prefer_deepin_menu = _prefer_deepin_menu;
- }
+ // 在指针处弹出(右键菜单、键盘菜单键)。
+ public void popup_at_pointer(List