Cleanup cursor code
This commit is contained in:
parent
3f89d73374
commit
b8a7b6a605
@ -9,19 +9,21 @@
|
|||||||
#include <xcb/xcb_cursor.h>
|
#include <xcb/xcb_cursor.h>
|
||||||
|
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
#include "x11/connection.hpp"
|
|
||||||
#include "utils/string.hpp"
|
#include "utils/string.hpp"
|
||||||
|
#include "x11/connection.hpp"
|
||||||
|
|
||||||
POLYBAR_NS
|
POLYBAR_NS
|
||||||
|
|
||||||
namespace cursor_util {
|
namespace cursor_util {
|
||||||
static const std::map<string, vector<string>> cursors = {
|
static const std::map<string, vector<string>> cursors = {
|
||||||
{"pointer", {"pointing_hand", "pointer", "hand", "hand1", "hand2", "e29285e634086352946a0e7090d73106", "9d800788f1b08800ae810202380a0822"}},
|
{"pointer", {"pointing_hand", "pointer", "hand", "hand1", "hand2", "e29285e634086352946a0e7090d73106",
|
||||||
|
"9d800788f1b08800ae810202380a0822"}},
|
||||||
{"default", {"left_ptr", "arrow", "dnd-none", "op_left_arrow"}},
|
{"default", {"left_ptr", "arrow", "dnd-none", "op_left_arrow"}},
|
||||||
{"ns-resize", {"size_ver", "sb_v_double_arrow", "v_double_arrow", "n-resize", "s-resize", "col-resize", "top_side", "bottom_side", "base_arrow_up", "base_arrow_down", "based_arrow_down", "based_arrow_up", "00008160000006810000408080010102"}}
|
{"ns-resize", {"size_ver", "sb_v_double_arrow", "v_double_arrow", "n-resize", "s-resize", "col-resize",
|
||||||
};
|
"top_side", "bottom_side", "base_arrow_up", "base_arrow_down", "based_arrow_down",
|
||||||
bool valid(string name);
|
"based_arrow_up", "00008160000006810000408080010102"}}};
|
||||||
bool set_cursor(xcb_connection_t *c, xcb_screen_t *screen, xcb_window_t w, string name);
|
bool valid(const string& name);
|
||||||
}
|
bool set_cursor(xcb_connection_t* c, xcb_screen_t* screen, xcb_window_t w, const string& name);
|
||||||
|
} // namespace cursor_util
|
||||||
|
|
||||||
POLYBAR_NS_END
|
POLYBAR_NS_END
|
||||||
|
@ -924,7 +924,7 @@ void bar::change_cursor(const string& name) {
|
|||||||
|
|
||||||
m_opts.cursor = name;
|
m_opts.cursor = name;
|
||||||
if (!cursor_util::set_cursor(m_connection, m_connection.screen(), m_opts.window, name)) {
|
if (!cursor_util::set_cursor(m_connection, m_connection.screen(), m_opts.window, name)) {
|
||||||
m_log.warn("Failed to create cursor context");
|
m_log.warn("Failed to create cursor context for cursor name '%s'", name);
|
||||||
}
|
}
|
||||||
m_connection.flush();
|
m_connection.flush();
|
||||||
}
|
}
|
||||||
|
@ -1,31 +1,43 @@
|
|||||||
#include "x11/cursor.hpp"
|
#include "x11/cursor.hpp"
|
||||||
|
|
||||||
|
#include "utils/scope.hpp"
|
||||||
|
|
||||||
POLYBAR_NS
|
POLYBAR_NS
|
||||||
|
|
||||||
namespace cursor_util {
|
namespace cursor_util {
|
||||||
bool valid(string name) {
|
bool valid(const string& name) {
|
||||||
return (cursors.find(name) != cursors.end());
|
return (cursors.find(name) != cursors.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool set_cursor(xcb_connection_t *c, xcb_screen_t *screen, xcb_window_t w, string name) {
|
bool set_cursor(xcb_connection_t* c, xcb_screen_t* screen, xcb_window_t w, const string& name) {
|
||||||
if (!valid(name)) {
|
if (!valid(name)) {
|
||||||
throw std::runtime_error("Tried to set cursor to invalid name: '" + name + "'");
|
throw std::runtime_error("Tried to set cursor to invalid name: '" + name + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
xcb_cursor_t cursor = XCB_CURSOR_NONE;
|
|
||||||
xcb_cursor_context_t* ctx;
|
xcb_cursor_context_t* ctx;
|
||||||
|
|
||||||
if (xcb_cursor_context_new(c, screen, &ctx) < 0) {
|
if (xcb_cursor_context_new(c, screen, &ctx) < 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (auto&& cursor_name : cursors.at(name)) {
|
|
||||||
|
scope_util::on_exit<> handler([&] { xcb_cursor_context_free(ctx); });
|
||||||
|
|
||||||
|
xcb_cursor_t cursor = XCB_CURSOR_NONE;
|
||||||
|
for (const auto& cursor_name : cursors.at(name)) {
|
||||||
cursor = xcb_cursor_load_cursor(ctx, cursor_name.c_str());
|
cursor = xcb_cursor_load_cursor(ctx, cursor_name.c_str());
|
||||||
if (cursor != XCB_CURSOR_NONE)
|
if (cursor != XCB_CURSOR_NONE) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cursor == XCB_CURSOR_NONE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
xcb_change_window_attributes(c, w, XCB_CW_CURSOR, &cursor);
|
xcb_change_window_attributes(c, w, XCB_CW_CURSOR, &cursor);
|
||||||
xcb_cursor_context_free(ctx);
|
xcb_free_cursor(c, cursor);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
} // namespace cursor_util
|
||||||
POLYBAR_NS_END
|
POLYBAR_NS_END
|
||||||
|
Loading…
Reference in New Issue
Block a user