]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkfontchooserwidget.c
Require XInput2.h in X11 backend
[~andy/gtk] / gtk / gtkfontchooserwidget.c
index 346c9a4f037f2557498d768b72a20b8c0cfdcc96..5197d6fb1db545df4935a6c8f00bde438eeb2be6 100644 (file)
@@ -12,9 +12,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
@@ -51,7 +49,7 @@
 #include "gtkgrid.h"
 
 /**
- * SECTION:gtkfontchooser
+ * SECTION:gtkfontchooserwidget
  * @Short_description: A widget for selecting fonts
  * @Title: GtkFontChooserWidget
  * @See_also: #GtkFontChooserDialog
@@ -78,6 +76,7 @@ struct _GtkFontChooserWidgetPrivate
 {
   GtkWidget    *search_entry;
   GtkWidget    *family_face_list;
+  GtkCellRenderer *family_face_cell;
   GtkWidget    *list_scrolled_window;
   GtkWidget    *empty_list;
   GtkWidget    *list_notebook;
@@ -109,8 +108,6 @@ struct _GtkFontChooserWidgetPrivate
 #define FONT_STYLE_LIST_WIDTH 170
 #define FONT_SIZE_LIST_WIDTH  60
 
-#define ROW_FORMAT_STRING "<span weight=\"bold\" size=\"small\">%s</span>\n<span size=\"x-large\" font_desc=\"%s\">%s</span>"
-
 #define NO_FONT_MATCHED_SEARCH N_("No fonts matched your search. You can revise your search and try again.")
 
 enum {
@@ -239,6 +236,13 @@ gtk_font_chooser_widget_get_property (GObject         *object,
     }
 }
 
+static void
+gtk_font_chooser_widget_refilter_font_list (GtkFontChooserWidget *fontchooser)
+{
+  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (fontchooser->priv->filter_model));
+  gtk_font_chooser_widget_ensure_selection (fontchooser);
+}
+
 static void
 text_changed_cb (GtkEntry       *entry,
                  GParamSpec     *pspec,
@@ -277,7 +281,7 @@ text_changed_cb (GtkEntry       *entry,
         }
     }
 
-  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter_model));
+  gtk_font_chooser_widget_refilter_font_list (fc);
 }
 
 static void
@@ -526,6 +530,7 @@ gtk_font_chooser_widget_init (GtkFontChooserWidget *fontchooser)
   /* Creating fundamental widgets for the private struct */
   priv->search_entry = gtk_entry_new ();
   priv->family_face_list = gtk_tree_view_new ();
+  gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->family_face_list), FALSE);
   priv->preview = gtk_entry_new ();
   priv->size_slider = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
                                                 0.0,
@@ -787,6 +792,58 @@ visible_func (GtkTreeModel *model,
   return result;
 }
 
