summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2016-05-08 10:19:13 +0000
committerjabiertxof <info@marker.es>2016-05-08 10:19:13 +0000
commit1556c1a3619c415b3a7abacfdabd89398e411a91 (patch)
treed7718e5873db4b2c25cb3bed94fcc4c3ba87fea4 /src/widgets
parentremove a waring on compile (diff)
parentadd missing POTFILES.in line in mirror symmetry LPE (diff)
downloadinkscape-1556c1a3619c415b3a7abacfdabd89398e411a91.tar.gz
inkscape-1556c1a3619c415b3a7abacfdabd89398e411a91.zip
update to trunk
(bzr r13645.1.127)
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/CMakeLists.txt10
-rw-r--r--src/widgets/Makefile_insert8
-rw-r--r--src/widgets/button.cpp24
-rw-r--r--src/widgets/desktop-widget.cpp75
-rw-r--r--src/widgets/eek-preview.cpp34
-rw-r--r--src/widgets/ege-adjustment-action.cpp6
-rw-r--r--src/widgets/ege-select-one-action.cpp13
-rw-r--r--src/widgets/font-selector.cpp17
-rw-r--r--src/widgets/gradient-vector.cpp6
-rw-r--r--src/widgets/icon.cpp46
-rw-r--r--src/widgets/image-menu-item.c1071
-rw-r--r--src/widgets/image-menu-item.h81
-rw-r--r--src/widgets/ink-action.cpp42
-rw-r--r--src/widgets/ink-comboboxentry-action.cpp18
-rw-r--r--src/widgets/ruler.cpp32
-rw-r--r--src/widgets/shrink-wrap-button.cpp65
-rw-r--r--src/widgets/shrink-wrap-button.h35
-rw-r--r--src/widgets/spw-utilities.cpp43
-rw-r--r--src/widgets/text-toolbar.cpp97
-rw-r--r--src/widgets/toolbox.cpp3
20 files changed, 1509 insertions, 217 deletions
diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt
index c38bde5cf..225afe317 100644
--- a/src/widgets/CMakeLists.txt
+++ b/src/widgets/CMakeLists.txt
@@ -38,7 +38,6 @@ set(widgets_SRC
paint-selector.cpp
ruler.cpp
select-toolbar.cpp
- shrink-wrap-button.cpp
sp-attribute-widget.cpp
sp-color-selector.cpp
sp-widget.cpp
@@ -94,7 +93,6 @@ set(widgets_SRC
paint-selector.h
ruler.h
select-toolbar.h
- shrink-wrap-button.h
sp-attribute-widget.h
sp-color-selector.h
sp-widget.h
@@ -110,6 +108,11 @@ set(widgets_SRC
widget-sizes.h
)
+if(${WITH_GTK3_EXPERIMENTAL})
+ set(image_menu_item_SRC image-menu-item.h image-menu-item.c)
+ add_inkscape_source("${image_menu_item_SRC}")
+endif()
+
# add_inkscape_lib(widgets_LIB "${widgets_SRC}")
add_inkscape_source("${widgets_SRC}")
@@ -121,3 +124,6 @@ set ( widgets_paintbucket_SRC
if ("${HAVE_POTRACE}")
add_inkscape_source("${widgets_paintbucket_SRC}")
endif()
+
+
+
diff --git a/src/widgets/Makefile_insert b/src/widgets/Makefile_insert
index 6913f4a58..c9f04de14 100644
--- a/src/widgets/Makefile_insert
+++ b/src/widgets/Makefile_insert
@@ -1,5 +1,11 @@
## Makefile.am fragment sourced by src/Makefile.am.
+if WITH_GTKMM_3_0
+ink_common_sources += \
+ widgets/image-menu-item.c \
+ widgets/image-menu-item.h
+endif
+
ink_common_sources += \
widgets/arc-toolbar.cpp \
widgets/arc-toolbar.h \
@@ -66,8 +72,6 @@ ink_common_sources += \
widgets/ruler.h \
widgets/select-toolbar.cpp \
widgets/select-toolbar.h \
- widgets/shrink-wrap-button.cpp \
- widgets/shrink-wrap-button.h \
widgets/spray-toolbar.cpp \
widgets/spray-toolbar.h \
widgets/spiral-toolbar.cpp \
diff --git a/src/widgets/button.cpp b/src/widgets/button.cpp
index 1776e28c4..6ea8c1360 100644
--- a/src/widgets/button.cpp
+++ b/src/widgets/button.cpp
@@ -96,7 +96,6 @@ static void sp_button_dispose(GObject *object)
static void sp_button_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width)
{
GtkWidget *child = gtk_bin_get_child(GTK_BIN(widget));
- GtkStyle *style = gtk_widget_get_style(widget);
if (child) {
gtk_widget_get_preferred_width(GTK_WIDGET(child), minimal_width, natural_width);
@@ -105,14 +104,20 @@ static void sp_button_get_preferred_width(GtkWidget *widget, gint *minimal_width
*natural_width = 0;
}
- *minimal_width += 2 + 2 * MAX(2, style->xthickness);
- *natural_width += 2 + 2 * MAX(2, style->xthickness);
+ GtkStyleContext *context = gtk_widget_get_style_context (widget);
+ GtkBorder padding;
+ GtkBorder border;
+
+ gtk_style_context_get_padding(context, GTK_STATE_FLAG_NORMAL, &padding);
+ gtk_style_context_get_border( context, GTK_STATE_FLAG_NORMAL, &border );
+
+ *minimal_width += MAX(2, padding.left + padding.right + border.left + border.right);
+ *natural_width += MAX(2, padding.left + padding.right + border.left + border.right);
}
static void sp_button_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height)
{
GtkWidget *child = gtk_bin_get_child(GTK_BIN(widget));
- GtkStyle *style = gtk_widget_get_style(widget);
if (child) {
gtk_widget_get_preferred_height(GTK_WIDGET(child), minimal_height, natural_height);
@@ -121,8 +126,15 @@ static void sp_button_get_preferred_height(GtkWidget *widget, gint *minimal_heig
*natural_height = 0;
}
- *minimal_height += 2 + 2 * MAX(2, style->ythickness);
- *natural_height += 2 + 2 * MAX(2, style->ythickness);
+ GtkStyleContext *context = gtk_widget_get_style_context (widget);
+ GtkBorder padding;
+ GtkBorder border;
+
+ gtk_style_context_get_padding(context, GTK_STATE_FLAG_NORMAL, &padding);
+ gtk_style_context_get_border( context, GTK_STATE_FLAG_NORMAL, &border );
+
+ *minimal_height += MAX(2, padding.top + padding.bottom + border.top + border.bottom);
+ *natural_height += MAX(2, padding.top + padding.bottom + border.top + border.bottom);
}
#else
static void sp_button_size_request(GtkWidget *widget, GtkRequisition *requisition)
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index 1fdd3ca6d..1a4fcccf4 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -404,6 +404,7 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
Glib::RefPtr<Gtk::CssProvider> guides_lock_style_provider = Gtk::CssProvider::create();
guides_lock_style_provider->load_from_data("GtkWidget { padding-left: 0; padding-right: 0; padding-top: 0; padding-bottom: 0; }");
Gtk::Widget * wnd = Glib::wrap(dtw->guides_lock);
+ wnd->set_name("guides_lock");
Glib::RefPtr<Gtk::StyleContext> context = wnd->get_style_context();
context->add_provider(guides_lock_style_provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
#endif
@@ -564,7 +565,7 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
/* Canvas */
dtw->canvas = SP_CANVAS(SPCanvas::createAA());
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- dtw->canvas->enable_cms_display_adj = prefs->getBool("/options/displayprofile/enable");
+ dtw->canvas->_enable_cms_display_adj = prefs->getBool("/options/displayprofile/enable");
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
gtk_widget_set_can_focus (GTK_WIDGET (dtw->canvas), TRUE);
@@ -572,10 +573,18 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
sp_ruler_add_track_widget (SP_RULER(dtw->vruler), GTK_WIDGET(dtw->canvas));
#if GTK_CHECK_VERSION(3,0,0)
- GdkRGBA white = {1,1,1,1};
- gtk_widget_override_background_color(GTK_WIDGET(dtw->canvas),
- GTK_STATE_FLAG_NORMAL,
- &white);
+ GtkCssProvider *css_provider = gtk_css_provider_new();
+ GtkStyleContext *style_context = gtk_widget_get_style_context(GTK_WIDGET(dtw->canvas));
+
+ gtk_css_provider_load_from_data(css_provider,
+ "SPCanvas {\n"
+ " background-color: white;\n"
+ "}\n",
+ -1, NULL);
+
+ gtk_style_context_add_provider(style_context,
+ GTK_STYLE_PROVIDER(css_provider),
+ GTK_STYLE_PROVIDER_PRIORITY_USER);
#else
GtkStyle *style = gtk_style_copy(gtk_widget_get_style(GTK_WIDGET(dtw->canvas)));
style->bg[GTK_STATE_NORMAL] = style->white;
@@ -692,38 +701,37 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
gtk_container_add (GTK_CONTAINER (eventbox), dtw->coord_status);
gtk_widget_set_tooltip_text (eventbox, _("Cursor coordinates"));
GtkWidget *label_x = gtk_label_new(_("X:"));
- gtk_misc_set_alignment (GTK_MISC(label_x), 0.0, 0.5);
-
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_grid_attach(GTK_GRID(dtw->coord_status),
- label_x, 1, 0, 1, 1);
-#else
- gtk_table_attach(GTK_TABLE(dtw->coord_status), label_x, 1,2, 0,1, GTK_FILL, GTK_FILL, 0, 0);
-#endif
-
GtkWidget *label_y = gtk_label_new(_("Y:"));
- gtk_misc_set_alignment (GTK_MISC(label_y), 0.0, 0.5);
#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_halign(label_x, GTK_ALIGN_START);
+ gtk_widget_set_halign(label_y, GTK_ALIGN_START);
+ gtk_grid_attach(GTK_GRID(dtw->coord_status), label_x, 1, 0, 1, 1);
gtk_grid_attach(GTK_GRID(dtw->coord_status), label_y, 1, 1, 1, 1);
#else
+ gtk_misc_set_alignment (GTK_MISC(label_x), 0.0, 0.5);
+ gtk_misc_set_alignment (GTK_MISC(label_y), 0.0, 0.5);
+ gtk_table_attach(GTK_TABLE(dtw->coord_status), label_x, 1,2, 0,1, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(dtw->coord_status), label_y, 1,2, 1,2, GTK_FILL, GTK_FILL, 0, 0);
#endif
dtw->coord_status_x = gtk_label_new(NULL);
- gtk_label_set_markup( GTK_LABEL(dtw->coord_status_x), "<tt> 0.00 </tt>" );
- gtk_misc_set_alignment (GTK_MISC(dtw->coord_status_x), 1.0, 0.5);
dtw->coord_status_y = gtk_label_new(NULL);
+ gtk_label_set_markup( GTK_LABEL(dtw->coord_status_x), "<tt> 0.00 </tt>" );
gtk_label_set_markup( GTK_LABEL(dtw->coord_status_y), "<tt> 0.00 </tt>" );
- gtk_misc_set_alignment (GTK_MISC(dtw->coord_status_y), 1.0, 0.5);
+
GtkWidget* label_z = gtk_label_new(_("Z:"));
#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_halign(dtw->coord_status_x, GTK_ALIGN_END);
+ gtk_widget_set_halign(dtw->coord_status_y, GTK_ALIGN_END);
gtk_grid_attach(GTK_GRID(dtw->coord_status), dtw->coord_status_x, 2, 0, 1, 1);
gtk_grid_attach(GTK_GRID(dtw->coord_status), dtw->coord_status_y, 2, 1, 1, 1);
gtk_grid_attach(GTK_GRID(dtw->coord_status), label_z, 3, 0, 1, 2);
gtk_grid_attach(GTK_GRID(dtw->coord_status), dtw->zoom_status, 4, 0, 1, 2);
#else
+ gtk_misc_set_alignment (GTK_MISC(dtw->coord_status_x), 1.0, 0.5);
+ gtk_misc_set_alignment (GTK_MISC(dtw->coord_status_y), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(dtw->coord_status), dtw->coord_status_x, 2,3, 0,1, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(dtw->coord_status), dtw->coord_status_y, 2,3, 1,2, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(dtw->coord_status), label_z, 3,4, 0,2, GTK_FILL, GTK_FILL, 0, 0);
@@ -746,8 +754,8 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
Glib::ustring id = Inkscape::CMSSystem::getDisplayId( 0, 0 );
bool enabled = false;
- dtw->canvas->cms_key = id;
- enabled = !dtw->canvas->cms_key.empty();
+ dtw->canvas->_cms_key = id;
+ enabled = !dtw->canvas->_cms_key.empty();
cms_adjust_set_sensitive( dtw, enabled );
}
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
@@ -756,7 +764,13 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
dtw->select_status_eventbox = gtk_event_box_new ();
dtw->select_status = gtk_label_new (NULL);
gtk_label_set_ellipsize (GTK_LABEL(dtw->select_status), PANGO_ELLIPSIZE_END);
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_halign(dtw->select_status, GTK_ALIGN_START);
+#else
gtk_misc_set_alignment (GTK_MISC (dtw->select_status), 0.0, 0.5);
+#endif
+
gtk_widget_set_size_request (dtw->select_status, 1, -1);
// display the initial welcome message in the statusbar
gtk_label_set_markup (GTK_LABEL (dtw->select_status), _("<b>Welcome to Inkscape!</b> Use shape or freehand tools to create objects; use selector (arrow) to move or transform them."));
@@ -1035,7 +1049,7 @@ sp_desktop_widget_event (GtkWidget *widget, GdkEvent *event, SPDesktopWidget *dt
// current item on the canvas, because item events and all mouse events are caught
// and passed on by the canvas acetate (I think). --bb
if ((event->type == GDK_KEY_PRESS || event->type == GDK_KEY_RELEASE)
- && !dtw->canvas->current_item) {
+ && !dtw->canvas->_current_item) {
return sp_desktop_root_handler (NULL, event, dtw->desktop);
}
}
@@ -1054,9 +1068,9 @@ void sp_dtw_color_profile_event(EgeColorProfTracker */*tracker*/, SPDesktopWidge
gint monitor = gdk_screen_get_monitor_at_window(screen, window);
Glib::ustring id = Inkscape::CMSSystem::getDisplayId( screenNum, monitor );
bool enabled = false;
- dtw->canvas->cms_key = id;
+ dtw->canvas->_cms_key = id;
dtw->requestCanvasUpdate();
- enabled = !dtw->canvas->cms_key.empty();
+ enabled = !dtw->canvas->_cms_key.empty();
cms_adjust_set_sensitive( dtw, enabled );
}
#else
@@ -1092,8 +1106,8 @@ void cms_adjust_toggled( GtkWidget */*button*/, gpointer data )
SPDesktopWidget *dtw = SP_DESKTOP_WIDGET(data);
bool down = SP_BUTTON_IS_DOWN(dtw->cms_adjust);
- if ( down != dtw->canvas->enable_cms_display_adj ) {
- dtw->canvas->enable_cms_display_adj = down;
+ if ( down != dtw->canvas->_enable_cms_display_adj ) {
+ dtw->canvas->_enable_cms_display_adj = down;
dtw->requestCanvasUpdate();
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
prefs->setBool("/options/displayprofile/enable", down);
@@ -1685,7 +1699,11 @@ void SPDesktopWidget::setToolboxPosition(Glib::ustring const& id, GtkPositionTyp
case GTK_POS_TOP:
case GTK_POS_BOTTOM:
if ( gtk_widget_is_ancestor(toolbox, hbox) ) {
- gtk_widget_reparent( toolbox, vbox );
+ // Removing a widget can reduce ref count to zero
+ g_object_ref(G_OBJECT(toolbox));
+ gtk_container_remove(GTK_CONTAINER(hbox), toolbox);
+ gtk_container_add(GTK_CONTAINER(vbox), toolbox);
+ g_object_unref(G_OBJECT(toolbox));
gtk_box_set_child_packing(GTK_BOX(vbox), toolbox, FALSE, TRUE, 0, GTK_PACK_START);
}
ToolboxFactory::setOrientation(toolbox, GTK_ORIENTATION_HORIZONTAL);
@@ -1693,7 +1711,10 @@ void SPDesktopWidget::setToolboxPosition(Glib::ustring const& id, GtkPositionTyp
case GTK_POS_LEFT:
case GTK_POS_RIGHT:
if ( !gtk_widget_is_ancestor(toolbox, hbox) ) {
- gtk_widget_reparent( toolbox, hbox );
+ g_object_ref(G_OBJECT(toolbox));
+ gtk_container_remove(GTK_CONTAINER(vbox), toolbox);
+ gtk_container_add(GTK_CONTAINER(hbox), toolbox);
+ g_object_unref(G_OBJECT(toolbox));
gtk_box_set_child_packing(GTK_BOX(hbox), toolbox, FALSE, TRUE, 0, GTK_PACK_START);
if (pos == GTK_POS_LEFT) {
gtk_box_reorder_child( GTK_BOX(hbox), toolbox, 0 );
diff --git a/src/widgets/eek-preview.cpp b/src/widgets/eek-preview.cpp
index 19dbb04ab..9951a8957 100644
--- a/src/widgets/eek-preview.cpp
+++ b/src/widgets/eek-preview.cpp
@@ -239,7 +239,7 @@ static
gboolean eek_preview_draw(GtkWidget *widget,
cairo_t *cr)
{
- GtkStyle *style = gtk_widget_get_style(widget);
+
EekPreview *preview = EEK_PREVIEW(widget);
EekPreviewPrivate *priv = EEK_PREVIEW_GET_PRIVATE(preview);
@@ -284,7 +284,8 @@ gboolean eek_preview_draw(GtkWidget *widget,
0, 0,
allocation.width, allocation.height);
#else
- GdkWindow* window = gtk_widget_get_window(widget);
+ GtkStyle *style = gtk_widget_get_style(widget);
+ GdkWindow *window = gtk_widget_get_window(widget);
gtk_paint_flat_box( style,
window,
@@ -495,14 +496,11 @@ gboolean eek_preview_draw(GtkWidget *widget,
otherArea.y = possible.y + (possible.height - otherArea.height) / 2;
}
#if GTK_CHECK_VERSION(3,0,0)
- gtk_paint_diamond( style,
- cr,
- gtk_widget_get_state (widget),
- GTK_SHADOW_ETCHED_OUT,
- widget,
- NULL,
- otherArea.x, otherArea.y,
- otherArea.width, otherArea.height );
+ // This should be a diamond too?
+ gtk_render_check(context,
+ cr,
+ otherArea.x, otherArea.y,
+ otherArea.width, otherArea.height );
#else
gtk_paint_diamond( style,
window,
@@ -549,7 +547,11 @@ static gboolean eek_preview_enter_cb( GtkWidget* widget, GdkEventCrossing* event
EekPreviewPrivate *priv = EEK_PREVIEW_GET_PRIVATE(preview);
priv->within = TRUE;
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_state_flags( widget, priv->hot ? GTK_STATE_FLAG_ACTIVE : GTK_STATE_FLAG_PRELIGHT, false );
+#else
gtk_widget_set_state( widget, priv->hot ? GTK_STATE_ACTIVE : GTK_STATE_PRELIGHT );
+#endif
}
return FALSE;
@@ -562,7 +564,11 @@ static gboolean eek_preview_leave_cb( GtkWidget* widget, GdkEventCrossing* event
EekPreviewPrivate *priv = EEK_PREVIEW_GET_PRIVATE(preview);
priv->within = FALSE;
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_state_flags( widget, GTK_STATE_FLAG_NORMAL, false );
+#else
gtk_widget_set_state( widget, GTK_STATE_NORMAL );
+#endif
}
return FALSE;
@@ -587,7 +593,11 @@ static gboolean eek_preview_button_press_cb( GtkWidget* widget, GdkEventButton*
if ( priv->within )
{
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_state_flags( widget, GTK_STATE_FLAG_ACTIVE, false );
+#else
gtk_widget_set_state( widget, GTK_STATE_ACTIVE );
+#endif
}
}
}
@@ -602,7 +612,11 @@ static gboolean eek_preview_button_release_cb( GtkWidget* widget, GdkEventButton
EekPreviewPrivate *priv = EEK_PREVIEW_GET_PRIVATE(preview);
priv->hot = FALSE;
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_state_flags( widget, GTK_STATE_FLAG_NORMAL, false );
+#else
gtk_widget_set_state( widget, GTK_STATE_NORMAL );
+#endif
if ( priv->within &&
(event->button == PRIME_BUTTON_MAGIC_NUMBER ||
diff --git a/src/widgets/ege-adjustment-action.cpp b/src/widgets/ege-adjustment-action.cpp
index a91149f4c..272217aa4 100644
--- a/src/widgets/ege-adjustment-action.cpp
+++ b/src/widgets/ege-adjustment-action.cpp
@@ -865,7 +865,13 @@ static GtkWidget* create_tool_item( GtkAction* action )
gtk_box_pack_start( GTK_BOX(hb), icon, FALSE, FALSE, 0 );
} else {
GtkWidget* lbl = gtk_label_new( g_value_get_string( &value ) ? g_value_get_string( &value ) : "wwww" );
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_halign(lbl, GTK_ALIGN_END);
+#else
gtk_misc_set_alignment( GTK_MISC(lbl), 1.0, 0.5 );
+#endif
+
gtk_box_pack_start( GTK_BOX(hb), lbl, FALSE, FALSE, 0 );
}
}
diff --git a/src/widgets/ege-select-one-action.cpp b/src/widgets/ege-select-one-action.cpp
index ab86c49f8..2e106154e 100644
--- a/src/widgets/ege-select-one-action.cpp
+++ b/src/widgets/ege-select-one-action.cpp
@@ -818,9 +818,14 @@ GtkWidget* create_tool_item( GtkAction* action )
gtk_box_pack_start( GTK_BOX(holder), normal, FALSE, FALSE, 0 );
{
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_halign(holder, GTK_ALIGN_START);
+ gtk_container_add(GTK_CONTAINER(item), holder);
+#else
GtkWidget *align = gtk_alignment_new(0, 0.5, 0, 0);
gtk_container_add( GTK_CONTAINER(align), holder);
gtk_container_add( GTK_CONTAINER(item), align );
+#endif
}
}
@@ -855,10 +860,14 @@ void resync_active( EgeSelectOneAction* act, gint active, gboolean override )
GList* children = gtk_container_get_children( GTK_CONTAINER(proxies->data) );
if ( children && children->data ) {
gpointer combodata = g_object_get_data( G_OBJECT(children->data), "ege-combo-box" );
+
+#if !GTK_CHECK_VERSION(3,0,0)
if (!combodata && GTK_IS_ALIGNMENT(children->data)) {
GList *other = gtk_container_get_children( GTK_CONTAINER(children->data) );
combodata = g_object_get_data( G_OBJECT(other->data), "ege-combo-box" );
}
+#endif
+
if ( GTK_IS_COMBO_BOX(combodata) ) {
GtkComboBox* combo = GTK_COMBO_BOX(combodata);
if ((active == -1) && (gtk_combo_box_get_has_entry(combo))) {
@@ -915,10 +924,14 @@ void resync_sensitive( EgeSelectOneAction* act )
GList* children = gtk_container_get_children( GTK_CONTAINER(proxies->data) );
if ( children && children->data ) {
gpointer combodata = g_object_get_data( G_OBJECT(children->data), "ege-combo-box" );
+
+#if !GTK_CHECK_VERSION(3,0,0)
if (!combodata && GTK_IS_ALIGNMENT(children->data)) {
GList *other = gtk_container_get_children( GTK_CONTAINER(children->data) );
combodata = g_object_get_data( G_OBJECT(other->data), "ege-combo-box" );
}
+#endif
+
if ( GTK_IS_COMBO_BOX(combodata) ) {
/* Not implemented */
} else if ( GTK_IS_BOX(children->data) ) {
diff --git a/src/widgets/font-selector.cpp b/src/widgets/font-selector.cpp
index 943434868..aefcb2e81 100644
--- a/src/widgets/font-selector.cpp
+++ b/src/widgets/font-selector.cpp
@@ -159,9 +159,24 @@ static void sp_font_selector_init(SPFontSelector *fsel)
/* Muck with style, see text-toolbar.cpp */
gtk_widget_set_name( GTK_WIDGET(fsel->family_treeview), "font_selector_family" );
+
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkCssProvider *css_provider = gtk_css_provider_new();
+ gtk_css_provider_load_from_data(css_provider,
+ "#font_selector_family {\n"
+ " -GtkWidget-wide-separators: true;\n"
+ " -GtkWidget-separator-height: 6;\n"
+ "}\n",
+ -1, NULL);
+
+ GdkScreen *screen = gdk_screen_get_default();
+ gtk_style_context_add_provider_for_screen(screen,
+ GTK_STYLE_PROVIDER(css_provider),
+ GTK_STYLE_PROVIDER_PRIORITY_USER);
+#else
gtk_rc_parse_string (
"widget \"*font_selector_family\" style \"fontfamily-separator-style\"");
-
+#endif
Inkscape::FontLister* fontlister = Inkscape::FontLister::get_instance();
Glib::RefPtr<Gtk::ListStore> store = fontlister->get_font_list();
diff --git a/src/widgets/gradient-vector.cpp b/src/widgets/gradient-vector.cpp
index 35c1e4a8d..3aa44c90a 100644
--- a/src/widgets/gradient-vector.cpp
+++ b/src/widgets/gradient-vector.cpp
@@ -914,7 +914,13 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s
/* Label */
GtkWidget *l = gtk_label_new(C_("Gradient","Offset:"));
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_halign(l, GTK_ALIGN_END);
+#else
gtk_misc_set_alignment(GTK_MISC(l), 1.0, 0.5);
+#endif
+
gtk_box_pack_start(GTK_BOX(hb),l, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
gtk_widget_show(l);
diff --git a/src/widgets/icon.cpp b/src/widgets/icon.cpp
index 542d16797..f2031fe51 100644
--- a/src/widgets/icon.cpp
+++ b/src/widgets/icon.cpp
@@ -232,6 +232,7 @@ void IconImpl::sizeAllocate(GtkWidget *widget, GtkAllocation *allocation)
}
}
+// GTK3 Only, Doesn't actually seem to be used.
gboolean IconImpl::draw(GtkWidget *widget, cairo_t* cr)
{
SPIcon *icon = SP_ICON(widget);
@@ -247,24 +248,34 @@ gboolean IconImpl::draw(GtkWidget *widget, cairo_t* cr)
if (gtk_widget_get_state_flags (GTK_WIDGET(icon)) != GTK_STATE_FLAG_NORMAL && image) {
#else
if (gtk_widget_get_state (GTK_WIDGET(icon)) != GTK_STATE_NORMAL && image) {
+ std::cerr << "IconImpl::draw: Ooops! It is called in GTK2" << std::endl;
#endif
+ std::cerr << "IconImpl::draw: No image, creating fallback" << std::endl;
+
+#if GTK_CHECK_VERSION(3,0,0)
+ // image = gtk_render_icon_pixbuf(gtk_widget_get_style_context(widget),
+ // source,
+ // (GtkIconSize)-1);
+
+ // gtk_render_icon_pixbuf deprecated, replaced by:
+ GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
+ image = gtk_icon_theme_load_icon (icon_theme,
+ "gtk-image",
+ 32,
+ (GtkIconLookupFlags)0,
+ NULL);
+#else
GtkIconSource *source = gtk_icon_source_new();
gtk_icon_source_set_pixbuf(source, icon->pb);
gtk_icon_source_set_size(source, GTK_ICON_SIZE_SMALL_TOOLBAR); // note: this is boilerplate and not used
gtk_icon_source_set_size_wildcarded(source, FALSE);
-
-#if GTK_CHECK_VERSION(3,0,0)
- image = gtk_render_icon_pixbuf(gtk_widget_get_style_context(widget),
- source,
- (GtkIconSize)-1);
-#else
image = gtk_style_render_icon(gtk_widget_get_style(widget), source,
gtk_widget_get_direction(widget),
(GtkStateType) gtk_widget_get_state(widget),
(GtkIconSize)-1, widget, "gtk-image");
+ gtk_icon_source_free(source);
#endif
- gtk_icon_source_free(source);
unref_image = true;
}
@@ -272,7 +283,13 @@ gboolean IconImpl::draw(GtkWidget *widget, cairo_t* cr)
GtkAllocation allocation;
GtkRequisition requisition;
gtk_widget_get_allocation(widget, &allocation);
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_get_preferred_size(widget, &requisition, NULL);
+#else
gtk_widget_get_requisition(widget, &requisition);
+#endif
+
int x = floor(allocation.x + ((allocation.width - requisition.width) * 0.5));
int y = floor(allocation.y + ((allocation.height - requisition.height) * 0.5));
int width = gdk_pixbuf_get_width(image);
@@ -787,6 +804,10 @@ GtkWidget *IconImpl::newFull( Inkscape::IconSize lsize, gchar const *name )
GtkWidget *widget = NULL;
gint trySize = CLAMP( static_cast<gint>(lsize), 0, static_cast<gint>(G_N_ELEMENTS(iconSizeLookup) - 1) );
+ if (trySize != lsize ) {
+ std::cerr << "GtkWidget *IconImple::newFull(): lsize != trySize: lsize: " << lsize
+ << " try Size: " << trySize << " " << (name?name:"NULL") << std::endl;
+ }
if ( !sizeMapDone ) {
injectCustomSize();
}
@@ -814,6 +835,7 @@ GtkWidget *IconImpl::newFull( Inkscape::IconSize lsize, gchar const *name )
if ( Inkscape::Preferences::get()->getBool("/options/iconrender/named_nodelay") ) {
int psize = getPhysSize(lsize);
+ // std::cout << " name: " << name << " size: " << psize << std::endl;
prerenderIcon(name, mappedSize, psize);
} else {
addPreRender( mappedSize, name );
@@ -986,8 +1008,6 @@ int IconImpl::getPhysSize(int size)
"inkscape-decoration"
};
- GtkWidget *icon = GTK_WIDGET(g_object_new(SP_TYPE_ICON, NULL));
-
for (unsigned i = 0; i < G_N_ELEMENTS(gtkSizes); ++i) {
guint const val_ix = (gtkSizes[i] <= GTK_ICON_SIZE_DIALOG) ? (guint)gtkSizes[i] : (guint)Inkscape::ICON_SIZE_DECORATION;
@@ -1012,7 +1032,12 @@ int IconImpl::getPhysSize(int size)
// gtk_icon_size_lookup(), because themes are free to render the pixbuf however
// they like, including changing the usual size."
gchar const *id = INKSCAPE_ICON("document-open");
- GdkPixbuf *pb = gtk_widget_render_icon( icon, id, gtkSizes[i], NULL);
+ GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
+ GdkPixbuf *pb = gtk_icon_theme_load_icon (icon_theme,
+ id,
+ vals[val_ix],
+ (GtkIconLookupFlags)0,
+ NULL);
if (pb) {
width = gdk_pixbuf_get_width(pb);
height = gdk_pixbuf_get_height(pb);
@@ -1028,7 +1053,6 @@ int IconImpl::getPhysSize(int size)
g_object_unref(G_OBJECT(pb));
}
}
- //g_object_unref(icon);
init = true;
}
diff --git a/src/widgets/image-menu-item.c b/src/widgets/image-menu-item.c
new file mode 100644
index 000000000..2b9500ba0
--- /dev/null
+++ b/src/widgets/image-menu-item.c
@@ -0,0 +1,1071 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2001 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000.
+ * Forked by . Icons in menus are important to us.
+ */
+
+#include "config.h"
+
+#include <glib/gi18n-lib.h>
+#include <gtk/gtk.h>
+
+#include "widgets/image-menu-item.h"
+
+/**
+ * SECTION:gtkimagemenuitem
+ * @Short_description: A menu item with an icon
+ * @Title: ImageMenuItem
+ *
+ * A ImageMenuItem is a menu item which has an icon next to the text label.
+ *
+ * Note that the user can disable display of menu icons, so make sure to still
+ * fill in the text label.
+ */
+
+
+struct _ImageMenuItemPrivate
+{
+ GtkWidget *image;
+
+ gchar *label;
+ guint use_stock : 1;
+ guint toggle_size;
+};
+
+enum {
+ PROP_0,
+ PROP_IMAGE,
+ PROP_USE_STOCK,
+ PROP_ACCEL_GROUP,
+};
+
+static GtkActivatableIface *parent_activatable_iface;
+
+static void image_menu_item_destroy (GtkWidget *widget);
+static void image_menu_item_get_preferred_width (GtkWidget *widget,
+ gint *minimum,
+ gint *natural);
+static void image_menu_item_get_preferred_height (GtkWidget *widget,
+ gint *minimum,
+ gint *natural);
+static void image_menu_item_get_preferred_height_for_width (GtkWidget *widget,
+ gint width,
+ gint *minimum,
+ gint *natural);
+static void image_menu_item_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation);
+static void image_menu_item_map (GtkWidget *widget);
+static void image_menu_item_remove (GtkContainer *container,
+ GtkWidget *child);
+static void image_menu_item_toggle_size_request (GtkMenuItem *menu_item,
+ gint *requisition);
+static void image_menu_item_set_label (GtkMenuItem *menu_item,
+ const gchar *label);
+static const gchar * image_menu_item_get_label (GtkMenuItem *menu_item);
+
+static void image_menu_item_forall (GtkContainer *container,
+ gboolean include_internals,
+ GtkCallback callback,
+ gpointer callback_data);
+
+static void image_menu_item_finalize (GObject *object);
+static void image_menu_item_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void image_menu_item_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void image_menu_item_screen_changed (GtkWidget *widget,
+ GdkScreen *previous_screen);
+
+static void image_menu_item_recalculate (ImageMenuItem *image_menu_item);
+
+static void image_menu_item_activatable_interface_init (GtkActivatableIface *iface);
+static void image_menu_item_update (GtkActivatable *activatable,
+ GtkAction *action,
+ const gchar *property_name);
+static void image_menu_item_sync_action_properties (GtkActivatable *activatable,
+ GtkAction *action);
+
+
+G_DEFINE_TYPE_WITH_CODE (ImageMenuItem, image_menu_item, GTK_TYPE_MENU_ITEM,
+ G_ADD_PRIVATE (ImageMenuItem)
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_ACTIVATABLE,
+ image_menu_item_activatable_interface_init))
+
+
+static void
+image_menu_item_class_init (ImageMenuItemClass *klass)
+{
+ GObjectClass *gobject_class = (GObjectClass*) klass;
+ GtkWidgetClass *widget_class = (GtkWidgetClass*) klass;
+ GtkMenuItemClass *menu_item_class = (GtkMenuItemClass*) klass;
+ GtkContainerClass *container_class = (GtkContainerClass*) klass;
+
+ widget_class->destroy = image_menu_item_destroy;
+ widget_class->screen_changed = image_menu_item_screen_changed;
+ widget_class->get_preferred_width = image_menu_item_get_preferred_width;
+ widget_class->get_preferred_height = image_menu_item_get_preferred_height;
+ widget_class->get_preferred_height_for_width = image_menu_item_get_preferred_height_for_width;
+ widget_class->size_allocate = image_menu_item_size_allocate;
+ widget_class->map = image_menu_item_map;
+
+ container_class->forall = image_menu_item_forall;
+ container_class->remove = image_menu_item_remove;
+
+ menu_item_class->toggle_size_request = image_menu_item_toggle_size_request;
+ menu_item_class->set_label = image_menu_item_set_label;
+ menu_item_class->get_label = image_menu_item_get_label;
+
+ gobject_class->finalize = image_menu_item_finalize;
+ gobject_class->set_property = image_menu_item_set_property;
+ gobject_class->get_property = image_menu_item_get_property;
+
+ /**
+ * ImageMenuItem:image:
+ *
+ * Child widget to appear next to the menu text.
+ *
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_IMAGE,
+ g_param_spec_object ("image",
+ _("Image widget"),
+ _("Child widget to appear next to the menu text"),
+ GTK_TYPE_WIDGET,
+ GTK_PARAM_READWRITE | G_PARAM_DEPRECATED));
+ /**
+ * ImageMenuItem:use-stock:
+ *
+ * If %TRUE, the label set in the menuitem is used as a
+ * stock id to select the stock item for the item.
+ *
+ * Since: 2.16
+ *
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_USE_STOCK,
+ g_param_spec_boolean ("use-stock",
+ _("Use stock"),
+ _("Whether to use the label text to create a stock menu item"),
+ FALSE,
+ GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_DEPRECATED));
+
+ /**
+ * ImageMenuItem:accel-group:
+ *
+ * The Accel Group to use for stock accelerator keys
+ *
+ * Since: 2.16
+ *
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_ACCEL_GROUP,
+ g_param_spec_object ("accel-group",
+ _("Accel Group"),
+ _("The Accel Group to use for stock accelerator keys"),
+ GTK_TYPE_ACCEL_GROUP,
+ GTK_PARAM_WRITABLE | G_PARAM_DEPRECATED));
+
+}
+
+static void
+image_menu_item_init (ImageMenuItem *image_menu_item)
+{
+ ImageMenuItemPrivate *priv;
+
+ image_menu_item->priv = image_menu_item_get_instance_private (image_menu_item);
+ priv = image_menu_item->priv;
+
+ priv->image = NULL;
+ priv->use_stock = FALSE;
+ priv->label = NULL;
+}
+
+static void
+image_menu_item_finalize (GObject *object)
+{
+ ImageMenuItemPrivate *priv = IMAGE_MENU_ITEM (object)->priv;
+
+ g_free (priv->label);
+ priv->label = NULL;
+
+ G_OBJECT_CLASS (image_menu_item_parent_class)->finalize (object);
+}
+
+static void
+image_menu_item_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ImageMenuItem *image_menu_item = IMAGE_MENU_ITEM (object);
+
+ switch (prop_id)
+ {
+ case PROP_IMAGE:
+ image_menu_item_set_image (image_menu_item, (GtkWidget *) g_value_get_object (value));
+ break;
+ case PROP_USE_STOCK:
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+ image_menu_item_set_use_stock (image_menu_item, g_value_get_boolean (value));
+ G_GNUC_END_IGNORE_DEPRECATIONS;
+ break;
+ case PROP_ACCEL_GROUP:
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+ image_menu_item_set_accel_group (image_menu_item, g_value_get_object (value));
+ G_GNUC_END_IGNORE_DEPRECATIONS;
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+image_menu_item_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ ImageMenuItem *image_menu_item = IMAGE_MENU_ITEM (object);
+
+ switch (prop_id)
+ {
+ case PROP_IMAGE:
+ g_value_set_object (value, image_menu_item_get_image (image_menu_item));
+ break;
+ case PROP_USE_STOCK:
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+ g_value_set_boolean (value, image_menu_item_get_use_stock (image_menu_item));
+ G_GNUC_END_IGNORE_DEPRECATIONS;
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+image_menu_item_map (GtkWidget *widget)
+{
+ ImageMenuItem *image_menu_item = IMAGE_MENU_ITEM (widget);
+ ImageMenuItemPrivate *priv = image_menu_item->priv;
+
+ GTK_WIDGET_CLASS (image_menu_item_parent_class)->map (widget);
+
+ if (priv->image)
+ g_object_set (priv->image, "visible", TRUE, NULL);
+}
+
+static void
+image_menu_item_destroy (GtkWidget *widget)
+{
+ ImageMenuItem *image_menu_item = IMAGE_MENU_ITEM (widget);
+ ImageMenuItemPrivate *priv = image_menu_item->priv;
+
+ if (priv->image)
+ gtk_container_remove (GTK_CONTAINER (image_menu_item),
+ priv->image);
+
+ GTK_WIDGET_CLASS (image_menu_item_parent_class)->destroy (widget);
+}
+
+static void
+image_menu_item_toggle_size_request (GtkMenuItem *menu_item,
+ gint *requisition)
+{
+ ImageMenuItem *image_menu_item = IMAGE_MENU_ITEM (menu_item);
+ ImageMenuItemPrivate *priv = image_menu_item->priv;
+ GtkPackDirection pack_dir;
+ GtkWidget *parent;
+ GtkWidget *widget = GTK_WIDGET (menu_item);
+
+ parent = gtk_widget_get_parent (widget);
+
+ if (GTK_IS_MENU_BAR (parent))
+ pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
+ else
+ pack_dir = GTK_PACK_DIRECTION_LTR;
+
+ *requisition = 0;
+
+ if (priv->image && gtk_widget_get_visible (priv->image))
+ {
+ GtkRequisition image_requisition;
+ guint toggle_spacing;
+
+ gtk_widget_get_preferred_size (priv->image, &image_requisition, NULL);
+
+ gtk_widget_style_get (GTK_WIDGET (menu_item),
+ "toggle-spacing", &toggle_spacing,
+ NULL);
+
+ if (pack_dir == GTK_PACK_DIRECTION_LTR || pack_dir == GTK_PACK_DIRECTION_RTL)
+ {
+ if (image_requisition.width > 0)
+ *requisition = image_requisition.width + toggle_spacing;
+ }
+ else
+ {
+ if (image_requisition.height > 0)
+ *requisition = image_requisition.height + toggle_spacing;
+ }
+ }
+}
+
+static void
+image_menu_item_recalculate (ImageMenuItem *image_menu_item)
+{
+ ImageMenuItemPrivate *priv = image_menu_item->priv;
+ GtkStockItem stock_item;
+ GtkWidget *image;
+ const gchar *resolved_label = priv->label;
+
+ if (priv->use_stock && priv->label)
+ {
+
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+
+ if (!priv->image)
+ {
+ image = gtk_image_new_from_stock (priv->label, GTK_ICON_SIZE_MENU);
+ image_menu_item_set_image (image_menu_item, image);
+ }
+
+ if (gtk_stock_lookup (priv->label, &stock_item))
+ resolved_label = stock_item.label;
+
+ gtk_menu_item_set_use_underline (GTK_MENU_ITEM (image_menu_item), TRUE);
+
+ G_GNUC_END_IGNORE_DEPRECATIONS;
+ }
+
+ GTK_MENU_ITEM_CLASS
+ (image_menu_item_parent_class)->set_label (GTK_MENU_ITEM (image_menu_item), resolved_label);
+
+}
+
+static void
+image_menu_item_set_label (GtkMenuItem *menu_item,
+ const gchar *label)
+{
+ ImageMenuItemPrivate *priv = IMAGE_MENU_ITEM (menu_item)->priv;
+
+ if (priv->label != label)
+ {
+ g_free (priv->label);
+ priv->label = g_strdup (label);
+
+ image_menu_item_recalculate (IMAGE_MENU_ITEM (menu_item));
+
+ g_object_notify (G_OBJECT (menu_item), "label");
+
+ }
+}
+
+static const gchar *
+image_menu_item_get_label (GtkMenuItem *menu_item)
+{
+ ImageMenuItemPrivate *priv = IMAGE_MENU_ITEM (menu_item)->priv;
+
+ return priv->label;
+}
+
+static void
+image_menu_item_get_preferred_width (GtkWidget *widget,
+ gint *minimum,
+ gint *natural)
+{
+ ImageMenuItem *image_menu_item = IMAGE_MENU_ITEM (widget);
+ ImageMenuItemPrivate *priv = image_menu_item->priv;
+ GtkPackDirection pack_dir;
+ GtkWidget *parent;
+
+ parent = gtk_widget_get_parent (widget);
+
+ if (GTK_IS_MENU_BAR (parent))
+ pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
+ else
+ pack_dir = GTK_PACK_DIRECTION_LTR;
+
+ GTK_WIDGET_CLASS (image_menu_item_parent_class)->get_preferred_width (widget, minimum, natural);
+
+ if ((pack_dir == GTK_PACK_DIRECTION_TTB || pack_dir == GTK_PACK_DIRECTION_BTT) &&
+ priv->image &&
+ gtk_widget_get_visible (priv->image))
+ {
+ gint child_minimum, child_natural;
+
+ gtk_widget_get_preferred_width (priv->image, &child_minimum, &child_natural);
+
+ *minimum = MAX (*minimum, child_minimum);
+ *natural = MAX (*natural, child_natural);
+ }
+}
+
+static void
+image_menu_item_get_preferred_height (GtkWidget *widget,
+ gint *minimum,
+ gint *natural)
+{
+ ImageMenuItem *image_menu_item = IMAGE_MENU_ITEM (widget);
+ ImageMenuItemPrivate *priv = image_menu_item->priv;
+ gint child_height = 0;
+ GtkPackDirection pack_dir;
+ GtkWidget *parent;
+
+ parent = gtk_widget_get_parent (widget);
+
+ if (GTK_IS_MENU_BAR (parent))
+ pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
+ else
+ pack_dir = GTK_PACK_DIRECTION_LTR;
+
+ if (priv->image && gtk_widget_get_visible (priv->image))
+ {
+ GtkRequisition child_requisition;
+
+ gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL);
+
+ child_height = child_requisition.height;
+ }
+
+ GTK_WIDGET_CLASS (image_menu_item_parent_class)->get_preferred_height (widget, minimum, natural);
+
+ if (pack_dir == GTK_PACK_DIRECTION_RTL || pack_dir == GTK_PACK_DIRECTION_LTR)
+ {
+ *minimum = MAX (*minimum, child_height);
+ *natural = MAX (*natural, child_height);
+ }
+}
+
+static void
+image_menu_item_get_preferred_height_for_width (GtkWidget *widget,
+ gint width,
+ gint *minimum,
+ gint *natural)
+{
+ ImageMenuItem *image_menu_item = IMAGE_MENU_ITEM (widget);
+ ImageMenuItemPrivate *priv = image_menu_item->priv;
+ gint child_height = 0;
+ GtkPackDirection pack_dir;
+ GtkWidget *parent;
+
+ parent = gtk_widget_get_parent (widget);
+
+ if (GTK_IS_MENU_BAR (parent))
+ pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
+ else
+ pack_dir = GTK_PACK_DIRECTION_LTR;
+
+ if (priv->image && gtk_widget_get_visible (priv->image))
+ {
+ GtkRequisition child_requisition;
+
+ gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL);
+
+ child_height = child_requisition.height;
+ }
+
+ GTK_WIDGET_CLASS
+ (image_menu_item_parent_class)->get_preferred_height_for_width (widget, width, minimum, natural);
+
+ if (pack_dir == GTK_PACK_DIRECTION_RTL || pack_dir == GTK_PACK_DIRECTION_LTR)
+ {
+ *minimum = MAX (*minimum, child_height);
+ *natural = MAX (*natural, child_height);
+ }
+}
+
+
+static void
+image_menu_item_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation)
+{
+ ImageMenuItem *image_menu_item = IMAGE_MENU_ITEM (widget);
+ ImageMenuItemPrivate *priv = image_menu_item->priv;
+ GtkAllocation widget_allocation;
+ GtkPackDirection pack_dir;
+ GtkWidget *parent;
+
+ parent = gtk_widget_get_parent (widget);
+
+ if (GTK_IS_MENU_BAR (parent))
+ pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
+ else
+ pack_dir = GTK_PACK_DIRECTION_LTR;
+
+ GTK_WIDGET_CLASS (image_menu_item_parent_class)->size_allocate (widget, allocation);
+
+ if (priv->image && gtk_widget_get_visible (priv->image))
+ {
+ gint x, y, offset;
+ GtkStyleContext *context;
+ GtkStateFlags state;
+ GtkBorder padding;
+ GtkRequisition child_requisition;
+ GtkAllocation child_allocation;
+ guint horizontal_padding, toggle_spacing;
+ gint toggle_size;
+
+ toggle_size = image_menu_item->priv->toggle_size;
+ gtk_widget_style_get (widget,
+ "horizontal-padding", &horizontal_padding,
+ "toggle-spacing", &toggle_spacing,
+ NULL);
+
+ /* Man this is lame hardcoding action, but I can't
+ * come up with a solution that's really better.
+ */
+
+ gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL);
+
+ gtk_widget_get_allocation (widget, &widget_allocation);
+
+ context = gtk_widget_get_style_context (widget);
+ state = gtk_widget_get_state_flags (widget);
+ gtk_style_context_get_padding (context, state, &padding);
+ offset = gtk_container_get_border_width (GTK_CONTAINER (image_menu_item));
+
+ if (pack_dir == GTK_PACK_DIRECTION_LTR ||
+ pack_dir == GTK_PACK_DIRECTION_RTL)
+ {
+ if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) ==
+ (pack_dir == GTK_PACK_DIRECTION_LTR))
+ x = offset + horizontal_padding + padding.left +
+ (toggle_size - toggle_spacing - child_requisition.width) / 2;
+ else
+ x = widget_allocation.width - offset - horizontal_padding - padding.right -
+ toggle_size + toggle_spacing +
+ (toggle_size - toggle_spacing - child_requisition.width) / 2;
+
+ y = (widget_allocation.height - child_requisition.height) / 2;
+ }
+ else
+ {
+ if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) ==
+ (pack_dir == GTK_PACK_DIRECTION_TTB))
+ y = offset + horizontal_padding + padding.top +
+ (toggle_size - toggle_spacing - child_requisition.height) / 2;
+ else
+ y = widget_allocation.height - offset - horizontal_padding - padding.bottom -
+ toggle_size + toggle_spacing +
+ (toggle_size - toggle_spacing - child_requisition.height) / 2;
+
+ x = (widget_allocation.width - child_requisition.width) / 2;
+ }
+
+ child_allocation.width = child_requisition.width;
+ child_allocation.height = child_requisition.height;
+ child_allocation.x = widget_allocation.x + MAX (x, 0);
+ child_allocation.y = widget_allocation.y + MAX (y, 0);
+
+ gtk_widget_size_allocate (priv->image, &child_allocation);
+ }
+}
+
+static void
+image_menu_item_forall (GtkContainer *container,
+ gboolean include_internals,
+ GtkCallback callback,
+ gpointer callback_data)
+{
+ ImageMenuItem *image_menu_item = IMAGE_MENU_ITEM (container);
+ ImageMenuItemPrivate *priv = image_menu_item->priv;
+
+ GTK_CONTAINER_CLASS (image_menu_item_parent_class)->forall (container,
+ include_internals,
+ callback,
+ callback_data);
+
+ if (include_internals && priv->image)
+ (* callback) (priv->image, callback_data);
+}
+
+
+static void
+image_menu_item_activatable_interface_init (GtkActivatableIface *iface)
+{
+ parent_activatable_iface = g_type_interface_peek_parent (iface);
+ iface->update = image_menu_item_update;
+ iface->sync_action_properties = image_menu_item_sync_action_properties;
+}
+
+static gboolean
+activatable_update_stock_id (ImageMenuItem *image_menu_item, GtkAction *action)
+{
+ GtkWidget *image;
+ const gchar *stock_id = gtk_action_get_stock_id (action);
+
+ image = image_menu_item_get_image (image_menu_item);
+
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+
+ if (GTK_IS_IMAGE (image) &&
+ stock_id && gtk_icon_factory_lookup_default (stock_id))
+ {
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+ gtk_image_set_from_stock (GTK_IMAGE (image), stock_id, GTK_ICON_SIZE_MENU);
+ G_GNUC_END_IGNORE_DEPRECATIONS;
+ return TRUE;
+ }
+
+ G_GNUC_END_IGNORE_DEPRECATIONS;
+
+ return FALSE;
+}
+
+static gboolean
+activatable_update_gicon (ImageMenuItem *image_menu_item, GtkAction *action)
+{
+ GtkWidget *image;
+ GIcon *icon = gtk_action_get_gicon (action);
+ const gchar *stock_id;
+ gboolean ret = FALSE;
+
+ stock_id = gtk_action_get_stock_id (action);
+
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+
+ image = image_menu_item_get_image (image_menu_item);
+
+ if (icon && GTK_IS_IMAGE (image) &&
+ !(stock_id && gtk_icon_factory_lookup_default (stock_id)))
+ {
+ gtk_image_set_from_gicon (GTK_IMAGE (image), icon, GTK_ICON_SIZE_MENU);
+ ret = TRUE;
+ }
+
+ G_GNUC_END_IGNORE_DEPRECATIONS;
+
+ return ret;
+}
+
+static void
+activatable_update_icon_name (ImageMenuItem *image_menu_item, GtkAction *action)
+{
+ GtkWidget *image;
+ const gchar *icon_name = gtk_action_get_icon_name (action);
+
+ image = image_menu_item_get_image (image_menu_item);
+
+ if (GTK_IS_IMAGE (image) &&
+ (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
+ gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME))
+ {
+ gtk_image_set_from_icon_name (GTK_IMAGE (image), icon_name, GTK_ICON_SIZE_MENU);
+ }
+}
+
+static void
+image_menu_item_update (GtkActivatable *activatable,
+ GtkAction *action,
+ const gchar *property_name)
+{
+ ImageMenuItem *image_menu_item;
+ gboolean use_appearance;
+
+ image_menu_item = IMAGE_MENU_ITEM (activatable);
+
+ parent_activatable_iface->update (activatable, action, property_name);
+
+ use_appearance = gtk_activatable_get_use_action_appearance (activatable);
+ if (!use_appearance)
+ return;
+
+ if (strcmp (property_name, "stock-id") == 0)
+ activatable_update_stock_id (image_menu_item, action);
+ else if (strcmp (property_name, "gicon") == 0)
+ activatable_update_gicon (image_menu_item, action);
+ else if (strcmp (property_name, "icon-name") == 0)
+ activatable_update_icon_name (image_menu_item, action);
+}
+
+static void
+image_menu_item_sync_action_properties (GtkActivatable *activatable,
+ GtkAction *action)
+{
+ ImageMenuItem *image_menu_item;
+ GtkWidget *image;
+ gboolean use_appearance;
+
+ image_menu_item = IMAGE_MENU_ITEM (activatable);
+
+ parent_activatable_iface->sync_action_properties (activatable, action);
+
+ if (!action)
+ return;
+
+ use_appearance = gtk_activatable_get_use_action_appearance (activatable);
+ if (!use_appearance)
+ return;
+
+ image = image_menu_item_get_image (image_menu_item);
+ if (image && !GTK_IS_IMAGE (image))
+ {
+ image_menu_item_set_image (image_menu_item, NULL);
+ image = NULL;
+ }
+
+ if (!image)
+ {
+ image = gtk_image_new ();
+ gtk_widget_show (image);
+ image_menu_item_set_image (IMAGE_MENU_ITEM (activatable),
+ image);
+ }
+
+ if (!activatable_update_stock_id (image_menu_item, action) &&
+ !activatable_update_gicon (image_menu_item, action))
+ activatable_update_icon_name (image_menu_item, action);
+
+}
+
+
+/**
+ * image_menu_item_new:
+ *
+ * Creates a new #ImageMenuItem with an empty label.
+ *
+ * Returns: a new #ImageMenuItem
+ *
+ */
+GtkWidget*
+image_menu_item_new (void)
+{
+ return g_object_new (TYPE_IMAGE_MENU_ITEM, NULL);
+}
+
+/**
+ * image_menu_item_new_with_label:
+ * @label: the text of the menu item.
+ *
+ * Creates a new #ImageMenuItem containing a label.
+ *
+ * Returns: a new #ImageMenuItem.
+ *
+ */
+GtkWidget*
+image_menu_item_new_with_label (const gchar *label)
+{
+ return g_object_new (TYPE_IMAGE_MENU_ITEM,
+ "label", label,
+ NULL);
+}
+
+/**
+ * image_menu_item_new_with_mnemonic:
+ * @label: the text of the menu item, with an underscore in front of the
+ * mnemonic character
+ *
+ * Creates a new #ImageMenuItem containing a label. The label
+ * will be created using gtk_label_new_with_mnemonic(), so underscores
+ * in @label indicate the mnemonic for the menu item.
+ *
+ * Returns: a new #ImageMenuItem
+ *
+ */
+GtkWidget*
+image_menu_item_new_with_mnemonic (const gchar *label)
+{
+ return g_object_new (TYPE_IMAGE_MENU_ITEM,
+ "use-underline", TRUE,
+ "label", label,
+ NULL);
+}
+
+/**
+ * image_menu_item_new_from_stock:
+ * @stock_id: the name of the stock item.
+ * @accel_group: (allow-none): the #GtkAccelGroup to add the menu items
+ * accelerator to, or %NULL.
+ *
+ * Creates a new #ImageMenuItem containing the image and text from a
+ * stock item. Some stock ids have preprocessor macros like #STOCK_OK
+ * and #STOCK_APPLY.
+ *
+ * If you want this menu item to have changeable accelerators, then pass in
+ * %NULL for accel_group. Next call gtk_menu_item_set_accel_path() with an
+ * appropriate path for the menu item, use gtk_stock_lookup() to look up the
+ * standard accelerator for the stock item, and if one is found, call
+ * gtk_accel_map_add_entry() to register it.
+ *
+ * Returns: a new #ImageMenuItem.
+ *
+ */
+GtkWidget*
+image_menu_item_new_from_stock (const gchar *stock_id,
+ GtkAccelGroup *accel_group)
+{
+ return g_object_new (TYPE_IMAGE_MENU_ITEM,
+ "label", stock_id,
+ "use-stock", TRUE,
+ "accel-group", accel_group,
+ NULL);
+}
+
+/**
+ * image_menu_item_set_use_stock:
+ * @image_menu_item: a #ImageMenuItem
+ * @use_stock: %TRUE if the menuitem should use a stock item
+ *
+ * If %TRUE, the label set in the menuitem is used as a
+ * stock id to select the stock item for the item.
+ *
+ * Since: 2.16
+ *
+ */
+void
+image_menu_item_set_use_stock (ImageMenuItem *image_menu_item,
+ gboolean use_stock)
+{
+ ImageMenuItemPrivate *priv;
+
+ g_return_if_fail (IS_IMAGE_MENU_ITEM (image_menu_item));
+
+ priv = image_menu_item->priv;
+
+ if (priv->use_stock != use_stock)
+ {
+ priv->use_stock = use_stock;
+
+ image_menu_item_recalculate (image_menu_item);
+
+ g_object_notify (G_OBJECT (image_menu_item), "use-stock");
+ }
+}
+
+/**
+ * image_menu_item_get_use_stock:
+ * @image_menu_item: a #ImageMenuItem
+ *
+ * Checks whether the label set in the menuitem is used as a
+ * stock id to select the stock item for the item.
+ *
+ * Returns: %TRUE if the label set in the menuitem is used as a
+ * stock id to select the stock item for the item
+ *
+ * Since: 2.16
+ *
+ */
+gboolean
+image_menu_item_get_use_stock (ImageMenuItem *image_menu_item)
+{
+ g_return_val_if_fail (IS_IMAGE_MENU_ITEM (image_menu_item), FALSE);
+
+ return image_menu_item->priv->use_stock;
+}
+
+/**
+ * image_menu_item_set_accel_group:
+ * @image_menu_item: a #ImageMenuItem
+ * @accel_group: the #GtkAccelGroup
+ *
+ * Specifies an @accel_group to add the menu items accelerator to
+ * (this only applies to stock items so a stock item must already
+ * be set, make sure to call image_menu_item_set_use_stock()
+ * and gtk_menu_item_set_label() with a valid stock item first).
+ *
+ * If you want this menu item to have changeable accelerators then
+ * you shouldnt need this (see image_menu_item_new_from_stock()).
+ *
+ * Since: 2.16
+ *
+ */
+void
+image_menu_item_set_accel_group (ImageMenuItem *image_menu_item,
+ GtkAccelGroup *accel_group)
+{
+ ImageMenuItemPrivate *priv;
+ GtkStockItem stock_item;
+
+ /* Silent return for the constructor */
+ if (!accel_group)
+ return;
+
+ g_return_if_fail (IS_IMAGE_MENU_ITEM (image_menu_item));
+ g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
+
+ priv = image_menu_item->priv;
+
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+
+ if (priv->use_stock && priv->label && gtk_stock_lookup (priv->label, &stock_item))
+ if (stock_item.keyval)
+ {
+ gtk_widget_add_accelerator (GTK_WIDGET (image_menu_item),
+ "activate",
+ accel_group,
+ stock_item.keyval,
+ stock_item.modifier,
+ GTK_ACCEL_VISIBLE);
+
+ g_object_notify (G_OBJECT (image_menu_item), "accel-group");
+ }
+
+ G_GNUC_END_IGNORE_DEPRECATIONS;
+
+}
+
+/**
+ * image_menu_item_set_image:
+ * @image_menu_item: a #ImageMenuItem.
+ * @image: (allow-none): a widget to set as the image for the menu item.
+ *
+ * Sets the image of @image_menu_item to the given widget.
+ * Note that it depends on the show-menu-images setting whether
+ * the image will be displayed or not.
+ *
+ */
+void
+image_menu_item_set_image (ImageMenuItem *image_menu_item,
+ GtkWidget *image)
+{
+ ImageMenuItemPrivate *priv;
+
+ g_return_if_fail (IS_IMAGE_MENU_ITEM (image_menu_item));
+
+ priv = image_menu_item->priv;
+
+ if (image == priv->image)
+ return;
+
+ if (priv->image)
+ gtk_container_remove (GTK_CONTAINER (image_menu_item),
+ priv->image);
+
+ priv->image = image;
+
+ if (image == NULL)
+ return;
+
+ gtk_widget_set_parent (image, GTK_WIDGET (image_menu_item));
+ g_object_set (image, "visible", TRUE, "no-show-all", TRUE, NULL);
+
+ g_object_notify (G_OBJECT (image_menu_item), "image");
+}
+
+/**
+ * image_menu_item_get_image:
+ * @image_menu_item: a #ImageMenuItem
+ *
+ * Gets the widget that is currently set as the image of @image_menu_item.
+ * See image_menu_item_set_image().
+ *
+ * Return value: (transfer none): the widget set as image of @image_menu_item
+ *
+ **/
+GtkWidget*
+image_menu_item_get_image (ImageMenuItem *image_menu_item)
+{
+ g_return_val_if_fail (IS_IMAGE_MENU_ITEM (image_menu_item), NULL);
+
+ return image_menu_item->priv->image;
+}
+
+static void
+image_menu_item_remove (GtkContainer *container,
+ GtkWidget *child)
+{
+ ImageMenuItem *image_menu_item = IMAGE_MENU_ITEM (container);
+ ImageMenuItemPrivate *priv = image_menu_item->priv;
+
+ if (child == priv->image)
+ {
+ gboolean widget_was_visible;
+
+ widget_was_visible = gtk_widget_get_visible (child);
+
+ gtk_widget_unparent (child);
+ priv->image = NULL;
+
+ if (widget_was_visible &&
+ gtk_widget_get_visible (GTK_WIDGET (container)))
+ gtk_widget_queue_resize (GTK_WIDGET (container));
+
+ g_object_notify (G_OBJECT (image_menu_item), "image");
+ }
+ else
+ {
+ GTK_CONTAINER_CLASS (image_menu_item_parent_class)->remove (container, child);
+ }
+}
+
+static void
+show_image_change_notify (ImageMenuItem *image_menu_item)
+{
+ ImageMenuItemPrivate *priv = image_menu_item->priv;
+
+ if (priv->image)
+ {
+ gtk_widget_show (priv->image);
+ }
+}
+
+static void
+traverse_container (GtkWidget *widget,
+ gpointer data)
+{
+ if (IS_IMAGE_MENU_ITEM (widget))
+ show_image_change_notify (IMAGE_MENU_ITEM (widget));
+ else if (GTK_IS_CONTAINER (widget))
+ gtk_container_forall (GTK_CONTAINER (widget), traverse_container, NULL);
+}
+
+static void
+image_menu_item_setting_changed (GtkSettings *settings)
+{
+ GList *list, *l;
+
+ list = gtk_window_list_toplevels ();
+
+ for (l = list; l; l = l->next)
+ gtk_container_forall (GTK_CONTAINER (l->data),
+ traverse_container, NULL);
+
+ g_list_free (list);
+}
+
+static void
+image_menu_item_screen_changed (GtkWidget *widget,
+ GdkScreen *previous_screen)
+{
+ GtkSettings *settings;
+ gulong show_image_connection;
+
+ if (!gtk_widget_has_screen (widget))
+ return;
+
+ settings = gtk_widget_get_settings (widget);
+
+ show_image_connection =
+ g_signal_handler_find (settings, G_SIGNAL_MATCH_FUNC, 0, 0,
+ NULL, image_menu_item_setting_changed, NULL);
+
+ if (show_image_connection)
+ return;
+
+ g_signal_connect (settings, "notify::gtk-menu-images",
+ G_CALLBACK (image_menu_item_setting_changed), NULL);
+
+ show_image_change_notify (IMAGE_MENU_ITEM (widget));
+}
diff --git a/src/widgets/image-menu-item.h b/src/widgets/image-menu-item.h
new file mode 100644
index 000000000..61cc48f3a
--- /dev/null
+++ b/src/widgets/image-menu-item.h
@@ -0,0 +1,81 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000.
+ * Forked for , icons in menus are important to us.
+ */
+
+#ifndef __IMAGE_MENU_ITEM_H__
+#define __IMAGE_MENU_ITEM_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GTK_PARAM_READABLE G_PARAM_READABLE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB
+#define GTK_PARAM_WRITABLE G_PARAM_WRITABLE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB
+#define GTK_PARAM_READWRITE G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB
+
+#define TYPE_IMAGE_MENU_ITEM (image_menu_item_get_type ())
+#define IMAGE_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_IMAGE_MENU_ITEM, ImageMenuItem))
+#define IMAGE_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_IMAGE_MENU_ITEM, ImageMenuItemClass))
+#define IS_IMAGE_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_IMAGE_MENU_ITEM))
+#define IS_IMAGE_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_IMAGE_MENU_ITEM))
+#define IMAGE_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_IMAGE_MENU_ITEM, ImageMenuItemClass))
+
+typedef struct _ImageMenuItem ImageMenuItem;
+typedef struct _ImageMenuItemPrivate ImageMenuItemPrivate;
+typedef struct _ImageMenuItemClass ImageMenuItemClass;
+
+struct _ImageMenuItem
+{
+ GtkMenuItem menu_item;
+
+ /*< private >*/
+ ImageMenuItemPrivate *priv;
+};
+
+struct _ImageMenuItemClass
+{
+ GtkMenuItemClass parent_class;
+
+ /* Padding for future expansion */
+ void (*_gtk_reserved1) (void);
+ void (*_gtk_reserved2) (void);
+ void (*_gtk_reserved3) (void);
+ void (*_gtk_reserved4) (void);
+};
+
+GType image_menu_item_get_type (void) G_GNUC_CONST;
+GtkWidget* image_menu_item_new (void);
+GtkWidget* image_menu_item_new_with_label (const gchar *label);
+GtkWidget* image_menu_item_new_with_mnemonic (const gchar *label);
+GtkWidget* image_menu_item_new_from_stock (const gchar *stock_id,
+ GtkAccelGroup *accel_group);
+void image_menu_item_set_image (ImageMenuItem *image_menu_item,
+ GtkWidget *image);
+GtkWidget* image_menu_item_get_image (ImageMenuItem *image_menu_item);
+void image_menu_item_set_use_stock (ImageMenuItem *image_menu_item,
+ gboolean use_stock);
+gboolean image_menu_item_get_use_stock (ImageMenuItem *image_menu_item);
+void image_menu_item_set_accel_group (ImageMenuItem *image_menu_item,
+ GtkAccelGroup *accel_group);
+
+G_END_DECLS
+
+#endif /* __IMAGE_MENU_ITEM_H__ */
diff --git a/src/widgets/ink-action.cpp b/src/widgets/ink-action.cpp
index 5941c31e4..ace99d9aa 100644
--- a/src/widgets/ink-action.cpp
+++ b/src/widgets/ink-action.cpp
@@ -1,12 +1,20 @@
#include "widgets/icon.h"
#include "icon-size.h"
#include <glib/gi18n.h>
-#include <gtk/gtk.h>
+
#include "widgets/ink-action.h"
#include "widgets/button.h"
+#include <gtk/gtk.h>
+
+#if GTK_CHECK_VERSION(3,0,0)
+ // Fork of gtk-imagemenuitem to continue support
+ #include "widgets/image-menu-item.h"
+
+#endif
+
static void ink_action_finalize( GObject* obj );
static void ink_action_get_property( GObject* obj, guint propId, GValue* value, GParamSpec * pspec );
static void ink_action_set_property( GObject* obj, guint propId, const GValue *value, GParamSpec* pspec );
@@ -158,7 +166,12 @@ static GtkWidget* ink_action_create_menu_item( GtkAction* action )
gchar* label = 0;
g_object_get( G_OBJECT(act), "label", &label, NULL );
+#if GTK_CHECK_VERSION(3,0,0)
+ item = image_menu_item_new_with_mnemonic( label );
+#else
item = gtk_image_menu_item_new_with_mnemonic( label );
+#endif
+
GtkWidget* child = sp_icon_new( Inkscape::ICON_SIZE_MENU, act->private_data->iconId );
// TODO this work-around is until SPIcon will live properly inside of a popup menu
if ( SP_IS_ICON(child) ) {
@@ -172,7 +185,12 @@ static GtkWidget* ink_action_create_menu_item( GtkAction* action )
}
}
gtk_widget_show_all( child );
+
+#if GTK_CHECK_VERSION(3,0,0)
+ image_menu_item_set_image( IMAGE_MENU_ITEM(item), child );
+#else
gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM(item), child );
+#endif
g_free( label );
label = 0;
@@ -374,9 +392,16 @@ static GtkWidget* ink_toggle_action_create_tool_item( GtkAction* action )
GtkToolButton* button = GTK_TOOL_BUTTON(item);
if ( act->private_data->iconId ) {
GtkWidget* child = sp_icon_new( act->private_data->iconSize, act->private_data->iconId );
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_hexpand(child, FALSE);
+ gtk_widget_set_vexpand(child, FALSE);
+ gtk_tool_button_set_icon_widget(button, child);
+#else
GtkWidget* align = gtk_alignment_new( 0.5, 0.5, 0.0, 0.0 );
gtk_container_add( GTK_CONTAINER(align), child );
gtk_tool_button_set_icon_widget( button, align );
+#endif
} else {
gchar *label = 0;
g_object_get( G_OBJECT(action), "short_label", &label, NULL );
@@ -405,10 +430,18 @@ static void ink_toggle_action_update_icon( InkToggleAction* action )
GtkToolButton* button = GTK_TOOL_BUTTON(proxies->data);
GtkWidget* child = sp_icon_new( action->private_data->iconSize, action->private_data->iconId );
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_hexpand(child, FALSE);
+ gtk_widget_set_vexpand(child, FALSE);
+ gtk_widget_show_all(child);
+ gtk_tool_button_set_icon_widget(button, child);
+#else
GtkWidget* align = gtk_alignment_new( 0.5, 0.5, 0.0, 0.0 );
gtk_container_add( GTK_CONTAINER(align), child );
gtk_widget_show_all( align );
gtk_tool_button_set_icon_widget( button, align );
+#endif
}
}
@@ -577,9 +610,16 @@ static GtkWidget* ink_radio_action_create_tool_item( GtkAction* action )
GtkToolButton* button = GTK_TOOL_BUTTON(item);
GtkWidget* child = sp_icon_new( act->private_data->iconSize, act->private_data->iconId );
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_hexpand(child, FALSE);
+ gtk_widget_set_vexpand(child, FALSE);
+ gtk_tool_button_set_icon_widget(button, child);
+#else
GtkWidget* align = gtk_alignment_new( 0.5, 0.5, 0.0, 0.0 );
gtk_container_add( GTK_CONTAINER(align), child );
gtk_tool_button_set_icon_widget( button, align );
+#endif
} else {
// For now trigger a warning but don't do anything else
GtkToolButton* button = GTK_TOOL_BUTTON(item);
diff --git a/src/widgets/ink-comboboxentry-action.cpp b/src/widgets/ink-comboboxentry-action.cpp
index 1114d2cdb..ec5e26cf5 100644
--- a/src/widgets/ink-comboboxentry-action.cpp
+++ b/src/widgets/ink-comboboxentry-action.cpp
@@ -371,9 +371,16 @@ GtkWidget* create_tool_item( GtkAction* action )
g_free( combobox_name );
{
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_halign(comboBoxEntry, GTK_ALIGN_START);
+ gtk_widget_set_hexpand(comboBoxEntry, FALSE);
+ gtk_widget_set_vexpand(comboBoxEntry, FALSE);
+ gtk_container_add(GTK_CONTAINER(item), comboBoxEntry);
+#else
GtkWidget *align = gtk_alignment_new(0, 0.5, 0, 0);
gtk_container_add( GTK_CONTAINER(align), comboBoxEntry );
gtk_container_add( GTK_CONTAINER(item), align );
+#endif
}
ink_comboboxentry_action->combobox = GTK_COMBO_BOX (comboBoxEntry);
@@ -956,3 +963,14 @@ gboolean keypress_cb( GtkWidget * /*widget*/, GdkEventKey *event, gpointer data
return wasConsumed;
}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/widgets/ruler.cpp b/src/widgets/ruler.cpp
index 3a5e76277..bcab535f9 100644
--- a/src/widgets/ruler.cpp
+++ b/src/widgets/ruler.cpp
@@ -282,26 +282,6 @@ sp_ruler_init (SPRuler *ruler)
priv->pos_redraw_idle_id = 0;
priv->font_scale = DEFAULT_RULER_FONT_SCALE;
-
-#if GTK_CHECK_VERSION(3,0,0)
- #if GTK_CHECK_VERSION(3,8,0)
- const gchar *str =
- "SPRuler {\n"
- " background-color: @theme_bg_color;\n"
- "}\n";
- #else
- const gchar *str =
- "SPRuler {\n"
- " background-color: @bg_color;\n"
- "}\n";
- #endif
- GtkCssProvider *css = gtk_css_provider_new ();
- gtk_css_provider_load_from_data (css, str, -1, NULL);
- gtk_style_context_add_provider (gtk_widget_get_style_context (GTK_WIDGET (ruler)),
- GTK_STYLE_PROVIDER (css),
- GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
- g_object_unref (css);
-#endif
}
static void
@@ -1425,7 +1405,6 @@ sp_ruler_get_pos_rect (SPRuler *ruler,
gdouble position)
{
GtkWidget *widget = GTK_WIDGET (ruler);
- GtkStyle *style = gtk_widget_get_style (widget);
SPRulerPrivate *priv = SP_RULER_GET_PRIVATE (ruler);
GtkAllocation allocation;
gint width, height;
@@ -1440,8 +1419,19 @@ sp_ruler_get_pos_rect (SPRuler *ruler,
gtk_widget_get_allocation (widget, &allocation);
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkStyleContext *context = gtk_widget_get_style_context (widget);
+ GtkBorder padding;
+
+ gtk_style_context_get_border(context, static_cast<GtkStateFlags>(0), &padding);
+
+ xthickness = padding.left + padding.right;
+ ythickness = padding.top + padding.bottom;
+#else
+ GtkStyle *style = gtk_widget_get_style (widget);
xthickness = style->xthickness;
ythickness = style->ythickness;
+#endif
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
diff --git a/src/widgets/shrink-wrap-button.cpp b/src/widgets/shrink-wrap-button.cpp
deleted file mode 100644
index 941a0466c..000000000
--- a/src/widgets/shrink-wrap-button.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Inkscape::Widgets::shrink_wrap_button - shrink a button to minimum size
- *
- * Authors:
- * MenTaLguY <mental@rydia.net>
- *
- * Copyright (C) 2004 MenTaLguY
- *
- * Released under GNU GPL, read the file 'COPYING' for more information
- */
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <gtkmm/button.h>
-#include <gtk/gtk.h>
-
-#include "shrink-wrap-button.h"
-
-namespace Inkscape {
-namespace Widgets {
-
-void shrink_wrap_button(Gtk::Button &button) {
- button.set_border_width(0);
- button.set_can_focus(false);
- button.set_can_default(false);
-
- Gtk::Widget* child = button.get_child();
- Gtk::Requisition req_min;
-
- if (child) {
-#if WITH_GTKMM_3_0
- Gtk::Requisition req_nat;
- child->get_preferred_size(req_min, req_nat);
-#else
- req_min = child->size_request();
-#endif
- } else {
- req_min.width = 0;
- req_min.height = 0;
- }
-
- // TODO: Use Gtk::StyleContext instead
- GtkStyle* style = gtk_widget_get_style(GTK_WIDGET(button.gobj()));
-
- req_min.width += 2 + 2 * std::max(2, style->xthickness);
- req_min.height += 2 + 2 * std::max(2, style->ythickness);
-
- button.set_size_request(req_min.width, req_min.height);
-}
-
-}
-}
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/widgets/shrink-wrap-button.h b/src/widgets/shrink-wrap-button.h
deleted file mode 100644
index ca9153aea..000000000
--- a/src/widgets/shrink-wrap-button.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Inkscape::Widgets::shrink_wrap_button - shrink a button to minimum size
- *
- * Authors:
- * MenTaLguY <mental@rydia.net>
- *
- * Copyright (C) 2004 MenTaLguY
- *
- * Released under GNU GPL, read the file 'COPYING' for more information
- */
-
-#ifndef SEEN_INKSCAPE_WIDGETS_SHRINK_WRAP_BUTTON_H
-#define SEEN_INKSCAPE_WIDGETS_SHRINK_WRAP_BUTTON_H
-
-namespace Gtk { class Button; }
-
-namespace Inkscape {
-namespace Widgets {
-
-void shrink_wrap_button(Gtk::Button &button);
-
-}
-}
-
-#endif
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/widgets/spw-utilities.cpp b/src/widgets/spw-utilities.cpp
index 7030753a5..5500e1068 100644
--- a/src/widgets/spw-utilities.cpp
+++ b/src/widgets/spw-utilities.cpp
@@ -84,12 +84,23 @@ spw_label_old(GtkWidget *table, const gchar *label_text, int col, int row)
label_widget = gtk_label_new (label_text);
g_assert(label_widget != NULL);
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_halign(label_widget, GTK_ALIGN_END);
+#else
gtk_misc_set_alignment (GTK_MISC (label_widget), 1.0, 0.5);
+#endif
+
gtk_widget_show (label_widget);
#if GTK_CHECK_VERSION(3,0,0)
+#if GTK_CHECK_VERSION(3,12,0)
+ gtk_widget_set_margin_start(label_widget, 4);
+ gtk_widget_set_margin_end(label_widget, 4);
+#else
gtk_widget_set_margin_left(label_widget, 4);
gtk_widget_set_margin_right(label_widget, 4);
+#endif
gtk_widget_set_hexpand(label_widget, TRUE);
gtk_widget_set_halign(label_widget, GTK_ALIGN_FILL);
gtk_widget_set_valign(label_widget, GTK_ALIGN_CENTER);
@@ -166,7 +177,13 @@ spw_checkbutton(GtkWidget * dialog, GtkWidget * table,
g_assert(table != NULL);
GtkWidget *l = gtk_label_new (label);
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_halign(l, GTK_ALIGN_END);
+#else
gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
+#endif
+
gtk_widget_show (l);
#if GTK_CHECK_VERSION(3,0,0)
@@ -238,12 +255,26 @@ sp_set_font_size_recursive (GtkWidget *w, gpointer font)
{
guint size = GPOINTER_TO_UINT (font);
- PangoFontDescription* pan = pango_font_description_new ();
- pango_font_description_set_size (pan, size);
-
#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_font (w, pan);
+ GtkCssProvider *css_provider = gtk_css_provider_new();
+
+ const double pt_size = size / static_cast<double>(PANGO_SCALE);
+ std::ostringstream css_data;
+ css_data << "GtkWidget {\n"
+ << " font-size: " << pt_size << "pt;\n"
+ << "}\n";
+
+ gtk_css_provider_load_from_data(css_provider,
+ css_data.str().c_str(),
+ -1, NULL);
+
+ GtkStyleContext *style_context = gtk_widget_get_style_context(w);
+ gtk_style_context_add_provider(style_context,
+ GTK_STYLE_PROVIDER(css_provider),
+ GTK_STYLE_PROVIDER_PRIORITY_USER);
#else
+ PangoFontDescription* pan = pango_font_description_new ();
+ pango_font_description_set_size (pan, size);
gtk_widget_modify_font (w, pan);
#endif
@@ -251,7 +282,11 @@ sp_set_font_size_recursive (GtkWidget *w, gpointer font)
gtk_container_foreach (GTK_CONTAINER(w), (GtkCallback) sp_set_font_size_recursive, font);
}
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(css_provider);
+#else
pango_font_description_free (pan);
+#endif
}
void
diff --git a/src/widgets/text-toolbar.cpp b/src/widgets/text-toolbar.cpp
index e71c911bd..23acb74af 100644
--- a/src/widgets/text-toolbar.cpp
+++ b/src/widgets/text-toolbar.cpp
@@ -508,6 +508,10 @@ static void sp_text_align_mode_changed( EgeSelectOneAction *act, GObject *tbl )
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
}
+static bool is_relative( Unit const *unit ) {
+ return (unit->abbr == "" || unit->abbr == "em" || unit->abbr == "ex" || unit->abbr == "%");
+}
+
static void sp_text_lineheight_value_changed( GtkAdjustment *adj, GObject *tbl )
{
// quit if run by the _changed callbacks
@@ -524,21 +528,22 @@ static void sp_text_lineheight_value_changed( GtkAdjustment *adj, GObject *tbl )
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- // This nonsense is to get SP_CSS_UNIT_xx value corresponding to unit so
- // we can save it (allows us to adjust line height value when unit changes).
- SPILength temp_length;
- Inkscape::CSSOStringStream temp_stream;
- temp_stream << 1 << unit->abbr;
- temp_length.read(temp_stream.str().c_str());
- prefs->setInt("/tools/text/lineheight/display_unit", temp_length.unit);
- g_object_set_data( tbl, "lineheight_unit", GINT_TO_POINTER(temp_length.unit));
-
+ // Only save if not relative unit
+ if ( !is_relative(unit) ) {
+ // This nonsense is to get SP_CSS_UNIT_xx value corresponding to unit so
+ // we can save it (allows us to adjust line height value when unit changes).
+ SPILength temp_length;
+ Inkscape::CSSOStringStream temp_stream;
+ temp_stream << 1 << unit->abbr;
+ temp_length.read(temp_stream.str().c_str());
+ prefs->setInt("/tools/text/lineheight/display_unit", temp_length.unit);
+ g_object_set_data( tbl, "lineheight_unit", GINT_TO_POINTER(temp_length.unit));
+ }
// Set css line height.
SPCSSAttr *css = sp_repr_css_attr_new ();
Inkscape::CSSOStringStream osfs;
- // We should handle unitless values as well as 'em' and 'ex'
- if ((unit->abbr) == "em" || unit->abbr == "ex" || unit->abbr == "%") {
+ if ( is_relative(unit) ) {
osfs << gtk_adjustment_get_value(adj) << unit->abbr;
} else {
// Inside SVG file, always use "px" for absolute units.
@@ -601,13 +606,16 @@ static void sp_text_lineheight_unit_changed( gpointer /* */, GObject *tbl )
g_return_if_fail(unit != NULL);
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- // This nonsense is to get SP_CSS_UNIT_xx value corresponding to unit.
- SPILength temp_length;
- Inkscape::CSSOStringStream temp_stream;
- temp_stream << 1 << unit->abbr;
- temp_length.read(temp_stream.str().c_str());
- prefs->setInt("/tools/text/lineheight/display_unit", temp_length.unit);
- g_object_set_data( tbl, "lineheight_unit", GINT_TO_POINTER(temp_length.unit));
+ // Only save if not relative unit
+ if ( !is_relative(unit) ) {
+ // This nonsense is to get SP_CSS_UNIT_xx value corresponding to unit.
+ SPILength temp_length;
+ Inkscape::CSSOStringStream temp_stream;
+ temp_stream << 1 << unit->abbr;
+ temp_length.read(temp_stream.str().c_str());
+ prefs->setInt("/tools/text/lineheight/display_unit", temp_length.unit);
+ g_object_set_data( tbl, "lineheight_unit", GINT_TO_POINTER(temp_length.unit));
+ }
// Read current line height value
EgeAdjustmentAction *line_height_act =
@@ -620,19 +628,19 @@ static void sp_text_lineheight_unit_changed( gpointer /* */, GObject *tbl )
std::vector<SPItem*> itemlist=selection->itemList();
// Convert between units
- if ((unit->abbr) == "em" && old_unit == SP_CSS_UNIT_EX) {
+ if ((unit->abbr == "" || unit->abbr == "em") && old_unit == SP_CSS_UNIT_EX) {
line_height *= 0.5;
- } else if ((unit->abbr) == "ex" && old_unit == SP_CSS_UNIT_EM) {
+ } else if ((unit->abbr) == "ex" && (old_unit == SP_CSS_UNIT_EM || old_unit == SP_CSS_UNIT_NONE) ) {
line_height *= 2.0;
- } else if ((unit->abbr) == "em" && old_unit == SP_CSS_UNIT_PERCENT) {
+ } else if ((unit->abbr == "" || unit->abbr == "em") && old_unit == SP_CSS_UNIT_PERCENT) {
line_height /= 100.0;
- } else if ((unit->abbr) == "%" && old_unit == SP_CSS_UNIT_EM) {
+ } else if ((unit->abbr) == "%" && (old_unit == SP_CSS_UNIT_EM || old_unit == SP_CSS_UNIT_NONE) ) {
line_height *= 100;
} else if ((unit->abbr) == "ex" && old_unit == SP_CSS_UNIT_PERCENT) {
line_height /= 50.0;
} else if ((unit->abbr) == "%" && old_unit == SP_CSS_UNIT_EX) {
line_height *= 50;
- } else if ((unit->abbr) == "%" || (unit->abbr) == "em" || (unit->abbr) == "ex") {
+ } else if (is_relative(unit)) {
// Convert absolute to relative... for the moment use average font-size
double font_size = 0;
int count = 0;
@@ -648,7 +656,10 @@ static void sp_text_lineheight_unit_changed( gpointer /* */, GObject *tbl )
} else {
font_size = 20;
}
+
+ if (old_unit == SP_CSS_UNIT_NONE) old_unit = SP_CSS_UNIT_EM;
line_height = Quantity::convert(line_height, sp_style_get_css_unit_string(old_unit), "px");
+
if (font_size > 0) {
line_height /= font_size;
}
@@ -657,7 +668,8 @@ static void sp_text_lineheight_unit_changed( gpointer /* */, GObject *tbl )
} else if ((unit->abbr) == "ex") {
line_height *= 2;
}
- } else if (old_unit==SP_CSS_UNIT_PERCENT || old_unit==SP_CSS_UNIT_EM || old_unit==SP_CSS_UNIT_EX) {
+ } else if (old_unit==SP_CSS_UNIT_NONE || old_unit==SP_CSS_UNIT_PERCENT ||
+ old_unit==SP_CSS_UNIT_EM || old_unit==SP_CSS_UNIT_EX) {
// Convert relative to absolute... for the moment use average font-size
double font_size = 0;
int count = 0;
@@ -689,8 +701,7 @@ static void sp_text_lineheight_unit_changed( gpointer /* */, GObject *tbl )
// Set css line height.
SPCSSAttr *css = sp_repr_css_attr_new ();
Inkscape::CSSOStringStream osfs;
- // We should handle unitless values as well as 'em' and 'ex'
- if ((unit->abbr) == "em" || unit->abbr == "ex" || unit->abbr == "%") {
+ if ( is_relative(unit) ) {
osfs << line_height << unit->abbr;
} else {
osfs << Quantity::convert(line_height, unit, "px") << "px";
@@ -1264,8 +1275,6 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
switch (line_height_unit) {
case SP_CSS_UNIT_NONE:
- // tracker can't show no unit... use 'em'
- line_height_unit = SP_CSS_UNIT_EM;
case SP_CSS_UNIT_EM:
case SP_CSS_UNIT_EX:
break;
@@ -1276,7 +1285,9 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
// If unit is set to 'px', use the preferred display unit (if absolute).
line_height_unit =
prefs->getInt("/tools/text/lineheight/display_unit", SP_CSS_UNIT_PT);
- if (line_height_unit != SP_CSS_UNIT_EM &&
+ // But not if prefered unit is relative
+ if (line_height_unit != SP_CSS_UNIT_NONE &&
+ line_height_unit != SP_CSS_UNIT_EM &&
line_height_unit != SP_CSS_UNIT_EX &&
line_height_unit != SP_CSS_UNIT_PERCENT) {
height =
@@ -1299,7 +1310,13 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
gtk_adjustment_set_value( lineHeightAdjustment, height );
UnitTracker* tracker = reinterpret_cast<UnitTracker*>( g_object_get_data( tbl, "tracker" ) );
- tracker->setActiveUnitByAbbr(sp_style_get_css_unit_string(line_height_unit));
+ if( line_height_unit == SP_CSS_UNIT_NONE ) {
+ // Function 'sp_style_get_css_unit_string' returns 'px' for unit none.
+ // We need to avoid this.
+ tracker->setActiveUnitByAbbr("");
+ } else {
+ tracker->setActiveUnitByAbbr(sp_style_get_css_unit_string(line_height_unit));
+ }
// Save unit so we can do convertions between new/old units.
g_object_set_data( tbl, "lineheight_unit", GINT_TO_POINTER(line_height_unit));
@@ -1545,6 +1562,23 @@ void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
g_object_set_data( holder, "TextFontFamilyAction", act );
// Change style of drop-down from menu to list
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkCssProvider *css_provider = gtk_css_provider_new();
+ gtk_css_provider_load_from_data(css_provider,
+ "#TextFontFamilyAction_combobox {\n"
+ " -GtkComboBox-appears-as-list: true;\n"
+ "}\n"
+ "combobox window.popup scrolledwindow treeview separator {\n"
+ " -GtkWidget-wide-separators: true;\n"
+ " -GtkWidget-separator-height: 6;\n"
+ "}\n",
+ -1, NULL);
+
+ GdkScreen *screen = gdk_screen_get_default();
+ gtk_style_context_add_provider_for_screen(screen,
+ GTK_STYLE_PROVIDER(css_provider),
+ GTK_STYLE_PROVIDER_PRIORITY_USER);
+#else
gtk_rc_parse_string (
"style \"dropdown-as-list-style\"\n"
"{\n"
@@ -1557,6 +1591,7 @@ void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
" GtkWidget::separator-height = 6\n"
"}\n"
"widget \"*gtk-combobox-popup-window.GtkScrolledWindow.GtkTreeView\" style \"fontfamily-separator-style\"");
+#endif
}
/* Font size */
@@ -1797,10 +1832,10 @@ void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
/* Line height unit tracker */
UnitTracker* tracker = new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR);
+ tracker->prependUnit(unit_table.getUnit("")); // No unit
tracker->addUnit(unit_table.getUnit("%"));
tracker->addUnit(unit_table.getUnit("em"));
tracker->addUnit(unit_table.getUnit("ex"));
- // tracker->addUnit(unit_table.getUnit("None"));
tracker->setActiveUnit(unit_table.getUnit("%"));
g_object_set_data( holder, "tracker", tracker );
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index 3389f82f9..0697ff0fb 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -127,7 +127,8 @@ Inkscape::IconSize ToolboxFactory::prefToSize( Glib::ustring const &path, int ba
static Inkscape::IconSize sizeChoices[] = {
Inkscape::ICON_SIZE_LARGE_TOOLBAR,
Inkscape::ICON_SIZE_SMALL_TOOLBAR,
- Inkscape::ICON_SIZE_MENU
+ Inkscape::ICON_SIZE_MENU,
+ Inkscape::ICON_SIZE_DIALOG
};
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
int index = prefs->getIntLimited( path, base, 0, G_N_ELEMENTS(sizeChoices) );