Commit 92a95c7769f12f091b4bb1fab8c7e32a95f0607f

Authored by Perry Werneck
1 parent 35b14de2
Exists in master and in 1 other branch develop

Fixing fonte resize when terminal/view height changes.

src/terminal/font.c
... ... @@ -32,11 +32,9 @@
32 32 #include <lib3270.h>
33 33 #include <lib3270/log.h>
34 34  
35   - #define WIDTH_IN_PIXELS(terminal,x) (x * cols)
36   - #define HEIGHT_IN_PIXELS(terminal,x) (x * (rows+1))
37 35  
38   - #define CONTENTS_WIDTH(terminal) (cols * terminal->font.width)
39   - #define CONTENTS_HEIGHT(terminal) (((rows+2) * terminal->font.spacing)+OIA_TOP_MARGIN+2)
  36 + #define VIEW_HEIGTH_FROM_FONT(font_height) (( ((unsigned int) font_height) * (rows+1)) + OIA_TOP_MARGIN + 2)
  37 + #define VIEW_WIDTH_FROM_FONT(max_x_advance) (((unsigned int) max_x_advance) * cols)
40 38  
41 39 /*--[ Globals ]--------------------------------------------------------------------------------------*/
42 40  
... ... @@ -53,7 +51,16 @@ const gchar * v3270_get_default_font_name()
53 51 return v3270_default_font;
54 52 }
55 53  
56   -void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int height)
  54 +/**
  55 + * @brief Update font metrics based on view sizes.
  56 + *
  57 + * @param terminal v3270 terminal widget.
  58 + * @param cr Cairo context.
  59 + * @param width View width in pixels.
  60 + * @param height View height in pixels.
  61 + *
  62 + */
  63 +void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, unsigned int width, unsigned int height)
