comparison src/skins/ui_skinned_textbox.c @ 3036:b0f8da03187b

Fix multiple issues with vector fonts in the skinned interface.
author John Lindgren <john.lindgren@tds.net>
date Sat, 11 Apr 2009 08:26:51 -0400
parents 6baa6eaf8290
children 1ffcad5f406c
comparison
equal deleted inserted replaced
3035:13a0e4377c20 3036:b0f8da03187b
134 klass->clicked = NULL; 134 klass->clicked = NULL;
135 klass->double_clicked = NULL; 135 klass->double_clicked = NULL;
136 klass->right_clicked = NULL; 136 klass->right_clicked = NULL;
137 klass->scaled = ui_skinned_textbox_toggle_scaled; 137 klass->scaled = ui_skinned_textbox_toggle_scaled;
138 138
139 textbox_signals[CLICKED] = 139 textbox_signals[CLICKED] =
140 g_signal_new ("clicked", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, 140 g_signal_new ("clicked", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
141 G_STRUCT_OFFSET (UiSkinnedTextboxClass, clicked), NULL, NULL, 141 G_STRUCT_OFFSET (UiSkinnedTextboxClass, clicked), NULL, NULL,
142 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); 142 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
143 143
144 textbox_signals[DOUBLE_CLICKED] = 144 textbox_signals[DOUBLE_CLICKED] =
145 g_signal_new ("double-clicked", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, 145 g_signal_new ("double-clicked", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
146 G_STRUCT_OFFSET (UiSkinnedTextboxClass, double_clicked), NULL, NULL, 146 G_STRUCT_OFFSET (UiSkinnedTextboxClass, double_clicked), NULL, NULL,
147 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); 147 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
148 148
149 textbox_signals[RIGHT_CLICKED] = 149 textbox_signals[RIGHT_CLICKED] =
150 g_signal_new ("right-clicked", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, 150 g_signal_new ("right-clicked", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
151 G_STRUCT_OFFSET (UiSkinnedTextboxClass, right_clicked), NULL, NULL, 151 G_STRUCT_OFFSET (UiSkinnedTextboxClass, right_clicked), NULL, NULL,
152 g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); 152 g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER);
153 153
154 textbox_signals[DOUBLED] = 154 textbox_signals[DOUBLED] =
155 g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, 155 g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
156 G_STRUCT_OFFSET (UiSkinnedTextboxClass, scaled), NULL, NULL, 156 G_STRUCT_OFFSET (UiSkinnedTextboxClass, scaled), NULL, NULL,
157 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); 157 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
158 158
159 g_type_class_add_private (gobject_class, sizeof (UiSkinnedTextboxPrivate)); 159 g_type_class_add_private (gobject_class, sizeof (UiSkinnedTextboxPrivate));
451 GtkWidget *widget = GTK_WIDGET (textbox); 451 GtkWidget *widget = GTK_WIDGET (textbox);
452 UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox); 452 UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
453 453
454 priv->scaled = !priv->scaled; 454 priv->scaled = !priv->scaled;
455 455
456 gtk_widget_set_size_request(widget, textbox->width*(priv->scaled ? config.scale_factor : 1 ), 456 gtk_widget_set_size_request(widget, textbox->width*(priv->scaled ? config.scale_factor : 1 ),
457 textbox->height*(priv->scaled ? config.scale_factor : 1 )); 457 textbox->height*(priv->scaled ? config.scale_factor : 1 ));
458 458
459 gtk_widget_queue_draw(GTK_WIDGET(textbox)); 459 gtk_widget_queue_draw(GTK_WIDGET(textbox));
460 } 460 }
461 461
486 UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox); 486 UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
487 487
488 gint ascent, descent; 488 gint ascent, descent;
489 489
490 g_return_if_fail(textbox != NULL); 490 g_return_if_fail(textbox != NULL);
491 gtk_widget_queue_resize (widget);
492 gtk_widget_queue_draw (widget);
491 493
492 if (priv->font) { 494 if (priv->font) {
493 pango_font_description_free(priv->font); 495 pango_font_description_free(priv->font);
494 priv->font = NULL; 496 priv->font = NULL;
495 } 497 }
517 519
518 520
519 if (priv->font == NULL) 521 if (priv->font == NULL)
520 return; 522 return;
521 523
522 textbox->height = priv->font_ascent; 524 textbox->height = priv->font_ascent; /* The real height of the text is
523 if (textbox->height > priv->nominal_height) 525 ascent - descent (descent is negative), but we cut off descent pixels from
524 textbox->y -= (textbox->height - priv->nominal_height) / 2; 526 the top to make it fit better. See textbox_generate_xfont_pixmap. */
525 else
526 textbox->height = priv->nominal_height;
527 } 527 }
528 528
529 void ui_skinned_textbox_set_text(GtkWidget *widget, const gchar *text) { 529 void ui_skinned_textbox_set_text(GtkWidget *widget, const gchar *text) {
530 g_return_if_fail(text != NULL); 530 g_return_if_fail(text != NULL);
531 UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX (widget); 531 UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX (widget);
584 gdk_gc_set_foreground(gc, skin_get_color(aud_active_skin, SKIN_TEXTFG)); 584 gdk_gc_set_foreground(gc, skin_get_color(aud_active_skin, SKIN_TEXTFG));
585 585
586 layout = gtk_widget_create_pango_layout(mainwin, pixmaptext); 586 layout = gtk_widget_create_pango_layout(mainwin, pixmaptext);
587 pango_layout_set_font_description(layout, priv->font); 587 pango_layout_set_font_description(layout, priv->font);
588 588
589 gdk_draw_layout(pixmap, gc, 0, (priv->font_descent / 2), layout); 589 gdk_draw_layout (pixmap, gc, 0, priv->font_descent, layout); /* See
590 explanation in ui_skinned_textbox_set_xfont. */
590 g_object_unref(layout); 591 g_object_unref(layout);
591 592
592 g_object_unref(maskgc); 593 g_object_unref(maskgc);
593 594
594 gdk_gc_set_clip_mask(gc, mask); 595 gdk_gc_set_clip_mask(gc, mask);
734 textbox_handle_special_char(tmp, &x, &y); 735 textbox_handle_special_char(tmp, &x, &y);
735 736
736 skin_draw_pixbuf(GTK_WIDGET(textbox), aud_active_skin, 737 skin_draw_pixbuf(GTK_WIDGET(textbox), aud_active_skin,
737 priv->pixbuf, priv->skin_index, 738 priv->pixbuf, priv->skin_index,
738 x, y, i * aud_active_skin->properties.textbox_bitmap_font_width, 0, 739 x, y, i * aud_active_skin->properties.textbox_bitmap_font_width, 0,
739 aud_active_skin->properties.textbox_bitmap_font_width, 740 aud_active_skin->properties.textbox_bitmap_font_width,
740 aud_active_skin->properties.textbox_bitmap_font_height); 741 aud_active_skin->properties.textbox_bitmap_font_height);
741 } 742 }
742 g_free(stxt); 743 g_free(stxt);
743 g_free(pixmaptext); 744 g_free(pixmaptext);
744 } 745 }