Mercurial > pidgin.yaz
diff console/libgnt/gntwidget.c @ 14900:065e7ac30338
[gaim-migrate @ 17672]
Rearranging a bunch of stuff. Users shouldn't notice any change, apart from
the added ability to bind keys for the window-manager. I will update the manual
in a while.
I need to know how to revert a commit in case things go terribly wrong.
... I am going to remind everyone that Dido is AWESOME!
committer: Tailor Script <tailor@pidgin.im>
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Sun, 05 Nov 2006 17:28:33 +0000 |
parents | 5228f8cf2a6a |
children | 056c8a27668c |
line wrap: on
line diff
--- a/console/libgnt/gntwidget.c Sun Nov 05 14:57:05 2006 +0000 +++ b/console/libgnt/gntwidget.c Sun Nov 05 17:28:33 2006 +0000 @@ -84,29 +84,13 @@ } static gboolean -context_menu(GntWidget *widget, GList *null) +context_menu(GntBindable *bind, GList *null) { gboolean ret = FALSE; - g_signal_emit(widget, signals[SIG_CONTEXT_MENU], 0, &ret); + g_signal_emit(bind, signals[SIG_CONTEXT_MENU], 0, &ret); return ret; } -static gboolean -gnt_boolean_handled_accumulator(GSignalInvocationHint *ihint, - GValue *return_accu, - const GValue *handler_return, - gpointer dummy) -{ - gboolean continue_emission; - gboolean signal_handled; - - signal_handled = g_value_get_boolean (handler_return); - g_value_set_boolean (return_accu, signal_handled); - continue_emission = !signal_handled; - - return continue_emission; -} - static void gnt_widget_class_init(GntWidgetClass *klass) { @@ -252,17 +236,11 @@ gnt_closure_marshal_BOOLEAN__VOID, G_TYPE_BOOLEAN, 0); - klass->actions = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, - (GDestroyNotify)gnt_widget_action_free); - klass->bindings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, - (GDestroyNotify)gnt_widget_action_param_free); - /* This is relevant for all widgets */ - gnt_widget_class_register_action(klass, "context-menu", context_menu, + gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "context-menu", context_menu, GNT_KEY_POPUP, NULL); - gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), klass); - + gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), GNT_BINDABLE_CLASS(klass)); GNTDEBUG; } @@ -287,7 +265,7 @@ gnt_widget_init, /* instance_init */ }; - type = g_type_register_static(G_TYPE_OBJECT, + type = g_type_register_static(GNT_TYPE_BINDABLE, "GntWidget", &info, G_TYPE_FLAG_ABSTRACT); } @@ -295,30 +273,6 @@ return type; } -static const char * -gnt_widget_remap_keys(GntWidget *widget, const char *text) -{ - const char *remap = NULL; - GType type = G_OBJECT_TYPE(widget); - GntWidgetClass *klass = GNT_WIDGET_CLASS(G_OBJECT_GET_CLASS(widget)); - - if (klass->remaps == NULL) - { - klass->remaps = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - gnt_styles_get_keyremaps(type, klass->remaps); - } - - remap = g_hash_table_lookup(klass->remaps, text); - - return (remap ? remap : text); -} - -static void -gnt_widget_take_focus(GntWidget *widget) -{ - gnt_screen_take_focus(widget); -} - void gnt_widget_set_take_focus(GntWidget *widget, gboolean can) { if (can) @@ -350,10 +304,9 @@ gnt_widget_show(GntWidget *widget) { /* Draw the widget and take focus */ - if (GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_CAN_TAKE_FOCUS) - { - gnt_widget_take_focus(widget); - } + /*if (GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_CAN_TAKE_FOCUS) {*/ + /*gnt_widget_take_focus(widget);*/ + /*}*/ gnt_widget_draw(widget); } @@ -365,10 +318,8 @@ return; GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_DRAWING); - if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_MAPPED)) - { + if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_MAPPED)) { gnt_widget_map(widget); - gnt_screen_occupy(widget); } if (widget->window == NULL) @@ -405,6 +356,7 @@ widget->priv.y, widget->priv.x); } init_widget(widget); + gnt_screen_occupy(widget); } g_signal_emit(widget, signals[SIG_DRAW], 0); @@ -413,55 +365,16 @@ } gboolean -gnt_widget_perform_action_named(GntWidget *widget, const char *name, ...) -{ - GntWidgetClass *klass = GNT_WIDGET_CLASS(G_OBJECT_GET_CLASS(widget)); - GList *list = NULL; - va_list args; - GntWidgetAction *action; - void *p; - - va_start(args, name); - while ((p = va_arg(args, void *)) != NULL) - list = g_list_append(list, p); - va_end(args); - - action = g_hash_table_lookup(klass->actions, name); - if (action && action->u.action) { - if (list) - return action->u.action(widget, list); - else - return action->u.action_noparam(widget); - } - return FALSE; -} - -static gboolean -gnt_widget_perform_action(GntWidget *widget, const char *keys) -{ - GntWidgetClass *klass = GNT_WIDGET_CLASS(G_OBJECT_GET_CLASS(widget)); - GntWidgetActionParam *param = g_hash_table_lookup(klass->bindings, keys); - - if (param && param->action) { - if (param->list) - return param->action->u.action(widget, param->list); - else - return param->action->u.action_noparam(widget); - } - return FALSE; -} - -gboolean gnt_widget_key_pressed(GntWidget *widget, const char *keys) { gboolean ret; if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_CAN_TAKE_FOCUS)) return FALSE; - if (gnt_widget_perform_action(widget, keys)) + if (gnt_bindable_perform_action_key(GNT_BINDABLE(widget), keys)) return TRUE; - keys = gnt_widget_remap_keys(widget, keys); + keys = gnt_bindable_remap_keys(GNT_BINDABLE(widget), keys); g_signal_emit(widget, signals[SIG_KEY_PRESSED], 0, keys, &ret); return ret; } @@ -707,83 +620,3 @@ gnt_style_get_bool(GNT_STYLE_SHADOW, FALSE)); } -static void -register_binding(GntWidgetClass *klass, const char *name, const char *trigger, GList *list) -{ - GntWidgetActionParam *param; - GntWidgetAction *action; - - if (name == NULL || *name == '\0') { - g_hash_table_remove(klass->bindings, (char*)trigger); - return; - } - - action = g_hash_table_lookup(klass->actions, name); - if (!action) { - g_printerr("GntWidget: Invalid action name %s for %s\n", - name, g_type_name(G_OBJECT_CLASS_TYPE(klass))); - if (list) - g_list_free(list); - return; - } - - param = g_new0(GntWidgetActionParam, 1); - param->action = action; - param->list = list; - g_hash_table_replace(klass->bindings, g_strdup(trigger), param); -} - -void gnt_widget_register_binding(GntWidgetClass *klass, const char *name, - const char *trigger, ...) -{ - GList *list = NULL; - va_list args; - void *data; - - va_start(args, trigger); - while ((data = va_arg(args, void *))) { - list = g_list_append(list, data); - } - va_end(args); - - register_binding(klass, name, trigger, list); -} - -void gnt_widget_class_register_action(GntWidgetClass *klass, const char *name, - GntWidgetActionCallback callback, - const char *trigger, ...) -{ - void *data; - va_list args; - GntWidgetAction *action = g_new0(GntWidgetAction, 1); - GList *list; - - action->name = g_strdup(name); - action->u.action = callback; - - g_hash_table_replace(klass->actions, g_strdup(name), action); - - if (trigger) { - list = NULL; - va_start(args, trigger); - while ((data = va_arg(args, void *))) { - list = g_list_append(list, data); - } - va_end(args); - - register_binding(klass, name, trigger, list); - } -} - -void gnt_widget_action_free(GntWidgetAction *action) -{ - g_free(action->name); - g_free(action); -} - -void gnt_widget_action_param_free(GntWidgetActionParam *param) -{ - g_list_free(param->list); /* XXX: There may be a leak here for string parameters */ - g_free(param); -} -