volatile sig_atomic_t restart_wm = 0;
int outputs = 0;
/*int last_focus_event = FocusOut;*/
-int (*xerrorxlib)(Display *, XErrorEvent *);
int other_wm;
int ss_enabled = 0;
int xrandr_support;
pid_t bar_pid;
XftFont *bar_font;
char *bar_fonts;
+XftColor bar_font_color;
struct passwd *pwd;
/* layout manager data */
void store_float_geom(struct ws_win *, struct swm_region *);
void unmanage_window(struct ws_win *);
void update_window(struct ws_win *);
+#ifdef SWM_DEBUG
+char *get_atom_name(xcb_atom_t);
+#endif
/* function definitions */
xcb_char2b_t *
if (win == NULL)
return;
+ DNPRINTF(SWM_D_PROP, "ewmh_update_win_state: window: 0x%x, state: %ld, "
+ "action: %ld\n", win->id, state, action);
+
if (state == ewmh[_NET_WM_STATE_FULLSCREEN].atom)
mask = EWMH_F_FULLSCREEN;
if (state == ewmh[_NET_WM_STATE_ABOVE].atom)
uint32_t gcv[1];
int32_t x;
XGlyphInfo info;
+ XftDraw *draw;
len = strlen(s);
gcv[0] = r->s->c[SWM_S_COLOR_BAR_FONT].color;
xcb_change_gc(conn, r->s->bar_gc, XCB_GC_FOREGROUND, gcv);
- xcb_image_text_8(conn, len, r->bar->buffer, r->s->bar_gc, x,
- bar_font->height, s);
+ draw = XftDrawCreate(display, r->bar->buffer,
+ DefaultVisual(display, r->s->idx),
+ DefaultColormap(display, r->s->idx));
+
+ XftDrawStringUtf8(draw, &bar_font_color, bar_font, x,
+ bar_font->height, (FcChar8 *)s, len);
+
+ XftDrawDestroy(draw);
/* blt */
xcb_copy_area(conn, r->bar->buffer, r->bar->id, r->s->bar_gc, 0, 0,
char *font;
xcb_screen_t *screen = get_screen(r->s->idx);
uint32_t wa[3];
-
+ XRenderColor color;
+
if (bar_font) {
+ XftColorFree(display, DefaultVisual(display, r->s->idx),
+ DefaultColormap(display, r->s->idx), &bar_font_color);
XftFontClose(display, bar_font);
bar_font = NULL;
}
continue;
DNPRINTF(SWM_D_INIT, "bar_setup: try font %s\n", font);
- bar_font = XftFontOpenName(display, DefaultScreen(display),
+ bar_font = XftFontOpenName(display, r->s->idx,
font);
if (!bar_font) {
warnx("unable to load font %s", font);
break;
}
}
+ if (bar_font == NULL)
+ errx(1, "unable to open a font");
bar_height = bar_font->height + 4 * bar_border_width;
if (bar_height < 1)
bar_height = 1;
+ color.alpha = 0xffff;
+ color.red = (r->s->c[SWM_S_COLOR_BAR_FONT].color >> 16) & 0xffff;
+ color.green = (r->s->c[SWM_S_COLOR_BAR_FONT].color >> 8) & 0xffff;
+ color.blue = r->s->c[SWM_S_COLOR_BAR_FONT].color & 0xffff;
+ if (!XftColorAllocValue(display, DefaultVisual(display, r->s->idx),
+ DefaultColormap(display, r->s->idx), &color,
+ &bar_font_color))
+ warn("unable to allocate Xft color");
+
X(r->bar) = X(r);
Y(r->bar) = bar_at_bottom ? (Y(r) + HEIGHT(r) - bar_height) : Y(r);
WIDTH(r->bar) = WIDTH(r) - 2 * bar_border_width;
void
unmap_window(struct ws_win *win)
{
+ DNPRINTF(SWM_D_EVENT, "unmap_window: window: 0x%x\n", win->id);
+
if (win == NULL)
return;
/* don't unmap again */
- if (getstate(win->id) == XCB_ICCCM_WM_STATE_ICONIC)
+ if (getstate(win->id) == XCB_ICCCM_WM_STATE_WITHDRAWN)
return;
- set_win_state(win, XCB_ICCCM_WM_STATE_ICONIC);
+ set_win_state(win, XCB_ICCCM_WM_STATE_WITHDRAWN);
xcb_unmap_window(conn, win->id);
xcb_change_window_attributes(conn, win->id,
bar_extra = 1;
unmap_all();
+ XftFontClose(display, bar_font);
+ XftColorFree(display, DefaultVisual(display, r->s->idx),
+ DefaultColormap(display, r->s->idx), &bar_font_color);
xcb_key_symbols_free(syms);
xcb_flush(conn);
xcb_disconnect(conn);
event_drain(XCB_ENTER_NOTIFY);
else
xcb_flush(conn);
+
+ DNPRINTF(SWM_D_WS, "switchws: done\n");
}
void
screenchange((void *)evt);
}
-xerror(Display *d, XErrorEvent *ee)
-{
-#ifdef SWM_DEBUG
- char error_text[1024];
- XGetErrorText(display, ee->error_code, error_text, sizeof(error_text));
- DNPRINTF(SWM_D_MISC, "xerror: error_code: %u, error_text: %s\n",
- ee->error_code, error_text);
-#endif
- return -1;
-}
-
int
main(int argc, char *argv[])
{
if (!(display = XOpenDisplay(0)))
errx(1, "can not open display");
- /* prevent xlib from exiting on an error */
- xerrorxlib = XSetErrorHandler(xerror);
-
conn = XGetXCBConnection(display);
if (xcb_connection_has_error(conn))
errx(1, "can not get XCB connection");
+ XSetEventQueueOwner(display, XCBOwnsEventQueue);
+
xcb_prefetch_extension_data(conn, &xcb_randr_id);
xfd = xcb_get_file_descriptor(conn);
for (i = 0; i < num_screens; ++i)
if (screens[i].bar_gc != 0)
xcb_free_gc(conn, screens[i].bar_gc);
-#if 0
- XFreeFontSet(display, bar_font);
-#endif
+
+ XftFontClose(display, bar_font);
+ XftColorFree(display, DefaultVisual(display, 0),
+ DefaultColormap(display, 0), &bar_font_color);
xcb_key_symbols_free(syms);
xcb_flush(conn);
xcb_disconnect(conn);