From c73fabe43deeb9212ce046064c9f42544681fa45 Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Sat, 8 Oct 2016 21:23:20 +0300 Subject: Fix "ninja -j4 check". There was a wrong dependency which caused a direct "check" target build to fail. (bzr r15100.1.33) --- src/CMakeLists.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6a2af6b4b..5eaac4b51 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -502,9 +502,6 @@ add_executable(inkview ${view_SRC}) add_dependencies(inkscape inkscape_version) -if(WITH_DBUS) - add_dependencies(inkscape inkscape_dbus) -endif() set(INKSCAPE_TARGET_LIBS # order from automake @@ -529,6 +526,10 @@ set(INKSCAPE_TARGET_LIBS # Build everything except main and inkview.c in a shared library. add_library(inkscape_base SHARED ${inkscape_SRC} ${sp_SRC}) +if(WITH_DBUS) + add_dependencies(inkscape_base inkscape_dbus) +endif() + # Link the inkscape_base library against all external dependencies target_link_libraries(inkscape_base ${INKSCAPE_TARGET_LIBS}) -- cgit v1.2.3 From 937d201de4c702787628e868a079f43453b609eb Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Sat, 8 Oct 2016 23:37:06 +0300 Subject: Extract a subroutine from two places. There was a lot of duplicate code. (bzr r15100.1.35) --- src/widgets/eraser-toolbar.cpp | 50 +++++++++++------------------------------- 1 file changed, 13 insertions(+), 37 deletions(-) diff --git a/src/widgets/eraser-toolbar.cpp b/src/widgets/eraser-toolbar.cpp index bcfa662a2..99a355ec4 100644 --- a/src/widgets/eraser-toolbar.cpp +++ b/src/widgets/eraser-toolbar.cpp @@ -87,15 +87,8 @@ static void sp_erc_tremor_value_changed( GtkAdjustment *adj, GObject* tbl ) update_presets_list(tbl); } - -static void sp_erasertb_mode_changed( EgeSelectOneAction *act, GObject *tbl ) +static void sp_set_tbl_eraser_mode_visibility(GObject *const tbl, const guint eraser_mode) { - SPDesktop *desktop = static_cast(g_object_get_data( tbl, "desktop" )); - guint eraser_mode = ege_select_one_action_get_active( act ); - if (DocumentUndo::getUndoSensitive(desktop->getDocument())) { - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setInt( "/tools/eraser/mode", eraser_mode ); - } GtkAction *split = GTK_ACTION( g_object_get_data(tbl, "split") ); GtkAction *mass = GTK_ACTION( g_object_get_data(tbl, "mass") ); GtkAction *width = GTK_ACTION( g_object_get_data(tbl, "width") ); @@ -124,6 +117,17 @@ static void sp_erasertb_mode_changed( EgeSelectOneAction *act, GObject *tbl ) gtk_action_set_visible( mass, FALSE ); gtk_action_set_visible( width, FALSE ); } +} + +static void sp_erasertb_mode_changed( EgeSelectOneAction *act, GObject *tbl ) +{ + SPDesktop *desktop = static_cast(g_object_get_data( tbl, "desktop" )); + guint eraser_mode = ege_select_one_action_get_active( act ); + if (DocumentUndo::getUndoSensitive(desktop->getDocument())) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setInt( "/tools/eraser/mode", eraser_mode ); + } + sp_set_tbl_eraser_mode_visibility(tbl, eraser_mode); // only take action if run by the attr_changed listener if (!g_object_get_data( tbl, "freeze" )) { // in turn, prevent listener from responding @@ -305,35 +309,7 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_toogle_break_apart), holder) ; gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); } - GtkAction *split = GTK_ACTION( g_object_get_data(holder, "split") ); - GtkAction *mass = GTK_ACTION( g_object_get_data(holder, "mass") ); - GtkAction *width = GTK_ACTION( g_object_get_data(holder, "width") ); - GtkAction *usepressure = GTK_ACTION( g_object_get_data(holder, "usepressure") ); - GtkAction *cap_rounding = GTK_ACTION( g_object_get_data(holder, "cap_rounding") ); - GtkAction *thinning = GTK_ACTION( g_object_get_data(holder, "thinning") ); - GtkAction *tremor = GTK_ACTION( g_object_get_data(holder, "tremor") ); - if (eraser_mode != ERASER_MODE_DELETE) { - if(eraser_mode == ERASER_MODE_CUT) { - gtk_action_set_visible( split, TRUE ); - } else { - gtk_action_set_visible( split, FALSE ); - } - gtk_action_set_visible(usepressure, TRUE ); - gtk_action_set_visible(tremor, TRUE ); - gtk_action_set_visible(cap_rounding, TRUE ); - gtk_action_set_visible(thinning, TRUE ); - gtk_action_set_visible( mass, TRUE ); - gtk_action_set_visible( width, TRUE ); - } else { - gtk_action_set_visible(usepressure, FALSE ); - gtk_action_set_visible(tremor, FALSE ); - gtk_action_set_visible(cap_rounding, FALSE ); - gtk_action_set_visible(thinning, FALSE ); - gtk_action_set_visible( split, FALSE ); - gtk_action_set_visible( mass, FALSE ); - gtk_action_set_visible( width, FALSE ); - } - + sp_set_tbl_eraser_mode_visibility(holder, eraser_mode); } /* -- cgit v1.2.3 From 9d2644063bec04b2479b06fd5a4cf3ff45eb6865 Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Sat, 8 Oct 2016 23:55:05 +0300 Subject: Unify duplicate functionality. (bzr r15100.1.36) --- src/widgets/eraser-toolbar.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/widgets/eraser-toolbar.cpp b/src/widgets/eraser-toolbar.cpp index 99a355ec4..3b90f1eb7 100644 --- a/src/widgets/eraser-toolbar.cpp +++ b/src/widgets/eraser-toolbar.cpp @@ -96,27 +96,24 @@ static void sp_set_tbl_eraser_mode_visibility(GObject *const tbl, const guint er GtkAction *cap_rounding = GTK_ACTION( g_object_get_data(tbl, "cap_rounding") ); GtkAction *thinning = GTK_ACTION( g_object_get_data(tbl, "thinning") ); GtkAction *tremor = GTK_ACTION( g_object_get_data(tbl, "tremor") ); + gboolean visibility; if (eraser_mode != ERASER_MODE_DELETE) { if(eraser_mode == ERASER_MODE_CUT) { gtk_action_set_visible( split, TRUE ); } else { gtk_action_set_visible( split, FALSE ); } - gtk_action_set_visible(usepressure, TRUE ); - gtk_action_set_visible(tremor, TRUE ); - gtk_action_set_visible(cap_rounding, TRUE ); - gtk_action_set_visible(thinning, TRUE ); - gtk_action_set_visible( mass, TRUE ); - gtk_action_set_visible( width, TRUE ); + visibility = TRUE; } else { - gtk_action_set_visible(usepressure, FALSE ); - gtk_action_set_visible(tremor, FALSE ); - gtk_action_set_visible(cap_rounding, FALSE ); - gtk_action_set_visible(thinning, FALSE ); + visibility = FALSE; gtk_action_set_visible( split, FALSE ); - gtk_action_set_visible( mass, FALSE ); - gtk_action_set_visible( width, FALSE ); } + gtk_action_set_visible(usepressure, visibility ); + gtk_action_set_visible(tremor, visibility ); + gtk_action_set_visible(cap_rounding, visibility ); + gtk_action_set_visible(thinning, visibility ); + gtk_action_set_visible( mass, visibility ); + gtk_action_set_visible( width, visibility ); } static void sp_erasertb_mode_changed( EgeSelectOneAction *act, GObject *tbl ) -- cgit v1.2.3 From 426acc53b12416ea5b1396a1254fa18dda258be8 Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Sun, 9 Oct 2016 00:09:35 +0300 Subject: Replace assignments and set_vis()es with a foreach. It saves a lot of code. (bzr r15100.1.37) --- src/widgets/eraser-toolbar.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/widgets/eraser-toolbar.cpp b/src/widgets/eraser-toolbar.cpp index 3b90f1eb7..1171e98f0 100644 --- a/src/widgets/eraser-toolbar.cpp +++ b/src/widgets/eraser-toolbar.cpp @@ -90,12 +90,6 @@ static void sp_erc_tremor_value_changed( GtkAdjustment *adj, GObject* tbl ) static void sp_set_tbl_eraser_mode_visibility(GObject *const tbl, const guint eraser_mode) { GtkAction *split = GTK_ACTION( g_object_get_data(tbl, "split") ); - GtkAction *mass = GTK_ACTION( g_object_get_data(tbl, "mass") ); - GtkAction *width = GTK_ACTION( g_object_get_data(tbl, "width") ); - GtkAction *usepressure = GTK_ACTION( g_object_get_data(tbl, "usepressure") ); - GtkAction *cap_rounding = GTK_ACTION( g_object_get_data(tbl, "cap_rounding") ); - GtkAction *thinning = GTK_ACTION( g_object_get_data(tbl, "thinning") ); - GtkAction *tremor = GTK_ACTION( g_object_get_data(tbl, "tremor") ); gboolean visibility; if (eraser_mode != ERASER_MODE_DELETE) { if(eraser_mode == ERASER_MODE_CUT) { @@ -108,12 +102,10 @@ static void sp_set_tbl_eraser_mode_visibility(GObject *const tbl, const guint er visibility = FALSE; gtk_action_set_visible( split, FALSE ); } - gtk_action_set_visible(usepressure, visibility ); - gtk_action_set_visible(tremor, visibility ); - gtk_action_set_visible(cap_rounding, visibility ); - gtk_action_set_visible(thinning, visibility ); - gtk_action_set_visible( mass, visibility ); - gtk_action_set_visible( width, visibility ); + const std::array arr = {"cap_rounding", "mass", "thinning", "tremor", "usepressure", "width"}; + for(const gchar * str : arr) { + gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, str) ), visibility ); + } } static void sp_erasertb_mode_changed( EgeSelectOneAction *act, GObject *tbl ) -- cgit v1.2.3 From 0dff805e40722f7cdbb421bf7bd581713a023cf3 Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Sun, 9 Oct 2016 14:18:15 +0300 Subject: Refactoring/styling: extract a statement. (bzr r15100.1.38) --- src/widgets/eraser-toolbar.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/widgets/eraser-toolbar.cpp b/src/widgets/eraser-toolbar.cpp index 1171e98f0..2d5d40cfd 100644 --- a/src/widgets/eraser-toolbar.cpp +++ b/src/widgets/eraser-toolbar.cpp @@ -92,18 +92,14 @@ static void sp_set_tbl_eraser_mode_visibility(GObject *const tbl, const guint er GtkAction *split = GTK_ACTION( g_object_get_data(tbl, "split") ); gboolean visibility; if (eraser_mode != ERASER_MODE_DELETE) { - if(eraser_mode == ERASER_MODE_CUT) { - gtk_action_set_visible( split, TRUE ); - } else { - gtk_action_set_visible( split, FALSE ); - } + gtk_action_set_visible( split, (eraser_mode == ERASER_MODE_CUT) ? TRUE : FALSE ); visibility = TRUE; } else { visibility = FALSE; gtk_action_set_visible( split, FALSE ); } const std::array arr = {"cap_rounding", "mass", "thinning", "tremor", "usepressure", "width"}; - for(const gchar * str : arr) { + for (const gchar * str : arr) { gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, str) ), visibility ); } } -- cgit v1.2.3 From c6d8a41c80a0c0e48cc963a1301e24fc4e633f8b Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Sun, 9 Oct 2016 14:25:01 +0300 Subject: Refactoring: remove duplicacy. (bzr r15100.1.39) --- src/widgets/eraser-toolbar.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/widgets/eraser-toolbar.cpp b/src/widgets/eraser-toolbar.cpp index 2d5d40cfd..86a5119e0 100644 --- a/src/widgets/eraser-toolbar.cpp +++ b/src/widgets/eraser-toolbar.cpp @@ -89,15 +89,9 @@ static void sp_erc_tremor_value_changed( GtkAdjustment *adj, GObject* tbl ) static void sp_set_tbl_eraser_mode_visibility(GObject *const tbl, const guint eraser_mode) { - GtkAction *split = GTK_ACTION( g_object_get_data(tbl, "split") ); - gboolean visibility; - if (eraser_mode != ERASER_MODE_DELETE) { - gtk_action_set_visible( split, (eraser_mode == ERASER_MODE_CUT) ? TRUE : FALSE ); - visibility = TRUE; - } else { - visibility = FALSE; - gtk_action_set_visible( split, FALSE ); - } + gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "split") ), (eraser_mode == ERASER_MODE_CUT) ? TRUE : FALSE ); + + const gboolean visibility = (eraser_mode != ERASER_MODE_DELETE) ? TRUE : FALSE; const std::array arr = {"cap_rounding", "mass", "thinning", "tremor", "usepressure", "width"}; for (const gchar * str : arr) { gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, str) ), visibility ); -- cgit v1.2.3 From 1b7079f62b7c2bfe454e20bae3776a7e36e7e684 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Sun, 9 Oct 2016 20:37:54 +0200 Subject: Provide simple "preview" for mesh gradients. (bzr r15157) --- src/sp-gradient.cpp | 63 ++++++++++++++++++++++++++++++++++++++-- src/sp-gradient.h | 6 ++++ src/ui/widget/selected-style.cpp | 4 +-- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp index d3e38485b..333316697 100644 --- a/src/sp-gradient.cpp +++ b/src/sp-gradient.cpp @@ -46,6 +46,7 @@ #include "sp-radial-gradient.h" #include "sp-mesh-gradient.h" #include "sp-mesh-row.h" +#include "sp-mesh-patch.h" #include "sp-stop.h" /// Has to be power of 2 Seems to be unused. @@ -229,8 +230,6 @@ SPGradient::SPGradient() : SPPaintServer(), units(), state(2), vector() { - this->has_patches = 0; - this->ref = new SPGradientReference(this); this->ref->changedSignal().connect(sigc::bind(sigc::ptr_fun(SPGradient::gradientRefChanged), this)); @@ -250,6 +249,7 @@ SPGradient::SPGradient() : SPPaintServer(), units(), this->spread_set = FALSE; this->has_stops = FALSE; + this->has_patches = FALSE; this->vector.built = false; this->vector.stops.clear(); @@ -275,6 +275,17 @@ void SPGradient::build(SPDocument *document, Inkscape::XML::Node *repr) this->has_stops = TRUE; break; } + if (SP_IS_MESHROW(&ochild)) { + for (auto& ochild2: ochild.children) { + if (SP_IS_MESHPATCH(&ochild2)) { + this->has_patches = TRUE; + break; + } + } + if (this->has_patches == TRUE) { + break; + } + } } this->readAttr( "gradientUnits" ); @@ -470,6 +481,9 @@ void SPGradient::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *re } } } + if ( ochild && SP_IS_MESHROW(ochild) ) { + this->has_patches = TRUE; + } /// \todo Fixme: should we schedule "modified" here? this->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -485,11 +499,23 @@ void SPGradient::remove_child(Inkscape::XML::Node *child) SPPaintServer::remove_child(child); this->has_stops = FALSE; + this->has_patches = FALSE; for (auto& ochild: children) { if (SP_IS_STOP(&ochild)) { this->has_stops = TRUE; break; } + if (SP_IS_MESHROW(&ochild)) { + for (auto& ochild2: ochild.children) { + if (SP_IS_MESHPATCH(&ochild2)) { + this->has_patches = TRUE; + break; + } + } + if (this->has_patches == TRUE) { + break; + } + } } if ( this->getStopCount() == 0 ) { @@ -765,6 +791,14 @@ static bool has_stopsFN(SPGradient const *gr) return gr->hasStops(); } +/** + * True if gradient has patches (i.e. a mesh). + */ +static bool has_patchesFN(SPGradient const *gr) +{ + return gr->hasPatches(); +} + /** * True if gradient has spread set. */ @@ -793,6 +827,16 @@ SPGradient *SPGradient::getVector(bool force_vector) return src; } +SPGradient *SPGradient::getArray(bool force_vector) +{ + SPGradient * src = chase_hrefs(this, has_patchesFN); + + // if (force_vector) { + // src = sp_gradient_ensure_vector_normalized(src); + // } + return src; +} + /** * Returns the effective spread of given gradient (climbing up the refs chain if needed). * @@ -1031,6 +1075,7 @@ void SPGradient::rebuildArray() } array.read( SP_MESHGRADIENT( this ) ); + has_patches = array.patch_columns() > 0; } Geom::Affine @@ -1132,6 +1177,20 @@ sp_gradient_create_preview_pattern(SPGradient *gr, double width) cairo_pattern_add_color_stop_rgba(pat, i->offset, i->color.v.c[0], i->color.v.c[1], i->color.v.c[2], i->opacity); } + } else { + + // For the moment, use the top row of nodes for preview. + unsigned columns = gr->array.patch_columns(); + + double offset = 1.0/double(columns); + + pat = cairo_pattern_create_linear(0, 0, width, 0); + + for (unsigned i = 0; i < columns+1; ++i) { + SPMeshNode* node = gr->array.node( 0, i*3 ); + cairo_pattern_add_color_stop_rgba(pat, i*offset, + node->color.v.c[0], node->color.v.c[1], node->color.v.c[2], node->opacity); + } } return pat; diff --git a/src/sp-gradient.h b/src/sp-gradient.h index 7348bb5ca..51ba3090c 100644 --- a/src/sp-gradient.h +++ b/src/sp-gradient.h @@ -158,6 +158,12 @@ public: */ SPGradient *getVector(bool force_private = false); + /** + * Returns private mesh of given gradient (the gradient at the end of the href chain which has + * patches), optionally normalizing it. + */ + SPGradient *getArray(bool force_private = false); + //static GType getType(); /** Forces vector to be built, if not present (i.e. changed) */ diff --git a/src/ui/widget/selected-style.cpp b/src/ui/widget/selected-style.cpp index 301a3b2e0..ebc6fe919 100644 --- a/src/ui/widget/selected-style.cpp +++ b/src/ui/widget/selected-style.cpp @@ -1011,8 +1011,8 @@ SelectedStyle::update() _mode[i] = SS_RGRADIENT; #ifdef WITH_MESH } else if (SP_IS_MESHGRADIENT(server)) { - SPGradient *vector = SP_GRADIENT(server)->getVector(); - sp_gradient_image_set_gradient(SP_GRADIENT_IMAGE(_gradient_preview_m[i]), vector); + SPGradient *array = SP_GRADIENT(server)->getArray(); + sp_gradient_image_set_gradient(SP_GRADIENT_IMAGE(_gradient_preview_m[i]), array); place->add(_gradient_box_m[i]); place->set_tooltip_text(__mgradient[i]); _mode[i] = SS_MGRADIENT; -- cgit v1.2.3 From 313fbdd33bce622e2394661de6e9429615bb269d Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Sun, 9 Oct 2016 22:26:41 +0300 Subject: Remove unnecessary ?TRUE:FALSE. Thanks to Mc-. (bzr r15100.1.40) --- src/widgets/eraser-toolbar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widgets/eraser-toolbar.cpp b/src/widgets/eraser-toolbar.cpp index 86a5119e0..64aace4e7 100644 --- a/src/widgets/eraser-toolbar.cpp +++ b/src/widgets/eraser-toolbar.cpp @@ -89,9 +89,9 @@ static void sp_erc_tremor_value_changed( GtkAdjustment *adj, GObject* tbl ) static void sp_set_tbl_eraser_mode_visibility(GObject *const tbl, const guint eraser_mode) { - gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "split") ), (eraser_mode == ERASER_MODE_CUT) ? TRUE : FALSE ); + gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "split") ), (eraser_mode == ERASER_MODE_CUT)); - const gboolean visibility = (eraser_mode != ERASER_MODE_DELETE) ? TRUE : FALSE; + const gboolean visibility = (eraser_mode != ERASER_MODE_DELETE); const std::array arr = {"cap_rounding", "mass", "thinning", "tremor", "usepressure", "width"}; for (const gchar * str : arr) { gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, str) ), visibility ); -- cgit v1.2.3 From 21a70ba7b07c29ca0c729f7ab3ac33431c417b21 Mon Sep 17 00:00:00 2001 From: liampwhite Date: Sun, 9 Oct 2016 21:44:23 +0200 Subject: Fix palette flickering, probably. Fixed bugs: - https://launchpad.net/bugs/1201545 (bzr r15158) --- src/ui/previewholder.cpp | 4 ++-- src/widgets/button.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ui/previewholder.cpp b/src/ui/previewholder.cpp index ef11daa3b..6fec65124 100644 --- a/src/ui/previewholder.cpp +++ b/src/ui/previewholder.cpp @@ -256,7 +256,7 @@ void PreviewHolder::on_size_allocate( Gtk::Allocation& allocation ) // g_message(" anchor:%d", _anchor); Gtk::VBox::on_size_allocate( allocation ); - if ( _insides && !_wrap && (_view != VIEW_TYPE_LIST) && (_anchor == SP_ANCHOR_NORTH || _anchor == SP_ANCHOR_SOUTH) ) { +/* if ( _insides && !_wrap && (_view != VIEW_TYPE_LIST) && (_anchor == SP_ANCHOR_NORTH || _anchor == SP_ANCHOR_SOUTH) ) { Gtk::Requisition req; Gtk::Requisition req_natural; _insides->get_preferred_size(req, req_natural); @@ -267,7 +267,7 @@ void PreviewHolder::on_size_allocate( Gtk::Allocation& allocation ) } else { dynamic_cast(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER ); } - } + }*/ } //void PreviewHolder::on_size_request( Gtk::Requisition* requisition ) diff --git a/src/widgets/button.cpp b/src/widgets/button.cpp index 3f4f1207a..485300a25 100644 --- a/src/widgets/button.cpp +++ b/src/widgets/button.cpp @@ -41,8 +41,8 @@ static void sp_button_class_init(SPButtonClass *klass) GtkButtonClass *button_class = GTK_BUTTON_CLASS(klass); object_class->dispose = sp_button_dispose; - widget_class->get_preferred_width = sp_button_get_preferred_width; - widget_class->get_preferred_height = sp_button_get_preferred_height; + //widget_class->get_preferred_width = sp_button_get_preferred_width; + //widget_class->get_preferred_height = sp_button_get_preferred_height; button_class->clicked = sp_button_clicked; } -- cgit v1.2.3