From 3d54d8188320af74ce439a797271fddd9bc796f2 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Mon, 4 Nov 2019 13:20:51 -0300 Subject: [PATCH] Adding property for dynamic font space for compatibility with the previous version. --- src/dialogs/save/save.c | 2 ++ src/include/internals.h | 5 ++++- src/include/terminal.h | 1 + src/include/v3270.h | 3 +++ src/terminal/accessible.c | 4 ++-- src/terminal/drawing/draw.c | 8 ++++---- src/terminal/drawing/oia.c | 14 +++++++------- src/terminal/font/metrics.c | 26 +++++++++++++++++++------- src/terminal/get.c | 6 ++++++ src/terminal/mouse.c | 2 +- src/terminal/properties/get.c | 4 ++++ src/terminal/properties/init.c | 15 +++++++++++++++ src/terminal/properties/private.h | 3 ++- src/terminal/properties/set.c | 20 ++++++++++++++++++++ 14 files changed, 90 insertions(+), 23 deletions(-) diff --git a/src/dialogs/save/save.c b/src/dialogs/save/save.c index eb444e7..e1d3402 100644 --- a/src/dialogs/save/save.c +++ b/src/dialogs/save/save.c @@ -432,7 +432,9 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ } #pragma GCC diagnostic push +#ifdef _WIN32 #pragma GCC diagnostic ignored "-Wcast-function-type" +#endif // _WIN32 if(dynamic) g_list_free_full(dynamic,(GDestroyNotify) lib3270_free); diff --git a/src/include/internals.h b/src/include/internals.h index 6b02ccc..f6f5e7e 100644 --- a/src/include/internals.h +++ b/src/include/internals.h @@ -166,7 +166,10 @@ guint ascent; guint descent; - guint spacing; + struct { + gboolean dynamic; + guint value; + } spacing; struct { diff --git a/src/include/terminal.h b/src/include/terminal.h index 4b5bb20..319f176 100644 --- a/src/include/terminal.h +++ b/src/include/terminal.h @@ -53,6 +53,7 @@ G_BEGIN_DECLS GParamSpec * session_name; GParamSpec * auto_disconnect; GParamSpec * remap_file; + GParamSpec * dynamic_spacing; struct { diff --git a/src/include/v3270.h b/src/include/v3270.h index 18da27d..bc37b4b 100644 --- a/src/include/v3270.h +++ b/src/include/v3270.h @@ -189,6 +189,9 @@ LIB3270_EXPORT void v3270_set_auto_disconnect(GtkWidget *widget, guint minutes); LIB3270_EXPORT guint v3270_get_auto_disconnect(GtkWidget *widget); + LIB3270_EXPORT void v3270_set_dynamic_font_spacing(GtkWidget *widget, gboolean state); + LIB3270_EXPORT gboolean v3270_get_dynamic_font_spacing(GtkWidget *widget); + // Clipboard typedef enum _v3270_select_format { diff --git a/src/terminal/accessible.c b/src/terminal/accessible.c index fc092a0..9cb63da 100644 --- a/src/terminal/accessible.c +++ b/src/terminal/accessible.c @@ -326,9 +326,9 @@ static void v3270_accessible_get_character_extents( AtkText *text, // Get screen position *x += widget->font.margin.left + ((offset%cols) * widget->font.width); - *y += widget->font.margin.top + ((offset/cols) * widget->font.spacing); + *y += widget->font.margin.top + ((offset/cols) * widget->font.spacing.value); *width = widget->font.width; - *height = widget->font.spacing; + *height = widget->font.spacing.value; if(coords == ATK_XY_WINDOW) { diff --git a/src/terminal/drawing/draw.c b/src/terminal/drawing/draw.c index 3f61962..f9aad0b 100644 --- a/src/terminal/drawing/draw.c +++ b/src/terminal/drawing/draw.c @@ -377,7 +377,7 @@ void v3270_redraw(v3270 *terminal, cairo_t * cr, gint width, gint height) memset(&rect,0,sizeof(rect)); rect.y = terminal->font.margin.top; rect.width = terminal->font.width; - rect.height = terminal->font.spacing; + rect.height = terminal->font.spacing.value; addr = 0; cursor = lib3270_get_cursor_address(terminal->host); @@ -404,7 +404,7 @@ void v3270_redraw(v3270 *terminal, cairo_t * cr, gint width, gint height) rect.x += rect.width; } - rect.y += terminal->font.spacing; + rect.y += terminal->font.spacing.value; } @@ -455,9 +455,9 @@ void v3270_update_char(H3270 *session, int addr, unsigned char chr, unsigned sho memset(&rect,0,sizeof(rect)); rect.x = terminal->font.margin.left + ((addr % cols) * terminal->font.width); - rect.y = terminal->font.margin.top + ((addr / cols) * terminal->font.spacing); + rect.y = terminal->font.margin.top + ((addr / cols) * terminal->font.spacing.value); rect.width = terminal->font.width; - rect.height = terminal->font.spacing; + rect.height = terminal->font.spacing.value; cr = cairo_create(terminal->surface); cairo_set_scaled_font(cr,terminal->font.scaled); diff --git a/src/terminal/drawing/oia.c b/src/terminal/drawing/oia.c index 730159c..baefc49 100644 --- a/src/terminal/drawing/oia.c +++ b/src/terminal/drawing/oia.c @@ -591,7 +591,7 @@ void v3270_draw_oia(v3270 *terminal, cairo_t *cr, int row, int cols) row += 2; gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_OIA_BACKGROUND); - cairo_rectangle(cr, terminal->font.margin.left, row, cols*terminal->font.width, terminal->font.spacing); + cairo_rectangle(cr, terminal->font.margin.left, row, cols*terminal->font.width, terminal->font.spacing.value); cairo_fill(cr); for(f=0;f< (int) G_N_ELEMENTS(right);f++) @@ -602,7 +602,7 @@ void v3270_draw_oia(v3270 *terminal, cairo_t *cr, int row, int cols) r->x = rCol; r->y = row; r->width = terminal->font.width; - r->height = terminal->font.spacing; + r->height = terminal->font.spacing.value; gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_OIA_FOREGROUND); right[f].draw(r,&terminal->font,cr,terminal->host,cols,terminal->color); rCol = r->x - (terminal->font.width/3); @@ -613,7 +613,7 @@ void v3270_draw_oia(v3270 *terminal, cairo_t *cr, int row, int cols) draw_centered_char(cr,&terminal->font,lCol,row,'4'); cairo_stroke(cr); - cairo_rectangle(cr, lCol, row, terminal->font.width+2, terminal->font.spacing); + cairo_rectangle(cr, lCol, row, terminal->font.width+2, terminal->font.spacing.value); cairo_stroke(cr); lCol += (terminal->font.width+5); @@ -622,7 +622,7 @@ void v3270_draw_oia(v3270 *terminal, cairo_t *cr, int row, int cols) terminal->oia.rect[V3270_OIA_UNDERA].x = lCol; terminal->oia.rect[V3270_OIA_UNDERA].y = row; terminal->oia.rect[V3270_OIA_UNDERA].width = terminal->font.width+3; - terminal->oia.rect[V3270_OIA_UNDERA].height = terminal->font.spacing; + terminal->oia.rect[V3270_OIA_UNDERA].height = terminal->font.spacing.value; draw_undera(cr,terminal->host,&terminal->font,terminal->color,terminal->oia.rect+V3270_OIA_UNDERA); lCol += (3 + terminal->oia.rect[V3270_OIA_UNDERA].width); @@ -631,7 +631,7 @@ void v3270_draw_oia(v3270 *terminal, cairo_t *cr, int row, int cols) terminal->oia.rect[V3270_OIA_CONNECTION].x = lCol; terminal->oia.rect[V3270_OIA_CONNECTION].y = row; terminal->oia.rect[V3270_OIA_CONNECTION].width = terminal->font.width+3; - terminal->oia.rect[V3270_OIA_CONNECTION].height = terminal->font.spacing; + terminal->oia.rect[V3270_OIA_CONNECTION].height = terminal->font.spacing.value; v3270_draw_connection(cr,terminal->host,&terminal->font,terminal->color,terminal->oia.rect+V3270_OIA_CONNECTION); lCol += (4 + terminal->oia.rect[V3270_OIA_CONNECTION].width); @@ -644,7 +644,7 @@ void v3270_draw_oia(v3270 *terminal, cairo_t *cr, int row, int cols) r->x = lCol; r->y = row; r->width = rCol - lCol; - r->height = terminal->font.spacing; + r->height = terminal->font.spacing.value; draw_status_message(cr,lib3270_get_program_message(terminal->host),&terminal->font,terminal->color,r); } @@ -765,7 +765,7 @@ void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col, saved = terminal->cursor.rect; terminal->cursor.rect.x = terminal->font.margin.left + (col * terminal->cursor.rect.width); - terminal->cursor.rect.y = terminal->font.margin.top + (row * terminal->font.spacing); + terminal->cursor.rect.y = terminal->font.margin.top + (row * terminal->font.spacing.value); terminal->cursor.rect.width = terminal->font.width; terminal->cursor.rect.height = terminal->font.height+terminal->font.descent; terminal->cursor.show |= 1; diff --git a/src/terminal/font/metrics.c b/src/terminal/font/metrics.c index 9e5667c..c543e3b 100644 --- a/src/terminal/font/metrics.c +++ b/src/terminal/font/metrics.c @@ -52,17 +52,29 @@ void v3270_update_font_metrics(v3270 *terminal, unsigned int width, unsigned int // Update margins. - terminal->font.width = (int) extents.max_x_advance; - terminal->font.height = (int) extents.height; - terminal->font.ascent = (int) extents.ascent; - terminal->font.descent = (int) extents.descent; - terminal->font.spacing = terminal->font.height + terminal->font.descent; + terminal->font.width = (int) extents.max_x_advance; + terminal->font.height = (int) extents.height; + terminal->font.ascent = (int) extents.ascent; + terminal->font.descent = (int) extents.descent; + terminal->font.spacing.value = terminal->font.height + terminal->font.descent; + + if(terminal->font.spacing.dynamic) + { + // Compatibility adjustments for line spacing. + + // Some users complained about the new fixed line spacing; for them + // the old style is bettter! + + guint spacing = height / (rows+2); + if(spacing > terminal->font.spacing.value) + terminal->font.spacing.value = spacing; + } // Create new cursor surface if(terminal->cursor.surface) cairo_surface_destroy(terminal->cursor.surface); - terminal->cursor.surface = gdk_window_create_similar_surface(gtk_widget_get_window(GTK_WIDGET(terminal)),CAIRO_CONTENT_COLOR,terminal->font.width,terminal->font.spacing); + terminal->cursor.surface = gdk_window_create_similar_surface(gtk_widget_get_window(GTK_WIDGET(terminal)),CAIRO_CONTENT_COLOR,terminal->font.width,terminal->font.spacing.value); // Center image @@ -71,7 +83,7 @@ void v3270_update_font_metrics(v3270 *terminal, unsigned int width, unsigned int debug("%d",(width - size)); - size = VIEW_HEIGTH_FROM_FONT(terminal->font.spacing); + size = VIEW_HEIGTH_FROM_FONT(terminal->font.spacing.value); terminal->font.margin.top = (height/2) - (size/2); debug("%d",(height - size)); diff --git a/src/terminal/get.c b/src/terminal/get.c index 7c3bc89..6e623f1 100644 --- a/src/terminal/get.c +++ b/src/terminal/get.c @@ -79,3 +79,9 @@ gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboole return utftext; } + +gboolean v3270_get_dynamic_font_spacing(GtkWidget *widget) +{ + g_return_val_if_fail(GTK_IS_V3270(widget),FALSE); + return GTK_V3270(widget)->font.spacing.dynamic; +} diff --git a/src/terminal/mouse.c b/src/terminal/mouse.c index 3ec409a..72cfd2e 100644 --- a/src/terminal/mouse.c +++ b/src/terminal/mouse.c @@ -56,7 +56,7 @@ gint v3270_get_offset_at_point(v3270 *widget, gint x, gint y) if(x > 0 && y > 0) { point.x = ((x-widget->font.margin.left)/widget->font.width); - point.y = ((y-widget->font.margin.top)/widget->font.spacing); + point.y = ((y-widget->font.margin.top)/widget->font.spacing.value); lib3270_get_screen_size(widget->host,&r,&c); diff --git a/src/terminal/properties/get.c b/src/terminal/properties/get.c index cda0942..0803586 100644 --- a/src/terminal/properties/get.c +++ b/src/terminal/properties/get.c @@ -104,6 +104,10 @@ g_value_set_string(value,v3270_get_remap_filename(GTK_WIDGET(object))); break; + case V3270_PROPERTY_DYNAMIC_SPACING: + g_value_set_boolean(value,v3270_get_dynamic_font_spacing(GTK_WIDGET(object))); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); diff --git a/src/terminal/properties/init.c b/src/terminal/properties/init.c index 0be4ed7..7f12766 100644 --- a/src/terminal/properties/init.c +++ b/src/terminal/properties/init.c @@ -152,6 +152,21 @@ klass->properties.remap_file ); + // Dynamic font spacing + klass->properties.dynamic_spacing = g_param_spec_boolean( + "dynamic_font_spacing", + "dynamic_font_spacing", + _( "State of the dynamic font spacing" ), + FALSE, + G_PARAM_READABLE|G_PARAM_WRITABLE); + + g_object_class_install_property( + gobject_class, + V3270_PROPERTY_DYNAMIC_SPACING, + klass->properties.dynamic_spacing + ); + + // // Create dynamic properties klass->properties.count = V3270_PROPERTY_DYNAMIC; diff --git a/src/terminal/properties/private.h b/src/terminal/properties/private.h index 369ba4a..69b3841 100644 --- a/src/terminal/properties/private.h +++ b/src/terminal/properties/private.h @@ -53,9 +53,10 @@ V3270_PROPERTY_SESSION_NAME = 4, ///< @brief Widget's session name. V3270_PROPERTY_AUTO_DISCONNECT = 5, ///< @brief Auto disconnect. V3270_PROPERTY_REMAP_FILE = 6, ///< @brief Path of the remap file. + V3270_PROPERTY_DYNAMIC_SPACING = 7, ///< @brief Toggle dynamic font spacing. - V3270_PROPERTY_DYNAMIC = 7 ///< @brief Id of the first LIB3270 internal property. + V3270_PROPERTY_DYNAMIC = 8 ///< @brief Id of the first LIB3270 internal property. }; G_GNUC_INTERNAL void v3270_get_property(GObject *object,guint prop_id, GValue *value, GParamSpec *pspec); diff --git a/src/terminal/properties/set.c b/src/terminal/properties/set.c index 3e6509d..3446e21 100644 --- a/src/terminal/properties/set.c +++ b/src/terminal/properties/set.c @@ -122,6 +122,10 @@ v3270_set_remap_filename(GTK_WIDGET(object), g_value_get_string(value)); break; + case V3270_PROPERTY_DYNAMIC_SPACING: + v3270_set_dynamic_font_spacing(GTK_WIDGET(object), g_value_get_boolean(value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -211,3 +215,19 @@ LIB3270_EXPORT void v3270_set_auto_disconnect(GtkWidget *widget, guint minutes) } +LIB3270_EXPORT void v3270_set_dynamic_font_spacing(GtkWidget *widget, gboolean state) { + + g_return_if_fail(GTK_IS_V3270(widget)); + + v3270 * terminal = GTK_V3270(widget); + + if(terminal->font.spacing.dynamic != state) + { + terminal->font.spacing.dynamic = state; + v3270_reconfigure(terminal); + g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.dynamic_spacing); + } + +} + + -- libgit2 0.21.2