This file is indexed.

/usr/include/cwidget/widgets/menu.h is in libcwidget-dev 0.5.17-4+b1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
// menu.h  -*-c++-*-
//
//   Copyright (C) 2000-2005 Daniel Burrows
//
//   This program is free software; you can redistribute it and/or
//   modify it under the terms of the GNU General Public License as
//   published by the Free Software Foundation; either version 2 of
//   the License, or (at your option) any later version.
//
//   This program is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//   General Public License for more details.
//
//   You should have received a copy of the GNU General Public License
//   along with this program; see the file COPYING.  If not, write to
//   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
//   Boston, MA 02111-1307, USA.
//
//  A nice menu with selectable entries.  (fairly basic atm)

#ifndef MENU_H
#define MENU_H

#include "widget.h"

#include <cwidget/config/keybindings.h>

#include <cwidget/generic/util/bool_accumulate.h>
#include <cwidget/generic/util/slotarg.h>

#include <vector>

namespace cwidget
{
  namespace widgets
  {
    // Currently, menu-items aren't full widgets--it's simply too much
    // baggage (lots of signals and a Curses window) for something that's
    // quite simple and special-purpose.
    class menu_item
    {
      // The text displayed in the menu entry
      std::wstring title;

      // A string describing the item's function
      std::wstring description;

      // The keybinding whose definition (in the GLOBAL bindings list) is
      // displayed to the right of the menu entry.
      std::string binding;

      // The key that directly activates this item *while the menu is open*
      chtype hotkey;
    public:
      // Infers the hotkey from the title
      menu_item(const std::wstring &_title, const std::string &_binding,
		const std::wstring &_description);

      std::wstring get_title() const {return title;}
      std::string get_binding() const {return binding;}
      std::wstring get_description() const {return description;}
      chtype get_hotkey() const {return hotkey;}

      /** The canonical way to test whether an item is really enabled. */
      bool is_enabled() const;

      /** Emitted when the menu item is selected. */
      sigc::signal0<void> selected;

      /** Emitted to test whether the menu item should be displayed as "active".
       *
       *  If this signal is empty, the item will be displayed as "active" iff
       *  "selected" is non-empty.  Otherwise, the return value of the signal
       *  is used.
       */
      sigc::signal0<bool, util::accumulate_or> enabled;
    };

#define MENU_NOP NULL

    // Info for easy static generation of menus

    struct menu_info
    {
    public:
      // MENU_ITEM: a "real" menu-item
      // MENU_END: the last item in this information block
      enum item_types {MENU_ITEM, MENU_SEPARATOR, MENU_END} item_type;

      /** item_name and item_description are multibyte representations. */
      const char *item_name, *item_binding, *item_description;

      // How to communicate with the outside world..
      util::slot0arg item_slot;

      // For activation
      util::slotarg<sigc::slot0<bool> >  item_enabled;

      menu_info(item_types type, const char *name, const char *binding,
		const char *description, sigc::slot0<void> slot);

      menu_info(item_types type, const char *name, const char *binding,
		const char *description, sigc::slot0<void> *slot);

      menu_info(item_types type, const char *name, const char *binding,
		const char *description, sigc::slot0<void> slot,
		sigc::slot0<bool> enabled);

      menu_info(item_types type, const char *name, const char *binding,
		const char *description, sigc::slot0<void> *slot,
		sigc::slot0<bool> enabled);

      menu_info(item_types type);
    };

    const menu_info MENU_SEPARATOR(menu_info::MENU_SEPARATOR);
    const menu_info MENU_END(menu_info::MENU_END);

    class menu : public widget
    {
      typedef std::vector<menu_item *> itemlist;

      // A set of menu items.  NULL indicates a separator.
      // These items are deleted with the menu.
      itemlist items;

      /** The location of the cursor, or items.size() if no item is selected. */
      itemlist::size_type cursorloc;

      /** The first visible item in the menu. */
      itemlist::size_type startloc;

      /** The minimum width of this menu. */
      int min_width;

      // connected to "shown"
      void appear();

      // connected to "hidden"
      void disappear();

      /** Update the starting location from the current height and cursor
       *  location.
       */
      void update_startloc();

      /** Returns \b true iff the given item is selectable. */
      bool selectable(itemlist::size_type pos);

      /** Select the given location. */
      void set_cursor(itemlist::size_type pos);

      /** Highlight the currently selected item (highlight NULL if no
       *  item is selected)
       */
      void highlight_current();

      /** Search for the first selectable item from the given location; if
       *  the search runs off the end of the list, return items.size().
       *
       *  \param pos the starting location of the search; if it is out of
       *  bounds, the search starts with the first menu item.
       */
      itemlist::size_type next_selectable(itemlist::size_type pos);

      /** Search backwards for the first selectable item from the given
       *  location; if the search runs off the beginning of the list,
       *  return items.size().
       *
       *  \param pos the starting location of the search; if it is out of
       *  bounds, the search starts with the last menu item.
       */
      itemlist::size_type prev_selectable(itemlist::size_type pos);

      /** If the cursor is "out of bounds" or on a disabled item, attempt
       *  to select the first enabled non-separator item.
       *
       *  \param forward if \b true, search forward in the list for an
       *  enabled item; otherwise, search backward.
       */
      void sanitize_cursor(bool forward);

    protected:
      virtual bool handle_key(const config::key &k);

      /** Create a blank menu. */
      menu();

      // Initialize a menu from a block of information.  If there is no
      // MENU_END in the block, RANDOM ERRORS WILL OCCUR!!
      menu(int x, int y, int w, menu_info *inf);
    public:
      static util::ref_ptr<menu> create()
      {
	util::ref_ptr<menu> rval(new menu);
	rval->decref();
	return rval;
      }

      static util::ref_ptr<menu> create(int x, int y, int w, menu_info *inf)
      {
	util::ref_ptr<menu> rval(new menu(x, y, w, inf));
	rval->decref();
	return rval;
      }

      // Deletes the items it holds!
      ~menu();

      bool get_cursorvisible();
      point get_cursorloc();

      int width_request();
      int height_request(int width);

      void append_item(menu_item *newitem);
      void remove_item(menu_item *item);

      /** Move the selection up, as if Up had been pressed. */
      void move_selection_up();

      /** Move the selection down, as if Down had been pressed. */
      void move_selection_down();

      /** Move the selection to the top of the menu, as if Home had been pressed. */
      void move_selection_top();

      /** Move the selection to the bottom of the menu, as if End had been pressed. */
      void move_selection_bottom();

      virtual bool focus_me();
      virtual void paint(const style &st);
      virtual void dispatch_mouse(short id, int x, int y, int z, mmask_t bstate);

      // Emitted when an item is highlighted or when the selection "goes away".
      // In the latter case, the argument is NULL.  (happens only when
      // the menu is hidden -- FIXME?)
      sigc::signal1<void, menu_item *> item_highlighted;

      // FIXME: there should be a less hacky way..
      sigc::signal0<void> menus_goaway;

      static config::keybindings *bindings;
      static void init_bindings();
    };

    typedef util::ref_ptr<menu> menu_ref;
  }
}

#endif