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 "gtkiconfactory.h"
# include "gtkimage.h"
# include "gtkimagemenuitem.h"
# include "gtklabel.h"
# include "gtkstock.h"
2011-08-28 05:54:55 +00:00
# include "gtkbox.h"
2003-06-29 23:34:20 +00:00
# include "gtkintl.h"
2003-07-02 14:04:43 +00:00
# include "gtktoolbar.h"
2009-01-23 15:15:28 +00:00
# include "gtkactivatable.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
*
* # GtkToolButton < ! - - - - > s are # GtkToolItems containing buttons .
*
* Use gtk_tool_button_new ( ) to create a new # GtkToolButton . Use
* gtk_tool_button_new_with_stock ( ) to create a # GtkToolButton
* containing a stock item .
*
* The label of a # GtkToolButton is determined by the properties
* # GtkToolButton : label - widget , # GtkToolButton : label , and
* # GtkToolButton : stock - id . If # GtkToolButton : label - widget is
* non - % NULL , then that widget is used as the label . Otherwise , if
* # GtkToolButton : label is non - % NULL , that string is used as the label .
* Otherwise , if # GtkToolButton : stock - id is non - % NULL , the label is
* determined by the stock item . Otherwise , the button does not have a label .
*
* The icon of a # GtkToolButton is determined by the properties
* # GtkToolButton : icon - widget and # GtkToolButton : stock - id . If
* # GtkToolButton : icon - widget is non - % NULL , then
* that widget is used as the icon . Otherwise , if # GtkToolButton : stock - id is
* non - % NULL , the icon is determined by the stock item . Otherwise ,
* the button does not have a icon .
*/
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 ,
PROP_STOCK_ID ,
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
} ;
static void gtk_tool_button_init ( GtkToolButton * button ,
GtkToolButtonClass * klass ) ;
static void gtk_tool_button_class_init ( GtkToolButtonClass * klass ) ;
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 ) ;
2011-01-04 01:06:32 +00:00
static void gtk_tool_button_style_updated ( GtkWidget * widget ) ;
2003-06-29 23:34:20 +00:00
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
static void gtk_tool_button_activatable_interface_init ( GtkActivatableIface * iface ) ;
2009-02-22 05:20:14 +00:00
static void gtk_tool_button_update ( GtkActivatable * activatable ,
2009-01-23 15:15:28 +00:00
GtkAction * action ,
const gchar * property_name ) ;
2009-02-22 05:20:14 +00:00
static void gtk_tool_button_sync_action_properties ( GtkActivatable * activatable ,
2009-01-23 15:15:28 +00:00
GtkAction * action ) ;
2003-09-30 22:48:10 +00:00
2003-07-08 18:20:45 +00:00
struct _GtkToolButtonPrivate
{
GtkWidget * button ;
gchar * stock_id ;
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
} ;
2009-01-23 15:15:28 +00:00
static GObjectClass * parent_class = NULL ;
static GtkActivatableIface * parent_activatable_iface ;
static guint toolbutton_signals [ LAST_SIGNAL ] = { 0 } ;
2003-06-29 23:34:20 +00:00
GType
gtk_tool_button_get_type ( void )
{
2008-06-17 20:43:07 +00:00
static GType type = 0 ;
2009-01-23 15:15:28 +00:00
2003-06-29 23:34:20 +00:00
if ( ! type )
2009-01-23 15:15:28 +00:00
{
2012-01-06 03:22:06 +00:00
const GInterfaceInfo actionable_info =
{
( GInterfaceInitFunc ) gtk_tool_button_actionable_iface_init ,
( GInterfaceFinalizeFunc ) NULL ,
NULL
} ;
2009-11-06 00:21:09 +00:00
const GInterfaceInfo activatable_info =
2009-01-23 15:15:28 +00:00
{
( GInterfaceInitFunc ) gtk_tool_button_activatable_interface_init ,
( GInterfaceFinalizeFunc ) NULL ,
NULL
} ;
type = 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 ) ;
2012-01-06 03:22:06 +00:00
g_type_add_interface_static ( type , GTK_TYPE_ACTIONABLE , & actionable_info ) ;
2009-01-23 15:15:28 +00:00
g_type_add_interface_static ( type , GTK_TYPE_ACTIVATABLE ,
& activatable_info ) ;
}
2003-06-29 23:34:20 +00:00
return type ;
}
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 ;
parent_class = g_type_class_peek_parent ( klass ) ;
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 ;
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 ;
2011-01-04 01:06:32 +00:00
widget_class - > style_updated = gtk_tool_button_style_updated ;
2006-06-01 13:42:14 +00:00
2003-06-29 23:34:20 +00:00
tool_item_class - > create_menu_proxy = gtk_tool_button_create_menu_proxy ;
tool_item_class - > toolbar_reconfigured = gtk_tool_button_toolbar_reconfigured ;
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 ,
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_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 ) ) ;
2003-06-29 23:34:20 +00:00
g_object_class_install_property ( object_class ,
PROP_STOCK_ID ,
2005-03-09 06:15:13 +00:00
g_param_spec_string ( " stock-id " ,
2004-01-16 23:10:05 +00:00
P_ ( " Stock Id " ) ,
P_ ( " The stock icon displayed on the item " ) ,
2003-06-29 23:34:20 +00:00
NULL ,
2005-03-22 02:14:55 +00:00
GTK_PARAM_READWRITE ) ) ;
2005-05-18 05:38:50 +00:00
/**
* GtkToolButton : icon - name :
*
* The name of the themed icon displayed on the item .
* This property only has an effect if not overridden by " label " ,
* " icon_widget " or " stock_id " properties .
*
* Since : 2.8
*/
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 " ) ;
2006-06-01 13:42:14 +00:00
/**
2006-07-10 16:59:43 +00:00
* GtkButton : icon - spacing :
2006-06-01 13:42:14 +00:00
*
* Spacing in pixels between the icon and label .
*
* Since : 2.10
*/
gtk_widget_class_install_style_property ( widget_class ,
g_param_spec_int ( " icon-spacing " ,
P_ ( " Icon spacing " ) ,
P_ ( " Spacing in pixels between the icon and label " ) ,
0 ,
G_MAXINT ,
2010-02-23 15:30:23 +00:00
3 ,
2006-06-01 13:42:14 +00:00
GTK_PARAM_READWRITE ) ) ;
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 ) ;
2003-07-08 20:28:24 +00:00
g_type_class_add_private ( object_class , sizeof ( GtkToolButtonPrivate ) ) ;
2003-06-29 23:34:20 +00:00
}
static void
gtk_tool_button_init ( GtkToolButton * button ,
GtkToolButtonClass * klass )
{
GtkToolItem * toolitem = GTK_TOOL_ITEM ( button ) ;
2010-07-13 23:58:29 +00:00
button - > priv = G_TYPE_INSTANCE_GET_PRIVATE ( button ,
GTK_TYPE_TOOL_BUTTON ,
2010-07-14 00:13:29 +00:00
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 */
2003-07-08 18:20:45 +00:00
button - > priv - > button = g_object_new ( klass - > button_type , NULL ) ;
gtk_button_set_focus_on_click ( GTK_BUTTON ( button - > priv - > button ) , FALSE ) ;
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 ;
2006-06-01 13:42:14 +00:00
guint icon_spacing ;
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 ;
2006-06-01 13:42:14 +00:00
gtk_widget_style_get ( GTK_WIDGET ( tool_item ) ,
" icon-spacing " , & icon_spacing ,
NULL ) ;
2003-06-29 23:34:20 +00:00
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 ;
}
2005-12-07 17:14:07 +00:00
if ( style = = GTK_TOOLBAR_ICONS & & button - > priv - > icon_widget = = NULL & &
button - > priv - > stock_id = = NULL & & button - > priv - > icon_name = = NULL )
{
need_label = TRUE ;
need_icon = FALSE ;
style = GTK_TOOLBAR_TEXT ;
}
if ( style = = GTK_TOOLBAR_TEXT & & button - > priv - > label_widget = = NULL & &
button - > priv - > stock_id = = NULL & & button - > priv - > label_text = = NULL )
{
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
{
GtkStockItem stock_item ;
2003-07-03 01:02:04 +00:00
gboolean elide ;
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
{
2003-07-08 18:20:45 +00:00
label_text = button - > priv - > label_text ;
elide = button - > priv - > use_underline ;
2003-06-29 23:34:20 +00:00
}
2003-07-08 18:20:45 +00:00
else if ( button - > priv - > stock_id & & gtk_stock_lookup ( button - > priv - > stock_id , & stock_item ) )
2003-07-03 01:02:04 +00:00
{
label_text = stock_item . label ;
elide = TRUE ;
}
2003-06-29 23:34:20 +00:00
else
2003-07-03 01:02:04 +00:00
{
label_text = " " ;
elide = FALSE ;
}
2003-06-29 23:34:20 +00:00
if ( elide )
2003-07-02 14:04:43 +00:00
label_text = _gtk_toolbar_elide_underscores ( label_text ) ;
2003-06-29 23:34:20 +00:00
else
label_text = g_strdup ( label_text ) ;
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 )
{
gtk_label_set_angle ( GTK_LABEL ( label ) , 0 ) ;
gtk_misc_set_alignment ( GTK_MISC ( label ) ,
gtk_tool_item_get_text_alignment ( GTK_TOOL_ITEM ( button ) ) ,
0.5 ) ;
}
else
{
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 ) ;
gtk_misc_set_alignment ( GTK_MISC ( label ) ,
0.5 ,
1 - gtk_tool_item_get_text_alignment ( GTK_TOOL_ITEM ( button ) ) ) ;
}
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 ;
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
}
}
2006-06-20 18:01:23 +00:00
else if ( button - > priv - > stock_id & &
gtk_icon_factory_lookup_default ( button - > priv - > stock_id ) )
2003-06-29 23:34:20 +00:00
{
2003-07-08 18:20:45 +00:00
icon = gtk_image_new_from_stock ( button - > priv - > stock_id , icon_size ) ;
2003-06-29 23:34:20 +00:00
gtk_widget_show ( icon ) ;
}
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
2010-05-03 16:22:42 +00:00
if ( GTK_IS_MISC ( icon ) & & text_orientation = = GTK_ORIENTATION_HORIZONTAL )
2009-07-13 17:13:59 +00:00
gtk_misc_set_alignment ( GTK_MISC ( icon ) ,
1.0 - gtk_tool_item_get_text_alignment ( GTK_TOOL_ITEM ( button ) ) ,
0.5 ) ;
2010-05-03 16:22:42 +00:00
else if ( GTK_IS_MISC ( icon ) )
2009-07-13 17:13:59 +00:00
gtk_misc_set_alignment ( GTK_MISC ( icon ) ,
0.5 ,
gtk_tool_item_get_text_alignment ( GTK_TOOL_ITEM ( button ) ) ) ;
if ( icon )
{
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 )
2003-07-08 18:20:45 +00:00
gtk_container_add ( GTK_CONTAINER ( button - > priv - > button ) , icon ) ;
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 )
2010-10-31 17:07:20 +00:00
box = gtk_box_new ( GTK_ORIENTATION_VERTICAL , icon_spacing ) ;
2009-07-13 17:13:59 +00:00
else
2010-10-31 17:07:20 +00:00
box = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , icon_spacing ) ;
2003-07-19 14:10:48 +00:00
if ( icon )
gtk_box_pack_start ( GTK_BOX ( box ) , icon , TRUE , TRUE , 0 ) ;
2008-06-13 03:21:09 +00:00
gtk_box_pack_end ( GTK_BOX ( box ) , label , FALSE , TRUE , 0 ) ;
2003-07-08 18:20:45 +00:00
gtk_container_add ( GTK_CONTAINER ( button - > priv - > button ) , box ) ;
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 )
{
2010-10-31 17:07:20 +00:00
box = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , icon_spacing ) ;
2009-07-13 17:13:59 +00:00
if ( icon )
gtk_box_pack_start ( GTK_BOX ( box ) , icon , label ? FALSE : TRUE , TRUE , 0 ) ;
if ( label )
gtk_box_pack_end ( GTK_BOX ( box ) , label , TRUE , TRUE , 0 ) ;
}
else
{
2010-10-31 17:07:20 +00:00
box = gtk_box_new ( GTK_ORIENTATION_VERTICAL , icon_spacing ) ;
2009-07-13 17:13:59 +00:00
if ( icon )
gtk_box_pack_end ( GTK_BOX ( box ) , icon , label ? FALSE : TRUE , TRUE , 0 ) ;
if ( label )
gtk_box_pack_start ( GTK_BOX ( box ) , label , TRUE , TRUE , 0 ) ;
}
2003-07-08 18:20:45 +00:00
gtk_container_add ( GTK_CONTAINER ( button - > priv - > button ) , box ) ;
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 ) ;
2003-06-29 23:34:20 +00:00
break ;
}
if ( box )
gtk_widget_show ( box ) ;
2003-07-08 18:20:45 +00:00
gtk_button_set_relief ( GTK_BUTTON ( button - > priv - > button ) ,
2003-06-29 23:34:20 +00:00
gtk_tool_item_get_relief_style ( GTK_TOOL_ITEM ( button ) ) ) ;
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 ;
case PROP_STOCK_ID :
gtk_tool_button_set_stock_id ( button , g_value_get_string ( 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
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 ;
case PROP_STOCK_ID :
2003-07-08 18:20:45 +00:00
g_value_set_string ( value , button - > priv - > stock_id ) ;
2003-06-29 23:34:20 +00:00
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 - > stock_id ) ;
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 ) ;
2003-07-13 19:29:54 +00:00
2003-06-29 23:34:20 +00:00
parent_class - > finalize ( object ) ;
}
2003-07-03 01:02:04 +00:00
static GtkWidget *
clone_image_menu_size ( GtkImage * image , GtkSettings * settings )
{
GtkImageType storage_type = gtk_image_get_storage_type ( image ) ;
if ( storage_type = = GTK_IMAGE_STOCK )
{
gchar * stock_id ;
gtk_image_get_stock ( image , & stock_id , NULL ) ;
return gtk_image_new_from_stock ( stock_id , GTK_ICON_SIZE_MENU ) ;
}
2010-01-26 14:41:00 +00:00
else if ( storage_type = = GTK_IMAGE_ICON_NAME )
{
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 ) ;
}
2003-07-03 01:02:04 +00:00
else if ( storage_type = = GTK_IMAGE_ICON_SET )
{
GtkIconSet * icon_set ;
gtk_image_get_icon_set ( image , & icon_set , NULL ) ;
return gtk_image_new_from_icon_set ( icon_set , 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 ;
if ( settings & &
gtk_icon_size_lookup_for_settings ( settings , GTK_ICON_SIZE_MENU ,
& width , & height ) )
{
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 ;
}
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 ;
GtkStockItem stock_item ;
gboolean use_mnemonic = TRUE ;
2003-07-03 01:02:04 +00:00
const char * 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 ;
2008-02-06 09:53:34 +00:00
if ( GTK_IS_LABEL ( button - > priv - > label_widget ) )
2003-07-03 01:02:04 +00:00
{
2003-07-08 18:20:45 +00:00
label = gtk_label_get_label ( GTK_LABEL ( button - > priv - > label_widget ) ) ;
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
{
2003-07-08 18:20:45 +00:00
label = button - > priv - > label_text ;
use_mnemonic = button - > priv - > use_underline ;
2003-06-29 23:34:20 +00:00
}
2003-07-08 18:20:45 +00:00
else if ( button - > priv - > stock_id & & gtk_stock_lookup ( button - > priv - > stock_id , & stock_item ) )
2003-07-03 01:02:04 +00:00
{
label = stock_item . label ;
}
else
{
label = " " ;
}
2003-06-29 23:34:20 +00:00
if ( use_mnemonic )
menu_item = gtk_image_menu_item_new_with_mnemonic ( label ) ;
else
menu_item = gtk_image_menu_item_new_with_label ( label ) ;
2008-02-06 09:53:34 +00:00
if ( GTK_IS_IMAGE ( button - > priv - > icon_widget ) )
2003-06-29 23:34:20 +00:00
{
2003-07-08 18:20:45 +00:00
menu_image = clone_image_menu_size ( GTK_IMAGE ( button - > priv - > icon_widget ) ,
2003-07-03 01:02:04 +00:00
gtk_widget_get_settings ( GTK_WIDGET ( button ) ) ) ;
2003-06-29 23:34:20 +00:00
}
2003-07-08 18:20:45 +00:00
else if ( button - > priv - > stock_id )
2003-06-29 23:34:20 +00:00
{
2003-07-08 18:20:45 +00:00
menu_image = gtk_image_new_from_stock ( button - > priv - > stock_id , GTK_ICON_SIZE_MENU ) ;
2003-06-29 23:34:20 +00:00
}
if ( menu_image )
gtk_image_menu_item_set_image ( GTK_IMAGE_MENU_ITEM ( menu_item ) , menu_image ) ;
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 )
{
2009-01-23 15:15:28 +00:00
GtkAction * action ;
action = gtk_activatable_get_related_action ( GTK_ACTIVATABLE ( button ) ) ;
if ( action )
gtk_action_activate ( action ) ;
2003-06-29 23:34:20 +00:00
g_signal_emit_by_name ( button , " clicked " ) ;
}
static void
gtk_tool_button_toolbar_reconfigured ( GtkToolItem * tool_item )
{
gtk_tool_button_construct_contents ( tool_item ) ;
}
2006-06-08 13:59:34 +00:00
static void
gtk_tool_button_update_icon_spacing ( GtkToolButton * button )
{
GtkWidget * box ;
guint spacing ;
2010-05-24 20:31:36 +00:00
box = gtk_bin_get_child ( GTK_BIN ( button - > priv - > button ) ) ;
2006-06-08 13:59:34 +00:00
if ( GTK_IS_BOX ( box ) )
{
gtk_widget_style_get ( GTK_WIDGET ( button ) ,
" icon-spacing " , & spacing ,
NULL ) ;
gtk_box_set_spacing ( GTK_BOX ( box ) , spacing ) ;
}
}
2006-06-01 13:42:14 +00:00
static void
2011-01-04 01:06:32 +00:00
gtk_tool_button_style_updated ( GtkWidget * widget )
2006-06-01 13:42:14 +00:00
{
2011-02-07 12:30:37 +00:00
GTK_WIDGET_CLASS ( parent_class ) - > style_updated ( widget ) ;
2006-06-08 13:59:34 +00:00
gtk_tool_button_update_icon_spacing ( GTK_TOOL_BUTTON ( widget ) ) ;
2006-06-01 13:42:14 +00:00
}
2009-01-23 15:15:28 +00:00
static void
gtk_tool_button_activatable_interface_init ( GtkActivatableIface * iface )
{
parent_activatable_iface = g_type_interface_peek_parent ( iface ) ;
2009-02-22 05:20:14 +00:00
iface - > update = gtk_tool_button_update ;
iface - > sync_action_properties = gtk_tool_button_sync_action_properties ;
2009-01-23 15:15:28 +00:00
}
static void
2009-02-22 05:20:14 +00:00
gtk_tool_button_update ( GtkActivatable * activatable ,
GtkAction * action ,
const gchar * property_name )
2009-01-23 15:15:28 +00:00
{
GtkToolButton * button ;
GtkWidget * image ;
parent_activatable_iface - > update ( activatable , action , property_name ) ;
if ( ! gtk_activatable_get_use_action_appearance ( activatable ) )
return ;
button = GTK_TOOL_BUTTON ( activatable ) ;
if ( strcmp ( property_name , " short-label " ) = = 0 )
2009-02-07 03:17:43 +00:00
gtk_tool_button_set_label ( button , gtk_action_get_short_label ( action ) ) ;
2009-01-23 15:15:28 +00:00
else if ( strcmp ( property_name , " stock-id " ) = = 0 )
2009-02-07 03:17:43 +00:00
gtk_tool_button_set_stock_id ( button , gtk_action_get_stock_id ( action ) ) ;
2009-01-23 15:15:28 +00:00
else if ( strcmp ( property_name , " gicon " ) = = 0 )
{
const gchar * stock_id = gtk_action_get_stock_id ( action ) ;
GIcon * icon = gtk_action_get_gicon ( action ) ;
GtkIconSize icon_size = GTK_ICON_SIZE_BUTTON ;
if ( ( stock_id & & gtk_icon_factory_lookup_default ( stock_id ) ) | | ! icon )
image = NULL ;
else
{
image = gtk_tool_button_get_icon_widget ( button ) ;
icon_size = gtk_tool_item_get_icon_size ( GTK_TOOL_ITEM ( button ) ) ;
if ( ! image )
image = gtk_image_new ( ) ;
}
gtk_tool_button_set_icon_widget ( button , image ) ;
gtk_image_set_from_gicon ( GTK_IMAGE ( image ) , icon , icon_size ) ;
}
else if ( strcmp ( property_name , " icon-name " ) = = 0 )
2009-02-07 03:17:43 +00:00
gtk_tool_button_set_icon_name ( button , gtk_action_get_icon_name ( action ) ) ;
2009-01-23 15:15:28 +00:00
}
static void
2009-02-22 05:20:14 +00:00
gtk_tool_button_sync_action_properties ( GtkActivatable * activatable ,
GtkAction * action )
2009-01-23 15:15:28 +00:00
{
GtkToolButton * button ;
GIcon * icon ;
2009-01-24 22:00:07 +00:00
const gchar * stock_id ;
2009-01-23 15:15:28 +00:00
2009-02-22 05:20:14 +00:00
parent_activatable_iface - > sync_action_properties ( activatable , action ) ;
2009-01-23 15:15:28 +00:00
if ( ! action )
return ;
if ( ! gtk_activatable_get_use_action_appearance ( activatable ) )
return ;
button = GTK_TOOL_BUTTON ( activatable ) ;
2009-01-24 22:00:07 +00:00
stock_id = gtk_action_get_stock_id ( action ) ;
gtk_tool_button_set_label ( button , gtk_action_get_short_label ( action ) ) ;
2009-01-23 15:15:28 +00:00
gtk_tool_button_set_use_underline ( button , TRUE ) ;
2009-01-24 22:00:07 +00:00
gtk_tool_button_set_stock_id ( button , stock_id ) ;
gtk_tool_button_set_icon_name ( button , gtk_action_get_icon_name ( action ) ) ;
if ( stock_id & & gtk_icon_factory_lookup_default ( stock_id ) )
gtk_tool_button_set_icon_widget ( button , NULL ) ;
2009-01-23 15:15:28 +00:00
else if ( ( icon = gtk_action_get_gicon ( action ) ) ! = NULL )
{
GtkIconSize icon_size = gtk_tool_item_get_icon_size ( GTK_TOOL_ITEM ( button ) ) ;
GtkWidget * image = gtk_tool_button_get_icon_widget ( button ) ;
if ( ! image )
{
image = gtk_image_new ( ) ;
gtk_widget_show ( image ) ;
gtk_tool_button_set_icon_widget ( button , image ) ;
}
gtk_image_set_from_gicon ( GTK_IMAGE ( image ) , icon , icon_size ) ;
}
else if ( gtk_action_get_icon_name ( action ) )
gtk_tool_button_set_icon_name ( button , gtk_action_get_icon_name ( action ) ) ;
else
gtk_tool_button_set_label ( button , gtk_action_get_short_label ( action ) ) ;
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_new_from_stock :
* @ stock_id : the name of the stock item
*
* Creates a new # GtkToolButton containing the image and text from a
* stock item . Some stock ids have preprocessor macros like # GTK_STOCK_OK
* and # GTK_STOCK_APPLY .
*
* It is an error if @ stock_id is not a name of a stock item .
*
* Return value : A new # GtkToolButton
*
* Since : 2.4
* */
2003-06-29 23:34:20 +00:00
GtkToolItem *
gtk_tool_button_new_from_stock ( const gchar * stock_id )
{
GtkToolButton * button ;
g_return_val_if_fail ( stock_id ! = NULL , NULL ) ;
button = g_object_new ( GTK_TYPE_TOOL_BUTTON ,
2005-03-26 05:49:15 +00:00
" stock-id " , stock_id ,
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_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
*
2011-09-27 21:06:59 +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
*
2003-08-04 21:13:55 +00:00
* Return value : A new # GtkToolButton
*
* 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 .
*
2003-08-04 21:13:55 +00:00
* Sets @ label as the label used for the tool button . The " label " property
* only has an effect if not overridden by a non - % NULL " label_widget " property .
* If both the " label_widget " and " label " properties are % NULL , the label
* is determined by the " stock_id " property . If the " stock_id " property is also
* % NULL , @ button will not have a label .
*
* 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
*
* Returns the label used by the tool button , or % NULL if the tool button
* doesn ' t have a label . or uses a the label from a stock item . The returned
* string is owned by GTK + , and must not be modified or freed .
*
* Return value : The label , or % NULL
*
* 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
* @ use_underline : whether the button label has the form " _Open "
*
* 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
* 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
* menu will have an underlined ' O ' .
*
* 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 ( ) .
*
* Return value : % TRUE if underscores in the label property are used as
* 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
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_set_stock_id :
* @ button : a # GtkToolButton
2009-12-10 10:23:40 +00:00
* @ stock_id : ( allow - none ) : a name of a stock item , or % NULL
*
2003-08-04 21:13:55 +00:00
* Sets the name of the stock item . See gtk_tool_button_new_from_stock ( ) .
* The stock_id property only has an effect if not
* overridden by non - % NULL " label " and " icon_widget " properties .
*
* Since : 2.4
* */
2003-06-29 23:34:20 +00:00
void
gtk_tool_button_set_stock_id ( GtkToolButton * button ,
const gchar * stock_id )
{
gchar * old_stock_id ;
g_return_if_fail ( GTK_IS_TOOL_BUTTON ( button ) ) ;
2003-07-08 18:20:45 +00:00
old_stock_id = button - > priv - > stock_id ;
2003-06-29 23:34:20 +00:00
2003-07-08 18:20:45 +00:00
button - > priv - > stock_id = g_strdup ( stock_id ) ;
2007-01-28 03:16:30 +00:00
button - > priv - > contents_invalid = TRUE ;
2003-06-29 23:34:20 +00:00
g_free ( old_stock_id ) ;
2007-01-28 03:16:30 +00:00
g_object_notify ( G_OBJECT ( button ) , " stock-id " ) ;
2003-06-29 23:34:20 +00:00
}
2003-08-04 21:13:55 +00:00
/**
* gtk_tool_button_get_stock_id :
* @ button : a # GtkToolButton
*
* Returns the name of the stock item . See gtk_tool_button_set_stock_id ( ) .
* The returned string is owned by GTK + and must not be freed or modifed .
*
* Return value : the name of the stock item for @ button .
*
* 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_stock_id ( GtkToolButton * button )
{
g_return_val_if_fail ( GTK_IS_TOOL_BUTTON ( button ) , NULL ) ;
2003-07-08 18:20:45 +00:00
return button - > priv - > stock_id ;
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 .
* The " icon_name " property only has an effect if not
* overridden by non - % NULL " label " , " icon_widget " and " stock_id "
* properties .
*
* 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 ( ) .
*
* Returns : the icon name or % NULL if the tool button has
* 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
*
2003-08-04 21:13:55 +00:00
* Sets @ icon as the widget used as icon on @ button . If @ icon_widget is
* % NULL the icon is determined by the " stock_id " property . If the
* " stock_id " property is also % NULL , @ button will not have an icon .
*
* 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
* for @ button . If @ label_widget is % NULL the " label " property is used
* as label . If " label " is also % NULL , the label in the stock item
* determined by the " stock_id " property is used as label . If
* " stock_id " is also % NULL , @ button does not have a label .
*
* 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 ( ) .
*
* Return value : ( transfer none ) : The widget used as label
* 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 ( ) .
*
* Return value : ( transfer none ) : The widget used as icon
* 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
}