57 64 {
58 65 // update font metrics
59 66 unsigned int rows, cols, hFont, size;
... ... @@ -61,7 +68,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
61 68 cairo_font_extents_t extents;
62 69  
63 70 lib3270_get_screen_size(terminal->host,&rows,&cols);
64   - debug("Screen_size: %ux%u Scalled=%s",rows,cols,terminal->font.scaled ? "Yes" : "No");
  71 + debug("Screen_size: %ux%u Scalled=%s view_rows=%d view_cols=%d",rows,cols,terminal->font.scaled ? "Yes" : "No", (rows+OIA_TOP_MARGIN+3));
65 72  
66 73 terminal->font.weight = lib3270_get_toggle(terminal->host,LIB3270_TOGGLE_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL;
67 74  
... ... @@ -69,33 +76,38 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
69 76  
70 77 if(terminal->font.scaled)
71 78 {
  79 + /*
72 80 double w = ((double) width) / ((double)cols);
73   - double h = ((double) height) / ((double) (rows+2));
74   - double s = w < h ? w : h;
  81 + double h = ((double) height) / ((double) ((rows + OIA_TOP_MARGIN + 3)));
  82 + double s = (w < h) ? w : h;
  83 + */
  84 +
  85 + double s = 0.1;
75 86  
76 87 cairo_set_font_size(cr,s);
77 88 cairo_font_extents(cr,&extents);
78 89  
79   - while( HEIGHT_IN_PIXELS(terminal,(extents.height+extents.descent)) < height && WIDTH_IN_PIXELS(terminal,extents.max_x_advance) < width )
  90 + while( (VIEW_HEIGTH_FROM_FONT( (extents.height+extents.descent) ) < height) && (VIEW_WIDTH_FROM_FONT(extents.max_x_advance) < width) )
80 91 {
81   - s += 1.0;
  92 + s += 0.5;
82 93 cairo_set_font_size(cr,s);
83 94 cairo_font_extents(cr,&extents);
84 95 }
85 96  
86   - s -= 1.0;
  97 + s -= 0.5;
87 98  
88 99 cairo_set_font_size(cr,s < 1.0 ? 1.0 : s);
89 100 cairo_font_extents(cr,&extents);
  101 +
90 102 }
91 103 else
92 104 {
93   - static const int font_size[] = { 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 24, 26, 28, 32, 36, 40, 48, 56, 64, 72, 0 };
94   - int f;
  105 + static const unsigned int font_size[] = { 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 24, 26, 28, 32, 36, 40, 48, 56, 64, 72 };
  106 + size_t f;
95 107  
96 108 size = font_size[0];
97 109  
98   - for(f=0;font_size[f];f++)
  110 + for(f=0;f < G_N_ELEMENTS(font_size);f++)
99 111 {
100 112 cairo_set_font_size(cr,font_size[f]);
101 113 cairo_font_extents(cr,&extents);
... ... @@ -106,10 +118,21 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
106 118 terminal->minimum_height = ((rows+1) * (extents.height + extents.descent)) + (OIA_TOP_MARGIN+2);
107 119 }
108 120  
109   - if( HEIGHT_IN_PIXELS(terminal,(extents.height+extents.descent)) < height && WIDTH_IN_PIXELS(terminal,extents.max_x_advance) < width )
  121 + debug("font_size=%d y_advance=%u font_extents=%u+%u font_height=%u view_height=%u",
  122 + font_size[f],
  123 + (unsigned int) extents.max_y_advance,
  124 + (unsigned int) extents.height, (unsigned int) extents.descent,
  125 + VIEW_HEIGTH_FROM_FONT( (unsigned int) (extents.height + extents.descent) ),
  126 + height
  127 + );
  128 +
  129 + if( VIEW_HEIGTH_FROM_FONT((extents.height + extents.descent)) < height && VIEW_WIDTH_FROM_FONT(extents.max_x_advance) < width)
110 130 size = font_size[f];
  131 +
111 132 }
112 133  
  134 + debug("font_size=%d",size);
  135 +
113 136 cairo_set_font_size(cr,size);
114 137  
115 138 #if !GTK_CHECK_VERSION(3,0,0)
... ... @@ -134,7 +157,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
134 157 terminal->font.ascent = (int) extents.ascent;
135 158 terminal->font.descent = (int) extents.descent;
136 159  
137   - hFont = terminal->font.height + terminal->font.descent;
  160 + hFont = (unsigned int) (terminal->font.height + terminal->font.descent);
138 161  
139 162 // Create new cursor surface
140 163 if(terminal->cursor.surface)
... ... @@ -143,7 +166,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
143 166 terminal->cursor.surface = gdk_window_create_similar_surface(gtk_widget_get_window(GTK_WIDGET(terminal)),CAIRO_CONTENT_COLOR,terminal->font.width,hFont);
144 167  
145 168 // Center image
146   - size = CONTENTS_WIDTH(terminal);
  169 + size = VIEW_WIDTH_FROM_FONT(terminal->font.width);
147 170  
148 171 if(width >= size) {
149 172  
... ... @@ -158,11 +181,14 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
158 181  
159 182 debug("Width=%u size=%u left=%d",height, size, terminal->font.left);
160 183  
161   - terminal->font.spacing = height / (rows+2);
  184 + /*
  185 + terminal->font.spacing = height / (rows+1);
162 186 if((int) terminal->font.spacing < hFont)
163 187 terminal->font.spacing = hFont;
  188 + */
164 189  
165   - size = CONTENTS_HEIGHT(terminal);
  190 + terminal->font.spacing = hFont;
  191 + size = VIEW_HEIGTH_FROM_FONT(terminal->font.spacing);
166 192  
167 193 if(height >= size) {
168 194  
... ...
src/terminal/private.h
... ... @@ -311,7 +311,7 @@ G_GNUC_INTERNAL void v3270_draw_ssl_status(v3270 *widget, cairo_t *cr, GdkRec
311 311  
312 312 G_GNUC_INTERNAL void v3270_update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor);
313 313  
314   -G_GNUC_INTERNAL void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int height);
  314 +G_GNUC_INTERNAL void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, unsigned int width, unsigned int height);
315 315  
316 316 G_GNUC_INTERNAL void v3270_update_cursor_rect(v3270 *widget, GdkRectangle *rect, unsigned char chr, unsigned short attr);
317 317  
... ...
src/terminal/properties.c
... ... @@ -213,7 +213,7 @@
213 213 // Creating toggle properties.
214 214 for(ix = 0; ix < LIB3270_TOGGLE_COUNT; ix++)
215 215 {
216   - debug("Property %u=%s (Toggle)",(unsigned int) v3270_properties.type.toggle + ix, lib3270_get_toggle_name(ix));
  216 +// debug("Property %u=%s (Toggle)",(unsigned int) v3270_properties.type.toggle + ix, lib3270_get_toggle_name(ix));
217 217 v3270_properties.toggle[ix] = g_param_spec_boolean(lib3270_get_toggle_name(ix),lib3270_get_toggle_name(ix),lib3270_get_toggle_description(ix),FALSE,G_PARAM_WRITABLE|G_PARAM_READABLE);
218 218 v3270_install_property(gobject_class, v3270_properties.type.toggle + ix, v3270_properties.toggle[ix]);
219 219 }
... ... @@ -222,7 +222,7 @@
222 222 // Creating boolean properties.
223 223 for(ix = 0; bool_props[ix].name; ix++)
224 224 {
225   - debug("Property %u=%s (Boolean)",(unsigned int) v3270_properties.type.boolean + ix, bool_props[ix].name);
  225 +// debug("Property %u=%s (Boolean)",(unsigned int) v3270_properties.type.boolean + ix, bool_props[ix].name);
226 226 spec = g_param_spec_boolean(bool_props[ix].name, bool_props[ix].name, bool_props[ix].description, FALSE,(bool_props[ix].set == NULL ? G_PARAM_READABLE : (G_PARAM_READABLE|G_PARAM_WRITABLE)));
227 227 v3270_install_property(gobject_class, v3270_properties.type.boolean + ix, spec);
228 228  
... ... @@ -231,7 +231,7 @@
231 231 // Creating integer properties.
232 232 for(ix = 0; int_props[ix].name; ix++)
233 233 {
234   - debug("Property %u=%s (Integer)",(unsigned int) v3270_properties.type.integer + ix, int_props[ix].name);
  234 +// debug("Property %u=%s (Integer)",(unsigned int) v3270_properties.type.integer + ix, int_props[ix].name);
235 235  
236 236 spec = g_param_spec_int(
237 237 int_props[ix].name,
... ...
src/testprogram/testprogram.c
... ... @@ -258,9 +258,9 @@ static GtkToolItem * create_tool_item(GtkWidget *terminal, const gchar *label, c
258 258 GtkToolItem * item = gtk_toggle_tool_button_new();
259 259 gtk_tool_button_set_label(GTK_TOOL_BUTTON(item),label);
260 260  
261   - gtk_widget_set_can_focus(item,FALSE);
262   - gtk_widget_set_can_default(item,FALSE);
263   - gtk_widget_set_focus_on_click(item,FALSE);
  261 + gtk_widget_set_can_focus(GTK_WIDGET(item),FALSE);
  262 + gtk_widget_set_can_default(GTK_WIDGET(item),FALSE);
  263 + gtk_widget_set_focus_on_click(GTK_WIDGET(item),FALSE);
264 264  
265 265 g_signal_connect(GTK_WIDGET(item), "toggled", G_CALLBACK(callback), terminal);
266 266  
... ...