aboutsummaryrefslogtreecommitdiff
path: root/users/ryan/modules/simple-bar/simple-bar-source/lib/components/yabai-context.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'users/ryan/modules/simple-bar/simple-bar-source/lib/components/yabai-context.jsx')
-rwxr-xr-xusers/ryan/modules/simple-bar/simple-bar-source/lib/components/yabai-context.jsx112
1 files changed, 112 insertions, 0 deletions
diff --git a/users/ryan/modules/simple-bar/simple-bar-source/lib/components/yabai-context.jsx b/users/ryan/modules/simple-bar/simple-bar-source/lib/components/yabai-context.jsx
new file mode 100755
index 0000000..245977b
--- /dev/null
+++ b/users/ryan/modules/simple-bar/simple-bar-source/lib/components/yabai-context.jsx
@@ -0,0 +1,112 @@
1import * as Uebersicht from "uebersicht";
2import { useSimpleBarContext } from "./simple-bar-context.jsx";
3import useServerSocket from "../hooks/use-server-socket.js";
4import * as Yabai from "../yabai.js";
5import * as Skhd from "../skhd.js";
6
7const { React } = Uebersicht;
8
9// Create a context with default values
10const YabaiContext = React.createContext({
11 spaces: [],
12 windows: [],
13 skhdMode: "",
14});
15
16/**
17 * Custom hook to use the YabaiContext
18 * @returns {Object} The context value
19 */
20export function useYabaiContext() {
21 return React.useContext(YabaiContext);
22}
23
24export default React.memo(YabaiContextProvider);
25
26/**
27 * YabaiContextProvider component provides context for Yabai spaces, windows, and skhd mode.
28 * It uses server sockets to fetch and update the context values.
29 *
30 * @param {Object} props - The component props.
31 * @param {Array} props.spaces - Initial spaces data.
32 * @param {Array} props.windows - Initial windows data.
33 * @param {Object} props.skhdMode - Initial skhd mode data.
34 * @param {React.ReactNode} props.children - The child components to be wrapped by the provider.
35 * @returns {JSX.Element} The YabaiContext provider component.
36 */
37function YabaiContextProvider({ spaces, windows, skhdMode, children }) {
38 const { settings, setDisplays } = useSimpleBarContext();
39 const { enableServer, yabaiServerRefresh } = settings.global;
40 const { displaySkhdMode } = settings.process;
41 const serverEnabled = enableServer && yabaiServerRefresh;
42
43 const [yabaiSpaces, setYabaiSpaces] = React.useState(spaces);
44 const [yabaiWindows, setYabaiWindows] = React.useState(windows);
45 const [currentSkhdMode, setCurrentSkhdMode] = React.useState(skhdMode);
46
47 // Resets the spaces state to an empty array.
48 const resetSpaces = () => {
49 setYabaiSpaces([]);
50 };
51
52 // Resets the windows state to an empty array.
53 const resetWindows = () => {
54 setYabaiWindows([]);
55 };
56
57 // Resets the displays state to an empty array.
58 const resetDisplays = () => {
59 setDisplays([]);
60 };
61
62 // Resets the skhd mode state to an empty object.
63 const resetSkhdMode = () => {
64 setCurrentSkhdMode({});
65 };
66
67 // Fetches the current spaces from Yabai and updates the state.
68 const getSpaces = async () => {
69 const newSpaces = await Yabai.getSpaces();
70 setYabaiSpaces(newSpaces);
71 };
72
73 // Fetches the current windows from Yabai and updates the state.
74 const getWindows = async () => {
75 const newWindows = await Yabai.getWindows();
76 setYabaiWindows(newWindows);
77 };
78
79 // Fetches the current displays from Yabai and updates the state.
80 const getDisplays = async () => {
81 const newDisplays = await Yabai.getDisplays();
82 setDisplays(newDisplays);
83 };
84
85 // Fetches the current skhd mode from Skhd and updates the state.
86 const getSkhdMode = async () => {
87 const newSkhdMode = await Skhd.getMode();
88 setCurrentSkhdMode(newSkhdMode);
89 };
90
91 useServerSocket("spaces", serverEnabled, getSpaces, resetSpaces);
92 useServerSocket("windows", serverEnabled, getWindows, resetWindows);
93 useServerSocket("displays", serverEnabled, getDisplays, resetDisplays);
94 useServerSocket("mode", displaySkhdMode, getSkhdMode, resetSkhdMode);
95
96 const usedWindows = serverEnabled ? yabaiWindows : windows;
97 // Windows with an empty subrole should not be displayed in the UI
98 // See https://github.com/Jean-Tinland/simple-bar/issues/495 for reference
99 const filteredWindows = usedWindows.filter((window) => window.subrole);
100
101 return (
102 <YabaiContext.Provider
103 value={{
104 spaces: serverEnabled ? yabaiSpaces : spaces,
105 windows: filteredWindows,
106 skhdMode: serverEnabled ? currentSkhdMode : skhdMode,
107 }}
108 >
109 {children}
110 </YabaiContext.Provider>
111 );
112}