Hypr/src/windowManager.hpp

166 lines
5.9 KiB
C++
Raw Normal View History

#pragma once
#include "defines.hpp"
#include "window.hpp"
#include <vector>
2021-11-21 11:25:26 +01:00
#include <thread>
#include <xcb/xcb.h>
2021-11-19 20:20:05 +01:00
#include "KeybindManager.hpp"
2021-11-21 11:25:26 +01:00
#include "utilities/Workspace.hpp"
#include "bar/Bar.hpp"
2021-11-21 12:40:03 +01:00
#include "config/ConfigManager.hpp"
2021-11-21 17:40:02 +01:00
#include "utilities/Monitor.hpp"
2021-11-21 18:34:20 +01:00
#include "utilities/Util.hpp"
#include "utilities/AnimationUtil.hpp"
#include "utilities/XCBProps.hpp"
2021-11-24 21:23:14 +01:00
#include "ewmh/ewmh.hpp"
2021-11-18 22:08:28 +01:00
2021-11-20 09:25:21 +01:00
class CWindowManager {
public:
xcb_connection_t* DisplayConnection;
xcb_screen_t* Screen;
xcb_drawable_t Drawable;
uint32_t Values[3];
2021-11-21 17:40:02 +01:00
std::vector<SMonitor> monitors;
2021-11-21 15:25:57 +01:00
bool modKeyDown = false;
2021-11-22 21:20:32 +01:00
int mouseKeyDown = 0;
Vector2D mouseLastPos = Vector2D(0, 0);
int64_t actingOnWindowFloating = 0;
2021-11-21 15:25:57 +01:00
2021-11-21 11:25:26 +01:00
uint8_t Depth = 32;
xcb_visualtype_t* VisualType;
2021-11-20 09:25:21 +01:00
std::vector<CWindow> windows; // windows never left. It has always been hiding amongst us.
xcb_drawable_t LastWindow = -1;
std::vector<CWorkspace> workspaces;
2021-11-21 19:59:59 +01:00
std::vector<int> activeWorkspaces;
2021-11-21 11:25:26 +01:00
CStatusBar statusBar;
std::thread* barThread;
2021-11-21 11:25:26 +01:00
std::atomic<bool> mainThreadBusy = false;
std::atomic<bool> animationUtilBusy = false;
CWindow* getWindowFromDrawable(int64_t);
void addWindowToVectorSafe(CWindow);
void removeWindowFromVectorSafe(int64_t);
void setupManager();
bool handleEvent();
void refreshDirtyWindows();
void setFocusedWindow(xcb_drawable_t);
void calculateNewWindowParams(CWindow*);
void fixWindowOnClose(CWindow*);
2021-11-19 22:29:44 +01:00
void moveActiveWindowTo(char);
2021-11-19 23:08:59 +01:00
void warpCursorTo(Vector2D);
2021-11-20 09:25:21 +01:00
void changeWorkspaceByID(int);
void setAllWorkspaceWindowsDirtyByID(int);
2021-11-21 11:25:26 +01:00
int getHighestWorkspaceID();
CWorkspace* getWorkspaceByID(int);
2021-11-21 20:21:58 +01:00
bool isWorkspaceVisible(int workspaceID);
2021-11-21 12:40:03 +01:00
void setAllWindowsDirty();
void setAllFloatingWindowsTop();
2021-11-21 12:40:03 +01:00
2021-11-21 17:40:02 +01:00
SMonitor* getMonitorFromWindow(CWindow*);
SMonitor* getMonitorFromCursor();
2021-11-22 21:20:32 +01:00
Vector2D getCursorPos();
// finds a window that's tiled at cursor.
CWindow* findWindowAtCursor();
2021-11-23 22:15:36 +01:00
bool shouldBeFloatedOnInit(int64_t);
2021-11-21 17:40:02 +01:00
private:
2021-11-20 09:25:21 +01:00
// Internal WM functions that don't have to be exposed
2021-11-21 17:40:02 +01:00
void setupRandrMonitors();
2021-11-24 18:51:34 +01:00
void sanityCheckOnWorkspace(int);
2021-11-20 09:25:21 +01:00
CWindow* getNeighborInDir(char dir);
void eatWindow(CWindow* a, CWindow* toEat);
bool canEatWindow(CWindow* a, CWindow* toEat);
bool isNeighbor(CWindow* a, CWindow* b);
void calculateNewTileSetOldTile(CWindow* pWindow);
2021-11-21 15:15:33 +01:00
void calculateNewFloatingWindow(CWindow* pWindow);
2021-11-20 09:25:21 +01:00
void setEffectiveSizePosUsingConfig(CWindow* pWindow);
void cleanupUnusedWorkspaces();
2021-11-21 11:25:26 +01:00
xcb_visualtype_t* setupColors();
void updateBarInfo();
2021-11-20 09:25:21 +01:00
};
inline std::unique_ptr<CWindowManager> g_pWindowManager = std::make_unique<CWindowManager>();
inline std::map<std::string, int64_t> HYPRATOMS = {
HYPRATOM("_NET_SUPPORTED"),
HYPRATOM("_NET_SUPPORTING_WM_CHECK"),
HYPRATOM("_NET_WM_NAME"),
HYPRATOM("_NET_WM_VISIBLE_NAME"),
HYPRATOM("_NET_WM_MOVERESIZE"),
HYPRATOM("_NET_WM_STATE_STICKY"),
HYPRATOM("_NET_WM_STATE_FULLSCREEN"),
HYPRATOM("_NET_WM_STATE_DEMANDS_ATTENTION"),
HYPRATOM("_NET_WM_STATE_MODAL"),
HYPRATOM("_NET_WM_STATE_HIDDEN"),
HYPRATOM("_NET_WM_STATE_FOCUSED"),
HYPRATOM("_NET_WM_STATE"),
HYPRATOM("_NET_WM_WINDOW_TYPE"),
HYPRATOM("_NET_WM_WINDOW_TYPE_NORMAL"),
HYPRATOM("_NET_WM_WINDOW_TYPE_DOCK"),
HYPRATOM("_NET_WM_WINDOW_TYPE_DIALOG"),
HYPRATOM("_NET_WM_WINDOW_TYPE_UTILITY"),
HYPRATOM("_NET_WM_WINDOW_TYPE_TOOLBAR"),
HYPRATOM("_NET_WM_WINDOW_TYPE_SPLASH"),
HYPRATOM("_NET_WM_WINDOW_TYPE_MENU"),
HYPRATOM("_NET_WM_WINDOW_TYPE_DROPDOWN_MENU"),
HYPRATOM("_NET_WM_WINDOW_TYPE_POPUP_MENU"),
HYPRATOM("_NET_WM_WINDOW_TYPE_TOOLTIP"),
HYPRATOM("_NET_WM_WINDOW_TYPE_NOTIFICATION"),
HYPRATOM("_NET_WM_DESKTOP"),
HYPRATOM("_NET_WM_STRUT_PARTIAL"),
HYPRATOM("_NET_CLIENT_LIST"),
HYPRATOM("_NET_CLIENT_LIST_STACKING"),
HYPRATOM("_NET_CURRENT_DESKTOP"),
HYPRATOM("_NET_NUMBER_OF_DESKTOPS"),
HYPRATOM("_NET_DESKTOP_NAMES"),
HYPRATOM("_NET_DESKTOP_VIEWPORT"),
HYPRATOM("_NET_ACTIVE_WINDOW"),
HYPRATOM("_NET_CLOSE_WINDOW"),
HYPRATOM("_NET_MOVERESIZE_WINDOW"),
HYPRATOM("_NET_WM_USER_TIME"),
HYPRATOM("_NET_STARTUP_ID"),
HYPRATOM("_NET_WORKAREA"),
HYPRATOM("_NET_WM_ICON"),
HYPRATOM("WM_PROTOCOLS"),
HYPRATOM("WM_DELETE_WINDOW"),
HYPRATOM("UTF8_STRING"),
HYPRATOM("WM_STATE"),
HYPRATOM("WM_CLIENT_LEADER"),
HYPRATOM("WM_TAKE_FOCUS"),
HYPRATOM("WM_WINDOW_ROLE"),
HYPRATOM("I3_SOCKET_PATH"),
HYPRATOM("I3_CONFIG_PATH"),
HYPRATOM("I3_SYNC"),
HYPRATOM("I3_SHMLOG_PATH"),
HYPRATOM("I3_PID"),
HYPRATOM("I3_LOG_STREAM_SOCKET_PATH"),
HYPRATOM("I3_FLOATING_WINDOW"),
HYPRATOM("_NET_REQUEST_FRAME_EXTENTS"),
HYPRATOM("_NET_FRAME_EXTENTS"),
HYPRATOM("_MOTIF_WM_HINTS"),
HYPRATOM("WM_CHANGE_STATE"),
HYPRATOM("MANAGER")
};