Commit a771f7ecd774e218a5b5d3af74e5d52ef5c01940
1 parent
92a95c77
Exists in
master
and in
1 other branch
Adding property for font-family allowing change it from debug console.
Showing
3 changed files
with
124 additions
and
61 deletions
Show diff stats
src/terminal/font.c
| ... | ... | @@ -34,7 +34,7 @@ |
| 34 | 34 | |
| 35 | 35 | |
| 36 | 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) | |
| 37 | + #define VIEW_WIDTH_FROM_FONT(max_x_advance) ( ((unsigned int) max_x_advance) * cols) | |
| 38 | 38 | |
| 39 | 39 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ |
| 40 | 40 | |
| ... | ... | @@ -68,19 +68,26 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, unsigned int width, |
| 68 | 68 | cairo_font_extents_t extents; |
| 69 | 69 | |
| 70 | 70 | lib3270_get_screen_size(terminal->host,&rows,&cols); |
| 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)); | |
| 71 | + | |
| 72 | + debug( | |
| 73 | + "Screen_size: %ux%u Scalled=%s view_rows=%d", | |
| 74 | + rows, | |
| 75 | + cols, | |
| 76 | + terminal->font.scaled ? "Yes" : "No", | |
| 77 | + (rows+OIA_TOP_MARGIN+3) | |
| 78 | + ); | |
| 72 | 79 | |
| 73 | 80 | terminal->font.weight = lib3270_get_toggle(terminal->host,LIB3270_TOGGLE_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL; |
| 74 | 81 | |
| 75 | 82 | cairo_select_font_face(cr,terminal->font.family, CAIRO_FONT_SLANT_NORMAL,terminal->font.weight); |
| 76 | 83 | |
| 84 | + /* | |
| 77 | 85 | if(terminal->font.scaled) |
| 78 | 86 | { |
| 79 | - /* | |
| 80 | - double w = ((double) width) / ((double)cols); | |
| 81 | - double h = ((double) height) / ((double) ((rows + OIA_TOP_MARGIN + 3))); | |
| 82 | - double s = (w < h) ? w : h; | |
| 83 | - */ | |
| 87 | + | |
| 88 | + // double w = ((double) width) / ((double)cols); | |
| 89 | + // double h = ((double) height) / ((double) ((rows + OIA_TOP_MARGIN + 3))); | |
| 90 | + // double s = (w < h) ? w : h; | |
| 84 | 91 | |
| 85 | 92 | double s = 0.1; |
| 86 | 93 | |
| ... | ... | @@ -100,7 +107,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, unsigned int width, |
| 100 | 107 | cairo_font_extents(cr,&extents); |
| 101 | 108 | |
| 102 | 109 | } |
| 103 | - else | |
| 110 | + else */ | |
| 104 | 111 | { |
| 105 | 112 | 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 | 113 | size_t f; |
| ... | ... | @@ -118,12 +125,14 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, unsigned int width, |
| 118 | 125 | terminal->minimum_height = ((rows+1) * (extents.height + extents.descent)) + (OIA_TOP_MARGIN+2); |
| 119 | 126 | } |
| 120 | 127 | |
| 121 | - debug("font_size=%d y_advance=%u font_extents=%u+%u font_height=%u view_height=%u", | |
| 128 | + debug("font_size=%d x_advance=%lf y_advance=%lf font_extents=%u+%u font_height=%u view_height=%u view_width=%u", | |
| 122 | 129 | font_size[f], |
| 123 | - (unsigned int) extents.max_y_advance, | |
| 130 | + extents.max_x_advance, | |
| 131 | + extents.max_y_advance, | |
| 124 | 132 | (unsigned int) extents.height, (unsigned int) extents.descent, |
| 125 | 133 | VIEW_HEIGTH_FROM_FONT( (unsigned int) (extents.height + extents.descent) ), |
| 126 | - height | |
| 134 | + height, | |
| 135 | + VIEW_WIDTH_FROM_FONT(extents.max_x_advance) | |
| 127 | 136 | ); |
| 128 | 137 | |
| 129 | 138 | if( VIEW_HEIGTH_FROM_FONT((extents.height + extents.descent)) < height && VIEW_WIDTH_FROM_FONT(extents.max_x_advance) < width) |
| ... | ... | @@ -228,6 +237,7 @@ LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name) |
| 228 | 237 | terminal->font.weight = lib3270_get_toggle(terminal->host,LIB3270_TOGGLE_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL; |
| 229 | 238 | |
| 230 | 239 | g_signal_emit(widget,v3270_widget_signal[SIGNAL_UPDATE_CONFIG], 0, "font-family", name); |
| 240 | + g_object_notify_by_pspec(G_OBJECT(widget), v3270_properties.font_family); | |
| 231 | 241 | |
| 232 | 242 | v3270_reload(widget); |
| 233 | 243 | gtk_widget_queue_draw(widget); | ... | ... |
src/terminal/private.h
src/terminal/properties.c
| ... | ... | @@ -88,10 +88,17 @@ |
| 88 | 88 | lib3270_set_toggle(window->host,prop_id - v3270_properties.type.toggle, (int) g_value_get_boolean (value)); |
| 89 | 89 | |
| 90 | 90 | } |
| 91 | - else | |
| 92 | - { | |
| 91 | + | |
| 92 | + // Check for internal properties. | |
| 93 | + switch(prop_id) { | |
| 94 | + case PROP_BEGIN: // Font-family | |
| 95 | + v3270_set_font_family(GTK_WIDGET(object), g_value_get_string(value)); | |
| 96 | + break; | |
| 97 | + | |
| 98 | + default: | |
| 93 | 99 | G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); |
| 94 | - } | |
| 100 | + | |
| 101 | + } | |
| 95 | 102 | |
| 96 | 103 | } |
| 97 | 104 | |
| ... | ... | @@ -134,10 +141,19 @@ |
| 134 | 141 | g_value_set_boolean(value,lib3270_get_toggle(window->host,prop_id - v3270_properties.type.toggle) ? TRUE : FALSE ); |
| 135 | 142 | |
| 136 | 143 | } |
| 137 | - else | |
| 138 | - { | |
| 144 | + | |
| 145 | + // Check for internal properties. | |
| 146 | + switch(prop_id) { | |
| 147 | + case PROP_BEGIN: // Font-family | |
| 148 | + g_value_set_string(value,v3270_get_font_family(GTK_WIDGET(object))); | |
| 149 | + break; | |
| 150 | + | |
| 151 | + default: | |
| 139 | 152 | G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); |
| 140 | - } | |
| 153 | + | |
| 154 | + } | |
| 155 | + | |
| 156 | + | |
| 141 | 157 | |
| 142 | 158 | } |
| 143 | 159 | |
| ... | ... | @@ -148,10 +164,10 @@ |
| 148 | 164 | const char *name; |
| 149 | 165 | GParamSpec **prop; |
| 150 | 166 | } properties[] = { |
| 151 | - { "connected", &v3270_properties.online }, | |
| 152 | - { "luname", &v3270_properties.luname }, | |
| 153 | - { "model", &v3270_properties.model }, | |
| 154 | - { "has-selection", &v3270_properties.selection } | |
| 167 | + { "connected", &v3270_properties.online }, | |
| 168 | + { "luname", &v3270_properties.luname }, | |
| 169 | + { "model", &v3270_properties.model }, | |
| 170 | + { "has-selection", &v3270_properties.selection }, | |
| 155 | 171 | }; |
| 156 | 172 | |
| 157 | 173 | size_t ix; |
| ... | ... | @@ -179,59 +195,75 @@ |
| 179 | 195 | debug("%s",__FUNCTION__); |
| 180 | 196 | |
| 181 | 197 | memset(&v3270_properties,0,sizeof(v3270_properties)); |
| 182 | - v3270_properties.count = LIB3270_TOGGLE_COUNT; | |
| 183 | - v3270_properties.type.toggle = PROP_BEGIN; | |
| 184 | - | |
| 185 | 198 | gobject_class->set_property = v3270_set_property; |
| 186 | 199 | gobject_class->get_property = v3270_get_property; |
| 187 | 200 | |
| 188 | - // Get property tables | |
| 189 | - const LIB3270_INT_PROPERTY * bool_props = lib3270_get_boolean_properties_list(); | |
| 190 | - const LIB3270_INT_PROPERTY * int_props = lib3270_get_int_properties_list(); | |
| 191 | - const LIB3270_STRING_PROPERTY * str_props = lib3270_get_string_properties_list(); | |
| 192 | - | |
| 193 | - v3270_properties.type.boolean = v3270_properties.count + PROP_BEGIN; | |
| 194 | - for(ix = 0; bool_props[ix].name; ix++) | |
| 195 | - { | |
| 196 | - v3270_properties.count++; | |
| 197 | - } | |
| 198 | - | |
| 199 | - v3270_properties.type.integer = v3270_properties.count + PROP_BEGIN; | |
| 200 | - for(ix = 0; int_props[ix].name; ix++) | |
| 201 | - { | |
| 202 | - v3270_properties.count++; | |
| 203 | - } | |
| 204 | - | |
| 205 | - v3270_properties.type.str = v3270_properties.count + PROP_BEGIN; | |
| 206 | - for(ix = 0; str_props[ix].name; ix++) | |
| 201 | + v3270_properties.count = PROP_BEGIN; | |
| 202 | + | |
| 203 | + // Setup internal properties. | |
| 204 | + v3270_properties.font_family = g_param_spec_string( | |
| 205 | + "font_family", | |
| 206 | + "font_family", | |
| 207 | + _("Font family for terminal contents"), | |
| 208 | + FALSE, | |
| 209 | + G_PARAM_READABLE|G_PARAM_WRITABLE | |
| 210 | + ); | |
| 211 | + | |
| 212 | + g_object_class_install_property( | |
| 213 | + gobject_class, | |
| 214 | + v3270_properties.count++, | |
| 215 | + v3270_properties.font_family | |
| 216 | + ); | |
| 217 | + | |
| 218 | + // | |
| 219 | + // Extract properties from LIB3270 control tables | |
| 220 | + // | |
| 221 | + | |
| 222 | + // Extract toggle class. | |
| 223 | + v3270_properties.type.toggle = v3270_properties.count; | |
| 224 | + for(ix = 0; ix < LIB3270_TOGGLE_COUNT; ix++) | |
| 207 | 225 | { |
| 208 | - v3270_properties.count++; | |
| 209 | - } | |
| 226 | + debug("Property %u=%s (Toggle)",(unsigned int) v3270_properties.type.toggle + ix, lib3270_get_toggle_name(ix)); | |
| 227 | + | |
| 228 | + v3270_properties.toggle[ix] = | |
| 229 | + g_param_spec_boolean( | |
| 230 | + lib3270_get_toggle_name(ix), | |
| 231 | + lib3270_get_toggle_name(ix), | |
| 232 | + lib3270_get_toggle_description(ix), | |
| 233 | + FALSE, | |
| 234 | + G_PARAM_WRITABLE|G_PARAM_READABLE | |
| 235 | + ); | |
| 210 | 236 | |
| 211 | - debug("Creating %u properties", (unsigned int) v3270_properties.count); | |
| 237 | + v3270_install_property(gobject_class, v3270_properties.count++, v3270_properties.toggle[ix]); | |
| 212 | 238 | |
| 213 | - // Creating toggle properties. | |
| 214 | - for(ix = 0; ix < LIB3270_TOGGLE_COUNT; ix++) | |
| 215 | - { | |
| 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); | |
| 218 | - v3270_install_property(gobject_class, v3270_properties.type.toggle + ix, v3270_properties.toggle[ix]); | |
| 219 | 239 | } |
| 220 | 240 | |
| 221 | - | |
| 222 | 241 | // Creating boolean properties. |
| 242 | + v3270_properties.type.boolean = v3270_properties.count; | |
| 243 | + const LIB3270_INT_PROPERTY * bool_props = lib3270_get_boolean_properties_list(); | |
| 244 | + | |
| 223 | 245 | for(ix = 0; bool_props[ix].name; ix++) |
| 224 | 246 | { |
| 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))); | |
| 227 | - v3270_install_property(gobject_class, v3270_properties.type.boolean + ix, spec); | |
| 247 | + debug("Property %u=%s (Boolean)",(unsigned int) v3270_properties.type.boolean + ix, bool_props[ix].name); | |
| 248 | + spec = g_param_spec_boolean( | |
| 249 | + bool_props[ix].name, | |
| 250 | + bool_props[ix].name, | |
| 251 | + bool_props[ix].description, | |
| 252 | + FALSE, | |
| 253 | + (bool_props[ix].set == NULL ? G_PARAM_READABLE : (G_PARAM_READABLE|G_PARAM_WRITABLE)) | |
| 254 | + ); | |
| 255 | + | |
| 256 | + v3270_install_property(gobject_class, v3270_properties.count++, spec); | |
| 228 | 257 | |
| 229 | 258 | } |
| 230 | 259 | |
| 231 | 260 | // Creating integer properties. |
| 261 | + const LIB3270_INT_PROPERTY * int_props = lib3270_get_int_properties_list(); | |
| 262 | + v3270_properties.type.integer = v3270_properties.count; | |
| 263 | + | |
| 232 | 264 | for(ix = 0; int_props[ix].name; ix++) |
| 233 | 265 | { |
| 234 | -// debug("Property %u=%s (Integer)",(unsigned int) v3270_properties.type.integer + ix, int_props[ix].name); | |
| 266 | + debug("Property %u=%s (Integer)",(unsigned int) v3270_properties.type.integer + ix, int_props[ix].name); | |
| 235 | 267 | |
| 236 | 268 | spec = g_param_spec_int( |
| 237 | 269 | int_props[ix].name, |
| ... | ... | @@ -242,17 +274,34 @@ |
| 242 | 274 | 0, // Default |
| 243 | 275 | (int_props[ix].set == NULL ? G_PARAM_READABLE : (G_PARAM_READABLE|G_PARAM_WRITABLE)) |
| 244 | 276 | ); |
| 277 | + debug("Creating %u properties", (unsigned int) v3270_properties.count); | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 245 | 282 | |
| 246 | - v3270_install_property(gobject_class, v3270_properties.type.integer + ix, spec); | |
| 283 | + v3270_install_property(gobject_class, v3270_properties.count++, spec); | |
| 247 | 284 | |
| 248 | 285 | } |
| 249 | 286 | |
| 250 | 287 | // Creating string properties. |
| 288 | + const LIB3270_STRING_PROPERTY * str_props = lib3270_get_string_properties_list(); | |
| 289 | + v3270_properties.type.str = v3270_properties.count; | |
| 290 | + | |
| 251 | 291 | for(ix = 0; str_props[ix].name; ix++) |
| 252 | 292 | { |
| 253 | -// debug("Property %u=%s (String)",(unsigned int) v3270_properties.type.str + ix, str_props[ix].name); | |
| 254 | - spec = g_param_spec_string(str_props[ix].name, str_props[ix].name, str_props[ix].description, FALSE,(str_props[ix].set == NULL ? G_PARAM_READABLE : (G_PARAM_READABLE|G_PARAM_WRITABLE))); | |
| 255 | - v3270_install_property(gobject_class, v3270_properties.type.str + ix, spec); | |
| 293 | + | |
| 294 | + debug("Property %u=%s (String)",(unsigned int) v3270_properties.type.str + ix, str_props[ix].name); | |
| 295 | + | |
| 296 | + spec = g_param_spec_string( | |
| 297 | + str_props[ix].name, | |
| 298 | + str_props[ix].name, | |
| 299 | + str_props[ix].description, | |
| 300 | + FALSE, | |
| 301 | + (str_props[ix].set == NULL ? G_PARAM_READABLE : (G_PARAM_READABLE|G_PARAM_WRITABLE)) | |
| 302 | + ); | |
| 303 | + | |
| 304 | + v3270_install_property(gobject_class, v3270_properties.count++, spec); | |
| 256 | 305 | |
| 257 | 306 | } |
| 258 | 307 | ... | ... |