~ubuntu-branches/ubuntu/lucid/kdebase/lucid

« back to all changes in this revision

Viewing changes to kicker/applets/menu/menuapplet.h

  • Committer: Bazaar Package Importer
  • Author(s): Ana Beatriz Guerrero Lopez
  • Date: 2009-04-05 05:22:13 UTC
  • mfrom: (0.4.2 experimental) (0.2.2 upstream)
  • mto: This revision was merged to the branch mainline in revision 235.
  • Revision ID: james.westby@ubuntu.com-20090405052213-39thr4l6p2ss07uj
Tags: 4:4.2.2-1
* New upstream release:
  - khtml fixes. (Closes: #290285, #359680)
  - Default konsole sessions can be deleted. (Closes: #286342)
  - Tag widget uses standard application palette. (Closes: #444800)
  - ... and surely many more but we have lost track...

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*****************************************************************
2
 
 
3
 
Copyright (c) 2002 Siegfried Nijssen <snijssen@liacs.nl>
4
 
Copyright (c) 2003 Lubos Lunak <l.lunak@suse.cz>
5
 
 
6
 
Permission is hereby granted, free of charge, to any person obtaining a copy
7
 
of this software and associated documentation files (the "Software"), to deal
8
 
in the Software without restriction, including without limitation the rights
9
 
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 
copies of the Software, and to permit persons to whom the Software is
11
 
furnished to do so, subject to the following conditions:
12
 
 
13
 
The above copyright notice and this permission notice shall be included in
14
 
all copies or substantial portions of the Software.
15
 
 
16
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
19
 
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20
 
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
 
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
 
 
23
 
******************************************************************/
24
 
 
25
 
#ifndef _MENUAPPLET_H_
26
 
#define _MENUAPPLET_H_
27
 
 
28
 
#include <assert.h>
29
 
 
30
 
#include <qvaluelist.h>
31
 
#include <qevent.h>
32
 
#include <qxembed.h>
33
 
 
34
 
#include <kpanelapplet.h>
35
 
#include <kmanagerselection.h>
36
 
 
37
 
#include <dcopobject.h>
38
 
#include <dcopclient.h>
39
 
 
40
 
#include <karrowbutton.h>
41
 
 
42
 
class KWinModule;
43
 
 
44
 
namespace KickerMenuApplet
45
 
{
46
 
 
47
 
class MenuEmbed;
48
 
 
49
 
/**
50
 
 * @short A central menu bar
51
 
 *
52
 
 * @description All status change, such as when an window is activated,
53
 
 * a new window popped up, etc, is received via @ref KWin::WindowInfo and @ref
54
 
 * NETWinInfo. Status changes for X selections are done via KSelectionWatcher.
55
 
 *
56
 
 * How it works in broad terms:  KickerMenuApplet gets notified as soon a window
57
 
 * changes(a new pops up etc.) and accordingly updates the list @ref menus,
58
 
 * which contains all known menus. When a new window gains focus, it looks up the
59
 
 * correct MenuEmbed in @ref menus, and then switches to that one.
60
 
 *
61
 
 * The documentation is a bit rusty -- read it with a critical eye.
62
 
 *
63
 
 * @author Siegfried Nijssen <snijssen@liacs.nl>
64
 
 * @author Lubos Lunak <l.lunak@suse.cz>
65
 
 */
66
 
 
67
 
class Applet : public KPanelApplet, public DCOPObject
68
 
{
69
 
    Q_OBJECT
70
 
    K_DCOP
71
 
 
72
 
k_dcop:
73
 
   
74
 
    /**
75
 
     * Called by the Kicker configuration(KCM). Does in turn call
76
 
     * readSettings().
77
 
     */
78
 
    ASYNC configure();
79
 
    
80
 
public:
81
 
    Applet( const QString& configFile, QWidget *parent );
82
 
            virtual ~Applet();
83
 
    virtual int widthForHeight( int height ) const;
84
 
    virtual int heightForWidth( int width ) const;
85
 
    
86
 
    /**
87
 
     * Looks up @param embed in @ref menus, and removes it.
88
 
     */
89
 
    void menuLost( MenuEmbed* embed );
90
 
    void updateMenuGeometry( MenuEmbed* embed );
91
 
    void setBackground();
92
 
 
93
 
protected:
94
 
    
95
 
    virtual void paletteChange(const QPalette& );
96
 
    virtual void positionChange( Position p );
97
 
    virtual void moveEvent(QMoveEvent *);
98
 
 
99
 
private slots:
100
 
    
101
 
    /**
102
 
     * Called each time a window is added. When the selection is
103
 
     * initially claimed, it is called for every window. It does the big
104
 
     * work, and does the embedding with MenuEmbed.
105
 
     */
106
 
    void windowAdded( WId w );
107
 
   
108
 
    /**
109
 
     * Finds @p w's menubar in @see menus, and then activates it.
110
 
     *
111
 
     * @param w the activated window.
112
 
     */
113
 
    void activeWindowChanged( WId w );
114
 
    
115
 
    /**
116
 
     * Called when the selection(selection_atom) is lost. Deletes the
117
 
     * embedded menus, and starts listening for the selection again.
118
 
     *
119
 
     */
120
 
    void lostSelection();
121
 
    
122
 
    /**
123
 
     * Reads whether a central menu bar should be used or not, basically.
124
 
     */
125
 
    void readSettings();
126
 
    void claimSelection();
127
 
    
128
 
private:
129
 
    
130
 
    /**
131
 
     * Returns true if the selection is Not owned. That is, the menu applet
132
 
     * isn't "running" and is listening for the selection to be released.
133
 
     */
134
 
    bool isDisabled() const;
135
 
    
136
 
    WId tryTransientFor( WId w );
137
 
   
138
 
    /**
139
 
     * Does some sanity checks, and then sets active_menu to @param embed.
140
 
     */
141
 
    void activateMenu( MenuEmbed* embed );
142
 
    
143
 
    /**
144
 
     * Creates msg_type_atom and selection_atom, and returns the latter.
145
 
     */
146
 
    static Atom makeSelectionAtom();
147
 
    void updateTopEdgeOffset();
148
 
    KWinModule* module;
149
 
    
150
 
    /**
151
 
     * List of all known menus.
152
 
     */
153
 
    QValueList< MenuEmbed* > menus;
154
 
    
155
 
    /**
156
 
     * A pointer to the current active menu, which is member
157
 
     * of @ref menus.
158
 
     */
159
 
    MenuEmbed* active_menu;
160
 
    
161
 
    KSelectionOwner* selection;
162
 
    
163
 
    /**
164
 
     * Only the messenger. Dispatches signals to  claimSelection().
165
 
     */
166
 
    KSelectionWatcher* selection_watcher;
167
 
    
168
 
    /**
169
 
     * Whether the Desktop menu should be used, when a window
170
 
     * with no menu is used.
171
 
     */
172
 
    bool desktop_menu;
173
 
    DCOPClient dcopclient;
174
 
    
175
 
    /**
176
 
     * The distance to the top of the screen.
177
 
     */
178
 
    int topEdgeOffset;
179
 
};
180
 
 
181
 
/**
182
 
 *
183
 
 * @author Siegfried Nijssen <snijssen@liacs.nl>
184
 
 * @author Lubos Lunak <l.lunak@suse.cz>
185
 
 */
186
 
class MenuEmbed
187
 
    : public QXEmbed
188
 
{
189
 
    Q_OBJECT
190
 
 
191
 
public:
192
 
 
193
 
    /**
194
 
     * Default constructor
195
 
     *
196
 
     * @param mainwindow window ID for the window to be plugged
197
 
     * @param desktop true if @p mainwindow is the desktop
198
 
     */
199
 
    MenuEmbed( WId mainwindow, bool desktop,
200
 
                QWidget* parent = NULL, const char* name = NULL );
201
 
    
202
 
    void setBackground();
203
 
    
204
 
    /**
205
 
     * @returns the window ID for the handled window.
206
 
     */
207
 
    WId mainWindow() const;
208
 
    
209
 
    /**
210
 
     */
211
 
    bool isDesktopMenu() const;
212
 
    virtual void setMinimumSize( int w, int h );
213
 
    void setMinimumSize( const QSize& s ) { setMinimumSize( s.width(), s.height()); }
214
 
 
215
 
protected:
216
 
    
217
 
    /**
218
 
     * When @p w is None, that is the embedded window was lost, it calls
219
 
     * menuLost() such that the this is deleted from @ref menus list.
220
 
     */
221
 
    virtual void windowChanged( WId w );
222
 
    
223
 
    virtual bool x11Event( XEvent* ev );
224
 
 
225
 
private:
226
 
    
227
 
    void sendSyntheticConfigureNotifyEvent();
228
 
    WId main_window;
229
 
    
230
 
    /**
231
 
     * If the window is the desktop window.
232
 
     */
233
 
    bool desktop;
234
 
};
235
 
    
236
 
inline
237
 
bool Applet::isDisabled() const
238
 
{
239
 
    assert( ( selection == NULL && selection_watcher != NULL )
240
 
        || ( selection != NULL && selection_watcher == NULL ));
241
 
    return selection == NULL;
242
 
}
243
 
 
244
 
inline
245
 
WId MenuEmbed::mainWindow() const
246
 
{
247
 
    return main_window;
248
 
}
249
 
 
250
 
inline
251
 
bool MenuEmbed::isDesktopMenu() const
252
 
{
253
 
    return desktop;
254
 
}
255
 
    
256
 
} // namespace
257
 
 
258
 
#endif