mirror of
https://github.com/Trensa-Organization/hy3.git
synced 2025-03-15 18:53:40 +01:00
Merge https://github.com/outfoxxed/hy3 into outfoxxed-master
This commit is contained in:
commit
8f3dd6016d
10 changed files with 180 additions and 143 deletions
20
.gitignore
vendored
20
.gitignore
vendored
|
@ -1,4 +1,16 @@
|
||||||
build/
|
# build
|
||||||
compile_commands.json
|
/result
|
||||||
.vscode/
|
/build/
|
||||||
*.log
|
/compile_commands.json
|
||||||
|
|
||||||
|
# clangd
|
||||||
|
/.cache
|
||||||
|
|
||||||
|
# direnv
|
||||||
|
/.envrc
|
||||||
|
/.direnv/
|
||||||
|
|
||||||
|
# vscode
|
||||||
|
/.vscode/
|
||||||
|
|
||||||
|
/*.log
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## Upcoming
|
## hl0.36.0 and before
|
||||||
|
|
||||||
- Implement `resizeactivewindow` for floating windows
|
- Implement `resizeactivewindow` for floating windows
|
||||||
- Fully implement `resizeactivewindow` for tiled windows
|
- Fully implement `resizeactivewindow` for tiled windows
|
||||||
|
|
51
default.nix
Normal file
51
default.nix
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
{
|
||||||
|
hyprland,
|
||||||
|
|
||||||
|
lib,
|
||||||
|
nix-gitignore,
|
||||||
|
keepDebugInfo,
|
||||||
|
stdenv ? (keepDebugInfo hyprland.stdenv),
|
||||||
|
|
||||||
|
cmake,
|
||||||
|
ninja,
|
||||||
|
pkg-config,
|
||||||
|
pango,
|
||||||
|
cairo,
|
||||||
|
|
||||||
|
debug ? false,
|
||||||
|
hlversion ? "git",
|
||||||
|
versionCheck ? true,
|
||||||
|
}: stdenv.mkDerivation {
|
||||||
|
pname = "hy3";
|
||||||
|
version = "hl${hlversion}${lib.optionalString debug "-debug"}";
|
||||||
|
src = nix-gitignore.gitignoreSource [] ./.;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
cmake
|
||||||
|
ninja
|
||||||
|
pkg-config
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
hyprland.dev
|
||||||
|
pango
|
||||||
|
cairo
|
||||||
|
] ++ hyprland.buildInputs;
|
||||||
|
|
||||||
|
cmakeFlags = lib.optional (!versionCheck) "-DHY3_NO_VERSION_CHECK=ON";
|
||||||
|
|
||||||
|
cmakeBuildType = if debug
|
||||||
|
then "Debug"
|
||||||
|
else "RelWithDebInfo";
|
||||||
|
|
||||||
|
buildPhase = "ninjaBuildPhase";
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
dontStrip = true;
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
homepage = "https://github.com/outfoxxed/hy3";
|
||||||
|
description = "Hyprland plugin for an i3 like manual tiling layout";
|
||||||
|
license = licenses.gpl3;
|
||||||
|
platforms = platforms.linux;
|
||||||
|
};
|
||||||
|
}
|
53
flake.lock
generated
53
flake.lock
generated
|
@ -10,11 +10,11 @@
|
||||||
"xdph": "xdph"
|
"xdph": "xdph"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1708650152,
|
"lastModified": 1709720053,
|
||||||
"narHash": "sha256-OZUS5FED7KKAPpNaJYQr4BPGXQzGrDFgkKVg9U2aZh8=",
|
"narHash": "sha256-hR0RSeqFOXCggqbGhkFZT3ZAbGc2cAoeeyXU3V5J4hU=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "Hyprland",
|
"repo": "Hyprland",
|
||||||
"rev": "8c3613632a6ccebf9fb797ec756ecfce99514eec",
|
"rev": "d6f1b151b2fe85ffbb131cbdd05acefc6a357e81",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -53,36 +53,18 @@
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"hyprland",
|
"hyprland",
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
]
|
],
|
||||||
},
|
"systems": [
|
||||||
"locked": {
|
|
||||||
"lastModified": 1708005943,
|
|
||||||
"narHash": "sha256-9TT3xk++LI5/SPYgjYX34xZ4ebR93c1uerIq+SE/ues=",
|
|
||||||
"owner": "hyprwm",
|
|
||||||
"repo": "hyprlang",
|
|
||||||
"rev": "aeb3e012adc7b3235335c540b214b82267c2b983",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "hyprwm",
|
|
||||||
"repo": "hyprlang",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"hyprlang_2": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"hyprland",
|
"hyprland",
|
||||||
"xdph",
|
"systems"
|
||||||
"nixpkgs"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1704287638,
|
"lastModified": 1708787654,
|
||||||
"narHash": "sha256-TuRXJGwtK440AXQNl5eiqmQqY4LZ/9+z/R7xC0ie3iA=",
|
"narHash": "sha256-7ACgM3ZuAhPqurXHUvR2nWMRcnmzGGPjLK6q4DSTelI=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprlang",
|
"repo": "hyprlang",
|
||||||
"rev": "6624f2bb66d4d27975766e81f77174adbe58ec97",
|
"rev": "0fce791ba2334aca183f2ed42399518947550d0d",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -93,11 +75,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1707546158,
|
"lastModified": 1708807242,
|
||||||
"narHash": "sha256-nYYJTpzfPMDxI8mzhQsYjIUX+grorqjKEU9Np6Xwy/0=",
|
"narHash": "sha256-sRTRkhMD4delO/hPxxi+XwLqPn8BuUq6nnj4JqLwOu0=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "d934204a0f8d9198e1e4515dd6fec76a139c87f0",
|
"rev": "73de017ef2d18a04ac4bfd0c02650007ccb31c2a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -152,7 +134,10 @@
|
||||||
"hyprland",
|
"hyprland",
|
||||||
"hyprland-protocols"
|
"hyprland-protocols"
|
||||||
],
|
],
|
||||||
"hyprlang": "hyprlang_2",
|
"hyprlang": [
|
||||||
|
"hyprland",
|
||||||
|
"hyprlang"
|
||||||
|
],
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"hyprland",
|
"hyprland",
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
|
@ -163,11 +148,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1706521509,
|
"lastModified": 1708696469,
|
||||||
"narHash": "sha256-AInZ50acOJ3wzUwGzNr1TmxGTMx+8j6oSTzz4E7Vbp8=",
|
"narHash": "sha256-shh5wmpeYy3MmsBfkm4f76yPsBDGk6OLYRVG+ARy2F0=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "xdg-desktop-portal-hyprland",
|
"repo": "xdg-desktop-portal-hyprland",
|
||||||
"rev": "c06fd88b3da492b8f9067be021b9184f7012b5a8",
|
"rev": "1b713911c2f12b96c2574474686e4027ac4bf826",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
57
flake.nix
57
flake.nix
|
@ -5,51 +5,32 @@
|
||||||
|
|
||||||
outputs = { self, hyprland, ... }: let
|
outputs = { self, hyprland, ... }: let
|
||||||
inherit (hyprland.inputs) nixpkgs;
|
inherit (hyprland.inputs) nixpkgs;
|
||||||
hyprlandSystems = fn: nixpkgs.lib.genAttrs (builtins.attrNames hyprland.packages) (system: fn system nixpkgs.legacyPackages.${system});
|
|
||||||
|
hyprlandSystems = fn: nixpkgs.lib.genAttrs
|
||||||
|
(builtins.attrNames hyprland.packages)
|
||||||
|
(system: fn system nixpkgs.legacyPackages.${system});
|
||||||
|
|
||||||
|
props = builtins.fromJSON (builtins.readFile "${hyprland}/props.json");
|
||||||
in {
|
in {
|
||||||
packages = hyprlandSystems (system: pkgs: let
|
packages = hyprlandSystems (system: pkgs: rec {
|
||||||
hyprlandPackage = hyprland.packages.${system}.hyprland;
|
hy3 = pkgs.callPackage ./default.nix {
|
||||||
in rec {
|
hyprland = hyprland.packages.${system}.hyprland;
|
||||||
hy3 = (pkgs.keepDebugInfo hyprlandPackage.stdenv).mkDerivation {
|
hlversion = props.version;
|
||||||
pname = "hy3";
|
|
||||||
version = "0.1";
|
|
||||||
src = ./.;
|
|
||||||
|
|
||||||
nativeBuildInputs = with pkgs; [ cmake pkg-config ];
|
|
||||||
|
|
||||||
buildInputs = with pkgs; [
|
|
||||||
hyprlandPackage.dev
|
|
||||||
pango
|
|
||||||
cairo
|
|
||||||
] ++ hyprlandPackage.buildInputs;
|
|
||||||
|
|
||||||
# no noticeable impact on performance and greatly assists debugging
|
|
||||||
cmakeBuildType = "Debug";
|
|
||||||
dontStrip = true;
|
|
||||||
|
|
||||||
meta = with pkgs.lib; {
|
|
||||||
homepage = "https://github.com/outfoxxed/hy3";
|
|
||||||
description = "Hyprland plugin for an i3 / sway like manual tiling layout";
|
|
||||||
license = licenses.gpl3;
|
|
||||||
platforms = platforms.linux;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
default = hy3;
|
default = hy3;
|
||||||
});
|
});
|
||||||
|
|
||||||
devShells = hyprlandSystems (system: pkgs: {
|
devShells = hyprlandSystems (system: pkgs: {
|
||||||
default = pkgs.mkShell.override {
|
default = import ./shell.nix {
|
||||||
stdenv = pkgs.gcc13Stdenv;
|
inherit pkgs;
|
||||||
} {
|
hlversion = props.version;
|
||||||
name = "hy3";
|
hyprland = hyprland.packages.${system}.hyprland-debug;
|
||||||
|
};
|
||||||
|
|
||||||
nativeBuildInputs = with pkgs; [
|
impure = import ./shell.nix {
|
||||||
clang-tools_17
|
pkgs = import <nixpkgs> {};
|
||||||
bear
|
hlversion = props.version;
|
||||||
];
|
hyprland = (pkgs.appendOverlays [ hyprland.overlays.hyprland-packages ]).hyprland-debug;
|
||||||
|
|
||||||
inputsFrom = [ self.packages.${system}.hy3 ];
|
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -7,6 +7,6 @@ description = "i3 like tiling for hyprland"
|
||||||
authors = ["outfoxxed, DRAGONTOS"]
|
authors = ["outfoxxed, DRAGONTOS"]
|
||||||
output = "build/libhy3.so"
|
output = "build/libhy3.so"
|
||||||
build = [
|
build = [
|
||||||
"cmake -DCMAKE_BUILD_TYPE=Release -B build",
|
"cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -B build",
|
||||||
"cmake --build build"
|
"cmake --build build"
|
||||||
]
|
]
|
||||||
|
|
16
shell.nix
Normal file
16
shell.nix
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
hyprland,
|
||||||
|
pkgs,
|
||||||
|
hlversion ? "git",
|
||||||
|
hy3 ? pkgs.callPackage ./default.nix {
|
||||||
|
inherit hyprland hlversion;
|
||||||
|
versionCheck = false;
|
||||||
|
},
|
||||||
|
}: pkgs.mkShell {
|
||||||
|
inputsFrom = [ hy3 ];
|
||||||
|
|
||||||
|
nativeBuildInputs = with pkgs; [
|
||||||
|
clang-tools_17
|
||||||
|
bear
|
||||||
|
];
|
||||||
|
}
|
|
@ -505,8 +505,8 @@ void Hy3Layout::resizeActiveWindow(const Vector2D& delta, eRectCorner corner, CW
|
||||||
if (window->m_bIsFloating) {
|
if (window->m_bIsFloating) {
|
||||||
// Use the same logic as the `main` layout for floating windows
|
// Use the same logic as the `main` layout for floating windows
|
||||||
const auto required_size = Vector2D(
|
const auto required_size = Vector2D(
|
||||||
std::max((window->m_vRealSize.goalv() + delta).x, 20.0),
|
std::max((window->m_vRealSize.goal() + delta).x, 20.0),
|
||||||
std::max((window->m_vRealSize.goalv() + delta).y, 20.0)
|
std::max((window->m_vRealSize.goal() + delta).y, 20.0)
|
||||||
);
|
);
|
||||||
window->m_vRealSize = required_size;
|
window->m_vRealSize = required_size;
|
||||||
g_pXWaylandManager->setWindowSize(window, required_size);
|
g_pXWaylandManager->setWindowSize(window, required_size);
|
||||||
|
@ -556,10 +556,10 @@ void Hy3Layout::fullscreenRequestForWindow(
|
||||||
|
|
||||||
// save position and size if floating
|
// save position and size if floating
|
||||||
if (window->m_bIsFloating) {
|
if (window->m_bIsFloating) {
|
||||||
window->m_vLastFloatingPosition = window->m_vRealPosition.goalv();
|
window->m_vLastFloatingPosition = window->m_vRealPosition.goal();
|
||||||
window->m_vPosition = window->m_vRealPosition.goalv();
|
window->m_vPosition = window->m_vRealPosition.goal();
|
||||||
window->m_vLastFloatingSize = window->m_vRealSize.goalv();
|
window->m_vLastFloatingSize = window->m_vRealSize.goal();
|
||||||
window->m_vSize = window->m_vRealSize.goalv();
|
window->m_vSize = window->m_vRealSize.goal();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fullscreen_mode == FULLSCREEN_FULL) {
|
if (fullscreen_mode == FULLSCREEN_FULL) {
|
||||||
|
@ -599,7 +599,7 @@ void Hy3Layout::fullscreenRequestForWindow(
|
||||||
}
|
}
|
||||||
|
|
||||||
g_pCompositor->updateWindowAnimatedDecorationValues(window);
|
g_pCompositor->updateWindowAnimatedDecorationValues(window);
|
||||||
g_pXWaylandManager->setWindowSize(window, window->m_vRealSize.goalv());
|
g_pXWaylandManager->setWindowSize(window, window->m_vRealSize.goal());
|
||||||
g_pCompositor->changeWindowZOrder(window, true);
|
g_pCompositor->changeWindowZOrder(window, true);
|
||||||
this->recalculateMonitor(monitor->ID);
|
this->recalculateMonitor(monitor->ID);
|
||||||
}
|
}
|
||||||
|
@ -1501,14 +1501,14 @@ Hy3Node* findTabBarAt(Hy3Node& node, Vector2D pos, Hy3Node** focused_node) {
|
||||||
auto& children = node.data.as_group.children;
|
auto& children = node.data.as_group.children;
|
||||||
auto& tab_bar = *node.data.as_group.tab_bar;
|
auto& tab_bar = *node.data.as_group.tab_bar;
|
||||||
|
|
||||||
auto size = tab_bar.size.vec();
|
auto size = tab_bar.size.value();
|
||||||
auto x = pos.x - tab_bar.pos.vec().x;
|
auto x = pos.x - tab_bar.pos.value().x;
|
||||||
auto child_iter = children.begin();
|
auto child_iter = children.begin();
|
||||||
|
|
||||||
for (auto& tab: tab_bar.bar.entries) {
|
for (auto& tab: tab_bar.bar.entries) {
|
||||||
if (child_iter == children.end()) break;
|
if (child_iter == children.end()) break;
|
||||||
|
|
||||||
if (x > tab.offset.fl() * size.x && x < (tab.offset.fl() + tab.width.fl()) * size.x) {
|
if (x > tab.offset.value() * size.x && x < (tab.offset.value() + tab.width.value()) * size.x) {
|
||||||
*focused_node = *child_iter;
|
*focused_node = *child_iter;
|
||||||
return &node;
|
return &node;
|
||||||
}
|
}
|
||||||
|
@ -1732,7 +1732,7 @@ fullscreen:
|
||||||
// goto fsupdate;
|
// goto fsupdate;
|
||||||
fsupdate:
|
fsupdate:
|
||||||
g_pCompositor->updateWindowAnimatedDecorationValues(window);
|
g_pCompositor->updateWindowAnimatedDecorationValues(window);
|
||||||
g_pXWaylandManager->setWindowSize(window, window->m_vRealSize.goalv());
|
g_pXWaylandManager->setWindowSize(window, window->m_vRealSize.goal());
|
||||||
g_pCompositor->changeWindowZOrder(window, true);
|
g_pCompositor->changeWindowZOrder(window, true);
|
||||||
this->recalculateMonitor(monitor->ID);
|
this->recalculateMonitor(monitor->ID);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
|
|
||||||
Hy3TabBarEntry::Hy3TabBarEntry(Hy3TabBar& tab_bar, Hy3Node& node): tab_bar(tab_bar), node(node) {
|
Hy3TabBarEntry::Hy3TabBarEntry(Hy3TabBar& tab_bar, Hy3Node& node): tab_bar(tab_bar), node(node) {
|
||||||
this->focused.create(
|
this->focused.create(
|
||||||
AVARTYPE_FLOAT,
|
|
||||||
0.0f,
|
0.0f,
|
||||||
g_pConfigManager->getAnimationPropertyConfig("fadeSwitch"),
|
g_pConfigManager->getAnimationPropertyConfig("fadeSwitch"),
|
||||||
nullptr,
|
nullptr,
|
||||||
|
@ -20,7 +19,6 @@ Hy3TabBarEntry::Hy3TabBarEntry(Hy3TabBar& tab_bar, Hy3Node& node): tab_bar(tab_b
|
||||||
);
|
);
|
||||||
|
|
||||||
this->urgent.create(
|
this->urgent.create(
|
||||||
AVARTYPE_FLOAT,
|
|
||||||
0.0f,
|
0.0f,
|
||||||
g_pConfigManager->getAnimationPropertyConfig("fadeSwitch"),
|
g_pConfigManager->getAnimationPropertyConfig("fadeSwitch"),
|
||||||
nullptr,
|
nullptr,
|
||||||
|
@ -28,7 +26,6 @@ Hy3TabBarEntry::Hy3TabBarEntry(Hy3TabBar& tab_bar, Hy3Node& node): tab_bar(tab_b
|
||||||
);
|
);
|
||||||
|
|
||||||
this->offset.create(
|
this->offset.create(
|
||||||
AVARTYPE_FLOAT,
|
|
||||||
-1.0f,
|
-1.0f,
|
||||||
g_pConfigManager->getAnimationPropertyConfig("windowsMove"),
|
g_pConfigManager->getAnimationPropertyConfig("windowsMove"),
|
||||||
nullptr,
|
nullptr,
|
||||||
|
@ -36,7 +33,6 @@ Hy3TabBarEntry::Hy3TabBarEntry(Hy3TabBar& tab_bar, Hy3Node& node): tab_bar(tab_b
|
||||||
);
|
);
|
||||||
|
|
||||||
this->width.create(
|
this->width.create(
|
||||||
AVARTYPE_FLOAT,
|
|
||||||
-1.0f,
|
-1.0f,
|
||||||
g_pConfigManager->getAnimationPropertyConfig("windowsMove"),
|
g_pConfigManager->getAnimationPropertyConfig("windowsMove"),
|
||||||
nullptr,
|
nullptr,
|
||||||
|
@ -44,7 +40,6 @@ Hy3TabBarEntry::Hy3TabBarEntry(Hy3TabBar& tab_bar, Hy3Node& node): tab_bar(tab_b
|
||||||
);
|
);
|
||||||
|
|
||||||
this->vertical_pos.create(
|
this->vertical_pos.create(
|
||||||
AVARTYPE_FLOAT,
|
|
||||||
1.0f,
|
1.0f,
|
||||||
g_pConfigManager->getAnimationPropertyConfig("windowsIn"),
|
g_pConfigManager->getAnimationPropertyConfig("windowsIn"),
|
||||||
nullptr,
|
nullptr,
|
||||||
|
@ -52,7 +47,6 @@ Hy3TabBarEntry::Hy3TabBarEntry(Hy3TabBar& tab_bar, Hy3Node& node): tab_bar(tab_b
|
||||||
);
|
);
|
||||||
|
|
||||||
this->fade_opacity.create(
|
this->fade_opacity.create(
|
||||||
AVARTYPE_FLOAT,
|
|
||||||
0.0f,
|
0.0f,
|
||||||
g_pConfigManager->getAnimationPropertyConfig("windowsIn"),
|
g_pConfigManager->getAnimationPropertyConfig("windowsIn"),
|
||||||
nullptr,
|
nullptr,
|
||||||
|
@ -89,14 +83,14 @@ bool Hy3TabBarEntry::operator==(const Hy3TabBarEntry& entry) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Hy3TabBarEntry::setFocused(bool focused) {
|
void Hy3TabBarEntry::setFocused(bool focused) {
|
||||||
if (this->focused.goalf() != focused) {
|
if (this->focused.goal() != focused) {
|
||||||
this->focused = focused;
|
this->focused = focused;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Hy3TabBarEntry::setUrgent(bool urgent) {
|
void Hy3TabBarEntry::setUrgent(bool urgent) {
|
||||||
if (urgent && this->focused.goalf() == 1.0) urgent = false;
|
if (urgent && this->focused.goal() == 1.0) urgent = false;
|
||||||
if (this->urgent.goalf() != urgent) {
|
if (this->urgent.goal() != urgent) {
|
||||||
this->urgent = urgent;
|
this->urgent = urgent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,7 +115,7 @@ void Hy3TabBarEntry::unDestroy() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Hy3TabBarEntry::shouldRemove() {
|
bool Hy3TabBarEntry::shouldRemove() {
|
||||||
return this->destroying && (this->vertical_pos.fl() == 1.0 || this->width.fl() == 0.0);
|
return this->destroying && (this->vertical_pos.value() == 1.0 || this->width.value() == 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Hy3TabBarEntry::prepareTexture(float scale, CBox& box) {
|
void Hy3TabBarEntry::prepareTexture(float scale, CBox& box) {
|
||||||
|
@ -149,8 +143,8 @@ void Hy3TabBarEntry::prepareTexture(float scale, CBox& box) {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
|| this->last_render.x != box.x
|
|| this->last_render.x != box.x
|
||||||
|| this->last_render.y != box.y
|
|| this->last_render.y != box.y
|
||||||
|| this->last_render.focused != this->focused.fl()
|
|| this->last_render.focused != this->focused.value()
|
||||||
|| this->last_render.urgent != this->urgent.fl()
|
|| this->last_render.urgent != this->urgent.value()
|
||||||
|| this->last_render.window_title != this->window_title
|
|| this->last_render.window_title != this->window_title
|
||||||
|| this->last_render.rounding != rounding
|
|| this->last_render.rounding != rounding
|
||||||
|| this->last_render.text_font != *text_font
|
|| this->last_render.text_font != *text_font
|
||||||
|
@ -167,8 +161,8 @@ void Hy3TabBarEntry::prepareTexture(float scale, CBox& box) {
|
||||||
{
|
{
|
||||||
this->last_render.x = box.x;
|
this->last_render.x = box.x;
|
||||||
this->last_render.y = box.y;
|
this->last_render.y = box.y;
|
||||||
this->last_render.focused = this->focused.fl();
|
this->last_render.focused = this->focused.value();
|
||||||
this->last_render.urgent = this->urgent.fl();
|
this->last_render.urgent = this->urgent.value();
|
||||||
this->last_render.window_title = this->window_title;
|
this->last_render.window_title = this->window_title;
|
||||||
this->last_render.rounding = rounding;
|
this->last_render.rounding = rounding;
|
||||||
this->last_render.text_font = *text_font;
|
this->last_render.text_font = *text_font;
|
||||||
|
@ -191,8 +185,8 @@ void Hy3TabBarEntry::prepareTexture(float scale, CBox& box) {
|
||||||
cairo_restore(cairo);
|
cairo_restore(cairo);
|
||||||
|
|
||||||
// set brush
|
// set brush
|
||||||
auto focused = this->focused.fl();
|
auto focused = this->focused.value();
|
||||||
auto urgent = this->urgent.fl();
|
auto urgent = this->urgent.value();
|
||||||
auto inactive = 1.0 - (focused + urgent);
|
auto inactive = 1.0 - (focused + urgent);
|
||||||
auto c = (CColor(*col_active) * focused) + (CColor(*col_urgent) * urgent)
|
auto c = (CColor(*col_active) * focused) + (CColor(*col_urgent) * urgent)
|
||||||
+ (CColor(*col_inactive) * inactive);
|
+ (CColor(*col_inactive) * inactive);
|
||||||
|
@ -278,7 +272,6 @@ void Hy3TabBarEntry::prepareTexture(float scale, CBox& box) {
|
||||||
|
|
||||||
Hy3TabBar::Hy3TabBar() {
|
Hy3TabBar::Hy3TabBar() {
|
||||||
this->fade_opacity.create(
|
this->fade_opacity.create(
|
||||||
AVARTYPE_FLOAT,
|
|
||||||
1.0f,
|
1.0f,
|
||||||
g_pConfigManager->getAnimationPropertyConfig("windowsMove"),
|
g_pConfigManager->getAnimationPropertyConfig("windowsMove"),
|
||||||
nullptr,
|
nullptr,
|
||||||
|
@ -396,29 +389,30 @@ void Hy3TabBar::updateAnimations(bool warp) {
|
||||||
auto entry = this->entries.begin();
|
auto entry = this->entries.begin();
|
||||||
while (entry != this->entries.end()) {
|
while (entry != this->entries.end()) {
|
||||||
if (warp) {
|
if (warp) {
|
||||||
if (entry->width.goalf() == 0.0) {
|
if (entry->width.goal() == 0.0) {
|
||||||
this->entries.erase(entry++);
|
//this->entries.erase(entry++);
|
||||||
|
entry = std::next(entry);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
entry->offset.setValueAndWarp(offset);
|
entry->offset.setValueAndWarp(offset);
|
||||||
entry->width.setValueAndWarp(entry_width);
|
entry->width.setValueAndWarp(entry_width);
|
||||||
} else {
|
} else {
|
||||||
auto warp_init = entry->offset.goalf() == -1.0;
|
auto warp_init = entry->offset.goal() == -1.0;
|
||||||
|
|
||||||
if (warp_init) {
|
if (warp_init) {
|
||||||
entry->offset.setValueAndWarp(offset);
|
entry->offset.setValueAndWarp(offset);
|
||||||
entry->width.setValueAndWarp(entry->vertical_pos.fl() == 0.0 ? 0.0 : entry_width);
|
entry->width.setValueAndWarp(entry->vertical_pos.value() == 0.0 ? 0.0 : entry_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!entry->destroying) {
|
if (!entry->destroying) {
|
||||||
if (entry->offset.goalf() != offset) entry->offset = offset;
|
if (entry->offset.goal() != offset) entry->offset = offset;
|
||||||
if ((warp_init || entry->width.goalf() != 0.0) && entry->width.goalf() != entry_width)
|
if ((warp_init || entry->width.goal() != 0.0) && entry->width.goal() != entry_width)
|
||||||
entry->width = entry_width;
|
entry->width = entry_width;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!entry->destroying) offset += entry->width.goalf();
|
if (!entry->destroying) offset += entry->width.goal();
|
||||||
entry = std::next(entry);
|
entry = std::next(entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -430,14 +424,12 @@ void Hy3TabBar::setSize(Vector2D size) {
|
||||||
|
|
||||||
Hy3TabGroup::Hy3TabGroup(Hy3Node& node) {
|
Hy3TabGroup::Hy3TabGroup(Hy3Node& node) {
|
||||||
this->pos.create(
|
this->pos.create(
|
||||||
AVARTYPE_VECTOR,
|
|
||||||
g_pConfigManager->getAnimationPropertyConfig("windowsMove"),
|
g_pConfigManager->getAnimationPropertyConfig("windowsMove"),
|
||||||
nullptr,
|
nullptr,
|
||||||
AVARDAMAGE_NONE
|
AVARDAMAGE_NONE
|
||||||
);
|
);
|
||||||
|
|
||||||
this->size.create(
|
this->size.create(
|
||||||
AVARTYPE_VECTOR,
|
|
||||||
g_pConfigManager->getAnimationPropertyConfig("windowsMove"),
|
g_pConfigManager->getAnimationPropertyConfig("windowsMove"),
|
||||||
nullptr,
|
nullptr,
|
||||||
AVARDAMAGE_NONE
|
AVARDAMAGE_NONE
|
||||||
|
@ -467,12 +459,12 @@ void Hy3TabGroup::updateWithGroup(Hy3Node& node, bool warp) {
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
this->hidden = node.hidden;
|
this->hidden = node.hidden;
|
||||||
if (this->pos.goalv() != tpos) {
|
if (this->pos.goal() != tpos) {
|
||||||
this->pos = tpos;
|
this->pos = tpos;
|
||||||
if (warp) this->pos.warp();
|
if (warp) this->pos.warp();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->size.goalv() != tsize) {
|
if (this->size.goal() != tsize) {
|
||||||
this->size = tsize;
|
this->size = tsize;
|
||||||
if (warp) this->size.warp();
|
if (warp) this->size.warp();
|
||||||
}
|
}
|
||||||
|
@ -494,14 +486,14 @@ void Hy3TabGroup::tick() {
|
||||||
|
|
||||||
if (workspace != nullptr) {
|
if (workspace != nullptr) {
|
||||||
if (workspace->m_bHasFullscreenWindow) {
|
if (workspace->m_bHasFullscreenWindow) {
|
||||||
if (this->bar.fade_opacity.goalf() != 0.0) this->bar.fade_opacity = 0.0;
|
if (this->bar.fade_opacity.goal() != 0.0) this->bar.fade_opacity = 0.0;
|
||||||
} else {
|
} else {
|
||||||
if (this->bar.fade_opacity.goalf() != 1.0) this->bar.fade_opacity = 1.0;
|
if (this->bar.fade_opacity.goal() != 1.0) this->bar.fade_opacity = 1.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pos = this->pos.vec();
|
auto pos = this->pos.value();
|
||||||
auto size = this->size.vec();
|
auto size = this->size.value();
|
||||||
|
|
||||||
if (this->last_pos != pos || this->last_size != size) {
|
if (this->last_pos != pos || this->last_size != size) {
|
||||||
CBox damage_box = {this->last_pos.x, this->last_pos.y, this->last_size.x, this->last_size.y};
|
CBox damage_box = {this->last_pos.x, this->last_pos.y, this->last_size.x, this->last_size.y};
|
||||||
|
@ -537,11 +529,11 @@ void Hy3TabGroup::renderTabBar() {
|
||||||
auto scale = monitor->scale;
|
auto scale = monitor->scale;
|
||||||
|
|
||||||
auto monitor_size = monitor->vecSize;
|
auto monitor_size = monitor->vecSize;
|
||||||
auto pos = this->pos.vec() - monitor->vecPosition;
|
auto pos = this->pos.value() - monitor->vecPosition;
|
||||||
auto size = this->size.vec();
|
auto size = this->size.value();
|
||||||
|
|
||||||
if (workspace != nullptr) {
|
if (workspace != nullptr) {
|
||||||
pos = pos + workspace->m_vRenderOffset.vec();
|
pos = pos + workspace->m_vRenderOffset.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto scaled_pos = Vector2D(std::round(pos.x * scale), std::round(pos.y * scale));
|
auto scaled_pos = Vector2D(std::round(pos.x * scale), std::round(pos.y * scale));
|
||||||
|
@ -588,8 +580,8 @@ void Hy3TabGroup::renderTabBar() {
|
||||||
for (auto* window: this->stencil_windows) {
|
for (auto* window: this->stencil_windows) {
|
||||||
if (!g_pCompositor->windowExists(window)) continue;
|
if (!g_pCompositor->windowExists(window)) continue;
|
||||||
|
|
||||||
auto wpos = window->m_vRealPosition.vec() - monitor->vecPosition;
|
auto wpos = window->m_vRealPosition.value() - monitor->vecPosition;
|
||||||
auto wsize = window->m_vRealSize.vec();
|
auto wsize = window->m_vRealSize.value();
|
||||||
|
|
||||||
CBox window_box = {wpos.x, wpos.y, wsize.x, wsize.y};
|
CBox window_box = {wpos.x, wpos.y, wsize.x, wsize.y};
|
||||||
// scaleBox(&window_box, scale);
|
// scaleBox(&window_box, scale);
|
||||||
|
@ -607,16 +599,16 @@ void Hy3TabGroup::renderTabBar() {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto fade_opacity =
|
auto fade_opacity =
|
||||||
this->bar.fade_opacity.fl() * (workspace == nullptr ? 1.0 : workspace->m_fAlpha.fl());
|
this->bar.fade_opacity.value() * (workspace == nullptr ? 1.0 : workspace->m_fAlpha.value());
|
||||||
|
|
||||||
auto render_entry = [&](Hy3TabBarEntry& entry) {
|
auto render_entry = [&](Hy3TabBarEntry& entry) {
|
||||||
Vector2D entry_pos = {
|
Vector2D entry_pos = {
|
||||||
(pos.x + (entry.offset.fl() * size.x) + (*padding * 0.5)) * scale,
|
(pos.x + (entry.offset.value() * size.x) + (*padding * 0.5)) * scale,
|
||||||
scaled_pos.y
|
scaled_pos.y
|
||||||
+ ((entry.vertical_pos.fl() * (size.y + *padding) * scale) * (*enter_from_top ? -1 : 1)
|
+ ((entry.vertical_pos.value() * (size.y + *padding) * scale) * (*enter_from_top ? -1 : 1)
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
Vector2D entry_size = {((entry.width.fl() * size.x) - *padding) * scale, scaled_size.y};
|
Vector2D entry_size = {((entry.width.value() * size.x) - *padding) * scale, scaled_size.y};
|
||||||
if (entry_size.x < 0 || entry_size.y < 0 || fade_opacity == 0.0) return;
|
if (entry_size.x < 0 || entry_size.y < 0 || fade_opacity == 0.0) return;
|
||||||
|
|
||||||
CBox box = {
|
CBox box = {
|
||||||
|
@ -627,16 +619,16 @@ void Hy3TabGroup::renderTabBar() {
|
||||||
};
|
};
|
||||||
|
|
||||||
entry.prepareTexture(scale, box);
|
entry.prepareTexture(scale, box);
|
||||||
g_pHyprOpenGL->renderTexture(entry.texture, &box, fade_opacity * entry.fade_opacity.fl());
|
g_pHyprOpenGL->renderTexture(entry.texture, &box, fade_opacity * entry.fade_opacity.value());
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto& entry: this->bar.entries) {
|
for (auto& entry: this->bar.entries) {
|
||||||
if (entry.focused.goalf() == 1.0) continue;
|
if (entry.focused.goal() == 1.0) continue;
|
||||||
render_entry(entry);
|
render_entry(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& entry: this->bar.entries) {
|
for (auto& entry: this->bar.entries) {
|
||||||
if (entry.focused.goalf() == 0.0) continue;
|
if (entry.focused.goal() == 0.0) continue;
|
||||||
render_entry(entry);
|
render_entry(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -677,6 +669,6 @@ void findOverlappingWindows(Hy3Node& node, float height, std::vector<CWindow*>&
|
||||||
|
|
||||||
void Hy3TabGroup::updateStencilWindows(Hy3Node& group) {
|
void Hy3TabGroup::updateStencilWindows(Hy3Node& group) {
|
||||||
this->stencil_windows.clear();
|
this->stencil_windows.clear();
|
||||||
findOverlappingWindows(group, this->size.goalv().y, this->stencil_windows);
|
findOverlappingWindows(group, this->size.goal().y, this->stencil_windows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,12 +16,12 @@ struct Hy3TabBarEntry {
|
||||||
std::string window_title;
|
std::string window_title;
|
||||||
bool destroying = false;
|
bool destroying = false;
|
||||||
CTexture texture;
|
CTexture texture;
|
||||||
CAnimatedVariable focused;
|
CAnimatedVariable<float> focused;
|
||||||
CAnimatedVariable urgent;
|
CAnimatedVariable<float> urgent;
|
||||||
CAnimatedVariable offset; // 0.0-1.0 of total bar
|
CAnimatedVariable<float> offset; // 0.0-1.0 of total bar
|
||||||
CAnimatedVariable width; // 0.0-1.0 of total bar
|
CAnimatedVariable<float> width; // 0.0-1.0 of total bar
|
||||||
CAnimatedVariable vertical_pos; // 0.0-1.0, user specified direction
|
CAnimatedVariable<float> vertical_pos; // 0.0-1.0, user specified direction
|
||||||
CAnimatedVariable fade_opacity; // 0.0-1.0
|
CAnimatedVariable<float> fade_opacity; // 0.0-1.0
|
||||||
Hy3TabBar& tab_bar;
|
Hy3TabBar& tab_bar;
|
||||||
Hy3Node& node; // only used for comparioson. do not deref.
|
Hy3Node& node; // only used for comparioson. do not deref.
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ public:
|
||||||
bool destroy = false;
|
bool destroy = false;
|
||||||
bool dirty = true;
|
bool dirty = true;
|
||||||
bool damaged = true;
|
bool damaged = true;
|
||||||
CAnimatedVariable fade_opacity;
|
CAnimatedVariable<float> fade_opacity;
|
||||||
|
|
||||||
Hy3TabBar();
|
Hy3TabBar();
|
||||||
void beginDestroy();
|
void beginDestroy();
|
||||||
|
@ -89,8 +89,8 @@ public:
|
||||||
int workspace_id = -1;
|
int workspace_id = -1;
|
||||||
bool hidden = false;
|
bool hidden = false;
|
||||||
Hy3TabBar bar;
|
Hy3TabBar bar;
|
||||||
CAnimatedVariable pos;
|
CAnimatedVariable<Vector2D> pos;
|
||||||
CAnimatedVariable size;
|
CAnimatedVariable<Vector2D> size;
|
||||||
|
|
||||||
// initialize a group with the given node. UB if node is not a group.
|
// initialize a group with the given node. UB if node is not a group.
|
||||||
Hy3TabGroup(Hy3Node&);
|
Hy3TabGroup(Hy3Node&);
|
||||||
|
|
Loading…
Add table
Reference in a new issue