~ubuntu-branches/ubuntu/precise/firefox/precise-proposed

« back to all changes in this revision

Viewing changes to debian/globalmenu/src/uGlobalMenu.h

  • Committer: Package Import Robot
  • Author(s): Chris Coulson
  • Date: 2012-04-02 08:30:28 UTC
  • Revision ID: package-import@ubuntu.com-20120402083028-430x8nc65vivx0ne
Tags: 11.0+build1-0ubuntu2
* Update globalmenu-extension to 3.0.1
  - Reduce our memory footprint a bit, which wasn't really a lot anyway
  - Avoid the use of the component manager for accessing commonly used
    services, where "commonly used" means "accessed when building every
    menu item". This should save some CPU cycles when building or
    refreshing menus
  - Try to recycle menuitems when they are removed from a menu by
    adding contiguous blocks of removed items to a "free list" which
    is emptied asynchronously, and reusing the items in this list when
    new items are added in place of the removed items. This means that
    refreshing the history menu contents when the menu is opened no
    longer alters the menu structure, but results in a shifting of
    properties between existing nodes instead. This has a few benefits:
    + With no layout changes, unity-panel-service doesn't request
      the entire menu structure, which significantly reduces dbus traffic
      and makes it much faster to refresh the menu contents
    + The size of the menu doesn't change when it is refreshed, which
      eliminates the flicker that used to occur when opening the history
      menu.
    + The HUD can refresh our menus now without triggering layout updates
      (assuming that menu layout really hasn't changed, eg, by adding
      a bookmark)
  - Remove all use of the global observer service for sending our own
    internal notifications around
  - Clean up the way we ensure that the correct edit commands are
    enabled by just installing our own popupshowing handler rather
    than using an additional notification to fix things up after the
    default handler runs
  - Get rid of a static initializer
  - Don't support older than Firefox 11
  - Fix some GError leaks
  - Hide the internal menu when creating a native menu, rather than
    waiting for confirmation that the native menu is registered
    successfully. We don't try to create a native menu if we don't
    find a menu service to register the menu with anyway
  - Keep menu contents updated whilst the menu is open, rather than
    just whilst it is opening

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 
2
/* ***** BEGIN LICENSE BLOCK *****
 
3
 *       Version: MPL 1.1/GPL 2.0/LGPL 2.1
 
4
 *
 
5
 * The contents of this file are subject to the Mozilla Public License Version
 
6
 * 1.1 (the "License"); you may not use this file except in compliance with
 
7
 * the License. You may obtain a copy of the License at
 
8
 * http://www.mozilla.org/MPL/
 
9
 * 
 
10
 * Software distributed under the License is distributed on an "AS IS" basis,
 
11
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 
12
 * for the specific language governing rights and limitations under the
 
13
 * License.
 
14
 *
 
15
 * The Original Code is globalmenu-extension.
 
16
 *
 
17
 * The Initial Developer of the Original Code is
 
18
 * Canonical Ltd.
 
19
 * Portions created by the Initial Developer are Copyright (C) 2010
 
20
 * the Initial Developer. All Rights Reserved.
 
21
 *
 
22
 * Contributor(s):
 
23
 * Chris Coulson <chris.coulson@canonical.com>
 
24
 *
 
25
 * Alternatively, the contents of this file may be used under the terms of
 
26
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 
27
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 
28
 * in which case the provisions of the GPL or the LGPL are applicable instead
 
29
 * of those above. If you wish to allow use of your version of this file only
 
30
 * under the terms of either the GPL or the LGPL, and not to allow others to
 
31
 * use your version of this file under the terms of the MPL, indicate your
 
32
 * decision by deleting the provisions above and replace them with the notice
 
33
 * and other provisions required by the GPL or the LGPL. If you do not delete
 
34
 * the provisions above, a recipient may use your version of this file under
 
35
 * the terms of any one of the MPL, the GPL or the LGPL.
 
36
 * 
 
37
 * ***** END LICENSE BLOCK ***** */
 
38
 
 
39
#ifndef _U_GLOBALMENU_H
 
40
#define _U_GLOBALMENU_H
 
