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