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,11 +32,9 @@
32 #include <lib3270.h> 32 #include <lib3270.h>
33 #include <lib3270/log.h> 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 /*--[ Globals ]--------------------------------------------------------------------------------------*/ 39 /*--[ Globals ]--------------------------------------------------------------------------------------*/
42 40
@@ -53,7 +51,16 @@ const gchar * v3270_get_default_font_name() @@ -53,7 +51,16 @@ const gchar * v3270_get_default_font_name()
53 return v3270_default_font; 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 // update font metrics 65 // update font metrics
59 unsigned int rows, cols, hFont, size; 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,7 +68,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
61 cairo_font_extents_t extents; 68 cairo_font_extents_t extents;
62 69
63 lib3270_get_screen_size(terminal->host,&rows,&cols); 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 terminal->font.weight = lib3270_get_toggle(terminal->host,LIB3270_TOGGLE_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL; 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,33 +76,38 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
69 76
70 if(terminal->font.scaled) 77 if(terminal->font.scaled)
71 { 78 {
  79 + /*
72 double w = ((double) width) / ((double)cols); 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 cairo_set_font_size(cr,s); 87 cairo_set_font_size(cr,s);
77 cairo_font_extents(cr,&extents); 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 cairo_set_font_size(cr,s); 93 cairo_set_font_size(cr,s);
83 cairo_font_extents(cr,&extents); 94 cairo_font_extents(cr,&extents);
84 } 95 }
85 96
86 - s -= 1.0; 97 + s -= 0.5;
87 98
88 cairo_set_font_size(cr,s < 1.0 ? 1.0 : s); 99 cairo_set_font_size(cr,s < 1.0 ? 1.0 : s);
89 cairo_font_extents(cr,&extents); 100 cairo_font_extents(cr,&extents);
  101 +
90 } 102 }
91 else 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 size = font_size[0]; 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 cairo_set_font_size(cr,font_size[f]); 112 cairo_set_font_size(cr,font_size[f]);
101 cairo_font_extents(cr,&extents); 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,10 +118,21 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
106 terminal->minimum_height = ((rows+1) * (extents.height + extents.descent)) + (OIA_TOP_MARGIN+2); 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 size = font_size[f]; 130 size = font_size[f];
  131 +
111 } 132 }
112 133
  134 + debug("font_size=%d",size);
  135 +
113 cairo_set_font_size(cr,size); 136 cairo_set_font_size(cr,size);
114 137
115 #if !GTK_CHECK_VERSION(3,0,0) 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,7 +157,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
134 terminal->font.ascent = (int) extents.ascent; 157 terminal->font.ascent = (int) extents.ascent;
135 terminal->font.descent = (int) extents.descent; 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 // Create new cursor surface 162 // Create new cursor surface
140 if(terminal->cursor.surface) 163 if(terminal->cursor.surface)
@@ -143,7 +166,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig @@ -143,7 +166,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
143 terminal->cursor.surface = gdk_window_create_similar_surface(gtk_widget_get_window(GTK_WIDGET(terminal)),CAIRO_CONTENT_COLOR,terminal->font.width,hFont); 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 // Center image 168 // Center image
146 - size = CONTENTS_WIDTH(terminal); 169 + size = VIEW_WIDTH_FROM_FONT(terminal->font.width);
147 170
148 if(width >= size) { 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,11 +181,14 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig
158 181
159 debug("Width=%u size=%u left=%d",height, size, terminal->font.left); 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 if((int) terminal->font.spacing < hFont) 186 if((int) terminal->font.spacing < hFont)
163 terminal->font.spacing = hFont; 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 if(height >= size) { 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,7 +311,7 @@ G_GNUC_INTERNAL void v3270_draw_ssl_status(v3270 *widget, cairo_t *cr, GdkRec
311 311
312 G_GNUC_INTERNAL void v3270_update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor); 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 G_GNUC_INTERNAL void v3270_update_cursor_rect(v3270 *widget, GdkRectangle *rect, unsigned char chr, unsigned short attr); 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,7 +213,7 @@
213 // Creating toggle properties. 213 // Creating toggle properties.
214 for(ix = 0; ix < LIB3270_TOGGLE_COUNT; ix++) 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 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); 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 v3270_install_property(gobject_class, v3270_properties.type.toggle + ix, v3270_properties.toggle[ix]); 218 v3270_install_property(gobject_class, v3270_properties.type.toggle + ix, v3270_properties.toggle[ix]);
219 } 219 }
@@ -222,7 +222,7 @@ @@ -222,7 +222,7 @@
222 // Creating boolean properties. 222 // Creating boolean properties.
223 for(ix = 0; bool_props[ix].name; ix++) 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 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))); 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 v3270_install_property(gobject_class, v3270_properties.type.boolean + ix, spec); 227 v3270_install_property(gobject_class, v3270_properties.type.boolean + ix, spec);
228 228
@@ -231,7 +231,7 @@ @@ -231,7 +231,7 @@
231 // Creating integer properties. 231 // Creating integer properties.
232 for(ix = 0; int_props[ix].name; ix++) 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 spec = g_param_spec_int( 236 spec = g_param_spec_int(
237 int_props[ix].name, 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,9 +258,9 @@ static GtkToolItem * create_tool_item(GtkWidget *terminal, const gchar *label, c
258 GtkToolItem * item = gtk_toggle_tool_button_new(); 258 GtkToolItem * item = gtk_toggle_tool_button_new();
259 gtk_tool_button_set_label(GTK_TOOL_BUTTON(item),label); 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 g_signal_connect(GTK_WIDGET(item), "toggled", G_CALLBACK(callback), terminal); 265 g_signal_connect(GTK_WIDGET(item), "toggled", G_CALLBACK(callback), terminal);
266 266