+/* in pango units */
+static int
+gtk_font_chooser_widget_get_preview_text_height (GtkFontChooserWidget *fontchooser)
+{
+  GtkWidget *treeview = fontchooser->priv->family_face_list;
+  double dpi, font_size;
+
+  dpi = gdk_screen_get_resolution (gtk_widget_get_screen (treeview));
+  gtk_style_context_get (gtk_widget_get_style_context (treeview),
+                         gtk_widget_get_state_flags (treeview),
+                         "font-size", &font_size,
+                         NULL);
+
+  return (dpi < 0.0 ? 96.0 : dpi) / 72.0 * PANGO_SCALE_X_LARGE * font_size * PANGO_SCALE;
+}
+
+static PangoAttrList *
+gtk_font_chooser_widget_get_preview_attributes (GtkFontChooserWidget       *fontchooser,
+                                                const PangoFontDescription *font_desc,
+                                                gsize                       first_line_len)
+{
+  PangoAttribute *attribute;
+  PangoAttrList *attrs;
+
+  attrs = pango_attr_list_new ();
+
+  attribute = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
+  attribute->end_index = first_line_len;
+  pango_attr_list_insert (attrs, attribute);
+
+  attribute = pango_attr_scale_new (PANGO_SCALE_SMALL);
+  attribute->end_index = first_line_len;
+  pango_attr_list_insert (attrs, attribute);
+
+  if (font_desc)
+    {
+      attribute = pango_attr_font_desc_new (font_desc);
+      attribute->start_index = first_line_len;
+      pango_attr_list_insert (attrs, attribute);
+    }
+
+  attribute = pango_attr_fallback_new (FALSE);
+  attribute->start_index = first_line_len;
+  pango_attr_list_insert (attrs, attribute);
+
+  attribute = pango_attr_size_new_absolute (gtk_font_chooser_widget_get_preview_text_height (fontchooser));
+  attribute->start_index = first_line_len;
+  pango_attr_list_insert (attrs, attribute);
+
+  return attrs;
+}
+
 static void
 gtk_font_chooser_widget_cell_data_func (GtkTreeViewColumn *column,
                                         GtkCellRenderer   *cell,
@@ -796,24 +853,57 @@ gtk_font_chooser_widget_cell_data_func (GtkTreeViewColumn *column,
 {
   GtkFontChooserWidget *fontchooser = user_data;
   PangoFontDescription *font_desc;
-  char *to_string, *markup;
+  PangoAttrList *attrs;
+  char *to_string, *text;
+  gsize first_line_len;
 
   font_desc = tree_model_get_font_description (tree_model, iter);
 
   to_string = pango_font_description_to_string (font_desc);
 
-  markup = g_markup_printf_escaped (ROW_FORMAT_STRING,
-                                    to_string,
-                                    to_string,
-                                    fontchooser->priv->preview_text);
+  text = g_strconcat (to_string, "\n", fontchooser->priv->preview_text, NULL);
+  first_line_len = strlen (to_string) + 1;
+  
+  attrs = gtk_font_chooser_widget_get_preview_attributes (fontchooser, 
+                                                          font_desc,
+                                                          first_line_len);
 
   g_object_set (cell,
-                "markup", markup,
+                "attributes", attrs,
+                "text", text,
                 NULL);
 
   pango_font_description_free (font_desc);
+  pango_attr_list_unref (attrs);
   g_free (to_string);
-  g_free (markup);
+  g_free (text);
+}
+
+static void
+gtk_font_chooser_widget_set_cell_size (GtkFontChooserWidget *fontchooser)
+{
+  GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
+  PangoAttrList *attrs;
+  GtkRequisition size;
+
+  gtk_cell_renderer_set_fixed_size (priv->family_face_cell, -1, -1);
+
+  attrs = gtk_font_chooser_widget_get_preview_attributes (fontchooser, 
+                                                          NULL,
+                                                          1);
+  
+  g_object_set (priv->family_face_cell,
+                "attributes", attrs,
+                "text", "x\nx",
+                NULL);
+
+  pango_attr_list_unref (attrs);
+
+  gtk_cell_renderer_get_preferred_size (priv->family_face_cell,
+                                        priv->family_face_list,
+                                        &size,
+                                        NULL);
+  gtk_cell_renderer_set_fixed_size (priv->family_face_cell, size.width, size.height);
 }
 
 static void
@@ -821,9 +911,15 @@ gtk_font_chooser_widget_bootstrap_fontlist (GtkFontChooserWidget *fontchooser)
 {
   GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
   GtkTreeView *treeview = GTK_TREE_VIEW (priv->family_face_list);
-  GtkCellRenderer *cell;
   GtkTreeViewColumn *col;
 
+  g_signal_connect_data (priv->family_face_list,
+                         "style-updated",
+                         G_CALLBACK (gtk_font_chooser_widget_set_cell_size),
+                         fontchooser,
+                         NULL,
+                         G_CONNECT_AFTER | G_CONNECT_SWAPPED);
+
   priv->model = GTK_TREE_MODEL (gtk_list_store_new (4,
                                                     PANGO_TYPE_FONT_FAMILY,
                                                     PANGO_TYPE_FONT_FACE,
@@ -841,15 +937,17 @@ gtk_font_chooser_widget_bootstrap_fontlist (GtkFontChooserWidget *fontchooser)
 
   gtk_tree_view_set_rules_hint      (treeview, TRUE);
   gtk_tree_view_set_headers_visible (treeview, FALSE);
+  gtk_tree_view_set_fixed_height_mode (treeview, TRUE);
 
-  cell = gtk_cell_renderer_text_new ();
-  g_object_set (cell, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+  priv->family_face_cell = gtk_cell_renderer_text_new ();
+  g_object_set (priv->family_face_cell, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
 
   col = gtk_tree_view_column_new ();
   gtk_tree_view_column_set_title (col, _("Font Family"));
-  gtk_tree_view_column_pack_start (col, cell, TRUE);
+  gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
+  gtk_tree_view_column_pack_start (col, priv->family_face_cell, TRUE);
   gtk_tree_view_column_set_cell_data_func (col,
-                                           cell,
+                                           priv->family_face_cell,
                                            gtk_font_chooser_widget_cell_data_func,
                                            fontchooser,
                                            NULL);
@@ -857,6 +955,8 @@ gtk_font_chooser_widget_bootstrap_fontlist (GtkFontChooserWidget *fontchooser)
   gtk_tree_view_append_column (treeview, col);
 
   gtk_font_chooser_widget_load_fonts (fontchooser);
+
+  gtk_font_chooser_widget_set_cell_size (fontchooser);
 }
 
 static void
@@ -1185,7 +1285,7 @@ gtk_font_chooser_widget_set_filter_func (GtkFontChooser  *chooser,
   priv->filter_data = data;
   priv->filter_data_destroy = destroy;
 
-  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter_model));
+  gtk_font_chooser_widget_refilter_font_list (fontchooser);
 }
 
 static void