33
33
typedef struct _GeanyMenubuttonActionPrivate GeanyMenubuttonActionPrivate;
35
#define GEANY_MENU_BUTTON_ACTION_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), \
36
GEANY_MENU_BUTTON_ACTION_TYPE, GeanyMenubuttonActionPrivate))
35
#define GEANY_MENU_BUTTON_ACTION_GET_PRIVATE(obj) (GEANY_MENU_BUTTON_ACTION(obj)->priv)
39
38
struct _GeanyMenubuttonActionPrivate
49
56
static guint signals[LAST_SIGNAL];
52
G_DEFINE_TYPE(GeanyMenubuttonAction, geany_menu_button_action, GTK_TYPE_ACTION);
59
G_DEFINE_TYPE(GeanyMenubuttonAction, geany_menu_button_action, GTK_TYPE_ACTION)
55
62
static void geany_menu_button_action_finalize(GObject *object)
79
static void set_arrow_tooltip(GtkMenuToolButton *button, const gchar *tooltip)
81
#if GTK_CHECK_VERSION(2, 12, 0)
82
gtk_menu_tool_button_set_arrow_tooltip_text(button, tooltip);
84
static GtkTooltips *tooltips = NULL;
86
if (G_UNLIKELY(tooltips == NULL))
87
tooltips = gtk_tooltips_new();
89
gtk_menu_tool_button_set_arrow_tooltip(button, tooltips, tooltip, NULL);
94
static void geany_menu_button_action_set_property(GObject *object, guint prop_id,
95
const GValue *value, GParamSpec *pspec)
99
case PROP_TOOLTIP_ARROW:
101
GeanyMenubuttonActionPrivate *priv = GEANY_MENU_BUTTON_ACTION_GET_PRIVATE(object);
102
g_free(priv->tooltip_arrow);
103
priv->tooltip_arrow = g_value_dup_string(value);
107
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
113
static GtkWidget *geany_menu_button_action_create_tool_item(GtkAction *action)
116
GeanyMenubuttonActionPrivate *priv = GEANY_MENU_BUTTON_ACTION_GET_PRIVATE(action);
118
toolitem = g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, NULL);
119
set_arrow_tooltip(GTK_MENU_TOOL_BUTTON(toolitem), priv->tooltip_arrow);
71
125
static void geany_menu_button_action_class_init(GeanyMenubuttonActionClass *klass)
73
127
GtkActionClass *action_class = GTK_ACTION_CLASS(klass);
74
128
GObjectClass *g_object_class = G_OBJECT_CLASS(klass);
76
130
g_object_class->finalize = geany_menu_button_action_finalize;
131
g_object_class->set_property = geany_menu_button_action_set_property;
78
133
action_class->activate = delegate_button_activated;
134
action_class->create_tool_item = geany_menu_button_action_create_tool_item;
79
135
action_class->toolbar_item_type = GTK_TYPE_MENU_TOOL_BUTTON;
81
137
g_type_class_add_private(klass, sizeof(GeanyMenubuttonActionPrivate));
139
g_object_class_install_property(g_object_class,
144
"A special tooltip for the arrow button",
83
148
signals[BUTTON_CLICKED] = g_signal_new("button-clicked",
84
149
G_TYPE_FROM_CLASS(klass),
94
159
static void geany_menu_button_action_init(GeanyMenubuttonAction *action)
161
GeanyMenubuttonActionPrivate *priv;
163
action->priv = G_TYPE_INSTANCE_GET_PRIVATE(action,
164
GEANY_MENU_BUTTON_ACTION_TYPE, GeanyMenubuttonActionPrivate);
167
priv->tooltip_arrow = NULL;
100
172
GtkAction *geany_menu_button_action_new(const gchar *name,
101
173
const gchar *label,
102
174
const gchar *tooltip,
175
const gchar *tooltip_arrow,
103
176
const gchar *stock_id)
105
178
GtkAction *action = g_object_new(GEANY_MENU_BUTTON_ACTION_TYPE,
108
181
"tooltip", tooltip,
182
"tooltip-arrow", tooltip_arrow,
109
183
"stock-id", stock_id,
216
foreach_slist(l, gtk_action_get_proxies(GTK_ACTION(action)))
144
foreach_slist(l, gtk_action_get_proxies(GTK_ACTION(action)))
218
/* On Windows a GtkImageMenuItem proxy is created for whatever reason. So we filter
219
* by type and act only on GtkMenuToolButton proxies. */
220
/* TODO find why the GtkImageMenuItem proxy is created */
221
if (! GTK_IS_MENU_TOOL_BUTTON(l->data))
146
226
if (gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(l->data)) == NULL)
147
227
gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(l->data), priv->menu);
152
foreach_slist(l, gtk_action_get_proxies(GTK_ACTION(action)))
154
230
gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(l->data), NULL);