gtkdialog: Allow specifying response IDs by nick in <action-widgets>

This makes it a lot more convenient for developers, as they don't
have to look up the numeric value of response IDs.
This commit is contained in:
Jasper St. Pierre
2013-10-28 11:19:43 -04:00
parent 0e86f37e82
commit baa471ec13

View File

@ -40,6 +40,7 @@
#include "gtkprivate.h" #include "gtkprivate.h"
#include "gtkbuildable.h" #include "gtkbuildable.h"
#include "gtksettings.h" #include "gtksettings.h"
#include "gtktypebuiltins.h"
#include "deprecated/gtkstock.h" #include "deprecated/gtkstock.h"
/** /**
@ -158,8 +159,8 @@
* </object> * </object>
* </child> * </child>
* <action-widgets> * <action-widgets>
* <action-widget response="3">button_ok</action-widget> * <action-widget response="ok">button_ok</action-widget>
* <action-widget response="-5">button_cancel</action-widget> * <action-widget response="cancel">button_cancel</action-widget>
* </action-widgets> * </action-widgets>
* </object> * </object>
* ]]></programlisting> * ]]></programlisting>
@ -1344,7 +1345,7 @@ gtk_dialog_set_alternative_button_order_from_array (GtkDialog *dialog,
typedef struct { typedef struct {
gchar *widget_name; gchar *widget_name;
gchar *response_id; gint response_id;
} ActionWidgetInfo; } ActionWidgetInfo;
typedef struct { typedef struct {
@ -1354,6 +1355,31 @@ typedef struct {
gchar *response; gchar *response;
} ActionWidgetsSubParserData; } ActionWidgetsSubParserData;
static gint
parse_response_id (gchar *response_attr)
{
int response_id;
GEnumClass *enum_class = NULL;
GEnumValue *enum_value;
response_id = g_ascii_strtoll (response_attr, NULL, 10);
if (response_id != 0)
goto out;
enum_class = g_type_class_ref (GTK_TYPE_RESPONSE_TYPE);
enum_value = g_enum_get_value_by_nick (enum_class, response_attr);
if (enum_value == NULL)
goto out;
response_id = enum_value->value;
out:
if (enum_class)
g_type_class_unref (enum_class);
return response_id;
}
static void static void
attributes_start_element (GMarkupParseContext *context, attributes_start_element (GMarkupParseContext *context,
const gchar *element_name, const gchar *element_name,
@ -1392,7 +1418,8 @@ attributes_text_element (GMarkupParseContext *context,
item = g_new (ActionWidgetInfo, 1); item = g_new (ActionWidgetInfo, 1);
item->widget_name = g_strndup (text, text_len); item->widget_name = g_strndup (text, text_len);
item->response_id = parser_data->response; item->response_id = parse_response_id (parser_data->response);
g_free (parser_data->response);
parser_data->items = g_slist_prepend (parser_data->items, item); parser_data->items = g_slist_prepend (parser_data->items, item);
parser_data->response = NULL; parser_data->response = NULL;
} }
@ -1471,7 +1498,7 @@ gtk_dialog_buildable_custom_finished (GtkBuildable *buildable,
} }
ad = get_response_data (GTK_WIDGET (object), TRUE); ad = get_response_data (GTK_WIDGET (object), TRUE);
ad->response_id = g_ascii_strtoll (item->response_id, NULL, 10); ad->response_id = item->response_id;
if (GTK_IS_BUTTON (object)) if (GTK_IS_BUTTON (object))
signal_id = g_signal_lookup ("clicked", GTK_TYPE_BUTTON); signal_id = g_signal_lookup ("clicked", GTK_TYPE_BUTTON);
@ -1496,7 +1523,6 @@ gtk_dialog_buildable_custom_finished (GtkBuildable *buildable,
GTK_WIDGET (object), TRUE); GTK_WIDGET (object), TRUE);
g_free (item->widget_name); g_free (item->widget_name);
g_free (item->response_id);
g_free (item); g_free (item);
} }
g_slist_free (parser_data->items); g_slist_free (parser_data->items);