> i'm sorry, i forgot to include the new error message, that was the old one. ;)
>
> i moved that all out of the class (to right after it) and how it gets me
> this error:
>
> "Window.hh", line 353: Error: state is not a member of const
> BlackboxWindow::_client.
> "Window.hh", line 358: Error: state is not a member of const
> BlackboxWindow::_client.
> "Window.hh", line 369: Error: state is not a member of const
> BlackboxWindow::_client.
> "Window.hh", line 411: Error: ClientState is not defined.
> 4 Error(s) detected.
You have to put the ClientState declaration before it is used, that
is, "right BEFORE class BlackboxWindow"! :-)
I enclose the modified Windows.hh (it compiles with gcc 4.0).
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
// Window.hh for Blackbox - an X11 Window manager
// Copyright (c) 2001 - 2005 Sean 'Shaleh' Perry <[EMAIL PROTECTED]>
// Copyright (c) 1997 - 2000, 2002 - 2005
// Bradley T Hughes <bhughes at trolltech.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
#ifndef __Window_hh
#define __Window_hh
#include "BlackboxResource.hh"
#include "Screen.hh"
#include <EWMH.hh>
enum WindowType {
WindowTypeNormal,
WindowTypeDialog,
WindowTypeDesktop,
WindowTypeDock,
WindowTypeMenu,
WindowTypeSplash,
WindowTypeToolbar,
WindowTypeUtility
};
enum WindowFunction {
WindowFunctionResize = 1<<0,
WindowFunctionMove = 1<<1,
WindowFunctionShade = 1<<2,
WindowFunctionIconify = 1<<3,
WindowFunctionMaximize = 1<<4,
WindowFunctionClose = 1<<5,
WindowFunctionChangeWorkspace = 1<<6,
WindowFunctionChangeLayer = 1<<7,
WindowFunctionFullScreen = 1<<8,
NoWindowFunctions = 0,
AllWindowFunctions = (WindowFunctionResize |
WindowFunctionMove |
WindowFunctionShade |
WindowFunctionIconify |
WindowFunctionMaximize |
WindowFunctionClose |
WindowFunctionChangeWorkspace |
WindowFunctionChangeLayer |
WindowFunctionFullScreen)
};
typedef unsigned short WindowFunctionFlags;
enum WindowDecoration {
WindowDecorationTitlebar = 1<<0,
WindowDecorationHandle = 1<<1,
WindowDecorationGrip = 1<<2,
WindowDecorationBorder = 1<<3,
WindowDecorationIconify = 1<<4,
WindowDecorationMaximize = 1<<5,
WindowDecorationClose = 1<<6,
NoWindowDecorations = 0,
AllWindowDecorations = (WindowDecorationTitlebar |
WindowDecorationHandle |
WindowDecorationGrip |
WindowDecorationBorder |
WindowDecorationIconify |
WindowDecorationMaximize |
WindowDecorationClose)
};
typedef unsigned char WindowDecorationFlags;
struct EWMH {
WindowType window_type;
unsigned int workspace;
unsigned int modal : 1;
unsigned int maxv : 1;
unsigned int maxh : 1;
unsigned int shaded : 1;
unsigned int skip_taskbar : 1;
unsigned int skip_pager : 1;
unsigned int hidden : 1;
unsigned int fullscreen : 1;
unsigned int above : 1;
unsigned int below : 1;
};
struct MotifHints {
WindowDecorationFlags decorations;
WindowFunctionFlags functions;
};
struct WMHints {
bool accept_focus;
Window window_group;
unsigned long initial_state;
};
struct WMNormalHints {
long flags;
unsigned int min_width, min_height;
unsigned int max_width, max_height;
unsigned int width_inc, height_inc;
unsigned int min_aspect_x, min_aspect_y;
unsigned int max_aspect_x, max_aspect_y;
unsigned int base_width, base_height;
unsigned int win_gravity;
};
struct WMProtocols {
unsigned int wm_delete_window : 1;
unsigned int wm_take_focus : 1;
};
struct ClientState {
unsigned int visible : 1; // is visible?
unsigned int iconic : 1; // is iconified?
unsigned int moving : 1; // is moving?
unsigned int resizing : 1; // is resizing?
unsigned int focused : 1; // has focus?
unsigned int shaped : 1; // does the frame use the shape extension?
};
class BlackboxWindow : public StackEntity, public bt::TimeoutHandler,
public bt::EventHandler, public bt::NoCopy {
Blackbox *blackbox;
BScreen *_screen;
bt::Timer *timer;
Time lastButtonPressTime; // used for double clicks, when were we clicked
unsigned int window_number;
struct _client {
Window window; // the client's window
Colormap colormap;
Window transient_for; // which window are we a transient for?
BlackboxWindowList transientList; // which windows are our transients?
bt::ustring title, visible_title, icon_title;
bt::Rect rect, premax;
int old_bw; // client's borderwidth
unsigned long current_state;
bt::EWMH::Strut *strut;
WindowFunctionFlags functions;
WindowDecorationFlags decorations;
ClientState state;
EWMH ewmh;
MotifHints motif;
WMHints wmhints;
WMNormalHints wmnormal;
WMProtocols wmprotocols;
} client;
/*
* client window = the application's window
* frame window = the window drawn around the outside of the client window
* by the window manager which contains items like the
* titlebar and close button
* title = the titlebar drawn above the client window, it displays the
* window's name and any buttons for interacting with the window,
* such as iconify, maximize, and close
* label = the window in the titlebar where the title is drawn
* buttons = maximize, iconify, close
* handle = the bar drawn at the bottom of the window, which contains the
* left and right grips used for resizing the window
* grips = the smaller reactangles in the handle, one of each side of it.
* When clicked and dragged, these resize the window interactively
* border = the line drawn around the outside edge of the frame window,
* between the title, the bordered client window, and the handle.
* Also drawn between the grips and the handle
*/
struct _frame {
// u -> unfocused, f -> has focus
Pixmap ulabel, flabel, utitle, ftitle, uhandle, fhandle,
ubutton, fbutton, pbutton, ugrip, fgrip;
Window window, // the frame
plate, // holds the client
title,
label,
handle,
close_button, iconify_button, maximize_button,
right_grip, left_grip;
// frame geometry
bt::Rect rect;
// used during move/resize
bt::Rect changing;
int corner;
/*
* margins between the frame and client, this has nothing to do
* with EWMH, it is simply code reuse for similar functionality
*/
bt::EWMH::Strut margin;
int grab_x, grab_y; // where was the window when it was grabbed?
unsigned int label_w; // width of the label
} frame;
Window createToplevelWindow();
Window createChildWindow(Window parent, unsigned long event_mask,
Cursor = None);
void associateClientWindow(void);
void decorate(void);
void positionButtons(bool redecorate_label = false);
void positionWindows(void);
void createTitlebar(void);
void destroyTitlebar(void);
void createHandle(void);
void destroyHandle(void);
void createGrips(void);
void destroyGrips(void);
void createIconifyButton(void);
void destroyIconifyButton(void);
void createMaximizeButton(void);
void destroyMaximizeButton(void);
void createCloseButton(void);
void destroyCloseButton(void);
void redrawWindowFrame(void) const;
void redrawTitle(void) const;
void redrawLabel(void) const;
void redrawAllButtons(void) const;
void redrawCloseButton(bool pressed = false) const;
void redrawIconifyButton(bool pressed = false) const;
void redrawMaximizeButton(bool pressed = false) const;
void redrawHandle(void) const;
void redrawGrips(void) const;
void setState(unsigned long new_state);
void updateEWMHState();
void updateEWMHAllowedActions();
void startMove();
void continueMove(int x_root, int y_root);
void finishMove();
void startResize(Window window);
void continueResize(int x_root, int y_root);
void finishResize();
void showGeometry(const bt::Rect &r) const;
public:
BlackboxWindow(Blackbox *b, Window w, BScreen *s);
virtual ~BlackboxWindow(void);
inline bool isTransient(void) const
{ return client.transient_for != 0; }
inline bool isGroupTransient(void) const
{ return (client.transient_for != 0
&& client.transient_for == client.wmhints.window_group); }
inline bool isModal(void) const
{ return client.ewmh.modal; }
inline WindowType windowType(void) const
{ return client.ewmh.window_type; }
inline bool hasWindowFunction(WindowFunction function) const
{ return client.functions & function; }
inline bool hasWindowDecoration(WindowDecoration decoration) const
{ return client.decorations & decoration; }
// ordered newest to oldest
inline const BlackboxWindowList &transients(void) const
{ return client.transientList; }
void addTransient(BlackboxWindow *win);
void removeTransient(BlackboxWindow *win);
BlackboxWindow *findTransientFor(void) const;
BlackboxWindow *findNonTransientParent(void) const;
BlackboxWindowList buildFullTransientList(void) const;
BWindowGroup *findWindowGroup(void) const;
inline BScreen *screen(void) const
{ return _screen; }
// StackEntity interface
inline Window windowID(void) const
{ return frame.window; }
inline Window frameWindow(void) const
{ return frame.window; }
inline Window clientWindow(void) const
{ return client.window; }
inline const bt::ustring &title(void) const
{ return client.title; }
inline const bt::ustring &iconTitle(void) const
{ return client.icon_title.empty() ? client.title : client.icon_title; }
inline unsigned int workspace(void) const
{ return client.ewmh.workspace; }
void setWorkspace(unsigned int new_workspace);
enum ChangeWorkspaceOption {
StayOnCurrentWorkspace,
SwitchToNewWorkspace
};
void changeWorkspace(unsigned int new_workspace,
ChangeWorkspaceOption how = StayOnCurrentWorkspace);
void changeLayer(StackingList::Layer new_layer);
inline unsigned int windowNumber(void) const
{ return window_number; }
inline void setWindowNumber(int n)
{ window_number = n; }
inline const bt::Rect &frameRect(void) const
{ return frame.rect; }
inline const bt::Rect &clientRect(void) const
{ return client.rect; }
const WMHints &wmHints(void) const
{ return client.wmhints; }
const WMNormalHints &wmNormalHints(void) const
{ return client.wmnormal; }
const WMProtocols &wmProtocols(void) const
{ return client.wmprotocols; }
unsigned long currentState(void) const
{ return client.current_state; }
inline bool isFocused(void) const
{ return client.state.focused; }
void setFocused(bool focused);
bool setInputFocus(void);
inline bool isVisible(void) const
{ return client.state.visible; }
void show(void);
void hide(void);
void close(void);
void activate(void);
inline bool isShaded(void) const
{ return client.ewmh.shaded; }
void setShaded(bool shaded);
inline bool isIconic(void) const
{ return client.state.iconic; }
void iconify(void); // call show() to deiconify
inline bool isMaximized(void) const
{ return client.ewmh.maxh || client.ewmh.maxv; }
// ### change to setMaximized()?
void maximize(unsigned int button);
void remaximize(void);
inline bool isFullScreen(void) const
{ return client.ewmh.fullscreen; }
void setFullScreen(bool b);
void reconfigure(void);
void grabButtons(void);
void ungrabButtons(void);
void restore(void);
void configure(int dx, int dy, unsigned int dw, unsigned int dh);
inline void configure(const bt::Rect &r)
{ configure(r.x(), r.y(), r.width(), r.height()); }
void clientMessageEvent(const XClientMessageEvent * const ce);
void buttonPressEvent(const XButtonEvent * const be);
void buttonReleaseEvent(const XButtonEvent * const re);
void motionNotifyEvent(const XMotionEvent * const me);
void destroyNotifyEvent(const XDestroyWindowEvent * const /*unused*/);
void unmapNotifyEvent(const XUnmapEvent * const /*unused*/);
void reparentNotifyEvent(const XReparentEvent * const /*unused*/);
void propertyNotifyEvent(const XPropertyEvent * const pe);
void exposeEvent(const XExposeEvent * const ee);
void configureRequestEvent(const XConfigureRequestEvent * const cr);
void enterNotifyEvent(const XCrossingEvent * const ce);
void leaveNotifyEvent(const XCrossingEvent * const /*unused*/);
#ifdef SHAPE
void configureShape(void);
void shapeEvent(const XEvent * const /*unused*/);
#endif // SHAPE
virtual void timeout(bt::Timer *);
};
#endif // __Window_hh