aboutsummaryrefslogtreecommitdiff
path: root/src/layouts/smart_placement.h
blob: 69f4b9443d31310f54eaf12ec4d5bdd54e3808f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#ifndef SRDWM_SMART_PLACEMENT_H
#define SRDWM_SMART_PLACEMENT_H

#include "layout.h"
#include <vector>
#include <memory>

// Forward declarations
class SRDWindow;
class Monitor;

// Smart placement algorithm that mimics SRDWindows 11 behavior
class SmartPlacement {
public:
    struct PlacementResult {
        int x, y, width, height;
        bool success;
        std::string reason;
    };

    // Main placement function
    static PlacementResult place_window(const SRDWindow* window, const Monitor& monitor, 
                                       const std::vector<SRDWindow*>& existing_windows);

    // Grid-based placement (SRDWindows 11 style)
    static PlacementResult place_in_grid(const SRDWindow* window, const Monitor& monitor,
                                        const std::vector<SRDWindow*>& existing_windows);

    // Snap-to-edge placement
    static PlacementResult snap_to_edge(const SRDWindow* window, const Monitor& monitor,
                                       const std::vector<SRDWindow*>& existing_windows);

    // Cascade placement for overlapping windows
    static PlacementResult cascade_place(const SRDWindow* window, const Monitor& monitor,
                                        const std::vector<SRDWindow*>& existing_windows);

    // Smart tiling placement
    static PlacementResult smart_tile(const SRDWindow* window, const Monitor& monitor,
                                     const std::vector<SRDWindow*>& existing_windows);

private:
    // Helper functions
    static bool windows_overlap(const SRDWindow* w1, const SRDWindow* w2);
    static int calculate_overlap_score(const SRDWindow* window, const Monitor& monitor,
                                      const std::vector<SRDWindow*>& existing_windows);
    static std::vector<std::pair<int, int>> find_free_spaces(const Monitor& monitor,
                                                             const std::vector<SRDWindow*>& existing_windows);
    static bool is_position_valid(int x, int y, int width, int height, const Monitor& monitor);
    
    // Grid calculations
    static std::pair<int, int> calculate_grid_position(const SRDWindow* window, const Monitor& monitor);
    static int calculate_optimal_grid_size(const Monitor& monitor, int window_count);
    
    // Constants
    static constexpr int MIN_WINDOW_WIDTH = 200;
    static constexpr int MIN_WINDOW_HEIGHT = 150;
    static constexpr int GRID_MARGIN = 10;
    static constexpr int CASCADE_OFFSET = 30;
};

#endif // SRDWM_SMART_PLACEMENT_H