2003-06-29 23:34:20 +00:00
/* gtktoolbutton.c
*
2003-12-29 10:55:53 +00:00
* Copyright ( C ) 2002 Anders Carlsson < andersca @ gnome . org >
2003-06-29 23:34:20 +00:00
* Copyright ( C ) 2002 James Henstridge < james @ daa . com . au >
* Copyright ( C ) 2003 Soeren Sandmann < sandmann @ daimi . au . dk >
*
* 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
2012-02-27 13:01:10 +00:00
* License along with this library . If not , see < http : //www.gnu.org/licenses/>.
2003-06-29 23:34:20 +00:00
*/
2008-06-22 14:28:52 +00:00
# include "config.h"
2003-06-29 23:34:20 +00:00
# include "gtktoolbutton.h"
# include "gtkbutton.h"
# include "gtkimage.h"
# include "gtklabel.h"
2011-08-28 05:54:55 +00:00
# include "gtkbox.h"
2003-06-29 23:34:20 +00:00
# include "gtkintl.h"
2014-04-05 06:04:12 +00:00
# include "gtktoolbarprivate.h"
2016-10-05 16:35:06 +00:00
# include "gtkicontheme.h"
2012-01-06 03:22:06 +00:00
# include "gtkactionable.h"
2005-03-22 02:14:55 +00:00
# include "gtkprivate.h"
2003-06-29 23:34:20 +00:00
# include <string.h>
2011-04-14 23:04:49 +00:00
/**
* SECTION : gtktoolbutton
* @ Short_description : A GtkToolItem subclass that displays buttons
* @ Title : GtkToolButton
* @ See_also : # GtkToolbar , # GtkMenuToolButton , # GtkToggleToolButton ,
* # GtkRadioToolButton , # GtkSeparatorToolItem
*
2014-02-09 22:24:06 +00:00
* # GtkToolButtons are # GtkToolItems containing buttons .
2011-04-14 23:04:49 +00:00
*
2013-06-25 03:47:52 +00:00
* Use gtk_tool_button_new ( ) to create a new # GtkToolButton .
2011-04-14 23:04:49 +00:00
*
* The label of a # GtkToolButton is determined by the properties
2016-10-16 11:12:16 +00:00
* # GtkToolButton : label - widget and # GtkToolButton : label .
* If # GtkToolButton : label - widget is
2011-04-14 23:04:49 +00:00
* non - % NULL , then that widget is used as the label . Otherwise , if
* # GtkToolButton : label is non - % NULL , that string is used as the label .
*
2016-10-16 11:12:16 +00:00
* The icon of a # GtkToolButton is determined by the
* # GtkToolButton : icon - widget property . If
2011-04-14 23:04:49 +00:00
* # GtkToolButton : icon - widget is non - % NULL , then
2016-10-16 11:12:16 +00:00
* that widget is used as the icon . Otherwise it does not have an icon .
2015-11-01 00:52:09 +00:00
*
* # CSS nodes
*
* GtkToolButton has a single CSS node with name toolbutton .
2011-04-14 23:04:49 +00:00
*/
2003-06-29 23:34:20 +00:00
# define MENU_ID "gtk-tool-button-menu-id"
enum {
CLICKED ,
LAST_SIGNAL
} ;
enum {
PROP_0 ,
PROP_LABEL ,
PROP_USE_UNDERLINE ,
PROP_LABEL_WIDGET ,
2005-05-18 05:38:50 +00:00
PROP_ICON_NAME ,
2012-01-06 03:22:06 +00:00
PROP_ICON_WIDGET ,
PROP_ACTION_NAME ,
PROP_ACTION_TARGET
2003-06-29 23:34:20 +00:00
} ;
2015-09-14 15:15:32 +00:00
static void gtk_tool_button_init ( GtkToolButton * button ,
GtkToolButtonClass * klass ) ;
static void gtk_tool_button_class_init ( GtkToolButtonClass * klass ) ;
2003-06-29 23:34:20 +00:00
static void gtk_tool_button_set_property ( GObject * object ,
guint prop_id ,
const GValue * value ,
GParamSpec * pspec ) ;
static void gtk_tool_button_get_property ( GObject * object ,
guint prop_id ,
GValue * value ,
GParamSpec * pspec ) ;
2003-08-04 21:13:55 +00:00
static void gtk_tool_button_property_notify ( GObject * object ,
GParamSpec * pspec ) ;
2003-06-29 23:34:20 +00:00
static void gtk_tool_button_finalize ( GObject * object ) ;
static void gtk_tool_button_toolbar_reconfigured ( GtkToolItem * tool_item ) ;
static gboolean gtk_tool_button_create_menu_proxy ( GtkToolItem * item ) ;
static void button_clicked ( GtkWidget * widget ,
GtkToolButton * button ) ;
static void gtk_tool_button_construct_contents ( GtkToolItem * tool_item ) ;
2012-01-06 03:22:06 +00:00
static void gtk_tool_button_actionable_iface_init ( GtkActionableInterface * iface ) ;
2009-01-23 15:15:28 +00:00
2003-09-30 22:48:10 +00:00
2003-07-08 18:20:45 +00:00
struct _GtkToolButtonPrivate
{
GtkWidget * button ;
2005-05-18 05:38:50 +00:00
gchar * icon_name ;
2003-07-08 18:20:45 +00:00
gchar * label_text ;
GtkWidget * label_widget ;
GtkWidget * icon_widget ;
2009-07-13 17:13:59 +00:00
GtkSizeGroup * text_size_group ;
2003-07-08 18:20:45 +00:00
guint use_underline : 1 ;
2007-01-28 03:16:30 +00:00
guint contents_invalid : 1 ;
2003-07-08 18:20:45 +00:00
} ;
2015-09-14 15:15:32 +00:00
static GObjectClass * parent_class = NULL ;
2009-01-23 15:15:28 +00:00
static guint toolbutton_signals [ LAST_SIGNAL ] = { 0 } ;
2015-09-14 15:15:32 +00:00
GType
gtk_tool_button_get_type ( void )
{
static GType g_define_type_id = 0 ;
if ( ! g_define_type_id )
{
const GInterfaceInfo actionable_info =
{
( GInterfaceInitFunc ) gtk_tool_button_actionable_iface_init ,
( GInterfaceFinalizeFunc ) NULL ,
NULL
} ;
g_define_type_id = g_type_register_static_simple ( GTK_TYPE_TOOL_ITEM ,
I_ ( " GtkToolButton " ) ,
sizeof ( GtkToolButtonClass ) ,
( GClassInitFunc ) gtk_tool_button_class_init ,
sizeof ( GtkToolButton ) ,
( GInstanceInitFunc ) gtk_tool_button_init ,
0 ) ;
g_type_add_interface_static ( g_define_type_id ,
GTK_TYPE_ACTIONABLE , & actionable_info ) ;
}
return g_define_type_id ;
}
2003-06-29 23:34:20 +00:00
static void
gtk_tool_button_class_init ( GtkToolButtonClass * klass )
{
GObjectClass * object_class ;
2006-06-01 13:42:14 +00:00
GtkWidgetClass * widget_class ;
2003-06-29 23:34:20 +00:00
GtkToolItemClass * tool_item_class ;
2015-09-14 15:15:32 +00:00
parent_class = g_type_class_peek_parent ( klass ) ;
2003-06-29 23:34:20 +00:00
object_class = ( GObjectClass * ) klass ;
2006-06-01 13:42:14 +00:00
widget_class = ( GtkWidgetClass * ) klass ;
2003-06-29 23:34:20 +00:00
tool_item_class = ( GtkToolItemClass * ) klass ;
2015-09-14 15:15:32 +00:00
2003-06-29 23:34:20 +00:00
object_class - > set_property = gtk_tool_button_set_property ;
object_class - > get_property = gtk_tool_button_get_property ;
2003-08-04 21:13:55 +00:00
object_class - > notify = gtk_tool_button_property_notify ;
2003-06-29 23:34:20 +00:00
object_class - > finalize = gtk_tool_button_finalize ;
tool_item_class - > create_menu_proxy = gtk_tool_button_create_menu_proxy ;
tool_item_class - > toolbar_reconfigured = gtk_tool_button_toolbar_reconfigured ;
2015-09-14 15:15:32 +00:00
2003-06-29 23:34:20 +00:00
klass - > button_type = GTK_TYPE_BUTTON ;
2003-07-03 01:02:04 +00:00
/* Properties are interpreted like this:
*
* - if the tool button has an icon_widget , then that widget
* will be used as the icon . Otherwise , if the tool button
* has a stock id , the corresponding stock icon will be
2005-05-18 05:38:50 +00:00
* used . Otherwise , if the tool button has an icon name ,
* the corresponding icon from the theme will be used .
* Otherwise , the tool button will not have an icon .
2003-07-03 01:02:04 +00:00
*
* - if the tool button has a label_widget then that widget
* will be used as the label . Otherwise , if the tool button
* has a label text , that text will be used as label . Otherwise ,
* if the toolbutton has a stock id , the corresponding text
2005-05-18 05:38:50 +00:00
* will be used as label . Otherwise , if the tool button has
* an icon name , the corresponding icon name from the theme will
* be used . Otherwise , the toolbutton will have an empty label .
2003-07-03 01:02:04 +00:00
*
* - The use_underline property only has an effect when the label
* on the toolbutton comes from the label property ( ie . not from
* label_widget or from stock_id ) .
*
* In that case , if use_underline is set ,
*
* - underscores are removed from the label text before
* the label is shown on the toolbutton unless the
* underscore is followed by another underscore
*
* - an underscore indicates that the next character when
2003-08-04 21:13:55 +00:00
* used in the overflow menu should be used as a
* mnemonic .
2003-07-03 01:02:04 +00:00
*
* In short : use_underline = TRUE means that the label text has
2003-08-04 21:13:55 +00:00
* the form " _Open " and the toolbar should take appropriate
* action .
2003-07-03 01:02:04 +00:00
*/
2003-06-29 23:34:20 +00:00
g_object_class_install_property ( object_class ,
PROP_LABEL ,
g_param_spec_string ( " label " ,
2004-01-16 23:10:05 +00:00
P_ ( " Label " ) ,
P_ ( " Text to show in the item. " ) ,
2003-06-29 23:34:20 +00:00
NULL ,
2005-03-22 02:14:55 +00:00
GTK_PARAM_READWRITE ) ) ;
2003-06-29 23:34:20 +00:00
g_object_class_install_property ( object_class ,
PROP_USE_UNDERLINE ,
2005-03-09 06:15:13 +00:00
g_param_spec_boolean ( " use-underline " ,
2004-01-16 23:10:05 +00:00
P_ ( " Use underline " ) ,
P_ ( " If set, an underline in the label property indicates that the next character should be used for the mnemonic accelerator key in the overflow menu " ) ,
2003-06-29 23:34:20 +00:00
FALSE ,
2014-06-09 13:44:09 +00:00
GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY ) ) ;
2003-06-29 23:34:20 +00:00
g_object_class_install_property ( object_class ,
PROP_LABEL_WIDGET ,
2005-03-09 06:15:13 +00:00
g_param_spec_object ( " label-widget " ,
2004-01-16 23:10:05 +00:00
P_ ( " Label widget " ) ,
P_ ( " Widget to use as the item label " ) ,
2003-06-29 23:34:20 +00:00
GTK_TYPE_WIDGET ,
2005-03-22 02:14:55 +00:00
GTK_PARAM_READWRITE ) ) ;
2005-05-18 05:38:50 +00:00
/**
* GtkToolButton : icon - name :
2016-10-03 08:33:17 +00:00
*
2005-05-18 05:38:50 +00:00
* The name of the themed icon displayed on the item .
2015-07-22 19:43:51 +00:00
* This property only has an effect if not overridden by
2016-10-03 08:33:17 +00:00
* # GtkToolButton : label - widget or # GtkToolButton : icon - widget
2005-05-18 05:38:50 +00:00
*
2016-10-03 08:33:17 +00:00
* Since : 2.8
2005-05-18 05:38:50 +00:00
*/
g_object_class_install_property ( object_class ,
PROP_ICON_NAME ,
g_param_spec_string ( " icon-name " ,
P_ ( " Icon name " ) ,
P_ ( " The name of the themed icon displayed on the item " ) ,
NULL ,
GTK_PARAM_READWRITE ) ) ;
2003-06-29 23:34:20 +00:00
g_object_class_install_property ( object_class ,
PROP_ICON_WIDGET ,
2005-03-09 06:15:13 +00:00
g_param_spec_object ( " icon-widget " ,
2004-01-16 23:10:05 +00:00
P_ ( " Icon widget " ) ,
P_ ( " Icon widget to display in the item " ) ,
2003-06-29 23:34:20 +00:00
GTK_TYPE_WIDGET ,
2005-03-22 02:14:55 +00:00
GTK_PARAM_READWRITE ) ) ;
2003-06-29 23:34:20 +00:00
2012-01-06 03:22:06 +00:00
g_object_class_override_property ( object_class , PROP_ACTION_NAME , " action-name " ) ;
g_object_class_override_property ( object_class , PROP_ACTION_TARGET , " action-target " ) ;
2003-08-04 21:13:55 +00:00
/**
* GtkToolButton : : clicked :
* @ toolbutton : the object that emitted the signal
*
* This signal is emitted when the tool button is clicked with the mouse
* or activated with the keyboard .
* */
2003-06-29 23:34:20 +00:00
toolbutton_signals [ CLICKED ] =
2005-09-01 05:11:46 +00:00
g_signal_new ( I_ ( " clicked " ) ,
2003-06-29 23:34:20 +00:00
G_OBJECT_CLASS_TYPE ( klass ) ,
2006-01-06 15:21:32 +00:00
G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION ,
2003-06-29 23:34:20 +00:00
G_STRUCT_OFFSET ( GtkToolButtonClass , clicked ) ,
NULL , NULL ,
g_cclosure_marshal_VOID__VOID ,
G_TYPE_NONE , 0 ) ;
2013-07-09 23:18:08 +00:00
g_type_class_add_private ( object_class , sizeof ( GtkToolButtonPrivate ) ) ;
2015-11-01 00:52:09 +00:00
gtk_widget_class_set_css_name ( widget_class , " toolbutton " ) ;
2003-06-29 23:34:20 +00:00
}
static void
2015-09-14 15:15:32 +00:00
gtk_tool_button_init ( GtkToolButton * button ,
GtkToolButtonClass * klass )
2003-06-29 23:34:20 +00:00
{
GtkToolItem * toolitem = GTK_TOOL_ITEM ( button ) ;
2010-07-13 23:58:29 +00:00
2013-07-09 23:18:08 +00:00
button - > priv = G_TYPE_INSTANCE_GET_PRIVATE ( button ,
GTK_TYPE_TOOL_BUTTON ,
GtkToolButtonPrivate ) ;
2003-07-08 10:58:23 +00:00
2007-01-28 03:16:30 +00:00
button - > priv - > contents_invalid = TRUE ;
2003-07-08 10:58:23 +00:00
gtk_tool_item_set_homogeneous ( toolitem , TRUE ) ;
2003-06-29 23:34:20 +00:00
/* create button */
2015-09-14 15:15:32 +00:00
button - > priv - > button = g_object_new ( klass - > button_type , NULL ) ;
2015-10-23 20:13:30 +00:00
gtk_widget_set_focus_on_click ( GTK_WIDGET ( button - > priv - > button ) , FALSE ) ;
2003-07-08 18:20:45 +00:00
g_signal_connect_object ( button - > priv - > button , " clicked " ,
2003-06-29 23:34:20 +00:00
G_CALLBACK ( button_clicked ) , button , 0 ) ;
2003-07-08 18:20:45 +00:00
gtk_container_add ( GTK_CONTAINER ( button ) , button - > priv - > button ) ;
gtk_widget_show ( button - > priv - > button ) ;
2003-06-29 23:34:20 +00:00
}
static void
gtk_tool_button_construct_contents ( GtkToolItem * tool_item )
{
GtkToolButton * button = GTK_TOOL_BUTTON ( tool_item ) ;
2010-05-24 20:31:36 +00:00
GtkWidget * child ;
2003-06-29 23:34:20 +00:00
GtkWidget * label = NULL ;
GtkWidget * icon = NULL ;
GtkToolbarStyle style ;
gboolean need_label = FALSE ;
gboolean need_icon = FALSE ;
GtkIconSize icon_size ;
GtkWidget * box = NULL ;
2009-07-13 17:13:59 +00:00
GtkOrientation text_orientation = GTK_ORIENTATION_HORIZONTAL ;
GtkSizeGroup * size_group = NULL ;
2010-08-11 20:51:57 +00:00
GtkWidget * parent ;
2006-06-01 13:42:14 +00:00
2007-01-28 03:16:30 +00:00
button - > priv - > contents_invalid = FALSE ;
2010-08-11 20:51:57 +00:00
if ( button - > priv - > icon_widget )
2003-06-29 23:34:20 +00:00
{
2010-08-11 20:51:57 +00:00
parent = gtk_widget_get_parent ( button - > priv - > icon_widget ) ;
if ( parent )
{
gtk_container_remove ( GTK_CONTAINER ( parent ) ,
button - > priv - > icon_widget ) ;
}
2003-06-29 23:34:20 +00:00
}
2010-08-11 20:51:57 +00:00
if ( button - > priv - > label_widget )
2003-06-29 23:34:20 +00:00
{
2010-08-11 20:51:57 +00:00
parent = gtk_widget_get_parent ( button - > priv - > label_widget ) ;
if ( parent )
{
gtk_container_remove ( GTK_CONTAINER ( parent ) ,
button - > priv - > label_widget ) ;
}
2003-06-29 23:34:20 +00:00
}
2010-05-24 20:31:36 +00:00
child = gtk_bin_get_child ( GTK_BIN ( button - > priv - > button ) ) ;
if ( child )
2003-06-29 23:34:20 +00:00
{
2003-07-03 01:02:04 +00:00
/* Note: we are not destroying the label_widget or icon_widget
* here because they were removed from their containers above
*/
2010-05-24 20:31:36 +00:00
gtk_widget_destroy ( child ) ;
2003-06-29 23:34:20 +00:00
}
style = gtk_tool_item_get_toolbar_style ( GTK_TOOL_ITEM ( button ) ) ;
if ( style ! = GTK_TOOLBAR_TEXT )
need_icon = TRUE ;
2003-08-04 21:13:55 +00:00
if ( style ! = GTK_TOOLBAR_ICONS & & style ! = GTK_TOOLBAR_BOTH_HORIZ )
need_label = TRUE ;
if ( style = = GTK_TOOLBAR_BOTH_HORIZ & &
( gtk_tool_item_get_is_important ( GTK_TOOL_ITEM ( button ) ) | |
2009-07-13 17:13:59 +00:00
gtk_tool_item_get_orientation ( GTK_TOOL_ITEM ( button ) ) = = GTK_ORIENTATION_VERTICAL | |
gtk_tool_item_get_text_orientation ( GTK_TOOL_ITEM ( button ) ) = = GTK_ORIENTATION_VERTICAL ) )
2003-08-04 21:13:55 +00:00
{
need_label = TRUE ;
}
2016-10-03 08:33:17 +00:00
2013-10-14 18:08:30 +00:00
if ( style ! = GTK_TOOLBAR_TEXT & & button - > priv - > icon_widget = = NULL & &
2016-10-03 08:33:17 +00:00
button - > priv - > icon_name = = NULL )
2005-12-07 17:14:07 +00:00
{
need_label = TRUE ;
need_icon = FALSE ;
style = GTK_TOOLBAR_TEXT ;
}
if ( style = = GTK_TOOLBAR_TEXT & & button - > priv - > label_widget = = NULL & &
2016-10-03 08:33:17 +00:00
button - > priv - > label_text = = NULL )
2005-12-07 17:14:07 +00:00
{
need_label = FALSE ;
need_icon = TRUE ;
style = GTK_TOOLBAR_ICONS ;
}
2004-09-14 21:40:41 +00:00
2003-06-29 23:34:20 +00:00
if ( need_label )
{
2003-07-08 18:20:45 +00:00
if ( button - > priv - > label_widget )
2003-06-29 23:34:20 +00:00
{
2003-07-08 18:20:45 +00:00
label = button - > priv - > label_widget ;
2003-06-29 23:34:20 +00:00
}
else
{
2003-07-03 01:02:04 +00:00
gboolean elide ;
2016-10-15 20:32:51 +00:00
const char * orig_label ;
2003-06-29 23:34:20 +00:00
gchar * label_text ;
2003-07-08 18:20:45 +00:00
if ( button - > priv - > label_text )
2003-06-29 23:34:20 +00:00
{
2016-10-15 20:32:51 +00:00
orig_label = button - > priv - > label_text ;
2003-07-08 18:20:45 +00:00
elide = button - > priv - > use_underline ;
2003-06-29 23:34:20 +00:00
}
else
2003-07-03 01:02:04 +00:00
{
2016-10-15 20:32:51 +00:00
orig_label = " " ;
2003-07-03 01:02:04 +00:00
elide = FALSE ;
}
2003-06-29 23:34:20 +00:00
if ( elide )
2016-10-15 20:32:51 +00:00
label_text = _gtk_toolbar_elide_underscores ( orig_label ) ;
2003-06-29 23:34:20 +00:00
else
2016-10-15 20:32:51 +00:00
label_text = g_strdup ( orig_label ) ;
2003-06-29 23:34:20 +00:00
label = gtk_label_new ( label_text ) ;
g_free ( label_text ) ;
gtk_widget_show ( label ) ;
}
2009-07-13 17:13:59 +00:00
2010-07-12 15:02:06 +00:00
if ( GTK_IS_LABEL ( label ) )
2009-07-13 17:13:59 +00:00
{
2010-07-12 15:02:06 +00:00
gtk_label_set_ellipsize ( GTK_LABEL ( label ) ,
gtk_tool_item_get_ellipsize_mode ( GTK_TOOL_ITEM ( button ) ) ) ;
text_orientation = gtk_tool_item_get_text_orientation ( GTK_TOOL_ITEM ( button ) ) ;
if ( text_orientation = = GTK_ORIENTATION_HORIZONTAL )
{
2014-05-23 02:54:18 +00:00
gfloat align ;
2010-07-12 15:02:06 +00:00
gtk_label_set_angle ( GTK_LABEL ( label ) , 0 ) ;
2014-05-23 02:54:18 +00:00
align = gtk_tool_item_get_text_alignment ( GTK_TOOL_ITEM ( button ) ) ;
if ( align < 0.4 )
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
else if ( align > 0.6 )
gtk_widget_set_halign ( label , GTK_ALIGN_END ) ;
else
gtk_widget_set_halign ( label , GTK_ALIGN_CENTER ) ;
2010-07-12 15:02:06 +00:00
}
else
{
2014-05-23 02:54:18 +00:00
gfloat align ;
2010-07-12 15:02:06 +00:00
gtk_label_set_ellipsize ( GTK_LABEL ( label ) , PANGO_ELLIPSIZE_NONE ) ;
if ( gtk_widget_get_direction ( GTK_WIDGET ( tool_item ) ) = = GTK_TEXT_DIR_RTL )
gtk_label_set_angle ( GTK_LABEL ( label ) , - 90 ) ;
else
gtk_label_set_angle ( GTK_LABEL ( label ) , 90 ) ;
2014-05-23 02:54:18 +00:00
align = gtk_tool_item_get_text_alignment ( GTK_TOOL_ITEM ( button ) ) ;
if ( align < 0.4 )
gtk_widget_set_valign ( label , GTK_ALIGN_END ) ;
else if ( align > 0.6 )
gtk_widget_set_valign ( label , GTK_ALIGN_START ) ;
else
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
2010-07-12 15:02:06 +00:00
}
2009-07-13 17:13:59 +00:00
}
2003-06-29 23:34:20 +00:00
}
icon_size = gtk_tool_item_get_icon_size ( GTK_TOOL_ITEM ( button ) ) ;
if ( need_icon )
{
2003-07-08 18:20:45 +00:00
if ( button - > priv - > icon_widget )
2003-06-29 23:34:20 +00:00
{
2003-07-08 18:20:45 +00:00
icon = button - > priv - > icon_widget ;
2016-10-03 08:33:17 +00:00
2003-06-29 23:34:20 +00:00
if ( GTK_IS_IMAGE ( icon ) )
{
2004-11-19 23:18:38 +00:00
g_object_set ( button - > priv - > icon_widget ,
2003-07-03 01:02:04 +00:00
" icon-size " , icon_size ,
NULL ) ;
2003-06-29 23:34:20 +00:00
}
}
2005-05-18 05:38:50 +00:00
else if ( button - > priv - > icon_name )
{
icon = gtk_image_new_from_icon_name ( button - > priv - > icon_name , icon_size ) ;
gtk_widget_show ( icon ) ;
}
2009-07-13 17:13:59 +00:00
if ( icon )
{
2014-05-23 02:54:18 +00:00
if ( text_orientation = = GTK_ORIENTATION_HORIZONTAL )
{
gfloat align ;
align = gtk_tool_item_get_text_alignment ( GTK_TOOL_ITEM ( button ) ) ;
if ( align > 0.6 )
gtk_widget_set_halign ( icon , GTK_ALIGN_START ) ;
else if ( align < 0.4 )
gtk_widget_set_halign ( icon , GTK_ALIGN_END ) ;
else
gtk_widget_set_halign ( icon , GTK_ALIGN_CENTER ) ;
}
else
{
gfloat align ;
align = gtk_tool_item_get_text_alignment ( GTK_TOOL_ITEM ( button ) ) ;
if ( align > 0.6 )
gtk_widget_set_valign ( icon , GTK_ALIGN_END ) ;
else if ( align < 0.4 )
gtk_widget_set_valign ( icon , GTK_ALIGN_START ) ;
else
gtk_widget_set_valign ( icon , GTK_ALIGN_CENTER ) ;
}
2009-07-13 17:13:59 +00:00
size_group = gtk_tool_item_get_text_size_group ( GTK_TOOL_ITEM ( button ) ) ;
if ( size_group ! = NULL )
gtk_size_group_add_widget ( size_group , icon ) ;
}
2003-06-29 23:34:20 +00:00
}
switch ( style )
{
case GTK_TOOLBAR_ICONS :
if ( icon )
2014-10-11 12:28:55 +00:00
gtk_container_add ( GTK_CONTAINER ( button - > priv - > button ) , icon ) ;
gtk_style_context_add_class ( gtk_widget_get_style_context ( button - > priv - > button ) , " image-button " ) ;
2016-03-05 01:48:13 +00:00
gtk_style_context_remove_class ( gtk_widget_get_style_context ( button - > priv - > button ) , " text-button " ) ;
2003-06-29 23:34:20 +00:00
break ;
case GTK_TOOLBAR_BOTH :
2009-07-13 17:13:59 +00:00
if ( text_orientation = = GTK_ORIENTATION_HORIZONTAL )
2016-10-11 07:33:12 +00:00
box = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2009-07-13 17:13:59 +00:00
else
2016-10-11 07:33:12 +00:00
box = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2003-07-19 14:10:48 +00:00
if ( icon )
2016-10-02 15:37:22 +00:00
gtk_box_pack_start ( GTK_BOX ( box ) , icon , TRUE , TRUE ) ;
gtk_box_pack_end ( GTK_BOX ( box ) , label , FALSE , TRUE ) ;
2003-07-08 18:20:45 +00:00
gtk_container_add ( GTK_CONTAINER ( button - > priv - > button ) , box ) ;
2016-03-05 01:48:13 +00:00
gtk_style_context_add_class ( gtk_widget_get_style_context ( button - > priv - > button ) , " image-button " ) ;
gtk_style_context_add_class ( gtk_widget_get_style_context ( button - > priv - > button ) , " text-button " ) ;
2003-06-29 23:34:20 +00:00
break ;
case GTK_TOOLBAR_BOTH_HORIZ :
2009-07-13 17:13:59 +00:00
if ( text_orientation = = GTK_ORIENTATION_HORIZONTAL )
{
2016-10-11 07:33:12 +00:00
box = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2009-07-13 17:13:59 +00:00
if ( icon )
2016-10-02 15:37:22 +00:00
gtk_box_pack_start ( GTK_BOX ( box ) , icon , label ? FALSE : TRUE , TRUE ) ;
2009-07-13 17:13:59 +00:00
if ( label )
2016-10-02 15:37:22 +00:00
gtk_box_pack_end ( GTK_BOX ( box ) , label , TRUE , TRUE ) ;
2009-07-13 17:13:59 +00:00
}
else
{
2016-10-11 07:33:12 +00:00
box = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2009-07-13 17:13:59 +00:00
if ( icon )
2016-10-02 15:37:22 +00:00
gtk_box_pack_end ( GTK_BOX ( box ) , icon , label ? FALSE : TRUE , TRUE ) ;
2009-07-13 17:13:59 +00:00
if ( label )
2016-10-02 15:37:22 +00:00
gtk_box_pack_start ( GTK_BOX ( box ) , label , TRUE , TRUE ) ;
2009-07-13 17:13:59 +00:00
}
2003-07-08 18:20:45 +00:00
gtk_container_add ( GTK_CONTAINER ( button - > priv - > button ) , box ) ;
2016-03-05 01:48:13 +00:00
gtk_style_context_add_class ( gtk_widget_get_style_context ( button - > priv - > button ) , " image-button " ) ;
gtk_style_context_add_class ( gtk_widget_get_style_context ( button - > priv - > button ) , " text-button " ) ;
2003-06-29 23:34:20 +00:00
break ;
case GTK_TOOLBAR_TEXT :
2003-07-08 18:20:45 +00:00
gtk_container_add ( GTK_CONTAINER ( button - > priv - > button ) , label ) ;
2014-10-11 12:28:55 +00:00
gtk_style_context_add_class ( gtk_widget_get_style_context ( button - > priv - > button ) , " text-button " ) ;
2016-03-05 01:48:13 +00:00
gtk_style_context_remove_class ( gtk_widget_get_style_context ( button - > priv - > button ) , " image-button " ) ;
2003-06-29 23:34:20 +00:00
break ;
}
if ( box )
gtk_widget_show ( box ) ;
2004-09-14 21:40:41 +00:00
gtk_tool_item_rebuild_menu ( tool_item ) ;
2003-06-29 23:34:20 +00:00
gtk_widget_queue_resize ( GTK_WIDGET ( button ) ) ;
}
static void
gtk_tool_button_set_property ( GObject * object ,
guint prop_id ,
const GValue * value ,
GParamSpec * pspec )
{
GtkToolButton * button = GTK_TOOL_BUTTON ( object ) ;
switch ( prop_id )
{
case PROP_LABEL :
gtk_tool_button_set_label ( button , g_value_get_string ( value ) ) ;
break ;
case PROP_USE_UNDERLINE :
gtk_tool_button_set_use_underline ( button , g_value_get_boolean ( value ) ) ;
break ;
case PROP_LABEL_WIDGET :
gtk_tool_button_set_label_widget ( button , g_value_get_object ( value ) ) ;
break ;
2005-05-18 05:38:50 +00:00
case PROP_ICON_NAME :
gtk_tool_button_set_icon_name ( button , g_value_get_string ( value ) ) ;
break ;
2003-06-29 23:34:20 +00:00
case PROP_ICON_WIDGET :
gtk_tool_button_set_icon_widget ( button , g_value_get_object ( value ) ) ;
break ;
2012-01-06 03:22:06 +00:00
case PROP_ACTION_NAME :
g_object_set_property ( G_OBJECT ( button - > priv - > button ) , " action-name " , value ) ;
break ;
case PROP_ACTION_TARGET :
g_object_set_property ( G_OBJECT ( button - > priv - > button ) , " action-target " , value ) ;
break ;
2003-06-29 23:34:20 +00:00
default :
G_OBJECT_WARN_INVALID_PROPERTY_ID ( object , prop_id , pspec ) ;
2008-01-06 03:28:40 +00:00
break ;
2003-06-29 23:34:20 +00:00
}
}
2003-08-04 21:13:55 +00:00
static void
gtk_tool_button_property_notify ( GObject * object ,
GParamSpec * pspec )
{
2007-01-28 03:16:30 +00:00
GtkToolButton * button = GTK_TOOL_BUTTON ( object ) ;
2007-01-28 03:39:46 +00:00
if ( button - > priv - > contents_invalid | |
strcmp ( " is-important " , pspec - > name ) = = 0 )
2003-08-04 21:13:55 +00:00
gtk_tool_button_construct_contents ( GTK_TOOL_ITEM ( object ) ) ;
2004-02-20 18:02:21 +00:00
2015-09-14 15:15:32 +00:00
if ( parent_class - > notify )
parent_class - > notify ( object , pspec ) ;
2003-08-04 21:13:55 +00:00
}
2003-06-29 23:34:20 +00:00
static void
gtk_tool_button_get_property ( GObject * object ,
guint prop_id ,
GValue * value ,
GParamSpec * pspec )
{
GtkToolButton * button = GTK_TOOL_BUTTON ( object ) ;
switch ( prop_id )
{
case PROP_LABEL :
g_value_set_string ( value , gtk_tool_button_get_label ( button ) ) ;
break ;
case PROP_LABEL_WIDGET :
g_value_set_object ( value , gtk_tool_button_get_label_widget ( button ) ) ;
break ;
case PROP_USE_UNDERLINE :
g_value_set_boolean ( value , gtk_tool_button_get_use_underline ( button ) ) ;
break ;
2005-05-18 05:38:50 +00:00
case PROP_ICON_NAME :
g_value_set_string ( value , button - > priv - > icon_name ) ;
break ;
2003-06-29 23:34:20 +00:00
case PROP_ICON_WIDGET :
2003-07-08 18:20:45 +00:00
g_value_set_object ( value , button - > priv - > icon_widget ) ;
2003-06-29 23:34:20 +00:00
break ;
2012-01-06 03:22:06 +00:00
case PROP_ACTION_NAME :
g_object_get_property ( G_OBJECT ( button - > priv - > button ) , " action-name " , value ) ;
break ;
case PROP_ACTION_TARGET :
g_object_get_property ( G_OBJECT ( button - > priv - > button ) , " action-target " , value ) ;
break ;
2003-06-29 23:34:20 +00:00
default :
G_OBJECT_WARN_INVALID_PROPERTY_ID ( object , prop_id , pspec ) ;
2008-01-06 03:28:40 +00:00
break ;
2003-06-29 23:34:20 +00:00
}
}
2012-01-06 03:22:06 +00:00
static const gchar *
gtk_tool_button_get_action_name ( GtkActionable * actionable )
{
GtkToolButton * button = GTK_TOOL_BUTTON ( actionable ) ;
return gtk_actionable_get_action_name ( GTK_ACTIONABLE ( button - > priv - > button ) ) ;
}
static void
gtk_tool_button_set_action_name ( GtkActionable * actionable ,
const gchar * action_name )
{
GtkToolButton * button = GTK_TOOL_BUTTON ( actionable ) ;
gtk_actionable_set_action_name ( GTK_ACTIONABLE ( button - > priv - > button ) , action_name ) ;
}
static GVariant *
gtk_tool_button_get_action_target_value ( GtkActionable * actionable )
{
GtkToolButton * button = GTK_TOOL_BUTTON ( actionable ) ;
return gtk_actionable_get_action_target_value ( GTK_ACTIONABLE ( button - > priv - > button ) ) ;
}
static void
gtk_tool_button_set_action_target_value ( GtkActionable * actionable ,
GVariant * action_target )
{
GtkToolButton * button = GTK_TOOL_BUTTON ( actionable ) ;
gtk_actionable_set_action_target_value ( GTK_ACTIONABLE ( button - > priv - > button ) , action_target ) ;
}
static void
gtk_tool_button_actionable_iface_init ( GtkActionableInterface * iface )
{
iface - > get_action_name = gtk_tool_button_get_action_name ;
iface - > set_action_name = gtk_tool_button_set_action_name ;
iface - > get_action_target_value = gtk_tool_button_get_action_target_value ;
iface - > set_action_target_value = gtk_tool_button_set_action_target_value ;
}
2003-06-29 23:34:20 +00:00
static void
gtk_tool_button_finalize ( GObject * object )
{
GtkToolButton * button = GTK_TOOL_BUTTON ( object ) ;
2005-05-18 05:38:50 +00:00
g_free ( button - > priv - > icon_name ) ;
g_free ( button - > priv - > label_text ) ;
2003-07-13 19:29:54 +00:00
if ( button - > priv - > label_widget )
2004-11-19 23:18:38 +00:00
g_object_unref ( button - > priv - > label_widget ) ;
2003-07-13 19:29:54 +00:00
if ( button - > priv - > icon_widget )
2004-11-19 23:18:38 +00:00
g_object_unref ( button - > priv - > icon_widget ) ;
2015-09-14 15:15:32 +00:00
parent_class - > finalize ( object ) ;
2003-06-29 23:34:20 +00:00
}
2003-07-03 01:02:04 +00:00
static GtkWidget *
2013-06-26 22:41:15 +00:00
clone_image_menu_size ( GtkImage * image )
2003-07-03 01:02:04 +00:00
{
GtkImageType storage_type = gtk_image_get_storage_type ( image ) ;
2016-10-03 08:33:17 +00:00
if ( storage_type = = GTK_IMAGE_ICON_NAME )
2010-01-26 14:41:00 +00:00
{
const gchar * icon_name ;
gtk_image_get_icon_name ( image , & icon_name , NULL ) ;
return gtk_image_new_from_icon_name ( icon_name , GTK_ICON_SIZE_MENU ) ;
}
2009-01-11 05:44:18 +00:00
else if ( storage_type = = GTK_IMAGE_GICON )
{
GIcon * icon ;
gtk_image_get_gicon ( image , & icon , NULL ) ;
return gtk_image_new_from_gicon ( icon , GTK_ICON_SIZE_MENU ) ;
}
2003-07-03 01:02:04 +00:00
else if ( storage_type = = GTK_IMAGE_PIXBUF )
{
gint width , height ;
2013-06-26 22:41:15 +00:00
if ( gtk_icon_size_lookup ( GTK_ICON_SIZE_MENU , & width , & height ) )
2003-07-03 01:02:04 +00:00
{
GdkPixbuf * src_pixbuf , * dest_pixbuf ;
2005-12-07 18:00:20 +00:00
GtkWidget * cloned_image ;
2003-07-03 01:02:04 +00:00
src_pixbuf = gtk_image_get_pixbuf ( image ) ;
dest_pixbuf = gdk_pixbuf_scale_simple ( src_pixbuf , width , height ,
GDK_INTERP_BILINEAR ) ;
2005-12-07 18:00:20 +00:00
cloned_image = gtk_image_new_from_pixbuf ( dest_pixbuf ) ;
2005-12-05 18:52:04 +00:00
g_object_unref ( dest_pixbuf ) ;
2005-12-07 18:00:20 +00:00
return cloned_image ;
2003-07-03 01:02:04 +00:00
}
}
return NULL ;
}
2016-10-03 07:46:57 +00:00
2003-06-29 23:34:20 +00:00
static gboolean
gtk_tool_button_create_menu_proxy ( GtkToolItem * item )
{
GtkToolButton * button = GTK_TOOL_BUTTON ( item ) ;
GtkWidget * menu_item ;
GtkWidget * menu_image = NULL ;
gboolean use_mnemonic = TRUE ;
2016-10-03 07:46:57 +00:00
const char * label_text ;
GtkWidget * box ;
GtkWidget * label ;
2003-06-29 23:34:20 +00:00
2009-01-26 03:01:01 +00:00
if ( _gtk_tool_item_create_menu_proxy ( item ) )
return TRUE ;
2013-06-27 21:51:38 +00:00
2008-02-06 09:53:34 +00:00
if ( GTK_IS_LABEL ( button - > priv - > label_widget ) )
2003-07-03 01:02:04 +00:00
{
2016-10-03 07:46:57 +00:00
label_text = gtk_label_get_label ( GTK_LABEL ( button - > priv - > label_widget ) ) ;
2003-07-08 18:20:45 +00:00
use_mnemonic = gtk_label_get_use_underline ( GTK_LABEL ( button - > priv - > label_widget ) ) ;
2003-07-03 01:02:04 +00:00
}
2003-07-08 18:20:45 +00:00
else if ( button - > priv - > label_text )
2003-06-29 23:34:20 +00:00
{
2016-10-03 07:46:57 +00:00
label_text = button - > priv - > label_text ;
2003-07-08 18:20:45 +00:00
use_mnemonic = button - > priv - > use_underline ;
2003-06-29 23:34:20 +00:00
}
2003-07-03 01:02:04 +00:00
else
{
2016-10-03 07:46:57 +00:00
label_text = " " ;
2003-07-03 01:02:04 +00:00
}
2013-06-27 21:51:38 +00:00
2008-02-06 09:53:34 +00:00
if ( GTK_IS_IMAGE ( button - > priv - > icon_widget ) )
2003-06-29 23:34:20 +00:00
{
2013-06-26 22:41:15 +00:00
menu_image = clone_image_menu_size ( GTK_IMAGE ( button - > priv - > icon_widget ) ) ;
2003-06-29 23:34:20 +00:00
}
2016-10-03 07:46:57 +00:00
box = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 6 ) ;
if ( use_mnemonic )
label = gtk_label_new_with_mnemonic ( label_text ) ;
else
label = gtk_label_new ( label_text ) ;
2003-06-29 23:34:20 +00:00
if ( menu_image )
2016-10-03 07:46:57 +00:00
gtk_container_add ( GTK_CONTAINER ( box ) , menu_image ) ;
gtk_container_add ( GTK_CONTAINER ( box ) , label ) ;
2003-06-29 23:34:20 +00:00
2016-10-03 07:46:57 +00:00
menu_item = gtk_menu_item_new ( ) ;
gtk_container_add ( GTK_CONTAINER ( menu_item ) , box ) ;
2013-06-27 22:48:46 +00:00
2003-06-29 23:34:20 +00:00
g_signal_connect_closure_by_id ( menu_item ,
g_signal_lookup ( " activate " , G_OBJECT_TYPE ( menu_item ) ) , 0 ,
g_cclosure_new_object_swap ( G_CALLBACK ( gtk_button_clicked ) ,
2003-07-08 18:20:45 +00:00
G_OBJECT ( GTK_TOOL_BUTTON ( button ) - > priv - > button ) ) ,
2003-06-29 23:34:20 +00:00
FALSE ) ;
gtk_tool_item_set_proxy_menu_item ( GTK_TOOL_ITEM ( button ) , MENU_ID , menu_item ) ;
return TRUE ;
}
static void
button_clicked ( GtkWidget * widget ,
GtkToolButton * button )
{
g_signal_emit_by_name ( button , " clicked " ) ;
}
static void
gtk_tool_button_toolbar_reconfigured ( GtkToolItem * tool_item )
{
gtk_tool_button_construct_contents ( tool_item ) ;
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_new :
2009-12-10 10:23:40 +00:00
* @ label : ( allow - none ) : a string that will be used as label , or % NULL
2011-09-27 21:06:59 +00:00
* @ icon_widget : ( allow - none ) : a widget that will be used as the button contents , or % NULL
2009-12-10 10:23:40 +00:00
*
2015-07-21 18:16:15 +00:00
* Creates a new # GtkToolButton using @ icon_widget as contents and @ label as
2003-08-04 21:13:55 +00:00
* label .
2009-12-10 10:23:40 +00:00
*
2014-02-19 23:49:43 +00:00
* Returns : A new # GtkToolButton
2003-08-04 21:13:55 +00:00
*
* Since : 2.4
* */
2003-06-29 23:34:20 +00:00
GtkToolItem *
2003-07-30 18:35:08 +00:00
gtk_tool_button_new ( GtkWidget * icon_widget ,
const gchar * label )
2003-06-29 23:34:20 +00:00
{
GtkToolButton * button ;
2003-07-02 14:04:43 +00:00
2011-09-27 21:06:59 +00:00
g_return_val_if_fail ( icon_widget = = NULL | | GTK_IS_WIDGET ( icon_widget ) , NULL ) ;
2010-04-26 18:05:51 +00:00
2003-06-29 23:34:20 +00:00
button = g_object_new ( GTK_TYPE_TOOL_BUTTON ,
2007-01-28 03:16:30 +00:00
" label " , label ,
" icon-widget " , icon_widget ,
2003-06-29 23:34:20 +00:00
NULL ) ;
return GTK_TOOL_ITEM ( button ) ;
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_set_label :
* @ button : a # GtkToolButton
2009-12-10 10:23:40 +00:00
* @ label : ( allow - none ) : a string that will be used as label , or % NULL .
*
2015-07-22 19:43:51 +00:00
* Sets @ label as the label used for the tool button . The # GtkToolButton : label
* property only has an effect if not overridden by a non - % NULL
* # GtkToolButton : label - widget property . If both the # GtkToolButton : label - widget
2016-10-16 11:12:16 +00:00
* and # GtkToolButton : label properties are % NULL , @ button will not have a label .
2003-08-04 21:13:55 +00:00
*
* Since : 2.4
* */
2003-06-29 23:34:20 +00:00
void
gtk_tool_button_set_label ( GtkToolButton * button ,
const gchar * label )
{
gchar * old_label ;
2009-10-06 19:28:23 +00:00
gchar * elided_label ;
AtkObject * accessible ;
2003-06-29 23:34:20 +00:00
g_return_if_fail ( GTK_IS_TOOL_BUTTON ( button ) ) ;
2003-07-08 18:20:45 +00:00
old_label = button - > priv - > label_text ;
2003-06-29 23:34:20 +00:00
2003-07-08 18:20:45 +00:00
button - > priv - > label_text = g_strdup ( label ) ;
2007-01-28 03:16:30 +00:00
button - > priv - > contents_invalid = TRUE ;
2003-06-29 23:34:20 +00:00
2009-10-26 23:30:54 +00:00
if ( label )
{
elided_label = _gtk_toolbar_elide_underscores ( label ) ;
accessible = gtk_widget_get_accessible ( GTK_WIDGET ( button - > priv - > button ) ) ;
atk_object_set_name ( accessible , elided_label ) ;
g_free ( elided_label ) ;
}
2009-10-06 19:28:23 +00:00
2007-01-28 03:16:30 +00:00
g_free ( old_label ) ;
g_object_notify ( G_OBJECT ( button ) , " label " ) ;
2003-06-29 23:34:20 +00:00
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_get_label :
* @ button : a # GtkToolButton
2016-10-16 11:12:16 +00:00
*
2003-08-04 21:13:55 +00:00
* Returns the label used by the tool button , or % NULL if the tool button
2016-10-16 11:12:16 +00:00
* doesn ’ t have a label . The returned
2003-08-04 21:13:55 +00:00
* string is owned by GTK + , and must not be modified or freed .
2016-10-16 11:12:16 +00:00
*
* Returns : ( nullable ) ( transfer none ) : The label , or % NULL
*
2003-08-04 21:13:55 +00:00
* Since : 2.4
* */
2011-06-06 18:13:44 +00:00
const gchar *
2003-06-29 23:34:20 +00:00
gtk_tool_button_get_label ( GtkToolButton * button )
{
g_return_val_if_fail ( GTK_IS_TOOL_BUTTON ( button ) , NULL ) ;
2003-07-08 18:20:45 +00:00
return button - > priv - > label_text ;
2003-06-29 23:34:20 +00:00
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_set_use_underline :
* @ button : a # GtkToolButton
2014-02-05 18:07:34 +00:00
* @ use_underline : whether the button label has the form “ _Open ”
2003-08-04 21:13:55 +00:00
*
* If set , an underline in the label property indicates that the next character
* should be used for the mnemonic accelerator key in the overflow menu . For
2014-02-05 18:07:34 +00:00
* example , if the label property is “ _Open ” and @ use_underline is % TRUE ,
* the label on the tool button will be “ Open ” and the item on the overflow
2014-02-07 19:03:49 +00:00
* menu will have an underlined “ O ” .
2003-08-04 21:13:55 +00:00
*
* Labels shown on tool buttons never have mnemonics on them ; this property
* only affects the menu item on the overflow menu .
*
* Since : 2.4
* */
2003-06-29 23:34:20 +00:00
void
gtk_tool_button_set_use_underline ( GtkToolButton * button ,
gboolean use_underline )
{
g_return_if_fail ( GTK_IS_TOOL_BUTTON ( button ) ) ;
use_underline = use_underline ! = FALSE ;
2003-07-08 18:20:45 +00:00
if ( use_underline ! = button - > priv - > use_underline )
2003-06-29 23:34:20 +00:00
{
2003-07-08 18:20:45 +00:00
button - > priv - > use_underline = use_underline ;
2007-01-28 03:16:30 +00:00
button - > priv - > contents_invalid = TRUE ;
2003-06-29 23:34:20 +00:00
2005-03-26 05:49:15 +00:00
g_object_notify ( G_OBJECT ( button ) , " use-underline " ) ;
2003-06-29 23:34:20 +00:00
}
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_get_use_underline :
* @ button : a # GtkToolButton
*
* Returns whether underscores in the label property are used as mnemonics
* on menu items on the overflow menu . See gtk_tool_button_set_use_underline ( ) .
*
2014-02-19 23:49:43 +00:00
* Returns : % TRUE if underscores in the label property are used as
2003-08-04 21:13:55 +00:00
* mnemonics on menu items on the overflow menu .
*
* Since : 2.4
* */
2003-06-29 23:34:20 +00:00
gboolean
gtk_tool_button_get_use_underline ( GtkToolButton * button )
{
g_return_val_if_fail ( GTK_IS_TOOL_BUTTON ( button ) , FALSE ) ;
2003-07-08 18:20:45 +00:00
return button - > priv - > use_underline ;
2003-06-29 23:34:20 +00:00
}
2005-05-18 05:38:50 +00:00
/**
2012-04-13 00:07:28 +00:00
* gtk_tool_button_set_icon_name :
2005-05-18 05:38:50 +00:00
* @ button : a # GtkToolButton
2009-12-10 10:23:40 +00:00
* @ icon_name : ( allow - none ) : the name of the themed icon
*
2005-05-18 05:38:50 +00:00
* Sets the icon for the tool button from a named themed icon .
* See the docs for # GtkIconTheme for more details .
2015-07-22 19:43:51 +00:00
* The # GtkToolButton : icon - name property only has an effect if not
2016-10-16 11:12:16 +00:00
* overridden by non - % NULL # GtkToolButton : label - widget or
* # GtkToolButton : icon - widget properties .
2005-05-18 05:38:50 +00:00
*
* Since : 2.8
* */
void
gtk_tool_button_set_icon_name ( GtkToolButton * button ,
const gchar * icon_name )
{
gchar * old_icon_name ;
g_return_if_fail ( GTK_IS_TOOL_BUTTON ( button ) ) ;
old_icon_name = button - > priv - > icon_name ;
button - > priv - > icon_name = g_strdup ( icon_name ) ;
2007-01-28 03:16:30 +00:00
button - > priv - > contents_invalid = TRUE ;
2005-05-18 05:38:50 +00:00
g_free ( old_icon_name ) ;
2007-01-28 03:16:30 +00:00
g_object_notify ( G_OBJECT ( button ) , " icon-name " ) ;
2005-05-18 05:38:50 +00:00
}
/**
2012-04-13 00:07:28 +00:00
* gtk_tool_button_get_icon_name :
2005-05-18 05:38:50 +00:00
* @ button : a # GtkToolButton
2012-04-13 00:07:28 +00:00
*
2005-05-18 05:38:50 +00:00
* Returns the name of the themed icon for the tool button ,
* see gtk_tool_button_set_icon_name ( ) .
*
2015-12-28 20:14:08 +00:00
* Returns : ( nullable ) : the icon name or % NULL if the tool button has
2005-05-18 05:38:50 +00:00
* no themed icon
2012-04-13 00:07:28 +00:00
*
2005-05-18 05:38:50 +00:00
* Since : 2.8
* */
2011-06-06 18:13:44 +00:00
const gchar *
2005-05-18 05:38:50 +00:00
gtk_tool_button_get_icon_name ( GtkToolButton * button )
{
g_return_val_if_fail ( GTK_IS_TOOL_BUTTON ( button ) , NULL ) ;
return button - > priv - > icon_name ;
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_set_icon_widget :
* @ button : a # GtkToolButton
2009-12-10 10:23:40 +00:00
* @ icon_widget : ( allow - none ) : the widget used as icon , or % NULL
*
2016-10-16 11:12:16 +00:00
* Sets @ icon as the widget used as icon on @ button .
*
2003-08-04 21:13:55 +00:00
* Since : 2.4
* */
2003-06-29 23:34:20 +00:00
void
gtk_tool_button_set_icon_widget ( GtkToolButton * button ,
2003-08-04 21:13:55 +00:00
GtkWidget * icon_widget )
2003-06-29 23:34:20 +00:00
{
g_return_if_fail ( GTK_IS_TOOL_BUTTON ( button ) ) ;
2003-08-04 21:13:55 +00:00
g_return_if_fail ( icon_widget = = NULL | | GTK_IS_WIDGET ( icon_widget ) ) ;
2003-06-29 23:34:20 +00:00
2003-08-04 21:13:55 +00:00
if ( icon_widget ! = button - > priv - > icon_widget )
2003-06-29 23:34:20 +00:00
{
2003-07-08 18:20:45 +00:00
if ( button - > priv - > icon_widget )
2004-04-22 10:52:32 +00:00
{
2010-08-11 20:51:57 +00:00
GtkWidget * parent ;
parent = gtk_widget_get_parent ( button - > priv - > icon_widget ) ;
if ( parent )
gtk_container_remove ( GTK_CONTAINER ( parent ) ,
button - > priv - > icon_widget ) ;
2003-06-29 23:34:20 +00:00
2004-11-19 23:18:38 +00:00
g_object_unref ( button - > priv - > icon_widget ) ;
2004-04-22 10:52:32 +00:00
}
2003-08-04 21:13:55 +00:00
if ( icon_widget )
2007-01-28 03:16:30 +00:00
g_object_ref_sink ( icon_widget ) ;
2003-06-29 23:34:20 +00:00
2003-08-04 21:13:55 +00:00
button - > priv - > icon_widget = icon_widget ;
2007-01-28 03:16:30 +00:00
button - > priv - > contents_invalid = TRUE ;
2003-06-29 23:34:20 +00:00
2005-03-26 05:49:15 +00:00
g_object_notify ( G_OBJECT ( button ) , " icon-widget " ) ;
2003-06-29 23:34:20 +00:00
}
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_set_label_widget :
* @ button : a # GtkToolButton
2009-12-10 10:23:40 +00:00
* @ label_widget : ( allow - none ) : the widget used as label , or % NULL
*
2003-08-04 21:13:55 +00:00
* Sets @ label_widget as the widget that will be used as the label
2015-07-22 19:43:51 +00:00
* for @ button . If @ label_widget is % NULL the # GtkToolButton : label property is used
2016-10-16 11:12:16 +00:00
* as label . If # GtkToolButton : label is also % NULL , @ button does not have a label .
*
2003-08-04 21:13:55 +00:00
* Since : 2.4
* */
2003-06-29 23:34:20 +00:00
void
gtk_tool_button_set_label_widget ( GtkToolButton * button ,
GtkWidget * label_widget )
{
g_return_if_fail ( GTK_IS_TOOL_BUTTON ( button ) ) ;
g_return_if_fail ( label_widget = = NULL | | GTK_IS_WIDGET ( label_widget ) ) ;
2003-07-08 18:20:45 +00:00
if ( label_widget ! = button - > priv - > label_widget )
2003-06-29 23:34:20 +00:00
{
2003-07-08 18:20:45 +00:00
if ( button - > priv - > label_widget )
2004-04-22 10:52:32 +00:00
{
2010-08-11 20:51:57 +00:00
GtkWidget * parent ;
parent = gtk_widget_get_parent ( button - > priv - > label_widget ) ;
if ( parent )
gtk_container_remove ( GTK_CONTAINER ( parent ) ,
button - > priv - > label_widget ) ;
2004-04-22 10:52:32 +00:00
g_object_unref ( button - > priv - > label_widget ) ;
}
2003-06-29 23:34:20 +00:00
if ( label_widget )
2007-01-28 03:16:30 +00:00
g_object_ref_sink ( label_widget ) ;
2003-06-29 23:34:20 +00:00
2003-07-08 18:20:45 +00:00
button - > priv - > label_widget = label_widget ;
2007-01-28 03:16:30 +00:00
button - > priv - > contents_invalid = TRUE ;
2003-06-29 23:34:20 +00:00
2005-03-26 05:49:15 +00:00
g_object_notify ( G_OBJECT ( button ) , " label-widget " ) ;
2003-06-29 23:34:20 +00:00
}
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_get_label_widget :
* @ button : a # GtkToolButton
2010-09-21 04:18:11 +00:00
*
* Returns the widget used as label on @ button .
* See gtk_tool_button_set_label_widget ( ) .
*
2015-12-28 20:14:08 +00:00
* Returns : ( nullable ) ( transfer none ) : The widget used as label
2010-09-21 04:18:11 +00:00
* on @ button , or % NULL .
*
2003-08-04 21:13:55 +00:00
* Since : 2.4
* */
2003-06-29 23:34:20 +00:00
GtkWidget *
gtk_tool_button_get_label_widget ( GtkToolButton * button )
{
g_return_val_if_fail ( GTK_IS_TOOL_BUTTON ( button ) , NULL ) ;
2003-07-08 18:20:45 +00:00
return button - > priv - > label_widget ;
2003-06-29 23:34:20 +00:00
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_get_icon_widget :
* @ button : a # GtkToolButton
2010-09-21 04:18:11 +00:00
*
* Return the widget used as icon widget on @ button .
* See gtk_tool_button_set_icon_widget ( ) .
*
2015-12-28 20:14:08 +00:00
* Returns : ( nullable ) ( transfer none ) : The widget used as icon
2010-09-21 04:18:11 +00:00
* on @ button , or % NULL .
*
2003-08-04 21:13:55 +00:00
* Since : 2.4
* */
2003-06-29 23:34:20 +00:00
GtkWidget *
gtk_tool_button_get_icon_widget ( GtkToolButton * button )
{
2003-07-08 10:58:23 +00:00
g_return_val_if_fail ( GTK_IS_TOOL_BUTTON ( button ) , NULL ) ;
2003-06-29 23:34:20 +00:00
2003-07-08 18:20:45 +00:00
return button - > priv - > icon_widget ;
}
GtkWidget *
_gtk_tool_button_get_button ( GtkToolButton * button )
{
g_return_val_if_fail ( GTK_IS_TOOL_BUTTON ( button ) , NULL ) ;
return button - > priv - > button ;
2003-06-29 23:34:20 +00:00
}