From 6582fb16e8857f6bda0a9310637b702e3e22b6d4 Mon Sep 17 00:00:00 2001 From: Arif Hasanic Date: Wed, 10 Dec 2025 23:47:28 +0100 Subject: [PATCH] home assistant widget --- CMakeLists.txt | 8 ++++-- include/bar/bar.hpp | 3 ++ include/widgets/webWidget.hpp | 14 ++++++++++ resources/bar.css | 9 ++++++ src/bar/bar.cpp | 3 ++ src/widgets/webWidget.cpp | 52 +++++++++++++++++++++++++++++++++++ 6 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 include/widgets/webWidget.hpp create mode 100644 src/widgets/webWidget.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8eac247..01adc38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,9 +23,10 @@ endif() pkg_check_modules(GTKMM REQUIRED gtkmm-4.0) pkg_check_modules(LAYERSHELL REQUIRED gtk4-layer-shell-0) +pkg_check_modules(WEBKIT REQUIRED webkitgtk-6.0) -include_directories(${GTKMM_INCLUDE_DIRS} ${LAYERSHELL_INCLUDE_DIRS}) -link_directories(${GTKMM_LIBRARY_DIRS} ${LAYERSHELL_LIBRARY_DIRS}) +include_directories(${GTKMM_INCLUDE_DIRS} ${LAYERSHELL_INCLUDE_DIRS} ${WEBKIT_INCLUDE_DIRS}) +link_directories(${GTKMM_LIBRARY_DIRS} ${LAYERSHELL_LIBRARY_DIRS} ${WEBKIT_LIBRARY_DIRS}) add_library(bar_lib) target_sources(bar_lib @@ -35,6 +36,7 @@ target_sources(bar_lib src/widgets/clock.cpp src/widgets/workspaceIndicator.cpp src/widgets/volumeWidget.cpp + src/widgets/webWidget.cpp src/services/hyprland.cpp src/services/tray.cpp src/widgets/tray.cpp @@ -45,7 +47,7 @@ include_directories(bar_lib PRIVATE add_executable(bar main.cpp) -target_link_libraries(bar bar_lib ${GTKMM_LIBRARIES} ${LAYERSHELL_LIBRARIES}) +target_link_libraries(bar bar_lib ${GTKMM_LIBRARIES} ${LAYERSHELL_LIBRARIES} ${WEBKIT_LIBRARIES}) # Copy `resources/bar.css` into the build directory when it changes set(RES_SRC "${CMAKE_CURRENT_SOURCE_DIR}/resources/bar.css") diff --git a/include/bar/bar.hpp b/include/bar/bar.hpp index 8d5d462..ddb16e3 100644 --- a/include/bar/bar.hpp +++ b/include/bar/bar.hpp @@ -7,6 +7,7 @@ #include "services/tray.hpp" #include "widgets/clock.hpp" #include "widgets/tray.hpp" +#include "widgets/webWidget.hpp" #include "widgets/workspaceIndicator.hpp" class Bar : public Gtk::Window { @@ -22,6 +23,8 @@ class Bar : public Gtk::Window { private: Clock clock; + WebWidget homeAssistant {"HA", "Home Assistant", + "https://home.rivercry.com"}; TrayService &trayService; HyprlandService &hyprlandService; int monitorId; diff --git a/include/widgets/webWidget.hpp b/include/widgets/webWidget.hpp new file mode 100644 index 0000000..aad0b10 --- /dev/null +++ b/include/widgets/webWidget.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include +#include + +class WebWidget : public Gtk::Button { +public: + WebWidget(std::string label, std::string title, std::string url); + ~WebWidget() override; + +private: + void on_toggle_window(); + Gtk::Window* web_window = nullptr; +}; diff --git a/resources/bar.css b/resources/bar.css index 5b07cd5..1d2f4a9 100644 --- a/resources/bar.css +++ b/resources/bar.css @@ -41,6 +41,15 @@ window { color: #111; } +.minimized { + background-color: rgba(50, 50, 50, 0.5); +} + +.restored { + background-color: transparent; +} + + button { padding: 2px 5px; margin: 0 2px; diff --git a/src/bar/bar.cpp b/src/bar/bar.cpp index 6972080..2dc5d81 100644 --- a/src/bar/bar.cpp +++ b/src/bar/bar.cpp @@ -40,6 +40,7 @@ Bar::Bar(GdkMonitor *monitor, HyprlandService &hyprlandService, Glib::signal_timeout().connect(sigc::mem_fun(clock, &Clock::onUpdate), 1000); + } void Bar::setup_ui() { @@ -73,8 +74,10 @@ void Bar::setup_ui() { volumeWidget = Gtk::make_managed(); center_box.append(*volumeWidget); + trayWidget = Gtk::make_managed(trayService); right_box.append(*trayWidget); + right_box.append(homeAssistant); } void Bar::load_css() { diff --git a/src/widgets/webWidget.cpp b/src/widgets/webWidget.cpp new file mode 100644 index 0000000..bc2d9ea --- /dev/null +++ b/src/widgets/webWidget.cpp @@ -0,0 +1,52 @@ +#include "widgets/webWidget.hpp" +#include +#include + +WebWidget::WebWidget(std::string label, std::string title, std::string url) { + set_label(label); + signal_clicked().connect( + sigc::mem_fun(*this, &WebWidget::on_toggle_window)); + + web_window = new Gtk::Window(); + web_window->set_title(title); + web_window->set_default_size(1024, 768); + + web_window->signal_close_request().connect( + [this]() { + web_window->hide(); + + return true; + }, + false); + + auto webview = webkit_web_view_new(); + gtk_widget_set_hexpand(webview, true); + gtk_widget_set_vexpand(webview, true); + + auto settings = webkit_web_view_get_settings(WEBKIT_WEB_VIEW(webview)); + webkit_settings_set_hardware_acceleration_policy( + settings, WEBKIT_HARDWARE_ACCELERATION_POLICY_ALWAYS); + + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview), url.c_str()); + + // Use C API to set child because we don't have a C++ wrapper for + // WebKitWebView + gtk_window_set_child(web_window->gobj(), webview); +} + +WebWidget::~WebWidget() { delete web_window; } + +void WebWidget::on_toggle_window() { + if (web_window->is_visible()) { + web_window->set_visible(false); + + this->add_css_class("minimized"); + this->remove_css_class("restored"); + } else { + web_window->set_visible(true); + this->remove_css_class("minimized"); + this->add_css_class("restored"); + } + + return; +}