Merge pull request #779 from fwSmit/transition-output
Create abstract output and fix wayland bug
This commit is contained in:
commit
0bcc135ffd
@ -264,6 +264,8 @@ Set to 0 to disable.
|
|||||||
A client can mark a notification as transient to bypass this setting and timeout
|
A client can mark a notification as transient to bypass this setting and timeout
|
||||||
anyway. Use a rule with 'set_transient = no' to disable this behavior.
|
anyway. Use a rule with 'set_transient = no' to disable this behavior.
|
||||||
|
|
||||||
|
Note: this doesn't work on wayland yet.
|
||||||
|
|
||||||
=item B<font> (default: "Monospace 8")
|
=item B<font> (default: "Monospace 8")
|
||||||
|
|
||||||
Defines the font or font set used. Optionally set the size as a decimal number
|
Defines the font or font set used. Optionally set the size as a decimal number
|
||||||
|
38
src/draw.c
38
src/draw.c
@ -1,7 +1,6 @@
|
|||||||
#include "draw.h"
|
#include "draw.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <cairo.h>
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <pango/pango-attributes.h>
|
#include <pango/pango-attributes.h>
|
||||||
#include <pango/pangocairo.h>
|
#include <pango/pangocairo.h>
|
||||||
@ -10,6 +9,7 @@
|
|||||||
#include <pango/pango-types.h>
|
#include <pango/pango-types.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
#include "dunst.h"
|
#include "dunst.h"
|
||||||
#include "icon.h"
|
#include "icon.h"
|
||||||
@ -17,7 +17,15 @@
|
|||||||
#include "markup.h"
|
#include "markup.h"
|
||||||
#include "notification.h"
|
#include "notification.h"
|
||||||
#include "queues.h"
|
#include "queues.h"
|
||||||
#include "x11/x.h"
|
#include "output.h"
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
struct color {
|
||||||
|
double r;
|
||||||
|
double g;
|
||||||
|
double b;
|
||||||
|
double a;
|
||||||
|
};
|
||||||
|
|
||||||
struct colored_layout {
|
struct colored_layout {
|
||||||
PangoLayout *l;
|
PangoLayout *l;
|
||||||
@ -31,7 +39,8 @@ struct colored_layout {
|
|||||||
const struct notification *n;
|
const struct notification *n;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct window_x11 *win;
|
const struct output *output;
|
||||||
|
window win;
|
||||||
|
|
||||||
PangoFontDescription *pango_fdesc;
|
PangoFontDescription *pango_fdesc;
|
||||||
|
|
||||||
@ -39,9 +48,12 @@ PangoFontDescription *pango_fdesc;
|
|||||||
|
|
||||||
void draw_setup(void)
|
void draw_setup(void)
|
||||||
{
|
{
|
||||||
x_setup();
|
const struct output *out = output_create();
|
||||||
|
output = out;
|
||||||
|
|
||||||
|
out->init();
|
||||||
|
win = out->win_create();
|
||||||
|
|
||||||
win = x_win_create();
|
|
||||||
pango_fdesc = pango_font_description_from_string(settings.font);
|
pango_fdesc = pango_font_description_from_string(settings.font);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,7 +188,7 @@ static struct dimensions calculate_dimensions(GSList *layouts)
|
|||||||
{
|
{
|
||||||
struct dimensions dim = { 0 };
|
struct dimensions dim = { 0 };
|
||||||
|
|
||||||
struct screen_info *scr = get_active_screen();
|
const struct screen_info *scr = output->get_active_screen();
|
||||||
if (have_dynamic_width()) {
|
if (have_dynamic_width()) {
|
||||||
/* dynamic width */
|
/* dynamic width */
|
||||||
dim.w = 0;
|
dim.w = 0;
|
||||||
@ -261,10 +273,10 @@ static struct dimensions calculate_dimensions(GSList *layouts)
|
|||||||
|
|
||||||
static PangoLayout *layout_create(cairo_t *c)
|
static PangoLayout *layout_create(cairo_t *c)
|
||||||
{
|
{
|
||||||
struct screen_info *screen = get_active_screen();
|
const struct screen_info *screen = output->get_active_screen();
|
||||||
|
|
||||||
PangoContext *context = pango_cairo_create_context(c);
|
PangoContext *context = pango_cairo_create_context(c);
|
||||||
pango_cairo_context_set_resolution(context, screen_dpi_get(screen));
|
pango_cairo_context_set_resolution(context, screen->dpi);
|
||||||
|
|
||||||
PangoLayout *layout = pango_layout_new(context);
|
PangoLayout *layout = pango_layout_new(context);
|
||||||
|
|
||||||
@ -723,7 +735,7 @@ static struct dimensions layout_render(cairo_surface_t *srf,
|
|||||||
*/
|
*/
|
||||||
static void calc_window_pos(int width, int height, int *ret_x, int *ret_y)
|
static void calc_window_pos(int width, int height, int *ret_x, int *ret_y)
|
||||||
{
|
{
|
||||||
struct screen_info *scr = get_active_screen();
|
const struct screen_info *scr = output->get_active_screen();
|
||||||
|
|
||||||
if (ret_x) {
|
if (ret_x) {
|
||||||
if (settings.geometry.negative_x) {
|
if (settings.geometry.negative_x) {
|
||||||
@ -746,7 +758,7 @@ void draw(void)
|
|||||||
{
|
{
|
||||||
assert(queues_length_displayed() > 0);
|
assert(queues_length_displayed() > 0);
|
||||||
|
|
||||||
GSList *layouts = create_layouts(x_win_get_context(win));
|
GSList *layouts = create_layouts(output->win_get_context(win));
|
||||||
|
|
||||||
struct dimensions dim = calculate_dimensions(layouts);
|
struct dimensions dim = calculate_dimensions(layouts);
|
||||||
|
|
||||||
@ -764,7 +776,7 @@ void draw(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
calc_window_pos(dim.w, dim.h, &dim.x, &dim.y);
|
calc_window_pos(dim.w, dim.h, &dim.x, &dim.y);
|
||||||
x_display_surface(image_surface, win, &dim);
|
output->display_surface(image_surface, win, &dim);
|
||||||
|
|
||||||
cairo_surface_destroy(image_surface);
|
cairo_surface_destroy(image_surface);
|
||||||
g_slist_free_full(layouts, free_colored_layout);
|
g_slist_free_full(layouts, free_colored_layout);
|
||||||
@ -772,7 +784,7 @@ void draw(void)
|
|||||||
|
|
||||||
void draw_deinit(void)
|
void draw_deinit(void)
|
||||||
{
|
{
|
||||||
x_win_destroy(win);
|
output->win_destroy(win);
|
||||||
x_free();
|
output->deinit();
|
||||||
}
|
}
|
||||||
/* vim: set ft=c tabstop=8 shiftwidth=8 expandtab textwidth=0: */
|
/* vim: set ft=c tabstop=8 shiftwidth=8 expandtab textwidth=0: */
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
#ifndef DUNST_DRAW_H
|
#ifndef DUNST_DRAW_H
|
||||||
#define DUNST_DRAW_H
|
#define DUNST_DRAW_H
|
||||||
|
|
||||||
#include "x11/x.h"
|
#include <stdbool.h>
|
||||||
extern struct window_x11 *win; // Temporary
|
#include <cairo.h>
|
||||||
|
#include "output.h"
|
||||||
|
|
||||||
|
extern window win; // Temporary
|
||||||
|
extern const struct output *output;
|
||||||
|
|
||||||
void draw_setup(void);
|
void draw_setup(void);
|
||||||
|
|
||||||
|
11
src/dunst.c
11
src/dunst.c
@ -20,8 +20,7 @@
|
|||||||
#include "queues.h"
|
#include "queues.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "x11/screen.h"
|
#include "output.h"
|
||||||
#include "x11/x.h"
|
|
||||||
|
|
||||||
GMainLoop *mainloop = NULL;
|
GMainLoop *mainloop = NULL;
|
||||||
|
|
||||||
@ -67,8 +66,8 @@ static gboolean run(void *data)
|
|||||||
|
|
||||||
LOG_D("RUN");
|
LOG_D("RUN");
|
||||||
|
|
||||||
dunst_status(S_FULLSCREEN, have_fullscreen_window());
|
dunst_status(S_FULLSCREEN, output->have_fullscreen_window());
|
||||||
dunst_status(S_IDLE, x_is_idle());
|
dunst_status(S_IDLE, output->is_idle());
|
||||||
|
|
||||||
queues_update(status);
|
queues_update(status);
|
||||||
|
|
||||||
@ -77,9 +76,9 @@ static gboolean run(void *data)
|
|||||||
if (active) {
|
if (active) {
|
||||||
// Call draw before showing the window to avoid flickering
|
// Call draw before showing the window to avoid flickering
|
||||||
draw();
|
draw();
|
||||||
x_win_show(win);
|
output->win_show(win);
|
||||||
} else {
|
} else {
|
||||||
x_win_hide(win);
|
output->win_hide(win);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (active) {
|
if (active) {
|
||||||
|
62
src/output.c
Normal file
62
src/output.c
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#include "output.h"
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
|
#include "x11/x.h"
|
||||||
|
#include "x11/screen.h"
|
||||||
|
/* #include "wayland/wl.h" */ // Not yet
|
||||||
|
|
||||||
|
const bool is_running_wayland(void){
|
||||||
|
char* wayland_display = getenv("WAYLAND_DISPLAY");
|
||||||
|
return !(wayland_display == NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct output output_x11 = {
|
||||||
|
x_setup,
|
||||||
|
x_free,
|
||||||
|
|
||||||
|
x_win_create,
|
||||||
|
x_win_destroy,
|
||||||
|
|
||||||
|
x_win_show,
|
||||||
|
x_win_hide,
|
||||||
|
|
||||||
|
x_display_surface,
|
||||||
|
x_win_visible,
|
||||||
|
x_win_get_context,
|
||||||
|
|
||||||
|
get_active_screen,
|
||||||
|
|
||||||
|
x_is_idle,
|
||||||
|
have_fullscreen_window
|
||||||
|
};
|
||||||
|
|
||||||
|
/* const struct output output_wl = { */
|
||||||
|
/* wl_init, */
|
||||||
|
/* wl_deinit, */
|
||||||
|
|
||||||
|
/* wl_win_create, */
|
||||||
|
/* wl_win_destroy, */
|
||||||
|
|
||||||
|
/* wl_win_show, */
|
||||||
|
/* wl_win_hide, */
|
||||||
|
|
||||||
|
/* wl_display_surface, */
|
||||||
|
/* wl_win_visible, */
|
||||||
|
/* wl_win_get_context, */
|
||||||
|
|
||||||
|
/* wl_get_active_screen, */
|
||||||
|
|
||||||
|
/* wl_is_idle, */
|
||||||
|
/* wl_have_fullscreen_window */
|
||||||
|
/* }; */
|
||||||
|
|
||||||
|
const struct output* output_create(void)
|
||||||
|
{
|
||||||
|
if (is_running_wayland()) {
|
||||||
|
LOG_I("System is running wayland");
|
||||||
|
} else{
|
||||||
|
LOG_I("System is running X11");
|
||||||
|
}
|
||||||
|
return &output_x11;
|
||||||
|
}
|
||||||
|
/* vim: set ft=c tabstop=8 shiftwidth=8 expandtab textwidth=0: */
|
55
src/output.h
Normal file
55
src/output.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#ifndef DUNST_OUTPUT_H
|
||||||
|
#define DUNST_OUTPUT_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <glib.h>
|
||||||
|
#include <cairo.h>
|
||||||
|
|
||||||
|
typedef gpointer window;
|
||||||
|
|
||||||
|
struct dimensions {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int w;
|
||||||
|
int h;
|
||||||
|
|
||||||
|
int corner_radius;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct screen_info {
|
||||||
|
int id;
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
unsigned int h;
|
||||||
|
unsigned int mmh;
|
||||||
|
unsigned int w;
|
||||||
|
int dpi;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct output {
|
||||||
|
void (*init)(void);
|
||||||
|
void (*deinit)(void);
|
||||||
|
|
||||||
|
window (*win_create)(void);
|
||||||
|
void (*win_destroy)(window);
|
||||||
|
|
||||||
|
void (*win_show)(window);
|
||||||
|
void (*win_hide)(window);
|
||||||
|
|
||||||
|
void (*display_surface)(cairo_surface_t *srf, window win, const struct dimensions*);
|
||||||
|
|
||||||
|
bool (*win_visible)(window);
|
||||||
|
cairo_t* (*win_get_context)(window);
|
||||||
|
|
||||||
|
const struct screen_info* (*get_active_screen)(void);
|
||||||
|
|
||||||
|
bool (*is_idle)(void);
|
||||||
|
bool (*have_fullscreen_window)(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct output* output_create(void);
|
||||||
|
|
||||||
|
const bool is_running_wayland(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/* vim: set ft=c tabstop=8 shiftwidth=8 expandtab textwidth=0: */
|
@ -25,6 +25,7 @@
|
|||||||
#include "notification.h"
|
#include "notification.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#include "output.h" // For checking if wayland is active.
|
||||||
|
|
||||||
/* notification lists */
|
/* notification lists */
|
||||||
static GQueue *waiting = NULL; /**< all new notifications get into here */
|
static GQueue *waiting = NULL; /**< all new notifications get into here */
|
||||||
@ -143,7 +144,8 @@ static bool queues_notification_is_finished(struct notification *n, struct dunst
|
|||||||
bool is_idle = status.fullscreen ? false : status.idle;
|
bool is_idle = status.fullscreen ? false : status.idle;
|
||||||
|
|
||||||
/* don't timeout when user is idle */
|
/* don't timeout when user is idle */
|
||||||
if (is_idle && !n->transient) {
|
/* NOTE: Idle is not working on wayland */
|
||||||
|
if (is_idle && !n->transient && !is_running_wayland()) {
|
||||||
n->start = time_monotonic_now();
|
n->start = time_monotonic_now();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -69,12 +69,12 @@ static double screen_dpi_get_from_xft(void)
|
|||||||
return screen_dpi_xft_cache;
|
return screen_dpi_xft_cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
static double screen_dpi_get_from_monitor(struct screen_info *scr)
|
static double screen_dpi_get_from_monitor(const struct screen_info *scr)
|
||||||
{
|
{
|
||||||
return (double)scr->h * 25.4 / (double)scr->mmh;
|
return (double)scr->h * 25.4 / (double)scr->mmh;
|
||||||
}
|
}
|
||||||
|
|
||||||
double screen_dpi_get(struct screen_info *scr)
|
double screen_dpi_get(const struct screen_info *scr)
|
||||||
{
|
{
|
||||||
if ( ! settings.force_xinerama
|
if ( ! settings.force_xinerama
|
||||||
&& settings.per_monitor_dpi)
|
&& settings.per_monitor_dpi)
|
||||||
@ -156,6 +156,7 @@ void randr_update(void)
|
|||||||
screens[i].w = m[i].width;
|
screens[i].w = m[i].width;
|
||||||
screens[i].h = m[i].height;
|
screens[i].h = m[i].height;
|
||||||
screens[i].mmh = m[i].mheight;
|
screens[i].mmh = m[i].mheight;
|
||||||
|
screens[i].dpi = screen_dpi_get(&screens[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
XRRFreeMonitors(m);
|
XRRFreeMonitors(m);
|
||||||
@ -300,7 +301,7 @@ bool window_is_fullscreen(Window window)
|
|||||||
* Select the screen on which the Window
|
* Select the screen on which the Window
|
||||||
* should be displayed.
|
* should be displayed.
|
||||||
*/
|
*/
|
||||||
struct screen_info *get_active_screen(void)
|
const struct screen_info *get_active_screen(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
bool force_follow_mouse = false;
|
bool force_follow_mouse = false;
|
||||||
|
@ -7,21 +7,12 @@
|
|||||||
|
|
||||||
#define INRECT(x,y,rx,ry,rw,rh) ((x) >= (rx) && (x) < (rx)+(rw) && (y) >= (ry) && (y) < (ry)+(rh))
|
#define INRECT(x,y,rx,ry,rw,rh) ((x) >= (rx) && (x) < (rx)+(rw) && (y) >= (ry) && (y) < (ry)+(rh))
|
||||||
|
|
||||||
struct screen_info {
|
|
||||||
int id;
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
unsigned int h;
|
|
||||||
unsigned int mmh;
|
|
||||||
unsigned int w;
|
|
||||||
};
|
|
||||||
|
|
||||||
void init_screens(void);
|
void init_screens(void);
|
||||||
void screen_dpi_xft_cache_purge(void);
|
void screen_dpi_xft_cache_purge(void);
|
||||||
bool screen_check_event(XEvent *ev);
|
bool screen_check_event(XEvent *ev);
|
||||||
|
|
||||||
struct screen_info *get_active_screen(void);
|
const struct screen_info *get_active_screen(void);
|
||||||
double screen_dpi_get(struct screen_info *scr);
|
double screen_dpi_get(const struct screen_info *scr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the currently focused window and check if it's in
|
* Find the currently focused window and check if it's in
|
||||||
|
37
src/x11/x.c
37
src/x11/x.c
@ -67,8 +67,10 @@ static int x_shortcut_tear_down_error_handler(void);
|
|||||||
static void setopacity(Window win, unsigned long opacity);
|
static void setopacity(Window win, unsigned long opacity);
|
||||||
static void x_handle_click(XEvent ev);
|
static void x_handle_click(XEvent ev);
|
||||||
|
|
||||||
static void x_win_move(struct window_x11 *win, int x, int y, int width, int height)
|
static void x_win_move(window winptr, int x, int y, int width, int height)
|
||||||
{
|
{
|
||||||
|
struct window_x11 *win = (struct window_x11*)winptr;
|
||||||
|
|
||||||
/* move and resize */
|
/* move and resize */
|
||||||
if (x != win->dim.x || y != win->dim.y) {
|
if (x != win->dim.x || y != win->dim.y) {
|
||||||
XMoveWindow(xctx.dpy, win->xwin, x, y);
|
XMoveWindow(xctx.dpy, win->xwin, x, y);
|
||||||
@ -126,8 +128,9 @@ static void x_win_corners_shape(struct window_x11 *win, const int rad)
|
|||||||
win->xwin, ShapeNotifyMask);
|
win->xwin, ShapeNotifyMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void x_win_corners_unshape(struct window_x11 *win)
|
static void x_win_corners_unshape(window winptr)
|
||||||
{
|
{
|
||||||
|
struct window_x11 *win = (struct window_x11*)winptr;
|
||||||
XRectangle rect = {
|
XRectangle rect = {
|
||||||
.x = 0,
|
.x = 0,
|
||||||
.y = 0,
|
.y = 0,
|
||||||
@ -153,8 +156,9 @@ static bool x_win_composited(struct window_x11 *win)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void x_display_surface(cairo_surface_t *srf, struct window_x11 *win, const struct dimensions *dim)
|
void x_display_surface(cairo_surface_t *srf, window winptr, const struct dimensions *dim)
|
||||||
{
|
{
|
||||||
|
struct window_x11 *win = (struct window_x11*)winptr;
|
||||||
x_win_move(win, dim->x, dim->y, dim->w, dim->h);
|
x_win_move(win, dim->x, dim->y, dim->w, dim->h);
|
||||||
cairo_xlib_surface_set_size(win->root_surface, dim->w, dim->h);
|
cairo_xlib_surface_set_size(win->root_surface, dim->w, dim->h);
|
||||||
|
|
||||||
@ -173,14 +177,14 @@ void x_display_surface(cairo_surface_t *srf, struct window_x11 *win, const struc
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool x_win_visible(struct window_x11 *win)
|
bool x_win_visible(window winptr)
|
||||||
{
|
{
|
||||||
return win->visible;
|
return ((struct window_x11*)winptr)->visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
cairo_t* x_win_get_context(struct window_x11 *win)
|
cairo_t* x_win_get_context(window winptr)
|
||||||
{
|
{
|
||||||
return win->c_ctx;
|
return ((struct window_x11*)win)->c_ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setopacity(Window win, unsigned long opacity)
|
static void setopacity(Window win, unsigned long opacity)
|
||||||
@ -278,7 +282,7 @@ gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, gpointer
|
|||||||
struct window_x11 *win = ((struct x11_source*) source)->win;
|
struct window_x11 *win = ((struct x11_source*) source)->win;
|
||||||
|
|
||||||
bool fullscreen_now;
|
bool fullscreen_now;
|
||||||
struct screen_info *scr;
|
const struct screen_info *scr;
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
unsigned int state;
|
unsigned int state;
|
||||||
while (XPending(xctx.dpy) > 0) {
|
while (XPending(xctx.dpy) > 0) {
|
||||||
@ -641,7 +645,7 @@ GSource* x_win_reg_source(struct window_x11 *win)
|
|||||||
/*
|
/*
|
||||||
* Setup the window
|
* Setup the window
|
||||||
*/
|
*/
|
||||||
struct window_x11 *x_win_create(void)
|
window x_win_create(void)
|
||||||
{
|
{
|
||||||
struct window_x11 *win = g_malloc0(sizeof(struct window_x11));
|
struct window_x11 *win = g_malloc0(sizeof(struct window_x11));
|
||||||
|
|
||||||
@ -671,7 +675,7 @@ struct window_x11 *x_win_create(void)
|
|||||||
ExposureMask | KeyPressMask | VisibilityChangeMask |
|
ExposureMask | KeyPressMask | VisibilityChangeMask |
|
||||||
ButtonReleaseMask | FocusChangeMask| StructureNotifyMask;
|
ButtonReleaseMask | FocusChangeMask| StructureNotifyMask;
|
||||||
|
|
||||||
struct screen_info *scr = get_active_screen();
|
const struct screen_info *scr = get_active_screen();
|
||||||
win->xwin = XCreateWindow(xctx.dpy,
|
win->xwin = XCreateWindow(xctx.dpy,
|
||||||
root,
|
root,
|
||||||
scr->x,
|
scr->x,
|
||||||
@ -713,11 +717,13 @@ struct window_x11 *x_win_create(void)
|
|||||||
}
|
}
|
||||||
XSelectInput(xctx.dpy, root, root_event_mask);
|
XSelectInput(xctx.dpy, root, root_event_mask);
|
||||||
|
|
||||||
return win;
|
return (window)win;
|
||||||
}
|
}
|
||||||
|
|
||||||
void x_win_destroy(struct window_x11 *win)
|
void x_win_destroy(window winptr)
|
||||||
{
|
{
|
||||||
|
struct window_x11 *win = (struct window_x11*)winptr;
|
||||||
|
|
||||||
g_source_destroy(win->esrc);
|
g_source_destroy(win->esrc);
|
||||||
g_source_unref(win->esrc);
|
g_source_unref(win->esrc);
|
||||||
|
|
||||||
@ -731,8 +737,10 @@ void x_win_destroy(struct window_x11 *win)
|
|||||||
/*
|
/*
|
||||||
* Show the window and grab shortcuts.
|
* Show the window and grab shortcuts.
|
||||||
*/
|
*/
|
||||||
void x_win_show(struct window_x11 *win)
|
void x_win_show(window winptr)
|
||||||
{
|
{
|
||||||
|
struct window_x11 *win = (struct window_x11*)winptr;
|
||||||
|
|
||||||
/* window is already mapped or there's nothing to show */
|
/* window is already mapped or there's nothing to show */
|
||||||
if (win->visible)
|
if (win->visible)
|
||||||
return;
|
return;
|
||||||
@ -763,8 +771,9 @@ void x_win_show(struct window_x11 *win)
|
|||||||
/*
|
/*
|
||||||
* Hide the window and ungrab unused keyboard_shortcuts
|
* Hide the window and ungrab unused keyboard_shortcuts
|
||||||
*/
|
*/
|
||||||
void x_win_hide(struct window_x11 *win)
|
void x_win_hide(window winptr)
|
||||||
{
|
{
|
||||||
|
struct window_x11 *win = (struct window_x11*)winptr;
|
||||||
ASSERT_OR_RET(win->visible,);
|
ASSERT_OR_RET(win->visible,);
|
||||||
|
|
||||||
x_shortcut_ungrab(&settings.close_ks);
|
x_shortcut_ungrab(&settings.close_ks);
|
||||||
|
34
src/x11/x.h
34
src/x11/x.h
@ -11,6 +11,8 @@
|
|||||||
#include <X11/X.h>
|
#include <X11/X.h>
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
|
#include "../output.h"
|
||||||
|
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
|
|
||||||
struct keyboard_shortcut {
|
struct keyboard_shortcut {
|
||||||
@ -24,42 +26,24 @@ struct keyboard_shortcut {
|
|||||||
// Cyclical dependency
|
// Cyclical dependency
|
||||||
#include "../settings.h"
|
#include "../settings.h"
|
||||||
|
|
||||||
struct window_x11;
|
|
||||||
|
|
||||||
struct dimensions {
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
int w;
|
|
||||||
int h;
|
|
||||||
|
|
||||||
int corner_radius;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct x_context {
|
struct x_context {
|
||||||
Display *dpy;
|
Display *dpy;
|
||||||
XScreenSaverInfo *screensaver_info;
|
XScreenSaverInfo *screensaver_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct color {
|
|
||||||
double r;
|
|
||||||
double g;
|
|
||||||
double b;
|
|
||||||
double a;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct x_context xctx;
|
extern struct x_context xctx;
|
||||||
|
|
||||||
/* window */
|
/* window */
|
||||||
struct window_x11 *x_win_create(void);
|
window x_win_create(void);
|
||||||
void x_win_destroy(struct window_x11 *win);
|
void x_win_destroy(window);
|
||||||
|
|
||||||
void x_win_show(struct window_x11 *win);
|
void x_win_show(window);
|
||||||
void x_win_hide(struct window_x11 *win);
|
void x_win_hide(window);
|
||||||
|
|
||||||
void x_display_surface(cairo_surface_t *srf, struct window_x11 *win, const struct dimensions *dim);
|
void x_display_surface(cairo_surface_t *srf, window, const struct dimensions *dim);
|
||||||
|
|
||||||
bool x_win_visible(struct window_x11 *win);
|
bool x_win_visible(window);
|
||||||
cairo_t* x_win_get_context(struct window_x11 *win);
|
cairo_t* x_win_get_context(window);
|
||||||
|
|
||||||
/* X misc */
|
/* X misc */
|
||||||
bool x_is_idle(void);
|
bool x_is_idle(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user