global_menu_bar_x11.h revision 3240926e260ce088908e02ac07a6cf7b0c0cbf44
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_VIEWS_FRAME_GLOBAL_MENU_BAR_X11_H_
6#define CHROME_BROWSER_UI_VIEWS_FRAME_GLOBAL_MENU_BAR_X11_H_
7
8#include <map>
9#include <string>
10
11#include "base/compiler_specific.h"
12#include "base/prefs/pref_change_registrar.h"
13#include "chrome/browser/command_observer.h"
14#include "ui/base/glib/glib_signal.h"
15#include "ui/views/widget/desktop_aura/desktop_root_window_host_observer_x11.h"
16
17typedef struct _DbusmenuMenuitem DbusmenuMenuitem;
18typedef struct _DbusmenuServer   DbusmenuServer;
19
20namespace ui {
21class Accelerator;
22}
23
24class Browser;
25class BrowserView;
26
27class BrowserDesktopRootWindowHostX11;
28struct GlobalMenuBarCommand;
29
30// Controls the Mac style menu bar on Unity.
31//
32// Unity has an Apple-like menu bar at the top of the screen that changes
33// depending on the active window. In the GTK port, we had a hidden GtkMenuBar
34// object in each GtkWindow which existed only to be scrapped by the
35// libdbusmenu-gtk code. Since we don't have GtkWindows anymore, we need to
36// interface directly with the lower level libdbusmenu-glib, which we
37// opportunistically dlopen() since not everyone is running Ubuntu.
38class GlobalMenuBarX11 : public CommandObserver,
39                         public views::DesktopRootWindowHostObserverX11 {
40 public:
41  GlobalMenuBarX11(BrowserView* browser_view,
42                   BrowserDesktopRootWindowHostX11* host);
43  virtual ~GlobalMenuBarX11();
44
45  // Creates the object path for DbusemenuServer which is attached to |xid|.
46  static std::string GetPathForWindow(unsigned long xid);
47
48 private:
49  typedef std::map<int, DbusmenuMenuitem*> CommandIDMenuItemMap;
50
51  // Creates a DbusmenuServer, and attaches all the menu items.
52  void InitServer(unsigned long xid);
53
54  // Stops listening to enable state changed events.
55  void Disable();
56
57  // Creates a whole menu defined with |commands| and titled with the string
58  // |menu_str_id|. Then appends it to |parent|.
59  void BuildMenuFrom(DbusmenuMenuitem* parent,
60                     int menu_str_id,
61                     CommandIDMenuItemMap* id_to_menu_item,
62                     GlobalMenuBarCommand* commands);
63
64  // Creates an individual menu item from a title and command, and subscribes
65  // to the activation signal.
66  DbusmenuMenuitem* BuildMenuItem(
67      int string_id,
68      int command_id,
69      int tag_id,
70      CommandIDMenuItemMap* id_to_menu_item);
71
72  // Sets the accelerator for |item|.
73  void RegisterAccelerator(DbusmenuMenuitem* item,
74                           const ui::Accelerator& accelerator);
75
76  // Updates the visibility of the bookmark bar on pref changes.
77  void OnBookmarkBarVisibilityChanged();
78
79  // Overridden from CommandObserver:
80  virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE;
81
82  // Overridden from DesktopRootWindowHostObserverX11:
83  virtual void OnWindowMapped(unsigned long xid) OVERRIDE;
84  virtual void OnWindowUnmapped(unsigned long xid) OVERRIDE;
85
86  CHROMEG_CALLBACK_1(GlobalMenuBarX11, void, OnItemActivated, DbusmenuMenuitem*,
87                     unsigned int);
88
89  Browser* browser_;
90  BrowserView* browser_view_;
91  BrowserDesktopRootWindowHostX11* host_;
92
93  // Maps command ids to DbusmenuMenuitems so we can modify their
94  // enabled/checked state in response to state change notifications.
95  CommandIDMenuItemMap id_to_menu_item_;
96
97  DbusmenuServer* server_;
98  DbusmenuMenuitem* root_item_;
99
100  // Tracks value of the kShowBookmarkBar preference.
101  PrefChangeRegistrar pref_change_registrar_;
102
103  DISALLOW_COPY_AND_ASSIGN(GlobalMenuBarX11);
104};
105
106#endif  // CHROME_BROWSER_UI_VIEWS_FRAME_GLOBAL_MENU_BAR_X11_H_
107