diff --git a/include/ALabel.hpp b/include/ALabel.hpp index 888c65a8..cdfcef68 100644 --- a/include/ALabel.hpp +++ b/include/ALabel.hpp @@ -25,7 +25,7 @@ class ALabel : public AModule { bool alt_ = false; std::string default_format_; - bool handleToggle(GdkEventButton *const &e) override; +//todo bool handleToggle(GdkEventButton *const &e) override; virtual std::string getState(uint8_t value, bool lesser = false); }; diff --git a/include/AModule.hpp b/include/AModule.hpp index df0165cf..47f7c68f 100644 --- a/include/AModule.hpp +++ b/include/AModule.hpp @@ -2,7 +2,7 @@ #include #include -#include +//#include #include #include "IModule.hpp" @@ -28,25 +28,25 @@ class AModule : public IModule { enum SCROLL_DIR { NONE, UP, DOWN, LEFT, RIGHT }; - SCROLL_DIR getScrollDir(GdkEventScroll *e); +// SCROLL_DIR getScrollDir(GdkEventScroll *e); bool tooltipEnabled(); const std::string name_; const Json::Value &config_; - Gtk::EventBox event_box_; +// Gtk::EventBox event_box_; - virtual bool handleToggle(GdkEventButton *const &ev); - virtual bool handleScroll(GdkEventScroll *); - virtual bool handleRelease(GdkEventButton *const &ev); +// virtual bool handleToggle(GdkEventButton *const &ev); +// virtual bool handleScroll(GdkEventScroll *); +// virtual bool handleRelease(GdkEventButton *const &ev); private: - bool handleUserEvent(GdkEventButton *const &ev); +// bool handleUserEvent(GdkEventButton *const &ev); const bool isTooltip; std::vector pid_; gdouble distance_scrolled_y_; gdouble distance_scrolled_x_; std::map eventActionMap_; - static const inline std::map, std::string> eventMap_{ + /* static const inline std::map, std::string> eventMap_{ {std::make_pair(1, GdkEventType::GDK_BUTTON_PRESS), "on-click"}, {std::make_pair(1, GdkEventType::GDK_BUTTON_RELEASE), "on-click-release"}, {std::make_pair(1, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click"}, @@ -66,7 +66,7 @@ class AModule : public IModule { {std::make_pair(9, GdkEventType::GDK_BUTTON_PRESS), "on-click-forward"}, {std::make_pair(9, GdkEventType::GDK_BUTTON_RELEASE), "on-click-forward-release"}, {std::make_pair(9, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-forward"}, - {std::make_pair(9, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-forward"}}; + {std::make_pair(9, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-forward"}};*/ }; } // namespace waybar diff --git a/include/bar.hpp b/include/bar.hpp index d2cbffa0..f5c21c9c 100644 --- a/include/bar.hpp +++ b/include/bar.hpp @@ -1,18 +1,13 @@ #pragma once #include -#include #include +#include #include -#include #include -#include - -#include -#include #include "AModule.hpp" -#include "group.hpp" +//#include "group.hpp" #include "xdg-output-unstable-v1-client-protocol.h" namespace waybar { @@ -91,6 +86,7 @@ class Bar { bool visible = true; bool vertical = false; Gtk::Window window; + Glib::RefPtr gdk_surface_; int x_global; int y_global; @@ -100,13 +96,13 @@ class Bar { #endif private: - void onMap(GdkEventAny *); + void onMap(); auto setupWidgets() -> void; - void getModules(const Factory &, const std::string &, waybar::Group *); +// void getModules(const Factory &, const std::string &, waybar::Group *); void setupAltFormatKeyForModule(const std::string &module_name); void setupAltFormatKeyForModuleList(const char *module_list_name); void setMode(const bar_mode &); - void onConfigure(GdkEventConfigure *ev); + void onConfigure(int width, int height); void configureGlobalOffset(int width, int height); void onOutputGeometryChanged(); @@ -120,7 +116,7 @@ class Bar { Gtk::Box left_; Gtk::Box center_; Gtk::Box right_; - Gtk::Box box_; + Gtk::CenterBox box_; std::vector> modules_left_; std::vector> modules_center_; std::vector> modules_right_; diff --git a/include/client.hpp b/include/client.hpp index 9ec29ef3..fe6552af 100644 --- a/include/client.hpp +++ b/include/client.hpp @@ -1,9 +1,6 @@ #pragma once -#include -#include -#include -#include +#include #include "bar.hpp" #include "config.hpp" @@ -34,6 +31,7 @@ class Client { private: Client() = default; + Glib::RefPtr monitors_; const std::string getStyle(const std::string &style, std::optional appearance); void bindInterfaces(); void handleOutput(struct waybar_output &output); @@ -51,7 +49,6 @@ class Client { void handleMonitorRemoved(Glib::RefPtr monitor); void handleDeferredMonitorRemoval(Glib::RefPtr monitor); - Glib::RefPtr style_context_; Glib::RefPtr css_provider_; std::unique_ptr portal; std::list outputs_; diff --git a/include/group.hpp b/include/group.hpp index 67cf4385..87a57b81 100644 --- a/include/group.hpp +++ b/include/group.hpp @@ -19,7 +19,7 @@ class Group : public AModule { virtual Gtk::Box& getBox(); void addWidget(Gtk::Widget& widget); - bool handleMouseHover(GdkEventCrossing* const& e); +// bool handleMouseHover(GdkEventCrossing* const& e); protected: Gtk::Box box; diff --git a/include/modules/cffi.hpp b/include/modules/cffi.hpp index 85f12989..e7f988fc 100644 --- a/include/modules/cffi.hpp +++ b/include/modules/cffi.hpp @@ -16,7 +16,7 @@ typedef struct wbcffi_module wbcffi_module; typedef struct { wbcffi_module* obj; const char* waybar_version; - GtkContainer* (*get_root_widget)(wbcffi_module*); +//todo GtkContainer* (*get_root_widget)(wbcffi_module*); void (*queue_update)(wbcffi_module*); } wbcffi_init_info; diff --git a/include/modules/custom.hpp b/include/modules/custom.hpp index 2c7ba8a8..e8f4e3ee 100644 --- a/include/modules/custom.hpp +++ b/include/modules/custom.hpp @@ -26,8 +26,8 @@ class Custom : public ALabel { void parseOutputRaw(); void parseOutputJson(); void handleEvent(); - bool handleScroll(GdkEventScroll* e) override; - bool handleToggle(GdkEventButton* const& e) override; +//todo bool handleScroll(GdkEventScroll* e) override; +//todo bool handleToggle(GdkEventButton* const& e) override; const std::string name_; const std::string output_name_; diff --git a/include/modules/idle_inhibitor.hpp b/include/modules/idle_inhibitor.hpp index 22bd808f..1cb94a07 100644 --- a/include/modules/idle_inhibitor.hpp +++ b/include/modules/idle_inhibitor.hpp @@ -19,7 +19,7 @@ class IdleInhibitor : public ALabel { static bool status; private: - bool handleToggle(GdkEventButton* const& e) override; +//todo bool handleToggle(GdkEventButton* const& e) override; void toggleStatus(); const Bar& bar_; diff --git a/include/modules/user.hpp b/include/modules/user.hpp index bcb03da4..13608f43 100644 --- a/include/modules/user.hpp +++ b/include/modules/user.hpp @@ -14,7 +14,7 @@ class User : public AIconLabel { virtual ~User() = default; auto update() -> void override; - bool handleToggle(GdkEventButton* const& e) override; +//todo bool handleToggle(GdkEventButton* const& e) override; private: util::SleeperThread thread_; diff --git a/include/util/SafeSignal.hpp b/include/util/SafeSignal.hpp index 458bc57e..ff1469d0 100644 --- a/include/util/SafeSignal.hpp +++ b/include/util/SafeSignal.hpp @@ -52,7 +52,7 @@ struct SafeSignal : sigc::signal...)> { using slot_t = decltype(std::declval().make_slot()); using arg_tuple_t = std::tuple...>; // ensure that unwrapped methods are not accessible - using signal_t::emit_reverse; + using signal_t::emit; using signal_t::make_slot; void handle_event() { diff --git a/include/util/portal.hpp b/include/util/portal.hpp index 23619169..05458c7f 100644 --- a/include/util/portal.hpp +++ b/include/util/portal.hpp @@ -19,7 +19,7 @@ class Portal : private DBus::Proxy { void refreshAppearance(); Appearance getAppearance(); - typedef sigc::signal type_signal_appearance_changed; + typedef sigc::signal type_signal_appearance_changed; type_signal_appearance_changed signal_appearance_changed() { return m_signal_appearance_changed; } private: diff --git a/meson.build b/meson.build index c1ae48b5..1997162a 100644 --- a/meson.build +++ b/meson.build @@ -1,10 +1,10 @@ project( 'waybar', 'cpp', 'c', - version: '0.9.24', + version: '4.1.0', license: 'MIT', - meson_version: '>= 0.50.0', + meson_version: '>= 1.3.0', default_options : [ - 'cpp_std=c++20', + 'cpp_std=c++23', 'buildtype=release', 'default_library=static' ], @@ -78,78 +78,23 @@ is_freebsd = host_machine.system() == 'freebsd' is_netbsd = host_machine.system() == 'netbsd' is_openbsd = host_machine.system() == 'openbsd' -thread_dep = dependency('threads') -fmt = dependency('fmt', version : ['>=8.1.1'], fallback : ['fmt', 'fmt_dep']) -spdlog = dependency('spdlog', version : ['>=1.10.0'], fallback : ['spdlog', 'spdlog_dep'], default_options : ['external_fmt=enabled']) +jsoncpp = dependency('jsoncpp', version : ['>=1.9.4'], fallback : ['jsoncpp', 'jsoncpp_dep']) wayland_client = dependency('wayland-client') wayland_cursor = dependency('wayland-cursor') wayland_protos = dependency('wayland-protocols') -gtkmm = dependency('gtkmm-3.0', version : ['>=3.22.0']) -dbusmenu_gtk = dependency('dbusmenu-gtk3-0.4', required: get_option('dbusmenu-gtk')) -giounix = dependency('gio-unix-2.0', required: (get_option('dbusmenu-gtk').enabled() or - get_option('logind').enabled() or - get_option('upower_glib').enabled() or - get_option('mpris').enabled())) -jsoncpp = dependency('jsoncpp', version : ['>=1.9.2'], fallback : ['jsoncpp', 'jsoncpp_dep']) -sigcpp = dependency('sigc++-2.0') -libinotify = dependency('libinotify', required: false) -libepoll = dependency('epoll-shim', required: false) -libinput = dependency('libinput', required: get_option('libinput')) -libnl = dependency('libnl-3.0', required: get_option('libnl')) -libnlgen = dependency('libnl-genl-3.0', required: get_option('libnl')) -upower_glib = dependency('upower-glib', required: get_option('upower_glib')) -pipewire = dependency('libpipewire-0.3', required: get_option('pipewire')) -playerctl = dependency('playerctl', version : ['>=2.0.0'], required: get_option('mpris')) -libpulse = dependency('libpulse', required: get_option('pulseaudio')) -libudev = dependency('libudev', required: get_option('libudev')) -libevdev = dependency('libevdev', required: get_option('libevdev')) -libmpdclient = dependency('libmpdclient', required: get_option('mpd')) -xkbregistry = dependency('xkbregistry') -libjack = dependency('jack', required: get_option('jack')) -libwireplumber = dependency('wireplumber-0.4', required: get_option('wireplumber')) +sigcpp = dependency('sigc++-3.0', version: ['>=3.4.0']) +gtkmm = dependency('gtkmm-4.0', version : ['>=4.12.0']) +giounix = dependency('gio-unix-2.0', version: ['>=2.76.4']) +spdlog = dependency('spdlog', version : ['>=1.10.0'], fallback : ['spdlog', 'spdlog_dep'], default_options : ['external_fmt=enabled']) -libsndio = compiler.find_library('sndio', required: get_option('sndio')) -if libsndio.found() - if not compiler.has_function('sioctl_open', prefix: '#include ', dependencies: libsndio) - if get_option('sndio').enabled() - error('libsndio is too old, required >=1.7.0') - else - warning('libsndio is too old, required >=1.7.0') - libsndio = dependency('', required: false) - endif - endif -endif +gtk_layer_shell = dependency('gtk4-layer-shell-0', + version : ['>=1.0.2'], + required: get_option('gtk-layer-shell'), + fallback : ['gtk4-layer-shell', 'gtk_layer_shell'], + default_options : ['vapi=false']) -gtk_layer_shell = dependency('gtk-layer-shell-0', - required: get_option('gtk-layer-shell'), - fallback : ['gtk-layer-shell', 'gtk_layer_shell_dep']) -systemd = dependency('systemd', required: get_option('systemd')) - -cpp_lib_chrono = compiler.compute_int('__cpp_lib_chrono', prefix : '#include ') -have_chrono_timezones = cpp_lib_chrono >= 201611 - -if have_chrono_timezones - code = ''' -#include -using namespace std::chrono; -int main(int argc, char** argv) { - const time_zone* tz; - return 0; -} -''' - if not compiler.links(code) - have_chrono_timezones = false - endif -endif - -if have_chrono_timezones - tz_dep = declare_dependency() -else - tz_dep = dependency('date', - required: false, - default_options : [ 'use_system_tzdb=true' ], - modules : [ 'date::date', 'date::date-tz' ], - fallback: [ 'date', 'tz_dep' ]) +if gtk_layer_shell.found() + add_project_arguments('-DHAVE_GTK_LAYER_SHELL', language: 'cpp') endif prefix = get_option('prefix') @@ -159,47 +104,18 @@ conf_data.set('prefix', prefix) add_project_arguments('-DSYSCONFDIR="/@0@"'.format(join_paths(prefix, sysconfdir)), language : 'cpp') -if systemd.found() - user_units_dir = systemd.get_pkgconfig_variable('systemduserunitdir') - - configure_file( - configuration: conf_data, - input: './resources/waybar.service.in', - output: '@BASENAME@', - install_dir: user_units_dir - ) -endif - src_files = files( - 'src/factory.cpp', - 'src/AModule.cpp', - 'src/ALabel.cpp', - 'src/AIconLabel.cpp', - 'src/AAppIconLabel.cpp', - 'src/modules/custom.cpp', - 'src/modules/disk.cpp', - 'src/modules/idle_inhibitor.cpp', - 'src/modules/image.cpp', - 'src/modules/load.cpp', - 'src/modules/temperature.cpp', - 'src/modules/user.cpp', - 'src/ASlider.cpp', - 'src/main.cpp', - 'src/bar.cpp', - 'src/client.cpp', - 'src/config.cpp', - 'src/group.cpp', - 'src/util/portal.cpp', - 'src/util/enum.cpp', - 'src/util/prepare_for_sleep.cpp', - 'src/util/ustring_clen.cpp', - 'src/util/sanitize_str.cpp', - 'src/util/rewrite_string.cpp', - 'src/util/gtk_icon.cpp', - 'src/util/regex_collection.cpp' + 'src/main.cpp', + 'src/client.cpp', + 'src/bar.cpp', + 'src/config.cpp', + 'src/util/portal.cpp', + 'src/util/prepare_for_sleep.cpp', +# 'src/AModule.cpp', ) inc_dirs = ['include'] +<<<<<<< HEAD if is_linux add_project_arguments('-DHAVE_CPU_LINUX', language: 'cpp') @@ -399,45 +315,23 @@ if cava.found() src_files += 'src/modules/cava.cpp' endif +======= +>>>>>>> luka/gtk4 subdir('protocol') -app_resources = [] -subdir('resources/icons') - executable( 'waybar', - [src_files, app_resources], + [src_files], dependencies: [ - thread_dep, - client_protos, - wayland_client, - fmt, - spdlog, + gtk_layer_shell, + gtkmm, + giounix, sigcpp, jsoncpp, + wayland_client, wayland_cursor, - gtkmm, - dbusmenu_gtk, - giounix, - libinput, - libnl, - libnlgen, - upower_glib, - pipewire, - playerctl, - libpulse, - libjack, - libwireplumber, - libudev, - libinotify, - libepoll, - libmpdclient, - libevdev, - gtk_layer_shell, - libsndio, - tz_dep, - xkbregistry, - cava + client_protos, + spdlog ], include_directories: inc_dirs, install: true, @@ -448,6 +342,7 @@ install_data( './resources/style.css', install_dir: sysconfdir + '/xdg/waybar' ) +<<<<<<< HEAD scdoc = dependency('scdoc', version: '>=1.9.2', native: true, required: get_option('man-pages')) @@ -558,3 +453,5 @@ if clangtidy.found() ] + src_files) endif +======= +>>>>>>> luka/gtk4 diff --git a/src/bar.cpp b/src/bar.cpp index 1ffe2ef6..ae9c6524 100644 --- a/src/bar.cpp +++ b/src/bar.cpp @@ -1,15 +1,13 @@ #ifdef HAVE_GTK_LAYER_SHELL -#include +#include #endif #include -#include - #include "bar.hpp" #include "client.hpp" -#include "factory.hpp" -#include "group.hpp" +//#include "factory.hpp" +//#include "group.hpp" #include "wlr-layer-shell-unstable-v1-client-protocol.h" #ifdef HAVE_SWAY @@ -108,17 +106,16 @@ void from_json(const Json::Value& j, std::map& m) { #ifdef HAVE_GTK_LAYER_SHELL struct GLSSurfaceImpl : public BarSurface, public sigc::trackable { - GLSSurfaceImpl(Gtk::Window& window, struct waybar_output& output) : window_{window} { + GLSSurfaceImpl(Gtk::Window& window, struct waybar_output& output) + : window_{window} { output_name_ = output.name; // this has to be executed before GtkWindow.realize gtk_layer_init_for_window(window_.gobj()); - gtk_layer_set_keyboard_interactivity(window.gobj(), FALSE); + gtk_layer_set_keyboard_mode(window.gobj(), GTK_LAYER_SHELL_KEYBOARD_MODE_NONE); gtk_layer_set_monitor(window_.gobj(), output.monitor->gobj()); gtk_layer_set_namespace(window_.gobj(), "waybar"); - window.signal_map_event().connect_notify(sigc::mem_fun(*this, &GLSSurfaceImpl::onMap)); - window.signal_configure_event().connect_notify( - sigc::mem_fun(*this, &GLSSurfaceImpl::onConfigure)); + window.signal_map().connect(sigc::mem_fun(*this, &GLSSurfaceImpl::onMap)); } void setExclusiveZone(bool enable) override { @@ -148,13 +145,12 @@ struct GLSSurfaceImpl : public BarSurface, public sigc::trackable { void setPassThrough(bool enable) override { passthrough_ = enable; - auto gdk_window = window_.get_window(); - if (gdk_window) { + if (gdk_surface_) { Cairo::RefPtr region; if (enable) { region = Cairo::Region::create(); } - gdk_window->input_shape_combine_region(region, 0, 0); + gdk_surface_->set_input_region(region); } } @@ -195,15 +191,19 @@ struct GLSSurfaceImpl : public BarSurface, public sigc::trackable { private: Gtk::Window& window_; + Glib::RefPtr gdk_surface_; std::string output_name_; uint32_t width_; uint32_t height_; bool passthrough_ = false; bool vertical_ = false; - void onMap(GdkEventAny* ev) { setPassThrough(passthrough_); } + void onMap() { + gdk_surface_ = window_.get_surface(); + gdk_surface_->signal_layout().connect(sigc::mem_fun(*this, &GLSSurfaceImpl::onConfigure)); + setPassThrough(passthrough_); } - void onConfigure(GdkEventConfigure* ev) { + void onConfigure(int width, int height) { /* * GTK wants new size for the window. * Actual resizing and management of the exclusve zone is handled within the gtk-layer-shell @@ -213,30 +213,30 @@ struct GLSSurfaceImpl : public BarSurface, public sigc::trackable { * gtk-layer-shell. */ if (vertical_) { - if (width_ > 1 && ev->width > static_cast(width_)) { - spdlog::warn(MIN_WIDTH_MSG, width_, ev->width); + if (width_ > 1 && width > static_cast(width_)) { + spdlog::warn(MIN_WIDTH_MSG, width_, width); } } else { - if (height_ > 1 && ev->height > static_cast(height_)) { - spdlog::warn(MIN_HEIGHT_MSG, height_, ev->height); + if (height_ > 1 && height > static_cast(height_)) { + spdlog::warn(MIN_HEIGHT_MSG, height_, height); } } - width_ = ev->width; - height_ = ev->height; + width_ = width; + height_ = height; spdlog::info(BAR_SIZE_MSG, width_, height_, output_name_); } }; #endif struct RawSurfaceImpl : public BarSurface, public sigc::trackable { - RawSurfaceImpl(Gtk::Window& window, struct waybar_output& output) : window_{window} { + RawSurfaceImpl(Gtk::Window& window, struct waybar_output& output) + : window_{window}, gdk_surface_{window_.get_surface()} { output_ = gdk_wayland_monitor_get_wl_output(output.monitor->gobj()); output_name_ = output.name; - window.signal_realize().connect_notify(sigc::mem_fun(*this, &RawSurfaceImpl::onRealize)); - window.signal_map_event().connect_notify(sigc::mem_fun(*this, &RawSurfaceImpl::onMap)); - window.signal_configure_event().connect_notify( - sigc::mem_fun(*this, &RawSurfaceImpl::onConfigure)); + window.signal_realize().connect(sigc::mem_fun(*this, &RawSurfaceImpl::onRealize)); + window.signal_map().connect(sigc::mem_fun(*this, &RawSurfaceImpl::onMap)); + gdk_surface_->signal_layout().connect(sigc::mem_fun(*this, &RawSurfaceImpl::onConfigure)); if (window.get_realized()) { onRealize(); @@ -294,13 +294,12 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable { passthrough_ = enable; /* GTK overwrites any region changes applied directly to the wl_surface, * thus the same GTK region API as in the GLS impl has to be used. */ - auto gdk_window = window_.get_window(); - if (gdk_window) { + if (gdk_surface_) { Cairo::RefPtr region; if (enable) { region = Cairo::Region::create(); } - gdk_window->input_shape_combine_region(region, 0, 0); + gdk_surface_->set_input_region(region); } } @@ -345,6 +344,7 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable { std::unique_ptr>; Gtk::Window& window_; + Glib::RefPtr gdk_surface_; std::string output_name_; uint32_t configured_width_ = 0; uint32_t configured_height_ = 0; @@ -361,18 +361,16 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable { layer_surface_ptr layer_surface_; void onRealize() { - auto gdk_window = window_.get_window()->gobj(); - gdk_wayland_window_set_use_custom_surface(gdk_window); + gtk_layer_init_for_window(window_.gobj()); } - void onMap(GdkEventAny* ev) { + void onMap() { static const struct zwlr_layer_surface_v1_listener layer_surface_listener = { .configure = onSurfaceConfigure, .closed = onSurfaceClosed, }; auto client = Client::inst(); - auto gdk_window = window_.get_window()->gobj(); - surface_ = gdk_wayland_window_get_wl_surface(gdk_window); + surface_ = gdk_wayland_surface_get_wl_surface(gdk_surface_->gobj()); layer_surface_.reset(zwlr_layer_shell_v1_get_layer_surface(client->layer_shell, surface_, output_, layer_, "waybar")); @@ -391,7 +389,7 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable { wl_display_roundtrip(client->wl_display); } - void onConfigure(GdkEventConfigure* ev) { + void onConfigure(int width, int height) { /* * GTK wants new size for the window. * @@ -401,26 +399,26 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable { */ auto tmp_height = height_; auto tmp_width = width_; - if (ev->height > static_cast(height_)) { + if (height > static_cast(height_)) { // Default minimal value if (height_ > 1) { - spdlog::warn(MIN_HEIGHT_MSG, height_, ev->height); + spdlog::warn(MIN_HEIGHT_MSG, height_, height); } if (configured_height_ > 1) { spdlog::info(SIZE_DEFINED, "Height"); } else { - tmp_height = ev->height; + tmp_height = height; } } - if (ev->width > static_cast(width_)) { + if (width > static_cast(width_)) { // Default minimal value if (width_ > 1) { - spdlog::warn(MIN_WIDTH_MSG, width_, ev->width); + spdlog::warn(MIN_WIDTH_MSG, width_, width); } if (configured_width_ > 1) { spdlog::info(SIZE_DEFINED, "Width"); } else { - tmp_width = ev->width; + tmp_width = width; } } if (tmp_width != width_ || tmp_height != height_) { @@ -460,7 +458,6 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable { o->width_ = width; o->height_ = height; o->window_.set_size_request(o->width_, o->height_); - o->window_.resize(o->width_, o->height_); o->setExclusiveZone(o->exclusive_zone_); spdlog::info(BAR_SIZE_MSG, o->width_ == 1 ? "auto" : std::to_string(o->width_), o->height_ == 1 ? "auto" : std::to_string(o->height_), o->output_name_); @@ -480,17 +477,18 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable { waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config) : output(w_output), config(w_config), - window{Gtk::WindowType::WINDOW_TOPLEVEL}, + window{Gtk::Window()}, x_global(0), y_global(0), margins_{.top = 0, .right = 0, .bottom = 0, .left = 0}, - left_(Gtk::ORIENTATION_HORIZONTAL, 0), - center_(Gtk::ORIENTATION_HORIZONTAL, 0), - right_(Gtk::ORIENTATION_HORIZONTAL, 0), - box_(Gtk::ORIENTATION_HORIZONTAL, 0) { + left_(Gtk::Orientation::HORIZONTAL, 0), + center_(Gtk::Orientation::HORIZONTAL, 0), + right_(Gtk::Orientation::HORIZONTAL, 0), + box_{} { window.set_title("waybar"); window.set_name("waybar"); window.set_decorated(false); + window.set_child(box_); window.get_style_context()->add_class(output->name); window.get_style_context()->add_class(config["name"].asString()); window.get_style_context()->add_class(config["position"].asString()); @@ -498,12 +496,13 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config) auto position = config["position"].asString(); if (position == "right" || position == "left") { - left_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); - center_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); - right_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); - box_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); + left_.set_orientation(Gtk::Orientation::VERTICAL); + center_.set_orientation(Gtk::Orientation::VERTICAL); + right_.set_orientation(Gtk::Orientation::VERTICAL); + box_.set_orientation(Gtk::Orientation::VERTICAL); vertical = true; - } + } else + box_.set_orientation(Gtk::Orientation::HORIZONTAL); left_.get_style_context()->add_class("modules-left"); center_.get_style_context()->add_class("modules-center"); @@ -564,7 +563,6 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config) margins_ = {.top = gaps, .right = gaps, .bottom = gaps, .left = gaps}; } - window.signal_configure_event().connect_notify(sigc::mem_fun(*this, &Bar::onConfigure)); output->monitor->property_geometry().signal_changed().connect( sigc::mem_fun(*this, &Bar::onOutputGeometryChanged)); @@ -602,7 +600,7 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config) setVisible(false); } - window.signal_map_event().connect_notify(sigc::mem_fun(*this, &Bar::onMap)); + window.signal_map().connect(sigc::mem_fun(*this, &Bar::onMap)); #if HAVE_SWAY if (auto ipc = config["ipc"]; ipc.isBool() && ipc.asBool()) { @@ -622,7 +620,7 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config) #endif setupWidgets(); - window.show_all(); + window.show(); if (spdlog::should_log(spdlog::level::debug)) { // Unfortunately, this function isn't in the C++ bindings, so we have to call the C version. @@ -673,13 +671,14 @@ void waybar::Bar::setMode(const struct bar_mode& mode) { surface_impl_->commit(); } -void waybar::Bar::onMap(GdkEventAny*) { +void waybar::Bar::onMap() { /* * Obtain a pointer to the custom layer surface for modules that require it (idle_inhibitor). */ - auto gdk_window = window.get_window()->gobj(); - surface = gdk_wayland_window_get_wl_surface(gdk_window); - configureGlobalOffset(gdk_window_get_width(gdk_window), gdk_window_get_height(gdk_window)); + gdk_surface_ = window.get_surface(); + surface = gdk_wayland_surface_get_wl_surface(gdk_surface_->gobj()); + configureGlobalOffset(gdk_surface_->get_width(), gdk_surface_->get_height()); + gdk_surface_->signal_layout().connect(sigc::mem_fun(*this, &Bar::onConfigure)); } void waybar::Bar::setVisible(bool value) { @@ -739,6 +738,8 @@ void waybar::Bar::handleSignal(int signal) { } } +// todo gtkmm4 +/* void waybar::Bar::getModules(const Factory& factory, const std::string& pos, waybar::Group* group = nullptr) { auto module_list = group ? config[pos]["modules"] : config[pos]; @@ -754,7 +755,7 @@ void waybar::Bar::getModules(const Factory& factory, const std::string& pos, auto class_name = hash_pos != std::string::npos ? ref.substr(hash_pos + 1) : ""; auto vertical = (group ? group->getBox().get_orientation() : box_.get_orientation()) == - Gtk::ORIENTATION_VERTICAL; + Gtk::Orientation::VERTICAL; auto group_module = new waybar::Group(id_name, class_name, config[ref], vertical); getModules(factory, ref, group_module); @@ -791,40 +792,39 @@ void waybar::Bar::getModules(const Factory& factory, const std::string& pos, } } } - +*/ auto waybar::Bar::setupWidgets() -> void { - window.add(box_); - box_.pack_start(left_, false, false); + box_.set_start_widget(left_); if (config["fixed-center"].isBool() ? config["fixed-center"].asBool() : true) { box_.set_center_widget(center_); } else { - box_.pack_start(center_, true, false); + box_.set_start_widget(center_); } - box_.pack_end(right_, false, false); - + box_.set_end_widget(right_); // Convert to button code for every module that is used. setupAltFormatKeyForModuleList("modules-left"); setupAltFormatKeyForModuleList("modules-right"); setupAltFormatKeyForModuleList("modules-center"); - Factory factory(*this, config); - getModules(factory, "modules-left"); - getModules(factory, "modules-center"); - getModules(factory, "modules-right"); +// todo gtkmm4 +// Factory factory(*this, config); +// getModules(factory, "modules-left"); +// getModules(factory, "modules-center"); +// getModules(factory, "modules-right"); for (auto const& module : modules_left_) { - left_.pack_start(*module, false, false); + left_.prepend(*module); } for (auto const& module : modules_center_) { - center_.pack_start(*module, false, false); + center_.prepend(*module); } std::reverse(modules_right_.begin(), modules_right_.end()); for (auto const& module : modules_right_) { - right_.pack_end(*module, false, false); + right_.append(*module); } } -void waybar::Bar::onConfigure(GdkEventConfigure* ev) { - configureGlobalOffset(ev->width, ev->height); +void waybar::Bar::onConfigure(int width, int height) { + configureGlobalOffset(width, height); } void waybar::Bar::configureGlobalOffset(int width, int height) { diff --git a/src/client.cpp b/src/client.cpp index 066247e7..3f65b2fa 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -5,6 +5,7 @@ #include #include "gtkmm/icontheme.h" +#include "gtkmm/application.h" #include "idle-inhibit-unstable-v1-client-protocol.h" #include "util/clara.hpp" #include "util/format.hpp" @@ -181,14 +182,15 @@ const std::string waybar::Client::getStyle(const std::string &style, auto waybar::Client::setupCss(const std::string &css_file) -> void { css_provider_ = Gtk::CssProvider::create(); - style_context_ = Gtk::StyleContext::create(); // Load our css file, wherever that may be hiding - if (!css_provider_->load_from_path(css_file)) { - throw std::runtime_error("Can't open style file"); + try { + css_provider_->load_from_path(css_file); + } catch (const Glib::Error& e) { + spdlog::error("{}", e.what()); } // there's always only one screen - style_context_->add_provider_for_screen(Gdk::Screen::get_default(), css_provider_, + Gtk::StyleContext::add_provider_for_display(Gdk::Display::get_default(), css_provider_, GTK_STYLE_PROVIDER_PRIORITY_USER); } @@ -204,13 +206,20 @@ void waybar::Client::bindInterfaces() { throw std::runtime_error("Failed to acquire required resources."); } // add existing outputs and subscribe to updates - for (auto i = 0; i < gdk_display->get_n_monitors(); ++i) { - auto monitor = gdk_display->get_monitor(i); - handleMonitorAdded(monitor); +// auto monitors{gdk_display->get_monitors()}; + for (guint i{0}; i < monitors_->get_n_items(); ++i) { + handleMonitorAdded(std::dynamic_pointer_cast(monitors_->get_object(i))); } - gdk_display->signal_monitor_added().connect(sigc::mem_fun(*this, &Client::handleMonitorAdded)); - gdk_display->signal_monitor_removed().connect( - sigc::mem_fun(*this, &Client::handleMonitorRemoved)); + + monitors_->signal_items_changed().connect([=, this](const guint& position, const guint& removed, const guint& added){ + for (auto i{removed}; i > 0; --i) { + handleMonitorRemoved(std::dynamic_pointer_cast(monitors_->get_object(position + i))); + } + + for (auto i{added}; i > 0; --i) { + handleMonitorAdded(std::dynamic_pointer_cast(monitors_->get_object(position + i))); + } + }); } int waybar::Client::main(int argc, char *argv[]) { @@ -243,13 +252,8 @@ int waybar::Client::main(int argc, char *argv[]) { if (!log_level.empty()) { spdlog::set_level(spdlog::level::from_str(log_level)); } - gtk_app = Gtk::Application::create(argc, argv, "fr.arouillard.waybar", - Gio::APPLICATION_HANDLES_COMMAND_LINE); - - // Initialize Waybars GTK resources with our custom icons - auto theme = Gtk::IconTheme::get_default(); - theme->add_resource_path("/fr/arouillard/waybar/icons"); - + gtk_app = Gtk::Application::create("fr.arouillard.waybar", + Gio::Application::Flags::HANDLES_COMMAND_LINE); gdk_display = Gdk::Display::get_default(); if (!gdk_display) { throw std::runtime_error("Can't find display"); @@ -257,7 +261,13 @@ int waybar::Client::main(int argc, char *argv[]) { if (!GDK_IS_WAYLAND_DISPLAY(gdk_display->gobj())) { throw std::runtime_error("Bar need to run under Wayland"); } + + // Initialize Waybars GTK resources with our custom icons + auto theme{Gtk::IconTheme::get_for_display(gdk_display)}; + theme->add_resource_path("/fr/arouillard/waybar/icons"); + wl_display = gdk_wayland_display_get_wl_display(gdk_display->gobj()); + monitors_ = gdk_display->get_monitors(); config.load(config_opt); if (!portal) { portal = std::make_unique(); @@ -272,6 +282,7 @@ int waybar::Client::main(int argc, char *argv[]) { gtk_app->hold(); gtk_app->run(); bars.clear(); + return 0; } diff --git a/src/main.cpp b/src/main.cpp index ff446ffc..1ffc40bd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -108,11 +108,11 @@ int main(int argc, char* argv[]) { delete client; return ret; + } catch (const Glib::Error& e) { + spdlog::error("{}", static_cast(e.what())); + return 1; } catch (const std::exception& e) { spdlog::error("{}", e.what()); return 1; - } catch (const Glib::Exception& e) { - spdlog::error("{}", static_cast(e.what())); - return 1; } } diff --git a/src/util/portal.cpp b/src/util/portal.cpp index 50c646c5..1f3f94ad 100644 --- a/src/util/portal.cpp +++ b/src/util/portal.cpp @@ -36,7 +36,7 @@ auto fmt::formatter::format(waybar::Appearance c, format_con } waybar::Portal::Portal() - : DBus::Proxy(DBus::Connection::get_sync(DBus::BusType::BUS_TYPE_SESSION), PORTAL_BUS_NAME, + : DBus::Proxy(DBus::Connection::get_sync(DBus::BusType::SESSION), PORTAL_BUS_NAME, PORTAL_OBJ_PATH, PORTAL_INTERFACE), currentMode(Appearance::UNKNOWN) { refreshAppearance(); diff --git a/subprojects/gtk-layer-shell.wrap b/subprojects/gtk-layer-shell.wrap deleted file mode 100644 index 555fbcb6..00000000 --- a/subprojects/gtk-layer-shell.wrap +++ /dev/null @@ -1,5 +0,0 @@ -[wrap-file] -directory = gtk-layer-shell-0.4.0 -source_filename = gtk-layer-shell-0.4.0.tar.gz -source_hash = 52fd74d3161fefa5528585ca5a523c3150934961f2284ad010ae54336dad097e -source_url = https://github.com/wmww/gtk-layer-shell/archive/v0.4.0/gtk-layer-shell-0.4.0.tar.gz diff --git a/subprojects/gtk4-layer-shell.wrap b/subprojects/gtk4-layer-shell.wrap new file mode 100644 index 00000000..cd3e1cfb --- /dev/null +++ b/subprojects/gtk4-layer-shell.wrap @@ -0,0 +1,9 @@ +[wrap-file] +directory = gtk4-layer-shell-1.0.2 +source_filename = gtk4-layer-shell-1.0.2.tar.gz +source_hash = 55fa593241cad200fcb2b647b4dcc0d5d5516792e21a5b65662f010e224d7a73 +#source_hash = a3a827845612fa15de30734eb29c01db329c32f8e279d8bc5251facc69220b86 +source_url = https://github.com/wmww/gtk4-layer-shell/archive/v1.0.2/gtk4-layer-shell-1.0.2.tar.gz + +[provide] +gtk-layer-shell = gtk_layer_shell