Пример #1
0
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();
}
Пример #2
0
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;
}