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