Add click handling
This commit is contained in:
parent
58d004ec59
commit
3f09b57ed0
3 changed files with 70 additions and 1 deletions
14
src/bar.cpp
14
src/bar.cpp
|
@ -60,6 +60,17 @@ Bar::~Bar()
|
|||
zwlr_layer_surface_v1_destroy(_layerSurface);
|
||||
}
|
||||
|
||||
void Bar::click(int x, int)
|
||||
{
|
||||
for (auto tag=_tags.rbegin(); tag != _tags.rend(); tag++) {
|
||||
if (x > tag->x) {
|
||||
tag->active = !tag->active;
|
||||
invalidate();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Bar::invalidate()
|
||||
{
|
||||
if (_invalid) return;
|
||||
|
@ -119,7 +130,8 @@ void Bar::setColorScheme(const ColorScheme &scheme)
|
|||
|
||||
void Bar::renderTags()
|
||||
{
|
||||
for (const auto &tag : _tags) {
|
||||
for (auto &tag : _tags) {
|
||||
tag.x = _x;
|
||||
setColorScheme(tag.active ? colorActive : colorInactive);
|
||||
renderText(tag.name);
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
struct Tag {
|
||||
QString name;
|
||||
bool active;
|
||||
int x;
|
||||
};
|
||||
|
||||
class Bar {
|
||||
|
@ -45,5 +46,6 @@ class Bar {
|
|||
public:
|
||||
explicit Bar(const wl_output *output);
|
||||
void setStatus(const QString &status);
|
||||
void click(int x, int y);
|
||||
~Bar();
|
||||
};
|
||||
|
|
55
src/main.cpp
55
src/main.cpp
|
@ -9,6 +9,7 @@
|
|||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/input-event-codes.h>
|
||||
#include <optional>
|
||||
#include <QGuiApplication>
|
||||
#include <QSocketNotifier>
|
||||
|
@ -43,11 +44,62 @@ static const struct xdg_wm_base_listener xdgWmBaseListener = {
|
|||
}
|
||||
};
|
||||
|
||||
struct PointerState {
|
||||
wl_pointer *pointer;
|
||||
Bar *focusedBar;
|
||||
int x, y;
|
||||
bool leftButtonClick;
|
||||
};
|
||||
static PointerState pointerState;
|
||||
static const struct wl_pointer_listener pointerListener = {
|
||||
.enter = [](void*, wl_pointer*, uint32_t serial, wl_surface*, wl_fixed_t x, wl_fixed_t y)
|
||||
{
|
||||
pointerState.focusedBar = &bar.value();
|
||||
},
|
||||
.leave = [](void*, wl_pointer*, uint32_t serial, wl_surface*) {
|
||||
pointerState.focusedBar = nullptr;
|
||||
},
|
||||
.motion = [](void*, wl_pointer*, uint32_t, wl_fixed_t x, wl_fixed_t y) {
|
||||
pointerState.x = wl_fixed_to_int(x);
|
||||
pointerState.y = wl_fixed_to_int(y);
|
||||
},
|
||||
.button = [](void*, wl_pointer*, uint32_t, uint32_t, uint32_t button, uint32_t pressed) {
|
||||
if (button == BTN_LEFT) {
|
||||
pointerState.leftButtonClick = pressed == WL_POINTER_BUTTON_STATE_PRESSED;
|
||||
}
|
||||
},
|
||||
.axis = [](void*, wl_pointer*, uint32_t, uint32_t, wl_fixed_t) { },
|
||||
.frame = [](void*, wl_pointer*) {
|
||||
if (!pointerState.focusedBar) return;
|
||||
if (pointerState.leftButtonClick) {
|
||||
pointerState.leftButtonClick = false;
|
||||
pointerState.focusedBar->click(pointerState.x, pointerState.y);
|
||||
}
|
||||
},
|
||||
.axis_source = [](void*, wl_pointer*, uint32_t) { },
|
||||
.axis_stop = [](void*, wl_pointer*, uint32_t, uint32_t) { },
|
||||
.axis_discrete = [](void*, wl_pointer*, uint32_t, int32_t) { },
|
||||
};
|
||||
|
||||
static wl_seat *seat;
|
||||
static const struct wl_seat_listener seatListener = {
|
||||
[](void*, wl_seat*, uint32_t cap)
|
||||
{
|
||||
if (cap & WL_SEAT_CAPABILITY_POINTER) {
|
||||
printf("got pointer");
|
||||
pointerState.pointer = wl_seat_get_pointer(seat);
|
||||
wl_pointer_add_listener(pointerState.pointer, &pointerListener, nullptr);
|
||||
}
|
||||
},
|
||||
[](void*, wl_seat*, const char *name) { }
|
||||
};
|
||||
|
||||
// called after we have received the initial batch of globals
|
||||
static void onReady()
|
||||
{
|
||||
requireGlobal(compositor, "wl_compositor");
|
||||
requireGlobal(shm, "wl_shm");
|
||||
requireGlobal(seat, "wl_seat");
|
||||
requireGlobal(wlrLayerShell, "zwlr_layer_shell_v1");
|
||||
setupStatusFifo();
|
||||
bar.emplace(nullptr);
|
||||
|
@ -119,6 +171,9 @@ static void registryHandleGlobal(void*, wl_registry *registry, uint32_t name, co
|
|||
xdg_wm_base_add_listener(xdgWmBase, &xdgWmBaseListener, nullptr);
|
||||
return;
|
||||
}
|
||||
if (seat == nullptr && reg.handle(seat, wl_seat_interface, 7)) {
|
||||
wl_seat_add_listener(seat, &seatListener, nullptr);
|
||||
}
|
||||
}
|
||||
static const struct wl_registry_listener registry_listener = { registryHandleGlobal, nullptr };
|
||||
|
||||
|
|
Loading…
Reference in a new issue