void __panic(struct x86_registers regs, const char *func, const char *file, int line, const char *fmt, ...) { char buffer[BSIZE]; const char *panic_str = CONFIG_PANIC_STRING; size_t panic_str_len = strlen(panic_str); size_t buf_len = 0; va_list ap; int x, y, i, j; union x86_regs_u r; r.s_reg = regs; va_start(ap, fmt); /* Move the formatted message to the buffer[] */ buf_len = vsnprintf(buffer, BSIZE, fmt, ap); va_end(ap); /* Set the console color to white on red (Red Screen of Death :) */ set_console_attributes(BG_COLOR_RED | FG_COLOR_WHITE); clear_console(); /* Write the 'AKOSIX KERNEL PANIC' or other user-defined panic string centered */ kxya_print(CENTERED(panic_str_len), 1, BG_COLOR_BLACK | LIGHT | FG_COLOR_WHITE | BLINK, panic_str); /* The message with more ligher white, also centered */ kxya_print(CENTERED(buf_len), 3, BG_COLOR_RED|LIGHT|FG_COLOR_WHITE, buffer); set_xy(0, 5); /* Register dump */ for (i = 0; i <= X86_REG_EDI; i++) { kprintf("\t%s: %d [%x]\n", x86_register_name[i], r.a_reg[i], r.a_reg[i]); } kprintf("\n"); /* Segment registers are 16 bit long. Split the 32 bit array elements to high and low variables to overcome this. */ for (j = i = X86_REG_SS; i <= X86_REG_GS-1; i++, j++) { uint16_t high, low; high = r.a_reg[j] & 0x0000FFFF; low = r.a_reg[j] & 0xFFFF0000; kprintf("\t%s: %d [%x]\n", x86_register_name[i], high, high); kprintf("\t%s: %d [%x]\n", x86_register_name[++i], low, low); } // __backtrace(CONFIG_CONSOLE_WIDTH-LINE_LEN+5, 5, 5); /* Location of the panic file:function():line */ kxy_printf(0, CONSOLE_LAST_ROW, "%s:%s():%d", file, func, line); hang(); }
gboolean draw_callback (GtkWidget *widget, GdkEventExpose *event, UNUSED gpointer data) { guint width, height; cairo_pattern_t *color; cairo_path_t *bolt, *fill, *text; // Grab our widget size width = widget->allocation.width; height = widget->allocation.height; // Set up Cairo cairo_t *cr = gdk_cairo_create(widget->window); cairo_set_antialias(cr, CAIRO_ANTIALIAS_BEST); // Clear canvas #ifdef BACKGROUND_FILL_ENTIRE_WIDGET cairo_rectangle(cr, 0, 0, width, height); #else cairo_rectangle(cr, (MARGIN / 2) + STROKE_WIDTH, (MARGIN / 2) + STROKE_WIDTH, BATTERY_WIDTH, BATTERY_HEIGHT); #endif cairo_set_source_rgba(cr, COLOR_BACKGROUND, OPACITY_BACKGROUND); cairo_fill(cr); // Decide on a color color = cairo_pattern_create_rgb(COLOR_DEFAULT); if (battery_get_charging()) color = cairo_pattern_create_rgb(COLOR_CHARGING); if (battery_get_critical()) color = cairo_pattern_create_rgb(COLOR_CRITICAL); battery_border_draw(cr, color, (int)CENTERED(width, BATTERY_WIDTH), (int)CENTERED(height, BATTERY_HEIGHT), BATTERY_WIDTH, BATTERY_HEIGHT, STROKE_WIDTH, PEG_WIDTH, PEG_HEIGHT); int fill_x = CENTERED(width, BATTERY_WIDTH); int fill_y = CENTERED(height, BATTERY_HEIGHT); // Set fill style cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD); // Generate battery fill fill = battery_fill_generate(BATTERY_WIDTH, BATTERY_HEIGHT, battery_get_percent()); cairo_translate(cr, fill_x, fill_y); cairo_append_path(cr, fill); if (battery_get_charging()) { int bolt_x = CENTERED(BATTERY_WIDTH, BOLT_WIDTH); int bolt_y = CENTERED(BATTERY_HEIGHT, BOLT_HEIGHT); cairo_translate(cr, bolt_x, bolt_y); bolt = battery_bolt_generate(BOLT_WIDTH, BOLT_HEIGHT); cairo_append_path(cr, bolt); cairo_translate(cr, bolt_x, bolt_y); } else { cairo_text_extents_t extents; char strpercent[5]; snprintf(strpercent, 5, "%i%%", (int)(battery_get_percent() * 100)); cairo_select_font_face(cr, FONT_FACE, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size(cr, FONT_SIZE); cairo_text_extents(cr, strpercent, &extents); int text_x = CENTERED(BATTERY_WIDTH, extents.width); int text_y = CENTERED(BATTERY_HEIGHT, extents.height + extents.y_bearing*2); text = battery_text_generate(strpercent, FONT_FACE, FONT_SIZE); cairo_translate(cr, text_x, text_y); cairo_append_path(cr, text); cairo_translate(cr, -text_x, -text_y); } cairo_translate(cr, -fill_x, -fill_y); cairo_set_source(cr, color); cairo_fill(cr); return FALSE; }