forked from external/yambar
bar: set_cursor(): new interface function, to set the X cursor
Use this to explicitly set the initial/default cursor to "left_ptr"
This commit is contained in:
parent
ce68bdb59d
commit
1b50808da5
3 changed files with 39 additions and 7 deletions
|
@ -14,7 +14,7 @@ set(CMAKE_C_FLAGS "-Wall -Werror ${CMAKE_C_FLAGS}")
|
|||
find_package(Threads REQUIRED)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
|
||||
pkg_check_modules(XCB REQUIRED xcb xcb-randr xcb-render) # Core
|
||||
pkg_check_modules(XCB REQUIRED xcb xcb-randr xcb-render xcb-cursor) # Core
|
||||
pkg_check_modules(CAIRO REQUIRED cairo cairo-xcb) # Core
|
||||
pkg_check_modules(YAML REQUIRED yaml-0.1) # Core (configuration)
|
||||
|
||||
|
|
32
bar.c
32
bar.c
|
@ -13,9 +13,10 @@
|
|||
#include <sys/eventfd.h>
|
||||
|
||||
#include <xcb/xcb.h>
|
||||
#include <xcb/xcb_event.h>
|
||||
#include <xcb/randr.h>
|
||||
#include <xcb/render.h>
|
||||
#include <xcb/xcb_cursor.h>
|
||||
#include <xcb/xcb_event.h>
|
||||
#include <xcb/xcb_ewmh.h>
|
||||
|
||||
#include <cairo.h>
|
||||
|
@ -64,6 +65,8 @@ struct private {
|
|||
xcb_colormap_t colormap;
|
||||
xcb_pixmap_t pixmap;
|
||||
xcb_gc_t gc;
|
||||
xcb_cursor_context_t *cursor_ctx;
|
||||
xcb_cursor_t cursor;
|
||||
|
||||
cairo_t *cairo;
|
||||
};
|
||||
|
@ -172,6 +175,7 @@ expose(const struct bar *_bar)
|
|||
}
|
||||
|
||||
static void refresh(const struct bar *bar);
|
||||
static void set_cursor(struct bar *bar, const char *cursor);
|
||||
|
||||
static int
|
||||
run(struct bar_run_context *run_ctx)
|
||||
|
@ -376,6 +380,12 @@ run(struct bar_run_context *run_ctx)
|
|||
bar->cairo = cairo_create(surface);
|
||||
|
||||
xcb_map_window(bar->conn, bar->win);
|
||||
|
||||
if (xcb_cursor_context_new(bar->conn, screen, &bar->cursor_ctx) < 0)
|
||||
LOG_WARN("failed to create XCB cursor context");
|
||||
else
|
||||
set_cursor(_bar, "left_ptr");
|
||||
|
||||
xcb_flush(bar->conn);
|
||||
|
||||
/* Start modules */
|
||||
|
@ -490,6 +500,11 @@ run(struct bar_run_context *run_ctx)
|
|||
cairo_surface_destroy(surface);
|
||||
cairo_debug_reset_static_data();
|
||||
|
||||
if (bar->cursor_ctx != NULL) {
|
||||
xcb_free_cursor(bar->conn, bar->cursor);
|
||||
xcb_cursor_context_free(bar->cursor_ctx);
|
||||
}
|
||||
|
||||
xcb_free_gc(bar->conn, bar->gc);
|
||||
xcb_free_pixmap(bar->conn, bar->pixmap);
|
||||
xcb_destroy_window(bar->conn, bar->win);
|
||||
|
@ -528,6 +543,18 @@ refresh(const struct bar *bar)
|
|||
free(evt);
|
||||
}
|
||||
|
||||
static void
|
||||
set_cursor(struct bar *bar, const char *cursor)
|
||||
{
|
||||
struct private *b = bar->private;
|
||||
|
||||
if (b->cursor_ctx == NULL)
|
||||
return;
|
||||
|
||||
b->cursor = xcb_cursor_load_cursor(b->cursor_ctx, cursor);
|
||||
xcb_change_window_attributes(b->conn, b->win, XCB_CW_CURSOR, &b->cursor);
|
||||
}
|
||||
|
||||
static void
|
||||
destroy(struct bar *bar)
|
||||
{
|
||||
|
@ -567,6 +594,8 @@ bar_new(const struct bar_config *config)
|
|||
priv->left.count = config->left.count;
|
||||
priv->center.count = config->center.count;
|
||||
priv->right.count = config->right.count;
|
||||
priv->cursor_ctx = NULL;
|
||||
priv->cursor = 0;
|
||||
|
||||
for (size_t i = 0; i < priv->left.count; i++)
|
||||
priv->left.mods[i] = config->left.mods[i];
|
||||
|
@ -580,6 +609,7 @@ bar_new(const struct bar_config *config)
|
|||
bar->run = &run;
|
||||
bar->destroy = &destroy;
|
||||
bar->refresh = &refresh;
|
||||
bar->set_cursor = &set_cursor;
|
||||
|
||||
for (size_t i = 0; i < priv->left.count; i++)
|
||||
priv->left.mods[i]->bar = bar;
|
||||
|
|
2
bar.h
2
bar.h
|
@ -13,7 +13,9 @@ struct bar {
|
|||
void *private;
|
||||
int (*run)(struct bar_run_context *ctx);
|
||||
void (*destroy)(struct bar *bar);
|
||||
|
||||
void (*refresh)(const struct bar *bar);
|
||||
void (*set_cursor)(struct bar *bar, const char *cursor);
|
||||
};
|
||||
|
||||
enum bar_location { BAR_TOP, BAR_BOTTOM };
|
||||
|
|
Loading…
Add table
Reference in a new issue