diff --git a/moo/mooedit/mooedit-bookmarks.c b/moo/mooedit/mooedit-bookmarks.c index a2fb9200..a5a8cb11 100644 --- a/moo/mooedit/mooedit-bookmarks.c +++ b/moo/mooedit/mooedit-bookmarks.c @@ -46,7 +46,6 @@ moo_edit_bookmark_init (MooEditBookmark *bk) g_object_set (bk, "visible", TRUE, "background", "#E5E5FF", - "stock-id", MOO_STOCK_EDIT_BOOKMARK, NULL); } @@ -279,6 +278,17 @@ moo_edit_add_bookmark (MooEdit *edit, bk->no = no; + if (no) + { + char buf[32]; + g_snprintf (buf, sizeof buf, "%d", no); + moo_line_mark_set_markup (MOO_LINE_MARK (bk), buf); + } + else + { + moo_line_mark_set_stock_id (MOO_LINE_MARK (bk), MOO_STOCK_EDIT_BOOKMARK); + } + if (!edit->priv->update_bookmarks_idle) edit->priv->bookmarks = g_slist_insert_sorted (edit->priv->bookmarks, bk, diff --git a/moo/mooedit/moolinemark.c b/moo/mooedit/moolinemark.c index 738b7537..484d9a40 100644 --- a/moo/mooedit/moolinemark.c +++ b/moo/mooedit/moolinemark.c @@ -26,7 +26,7 @@ struct _MooLineMarkPrivate { GtkWidget *widget; - char *name; + char *markup; MooTextBuffer *buffer; LineBuffer *line_buf; @@ -76,7 +76,7 @@ enum { PROP_BACKGROUND_SET, PROP_PIXBUF, PROP_STOCK_ID, - PROP_NAME, + PROP_MARKUP, PROP_VISIBLE }; @@ -121,10 +121,10 @@ moo_line_mark_class_init (MooLineMarkClass *klass) G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, - PROP_NAME, - g_param_spec_string ("name", - "name", - "name", + PROP_MARKUP, + g_param_spec_string ("markup", + "markup", + "markup", NULL, G_PARAM_READWRITE)); @@ -181,9 +181,9 @@ moo_line_mark_finalize (GObject *object) g_object_unref (mark->priv->pixbuf); if (mark->priv->background_gc) g_object_unref (mark->priv->background_gc); - g_free (mark->priv->stock_id); - g_free (mark->priv->name); + g_free (mark->priv->stock_id); + g_free (mark->priv->markup); g_free (mark->priv); G_OBJECT_CLASS (moo_line_mark_parent_class)->finalize (object); @@ -214,8 +214,8 @@ moo_line_mark_set_property (GObject *object, moo_line_mark_changed (mark); break; - case PROP_NAME: - moo_line_mark_set_name (mark, g_value_get_string (value)); + case PROP_MARKUP: + moo_line_mark_set_markup (mark, g_value_get_string (value)); break; case PROP_VISIBLE: @@ -256,8 +256,8 @@ moo_line_mark_get_property (GObject *object, g_value_set_boolean (value, mark->priv->background_set != 0); break; - case PROP_NAME: - g_value_set_string (value, mark->priv->name); + case PROP_MARKUP: + g_value_set_string (value, mark->priv->markup); break; case PROP_VISIBLE: @@ -365,25 +365,27 @@ moo_line_mark_changed (MooLineMark *mark) void -moo_line_mark_set_name (MooLineMark *mark, - const char *name) +moo_line_mark_set_markup (MooLineMark *mark, + const char *markup) { + char *tmp; + g_return_if_fail (MOO_IS_LINE_MARK (mark)); - if (mark->priv->name != name) - { - g_free (mark->priv->name); - mark->priv->name = g_strdup (name); - g_object_notify (G_OBJECT (mark), "name"); - } + if (!markup || !markup[0]) + markup = NULL; + + tmp = mark->priv->markup; + mark->priv->markup = g_strdup (markup); + g_free (tmp); } const char * -moo_line_mark_get_name (MooLineMark *mark) +moo_line_mark_get_markup (MooLineMark *mark) { g_return_val_if_fail (MOO_IS_LINE_MARK (mark), NULL); - return mark->priv->name; + return mark->priv->markup; } diff --git a/moo/mooedit/moolinemark.h b/moo/mooedit/moolinemark.h index 524a3b13..56316d95 100644 --- a/moo/mooedit/moolinemark.h +++ b/moo/mooedit/moolinemark.h @@ -69,10 +69,6 @@ void moo_line_mark_set_background_gdk (MooLineMark *mark, void moo_line_mark_set_background (MooLineMark *mark, const char *color); -void moo_line_mark_set_name (MooLineMark *mark, - const char *name); -const char *moo_line_mark_get_name (MooLineMark *mark); - int moo_line_mark_get_line (MooLineMark *mark); MooTextBuffer *moo_line_mark_get_buffer (MooLineMark *mark); gboolean moo_line_mark_get_visible (MooLineMark *mark); @@ -83,8 +79,11 @@ void moo_line_mark_set_stock_id (MooLineMark *mark, const char *stock_id); void moo_line_mark_set_pixbuf (MooLineMark *mark, GdkPixbuf *pixbuf); +void moo_line_mark_set_markup (MooLineMark *mark, + const char *markup); const char *moo_line_mark_get_stock_id (MooLineMark *mark); GdkPixbuf *moo_line_mark_get_pixbuf (MooLineMark *mark); +const char *moo_line_mark_get_markup (MooLineMark *mark); GdkGC *moo_line_mark_get_background_gc (MooLineMark *mark); diff --git a/moo/mooedit/mootextview.c b/moo/mooedit/mootextview.c index 86470504..f1ca0509 100644 --- a/moo/mooedit/mootextview.c +++ b/moo/mooedit/mootextview.c @@ -2820,8 +2820,31 @@ get_n_digits (MooTextView *view) static void update_line_mark_icons (MooTextView *view) { - /* XXX */ - view->priv->lm.icon_width = 16; + int i; + char str[32]; + GtkSettings *settings; + PangoLayout *layout; + + g_return_if_fail (GTK_WIDGET_REALIZED (view)); + + settings = gtk_widget_get_settings (GTK_WIDGET (view)); + + if (!gtk_icon_size_lookup_for_settings (settings, GTK_ICON_SIZE_MENU, + &view->priv->lm.icon_width, NULL)) + view->priv->lm.icon_width = 16; + + layout = gtk_widget_create_pango_layout (GTK_WIDGET (view), NULL); + + for (i = 1; i < 10; ++i) + { + PangoRectangle rect; + g_snprintf (str, sizeof str, "%d", i); + pango_layout_set_markup (layout, str, -1); + pango_layout_get_pixel_extents (layout, &rect, NULL); + view->priv->lm.icon_width = MAX (view->priv->lm.icon_width, rect.width); + } + + g_object_unref (layout); } static void @@ -2838,7 +2861,7 @@ update_digit_width (MooTextView *view) { int width; g_snprintf (str, sizeof str, "%d", i); - pango_layout_set_markup (layout, str, -1); + pango_layout_set_text (layout, str, -1); pango_layout_get_pixel_size (layout, &width, NULL); view->priv->lm.digit_width = MAX (view->priv->lm.digit_width, width); } @@ -2937,6 +2960,7 @@ draw_marks (MooTextView *view, { MooLineMark *mark; GdkPixbuf *pixbuf; + const char *markup; mark = marks->data; marks = marks->next; @@ -2960,6 +2984,27 @@ draw_marks (MooTextView *view, 0, 0, x, y, -1, -1, GDK_RGB_DITHER_NORMAL, 0, 0); } + + markup = moo_line_mark_get_markup (mark); + + if (markup) + { + PangoLayout *layout; + PangoRectangle rect; + int x, y; + + layout = gtk_widget_create_pango_layout (GTK_WIDGET (view), NULL); + pango_layout_set_markup (layout, markup, -1); + pango_layout_get_pixel_extents (layout, &rect, NULL); + x = MARK_ICON_LPAD + (view->priv->lm.icon_width - rect.width) / 2; + y = line_y - 1 + (line_height - rect.y - rect.height) / 2; + + gdk_draw_layout (event->window, + GTK_WIDGET(view)->style->fg_gc[GTK_WIDGET_STATE(view)], + x, y, layout); + + g_object_unref (layout); + } } } diff --git a/moo/moopython/pygtk/mooedit-pygtk.defs b/moo/moopython/pygtk/mooedit-pygtk.defs index 17b86626..83dd3959 100644 --- a/moo/moopython/pygtk/mooedit-pygtk.defs +++ b/moo/moopython/pygtk/mooedit-pygtk.defs @@ -1358,18 +1358,18 @@ ) ) -(define-method set_name +(define-method set_markup (of-object "MooLineMark") - (c-name "moo_line_mark_set_name") + (c-name "moo_line_mark_set_markup") (return-type "none") (parameters - '("const-char*" "name") + '("const-char*" "name" (null-ok)) ) ) -(define-method get_name +(define-method get_markup (of-object "MooLineMark") - (c-name "moo_line_mark_get_name") + (c-name "moo_line_mark_get_markup") (return-type "const-char*") )