&obj->e, &obj->char_a, &obj->char_b);
// default to DEFAULTNETDEV
- buf = strndup(buf ? buf : "DEFAULTNETDEV", text_buffer_size);
+ buf = strndup(buf ? buf : DEFAULTNETDEV, text_buffer_size);
obj->data.net = get_net_stat(buf);
free(buf);
#endif /* X11 */
&obj->e, &obj->char_a, &obj->char_b);
// default to DEFAULTNETDEV
- buf = strndup(buf ? buf : "DEFAULTNETDEV", text_buffer_size);
+ buf = strndup(buf ? buf : DEFAULTNETDEV, text_buffer_size);
obj->data.net = get_net_stat(buf);
free(buf);
#endif
struct text_object root, struct information *cur)
{
struct text_object *obj;
+ int need_to_load_fonts = 0;
/* for the OBJ_top* handler */
struct process **needed = 0;
#ifdef X11
OBJ(font) {
new_font(p, obj->data.s);
+ need_to_load_fonts = 1;
}
#endif /* X11 */
/* TODO: move this correction from kB to kB/s elsewhere
}
obj = obj->next;
}
+#ifdef X11
+ /* load any new fonts we may have had */
+ if (need_to_load_fonts) {
+ load_fonts();
+ }
+#endif /* X11 */
}
double current_update_time, next_update_time, last_update_time;
} else {
cur_y += font_ascent();
}
- set_font();
font_h = font_height();
break;
}
|| ev.xconfigure.y != 0)) {
fixed_pos = 1;
} */
- set_font();
}
break;
}
#ifdef X11
- x_initialised = NO;
if (output_methods & TO_X) {
X11_initialisation();
}
}
text_buffer = malloc(max_user_text);
memset(text_buffer, 0, max_user_text);
- update_text();
#ifdef X11
X11_create_window();
#endif /* X11 */
+ update_text();
}
}
}
#ifdef X11
+#ifdef DEBUG
+/* WARNING, this type not in Xlib spec */
+int x11_error_handler(Display *d, XErrorEvent *err)
+ __attribute__((noreturn));
+int x11_error_handler(Display *d, XErrorEvent *err)
+{
+ ERR("X Error: type %i Display %lx XID %li serial %lu error_code %i request_code %i minor_code %i other Display: %lx\n",
+ err->type,
+ (long unsigned)err->display,
+ (long)err->resourceid,
+ err->serial,
+ err->error_code,
+ err->request_code,
+ err->minor_code,
+ (long unsigned)d
+ );
+ abort();
+}
+
+int x11_ioerror_handler(Display *d)
+ __attribute__((noreturn));
+int x11_ioerror_handler(Display *d)
+{
+ ERR("X Error: Display %lx\n",
+ (long unsigned)d
+ );
+ abort();
+}
+#endif /* DEBUG */
+
static void X11_initialisation(void)
{
if (x_initialised == YES) return;
init_X11(disp);
set_default_configurations_for_x();
x_initialised = YES;
+#ifdef DEBUG
+ _Xdebug = 1;
+ /* WARNING, this type not in Xlib spec */
+ XSetErrorHandler(&x11_error_handler);
+ XSetIOErrorHandler(&x11_ioerror_handler);
+#endif /* DEBUG */
}
static void X11_destroy_window(void)
#endif /* HAVE_XDAMAGE */
destroy_window();
}
+ x_initialised = NO;
}
static char **xargv = 0;
xargv, xargc);
#endif /* OWN_WINDOW */
- selected_font = 0;
+ setup_fonts();
load_fonts();
update_text_area(); /* to position text/window on screen */
create_gc();
- set_font();
draw_stuff();
x11_stuff.region = XCreateRegion();
#else
CONF("use_xft") {
if (string_to_bool(value)) {
- ERR("Xft not enabled");
+ ERR("Xft not enabled at compile time");
}
}
CONF("xftfont") {
int font_count = -1;
struct font_list *fonts = NULL;
-void set_font(void)
+void setup_fonts(void)
{
if ((output_methods & TO_X) == 0) {
return;
}
#ifdef XFT
- if (use_xft) {
- if (window.xftdraw != NULL) {
- XftDrawDestroy(window.xftdraw);
- }
+ if (use_xft && !window.xftdraw) {
window.xftdraw = XftDrawCreate(display, window.drawable,
- DefaultVisual(display, screen), DefaultColormap(display, screen));
- } else
-#endif
- {
- XSetFont(display, window.gc, fonts[selected_font].font->fid);
+ DefaultVisual(display, screen), DefaultColormap(display, screen));
}
+#endif
}
-int addfont(const char *data_in)
+int add_font(const char *data_in)
{
if ((output_methods & TO_X) == 0) {
return 0;
fonts = realloc(fonts, (sizeof(struct font_list) * (font_count + 1)));
memset(&fonts[font_count], 0, sizeof(struct font_list));
if (fonts == NULL) {
- CRIT_ERR("realloc in addfont");
+ CRIT_ERR("realloc in add_font");
}
// must account for null terminator
if (strlen(data_in) < DEFAULT_TEXT_BUFFER_SIZE) {
fonts[font_count].font_alpha = 0xffff;
#endif
} else {
- CRIT_ERR("Oops...looks like something overflowed in addfont().");
+ CRIT_ERR("Oops...looks like something overflowed in add_font().");
}
return font_count;
}
XftFontClose(display, fonts[i].xftfont);
fonts[i].xftfont = 0;
} else
-#endif
+#endif /* XFT */
{
XFreeFont(display, fonts[i].font);
fonts[i].font = 0;
fonts = 0;
font_count = -1;
selected_font = 0;
+#ifdef XFT
+ if (window.xftdraw) {
+ XftDrawDestroy(window.xftdraw);
+ window.xftdraw = 0;
+ }
+#endif /* XFT */
}
void load_fonts(void)
if (use_xft && fonts[i].xftfont) {
continue;
} else if (use_xft) {
- /* if (fonts[i].xftfont != NULL && selected_font == 0) {
- XftFontClose(display, fonts[i].xftfont);
- } */
fonts[i].xftfont = XftFontOpenName(display, screen,
fonts[i].name);
- if (fonts[i].xftfont != NULL) {
+ if (fonts[i].xftfont) {
continue;
}
}
#endif
/* load normal font */
- /* if (fonts[i].font != NULL) {
- XFreeFont(display, fonts[i].font);
- } */
-
if (fonts[i].font || (fonts[i].font = XLoadQueryFont(display, fonts[i].name)) == NULL) {
ERR("can't load font '%s'", fonts[i].name);
if ((fonts[i].font = XLoadQueryFont(display, "fixed")) == NULL) {
extern int selected_font;
extern int font_count;
-void set_font(void);
-int addfont(const char *);
+void setup_fonts(void);
+int add_font(const char *);
void set_first_font(const char *);
void free_fonts(void);
void load_fonts(void);
if (s->font_added > font_count || !s->font_added || (strncmp(args, fonts[s->font_added].name, DEFAULT_TEXT_BUFFER_SIZE) != EQUAL) ) {
int tmp = selected_font;
- selected_font = s->font_added = addfont(args);
- load_fonts();
+ selected_font = s->font_added = add_font(args);
selected_font = tmp;
}
} else {
/* X11 initializer */
void init_X11(const char *disp)
{
- if (display) {
- XCloseDisplay(display);
- }
- if ((display = XOpenDisplay(disp)) == NULL) {
- CRIT_ERR("can't open display: %s", XDisplayName(0));
+ if (!display) {
+ if ((display = XOpenDisplay(disp)) == NULL) {
+ CRIT_ERR("can't open display: %s", XDisplayName(0));
+ }
}
screen = DefaultScreen(display);