summarylogtreecommitdiffstats
path: root/gtk3-menu-bar.patch
blob: 8a51ecec3ae23f5234913ea8f5348be18722269b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
--- a/atom/browser/ui/views/menu_bar.cc
+++ b/atom/browser/ui/views/menu_bar.cc
@@ -16,8 +16,6 @@
 
 #if defined(OS_WIN)
 #include "ui/gfx/color_utils.h"
-#elif defined(USE_X11)
-#include "chrome/browser/ui/libgtkui/skia_utils_gtk.h"
 #endif
 
 namespace atom {
@@ -30,18 +28,71 @@ const char kViewClassName[] = "ElectronMenuBar";
 const SkColor kDefaultColor = SkColorSetARGB(255, 233, 233, 233);
 
 #if defined(USE_X11)
+SkColor GdkRGBAToSkColor(GdkRGBA color) {
+  return SkColorSetARGB(round(color.alpha * 255),
+                        round(color.red * 255),
+                        round(color.green * 255),
+                        round(color.blue * 255));
+}
+
 void GetMenuBarColor(SkColor* enabled, SkColor* disabled, SkColor* highlight,
                      SkColor* hover, SkColor* background) {
+  GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   GtkWidget* menu_bar = gtk_menu_bar_new();
-
-  GtkStyle* style = gtk_rc_get_style(menu_bar);
-  *enabled = libgtkui::GdkColorToSkColor(style->fg[GTK_STATE_NORMAL]);
-  *disabled = libgtkui::GdkColorToSkColor(style->fg[GTK_STATE_INSENSITIVE]);
-  *highlight = libgtkui::GdkColorToSkColor(style->fg[GTK_STATE_SELECTED]);
-  *hover = libgtkui::GdkColorToSkColor(style->fg[GTK_STATE_PRELIGHT]);
-  *background = libgtkui::GdkColorToSkColor(style->bg[GTK_STATE_NORMAL]);
-
+  GtkWidget* menu_item = gtk_menu_item_new_with_label("");
+  GtkWidget* label = gtk_bin_get_child(GTK_BIN(menu_item));
+  GtkStyleContext* window_style_ctx = gtk_widget_get_style_context(window);
+  GtkStyleContext* menu_bar_style_ctx =
+    gtk_widget_get_style_context(menu_bar);
+  GtkStyleContext* menu_item_style_ctx =
+    gtk_widget_get_style_context(menu_item);
+  GtkStyleContext* label_style_ctx = gtk_widget_get_style_context(label);
+  GdkRGBA normal_color;
+  GdkRGBA backdrop_color;
+  GdkRGBA prelight_color;
+  GdkRGBA* background_color_ptr;
+
+  gtk_container_add(GTK_CONTAINER(window), menu_bar);
+  gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), menu_item);
+
+  gtk_style_context_get(menu_bar_style_ctx,
+                        GTK_STATE_FLAG_NORMAL,
+                        "background-color",
+                        &background_color_ptr,
+                        NULL);
+
+  if (background_color_ptr->alpha == 0.0)
+    gtk_style_context_get(window_style_ctx,
+                          GTK_STATE_FLAG_NORMAL,
+                          "background-color",
+                          &background_color_ptr,
+                          NULL);
+
+  *background = GdkRGBAToSkColor(*background_color_ptr);
+  gdk_rgba_free(background_color_ptr);
+
+  gtk_style_context_get_color(label_style_ctx,
+                              GTK_STATE_FLAG_NORMAL,
+                              &normal_color);
+  *enabled = GdkRGBAToSkColor(normal_color);
+  *hover = GdkRGBAToSkColor(normal_color);
+
+  gtk_style_context_set_state(menu_item_style_ctx, GTK_STATE_FLAG_PRELIGHT);
+  gtk_style_context_get_color(label_style_ctx,
+                              GTK_STATE_FLAG_NORMAL,
+                              &prelight_color);
+  gtk_style_context_set_state(menu_item_style_ctx, GTK_STATE_FLAG_NORMAL);
+  *highlight = GdkRGBAToSkColor(prelight_color);
+
+
+  gtk_style_context_get_color(label_style_ctx,
+                              GTK_STATE_FLAG_BACKDROP,
+                              &backdrop_color);
+  *disabled = GdkRGBAToSkColor(backdrop_color);
+
+  gtk_widget_destroy(menu_item);
   gtk_widget_destroy(menu_bar);
+  gtk_widget_destroy(window);
 }
 #endif