From 6485411de0b30ebbbab8fe9b91d1b3eda3611083 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Thu, 10 Jan 2013 10:43:11 +0000 Subject: [PATCH] Corrigindo problema no sublinhado... --- src/include/lib3270.h | 2 +- src/lib3270/api.h | 30 +----------------------------- src/lib3270/screen.c | 27 ++++++++++++++++----------- src/lib3270/toggles.c | 13 +++---------- src/pw3270/v3270/draw.c | 23 +++++++++++++++++++++++ 5 files changed, 44 insertions(+), 51 deletions(-) diff --git a/src/include/lib3270.h b/src/include/lib3270.h index d6f5027..1094f7a 100644 --- a/src/include/lib3270.h +++ b/src/include/lib3270.h @@ -110,7 +110,7 @@ LIB3270_TOGGLE_SMART_PASTE, LIB3270_TOGGLE_BOLD, LIB3270_TOGGLE_KEEP_SELECTED, - LIB3270_TOGGLE_UNDERLINE, + LIB3270_TOGGLE_UNDERLINE, /**< Show underline ? */ LIB3270_TOGGLE_CONNECT_ON_STARTUP, LIB3270_TOGGLE_KP_ALTERNATIVE, /**< Keypad +/- move to next/previous field */ LIB3270_TOGGLE_BEEP, /**< Beep on errors */ diff --git a/src/lib3270/api.h b/src/lib3270/api.h index f30f6b7..7bd33cf 100644 --- a/src/lib3270/api.h +++ b/src/lib3270/api.h @@ -291,39 +291,11 @@ #define COLOR_ATTR_NONE 0x0000 #define COLOR_ATTR_FIELD LIB3270_ATTR_FIELD #define COLOR_ATTR_BLINK LIB3270_ATTR_BLINK - #define COLOR_ATTR_UNDERLINE LIB3270_ATTR_UNDERLINE +// #define COLOR_ATTR_UNDERLINE LIB3270_ATTR_UNDERLINE #define COLOR_ATTR_INTENSIFY LIB3270_ATTR_INTENSIFY -// #define CHAR_ATTR_CG LIB3270_ATTR_CG -// #define CHAR_ATTR_MARKER LIB3270_ATTR_MARKER - #define CHAR_ATTR_UNCONVERTED LIB3270_ATTR_CG -/* - struct _lib3270_option - { - const char *name; - enum - { - OPT_BOOLEAN, - OPT_STRING, - OPT_INTEGER, - OPT_XRM, - OPT_SKIP2, - OPT_NOP, - OPT_DONE - } type; - unsigned char flag; - const char *res_name; - void *aoff; - const char *description; - }; - - #define new_3270_session(m) lib3270_session_new(m) - - LOCAL_EXTERN const struct _lib3270_option * get_3270_option_table(int sz); -*/ - /* Set/Get screen contents */ #define find_field_attribute(s,a) lib3270_field_addr(s,a) diff --git a/src/lib3270/screen.c b/src/lib3270/screen.c index 62c0ea9..03536f7 100644 --- a/src/lib3270/screen.c +++ b/src/lib3270/screen.c @@ -210,16 +210,13 @@ static unsigned short calc_attrs(H3270 *session, int baddr, int fa_addr, int fa) else gr = 0; - if(!(gr & GR_REVERSE) && !bg) - { - if(gr & GR_BLINK) - a |= LIB3270_ATTR_BLINK; + if(gr & GR_BLINK) + a |= LIB3270_ATTR_BLINK; - if(gr & GR_UNDERLINE) - a |= LIB3270_ATTR_UNDERLINE; - } + if( (gr & GR_UNDERLINE) && lib3270_get_toggle(session,LIB3270_TOGGLE_UNDERLINE)) + a |= LIB3270_ATTR_UNDERLINE; - if(session->m3279 && (gr & (GR_BLINK | GR_UNDERLINE)) && !(gr & GR_REVERSE) && !bg) + if(session->m3279 && (gr & (GR_BLINK | GR_UNDERLINE)) && !(gr & GR_REVERSE)) a |= LIB3270_ATTR_BACKGROUND_INTENSITY; if(!session->m3279 && ((gr & GR_INTENSIFY) || FA_IS_HIGH(fa))) @@ -762,11 +759,14 @@ LIB3270_ACTION( testpattern ) { 0, text_pat }, }; - int row = 0; + static const unsigned char gr[] = { 0, GR_UNDERLINE, GR_BLINK }; + + int row = 0; int max; - int pos = 0; + int pos = 0; + int grpos = 0; int f; - int fg = COLOR_BLUE; + int fg = COLOR_BLUE; CHECK_SESSION_HANDLE(hSession); @@ -779,7 +779,11 @@ LIB3270_ACTION( testpattern ) { row = 0; if(++fg > COLOR_WHITE) + { fg = COLOR_BLUE; + if(++grpos > (sizeof(gr)/sizeof(gr[0]))) + grpos = 0; + } } pos = 0; } @@ -787,6 +791,7 @@ LIB3270_ACTION( testpattern ) hSession->ea_buf[f].bg = (fg == COLOR_BLACK) ? COLOR_WHITE : COLOR_BLACK; hSession->ea_buf[f].cs = pat[row].cs; hSession->ea_buf[f].cc = pat[row].cc[pos++]; + hSession->ea_buf[f].gr = gr[grpos]; } hSession->display(hSession); diff --git a/src/lib3270/toggles.c b/src/lib3270/toggles.c index 8eb1c8f..25c3dc0 100644 --- a/src/lib3270/toggles.c +++ b/src/lib3270/toggles.c @@ -149,7 +149,7 @@ static void toggle_altscreen(H3270 *session, struct lib3270_toggle *t, LIB3270_T set_viewsize(session,t->value ? 24 : session->maxROWS,80); } -static void toggle_monocase(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt) +static void toggle_redraw(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt) { session->display(session); } @@ -172,17 +172,10 @@ void initialize_toggles(H3270 *session) session->toggle[f].upcall = toggle_nop; session->toggle[LIB3270_TOGGLE_RECTANGLE_SELECT].upcall = toggle_rectselect; - session->toggle[LIB3270_TOGGLE_MONOCASE].upcall = toggle_monocase; + session->toggle[LIB3270_TOGGLE_MONOCASE].upcall = toggle_redraw; + session->toggle[LIB3270_TOGGLE_UNDERLINE].upcall = toggle_redraw; session->toggle[LIB3270_TOGGLE_ALTSCREEN].upcall = toggle_altscreen; -/* -#if defined(X3270_TRACE) - session->toggle[LIB3270_TOGGLE_DS_TRACE].upcall = toggle_dsTrace; - session->toggle[LIB3270_TOGGLE_SCREEN_TRACE].upcall = toggle_screenTrace; - session->toggle[LIB3270_TOGGLE_EVENT_TRACE].upcall = toggle_eventTrace; -#endif -*/ - #if defined(X3270_ANSI) session->toggle[LIB3270_TOGGLE_LINE_WRAP].upcall = toggle_lineWrap; #endif diff --git a/src/pw3270/v3270/draw.c b/src/pw3270/v3270/draw.c index 2d78191..c1490e4 100644 --- a/src/pw3270/v3270/draw.c +++ b/src/pw3270/v3270/draw.c @@ -119,6 +119,28 @@ void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H32 get_element_colors(attr,&fg,&bg,color); v3270_draw_char(cr,chr,attr,session,height,rect,fg,bg); + + if(attr & LIB3270_ATTR_UNDERLINE) + { + cairo_scaled_font_t * font = cairo_get_scaled_font(cr); + cairo_font_extents_t extents; + double sl; + + cairo_scaled_font_extents(font,&extents); + + sl = extents.descent/3; + if(sl < 1) + sl = 1; + + gdk_cairo_set_source_color(cr,fg); + + cairo_rectangle(cr,rect->x,rect->y+sl+extents.ascent+(extents.descent/2),rect->width,sl); + cairo_fill(cr); + + cairo_stroke(cr); + } + + } void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *fg, GdkColor *bg) @@ -262,6 +284,7 @@ void v3270_draw_char(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 g_free(utf); } } + cairo_stroke(cr); } -- libgit2 0.21.2