1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#ifndef CHROME_BROWSER_UI_GTK_GLOBAL_MENU_BAR_H_
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define CHROME_BROWSER_UI_GTK_GLOBAL_MENU_BAR_H_
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <map>
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/command_updater.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/gtk/gtk_signal.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass Browser;
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass BrowserWindowGtk;
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstruct GlobalMenuBarCommand;
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentypedef struct _GtkAccelGroup GtkAccelGroup;
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentypedef struct _GtkWidget GtkWidget;
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Controls the Mac style menu bar on Linux.
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Unity and some configurations of GNOME have a Apple-like menu bar at the top
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// of the screen that changes depending on the active window. These mainly work
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// by inspecting the application's widget hierarchy, and intercepting any
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// GtkMenuBar found. Thankfully, these systems don't check to see if the menu
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// bar itself is visible, so we insert a GtkMenuBar into the window hierarchy
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// and set it to be invisible.
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass GlobalMenuBar : public CommandUpdater::CommandObserver,
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      public NotificationObserver {
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GlobalMenuBar(Browser* browser, BrowserWindowGtk* window);
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~GlobalMenuBar();
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GtkWidget* widget() { return menu_bar_; }
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef std::map<int, GtkWidget*> IDMenuItemMap;
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Helper function that builds the data.
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void BuildGtkMenuFrom(int menu_str_id,
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        std::map<int, GtkWidget*>* id_to_menu_item,
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        GlobalMenuBarCommand* commands);
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // CommandUpdater::CommandObserver:
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void EnabledStateChangedForCommand(int id, bool enabled);
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // NotificationObserver:
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Observe(NotificationType type,
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationSource& source,
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationDetails& details);
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CHROMEGTK_CALLBACK_0(GlobalMenuBar, void, OnItemActivated);
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Browser* browser_;
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BrowserWindowGtk* browser_window_;
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NotificationRegistrar registrar_;
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Our menu bar widget.
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GtkWidget* menu_bar_;
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // For some menu items, we want to show the accelerator, but not actually
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // explicitly handle it. To this end we connect those menu items' accelerators
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // to this group, but don't attach this group to any top level window.
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GtkAccelGroup* dummy_accel_group_;
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // A mapping from command ids to GtkMenuItem objects. We use this to update
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the enable state since we are a .
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  IDMenuItemMap id_to_menu_item_;
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // gtk_check_menu_item_set_active() will call the "activate" signal. We need
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // to block this activation while we change the checked state.
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool block_activation_;
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif  // CHROME_BROWSER_UI_GTK_GLOBAL_MENU_BAR_H_
79