Merge remote-tracking branch 'luka/gtk4' into gtk4
commit
d5bc2f3335
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
#include <glibmm/dispatcher.h>
|
||||
#include <glibmm/markup.h>
|
||||
#include <gtkmm/eventbox.h>
|
||||
//#include <gtkmm/eventbox.h>
|
||||
#include <json/json.h>
|
||||
|
||||
#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<int> pid_;
|
||||
gdouble distance_scrolled_y_;
|
||||
gdouble distance_scrolled_x_;
|
||||
std::map<std::string, std::string> eventActionMap_;
|
||||
static const inline std::map<std::pair<uint, GdkEventType>, std::string> eventMap_{
|
||||
/* static const inline std::map<std::pair<uint, GdkEventType>, 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
|
||||
|
|
|
@ -1,18 +1,13 @@
|
|||
#pragma once
|
||||
|
||||
#include <gdkmm/monitor.h>
|
||||
#include <glibmm/refptr.h>
|
||||
#include <gtkmm/box.h>
|
||||
#include <gtkmm/centerbox.h>
|
||||
#include <gtkmm/cssprovider.h>
|
||||
#include <gtkmm/main.h>
|
||||
#include <gtkmm/window.h>
|
||||
#include <json/json.h>
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#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> 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<std::shared_ptr<waybar::AModule>> modules_left_;
|
||||
std::vector<std::shared_ptr<waybar::AModule>> modules_center_;
|
||||
std::vector<std::shared_ptr<waybar::AModule>> modules_right_;
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <fmt/format.h>
|
||||
#include <gdk/gdk.h>
|
||||
#include <gdk/gdkwayland.h>
|
||||
#include <wayland-client.h>
|
||||
#include <gdk/wayland/gdkwayland.h>
|
||||
|
||||
#include "bar.hpp"
|
||||
#include "config.hpp"
|
||||
|
@ -34,6 +31,7 @@ class Client {
|
|||
|
||||
private:
|
||||
Client() = default;
|
||||
Glib::RefPtr<Gio::ListModel> monitors_;
|
||||
const std::string getStyle(const std::string &style, std::optional<Appearance> appearance);
|
||||
void bindInterfaces();
|
||||
void handleOutput(struct waybar_output &output);
|
||||
|
@ -51,7 +49,6 @@ class Client {
|
|||
void handleMonitorRemoved(Glib::RefPtr<Gdk::Monitor> monitor);
|
||||
void handleDeferredMonitorRemoval(Glib::RefPtr<Gdk::Monitor> monitor);
|
||||
|
||||
Glib::RefPtr<Gtk::StyleContext> style_context_;
|
||||
Glib::RefPtr<Gtk::CssProvider> css_provider_;
|
||||
std::unique_ptr<Portal> portal;
|
||||
std::list<struct waybar_output> outputs_;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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_;
|
||||
|
|
|
@ -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_;
|
||||
|
|
|
@ -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_;
|
||||
|
|
|
@ -52,7 +52,7 @@ struct SafeSignal : sigc::signal<void(std::decay_t<Args>...)> {
|
|||
using slot_t = decltype(std::declval<signal_t>().make_slot());
|
||||
using arg_tuple_t = std::tuple<std::decay_t<Args>...>;
|
||||
// ensure that unwrapped methods are not accessible
|
||||
using signal_t::emit_reverse;
|
||||
using signal_t::emit;
|
||||
using signal_t::make_slot;
|
||||
|
||||
void handle_event() {
|
||||
|
|
|
@ -19,7 +19,7 @@ class Portal : private DBus::Proxy {
|
|||
void refreshAppearance();
|
||||
Appearance getAppearance();
|
||||
|
||||
typedef sigc::signal<void, Appearance> type_signal_appearance_changed;
|
||||
typedef sigc::signal<void(Appearance)> type_signal_appearance_changed;
|
||||
type_signal_appearance_changed signal_appearance_changed() { return m_signal_appearance_changed; }
|
||||
|
||||
private:
|
||||
|
|
173
meson.build
173
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 <sndio.h>', 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 <chrono>')
|
||||
have_chrono_timezones = cpp_lib_chrono >= 201611
|
||||
|
||||
if have_chrono_timezones
|
||||
code = '''
|
||||
#include <chrono>
|
||||
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
|
||||
|
|
150
src/bar.cpp
150
src/bar.cpp
|
@ -1,15 +1,13 @@
|
|||
#ifdef HAVE_GTK_LAYER_SHELL
|
||||
#include <gtk-layer-shell.h>
|
||||
#include <gtk4-layer-shell.h>
|
||||
#endif
|
||||
|
||||
#include <spdlog/spdlog.h>
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
#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<Key, Value>& 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<Cairo::Region> 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> 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<int>(width_)) {
|
||||
spdlog::warn(MIN_WIDTH_MSG, width_, ev->width);
|
||||
if (width_ > 1 && width > static_cast<int>(width_)) {
|
||||
spdlog::warn(MIN_WIDTH_MSG, width_, width);
|
||||
}
|
||||
} else {
|
||||
if (height_ > 1 && ev->height > static_cast<int>(height_)) {
|
||||
spdlog::warn(MIN_HEIGHT_MSG, height_, ev->height);
|
||||
if (height_ > 1 && height > static_cast<int>(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<Cairo::Region> 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<zwlr_layer_surface_v1, deleter_fn<zwlr_layer_surface_v1_destroy>>;
|
||||
|
||||
Gtk::Window& window_;
|
||||
Glib::RefPtr<Gdk::Surface> 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<int>(height_)) {
|
||||
if (height > static_cast<int>(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<int>(width_)) {
|
||||
if (width > static_cast<int>(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) {
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <iostream>
|
||||
|
||||
#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<Gdk::Monitor>(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<Gdk::Monitor>(monitors_->get_object(position + i)));
|
||||
}
|
||||
|
||||
for (auto i{added}; i > 0; --i) {
|
||||
handleMonitorAdded(std::dynamic_pointer_cast<Gdk::Monitor>(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<waybar::Portal>();
|
||||
|
@ -272,6 +282,7 @@ int waybar::Client::main(int argc, char *argv[]) {
|
|||
gtk_app->hold();
|
||||
gtk_app->run();
|
||||
bars.clear();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -108,11 +108,11 @@ int main(int argc, char* argv[]) {
|
|||
|
||||
delete client;
|
||||
return ret;
|
||||
} catch (const Glib::Error& e) {
|
||||
spdlog::error("{}", static_cast<std::string>(e.what()));
|
||||
return 1;
|
||||
} catch (const std::exception& e) {
|
||||
spdlog::error("{}", e.what());
|
||||
return 1;
|
||||
} catch (const Glib::Exception& e) {
|
||||
spdlog::error("{}", static_cast<std::string>(e.what()));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ auto fmt::formatter<waybar::Appearance>::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();
|
||||
|
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue