Commit 801fc11a authored by erg@chromium.org's avatar erg@chromium.org

linux_aura: Implement the dynamic History menu in the dbusmenu.

This merges and reimplements what was the GlobalHistoryMenu class from
the GTK+ port into linux_aura's GlobalMenuBarX11 class.

BUG=265560

Review URL: https://chromiumcodereview.appspot.com/22562005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@216868 0039d316-1c4b-4281-b951-d872f2087c98
parent 03261d47
...@@ -11,18 +11,29 @@ ...@@ -11,18 +11,29 @@
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/prefs/pref_change_registrar.h" #include "base/prefs/pref_change_registrar.h"
#include "chrome/browser/command_observer.h" #include "chrome/browser/command_observer.h"
#include "chrome/browser/common/cancelable_request.h"
#include "chrome/browser/history/history_types.h"
#include "chrome/browser/sessions/tab_restore_service.h"
#include "chrome/browser/sessions/tab_restore_service_observer.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "ui/base/glib/glib_signal.h" #include "ui/base/glib/glib_signal.h"
#include "ui/views/widget/desktop_aura/desktop_root_window_host_observer_x11.h" #include "ui/views/widget/desktop_aura/desktop_root_window_host_observer_x11.h"
typedef struct _DbusmenuMenuitem DbusmenuMenuitem; typedef struct _DbusmenuMenuitem DbusmenuMenuitem;
typedef struct _DbusmenuServer DbusmenuServer; typedef struct _DbusmenuServer DbusmenuServer;
namespace history {
class TopSites;
}
namespace ui { namespace ui {
class Accelerator; class Accelerator;
} }
class Browser; class Browser;
class BrowserView; class BrowserView;
class Profile;
class BrowserDesktopRootWindowHostX11; class BrowserDesktopRootWindowHostX11;
struct GlobalMenuBarCommand; struct GlobalMenuBarCommand;
...@@ -36,6 +47,8 @@ struct GlobalMenuBarCommand; ...@@ -36,6 +47,8 @@ struct GlobalMenuBarCommand;
// interface directly with the lower level libdbusmenu-glib, which we // interface directly with the lower level libdbusmenu-glib, which we
// opportunistically dlopen() since not everyone is running Ubuntu. // opportunistically dlopen() since not everyone is running Ubuntu.
class GlobalMenuBarX11 : public CommandObserver, class GlobalMenuBarX11 : public CommandObserver,
public content::NotificationObserver,
public TabRestoreServiceObserver,
public views::DesktopRootWindowHostObserverX11 { public views::DesktopRootWindowHostObserverX11 {
public: public:
GlobalMenuBarX11(BrowserView* browser_view, GlobalMenuBarX11(BrowserView* browser_view,
...@@ -46,8 +59,16 @@ class GlobalMenuBarX11 : public CommandObserver, ...@@ -46,8 +59,16 @@ class GlobalMenuBarX11 : public CommandObserver,
static std::string GetPathForWindow(unsigned long xid); static std::string GetPathForWindow(unsigned long xid);
private: private:
struct HistoryItem;
typedef std::map<int, DbusmenuMenuitem*> CommandIDMenuItemMap; typedef std::map<int, DbusmenuMenuitem*> CommandIDMenuItemMap;
// Builds a separator.
DbusmenuMenuitem* BuildSeparator();
// Creates an individual menu item from a title and command, and subscribes
// to the activation signal.
DbusmenuMenuitem* BuildMenuItem(const std::string& label, int tag_id);
// Creates a DbusmenuServer, and attaches all the menu items. // Creates a DbusmenuServer, and attaches all the menu items.
void InitServer(unsigned long xid); void InitServer(unsigned long xid);
...@@ -56,37 +77,68 @@ class GlobalMenuBarX11 : public CommandObserver, ...@@ -56,37 +77,68 @@ class GlobalMenuBarX11 : public CommandObserver,
// Creates a whole menu defined with |commands| and titled with the string // Creates a whole menu defined with |commands| and titled with the string
// |menu_str_id|. Then appends it to |parent|. // |menu_str_id|. Then appends it to |parent|.
void BuildMenuFrom(DbusmenuMenuitem* parent, DbusmenuMenuitem* BuildStaticMenu(DbusmenuMenuitem* parent,
int menu_str_id, int menu_str_id,
CommandIDMenuItemMap* id_to_menu_item, GlobalMenuBarCommand* commands);
GlobalMenuBarCommand* commands);
// Creates an individual menu item from a title and command, and subscribes
// to the activation signal.
DbusmenuMenuitem* BuildMenuItem(
int string_id,
int command_id,
int tag_id,
CommandIDMenuItemMap* id_to_menu_item);
// Sets the accelerator for |item|. // Sets the accelerator for |item|.
void RegisterAccelerator(DbusmenuMenuitem* item, void RegisterAccelerator(DbusmenuMenuitem* item,
const ui::Accelerator& accelerator); const ui::Accelerator& accelerator);
// Creates a HistoryItem from the data in |entry|.
HistoryItem* HistoryItemForTab(const TabRestoreService::Tab& entry);
// Creates a menu item form |item| and inserts it in |menu| at |index|.
void AddHistoryItemToMenu(HistoryItem* item,
DbusmenuMenuitem* menu,
int tag,
int index);
// Sends a message off to History for data.
void GetTopSitesData();
// Callback to receive data requested from GetTopSitesData().
void OnTopSitesReceived(const history::MostVisitedURLList& visited_list);
// Updates the visibility of the bookmark bar on pref changes. // Updates the visibility of the bookmark bar on pref changes.
void OnBookmarkBarVisibilityChanged(); void OnBookmarkBarVisibilityChanged();
// Find the first index of the item in |menu| with the tag |tag_id|.
int GetIndexOfMenuItemWithTag(DbusmenuMenuitem* menu, int tag_id);
// This will remove all menu items in |menu| with |tag| as their tag. This
// clears state about HistoryItems* that we keep to prevent that data from
// going stale. That's why this method recurses into its child menus.
void ClearMenuSection(DbusmenuMenuitem* menu, int tag_id);
// Deleter function for HistoryItem implementation detail.
static void DeleteHistoryItem(void* void_item);
// Overridden from CommandObserver: // Overridden from CommandObserver:
virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE; virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE;
// Overridden from DesktopRootWindowHostObserverX11: // Overridden from content::NotificationObserver:
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
// Overridden from TabRestoreServiceObserver:
virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE;
virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE;
// Overridden from views::DesktopRootWindowHostObserverX11:
virtual void OnWindowMapped(unsigned long xid) OVERRIDE; virtual void OnWindowMapped(unsigned long xid) OVERRIDE;
virtual void OnWindowUnmapped(unsigned long xid) OVERRIDE; virtual void OnWindowUnmapped(unsigned long xid) OVERRIDE;
CHROMEG_CALLBACK_1(GlobalMenuBarX11, void, OnItemActivated, DbusmenuMenuitem*, CHROMEG_CALLBACK_1(GlobalMenuBarX11, void, OnItemActivated, DbusmenuMenuitem*,
unsigned int); unsigned int);
CHROMEG_CALLBACK_1(GlobalMenuBarX11, void, OnHistoryItemActivated,
DbusmenuMenuitem*, unsigned int);
CHROMEG_CALLBACK_0(GlobalMenuBarX11, void, OnHistoryMenuAboutToShow,
DbusmenuMenuitem*);
Browser* browser_; Browser* browser_;
Profile* profile_;
BrowserView* browser_view_; BrowserView* browser_view_;
BrowserDesktopRootWindowHostX11* host_; BrowserDesktopRootWindowHostX11* host_;
...@@ -96,10 +148,20 @@ class GlobalMenuBarX11 : public CommandObserver, ...@@ -96,10 +148,20 @@ class GlobalMenuBarX11 : public CommandObserver,
DbusmenuServer* server_; DbusmenuServer* server_;
DbusmenuMenuitem* root_item_; DbusmenuMenuitem* root_item_;
DbusmenuMenuitem* history_menu_;
// Tracks value of the kShowBookmarkBar preference. // Tracks value of the kShowBookmarkBar preference.
PrefChangeRegistrar pref_change_registrar_; PrefChangeRegistrar pref_change_registrar_;
history::TopSites* top_sites_;
TabRestoreService* tab_restore_service_; // weak
content::NotificationRegistrar registrar_;
// For callbacks may be run after destruction.
base::WeakPtrFactory<GlobalMenuBarX11> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(GlobalMenuBarX11); DISALLOW_COPY_AND_ASSIGN(GlobalMenuBarX11);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment