/* Window.hh
Copyright © 2003 David Reveman.
This file is part of Waimea.
Waimea 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, or (at your option) any later
version.
Waimea 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 Waimea; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
#ifndef __Window_hh
#define __Window_hh
extern "C" {
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xmd.h>
#ifdef SHAPE
# include <X11/extensions/shape.h>
#endif // SHAPE
}
class WaWindow;
class WaFrameWindow;
class FlagMonitor;
#ifdef SHAPE
class ShapeInfo;
#endif // SHAPE
#define DeleteWindowProtocalMask (1L << 0)
#define TakeFocusProtocalMask (1L << 1)
#define FunctionMoveMask (1L << 0)
#define FunctionResizeMask (1L << 1)
#define FunctionSetDecorMask (1L << 2)
#define FunctionSetStackingMask (1L << 3)
#define FunctionDesktopMask (1L << 4)
#define FunctionMergeMask (1L << 5)
#define FunctionAllMask ((1L << 6) - 1)
#include "Style.hh"
#include "Event.hh"
#include "Net.hh"
#define MERGED_LOOP \
list<WaWindow *>::iterator __mw_it = merged.begin(); \
for (WaWindow *_mw = NULL; _mw != this && \
(_mw = (__mw_it == merged.end())? this: *__mw_it); __mw_it++)
#define ApplyGravity 1
#define RemoveGravity -1
#define NullMergeType 1
#define CloneMergeType 2
#define HorizMergeType 3
#define VertMergeType 4
#define EastResizeTypeMask (1L << 0)
#define WestResizeTypeMask (1L << 1)
#define NorthResizeTypeMask (1L << 2)
#define SouthResizeTypeMask (1L << 3)
#define DecorTitleMask (1L << 0)
#define DecorBorderMask (1L << 1)
#define DecorHandlesMask (1L << 2)
#define DecorAllMask ((1L << 3) - 1)
class FlagMonitor {
public:
FlagMonitor(AWindowObject *_monitor, long int _type) {
monitor = _monitor;
type = _type;
}
AWindowObject *monitor;
long int type;
};
typedef struct {
unsigned int max_width, max_height;
unsigned int min_width, min_height;
unsigned int width_inc, height_inc;
unsigned int base_width, base_height;
bool base_size;
double min_aspect, max_aspect;
bool aspect;
int win_gravity;
} SizeStruct;
typedef struct {
int x;
int y;
unsigned int width;
unsigned int height;
int misc0;
int misc1;
Colormap colormap;
} WaWindowAttributes;
class WaWindow : public AWindowObject {
public:
WaWindow(Window, WaScreen *);
~WaWindow(void);
void withdrawTransient(void);
void mapWindow(void);
void drawDecor(void);
void show(void);
void hide(void);
void updateAllAttributes(void);
void redrawWindow(bool = false);
void sendConfig(void);
void gravitate(int);
void updateGrabs(void);
bool incSizeCheck(int, int, unsigned int *, unsigned int *);
void _maximize(int, int);
void merge(WaWindow *, int);
void unmerge(WaWindow *);
bool checkMoveMerge(int, int, int = 0, int = 0);
void raise(void);
void lower(void);
void move(XEvent *);
void moveOpaque(XEvent *);
void resize(XEvent *, int);
void resizeOpaque(XEvent *, int);
void resizeSmart(XEvent *);
void resizeSmartOpaque(XEvent *);
void maximize(void) { _maximize(-1, -1); }
void unMaximize(void);
void toggleMaximize(void);
void close(void);
void kill(void);
void closeKill(void);
void shade(void);
void unShade(void);
void toggleShade(void);
void sticky(void);
void unSticky(void);
void toggleSticky(void);
void minimize(void);
void unMinimize(void);
void toggleMinimize(void);
void fullscreenOn(void);
void fullscreenOff(void);
void fullscreenToggle(void);
void setDecor(long);
void decorTitleOn(void) { setDecor(decormask | DecorTitleMask); }
void decorBorderOn(void) { setDecor(decormask | DecorBorderMask); }
void decorHandlesOn(void) { setDecor(decormask | DecorHandlesMask); }
void decorAllOn(void) { setDecor(DecorAllMask); }
void decorTitleOff(void) { setDecor(decormask & ~DecorTitleMask); }
void decorBorderOff(void) { setDecor(decormask & ~DecorBorderMask); }
void decorHandlesOff(void) { setDecor(decormask & ~DecorHandlesMask); }
void decorAllOff(void) { setDecor(0L); }
void decorTitleToggle(void) {
setDecor((decormask & DecorTitleMask)?
decormask & ~DecorTitleMask: decormask | DecorTitleMask);
}
void decorBorderToggle(void) {
setDecor((decormask & DecorBorderMask)?
decormask & ~DecorBorderMask: decormask | DecorBorderMask);
}
void decorHandlesToggle(void) {
setDecor((decormask & DecorHandlesMask)?
decormask & ~DecorHandlesMask: decormask | DecorHandlesMask);
}
void alwaysontopOn(void);
void alwaysatbottomOn(void);
void alwaysontopOff(void);
void alwaysatbottomOff(void);
void alwaysontopToggle(void);
void alwaysatbottomToggle(void);
void moveResize(char *);
void moveResizeVirtual(char *);
void moveWindowToPointer(XEvent *);
void moveWindowToSmartPlace(void);
void findClosestWindow(int);
void desktopMask(char *);
void joinDesktop(char *);
void partCurrentJoinDesktop(char *);
void partDesktop(char *);
void partCurrentDesktop(void);
void joinCurrentDesktop(void);
void joinAllDesktops(void);
void partAllDesktopsExceptCurrent(void);
void mergeWithWindow(char *, int);
void cloneMergeWithWindow(char *s) { mergeWithWindow(s, CloneMergeType); }
void vertMergeWithWindow(char *s) { mergeWithWindow(s, VertMergeType); }
void horizMergeWithWindow(char *s) { mergeWithWindow(s, HorizMergeType); }
void explode(void);
void toFront(void);
void mergeTo(XEvent *, int);
void cloneMergeTo(XEvent *e) { mergeTo(e, CloneMergeType); }
void vertMergeTo(XEvent *e) { mergeTo(e, VertMergeType); }
void horizMergeTo(XEvent *e) { mergeTo(e, HorizMergeType); }
void unMergeMaster(XEvent *) { if (master) master->unmerge(this); }
void setMergeMode(char *);
void nextMergeMode(void);
void prevMergeMode(void);
void windowStateCheck(bool = false);
void setWindowState(long int);
void addMonitor(AWindowObject *, long int);
void removeMonitor(AWindowObject *);
#ifdef SHAPE
void shapeEvent(void);
ShapeInfo *shapeinfo;
bool shaped;
#endif // SHAPE
char *name, *wclass, *wclassname, *host, *pid, *rid;
int realnamelen;
bool has_focus, want_focus, dontsend, deleted, hidden, init_done, remap,
mapped;
Display *display;
Waimea *waimea;
int screen_number, state, restore_shade, old_bw;
unsigned int top_spacing, bottom_spacing, left_spacing, right_spacing;
WaFrameWindow *frame;
WaWindowAttributes attrib, old_attrib, restore_max;
long int wstate, old_wstate;
SizeStruct size;
long int protocol_mask;
bool input_field;
NetHandler *net;
WMstrut *wm_strut;
Window transient_for;
bool urgent;
list<Window> transients;
unsigned int desktop_mask;
list<WaWindow *> merged;
WaWindow *master;
int mergetype, mergemode;
bool mergedback;
Window window_group;
list<FlagMonitor *> monitors;
RenderGroup *wm_icon_image, *wm_icon_svg;
long decormask;
long int functions;
int pending_unmaps;
private:
void reparentWin(void);
void initPosition(void);
void calcSpacing(void);
void drawOutline(int, int, int, int);
void clearOutline(void);
bool _moveOpaque(XEvent *, int, int, int, int, list<XEvent *> *);
void signalMonitors(void);
bool move_resize, sendcf;
bool outline_state;
int outl_x, outl_y;
unsigned int outl_w, outl_h;
};
class WaFrameWindow : public RootWindowObject {
public:
WaFrameWindow(WaWindow *, WaStringMap *);
~WaFrameWindow(void);
void styleUpdate(bool, bool);
WaWindow *wa;
WaWindowAttributes attrib;
#ifdef SHAPE
void startRender(void);
void endRender(Pixmap);
void addShapeInfo(ShapeInfo *);
void removeShapeInfo(ShapeInfo *);
void shapeUpdateNotify(void);
void applyShape(void);
Window apply_shape_buffer;
bool apply_shape;
unsigned shape_count;
list<ShapeInfo *> shape_infos;
#endif // SHAPE
};
#ifdef SHAPE
class ShapeInfo {
public:
ShapeInfo(Window);
void setShapeOffset(int, int);
Window window;
int xoff;
int yoff;
bool in_list;
};
#endif // SHAPE
#endif // __Window_hh
syntax highlighted by Code2HTML, v. 0.9.1