From afe2c355cf89216942240c58c701fde77a20a567 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Mon, 24 Aug 2015 19:31:44 +0100 Subject: [PATCH] Make string_width() work in GTK3. This was another piece of code that determined text size by instantiating a GtkLabel and asking for its size, which I had to fix in gtkfont.c recently because that strategy doesn't work in GTK3. Replaced the implementation of string_width() with a call to the function I added in gtkfont.c, and now dialog boxes which depend on that for their width measurement (e.g. the one in reallyclose()) don't come out in silly sizes on GTK3 any more. --- unix/gtkdlg.c | 8 +++----- unix/gtkfont.c | 15 +++++++++------ unix/unix.h | 3 +++ 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/unix/gtkdlg.c b/unix/gtkdlg.c index 74b735fe..a584501c 100644 --- a/unix/gtkdlg.c +++ b/unix/gtkdlg.c @@ -3428,11 +3428,9 @@ int messagebox(GtkWidget *parentwin, const char *title, const char *msg, int string_width(const char *text) { - GtkWidget *label = gtk_label_new(text); - GtkRequisition req; - gtk_widget_size_request(label, &req); - g_object_ref_sink(G_OBJECT(label)); - return req.width; + int ret; + get_label_text_dimensions(text, &ret, NULL); + return ret; } int reallyclose(void *frontend) diff --git a/unix/gtkfont.c b/unix/gtkfont.c index 95039910..97983618 100644 --- a/unix/gtkfont.c +++ b/unix/gtkfont.c @@ -2958,8 +2958,7 @@ static gint unifontsel_configure_area(GtkWidget *widget, return TRUE; } -static void get_label_text_dimensions(const char *text, - int *width, int *height) +void get_label_text_dimensions(const char *text, int *width, int *height) { /* * Determine the dimensions of a piece of text in the standard @@ -2976,13 +2975,17 @@ static void get_label_text_dimensions(const char *text, PangoLayout *layout = gtk_label_get_layout(GTK_LABEL(label)); PangoRectangle logrect; pango_layout_get_extents(layout, NULL, &logrect); - *width = logrect.width / PANGO_SCALE; - *height = logrect.height / PANGO_SCALE; + if (width) + *width = logrect.width / PANGO_SCALE; + if (height) + *height = logrect.height / PANGO_SCALE; #else GtkRequisition req; gtk_widget_size_request(label, &req); - *width = req.width; - *height = req.height; + if (width) + *width = req.width; + if (height) + *height = req.height; #endif g_object_ref_sink(G_OBJECT(label)); diff --git a/unix/unix.h b/unix/unix.h index 6359a2cd..fbe025ba 100644 --- a/unix/unix.h +++ b/unix/unix.h @@ -137,6 +137,9 @@ void unix_setup_config_box(struct controlbox *b, int midsession, int protocol); /* gtkcfg.c */ void gtk_setup_config_box(struct controlbox *b, int midsession, void *window); +/* Helper function which happens to be in gtkfont.c at the moment */ +void get_label_text_dimensions(const char *text, int *width, int *height); + /* * In the Unix Unicode layer, DEFAULT_CODEPAGE is a special value * which causes mb_to_wc and wc_to_mb to call _libc_ rather than