Commit 92a95c7769f12f091b4bb1fab8c7e32a95f0607f
1 parent
35b14de2
Exists in
master
and in
1 other branch
Fixing fonte resize when terminal/view height changes.
Showing
4 changed files
with
52 additions
and
26 deletions
Show diff stats
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 | ... | ... |