winamp/Src/Wasabi/api/wnd/wndtrack.h
2024-09-24 14:54:57 +02:00

104 lines
3 KiB
C++

#ifndef __WNDTRACK_H
#define __WNDTRACK_H
#include "cwndtrack.h"
#include <bfc/tlist.h>
#include <bfc/ptrlist.h>
#include <api/wndmgr/layout.h>
class ifc_window;
#define WNDTRACKCB_POPUPEXIT 0x8797
#define WNDTRACKCB_POPUPEXITALL 0x8798
const int DEFAULT_DOCK_DIST=10;
const int MIN_DOCK_DIST=1;
const int MAX_DOCK_DIST=64;
class coopEntry {
public:
coopEntry(ifc_window *w, int lock=0) : wnd(w), locked(lock) {}
~coopEntry() {}
ifc_window *wnd;
int locked;
};
#ifndef _REDOCK_STRUCT_DEFINED
#define _REDOCK_STRUCT_DEFINED
typedef struct {
Layout *l;
RECT original_rect;
} redock_struct;
#endif
class WindowTracker {
public:
WindowTracker();
~WindowTracker();
void addWindow(ifc_window *wnd);
void removeWindow(ifc_window *wnd);
int checkWindow(ifc_window *wnd);
ifc_window *enumWindows(int n);
int getNumWindows();
ifc_window *enumAllWindows(int n);
int getNumAllWindows();
bool autoDock(ifc_window *thiswnd, RECT *newPosition, int mask);
bool autoDock(ifc_window *thiswnd, RECT *newPosition, RECT *oldPosition, int mask);
static bool touches(const RECT &z, const RECT &r);
RECT findOpenRect(const RECT &prev, ifc_window *exclude=NULL);
static void setDockDistance(int dd);
static int getDockDistance();
static void setEnableDocking(int ed);
void startCooperativeMove(ifc_window *wnd);
void endCooperativeMove();
int wasCooperativeMove();
void invalidateAllWindows();
int getNumDocked();
ifc_window *enumDocked(int n);
static void addRootWnd(ifc_window *wnd);
static void removeRootWnd(ifc_window *wnd);
static ifc_window *rootWndFromPoint(POINT *pt);
static ifc_window *rootWndFromHwnd(OSWINDOWHANDLE h);
static void layoutChanged(Layout *previouswnd, Layout *newwnd); // re-dock windows when changing layout
static void beforeRedock(Layout *l, redock_struct *rs);
static void afterRedock(Layout *l, redock_struct *rs);
static ifc_window *getNextDesktopWindow(ifc_window *w, int next);
static void snapAdjustWindowRect(ifc_window *w, RECT *r, RECT *adjustvals=NULL);
static void unsnapAdjustWindowRect(ifc_window *w, RECT *r, RECT *adjustvals=NULL);
private:
void addCooperative(ifc_window *thiswnd);
void addCoopWnd(ifc_window *w, int forced=0);
int hasCoopWnd(ifc_window *w);
void flushCoopWnds();
static void recursAddToMoveWindows(ifc_window *wnd, redock_struct *rs, int v=-1); // used by layoutChanged()
static PtrList<ifc_window> desktopwnds;
static PtrList<ifc_window> nonvirtuals;
static PtrList<coopEntry> coopList;
static PtrList<ifc_window> recursList;
static ifc_window *coopWnd;
static PtrList<ifc_window> allWnd;
static PtrList<ifc_window> tomoveWindows_top;
static PtrList<ifc_window> tomoveWindows_left;
static PtrList<ifc_window> tomoveWindows_bottom;
static PtrList<ifc_window> tomoveWindows_right;
static int dockDist;
static int dock_enabled;
int wascoop;
int disabledock;
ifc_window *coopcachewnd;
int coopcache;
};
extern WindowTracker *windowTracker;
#endif