X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdialogs%2Fstroke-style.cpp;h=08f3d90317fd5c8c76966f0de65041c8fb059510;hb=6d7d846dbf27d17b82110d99015a85cff809a789;hp=ebfb7aca6d420e454d47fcf34e96cdd5ae03c200;hpb=fa458d9703c0939be5ec7fec805936cd3b6f866d;p=inkscape.git diff --git a/src/dialogs/stroke-style.cpp b/src/dialogs/stroke-style.cpp index ebfb7aca6..08f3d9031 100644 --- a/src/dialogs/stroke-style.cpp +++ b/src/dialogs/stroke-style.cpp @@ -35,9 +35,9 @@ #include "sp-linear-gradient.h" #include "sp-radial-gradient.h" #include "marker.h" -#include -#include -#include +#include "sp-pattern.h" +#include "widgets/paint-selector.h" +#include "widgets/dash-selector.h" #include "style.h" #include "gradient-chemistry.h" #include "sp-namedview.h" @@ -56,9 +56,11 @@ #include "widgets/icon.h" #include "helper/stock-items.h" #include "io/sys.h" +#include "ui/cache/svg_preview_cache.h" #include "dialogs/stroke-style.h" + /* Paint */ static void sp_stroke_style_paint_construct(SPWidget *spw, SPPaintSelector *psel); @@ -71,6 +73,19 @@ static void sp_stroke_style_paint_dragged(SPPaintSelector *psel, SPWidget *spw); static void sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw); static void sp_stroke_style_widget_change_subselection ( Inkscape::Application *inkscape, SPDesktop *desktop, SPWidget *spw ); +static void sp_stroke_style_widget_transientize_callback(Inkscape::Application *inkscape, + SPDesktop *desktop, + SPWidget *spw ); + +/** Marker selection option menus */ +static GtkWidget * marker_start_menu = NULL; +static GtkWidget * marker_mid_menu = NULL; +static GtkWidget * marker_end_menu = NULL; + +static SPObject *ink_extract_marker_name(gchar const *n); +static void ink_markers_menu_update(SPWidget* spw); + +static Inkscape::UI::Cache::SvgPreview svg_preview_cache; /** * Create the stroke style widget, and hook up all the signals. @@ -99,6 +114,8 @@ sp_stroke_style_paint_widget_new(void) g_signal_connect (INKSCAPE, "change_subselection", G_CALLBACK (sp_stroke_style_widget_change_subselection), spw); + g_signal_connect (G_OBJECT(INKSCAPE), "activate_desktop", G_CALLBACK (sp_stroke_style_widget_transientize_callback), spw ); + gtk_signal_connect(GTK_OBJECT(psel), "mode_changed", GTK_SIGNAL_FUNC(sp_stroke_style_paint_mode_changed), spw); @@ -119,13 +136,14 @@ sp_stroke_style_paint_widget_new(void) static void sp_stroke_style_paint_construct(SPWidget *spw, SPPaintSelector *psel) { + (void)psel; #ifdef SP_SS_VERBOSE g_print( "Stroke style widget constructed: inkscape %p repr %p\n", spw->inkscape, spw->repr ); #endif if (spw->inkscape) { sp_stroke_style_paint_update (spw); - } + } } /** @@ -137,6 +155,7 @@ sp_stroke_style_paint_selection_modified ( SPWidget *spw, guint flags, SPPaintSelector *psel) { + (void)selection; if (flags & ( SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_PARENT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG) ) { sp_stroke_style_paint_update(spw); @@ -152,6 +171,7 @@ sp_stroke_style_paint_selection_changed ( SPWidget *spw, Inkscape::Selection *selection, SPPaintSelector *psel ) { + (void)selection; sp_stroke_style_paint_update (spw); } @@ -160,10 +180,11 @@ sp_stroke_style_paint_selection_changed ( SPWidget *spw, * On signal change subselection, invoke an update of the stroke style widget. */ static void -sp_stroke_style_widget_change_subselection ( Inkscape::Application *inkscape, +sp_stroke_style_widget_change_subselection ( Inkscape::Application *inkscape, SPDesktop *desktop, SPWidget *spw ) { + (void)inkscape; sp_stroke_style_paint_update (spw); } @@ -183,9 +204,9 @@ sp_stroke_style_paint_update (SPWidget *spw) SPPaintSelector *psel = SP_PAINT_SELECTOR(gtk_object_get_data(GTK_OBJECT(spw), "paint-selector")); // create temporary style - SPStyle *query = sp_style_new (); + SPStyle *query = sp_style_new (SP_ACTIVE_DOCUMENT); // query into it - int result = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_STROKE); + int result = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_STROKE); switch (result) { case QUERY_STYLE_NOTHING: @@ -202,14 +223,7 @@ sp_stroke_style_paint_update (SPWidget *spw) SPPaintSelectorMode pselmode = sp_style_determine_paint_selector_mode (query, false); sp_paint_selector_set_mode (psel, pselmode); - if (query->stroke.set && query->stroke.type == SP_PAINT_TYPE_COLOR) { - gfloat d[3]; - sp_color_get_rgb_floatv (&query->stroke.value.color, d); - SPColor color; - sp_color_set_rgb_float (&color, d[0], d[1], d[2]); - sp_paint_selector_set_color_alpha (psel, &color, SP_SCALE24_TO_FLOAT (query->stroke_opacity.value)); - - } else if (query->stroke.set && query->stroke.type == SP_PAINT_TYPE_PAINTSERVER) { + if (query->stroke.set && query->stroke.isPaintserver()) { SPPaintServer *server = SP_STYLE_STROKE_SERVER (query); @@ -233,6 +247,9 @@ sp_stroke_style_paint_update (SPWidget *spw) SPPattern *pat = pattern_getroot (SP_PATTERN (server)); sp_update_pattern_list (psel, pat); } + } else if (query->stroke.set && query->stroke.isColor()) { + sp_paint_selector_set_color_alpha (psel, &query->stroke.value.color, SP_SCALE24_TO_FLOAT (query->stroke_opacity.value)); + } break; } @@ -244,7 +261,7 @@ sp_stroke_style_paint_update (SPWidget *spw) } } - g_free (query); + sp_style_unref(query); gtk_object_set_data(GTK_OBJECT(spw), "update", GINT_TO_POINTER(FALSE)); } @@ -257,6 +274,7 @@ sp_stroke_style_paint_mode_changed( SPPaintSelector *psel, SPPaintSelectorMode mode, SPWidget *spw ) { + (void)mode; if (gtk_object_get_data(GTK_OBJECT(spw), "update")) { return; } @@ -273,7 +291,7 @@ static gchar *undo_label_2 = "stroke:flatcolor:2"; static gchar *undo_label = undo_label_1; /** - * When a drag callback occurs on a paint selector object, if it is a RGB or CMYK + * When a drag callback occurs on a paint selector object, if it is a RGB or CMYK * color mode, then set the stroke opacity to psel's flat color. */ static void @@ -288,7 +306,7 @@ sp_stroke_style_paint_dragged(SPPaintSelector *psel, SPWidget *spw) case SP_PAINT_SELECTOR_MODE_COLOR_CMYK: { sp_paint_selector_set_flat_color (psel, SP_ACTIVE_DESKTOP, "stroke", "stroke-opacity"); - sp_document_maybe_done (sp_desktop_document(SP_ACTIVE_DESKTOP), undo_label, SP_VERB_DIALOG_FILL_STROKE, + sp_document_maybe_done (sp_desktop_document(SP_ACTIVE_DESKTOP), undo_label, SP_VERB_DIALOG_FILL_STROKE, _("Set stroke color")); break; } @@ -338,7 +356,7 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) sp_repr_css_attr_unref(css); - sp_document_done(document, SP_VERB_DIALOG_FILL_STROKE, + sp_document_done(document, SP_VERB_DIALOG_FILL_STROKE, _("Remove stroke")); break; } @@ -347,13 +365,13 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) case SP_PAINT_SELECTOR_MODE_COLOR_CMYK: { sp_paint_selector_set_flat_color (psel, desktop, "stroke", "stroke-opacity"); - sp_document_maybe_done (sp_desktop_document(desktop), undo_label, SP_VERB_DIALOG_FILL_STROKE, + sp_document_maybe_done (sp_desktop_document(desktop), undo_label, SP_VERB_DIALOG_FILL_STROKE, _("Set stroke color")); // on release, toggle undo_label so that the next drag will not be lumped with this one if (undo_label == undo_label_1) undo_label = undo_label_2; - else + else undo_label = undo_label_1; break; @@ -369,22 +387,22 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) if (!vector) { /* No vector in paint selector should mean that we just changed mode */ - SPStyle *query = sp_style_new (); - int result = objects_query_fillstroke ((GSList *) items, query, false); + SPStyle *query = sp_style_new (SP_ACTIVE_DOCUMENT); + int result = objects_query_fillstroke ((GSList *) items, query, false); guint32 common_rgb = 0; if (result == QUERY_STYLE_MULTIPLE_SAME) { - if (query->fill.type != SP_PAINT_TYPE_COLOR) { + if (!query->fill.isColor()) { common_rgb = sp_desktop_get_color(desktop, false); } else { - common_rgb = sp_color_get_rgba32_ualpha(&query->stroke.value.color, 0xff); + common_rgb = query->stroke.value.color.toRGBA32( 0xff ); } vector = sp_document_default_gradient_vector(document, common_rgb); } - g_free (query); + sp_style_unref(query); for (GSList const *i = items; i != NULL; i = i->next) { if (!vector) { - sp_item_set_gradient(SP_ITEM(i->data), + sp_item_set_gradient(SP_ITEM(i->data), sp_gradient_vector_for_object(document, desktop, SP_OBJECT(i->data), false), gradient_type, false); } else { @@ -399,7 +417,7 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) } } - sp_document_done(document, SP_VERB_DIALOG_FILL_STROKE, + sp_document_done(document, SP_VERB_DIALOG_FILL_STROKE, _("Set gradient on stroke")); } break; @@ -428,7 +446,7 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) continue; SPStyle *style = SP_OBJECT_STYLE (selobj); - if (style && style->stroke.type == SP_PAINT_TYPE_PAINTSERVER) { + if (style && style->stroke.isPaintserver()) { SPObject *server = SP_OBJECT_STYLE_STROKE_SERVER (selobj); if (SP_IS_PATTERN (server) && pattern_getroot (SP_PATTERN(server)) == pattern) // only if this object's pattern is not rooted in our selected pattern, apply @@ -443,7 +461,7 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) } // end if - sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, + sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, _("Set pattern on stroke")); } // end if @@ -453,11 +471,18 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) if (items) { SPCSSAttr *css = sp_repr_css_attr_new (); sp_repr_css_unset_property (css, "stroke"); + sp_repr_css_unset_property (css, "stroke-opacity"); + sp_repr_css_unset_property (css, "stroke-width"); + sp_repr_css_unset_property (css, "stroke-miterlimit"); + sp_repr_css_unset_property (css, "stroke-linejoin"); + sp_repr_css_unset_property (css, "stroke-linecap"); + sp_repr_css_unset_property (css, "stroke-dashoffset"); + sp_repr_css_unset_property (css, "stroke-dasharray"); sp_desktop_set_style (desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, + sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, _("Unset stroke")); } break; @@ -505,8 +530,6 @@ static void sp_stroke_style_line_dash_changed(SPDashSelector *dsel, static void sp_stroke_style_update_marker_menus(SPWidget *spw, GSList const *objects); -static SPObject *ink_extract_marker_name(gchar const *n); - /** * Helper function for creating radio buttons. This should probably be re-thought out @@ -544,23 +567,39 @@ sp_stroke_radio_button(GtkWidget *tb, char const *icon, } +static void +sp_stroke_style_widget_transientize_callback(Inkscape::Application *inkscape, + SPDesktop *desktop, + SPWidget *spw ) +{ + (void)inkscape; + (void)desktop; + (void)spw; +// TODO: Either of these will cause crashes sometimes +// sp_stroke_style_line_update( SP_WIDGET(spw), desktop ? sp_desktop_selection(desktop) : NULL); +// ink_markers_menu_update(spw); +} + /** * Creates a copy of the marker named mname, determines its visible and renderable * area in menu_id's bounding box, and then renders it. This allows us to fill in * preview images of each marker in the marker menu. */ static GtkWidget * -sp_marker_prev_new(unsigned size, gchar const *mname, +sp_marker_prev_new(unsigned psize, gchar const *mname, SPDocument *source, SPDocument *sandbox, gchar *menu_id, NRArena const *arena, unsigned visionkey, NRArenaItem *root) { + (void)arena; + (void)visionkey; // Retrieve the marker named 'mname' from the source SVG document SPObject const *marker = source->getObjectById(mname); if (marker == NULL) return NULL; // Create a copy repr of the marker with id="sample" - Inkscape::XML::Node *mrepr = SP_OBJECT_REPR (marker)->duplicate(); + Inkscape::XML::Document *xml_doc = sp_document_repr_doc(sandbox); + Inkscape::XML::Node *mrepr = SP_OBJECT_REPR (marker)->duplicate(xml_doc); mrepr->setAttribute("id", "sample"); // Replace the old sample in the sandbox by the new one @@ -586,74 +625,27 @@ sp_marker_prev_new(unsigned size, gchar const *mname, // Find object's bbox in document NR::Matrix const i2doc(sp_item_i2doc_affine(SP_ITEM(object))); + NR::Maybe dbox = SP_ITEM(object)->getBounds(i2doc); - NR::Rect const dbox = SP_ITEM(object)->invokeBbox(i2doc); - - if (dbox.isEmpty()) { + if (!dbox) { return NULL; } /* Update to renderable state */ - NRMatrix t; double sf = 0.8; - nr_matrix_set_scale(&t, sf, sf); - nr_arena_item_set_transform(root, &t); - NRGC gc(NULL); - nr_matrix_set_identity(&gc.transform); - nr_arena_item_invoke_update( root, NULL, &gc, - NR_ARENA_ITEM_STATE_ALL, - NR_ARENA_ITEM_STATE_NONE ); - - /* Item integer bbox in points */ - NRRectL ibox; - ibox.x0 = (int) floor(sf * dbox.min()[NR::X] + 0.5); - ibox.y0 = (int) floor(sf * dbox.min()[NR::Y] + 0.5); - ibox.x1 = (int) floor(sf * dbox.max()[NR::X] + 0.5); - ibox.y1 = (int) floor(sf * dbox.max()[NR::Y] + 0.5); - - /* Find visible area */ - int width = ibox.x1 - ibox.x0; - int height = ibox.y1 - ibox.y0; - int dx = size; - int dy = size; - dx=(dx - width)/2; // watch out for size, since 'unsigned'-'signed' can cause problems if the result is negative - dy=(dy - height)/2; - - NRRectL area; - area.x0 = ibox.x0 - dx; - area.y0 = ibox.y0 - dy; - area.x1 = area.x0 + size; - area.y1 = area.y0 + size; - - /* Actual renderable area */ - NRRectL ua; - ua.x0 = MAX(ibox.x0, area.x0); - ua.y0 = MAX(ibox.y0, area.y0); - ua.x1 = MIN(ibox.x1, area.x1); - ua.y1 = MIN(ibox.y1, area.y1); - - /* Set up pixblock */ - guchar *px = g_new(guchar, 4 * size * size); - memset(px, 0x00, 4 * size * size); - - /* Render */ - NRPixBlock B; - nr_pixblock_setup_extern( &B, NR_PIXBLOCK_MODE_R8G8B8A8N, - ua.x0, ua.y0, ua.x1, ua.y1, - px + 4 * size * (ua.y0 - area.y0) + - 4 * (ua.x0 - area.x0), - 4 * size, FALSE, FALSE ); - nr_arena_item_invoke_render( root, &ua, &B, - NR_ARENA_ITEM_RENDER_NO_CACHE ); - nr_pixblock_release(&B); + GdkPixbuf* pixbuf = NULL; + + Glib::ustring key = svg_preview_cache.cache_key(source->uri, mname, psize); + pixbuf = svg_preview_cache.get_preview_from_cache(key); + + if (pixbuf == NULL) { + pixbuf = render_pixbuf(root, sf, *dbox, psize); + svg_preview_cache.set_preview_in_cache(key, pixbuf); + } // Create widget - GtkWidget *pb = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_data(px, - GDK_COLORSPACE_RGB, - TRUE, - 8, size, size, size * 4, - (GdkPixbufDestroyNotify)g_free, - NULL)); + GtkWidget *pb = gtk_image_new_from_pixbuf(pixbuf); + return pb; } @@ -711,6 +703,7 @@ sp_marker_menu_build (GtkWidget *m, GSList *marker_list, SPDocument *source, SPD gtk_widget_show(hb); // generate preview + GtkWidget *prv = sp_marker_prev_new (22, markid, source, sandbox, menu_id, arena, visionkey, root); gtk_widget_show(prv); gtk_box_pack_start(GTK_BOX(hb), prv, FALSE, FALSE, 6); @@ -739,33 +732,15 @@ sp_marker_menu_build (GtkWidget *m, GSList *marker_list, SPDocument *source, SPD static void sp_marker_list_from_doc (GtkWidget *m, SPDocument *current_doc, SPDocument *source, SPDocument *markers_doc, SPDocument *sandbox, gchar *menu_id) { + (void)current_doc; + (void)markers_doc; GSList *ml = ink_marker_list_get(source); GSList *clean_ml = NULL; - // Do this here, outside of loop, to speed up preview generation: - /* Create new arena */ - NRArena const *arena = NRArena::create(); - /* Create ArenaItem and set transform */ - unsigned const visionkey = sp_item_display_key_new(1); - NRArenaItem *root = sp_item_invoke_show( SP_ITEM(SP_DOCUMENT_ROOT (sandbox)), (NRArena *) arena, visionkey, SP_ITEM_SHOW_DISPLAY ); - for (; ml != NULL; ml = ml->next) { if (!SP_IS_MARKER(ml->data)) continue; - Inkscape::XML::Node *repr = SP_OBJECT_REPR((SPItem *) ml->data); - bool stock_dupe = false; - - GSList * markers_doc_ml = ink_marker_list_get(markers_doc); - for (; markers_doc_ml != NULL; markers_doc_ml = markers_doc_ml->next) { - const gchar* stockid = SP_OBJECT_REPR(markers_doc_ml->data)->attribute("inkscape:stockid"); - if (stockid && !strcmp(repr->attribute("inkscape:stockid"), stockid)) - stock_dupe = true; - } - - if (stock_dupe) // stock item, dont add to list from current doc - continue; - // Add to the list of markers we really do wish to show clean_ml = g_slist_prepend (clean_ml, ml->data); } @@ -811,6 +786,57 @@ gchar const *buffer = "itemList(); - for (; items != NULL; items = items->next) { + // Also update the marker dropdown menus, so the document's markers + // show up at the top of the menu +// sp_stroke_style_line_update( SP_WIDGET(spw), desktop ? sp_desktop_selection(desktop) : NULL); + ink_markers_menu_update(SP_WIDGET(spw)); + + Inkscape::Selection *selection = sp_desktop_selection(desktop); + GSList const *items = selection->itemList(); + for (; items != NULL; items = items->next) { SPItem *item = (SPItem *) items->data; if (!SP_IS_SHAPE(item) || SP_IS_RECT(item)) // can't set marker to rect, until it's converted to using continue; @@ -956,8 +944,69 @@ sp_marker_select(GtkOptionMenu *mnu, GtkWidget *spw) sp_repr_css_attr_unref(css); - sp_document_done(document, SP_VERB_DIALOG_FILL_STROKE, + sp_document_done(document, SP_VERB_DIALOG_FILL_STROKE, _("Set markers")); + +}; + +static int +ink_marker_menu_get_pos(GtkMenu* mnu, gchar* markname) { + + if (markname == NULL) + markname = (gchar *) g_object_get_data(G_OBJECT(gtk_menu_get_active(mnu)), "marker"); + + if (markname == NULL) + return 0; + + GList *kids = GTK_MENU_SHELL(mnu)->children; + int i = 0; + for (; kids != NULL; kids = kids->next) { + gchar *mark = (gchar *) g_object_get_data(G_OBJECT(kids->data), "marker"); + if ( mark && strcmp(mark, markname) == 0 ) { + break; + } + i++; + } + return i; +} + +static void +ink_markers_menu_update(SPWidget* spw) { + SPDesktop *desktop = inkscape_active_desktop(); + SPDocument *document = sp_desktop_document(desktop); + SPDocument *sandbox = ink_markers_preview_doc (); + GtkWidget *m; + int pos; + + gtk_signal_handler_block_by_func( GTK_OBJECT(marker_start_menu), GTK_SIGNAL_FUNC(sp_marker_select), spw); + pos = ink_marker_menu_get_pos(GTK_MENU(gtk_option_menu_get_menu(GTK_OPTION_MENU(marker_start_menu))), NULL); + m = gtk_menu_new(); + gtk_widget_show(m); + ink_marker_menu_create_menu(m, "marker-start", document, sandbox); + gtk_option_menu_remove_menu(GTK_OPTION_MENU(marker_start_menu)); + gtk_option_menu_set_menu(GTK_OPTION_MENU(marker_start_menu), m); + gtk_option_menu_set_history(GTK_OPTION_MENU(marker_start_menu), pos); + gtk_signal_handler_unblock_by_func( GTK_OBJECT(marker_start_menu), GTK_SIGNAL_FUNC(sp_marker_select), spw); + + gtk_signal_handler_block_by_func( GTK_OBJECT(marker_mid_menu), GTK_SIGNAL_FUNC(sp_marker_select), spw); + pos = ink_marker_menu_get_pos(GTK_MENU(gtk_option_menu_get_menu(GTK_OPTION_MENU(marker_mid_menu))), NULL); + m = gtk_menu_new(); + gtk_widget_show(m); + ink_marker_menu_create_menu(m, "marker-mid", document, sandbox); + gtk_option_menu_remove_menu(GTK_OPTION_MENU(marker_mid_menu)); + gtk_option_menu_set_menu(GTK_OPTION_MENU(marker_mid_menu), m); + gtk_option_menu_set_history(GTK_OPTION_MENU(marker_mid_menu), pos); + gtk_signal_handler_unblock_by_func( GTK_OBJECT(marker_mid_menu), GTK_SIGNAL_FUNC(sp_marker_select), spw); + + gtk_signal_handler_block_by_func( GTK_OBJECT(marker_end_menu), GTK_SIGNAL_FUNC(sp_marker_select), spw); + pos = ink_marker_menu_get_pos(GTK_MENU(gtk_option_menu_get_menu(GTK_OPTION_MENU(marker_end_menu))), NULL); + m = gtk_menu_new(); + gtk_widget_show(m); + ink_marker_menu_create_menu(m, "marker-end", document, sandbox); + gtk_option_menu_remove_menu(GTK_OPTION_MENU(marker_end_menu)); + gtk_option_menu_set_menu(GTK_OPTION_MENU(marker_end_menu), m); + gtk_option_menu_set_history(GTK_OPTION_MENU(marker_end_menu), pos); + gtk_signal_handler_unblock_by_func( GTK_OBJECT(marker_end_menu), GTK_SIGNAL_FUNC(sp_marker_select), spw); } /** @@ -1199,35 +1248,33 @@ sp_stroke_style_line_widget_new(void) // TRANSLATORS: Path markers are an SVG feature that allows you to attach arbitrary shapes // (arrowheads, bullets, faces, whatever) to the start, end, or middle nodes of a path. spw_label(t, _("Start Markers:"), 0, i); - GtkWidget *mnu = ink_marker_menu( spw ,"marker-start", sandbox); - gtk_signal_connect( GTK_OBJECT(mnu), "changed", GTK_SIGNAL_FUNC(sp_marker_select), spw ); - gtk_widget_show(mnu); - gtk_table_attach( GTK_TABLE(t), mnu, 1, 4, i, i+1, + marker_start_menu = ink_marker_menu( spw ,"marker-start", sandbox); + gtk_signal_connect( GTK_OBJECT(marker_start_menu), "changed", GTK_SIGNAL_FUNC(sp_marker_select), spw ); + gtk_widget_show(marker_start_menu); + gtk_table_attach( GTK_TABLE(t), marker_start_menu, 1, 4, i, i+1, (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ), (GtkAttachOptions)0, 0, 0 ); - gtk_object_set_data(GTK_OBJECT(spw), "start_mark_menu", mnu); + gtk_object_set_data(GTK_OBJECT(spw), "start_mark_menu", marker_start_menu); i++; spw_label(t, _("Mid Markers:"), 0, i); - mnu = NULL; - mnu = ink_marker_menu( spw ,"marker-mid", sandbox); - gtk_signal_connect( GTK_OBJECT(mnu), "changed", GTK_SIGNAL_FUNC(sp_marker_select), spw ); - gtk_widget_show(mnu); - gtk_table_attach( GTK_TABLE(t), mnu, 1, 4, i, i+1, + marker_mid_menu = ink_marker_menu( spw ,"marker-mid", sandbox); + gtk_signal_connect( GTK_OBJECT(marker_mid_menu), "changed", GTK_SIGNAL_FUNC(sp_marker_select), spw ); + gtk_widget_show(marker_mid_menu); + gtk_table_attach( GTK_TABLE(t), marker_mid_menu, 1, 4, i, i+1, (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ), (GtkAttachOptions)0, 0, 0 ); - gtk_object_set_data(GTK_OBJECT(spw), "mid_mark_menu", mnu); + gtk_object_set_data(GTK_OBJECT(spw), "mid_mark_menu", marker_mid_menu); i++; spw_label(t, _("End Markers:"), 0, i); - mnu = NULL; - mnu = ink_marker_menu( spw ,"marker-end", sandbox); - gtk_signal_connect( GTK_OBJECT(mnu), "changed", GTK_SIGNAL_FUNC(sp_marker_select), spw ); - gtk_widget_show(mnu); - gtk_table_attach( GTK_TABLE(t), mnu, 1, 4, i, i+1, + marker_end_menu = ink_marker_menu( spw ,"marker-end", sandbox); + gtk_signal_connect( GTK_OBJECT(marker_end_menu), "changed", GTK_SIGNAL_FUNC(sp_marker_select), spw ); + gtk_widget_show(marker_end_menu); + gtk_table_attach( GTK_TABLE(t), marker_end_menu, 1, 4, i, i+1, (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ), (GtkAttachOptions)0, 0, 0 ); - gtk_object_set_data(GTK_OBJECT(spw), "end_mark_menu", mnu); + gtk_object_set_data(GTK_OBJECT(spw), "end_mark_menu", marker_end_menu); i++; @@ -1254,7 +1301,7 @@ sp_stroke_style_line_widget_new(void) static void sp_stroke_style_line_construct(SPWidget *spw, gpointer data) { - + (void)data; #ifdef SP_SS_VERBOSE g_print( "Stroke style widget constructed: inkscape %p repr %p\n", spw->inkscape, spw->repr ); @@ -1264,11 +1311,11 @@ sp_stroke_style_line_construct(SPWidget *spw, gpointer data) ( SP_ACTIVE_DESKTOP ? sp_desktop_selection(SP_ACTIVE_DESKTOP) : NULL )); - } + } } /** - * Callback for when stroke style widget is modified. + * Callback for when stroke style widget is modified. * Triggers update action. */ static void @@ -1277,6 +1324,7 @@ sp_stroke_style_line_selection_modified ( SPWidget *spw, guint flags, gpointer data ) { + (void)data; if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_PARENT_MODIFIED_FLAG)) { sp_stroke_style_line_update (spw, selection); } @@ -1292,6 +1340,7 @@ sp_stroke_style_line_selection_changed ( SPWidget *spw, Inkscape::Selection *selection, gpointer data ) { + (void)data; sp_stroke_style_line_update (spw, selection); } @@ -1386,12 +1435,12 @@ sp_stroke_style_line_update(SPWidget *spw, Inkscape::Selection *sel) GtkWidget *dsel = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "dash")); // create temporary style - SPStyle *query = sp_style_new (); + SPStyle *query = sp_style_new (SP_ACTIVE_DOCUMENT); // query into it - int result_sw = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_STROKEWIDTH); - int result_ml = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_STROKEMITERLIMIT); - int result_cap = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_STROKECAP); - int result_join = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_STROKEJOIN); + int result_sw = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_STROKEWIDTH); + int result_ml = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_STROKEMITERLIMIT); + int result_cap = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_STROKECAP); + int result_join = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_STROKEJOIN); if (result_sw == QUERY_STYLE_NOTHING) { /* No objects stroked, set insensitive */ @@ -1438,7 +1487,7 @@ sp_stroke_style_line_update(SPWidget *spw, Inkscape::Selection *sel) sp_stroke_style_set_cap_buttons(spw, NULL); } - g_free (query); + sp_style_unref(query); if (!sel || sel->isEmpty()) return; @@ -1566,7 +1615,7 @@ sp_stroke_style_scale_line(SPWidget *spw) sp_repr_css_attr_unref(css); - sp_document_done(document, SP_VERB_DIALOG_FILL_STROKE, + sp_document_done(document, SP_VERB_DIALOG_FILL_STROKE, _("Set stroke style")); gtk_object_set_data(GTK_OBJECT(spw), "update", GINT_TO_POINTER(FALSE)); @@ -1574,12 +1623,13 @@ sp_stroke_style_scale_line(SPWidget *spw) /** - * Callback for when the stroke style's width changes. + * Callback for when the stroke style's width changes. * Causes all line styles to be applied to all selected items. */ static void sp_stroke_style_width_changed(GtkAdjustment *adj, SPWidget *spw) { + (void)adj; if (gtk_object_get_data(GTK_OBJECT(spw), "update")) { return; } @@ -1588,12 +1638,13 @@ sp_stroke_style_width_changed(GtkAdjustment *adj, SPWidget *spw) } /** - * Callback for when the stroke style's miterlimit changes. + * Callback for when the stroke style's miterlimit changes. * Causes all line styles to be applied to all selected items. */ static void sp_stroke_style_miterlimit_changed(GtkAdjustment *adj, SPWidget *spw) { + (void)adj; if (gtk_object_get_data(GTK_OBJECT(spw), "update")) { return; } @@ -1602,12 +1653,13 @@ sp_stroke_style_miterlimit_changed(GtkAdjustment *adj, SPWidget *spw) } /** - * Callback for when the stroke style's dash changes. + * Callback for when the stroke style's dash changes. * Causes all line styles to be applied to all selected items. */ static void sp_stroke_style_line_dash_changed(SPDashSelector *dsel, SPWidget *spw) { + (void)dsel; if (gtk_object_get_data(GTK_OBJECT(spw), "update")) { return; } @@ -1734,19 +1786,7 @@ ink_marker_menu_set_current(SPObject *marker, GtkOptionMenu *mnu) else markname = g_strdup(SP_OBJECT_REPR(marker)->attribute("id")); - int markpos = 0; - GList *kids = GTK_MENU_SHELL(m)->children; - int i = 0; - for (; kids != NULL; kids = kids->next) { - gchar *mark = (gchar *) g_object_get_data(G_OBJECT(kids->data), "marker"); - if ( mark && strcmp(mark, markname) == 0 ) { - if ( mark_is_stock && !strcmp((gchar *) g_object_get_data(G_OBJECT(kids->data), "stockid"), "true")) - markpos = i; - if ( !mark_is_stock && !strcmp((gchar *) g_object_get_data(G_OBJECT(kids->data), "stockid"), "false")) - markpos = i; - } - i++; - } + int markpos = ink_marker_menu_get_pos(m, markname); gtk_option_menu_set_history(GTK_OPTION_MENU(mnu), markpos); g_free (markname); @@ -1758,7 +1798,7 @@ ink_marker_menu_set_current(SPObject *marker, GtkOptionMenu *mnu) } /** - * Updates the marker menus to highlight the appropriate marker and scroll to + * Updates the marker menus to highlight the appropriate marker and scroll to * that marker. */ static void @@ -1849,7 +1889,6 @@ ink_extract_marker_name(gchar const *n) gchar* b = g_strdup(p); b[c] = '\0'; - SPDesktop *desktop = inkscape_active_desktop(); SPDocument *doc = sp_desktop_document(desktop); SPObject *marker = doc->getObjectById(b);