-#undef I3__FILE__
-#define I3__FILE__ "sighandler.c"
/*
* vim:ts=4:sw=4:expandtab
*
* i3 - an improved dynamic tiling window manager
- * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
- * © 2009-2010 Jan-Erik Rediger
+ * © 2009 Michael Stapelberg and contributors (see also: LICENSE)
+ * © 2009 Jan-Erik Rediger
*
* sighandler.c: Interactive crash dialog upon SIGSEGV/SIGABRT/SIGFPE (offers
* to restart inplace).
"or press",
"- 'b' to save a backtrace (needs GDB),",
"- 'r' to restart i3 in-place or",
- "- 'f' to forget the current layout and restart"
-};
+ "- 'f' to forget the current layout and restart"};
static int crash_text_longest = 5;
static int backtrace_string_index = 3;
static int backtrace_done = 0;
int stdin_pipe[2],
stdout_pipe[2];
- pipe(stdin_pipe);
- pipe(stdout_pipe);
+ if (pipe(stdin_pipe) == -1) {
+ ELOG("Failed to init stdin_pipe\n");
+ return -1;
+ }
+ if (pipe(stdout_pipe) == -1) {
+ ELOG("Failed to init stdout_pipe\n");
+ return -1;
+ }
/* close standard streams in case i3 is started from a terminal; gdb
* needs to run without controlling terminal for it to work properly in
"-ex", "set logging on",
"-ex", "bt full",
"-ex", "quit",
- NULL
- };
+ NULL};
execvp(args[0], args);
DLOG("Failed to exec GDB\n");
exit(1);
waitpid(pid_gdb, &status, 0);
- /* see if the backtrace was succesful or not */
+ /* see if the backtrace was successful or not */
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
DLOG("GDB did not run properly\n");
return -1;
*/
static int sig_draw_window(xcb_window_t win, int width, int height, int font_height, i3String **crash_text_i3strings) {
/* re-draw the background */
- xcb_rectangle_t border = { 0, 0, width, height},
- inner = { 2, 2, width - 4, height - 4};
- xcb_change_gc(conn, pixmap_gc, XCB_GC_FOREGROUND, (uint32_t[]){ get_colorpixel("#FF0000") });
+ xcb_rectangle_t border = {0, 0, width, height},
+ inner = {2, 2, width - 4, height - 4};
+ xcb_change_gc(conn, pixmap_gc, XCB_GC_FOREGROUND, (uint32_t[]){get_colorpixel("#FF0000")});
xcb_poly_fill_rectangle(conn, pixmap, pixmap_gc, 1, &border);
- xcb_change_gc(conn, pixmap_gc, XCB_GC_FOREGROUND, (uint32_t[]){ get_colorpixel("#000000") });
+ xcb_change_gc(conn, pixmap_gc, XCB_GC_FOREGROUND, (uint32_t[]){get_colorpixel("#000000")});
xcb_poly_fill_rectangle(conn, pixmap, pixmap_gc, 1, &inner);
/* restore font color */
- set_font_colors(pixmap_gc, get_colorpixel("#FFFFFF"), get_colorpixel("#000000"));
+ set_font_colors(pixmap_gc, draw_util_hex_to_color("#FFFFFF"), draw_util_hex_to_color("#000000"));
char *bt_colour = "#FFFFFF";
if (backtrace_done < 0)
for (int i = 0; crash_text_i3strings[i] != NULL; ++i) {
/* fix the colour for the backtrace line when it finished */
if (i == backtrace_string_index)
- set_font_colors(pixmap_gc, get_colorpixel(bt_colour), get_colorpixel("#000000"));
+ set_font_colors(pixmap_gc, draw_util_hex_to_color(bt_colour), draw_util_hex_to_color("#000000"));
- draw_text(crash_text_i3strings[i], pixmap, pixmap_gc,
- 8, 5 + i * font_height, width - 16);
+ draw_text(crash_text_i3strings[i], pixmap, pixmap_gc, NULL,
+ 8, 5 + i * font_height, width - 16);
/* and reset the colour again for other lines */
if (i == backtrace_string_index)
- set_font_colors(pixmap_gc, get_colorpixel("#FFFFFF"), get_colorpixel("#000000"));
+ set_font_colors(pixmap_gc, draw_util_hex_to_color("#FFFFFF"), draw_util_hex_to_color("#000000"));
}
/* Copy the contents of the pixmap to the real window */
static int sig_handle_key_press(void *ignored, xcb_connection_t *conn, xcb_key_press_event_t *event) {
uint16_t state = event->state;
- /* Apparantly, after activating numlock once, the numlock modifier
+ /* Apparently, after activating numlock once, the numlock modifier
* stays turned on (use xev(1) to verify). So, to resolve useful
* keysyms, we remove the numlock flag from the event state */
state &= ~xcb_numlock_mask;
xcb_create_window(conn,
XCB_COPY_FROM_PARENT,
- win, /* the window id */
- root, /* parent == root */
+ win, /* the window id */
+ root, /* parent == root */
x, y, width, height, /* dimensions */
- 0, /* border = 0, we draw our own */
+ 0, /* border = 0, we draw our own */
XCB_WINDOW_CLASS_INPUT_OUTPUT,
XCB_WINDOW_CLASS_COPY_FROM_PARENT, /* copy visual from parent */
mask,
static void open_popups() {
/* width and height of the popup window, so that the text fits in */
- int crash_text_num = sizeof(crash_text) / sizeof(char*);
+ int crash_text_num = sizeof(crash_text) / sizeof(char *);
int height = 13 + (crash_text_num * config.font.height);
- int crash_text_length = sizeof(crash_text) / sizeof(char*);
+ int crash_text_length = sizeof(crash_text) / sizeof(char *);
i3String **crash_text_i3strings = smalloc(sizeof(i3String *) * (crash_text_length + 1));
/* Pre-compute i3Strings for our text */
for (int i = 0; i < crash_text_length; ++i) {
/* Strip off the highest bit (set if the event is generated) */
int type = (event->response_type & 0x7F);
if (type == XCB_KEY_PRESS) {
- sig_handle_key_press(NULL, conn, (xcb_key_press_event_t*)event);
+ sig_handle_key_press(NULL, conn, (xcb_key_press_event_t *)event);
}
free(event);
}
sigaction(SIGABRT, &action, NULL) == -1 ||
sigaction(SIGFPE, &action, NULL) == -1 ||
sigaction(SIGSEGV, &action, NULL) == -1)
- ELOG("Could not setup signal handler");
+ ELOG("Could not setup signal handler.\n");
}