From: <sa...@us...> - 2007-03-30 05:49:43
|
Revision: 18220 http://svn.sourceforge.net/gaim/?rev=18220&view=rev Author: sadrul Date: 2007-03-29 22:49:39 -0700 (Thu, 29 Mar 2007) Log Message: ----------- A lot of stuff. Some memory leaks, some bug fixes, some new features. Pretty much everything you could want in a commit. Modified Paths: -------------- trunk/console/libgnt/Makefile.am trunk/console/libgnt/gnt-skel.h trunk/console/libgnt/gnt.h trunk/console/libgnt/gnt.pc.in trunk/console/libgnt/gntbindable.c trunk/console/libgnt/gntbindable.h trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbox.h trunk/console/libgnt/gntbutton.c trunk/console/libgnt/gntbutton.h trunk/console/libgnt/gntcheckbox.c trunk/console/libgnt/gntcheckbox.h trunk/console/libgnt/gntcolors.c trunk/console/libgnt/gntcolors.h trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gntcombobox.h trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntentry.h trunk/console/libgnt/gntfilesel.c trunk/console/libgnt/gntfilesel.h trunk/console/libgnt/gntkeys.c trunk/console/libgnt/gntkeys.h trunk/console/libgnt/gntlabel.c trunk/console/libgnt/gntlabel.h trunk/console/libgnt/gntline.c trunk/console/libgnt/gntline.h trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntmenu.c trunk/console/libgnt/gntmenu.h trunk/console/libgnt/gntmenuitem.c trunk/console/libgnt/gntmenuitem.h trunk/console/libgnt/gntmenuitemcheck.c trunk/console/libgnt/gntmenuitemcheck.h trunk/console/libgnt/gntstyle.c trunk/console/libgnt/gntstyle.h trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttextview.h trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h trunk/console/libgnt/gntwidget.c trunk/console/libgnt/gntwidget.h trunk/console/libgnt/gntwindow.c trunk/console/libgnt/gntwindow.h trunk/console/libgnt/gntwm.c trunk/console/libgnt/gntwm.h trunk/console/libgnt/test/key.c trunk/console/libgnt/test/menu.c trunk/console/libgnt/test/tv.c Added Paths: ----------- trunk/console/libgnt/gntclipboard.c trunk/console/libgnt/gntclipboard.h Modified: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/Makefile.am 2007-03-30 05:49:39 UTC (rev 18220) @@ -13,6 +13,7 @@ gntbox.c \ gntbutton.c \ gntcheckbox.c \ + gntclipboard.c \ gntcolors.c \ gntcombobox.c \ gntentry.c \ @@ -37,6 +38,7 @@ gntbox.h \ gntbutton.h \ gntcheckbox.h \ + gntclipboard.h \ gntcolors.h \ gntcombobox.h \ gntentry.h \ @@ -61,7 +63,8 @@ gntmarshal.c gntmarshal.c: genmarshal gntmarshal.h - cat genmarshal | glib-genmarshal --prefix=gnt_closure_marshal --body > $@ + echo "#include \"gntmarshal.h\"" > $@ + cat genmarshal | glib-genmarshal --prefix=gnt_closure_marshal --body >> $@ gntmarshal.h: genmarshal cat genmarshal | glib-genmarshal --prefix=gnt_closure_marshal --header > $@ @@ -75,8 +78,8 @@ libgnt_la_LIBADD = \ $(GLIB_LIBS) \ $(GNT_LIBS) - AM_CPPFLAGS = \ $(GLIB_CFLAGS) \ - $(GNT_CFLAGS) + $(GNT_CFLAGS) \ + $(DEBUG_CFLAGS) Modified: trunk/console/libgnt/gnt-skel.h =================================================================== --- trunk/console/libgnt/gnt-skel.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gnt-skel.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -17,16 +17,16 @@ #define GNT_SKEL_SET_FLAGS(obj, flags) (GNT_SKEL_FLAGS(obj) |= flags) #define GNT_SKEL_UNSET_FLAGS(obj, flags) (GNT_SKEL_FLAGS(obj) &= ~(flags)) -typedef struct _GnSkel GntSkel; -typedef struct _GnSkelPriv GntSkelPriv; -typedef struct _GnSkelClass GntSkelClass; +typedef struct _GntSkel GntSkel; +typedef struct _GntSkelPriv GntSkelPriv; +typedef struct _GntSkelClass GntSkelClass; -struct _GnSkel +struct _GntSkel { GntWidget parent; }; -struct _GnSkelClass +struct _GntSkelClass { GntWidgetClass parent; Modified: trunk/console/libgnt/gnt.h =================================================================== --- trunk/console/libgnt/gnt.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gnt.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -1,13 +1,14 @@ #include <glib.h> #include "gntwidget.h" +#include "gntclipboard.h" #include "gntcolors.h" #include "gntkeys.h" -void gnt_init(); +void gnt_init(void); -void gnt_main(); +void gnt_main(void); -gboolean gnt_ascii_only(); +gboolean gnt_ascii_only(void); void gnt_screen_occupy(GntWidget *widget); @@ -15,8 +16,6 @@ void gnt_screen_update(GntWidget *widget); -void gnt_screen_take_focus(GntWidget *widget); - void gnt_screen_resize_widget(GntWidget *widget, int width, int height); void gnt_screen_move_widget(GntWidget *widget, int x, int y); @@ -31,5 +30,10 @@ gboolean gnt_screen_menu_show(gpointer menu); -void gnt_quit(); +void gnt_quit(void); +GntClipboard *gnt_get_clipboard(void); + +gchar *gnt_get_clipboard_string(void); + +void gnt_set_clipboard_string(gchar *string); Modified: trunk/console/libgnt/gnt.pc.in =================================================================== --- trunk/console/libgnt/gnt.pc.in 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gnt.pc.in 2007-03-30 05:49:39 UTC (rev 18220) @@ -2,11 +2,12 @@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ +datarootdir=@datarootdir@ datadir=@datadir@ sysconfdir=@sysconfdir@ Name: LibGNT -Description: Gaim Ncurses Toolkit is a collection of curses-widgets. +Description: Glib Ncurses Toolkit is a collection of curses-widgets. Version: @VERSION@ Requires: glib-2.0 Cflags: -I${includedir}/gnt Modified: trunk/console/libgnt/gntbindable.c =================================================================== --- trunk/console/libgnt/gntbindable.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntbindable.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -77,6 +77,7 @@ sizeof(GntBindable), 0, /* n_preallocs */ NULL, /* instance_init */ + NULL /* value_table */ }; type = g_type_register_static(G_TYPE_OBJECT, @@ -155,6 +156,7 @@ if (name == NULL || *name == '\0') { g_hash_table_remove(klass->bindings, (char*)trigger); + gnt_keys_del_combination(trigger); return; } @@ -171,6 +173,7 @@ param->action = action; param->list = list; g_hash_table_replace(klass->bindings, g_strdup(trigger), param); + gnt_keys_add_combination(trigger); } void gnt_bindable_register_binding(GntBindableClass *klass, const char *name, Modified: trunk/console/libgnt/gntbindable.h =================================================================== --- trunk/console/libgnt/gntbindable.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntbindable.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -13,17 +13,17 @@ #define GNT_IS_BINDABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_BINDABLE)) #define GNT_BINDABLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_BINDABLE, GntBindableClass)) -#define GNTDEBUG fprintf(stderr, "%s\n", __FUNCTION__) +#define GNTDEBUG g_printerr("%s\n", __FUNCTION__) -typedef struct _GnBindable GntBindable; -typedef struct _GnBindableClass GntBindableClass; +typedef struct _GntBindable GntBindable; +typedef struct _GntBindableClass GntBindableClass; -struct _GnBindable +struct _GntBindable { GObject inherit; }; -struct _GnBindableClass +struct _GntBindableClass { GObjectClass parent; @@ -52,10 +52,10 @@ typedef gboolean (*GntBindableActionCallback) (GntBindable *bindable, GList *params); typedef gboolean (*GntBindableActionCallbackNoParam)(GntBindable *bindable); -typedef struct _GnBindableAction GntBindableAction; -typedef struct _GnBindableActionParam GntBindableActionParam; +typedef struct _GntBindableAction GntBindableAction; +typedef struct _GntBindableActionParam GntBindableActionParam; -struct _GnBindableAction +struct _GntBindableAction { char *name; /* The name of the action */ union { @@ -64,7 +64,7 @@ } u; }; -struct _GnBindableActionParam +struct _GntBindableActionParam { GntBindableAction *action; GList *list; Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntbox.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -62,7 +62,7 @@ else wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TITLE_D)); mvwaddch(widget->window, 0, pos-1, ACS_RTEE | COLOR_PAIR(GNT_COLOR_NORMAL)); - mvwprintw(widget->window, 0, pos, title); + mvwaddstr(widget->window, 0, pos, title); mvwaddch(widget->window, 0, right, ACS_LTEE | COLOR_PAIR(GNT_COLOR_NORMAL)); g_free(title); } @@ -352,11 +352,6 @@ GntBox *box = GNT_BOX(widget); int wchange, hchange; - if (widget->priv.width != width && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X)) - return FALSE; - if (widget->priv.height != height && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_Y)) - return FALSE; - if (!box->list) return TRUE; @@ -387,13 +382,21 @@ gnt_widget_get_size(GNT_WIDGET(i->data), &tw, &th); if (box->vertical) { - if (!gnt_widget_confirm_size(i->data, tw - wchange, th)) - return FALSE; + if (!gnt_widget_confirm_size(i->data, tw - wchange, th)) { + /* If we are decreasing the size and the widget is going + * to be too large to fit into the box, then do not allow + * resizing. */ + if (wchange > 0 && tw >= widget->priv.width) + return FALSE; + } } else { - if (!gnt_widget_confirm_size(i->data, tw, th - hchange)) + if (!gnt_widget_confirm_size(i->data, tw, th - hchange)) { + if (hchange > 0 && th >= widget->priv.height) + return FALSE; return FALSE; + } } } #if 0 @@ -535,6 +538,7 @@ sizeof(GntBox), 0, /* n_preallocs */ gnt_box_init, /* instance_init */ + NULL /* value_table */ }; type = g_type_register_static(GNT_TYPE_WIDGET, @@ -561,17 +565,6 @@ { b->list = g_list_append(b->list, widget); widget->parent = GNT_WIDGET(b); - - if (b->vertical) - { - if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X)) - GNT_WIDGET_UNSET_FLAGS(GNT_WIDGET(b), GNT_WIDGET_GROW_X); - } - else - { - if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_Y)) - GNT_WIDGET_UNSET_FLAGS(GNT_WIDGET(b), GNT_WIDGET_GROW_Y); - } } void gnt_box_set_title(GntBox *b, const char *title) Modified: trunk/console/libgnt/gntbox.h =================================================================== --- trunk/console/libgnt/gntbox.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntbox.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -11,8 +11,8 @@ #define GNT_IS_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_BOX)) #define GNT_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_BOX, GntBoxClass)) -typedef struct _GnBox GntBox; -typedef struct _GnBoxClass GntBoxClass; +typedef struct _GntBox GntBox; +typedef struct _GntBoxClass GntBoxClass; typedef enum { @@ -27,7 +27,7 @@ GNT_ALIGN_BOTTOM } GntAlignment; -struct _GnBox +struct _GntBox { GntWidget parent; @@ -49,7 +49,7 @@ void (*gnt_reserved4)(void); }; -struct _GnBoxClass +struct _GntBoxClass { GntWidgetClass parent; Modified: trunk/console/libgnt/gntbutton.c =================================================================== --- trunk/console/libgnt/gntbutton.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntbutton.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -22,7 +22,7 @@ type = GNT_COLOR_NORMAL; wbkgdset(widget->window, '\0' | COLOR_PAIR(type)); - mvwprintw(widget->window, 1, 2, button->priv->text); + mvwaddstr(widget->window, 1, 2, button->priv->text); GNTDEBUG; } @@ -87,8 +87,6 @@ GntButton *button = GNT_BUTTON(instance); button->priv = g_new0(GntButtonPriv, 1); - GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_GROW_X); - widget->priv.minw = 4; widget->priv.minh = 3; GNTDEBUG; @@ -112,6 +110,7 @@ sizeof(GntButton), 0, /* n_preallocs */ gnt_button_init, /* instance_init */ + NULL /* value_table */ }; type = g_type_register_static(GNT_TYPE_WIDGET, Modified: trunk/console/libgnt/gntbutton.h =================================================================== --- trunk/console/libgnt/gntbutton.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntbutton.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -13,16 +13,16 @@ #define GNT_IS_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_BUTTON)) #define GNT_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_BUTTON, GntButtonClass)) -typedef struct _GnButton GntButton; -typedef struct _GnButtonPriv GntButtonPriv; -typedef struct _GnButtonClass GntButtonClass; +typedef struct _GntButton GntButton; +typedef struct _GntButtonPriv GntButtonPriv; +typedef struct _GntButtonClass GntButtonClass; -struct _GnButtonPriv +struct _GntButtonPriv { char *text; }; -struct _GnButton +struct _GntButton { GntWidget parent; @@ -34,7 +34,7 @@ void (*gnt_reserved4)(void); }; -struct _GnButtonClass +struct _GntButtonClass { GntWidgetClass parent; Modified: trunk/console/libgnt/gntcheckbox.c =================================================================== --- trunk/console/libgnt/gntcheckbox.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntcheckbox.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -24,11 +24,11 @@ wbkgdset(widget->window, '\0' | COLOR_PAIR(type)); text = g_strdup_printf("[%c]", cb->checked ? 'X' : ' '); - mvwprintw(widget->window, 0, 0, text); + mvwaddstr(widget->window, 0, 0, text); g_free(text); wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); - mvwprintw(widget->window, 0, 4, GNT_BUTTON(cb)->priv->text); + mvwaddstr(widget->window, 0, 4, GNT_BUTTON(cb)->priv->text); GNTDEBUG; } @@ -117,6 +117,7 @@ sizeof(GntCheckBox), 0, /* n_preallocs */ gnt_check_box_init, /* instance_init */ + NULL /* value_table */ }; type = g_type_register_static(GNT_TYPE_BUTTON, Modified: trunk/console/libgnt/gntcheckbox.h =================================================================== --- trunk/console/libgnt/gntcheckbox.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntcheckbox.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -17,17 +17,17 @@ #define GNT_CHECK_BOX_SET_FLAGS(obj, flags) (GNT_CHECK_BOX_FLAGS(obj) |= flags) #define GNT_CHECK_BOX_UNSET_FLAGS(obj, flags) (GNT_CHECK_BOX_FLAGS(obj) &= ~(flags)) -typedef struct _GnCheckBox GntCheckBox; -typedef struct _GnCheckBoxPriv GntCheckBoxPriv; -typedef struct _GnCheckBoxClass GntCheckBoxClass; +typedef struct _GntCheckBox GntCheckBox; +typedef struct _GntCheckBoxPriv GntCheckBoxPriv; +typedef struct _GntCheckBoxClass GntCheckBoxClass; -struct _GnCheckBox +struct _GntCheckBox { GntButton parent; gboolean checked; }; -struct _GnCheckBoxClass +struct _GntCheckBoxClass { GntButtonClass parent; Added: trunk/console/libgnt/gntclipboard.c =================================================================== --- trunk/console/libgnt/gntclipboard.c (rev 0) +++ trunk/console/libgnt/gntclipboard.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -0,0 +1,74 @@ +#include "gntclipboard.h" + +gchar *string; + +enum { + SIG_CLIPBOARD = 0, + SIGS +}; + +static guint signals[SIGS] = { 0 }; + +static void +gnt_clipboard_class_init(GntClipboardClass *klass) +{ + signals[SIG_CLIPBOARD] = + g_signal_new("clipboard_changed", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); + +} + +/****************************************************************************** + * GntClipboard API + *****************************************************************************/ + +void +gnt_clipboard_set_string(GntClipboard *clipboard, gchar *string) +{ + g_free(clipboard->string); + clipboard->string = g_strdup(string); + g_signal_emit(clipboard, signals[SIG_CLIPBOARD], 0, clipboard->string); +} + +gchar * +gnt_clipboard_get_string(GntClipboard *clipboard) +{ + return g_strdup(clipboard->string); +} + +static void gnt_clipboard_init(GTypeInstance *instance, gpointer class) { + GntClipboard *clipboard = GNT_CLIPBOARD(instance); + clipboard->string = g_strdup(""); +} + +GType +gnt_clipboard_get_gtype(void) +{ + static GType type = 0; + + if (type == 0) { + static const GTypeInfo info = { + sizeof(GntClipboardClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc)gnt_clipboard_class_init, + NULL, + NULL, /* class_data */ + sizeof(GntClipboard), + 0, /* n_preallocs */ + gnt_clipboard_init, /* instance_init */ + NULL /* value_table */ + }; + + type = g_type_register_static(G_TYPE_OBJECT, + "GntClipboard", + &info, 0); + } + + return type; +} Property changes on: trunk/console/libgnt/gntclipboard.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/gntclipboard.h =================================================================== --- trunk/console/libgnt/gntclipboard.h (rev 0) +++ trunk/console/libgnt/gntclipboard.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -0,0 +1,46 @@ +#ifndef GNT_CLIPBOARD_H +#define GNT_CLIPBOARD_H + +#include <stdio.h> +#include <glib.h> +#include <glib-object.h> + +#define GNT_TYPE_CLIPBOARD (gnt_clipboard_get_gtype()) +#define GNT_CLIPBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_CLIPBOARD, GntClipboard)) +#define GNT_CLIPBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_CLIPBOARD, GntClipboardClass)) +#define GNT_IS_CLIPBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNT_TYPE_CLIPBOARD)) +#define GNT_IS_CLIPBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_CLIPBOARD)) +#define GNT_CLIPBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_CLIPBOARD, GntClipboardClass)) + +#define GNTDEBUG g_printerr("%s\n", __FUNCTION__) + +typedef struct _GntClipboard GntClipboard; +typedef struct _GntClipboardClass GntClipboardClass; + +struct _GntClipboard +{ + GObject inherit; + gchar *string; +}; + +struct _GntClipboardClass +{ + GObjectClass parent; + + void (*gnt_reserved1)(void); + void (*gnt_reserved2)(void); + void (*gnt_reserved3)(void); + void (*gnt_reserved4)(void); +}; + +G_BEGIN_DECLS + +GType gnt_clipboard_get_gtype(void); + +gchar *gnt_clipboard_get_string(GntClipboard *clip); + +void gnt_clipboard_set_string(GntClipboard *clip, gchar *string); + +G_END_DECLS + +#endif Property changes on: trunk/console/libgnt/gntclipboard.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/libgnt/gntcolors.c =================================================================== --- trunk/console/libgnt/gntcolors.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntcolors.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -161,7 +161,7 @@ while (nkeys--) { gsize len; - char *key = keys[nkeys]; + gchar *key = keys[nkeys]; char **list = g_key_file_get_string_list(kfile, "colors", key, &len, NULL); if (len == 3) { @@ -170,8 +170,9 @@ int b = atoi(list[2]); int color = -1; - g_ascii_strdown(key, -1); + key = g_ascii_strdown(key, -1); color = get_color(key); + g_free(key); if (color == -1) continue; @@ -204,17 +205,21 @@ while (nkeys--) { gsize len; - char *key = keys[nkeys]; + gchar *key = keys[nkeys]; char **list = g_key_file_get_string_list(kfile, "colorpairs", key, &len, NULL); if (len == 2) { GntColorType type = 0; - int fg = get_color(g_ascii_strdown(list[0], -1)); - int bg = get_color(g_ascii_strdown(list[1], -1)); + gchar *fgc = g_ascii_strdown(list[0], -1); + gchar *bgc = g_ascii_strdown(list[1], -1); + int fg = get_color(fgc); + int bg = get_color(bgc); + g_free(fgc); + g_free(bgc); if (fg == -1 || bg == -1) continue; - g_ascii_strdown(key, -1); + key = g_ascii_strdown(key, -1); if (strcmp(key, "normal") == 0) type = GNT_COLOR_NORMAL; @@ -234,8 +239,11 @@ type = GNT_COLOR_DISABLED; else if (strcmp(key, "urgent") == 0) type = GNT_COLOR_URGENT; - else + else { + g_free(key); continue; + } + g_free(key); init_pair(type, fg, bg); } Modified: trunk/console/libgnt/gntcolors.h =================================================================== --- trunk/console/libgnt/gntcolors.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntcolors.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -33,9 +33,9 @@ }; /* populate some default colors */ -void gnt_init_colors(); +void gnt_init_colors(void); -void gnt_uninit_colors(); +void gnt_uninit_colors(void); #if GLIB_CHECK_VERSION(2,6,0) void gnt_colors_parse(GKeyFile *kfile); Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntcombobox.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -33,6 +33,18 @@ } static void +hide_popup(GntComboBox *box, gboolean set) +{ + gnt_widget_set_size(box->dropdown, + box->dropdown->priv.width - 1, box->dropdown->priv.height); + if (set) + set_selection(box, gnt_tree_get_selection_data(GNT_TREE(box->dropdown))); + else + gnt_tree_set_selected(GNT_TREE(box->dropdown), box->selected); + gnt_widget_hide(box->dropdown->parent); +} + +static void gnt_combo_box_draw(GntWidget *widget) { GntComboBox *box = GNT_COMBO_BOX(widget); @@ -56,7 +68,7 @@ s = (char*)gnt_util_onscreen_width_to_pointer(text, widget->priv.width - 4, &len); *s = '\0'; - mvwprintw(widget->window, 1, 1, text); + mvwaddstr(widget->window, 1, 1, text); whline(widget->window, ' ' | COLOR_PAIR(type), widget->priv.width - 4 - len); mvwaddch(widget->window, 1, widget->priv.width - 3, ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL)); mvwaddch(widget->window, 1, widget->priv.width - 2, ACS_DARROW | COLOR_PAIR(GNT_COLOR_NORMAL)); @@ -121,12 +133,11 @@ { case '\r': case '\t': - set_selection(box, gnt_tree_get_selection_data(GNT_TREE(box->dropdown))); + hide_popup(box, TRUE); + return TRUE; case 27: - gnt_tree_set_selected(GNT_TREE(box->dropdown), box->selected); - gnt_widget_hide(box->dropdown->parent); + hide_popup(box, FALSE); return TRUE; - break; } } if (gnt_widget_key_pressed(box->dropdown, text)) @@ -159,7 +170,7 @@ { GntComboBox *combo = GNT_COMBO_BOX(widget); if (GNT_WIDGET_IS_FLAG_SET(combo->dropdown->parent, GNT_WIDGET_MAPPED)) - gnt_widget_hide(GNT_COMBO_BOX(widget)->dropdown->parent); + hide_popup(combo, FALSE); widget_lost_focus(widget); } @@ -177,8 +188,7 @@ gnt_widget_key_pressed(box->dropdown, GNT_KEY_DOWN); } else if (event == GNT_LEFT_MOUSE_DOWN) { if (dshowing) { - set_selection(box, gnt_tree_get_selection_data(GNT_TREE(box->dropdown))); - gnt_widget_hide(box->dropdown->parent); + hide_popup(box, TRUE); } else { popup_dropdown(GNT_COMBO_BOX(widget)); } @@ -188,6 +198,13 @@ } static void +gnt_combo_box_size_changed(GntWidget *widget, int oldw, int oldh) +{ + GntComboBox *box = GNT_COMBO_BOX(widget); + gnt_widget_set_size(box->dropdown, widget->priv.width - 1, box->dropdown->priv.height); +} + +static void gnt_combo_box_class_init(GntComboBoxClass *klass) { parent_class = GNT_WIDGET_CLASS(klass); @@ -198,6 +215,7 @@ parent_class->size_request = gnt_combo_box_size_request; parent_class->key_pressed = gnt_combo_box_key_pressed; parent_class->clicked = gnt_combo_box_clicked; + parent_class->size_changed = gnt_combo_box_size_changed; widget_lost_focus = parent_class->lost_focus; parent_class->lost_focus = gnt_combo_box_lost_focus; @@ -255,6 +273,7 @@ sizeof(GntComboBox), 0, /* n_preallocs */ gnt_combo_box_init, /* instance_init */ + NULL /* value_table */ }; type = g_type_register_static(GNT_TYPE_WIDGET, Modified: trunk/console/libgnt/gntcombobox.h =================================================================== --- trunk/console/libgnt/gntcombobox.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntcombobox.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -17,11 +17,11 @@ #define GNT_COMBO_BOX_SET_FLAGS(obj, flags) (GNT_COMBO_BOX_FLAGS(obj) |= flags) #define GNT_COMBO_BOX_UNSET_FLAGS(obj, flags) (GNT_COMBO_BOX_FLAGS(obj) &= ~(flags)) -typedef struct _GnComboBox GntComboBox; -typedef struct _GnComboBoxPriv GntComboBoxPriv; -typedef struct _GnComboBoxClass GntComboBoxClass; +typedef struct _GntComboBox GntComboBox; +typedef struct _GntComboBoxPriv GntComboBoxPriv; +typedef struct _GntComboBoxClass GntComboBoxClass; -struct _GnComboBox +struct _GntComboBox { GntWidget parent; @@ -30,7 +30,7 @@ void *selected; /* Currently selected key */ }; -struct _GnComboBoxClass +struct _GntComboBoxClass { GntWidgetClass parent; @@ -44,7 +44,7 @@ GType gnt_combo_box_get_gtype(void); -GntWidget *gnt_combo_box_new(); +GntWidget *gnt_combo_box_new(void); void gnt_combo_box_add_data(GntComboBox *box, gpointer key, const char *text); Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntentry.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -16,6 +16,7 @@ static GntWidgetClass *parent_class = NULL; +static gboolean gnt_entry_key_pressed(GntWidget *widget, const char *text); static void gnt_entry_set_text_internal(GntEntry *entry, const char *text); static void @@ -299,9 +300,37 @@ } static gboolean +clipboard_paste(GntBindable *bind, GList *n) +{ + GntEntry *entry = GNT_ENTRY(bind); + gchar *i, *text, *a, *all; + text = i = gnt_get_clipboard_string(); + while (*i != '\0') { + i = g_utf8_next_char(i); + if (*i == '\r' || *i == '\n') + *i = ' '; + } + a = g_strndup(entry->start, entry->cursor - entry->start); + all = g_strconcat(a, text, entry->cursor, NULL); + gnt_entry_set_text_internal(entry, all); + g_free(a); + g_free(text); + g_free(all); + return TRUE; +} + +static gboolean suggest_show(GntBindable *bind, GList *null) { - return show_suggest_dropdown(GNT_ENTRY(bind)); + GntEntry *entry = GNT_ENTRY(bind); + if (entry->ddown) { + if (g_list_length(GNT_TREE(entry->ddown)->list) == 1) + gnt_entry_key_pressed(GNT_WIDGET(entry), "\r"); + else + gnt_bindable_perform_action_named(GNT_BINDABLE(entry->ddown), "move-down"); + return TRUE; + } + return show_suggest_dropdown(entry); } static gboolean @@ -543,7 +572,7 @@ if (entry->end + len - entry->start >= entry->buffer) { /* This will cause the buffer to grow */ - char *tmp = g_strdup_printf("%s%*s", entry->start, len, ""); + char *tmp = g_strdup(entry->start); gnt_entry_set_text_internal(entry, tmp); g_free(tmp); } @@ -673,6 +702,8 @@ GNT_KEY_CTRL_DOWN, NULL); gnt_bindable_class_register_action(bindable, "history-next", history_next, GNT_KEY_CTRL_UP, NULL); + gnt_bindable_class_register_action(bindable, "clipboard-paste", clipboard_paste, + GNT_KEY_CTRL_V, NULL); gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), GNT_BINDABLE_CLASS(klass)); GNTDEBUG; @@ -724,6 +755,7 @@ sizeof(GntEntry), 0, /* n_preallocs */ gnt_entry_init, /* instance_init */ + NULL /* value_table */ }; type = g_type_register_static(GNT_TYPE_WIDGET, Modified: trunk/console/libgnt/gntentry.h =================================================================== --- trunk/console/libgnt/gntentry.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntentry.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -19,9 +19,9 @@ #define ENTRY_CHAR '_' /* The character to use to fill in the blank places */ -typedef struct _GnEntry GntEntry; -typedef struct _GnEntryPriv GntEntryPriv; -typedef struct _GnEntryClass GntEntryClass; +typedef struct _GntEntry GntEntry; +typedef struct _GntEntryPriv GntEntryPriv; +typedef struct _GntEntryClass GntEntryClass; typedef enum { @@ -34,7 +34,7 @@ #define GNT_ENTRY_FLAG_ALL (GNT_ENTRY_FLAG_ALPHA | GNT_ENTRY_FLAG_INT) -struct _GnEntry +struct _GntEntry { GntWidget parent; @@ -60,7 +60,7 @@ GntWidget *ddown; /* The dropdown with the suggested list */ }; -struct _GnEntryClass +struct _GntEntryClass { GntWidgetClass parent; Modified: trunk/console/libgnt/gntfilesel.c =================================================================== --- trunk/console/libgnt/gntfilesel.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntfilesel.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -28,6 +28,11 @@ { GntFileSel *sel = GNT_FILE_SEL(widget); g_free(sel->current); + g_free(sel->suggest); + if (sel->tags) { + g_list_foreach(sel->tags, (GFunc)g_free, NULL); + g_list_free(sel->tags); + } } static char * @@ -66,13 +71,23 @@ { char *old; const char *tmp; - tmp = (const char*)gnt_tree_get_selection_data(sel->dirsonly ? GNT_TREE(sel->dirs) : GNT_TREE(sel->files)); + tmp = sel->suggest ? sel->suggest : + (const char*)gnt_tree_get_selection_data(sel->dirsonly ? GNT_TREE(sel->dirs) : GNT_TREE(sel->files)); old = g_strdup_printf("%s%s%s", sel->current, sel->current[1] ? G_DIR_SEPARATOR_S : "", tmp ? tmp : ""); gnt_entry_set_text(GNT_ENTRY(sel->location), old); g_free(old); } static gboolean +is_tagged(GntFileSel *sel, const char *f) +{ + char *ret = g_strdup_printf("%s%s%s", sel->current, sel->current[1] ? G_DIR_SEPARATOR_S : "", f); + gboolean find = g_list_find_custom(sel->tags, ret, (GCompareFunc)g_utf8_collate) != NULL; + g_free(ret); + return find; +} + +static gboolean location_changed(GntFileSel *sel, GError **err) { GDir *dir; @@ -109,15 +124,19 @@ if (stat(fp, &st)) { g_printerr("Error stating location %s\n", fp); } else { - if (S_ISDIR(st.st_mode)) + if (S_ISDIR(st.st_mode)) { gnt_tree_add_row_after(GNT_TREE(sel->dirs), g_strdup(str), gnt_tree_create_row(GNT_TREE(sel->dirs), str), NULL, NULL); - else if (!sel->dirsonly) { + if (sel->multiselect && sel->dirsonly && is_tagged(sel, str)) + gnt_tree_set_row_flags(GNT_TREE(sel->dirs), (gpointer)str, GNT_TEXT_FLAG_BOLD); + } else if (!sel->dirsonly) { char size[128]; snprintf(size, sizeof(size), "%ld", (long)st.st_size); gnt_tree_add_row_after(GNT_TREE(sel->files), g_strdup(str), gnt_tree_create_row(GNT_TREE(sel->files), str, size, ""), NULL, NULL); + if (sel->multiselect && is_tagged(sel, str)) + gnt_tree_set_row_flags(GNT_TREE(sel->files), (gpointer)str, GNT_TEXT_FLAG_BOLD); } } g_free(fp); @@ -131,7 +150,6 @@ dir_key_pressed(GntTree *tree, const char *key, GntFileSel *sel) { if (strcmp(key, "\r") == 0) { - /* XXX: if we are moving up the tree, make sure the current node is selected after the redraw */ char *str = g_strdup(gnt_tree_get_selection_data(tree)); char *path = g_build_filename(sel->current, str, NULL); char *dir = g_path_get_basename(sel->current); @@ -214,6 +232,8 @@ static void file_sel_changed(GntWidget *widget, gpointer old, gpointer current, GntFileSel *sel) { + g_free(sel->suggest); + sel->suggest = NULL; update_location(sel); } @@ -225,7 +245,7 @@ vbox = gnt_vbox_new(FALSE); gnt_box_set_pad(GNT_BOX(vbox), 0); - gnt_box_set_alignment(GNT_BOX(vbox), GNT_ALIGN_LEFT); + gnt_box_set_alignment(GNT_BOX(vbox), GNT_ALIGN_MID); /* The dir. and files list */ hbox = gnt_hbox_new(FALSE); @@ -253,9 +273,66 @@ update_location(sel); } +static gboolean +toggle_tag_selection(GntBindable *bind, GList *null) +{ + GntFileSel *sel = GNT_FILE_SEL(bind); + char *str; + GList *find; + char *file; + GntWidget *tree; + + if (!sel->multiselect) + return FALSE; + tree = sel->dirsonly ? sel->dirs : sel->files; + if (!gnt_widget_has_focus(tree)) + return FALSE; + + file = gnt_tree_get_selection_data(sel->dirsonly ? GNT_TREE(sel->dirs) : GNT_TREE(sel->files)); + + str = gnt_file_sel_get_selected_file(sel); + if ((find = g_list_find_custom(sel->tags, str, (GCompareFunc)g_utf8_collate)) != NULL) { + g_free(find->data); + sel->tags = g_list_delete_link(sel->tags, find); + gnt_tree_set_row_flags(GNT_TREE(tree), file, GNT_TEXT_FLAG_NORMAL); + g_free(str); + } else { + sel->tags = g_list_prepend(sel->tags, str); + gnt_tree_set_row_flags(GNT_TREE(tree), file, GNT_TEXT_FLAG_BOLD); + } + + gnt_bindable_perform_action_named(GNT_BINDABLE(tree), "move-down", NULL); + + return TRUE; +} + +static gboolean +clear_tags(GntBindable *bind, GList *null) +{ + GntFileSel *sel = GNT_FILE_SEL(bind); + GntWidget *tree; + GList *iter; + + if (!sel->multiselect) + return FALSE; + tree = sel->dirsonly ? sel->dirs : sel->files; + if (!gnt_widget_has_focus(tree)) + return FALSE; + + g_list_foreach(sel->tags, (GFunc)g_free, NULL); + g_list_free(sel->tags); + sel->tags = NULL; + + for (iter = GNT_TREE(tree)->list; iter; iter = iter->next) + gnt_tree_set_row_flags(GNT_TREE(tree), iter->data, GNT_TEXT_FLAG_NORMAL); + + return TRUE; +} + static void gnt_file_sel_class_init(GntFileSelClass *klass) { + GntBindableClass *bindable = GNT_BINDABLE_CLASS(klass); GntWidgetClass *kl = GNT_WIDGET_CLASS(klass); parent_class = GNT_WINDOW_CLASS(klass); kl->destroy = gnt_file_sel_destroy; @@ -270,6 +347,9 @@ NULL, NULL, gnt_closure_marshal_VOID__STRING_STRING, G_TYPE_NONE, 0); + + gnt_bindable_class_register_action(bindable, "toggle-tag", toggle_tag_selection, "t", NULL); + gnt_bindable_class_register_action(bindable, "clear-tags", clear_tags, "c", NULL); gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), GNT_BINDABLE_CLASS(klass)); GNTDEBUG; @@ -312,7 +392,7 @@ return type; } -GntWidget *gnt_file_sel_new() +GntWidget *gnt_file_sel_new(void) { GntWidget *widget = g_object_new(GNT_TYPE_FILE_SEL, NULL); GntFileSel *sel = GNT_FILE_SEL(widget); @@ -375,12 +455,19 @@ return sel->dirsonly; } +void gnt_file_sel_set_suggested_filename(GntFileSel *sel, const char *suggest) +{ + sel->suggest = g_strdup(suggest); +} + char *gnt_file_sel_get_selected_file(GntFileSel *sel) { char *ret; - const char *tmp; - tmp = (const char*)gnt_tree_get_selection_data(sel->dirsonly ? GNT_TREE(sel->dirs) : GNT_TREE(sel->files)); - ret = g_strdup_printf("%s%s%s", sel->current, sel->current[1] ? G_DIR_SEPARATOR_S : "", tmp ? tmp : ""); + if (sel->dirsonly) { + ret = g_path_get_dirname(gnt_entry_get_text(GNT_ENTRY(sel->location))); + } else { + ret = g_strdup(gnt_entry_get_text(GNT_ENTRY(sel->location))); + } return ret; } @@ -395,3 +482,26 @@ return sel->must_exist; } +void gnt_file_sel_set_multi_select(GntFileSel *sel, gboolean set) +{ + sel->multiselect = set; +} + +GList *gnt_file_sel_get_selected_multi_files(GntFileSel *sel) +{ + GList *list = NULL, *iter; + char *str = gnt_file_sel_get_selected_file(sel); + + for (iter = sel->tags; iter; iter = iter->next) { + list = g_list_prepend(list, g_strdup(iter->data)); + if (g_utf8_collate(str, iter->data)) { + g_free(str); + str = NULL; + } + } + if (str) + list = g_list_prepend(list, str); + list = g_list_reverse(list); + return list; +} + Modified: trunk/console/libgnt/gntfilesel.h =================================================================== --- trunk/console/libgnt/gntfilesel.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntfilesel.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -17,11 +17,11 @@ #define GNT_FILE_SEL_SET_FLAGS(obj, flags) (GNT_FILE_SEL_FLAGS(obj) |= flags) #define GNT_FILE_SEL_UNSET_FLAGS(obj, flags) (GNT_FILE_SEL_FLAGS(obj) &= ~(flags)) -typedef struct _GnFileSel GntFileSel; -typedef struct _GnFileSelPriv GntFileSelPriv; -typedef struct _GnFileSelClass GntFileSelClass; +typedef struct _GntFileSel GntFileSel; +typedef struct _GntFileSelPriv GntFileSelPriv; +typedef struct _GntFileSelClass GntFileSelClass; -struct _GnFileSel +struct _GntFileSel { GntWindow parent; @@ -33,12 +33,15 @@ GntWidget *cancel; /* cancel button */ char *current; /* Full path of the current location */ + char *suggest; /* Suggested filename */ /* XXX: someone should make these useful */ gboolean must_exist; /* Make sure the selected file (the name entered in 'location') exists */ gboolean dirsonly; /* Show only directories */ + gboolean multiselect; + GList *tags; /* List of tagged files when multiselect is set */ }; -struct _GnFileSelClass +struct _GntFileSelClass { GntWindowClass parent; @@ -53,12 +56,10 @@ GType gnt_file_sel_get_gtype(void); -GntWidget *gnt_file_sel_new(); +GntWidget *gnt_file_sel_new(void); gboolean gnt_file_sel_set_current_location(GntFileSel *sel, const char *path); -const char *gnt_file_sel_get_current_location(GntFileSel *sel); - void gnt_file_sel_set_dirs_only(GntFileSel *sel, gboolean dirs); gboolean gnt_file_sel_get_dirs_only(GntFileSel *sel); @@ -69,6 +70,13 @@ char *gnt_file_sel_get_selected_file(GntFileSel *sel); /* The returned value should be free'd */ +GList *gnt_file_sel_get_selected_multi_files(GntFileSel *sel); + +void gnt_file_sel_set_multi_select(GntFileSel *sel, gboolean set); + +void gnt_file_sel_set_suggested_filename(GntFileSel *sel, const char *suggest); + G_END_DECLS #endif /* GNT_FILE_SEL_H */ + Modified: trunk/console/libgnt/gntkeys.c =================================================================== --- trunk/console/libgnt/gntkeys.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntkeys.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -1,5 +1,6 @@ #include "gntkeys.h" +#include <glib.h> #include <stdlib.h> #include <string.h> @@ -8,11 +9,16 @@ char *gnt_key_cleft; char *gnt_key_cright; - static const char *term; +static GHashTable *specials; void gnt_init_keys() { + const char *controls[] = {"", "c-", "ctrl-", "ctr-", "ctl-", NULL}; + const char *alts[] = {"", "alt-", "a-", "m-", "meta-", NULL}; + int c, a, ch; + char key[32]; + if (term == NULL) { term = getenv("TERM"); if (!term) @@ -30,11 +36,86 @@ gnt_key_cright = "\033" "Oc"; gnt_key_cleft = "\033" "Od"; } + + specials = g_hash_table_new(g_str_hash, g_str_equal); + +#define INSERT_KEY(k, code) do { \ + g_hash_table_insert(specials, g_strdup(k), g_strdup(code)); \ + gnt_keys_add_combination(code); \ + } while (0) + + INSERT_KEY("home", GNT_KEY_HOME); + INSERT_KEY("end", GNT_KEY_END); + INSERT_KEY("pageup", GNT_KEY_PGUP); + INSERT_KEY("pagedown", GNT_KEY_PGDOWN); + INSERT_KEY("insert", GNT_KEY_INS); + INSERT_KEY("delete", GNT_KEY_DEL); + + INSERT_KEY("left", GNT_KEY_LEFT); + INSERT_KEY("right", GNT_KEY_RIGHT); + INSERT_KEY("up", GNT_KEY_UP); + INSERT_KEY("down", GNT_KEY_DOWN); + + INSERT_KEY("tab", "\t"); + INSERT_KEY("menu", GNT_KEY_POPUP); + + INSERT_KEY("f1", GNT_KEY_F1); + INSERT_KEY("f2", GNT_KEY_F2); + INSERT_KEY("f3", GNT_KEY_F3); + INSERT_KEY("f4", GNT_KEY_F4); + INSERT_KEY("f5", GNT_KEY_F5); + INSERT_KEY("f6", GNT_KEY_F6); + INSERT_KEY("f7", GNT_KEY_F7); + INSERT_KEY("f8", GNT_KEY_F8); + INSERT_KEY("f9", GNT_KEY_F9); + INSERT_KEY("f10", GNT_KEY_F10); + INSERT_KEY("f11", GNT_KEY_F11); + INSERT_KEY("f12", GNT_KEY_F12); + +#define REM_LENGTH (sizeof(key) - (cur - key)) +#define INSERT_COMB(k, code) do { \ + snprintf(key, sizeof(key), "%s%s%s", controls[c], alts[a], k); \ + INSERT_KEY(key, code); \ + } while (0); + + /* Lower-case alphabets */ + for (a = 0, c = 0; controls[c]; c++, a = 0) { + if (c) { + INSERT_COMB("up", gnt_key_cup); + INSERT_COMB("down", gnt_key_cdown); + INSERT_COMB("left", gnt_key_cleft); + INSERT_COMB("right", gnt_key_cright); + } + + for (a = 0; alts[a]; a++) { + for (ch = 0; ch < 26; ch++) { + char str[2] = {'a' + ch, 0}, code[4] = "\0\0\0\0"; + int ind = 0; + if (a) + code[ind++] = '\033'; + code[ind] = (c ? 1 : 'a') + ch; + INSERT_COMB(str, code); + } + } + } + c = 0; + for (a = 0; alts[a]; a++) { + /* Upper-case alphabets */ + for (ch = 0; ch < 26; ch++) { + char str[2] = {'A' + ch, 0}, code[] = {'\033', 'A' + ch, 0}; + INSERT_COMB(str, code); + } + /* Digits */ + for (ch = 0; ch < 10; ch++) { + char str[2] = {'0' + ch, 0}, code[] = {'\033', '0' + ch, 0}; + INSERT_COMB(str, code); + } + } } void gnt_keys_refine(char *text) { - if (*text == 27 && *(text + 1) == '[' && *(text + 3) == '\0' && + if (*text == 27 && *(text + 1) == '[' && (*(text + 2) >= 'A' && *(text + 2) <= 'D')) { /* Apparently this is necessary for urxvt and screen and xterm */ if (strcmp(term, "screen") == 0 || strcmp(term, "rxvt-unicode") == 0 || @@ -48,3 +129,115 @@ } } +const char *gnt_key_translate(const char *name) +{ + return g_hash_table_lookup(specials, name); +} + +/** + * The key-bindings will be saved in a tree. When a keystroke happens, GNT will + * find the sequence that matches a binding and return the length. + * A sequence should not be a prefix of another sequence. If it is, then only + * the shortest one will be processed. If we want to change that, we will need + * to allow getting the k-th prefix that matches the input, and pay attention + * to the return value of gnt_wm_process_input in gntmain.c. + */ +#define SIZE 256 + +#define IS_END 1 << 0 +struct _node +{ + struct _node *next[SIZE]; + int ref; + int flags; +}; + +static struct _node root = {.ref = 1, .flags = 0}; + +static void add_path(struct _node *node, const char *path) +{ + struct _node *n = NULL; + if (!path || !*path) { + node->flags |= IS_END; + return; + } + while (*path && node->next[*path]) { + node = node->next[*path]; + node->ref++; + path++; + } + if (!*path) + return; + n = g_new0(struct _node, 1); + n->ref = 1; + node->next[*path++] = n; + add_path(n, path); +} + +void gnt_keys_add_combination(const char *path) +{ + add_path(&root, path); +} + +static void del_path(struct _node *node, const char *path) +{ + struct _node *next = NULL; + + if (!*path) + return; + next = node->next[*path]; + if (!next) + return; + del_path(next, path + 1); + next->ref--; + if (next->ref == 0) { + node->next[*path] = NULL; + g_free(next); + } +} + +void gnt_keys_del_combination(const char *path) +{ + del_path(&root, path); +} + +int gnt_keys_find_combination(const char *path) +{ + int depth = 0; + struct _node *n = &root; + + root.flags &= ~IS_END; + while (*path && n->next[*path] && !(n->flags & IS_END)) { + if (g_utf8_find_next_char(path, NULL) - path > 1) + return 0; + n = n->next[*path++]; + depth++; + } + + if (!(n->flags & IS_END)) + depth = 0; + return depth; +} + +static void +print_path(struct _node *node, int depth) +{ + int i; + for (i = 0; i < SIZE; i++) { + if (node->next[i]) { + g_printerr("%*c (%d:%d)\n", depth * 4, i, node->next[i]->ref, + node->next[i]->flags); + print_path(node->next[i], depth + 1); + } + } +} + +/* this is purely for debugging purposes. */ +void gnt_keys_print_combinations(void); +void gnt_keys_print_combinations() +{ + g_printerr("--------\n"); + print_path(&root, 1); + g_printerr("--------\n"); +} + Modified: trunk/console/libgnt/gntkeys.h =================================================================== --- trunk/console/libgnt/gntkeys.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntkeys.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -79,10 +79,15 @@ /** * This will do stuff with the terminal settings and stuff. */ -void gnt_init_keys(); +void gnt_init_keys(void); void gnt_keys_refine(char *text); +const char *gnt_key_translate(const char *name); +void gnt_keys_add_combination(const char *path); +void gnt_keys_del_combination(const char *path); +int gnt_keys_find_combination(const char *path); + /* A lot of commonly used variable names are defined in <term.h>. * #undef them to make life easier for everyone. */ Modified: trunk/console/libgnt/gntlabel.c =================================================================== --- trunk/console/libgnt/gntlabel.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntlabel.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -24,7 +24,7 @@ chtype flag = gnt_text_format_flag_to_chtype(label->flags); wbkgdset(widget->window, '\0' | flag); - mvwprintw(widget->window, 0, 0, label->text); + mvwaddstr(widget->window, 0, 0, label->text); GNTDEBUG; } @@ -80,6 +80,7 @@ sizeof(GntLabel), 0, /* n_preallocs */ gnt_label_init, /* instance_init */ + NULL /* value_table */ }; type = g_type_register_static(GNT_TYPE_WIDGET, Modified: trunk/console/libgnt/gntlabel.h =================================================================== --- trunk/console/libgnt/gntlabel.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntlabel.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -12,10 +12,10 @@ #define GNT_IS_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_LABEL)) #define GNT_LABEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_LABEL, GntLabelClass)) -typedef struct _GnLabel GntLabel; -typedef struct _GnLabelClass GntLabelClass; +typedef struct _GntLabel GntLabel; +typedef struct _GntLabelClass GntLabelClass; -struct _GnLabel +struct _GntLabel { GntWidget parent; @@ -28,7 +28,7 @@ void (*gnt_reserved4)(void); }; -struct _GnLabelClass +struct _GntLabelClass { GntWidgetClass parent; Modified: trunk/console/libgnt/gntline.c =================================================================== --- trunk/console/libgnt/gntline.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntline.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -83,6 +83,7 @@ sizeof(GntLine), 0, /* n_preallocs */ gnt_line_init, /* instance_init */ + NULL /* value_table */ }; type = g_type_register_static(GNT_TYPE_WIDGET, Modified: trunk/console/libgnt/gntline.h =================================================================== --- trunk/console/libgnt/gntline.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntline.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -17,18 +17,18 @@ #define GNT_LINE_SET_FLAGS(obj, flags) (GNT_LINE_FLAGS(obj) |= flags) #define GNT_LINE_UNSET_FLAGS(obj, flags) (GNT_LINE_FLAGS(obj) &= ~(flags)) -typedef struct _GnLine GntLine; -typedef struct _GnLinePriv GntLinePriv; -typedef struct _GnLineClass GntLineClass; +typedef struct _GntLine GntLine; +typedef struct _GntLinePriv GntLinePriv; +typedef struct _GntLineClass GntLineClass; -struct _GnLine +struct _GntLine { GntWidget parent; gboolean vertical; }; -struct _GnLineClass +struct _GntLineClass { GntWidgetClass parent; Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntmain.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -7,9 +7,13 @@ #include <gmodule.h> +#include <sys/types.h> +#include <sys/wait.h> + #include "gnt.h" #include "gntbox.h" #include "gntcolors.h" +#include "gntclipboard.h" #include "gntkeys.h" #include "gntmenu.h" #include "gntstyle.h" @@ -28,9 +32,6 @@ #include <ctype.h> #include <errno.h> -#include <sys/types.h> -#include <sys/wait.h> - /** * Notes: Interesting functions to look at: * scr_dump, scr_init, scr_restore: for workspaces @@ -43,12 +44,27 @@ static gboolean ascii_only; static gboolean mouse_enabled; -static void setup_io(); +static void setup_io(void); static gboolean refresh_screen(); GntWM *wm; +static GntClipboard *clipboard; +#define HOLDING_ESCAPE (escape_stuff.timer != 0) + +static struct { + int timer; +} escape_stuff; + +static gboolean +escape_timeout(gpointer data) +{ + gnt_wm_process_input(wm, "\033"); + escape_stuff.timer = 0; + return FALSE; +} + /** * Mouse support: * - bring a window on top if you click on its taskbar @@ -178,7 +194,8 @@ io_invoke(GIOChannel *source, GIOCondition cond, gpointer null) { char keys[256]; - int rd = read(STDIN_FILENO, keys, sizeof(keys) - 1); + int rd = read(STDIN_FILENO, keys + HOLDING_ESCAPE, sizeof(keys) - 1 - HOLDING_ESCAPE); + char *k; if (rd < 0) { int ch = getch(); /* This should return ERR, but let's see what it really returns */ @@ -194,14 +211,39 @@ raise(SIGABRT); } + rd += HOLDING_ESCAPE; keys[rd] = 0; - gnt_keys_refine(keys); - if (mouse_enabled && detect_mouse_action(keys)) return TRUE; - - gnt_wm_process_input(wm, keys); + if (HOLDING_ESCAPE) + keys[0] = '\033'; + k = keys; + while (rd) { + char back; + int p; + + if (k[0] == '\033' && rd == 1) { + if (escape_stuff.timer) { + gnt_wm_process_input(wm, "\033\033"); + g_source_remove(escape_stuff.timer); + escape_stuff.timer = 0; + break; + } + escape_stuff.timer = g_timeout_add(250, escape_timeout, NULL); + break; + } + + gnt_keys_refine(k); + p = MAX(1, gnt_keys_find_combination(k)); + back = k[p]; + k[p] = '\0'; + gnt_wm_process_input(wm, k); /* XXX: */ + k[p] = back; + rd -= p; + k += p; + } + return TRUE; } @@ -210,10 +252,11 @@ { int result; channel = g_io_channel_unix_new(STDIN_FILENO); + g_io_channel_set_close_on_unref(channel, TRUE); +#if 0 g_io_channel_set_encoding(channel, NULL, NULL); g_io_channel_set_buffered(channel, FALSE); -#if 0 g_io_channel_set_flags(channel, G_IO_FLAG_NONBLOCK, NULL ); #endif @@ -303,10 +346,10 @@ if (channel) return; + locale = setlocale(LC_ALL, ""); + setup_io(); - locale = setlocale(LC_ALL, ""); - if (locale && (strstr(locale, "UTF") || strstr(locale, "utf"))) ascii_only = FALSE; else @@ -317,6 +360,7 @@ noecho(); curs_set(0); + gnt_init_keys(); gnt_init_styles(); filename = g_build_filename(g_get_home_dir(), ".gntrc", NULL); @@ -324,7 +368,6 @@ g_free(filename); gnt_init_colors(); - gnt_init_keys(); wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); refresh(); @@ -347,6 +390,8 @@ g_type_init(); init_wm(); + + clipboard = g_object_new(GNT_TYPE_CLIPBOARD, NULL); } void gnt_main() @@ -475,3 +520,16 @@ return TRUE; } +void gnt_set_clipboard_string(gchar *string) +{ + gnt_clipboard_set_string(clipboard, string); +} + +GntClipboard *gnt_get_clipboard() +{ + return clipboard; +} +gchar *gnt_get_clipboard_string() +{ + return gnt_clipboard_get_string(clipboard); +} Modified: trunk/console/libgnt/gntmenu.c =================================================================== --- trunk/console/libgnt/gntmenu.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntmenu.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -28,7 +28,7 @@ werase(widget->window); for (i = 0, iter = menu->list; iter; iter = iter->next, i++) { - GntMenuItem *item = GNT_MENUITEM(iter->data); + GntMenuItem *item = GNT_MENU_ITEM(iter->data); type = ' ' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT); if (i == menu->selected) type |= A_REVERSE; @@ -61,10 +61,10 @@ static void menu_tree_add(GntMenu *menu, GntMenuItem *item, GntMenuItem *parent) { - if (GNT_IS_MENUITEM_CHECK(item)) { + if (GNT_IS_MENU_ITEM_CHECK(item)) { gnt_tree_add_choice(GNT_TREE(menu), item, gnt_tree_create_row(GNT_TREE(menu), item->text, " "), parent, NULL); - gnt_tree_set_choice(GNT_TREE(menu), item, gnt_menuitem_check_get_checked(GNT_MENUITEM_CHECK(item))); + gnt_tree_set_choice(GNT_TREE(menu), item, gnt_menuitem_check_get_checked(GNT_MENU_ITEM_CHECK(item))); } else gnt_tree_add_row_last(GNT_TREE(menu), item, gnt_tree_create_row(GNT_TREE(menu), item->text, item->submenu ? ">" : " "), parent); @@ -73,7 +73,7 @@ GntMenu *sub = GNT_MENU(item->submenu); GList *iter; for (iter = sub->list; iter; iter = iter->next) { - GntMenuItem *it = GNT_MENUITEM(iter->data); + GntMenuItem *it = GNT_MENU_ITEM(iter->data); menu_tree_add(menu, it, item); } } @@ -91,7 +91,7 @@ GList *iter; gnt_tree_remove_all(GNT_TREE(widget)); for (iter = menu->list; iter; iter = iter->next) { - GntMenuItem *item = GNT_MENUITEM(iter->data); + GntMenuItem *item = GNT_MENU_ITEM(iter->data); menu_tree_add(menu, item, NULL); } org_map(widget); @@ -134,7 +134,8 @@ int current = menu->selected; if (menu->submenu) { - return (gnt_widget_key_pressed(GNT_WIDGET(menu->submenu), text)); + do menu = menu->submenu; while (menu->submenu); + return (gnt_widget_key_pressed(GNT_WIDGET(menu), text)); } if (text[0] == 27 && text[1] == 0) { @@ -184,10 +185,10 @@ static void gnt_menu_toggled(GntTree *tree, gpointer key) { - GntMenuItem *item = GNT_MENUITEM(key); + GntMenuItem *item = GNT_MENU_ITEM(key); GntMenu *menu = GNT_MENU(tree); - gboolean check = gnt_menuitem_check_get_checked(GNT_MENUITEM_CHECK(item)); - gnt_menuitem_check_set_checked(GNT_MENUITEM_CHECK(item), !check); + gboolean check = gnt_menuitem_check_get_checked(GNT_MENU_ITEM_CHECK(item)); + gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item), !check); if (item->callback) item->callback(item, item->callbackdata); while (menu) { @@ -209,7 +210,7 @@ } if (item) { - if (GNT_IS_MENUITEM_CHECK(item)) + if (GNT_IS_MENU_ITEM_CHECK(item)) gnt_menu_toggled(GNT_TREE(widget), item); else menuitem_activate(menu, item); @@ -277,6 +278,7 @@ sizeof(GntMenu), 0, /* n_preallocs */ gnt_menu_init, /* instance_init */ + NULL /* value_table */ }; type = g_type_register_static(GNT_TYPE_TREE, Modified: trunk/console/libgnt/gntmenu.h =================================================================== --- trunk/console/libgnt/gntmenu.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntmenu.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -16,9 +16,9 @@ #define GNT_MENU_SET_FLAGS(obj, flags) (GNT_MENU_FLAGS(obj) |= flags) #define GNT_MENU_UNSET_FLAGS(obj, flags) (GNT_MENU_FLAGS(obj) &= ~(flags)) -typedef struct _GnMenu GntMenu; -typedef struct _GnMenuPriv GntMenuPriv; -typedef struct _GnMenuClass GntMenuClass; +typedef struct _GntMenu GntMenu; +typedef struct _GntMenuPriv GntMenuPriv; +typedef struct _GntMenuClass GntMenuClass; #include "gntmenuitem.h" @@ -33,7 +33,7 @@ GNT_MENU_POPUP, /* A popup menu */ } GntMenuType; -struct _GnMenu +struct _GntMenu { GntTree parent; GntMenuType type; @@ -47,7 +47,7 @@ GntMenu *parentmenu; }; -struct _GnMenuClass +struct _GntMenuClass { GntTreeClass parent; Modified: trunk/console/libgnt/gntmenuitem.c =================================================================== --- trunk/console/libgnt/gntmenuitem.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntmenuitem.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -6,7 +6,7 @@ static void gnt_menuitem_destroy(GObject *obj) { - GntMenuItem *item = GNT_MENUITEM(obj); + GntMenuItem *item = GNT_MENU_ITEM(obj); g_free(item->text); item->text = NULL; if (item->submenu) @@ -48,6 +48,7 @@ sizeof(GntMenuItem), 0, /* n_preallocs */ gnt_menuitem_init, /* instance_init */ + NULL /* value_table */ }; type = g_type_register_static(G_TYPE_OBJECT, @@ -60,8 +61,8 @@ GntMenuItem *gnt_menuitem_new(const char *text) { - GObject *item = g_object_new(GNT_TYPE_MENUITEM, NULL); - GntMenuItem *menuitem = GNT_MENUITEM(item); + GObject *item = g_object_new(GNT_TYPE_MENU_ITEM, NULL); + GntMenuItem *menuitem = GNT_MENU_ITEM(item); menuitem->text = g_strdup(text); Modified: trunk/console/libgnt/gntmenuitem.h =================================================================== --- trunk/console/libgnt/gntmenuitem.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntmenuitem.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -4,24 +4,24 @@ #include <glib.h> #include <glib-object.h> -#define GNT_TYPE_MENUITEM (gnt_menuitem_get_gtype()) -#define GNT_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_MENUITEM, GntMenuItem)) -#define GNT_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_MENUITEM, GntMenuItemClass)) -#define GNT_IS_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNT_TYPE_MENUITEM)) -#define GNT_IS_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_MENUITEM)) -#define GNT_MENUITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_MENUITEM, GntMenuItemClass)) +#define GNT_TYPE_MENU_ITEM (gnt_menuitem_get_gtype()) +#define GNT_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_MENU_ITEM, GntMenuItem)) +#define GNT_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_MENU_ITEM, GntMenuItemClass)) +#define GNT_IS_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNT_TYPE_MENU_ITEM)) +#define GNT_IS_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_MENU_ITEM)) +#define GNT_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_MENU_ITEM, GntMenuItemClass)) -#define GNT_MENUITEM_FLAGS(obj) (GNT_MENUITEM(obj)->priv.flags) -#define GNT_MENUITEM_SET_FLAGS(obj, flags) (GNT_MENUITEM_FLAGS(obj) |= flags) -#define GNT_MENUITEM_UNSET_FLAGS(obj, flags) (GNT_MENUITEM_FLAGS(obj) &= ~(flags)) +#define GNT_MENU_ITEM_FLAGS(obj) (GNT_MENU_ITEM(obj)->priv.flags) +#define GNT_MENU_ITEM_SET_FLAGS(obj, flags) (GNT_MENU_ITEM_FLAGS(obj) |= flags) +#define GNT_MENU_ITEM_UNSET_FLAGS(obj, flags) (GNT_MENU_ITEM_FLAGS(obj) &= ~(flags)) -typedef struct _GnMenuItem GntMenuItem; -typedef struct _GnMenuItemPriv GntMenuItemPriv; -typedef struct _GnMenuItemClass GntMenuItemClass; +typedef struct _GntMenuItem GntMenuItem; +typedef struct _GntMenuItemPriv GntMenuItemPriv; +typedef struct _GntMenuItemClass GntMenuItemClass; #include "gntmenu.h" -struct _GnMenuItemPriv +struct _GntMenuItemPriv { /* These will be used to determine the position of the submenu */ int x; @@ -30,7 +30,7 @@ typedef void (*GntMenuItemCallback)(GntMenuItem *item, gpointer data); -struct _GnMenuItem +struct _GntMenuItem { GObject parent; GntMenuItemPriv priv; @@ -46,7 +46,7 @@ GntMenu *submenu; }; -struct _GnMenuItemClass +struct _GntMenuItemClass { GObjectClass parent; Modified: trunk/console/libgnt/gntmenuitemcheck.c =================================================================== --- trunk/console/libgnt/gntmenuitemcheck.c 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntmenuitemcheck.c 2007-03-30 05:49:39 UTC (rev 18220) @@ -5,7 +5,7 @@ static void gnt_menuitem_check_class_init(GntMenuItemCheckClass *klass) { - parent_class = GNT_MENUITEM_CLASS(klass); + parent_class = GNT_MENU_ITEM_CLASS(klass); GNTDEBUG; } @@ -36,9 +36,10 @@ sizeof(GntMenuItemCheck), 0, /* n_preallocs */ gnt_menuitem_check_init, /* instance_init */ + NULL /* value_table */ }; - type = g_type_register_static(GNT_TYPE_MENUITEM, + type = g_type_register_static(GNT_TYPE_MENU_ITEM, "GntMenuItemCheck", &info, 0); } @@ -48,8 +49,8 @@ GntMenuItem *gnt_menuitem_check_new(const char *text) { - GntMenuItem *item = g_object_new(GNT_TYPE_MENUITEM_CHECK, NULL); - GntMenuItem *menuitem = GNT_MENUITEM(item); + GntMenuItem *item = g_object_new(GNT_TYPE_MENU_ITEM_CHECK, NULL); + GntMenuItem *menuitem = GNT_MENU_ITEM(item); menuitem->text = g_strdup(text); return item; Modified: trunk/console/libgnt/gntmenuitemcheck.h =================================================================== --- trunk/console/libgnt/gntmenuitemcheck.h 2007-03-28 12:42:19 UTC (rev 18219) +++ trunk/console/libgnt/gntmenuitemcheck.h 2007-03-30 05:49:39 UTC (rev 18220) @@ -1,33 +1,33 @@ -#ifndef GNT_MENUITEM_CHECK_H -#define GNT_MENUITEM_CHECK_H +#ifndef GNT_MENU_ITEM_CHECK_H +#define GNT_MENU_ITEM_CHECK_H #include "gnt.h" #include "gntcolors.h" #include "gntkeys.h" #include "gntmenuitem.h" -#define GNT_TYPE_MENUITEM_CHECK (gnt_menuitem_check_get_gtype()) -#define GNT_MENUITEM_CHECK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_MENUITEM_CHECK, GntMenuItemCheck)) -#define GNT_MENUITEM_CHECK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_MENUITEM_CHECK, GntMenuItemCheckClass)) -#... [truncated message content] |