41
 
 
42
#include <prtypes.h>
 
43
#include <nsTArray.h>
 
44
#include <nsAutoPtr.h>
 
45
#include <nsCOMPtr.h>
 
46
#include <nsIContent.h>
 
47
 
 
48
#include <libdbusmenu-glib/server.h>
 
49
 
 
50
#include "uGlobalMenuObject.h"
 
51
#include "uMenuChangeObserver.h"
 
52
 
 
53
class uGlobalMenuItem;
 
54
class uGlobalMenuBar;
 
55
class uGlobalMenuDocListener;
 
56
 
 
57
class uGlobalMenu: public uGlobalMenuObject,
 
58
                   public uMenuChangeObserver
 
59
{
 
60
public:
 
61
  NS_DECL_UMENUCHANGEOBSERVER
 
62
 
 
63
  static uGlobalMenuObject* Create(uGlobalMenuObject *aParent,
 
64
                                   uGlobalMenuDocListener *aListener,
 
65
                                   nsIContent *aContent,
 
66
                                   uGlobalMenuBar *aMenuBar);
 
67
 
 
68
  ~uGlobalMenu();
 
69
 
 
70
  bool CanOpen();
 
71
  void OpenMenu();
 
72
  void AboutToShowNotify();
 
73
  bool IsOpenOrOpening() { return !!(mFlags & UNITY_MENU_IS_OPEN_OR_OPENING); }
 
74
 
 
75
private:
 
76
  uGlobalMenu();
 
77
 
 
78
  // Initialize the menu structure
 
79
  nsresult Init(uGlobalMenuObject *aParent,
 
80
                uGlobalMenuDocListener *aListener,
 
81
                nsIContent *aContent,
 
82
                uGlobalMenuBar *aMenuBar);
 
83
  bool InsertMenuObjectAt(uGlobalMenuObject *menuObj,
 
84
                          PRUint32 index);
 
85
  bool AppendMenuObject(uGlobalMenuObject *menuObj);
 
86
  bool RemoveMenuObjectAt(PRUint32 index);
 
87
  void InitializeDbusMenuItem();
 
88
  nsresult Build();
 
89
  void SyncProperties();
 
90
  void GetMenuPopupFromMenu(nsIContent **aResult);
 
91
  static bool MenuAboutToOpenCallback(DbusmenuMenuitem *menu,
 
92
                                      void *data);
 
93
  static bool MenuEventCallback(DbusmenuMenuitem *menu,
 
94
                                const gchar *name,
 
95
                                GVariant *value,
 
96
                                guint timestamp,
 
97
                                void *data);
 
98
  void AboutToOpen();
 
99
  void OnOpen();
 
100
  void OnClose();
 
101
  void Activate();
 
102
  void Deactivate();
 
103
  void SetNeedsRebuild() { mFlags = mFlags | UNITY_MENU_NEEDS_REBUILDING; }
 
104
  void ClearNeedsRebuild() { mFlags = mFlags & ~UNITY_MENU_NEEDS_REBUILDING; }
 
105
  bool DoesNeedRebuild() { return !!(mFlags & UNITY_MENU_NEEDS_REBUILDING); }
 
106
  void FreeRecycleList() { mRecycleList = nsnull; }
 
107
 
 
108
  struct RecycleList
 
109
  {
 
110
    RecycleList(uGlobalMenu *aMenu);
 
111
    ~RecycleList();
 
112
 
 
113
    DbusmenuMenuitem* PopRecyclableItem();
 
114
    void PrependRecyclableItem(DbusmenuMenuitem *aItem);
 
115
    void AppendRecyclableItem(DbusmenuMenuitem *aItem);
 
116
 
 
117
    PRUint32 mMarker;
 
118
    nsTArray<DbusmenuMenuitem *> mList;
 
119
    uGlobalMenu *mMenu;
 
120
  };
 
121
 
 
122
  nsCOMPtr<nsIContent> mPopupContent;
 
123
  nsTArray< nsAutoPtr<uGlobalMenuObject> > mMenuObjects;
 
124
  nsAutoPtr<RecycleList> mRecycleList;
 
125
};
 
126
 
 
127
#endif