diff --git a/atheos.cpp b/atheos.cpp index b223ad8..dba6930 100644 --- a/atheos.cpp +++ b/atheos.cpp @@ -625,6 +625,8 @@ struct graphics_driver atheos_driver = { ath_draw_vline, ath_scroll, ath_set_clip_area, + NULL, /* start_draw */ + NULL, /* end_draw */ ath_flush, NULL, /* block */ NULL, /* unblock */ diff --git a/bfu.c b/bfu.c index 7592bae..92a1c3a 100644 --- a/bfu.c +++ b/bfu.c @@ -386,6 +386,7 @@ static void display_menu_item_gfx(struct terminal *term, struct menu *menu, int struct graphics_device *dev = term->dev; int y; if (it < menu->view || it >= menu->ni || it >= menu->view + menu->nview) return; + if (drv->start_draw) drv->start_draw(dev); y = menu->y + G_MENU_TOP_BORDER + (it - menu->view) * G_BFU_FONT_SIZE; if (item->hotkey == M_BAR && !get_text_translation(item->text, term)[0]) { drv->fill_area(dev, menu->x + (G_MENU_LEFT_BORDER - 1) / 2 + 1, y, menu->x + menu->xw - (G_MENU_LEFT_BORDER + 1) / 2, y + (G_BFU_FONT_SIZE - 1) / 2, bfu_bg_color); @@ -464,6 +465,7 @@ static void display_menu_item_gfx(struct terminal *term, struct menu *menu, int drv->fill_area(dev, menu->x + menu->xw - G_MENU_LEFT_BORDER - G_MENU_LEFT_INNER_BORDER, y, menu->x + menu->xw - G_MENU_LEFT_BORDER, y + G_BFU_FONT_SIZE, bfu_fg_color); } } + if (drv->end_draw) drv->end_draw(dev); } static void display_menu_gfx(struct terminal *term, void *menu_) @@ -480,6 +482,7 @@ static void display_menu_gfx(struct terminal *term, void *menu_) #define PX2 (menu->x + menu->xw - (G_MENU_LEFT_BORDER + 1) / 2) #define PY1 (menu->y + (G_MENU_TOP_BORDER - 1) / 2) #define PY2 (menu->y + menu->yw - (G_MENU_TOP_BORDER + 1) / 2) + if (drv->start_draw) drv->start_draw(dev); drv->fill_area(dev, menu->x, menu->y, menu->x + menu->xw, PY1, bfu_bg_color); drv->fill_area(dev, menu->x, PY1, PX1, PY2 + 1, bfu_bg_color); drv->fill_area(dev, PX2 + 1, PY1, menu->x + menu->xw, PY2 + 1, bfu_bg_color); @@ -494,6 +497,7 @@ static void display_menu_gfx(struct terminal *term, void *menu_) menu_ptr_set = 0; for (p = menu->view; p < menu->ni && p < menu->view + menu->nview; p++) display_menu_item_gfx(term, menu, p); if (!menu_ptr_set) set_window_ptr(menu->win, menu->x, menu->y); + if (drv->end_draw) drv->end_draw(dev); } #endif @@ -723,6 +727,7 @@ static void display_mainmenu(struct terminal *term, void *menu_) } else { struct graphics_device *dev = term->dev; int i, p; + if (drv->start_draw) drv->start_draw(dev); drv->fill_area(dev, 0, 0, p = G_MAINMENU_LEFT_BORDER, G_BFU_FONT_SIZE, bfu_bg_color); for (i = 0; i < menu->ni; i++) { int s = i == menu->selected; @@ -743,6 +748,7 @@ static void display_mainmenu(struct terminal *term, void *menu_) } } drv->fill_area(dev, p, 0, term->x, G_BFU_FONT_SIZE, bfu_bg_color); + if (drv->end_draw) drv->end_draw(dev); #endif } } @@ -967,6 +973,7 @@ void display_dlg_item(struct dialog_data *dlg, struct dialog_item_data *di, int } else { struct rect rr; struct graphics_device *dev = term->dev; + if (drv->start_draw) drv->start_draw(dev); if (!dlg->s) restrict_clip_area(dev, &rr, dlg->rr.x1, dlg->rr.y1, dlg->rr.x2, dlg->rr.y2); switch (di->item->type) { int p, pp; @@ -1075,6 +1082,7 @@ void display_dlg_item(struct dialog_data *dlg, struct dialog_item_data *di, int internal_error("display_dlg_item: unknown item: %d", di->item->type); } if (!dlg->s) set_clip_area(dev, &rr); + if (drv->end_draw) drv->end_draw(dev); #endif } } @@ -1230,9 +1238,11 @@ static void redraw_dialog(struct terminal *term, void *dlg_) } #ifdef G if (F) { + if (drv->start_draw) drv->start_draw(term->dev); set_clip_area(term->dev, &dlg->r); for (i = 0; i < dlg->s->m; i++) if (is_rect_valid(&dlg->s->r[i])) drv->fill_area(term->dev, dlg->s->r[i].x1, dlg->s->r[i].y1, dlg->s->r[i].x2, dlg->s->r[i].y2, bfu_bg_color); + if (drv->end_draw) drv->end_draw(term->dev); mem_free(dlg->s); dlg->s = NULL; } @@ -1791,6 +1801,7 @@ void draw_dlg(struct dialog_data *dlg) if (TXT_Y < dlg->y + G_DIALOG_TOP_BORDER + G_DIALOG_HLINE_SPACE + 1 - G_BFU_FONT_SIZE) TXT_Y = dlg->y + G_DIALOG_TOP_BORDER + G_DIALOG_HLINE_SPACE + 1 - G_BFU_FONT_SIZE; set_window_pos(dlg->win, dlg->x, dlg->y, dlg->x + dlg->xw, dlg->y + dlg->yw); + if (drv->start_draw) drv->start_draw(dev); restrict_clip_area(dev, &r, TXT_X, TXT_Y, TXT_X + tl, TXT_Y + G_BFU_FONT_SIZE); rt.x1 = TXT_X; rt.x2 = TXT_X + tl; @@ -1837,6 +1848,7 @@ void draw_dlg(struct dialog_data *dlg) add_to_rect_set(&dlg->s, &dlg->rr); exclude_rect_from_set(&dlg->s, &rt); restrict_clip_area(dev, &dlg->r, dlg->rr.x1, dlg->rr.y1, dlg->rr.x2, dlg->rr.y2); + if (drv->end_draw) drv->end_draw(dev); #endif } } diff --git a/dip.c b/dip.c index 2c75109..868adef 100644 --- a/dip.c +++ b/dip.c @@ -2020,6 +2020,7 @@ void g_print_text(struct graphics_device *device, int x, int y, struct style *st if (y + style->height <= device->clip.y1 || y >= device->clip.y2) goto o; if (style->flags & FF_UNDERLINE || style->flags & FF_STRIKE) { + if (drv->start_draw) drv->start_draw(device); /* Underline or strike */ if (!width) { width = &my_width; @@ -2050,6 +2051,7 @@ void g_print_text(struct graphics_device *device, int x, int y, struct style *st set_clip_area(device, &saved_clip); } style->flags = original_flags; + if (drv->end_draw) drv->end_draw(device); return; } while (*text) { diff --git a/directfb.c b/directfb.c index bff6f03..66d2e7e 100644 --- a/directfb.c +++ b/directfb.c @@ -793,6 +793,8 @@ struct graphics_driver directfb_driver = directfb_draw_vline, directfb_scroll, directfb_set_clip_area, + NULL, /* start_draw */ + NULL, /* end_draw */ directfb_flush, NULL, /* block */ NULL, /* unblock */ diff --git a/framebuf.c b/framebuf.c index 7395170..4e2b82a 100644 --- a/framebuf.c +++ b/framebuf.c @@ -2145,6 +2145,8 @@ struct graphics_driver fb_driver = { fb_draw_vline, fb_scroll, (void (*)(struct graphics_device *dev))NULL, /* set_clip_area */ + NULL, /* start_draw */ + NULL, /* end_draw */ (void (*)(struct graphics_device *dev))NULL, /* flush */ fb_block, fb_unblock, diff --git a/grx.c b/grx.c index 8a27e41..dd0475e 100644 --- a/grx.c +++ b/grx.c @@ -559,6 +559,8 @@ struct graphics_driver grx_driver = { grx_draw_vline, grx_scroll, grx_set_clip_area, + NULL, /* start_draw */ + NULL, /* end_draw */ NULL, grx_block, grx_unblock, diff --git a/haiku.cpp b/haiku.cpp index 8031d8f..63f884c 100644 --- a/haiku.cpp +++ b/haiku.cpp @@ -988,6 +988,8 @@ struct graphics_driver haiku_driver = { be_draw_vline, be_scroll, be_set_clip_area, + NULL, /* start_draw */ + NULL, /* end_draw */ be_flush, NULL, /* block */ NULL, /* unblock */ diff --git a/html_gr.c b/html_gr.c index e98affe..0db9236 100644 --- a/html_gr.c +++ b/html_gr.c @@ -62,7 +62,9 @@ void g_draw_background(struct graphics_device *dev, struct background *bg, int x } if (test_int_overflow(x, xw, &x2)) x2 = MAXINT; if (test_int_overflow(y, yw, &y2)) y2 = MAXINT; + if (drv->start_draw) drv->start_draw(dev); drv->fill_area(dev, x, y, x2, y2, color); + if (drv->end_draw) drv->end_draw(dev); } static void g_put_chars(void *, unsigned char *, int); diff --git a/img.c b/img.c index e4b78d9..26226bb 100644 --- a/img.c +++ b/img.c @@ -1044,6 +1044,7 @@ int get_foreground(int rgb) static void draw_frame_mark(struct graphics_device *dev, int x, int y, int xw, int yw, long bg, long fg, int broken) { + if (drv->start_draw) drv->start_draw(dev); #ifdef DEBUG if (xw<1||yw<1) internal_error("zero dimension in draw_frame_mark"); #endif /* #ifdef DEBUG */ @@ -1101,6 +1102,7 @@ static void draw_frame_mark(struct graphics_device *dev, int x, int y, int xw, i draw_frame_mark(dev, x + 1, y + 1, xw - 2, yw - 2, bg, fg, 3); } } + if (drv->end_draw) drv->end_draw(dev); } static long image_backgronud(struct cached_image *cimg) @@ -1126,6 +1128,7 @@ static void draw_picture(struct f_data_c *fdatac, struct g_object_image *goi, in struct cached_image *cimg = goi->cimg; struct rect saved; + if (drv->start_draw) drv->start_draw(dev); #ifdef DEBUG if (goi->cimg->state < 12 || goi->cimg->state >= 16) { fprintf(stderr, "cimg->state=%d\n", cimg->state); @@ -1151,6 +1154,7 @@ static void draw_picture(struct f_data_c *fdatac, struct g_object_image *goi, in drv->fill_area(dev, x, y + cimg->bmp.y, x + goi->goti.go.xw, y + goi->goti.go.yw, bg); } set_clip_area(dev, &saved); + if (drv->end_draw) drv->end_draw(dev); } /* Ensures in buffer there is not newer picture than in bitmap. Allowed to be diff --git a/links.h b/links.h index 3a29a08..4e68df0 100644 --- a/links.h +++ b/links.h @@ -1904,6 +1904,7 @@ struct graphics_device { /*int left, right, top, bottom;*/ struct rect clip; /* right, bottom are coords of the first point that are outside the clipping area */ + int drawing; void *driver_data; @@ -1970,6 +1971,9 @@ struct graphics_driver { /* when set is not NULL rectangles in the set (uncovered area) should be redrawn */ void (*set_clip_area)(struct graphics_device *dev); + void (*start_draw)(struct graphics_device *dev); + void (*end_draw)(struct graphics_device *dev); + void (*flush)(struct graphics_device *dev); int (*block)(struct graphics_device *dev); /* restore old videomode and disable drawing on terminal */ diff --git a/listedit.c b/listedit.c index bc025a6..edbefa4 100644 --- a/listedit.c +++ b/listedit.c @@ -277,6 +277,8 @@ static int draw_bfu_element(struct terminal * term, int x, int y, unsigned char struct graphics_device *dev=term->dev; struct rect r; + if (drv->start_draw) drv->start_draw(dev); + restrict_clip_area(dev,&r,x,y,x+5*BFU_GRX_WIDTH,y+BFU_GRX_HEIGHT); switch (type) @@ -397,6 +399,7 @@ static int draw_bfu_element(struct terminal * term, int x, int y, unsigned char } set_clip_area(dev, &r); + if (drv->end_draw) drv->end_draw(dev); return BFU_ELEMENT_WIDTH; } #endif @@ -1078,11 +1081,13 @@ static void redraw_list_element(struct terminal *term, struct dialog_data *dlg, struct rect old_area; struct style *stl = l == ld->current_pos ? bfu_style_wb : bfu_style_bw; + if (drv->start_draw) drv->start_draw(term->dev); restrict_clip_area(term->dev, &old_area, dlg->x + x + DIALOG_LB, y, dlg->x + DIALOG_LB + w, y + G_BFU_FONT_SIZE); g_print_text(term->dev, dlg->x + x + DIALOG_LB, y, stl, txt, NULL); x += g_text_width(stl, txt); drv->fill_area(term->dev, dlg->x + DIALOG_LB + x, y, dlg->x + DIALOG_LB + w, y + G_BFU_FONT_SIZE, bgcolor); set_clip_area(term->dev, &old_area); + if (drv->end_draw) drv->end_draw(term->dev); } #endif mem_free(txt); @@ -1099,6 +1104,7 @@ static void redraw_list(struct terminal *term, void *bla) int w = dlg->xw - 2 * DIALOG_LB - (F ? sirka_scrollovadla : 0); y = dlg->y + DIALOG_TB; + if (drv->start_draw) drv->start_draw(term->dev); #ifdef G if (F) { int total = get_total_items(ld); @@ -1123,6 +1129,7 @@ static void redraw_list(struct terminal *term, void *bla) if (dlg->s) exclude_from_set(&dlg->s, dlg->x + DIALOG_LB, y, dlg->x + DIALOG_LB + w, dlg->y + DIALOG_TB + ld->n_items * G_BFU_FONT_SIZE); } #endif + if (drv->end_draw) drv->end_draw(term->dev); } diff --git a/pmshell.c b/pmshell.c index 6623d91..702ab6a 100644 --- a/pmshell.c +++ b/pmshell.c @@ -2887,6 +2887,8 @@ struct graphics_driver pmshell_driver = { pm_draw_vline, pm_scroll, NULL, + NULL, /* start_draw */ + NULL, /* end_draw */ pm_flush, NULL, /* block */ NULL, /* unblock */ diff --git a/session.c b/session.c index ad2281d..523d881 100644 --- a/session.c +++ b/session.c @@ -284,9 +284,11 @@ static void x_print_screen_status(struct terminal *term, void *ses_) if (ses->st) print_text(term, 0, term->y - 1, (int)strlen(cast_const_char ses->st), ses->st, COLOR_STATUS); #ifdef G } else { + if (drv->start_draw) drv->start_draw(term->dev); int l = 0; if (ses->st) g_print_text(term->dev, 0, term->y - G_BFU_FONT_SIZE, bfu_style_wb_mono, ses->st, &l); drv->fill_area(term->dev, l, term->y - G_BFU_FONT_SIZE, term->x, term->y, !proxies.only_proxies ? bfu_bg_color : bfu_fg_color); + if (drv->end_draw) drv->end_draw(term->dev); #endif } } @@ -666,6 +668,7 @@ void download_window_function(struct dialog_data *dlg) } else { unsigned char *q; int p, s, ss, m; + if (drv->start_draw) drv->start_draw(term->dev); y += G_BFU_FONT_SIZE; q = download_percentage(down, 1); extend_str(&q, 1); @@ -683,6 +686,7 @@ void download_window_function(struct dialog_data *dlg) if (dlg->s) exclude_from_set(&dlg->s, x, y, x + w, y + G_BFU_FONT_SIZE); mem_free(q); y += G_BFU_FONT_SIZE; + if (drv->end_draw) drv->end_draw(term->dev); #endif } } diff --git a/svgalib.c b/svgalib.c index 4c0c772..567be08 100644 --- a/svgalib.c +++ b/svgalib.c @@ -2380,6 +2380,8 @@ struct graphics_driver svga_driver = { NULL, /* draw_vline */ NULL, /* scroll */ NULL, /* set_clip_area */ + NULL, /* start_draw */ + NULL, /* end_draw */ NULL, /* flush */ vga_block, /* block */ vga_unblock, /* unblock */ diff --git a/view_gr.c b/view_gr.c index 6fe0414..8e96316 100644 --- a/view_gr.c +++ b/view_gr.c @@ -476,6 +476,7 @@ static long scroll_bar_bar_color; void draw_vscroll_bar(struct graphics_device *dev, int x, int y, int yw, int total, int view, int pos) { int spos, epos; + if (drv->start_draw) drv->start_draw(dev); drv->draw_hline(dev, x, y, x + G_SCROLL_BAR_WIDTH, scroll_bar_frame_color); drv->draw_vline(dev, x, y, y + yw, scroll_bar_frame_color); drv->draw_vline(dev, x + G_SCROLL_BAR_WIDTH - 1, y, y + yw, scroll_bar_frame_color); @@ -486,11 +487,13 @@ void draw_vscroll_bar(struct graphics_device *dev, int x, int y, int yw, int tot drv->fill_area(dev, x + 2, y + 1, x + G_SCROLL_BAR_WIDTH - 2, y + 2 + spos, scroll_bar_area_color); drv->fill_area(dev, x + 2, y + 2 + spos, x + G_SCROLL_BAR_WIDTH - 2, y + 2 + epos, scroll_bar_bar_color); drv->fill_area(dev, x + 2, y + 2 + epos, x + G_SCROLL_BAR_WIDTH - 2, y + yw - 1, scroll_bar_area_color); + if (drv->end_draw) drv->end_draw(dev); } void draw_hscroll_bar(struct graphics_device *dev, int x, int y, int xw, int total, int view, int pos) { int spos, epos; + if (drv->start_draw) drv->start_draw(dev); drv->draw_vline(dev, x, y, y + G_SCROLL_BAR_WIDTH, scroll_bar_frame_color); drv->draw_hline(dev, x, y, x + xw, scroll_bar_frame_color); drv->draw_hline(dev, x, y + G_SCROLL_BAR_WIDTH - 1, x + xw, scroll_bar_frame_color); @@ -501,6 +504,7 @@ void draw_hscroll_bar(struct graphics_device *dev, int x, int y, int xw, int tot drv->fill_area(dev, x + 1, y + 2, x + 2 + spos, y + G_SCROLL_BAR_WIDTH - 2, scroll_bar_area_color); drv->fill_area(dev, x + 2 + spos, y + 2, x + 2 + epos, y + G_SCROLL_BAR_WIDTH - 2, scroll_bar_bar_color); drv->fill_area(dev, x + 2 + epos, y + 2, x + xw - 1, y + G_SCROLL_BAR_WIDTH - 2, scroll_bar_area_color); + if (drv->end_draw) drv->end_draw(dev); } static void g_get_search(struct f_data *f, unsigned char *s) @@ -567,9 +571,11 @@ void draw_graphical_doc(struct terminal *t, struct f_data_c *scr, int active) vx = vs->view_posx; vy = vs->view_pos; restrict_clip_area(t->dev, &old, scr->xp, scr->yp, scr->xp + xw, scr->yp + yw); + if (drv->start_draw) drv->start_draw(t->dev); if (scr->vsb) draw_vscroll_bar(t->dev, scr->xp + xw - G_SCROLL_BAR_WIDTH, scr->yp, yw - scr->hsb * G_SCROLL_BAR_WIDTH, scr->f_data->y, yw - scr->hsb * G_SCROLL_BAR_WIDTH, vs->view_pos); if (scr->hsb) draw_hscroll_bar(t->dev, scr->xp, scr->yp + yw - G_SCROLL_BAR_WIDTH, xw - scr->vsb * G_SCROLL_BAR_WIDTH, scr->f_data->x, xw - scr->vsb * G_SCROLL_BAR_WIDTH, vs->view_posx); if (scr->vsb && scr->hsb) drv->fill_area(t->dev, scr->xp + xw - G_SCROLL_BAR_WIDTH, scr->yp + yw - G_SCROLL_BAR_WIDTH, scr->xp + xw, scr->yp + yw, scroll_bar_frame_color); + if (drv->end_draw) drv->end_draw(t->dev); restrict_clip_area(t->dev, NULL, scr->xp, scr->yp, scr->xp + xw - scr->vsb * G_SCROLL_BAR_WIDTH, scr->yp + yw - scr->hsb * G_SCROLL_BAR_WIDTH); /*debug("buu: %d %d %d, %d %d %d", scr->xl, vx, xw, scr->yl, vy, yw);*/ if (drv->flags & GD_DONT_USE_SCROLL && overwrite_instead_of_scroll) goto rrr; @@ -1326,6 +1332,7 @@ void draw_title(struct f_data_c *f) int b, z, w; struct graphics_device *dev = f->ses->term->dev; unsigned char *title = stracpy(!drv->set_title && f->f_data && f->f_data->title && f->f_data->title[0] ? f->f_data->title : NULL); + if (drv->start_draw) drv->start_draw(dev); if (!title) { if (f->rq && f->rq->url) title = display_url(f->ses->term, f->rq->url, 1); @@ -1342,6 +1349,7 @@ void draw_title(struct f_data_c *f) g_print_text(dev, b, 0, !proxies.only_proxies ? bfu_style_bw : bfu_style_wb, title, &b); drv->fill_area(dev, b, 0, dev->size.x2, G_BFU_FONT_SIZE, !proxies.only_proxies ? bfu_bg_color : bfu_fg_color); mem_free(title); + if (drv->end_draw) drv->end_draw(dev); } static struct f_data *srch_f_data; diff --git a/x.c b/x.c index 1bcebc5..d119394 100644 --- a/x.c +++ b/x.c @@ -2985,12 +2985,12 @@ struct graphics_driver x_driver = { x_init_device, x_shutdown_device, x_shutdown_driver, - NULL, + NULL, /* emergency_shutdown */ x_after_fork, x_get_driver_param, x_get_af_unix_name, - NULL, - NULL, + NULL, /* get_margin */ + NULL, /* set_margin */ x_get_empty_bitmap, x_register_bitmap, x_prepare_strip, @@ -3002,7 +3002,9 @@ struct graphics_driver x_driver = { x_draw_hline, x_draw_vline, x_scroll, - NULL, + NULL, /* set_clip_area */ + NULL, /* start_draw */ + NULL, /* end_draw */ x_flush, NULL, /* block */ NULL, /* unblock */