From: <sa...@us...> - 2006-06-22 22:38:09
|
Revision: 16310 Author: sadrul Date: 2006-06-22 15:38:03 -0700 (Thu, 22 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16310&view=rev Log Message: ----------- The colors should now look 'better' in terminals that don't apparently allow changing colors. Modified Paths: -------------- trunk/console/libgnt/gntcolors.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/test.c Modified: trunk/console/libgnt/gntcolors.c =================================================================== --- trunk/console/libgnt/gntcolors.c 2006-06-22 11:12:40 UTC (rev 16309) +++ trunk/console/libgnt/gntcolors.c 2006-06-22 22:38:03 UTC (rev 16310) @@ -3,19 +3,29 @@ void gnt_init_colors() { - /* XXX: Do some init_color()s */ - init_color(GNT_COLOR_BLACK, 0, 0, 0); - init_color(GNT_COLOR_RED, 1000, 0, 0); - init_color(GNT_COLOR_GREEN, 0, 1000, 0); - init_color(GNT_COLOR_BLUE, 0, 0, 1000); - init_color(GNT_COLOR_WHITE, 1000, 1000, 1000); - init_color(GNT_COLOR_GRAY, 799, 799, 799); - init_color(GNT_COLOR_DARK_GRAY, 256, 256, 256); + if (can_change_color()) + { + /* XXX: Do some init_color()s */ + init_color(GNT_COLOR_BLACK, 0, 0, 0); + init_color(GNT_COLOR_RED, 1000, 0, 0); + init_color(GNT_COLOR_GREEN, 0, 1000, 0); + init_color(GNT_COLOR_BLUE, 0, 0, 1000); + init_color(GNT_COLOR_WHITE, 1000, 1000, 1000); + init_color(GNT_COLOR_GRAY, 799, 799, 799); + init_color(GNT_COLOR_DARK_GRAY, 256, 256, 256); - /* Now some init_pair()s */ - init_pair(GNT_COLOR_NORMAL, GNT_COLOR_BLACK, GNT_COLOR_WHITE); - init_pair(GNT_COLOR_HIGHLIGHT, GNT_COLOR_BLUE, GNT_COLOR_GRAY); - init_pair(GNT_COLOR_SHADOW, GNT_COLOR_BLACK, GNT_COLOR_DARK_GRAY); - init_pair(GNT_COLOR_TITLE, GNT_COLOR_WHITE, GNT_COLOR_DARK_GRAY); + /* Now some init_pair()s */ + init_pair(GNT_COLOR_NORMAL, GNT_COLOR_BLACK, GNT_COLOR_WHITE); + init_pair(GNT_COLOR_HIGHLIGHT, GNT_COLOR_BLUE, GNT_COLOR_GRAY); + init_pair(GNT_COLOR_SHADOW, GNT_COLOR_BLACK, GNT_COLOR_DARK_GRAY); + init_pair(GNT_COLOR_TITLE, GNT_COLOR_WHITE, GNT_COLOR_DARK_GRAY); + } + else + { + init_pair(GNT_COLOR_NORMAL, COLOR_BLACK, COLOR_WHITE); + init_pair(GNT_COLOR_HIGHLIGHT, COLOR_CYAN, COLOR_BLACK); + init_pair(GNT_COLOR_SHADOW, COLOR_BLACK, COLOR_BLACK); + init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLACK); + } } Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-22 11:12:40 UTC (rev 16309) +++ trunk/console/libgnt/gnttree.c 2006-06-22 22:38:03 UTC (rev 16310) @@ -47,14 +47,17 @@ wbkgd(tree->scroll, COLOR_PAIR(GNT_COLOR_NORMAL)); - /* XXX: Add the rows */ for (start = tree->top, iter = g_list_nth(tree->list, tree->top); iter && start < tree->bottom; start++, iter = iter->next) { char str[2096]; /* XXX: This should be safe for any terminal */ GntTreeRow *row = g_hash_table_lookup(tree->hash, iter->data); - snprintf(str, widget->priv.width - 2, "%s\n", row->text); + if (snprintf(str, widget->priv.width, "%s\n", row->text) >= widget->priv.width) + { + /* XXX: ellipsize */ + str[widget->priv.width - 1] = 0; + } if (start == tree->current) { @@ -83,7 +86,7 @@ /* For the Tree (or anything that scrolls), we will create a 'hidden' window * of 'large enough' size. We never wrefresh that hidden-window, instead we - * just 'scroll' it, and wrefresh the subwindow */ + * just copy stuff from it into the visible window */ if (tree->scroll == NULL) { Modified: trunk/console/libgnt/test.c =================================================================== --- trunk/console/libgnt/test.c 2006-06-22 11:12:40 UTC (rev 16309) +++ trunk/console/libgnt/test.c 2006-06-22 22:38:03 UTC (rev 16310) @@ -2,12 +2,22 @@ #include "gnt.h" #include "gntkeys.h" #include "gnttree.h" +#include "gntbox.h" static gboolean key_pressed(GntWidget *widget, const char *text, gpointer null) { GntWidget *w = null; + GntWidget *box = gnt_box_new(FALSE, FALSE); + GntWidget *label = gnt_label_new("so wassup!!"); + gnt_box_add_widget(GNT_BOX(box), label); + GNT_WIDGET_UNSET_FLAGS(box, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); + gnt_box_set_title(GNT_BOX(box), "This is a test"); + + gnt_widget_show(box); +#if 0 + gnt_widget_set_focus(w, TRUE); /* XXX: This is to just test stuff */ @@ -24,6 +34,7 @@ } gnt_widget_draw(w); +#endif return FALSE; } @@ -75,14 +86,14 @@ gnt_widget_set_name(widget, "widget"); gnt_widget_set_name(widget2, "widget2"); - gnt_box_add_widget(vbox, widget); - gnt_box_add_widget(vbox, widget2); + gnt_box_add_widget(GNT_BOX(vbox), widget); + gnt_box_add_widget(GNT_BOX(vbox), widget2); - gnt_box_add_widget(hbox, label); - gnt_box_add_widget(hbox, vbox); + gnt_box_add_widget(GNT_BOX(hbox), label); + gnt_box_add_widget(GNT_BOX(hbox), vbox); tree = gnt_tree_new(); - gnt_box_add_widget(hbox, tree); + gnt_box_add_widget(GNT_BOX(hbox), tree); gnt_tree_add_row_after(GNT_TREE(tree), "a", "a", NULL, NULL); gnt_tree_add_row_after(GNT_TREE(tree), "c", "c", NULL, NULL); @@ -91,7 +102,7 @@ gnt_tree_add_row_after(GNT_TREE(tree), "b", "b", "d", NULL); GNT_WIDGET_UNSET_FLAGS(hbox, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); - gnt_box_set_title(hbox, "111111111111111111111111111111111111111111111111111111111111111This is the title …"); + gnt_box_set_title(GNT_BOX(hbox), "111111111111111111111111111111111111111111111111111111111111111This is the title …"); /*gnt_widget_set_take_focus(vbox, TRUE);*/ /*gnt_widget_set_take_focus(hbox, TRUE);*/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-23 00:57:36
|
Revision: 16313 Author: sadrul Date: 2006-06-22 17:57:30 -0700 (Thu, 22 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16313&view=rev Log Message: ----------- Unnecessary variables are bad, mmkay. Modified Paths: -------------- trunk/console/libgnt/gntbox.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-06-23 00:45:45 UTC (rev 16312) +++ trunk/console/libgnt/gntbox.c 2006-06-23 00:57:30 UTC (rev 16313) @@ -50,7 +50,6 @@ GntBox *box = GNT_BOX(widget); int w, h, curx, cury, max; gboolean has_border = FALSE; - int x, y; w = h = 0; max = -1; Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-23 00:45:45 UTC (rev 16312) +++ trunk/console/libgnt/gnttree.c 2006-06-23 00:57:30 UTC (rev 16313) @@ -34,7 +34,7 @@ else pos = 1; - wbkgd(tree->scroll, COLOR_PAIR(GNT_COLOR_NORMAL)); + wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); for (start = tree->top, iter = g_list_nth(tree->list, tree->top); iter && start < tree->bottom; start++, iter = iter->next) @@ -57,18 +57,18 @@ if (start == tree->current) { - wbkgdset(tree->scroll, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); - mvwprintw(tree->scroll, start - tree->top + pos, pos, str); - wbkgdset(tree->scroll, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); + mvwprintw(widget->window, start - tree->top + pos, pos, str); + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); } else - mvwprintw(tree->scroll, start - tree->top + pos, pos, str); + mvwprintw(widget->window, start - tree->top + pos, pos, str); } while (start < tree->bottom) { - wmove(tree->scroll, start - tree->top + pos, pos); - wclrtoeol(tree->scroll); + wmove(widget->window, start - tree->top + pos, pos); + wclrtoeol(widget->window); start++; } @@ -80,22 +80,13 @@ { GntTree *tree = GNT_TREE(widget); - /* For the Tree (or anything that scrolls), we will create a 'hidden' window - * of 'large enough' size. We never wrefresh that hidden-window, instead we - * just copy stuff from it into the visible window */ + scrollok(widget->window, TRUE); + wsetscrreg(widget->window, 0, widget->priv.height - 1); - if (tree->scroll == NULL) - { - tree->scroll = widget->window; /* newwin(SCROLL_HEIGHT, widget->priv.width, 0, 0); */ - scrollok(tree->scroll, TRUE); - /*wsetscrreg(tree->scroll, 0, SCROLL_HEIGHT - 1);*/ - wsetscrreg(tree->scroll, 0, widget->priv.height - 1); + tree->top = 0; + tree->bottom = widget->priv.height - + (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER) ? 0 : 2); - tree->top = 0; - tree->bottom = widget->priv.height - - (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER) ? 0 : 2); - } - redraw_tree(tree); DEBUG; Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-06-23 00:45:45 UTC (rev 16312) +++ trunk/console/libgnt/gnttree.h 2006-06-23 00:57:30 UTC (rev 16313) @@ -27,8 +27,6 @@ { GntWidget parent; - WINDOW *scroll; - int current; /* current selection */ int top; /* The index in 'list' of the topmost visible item */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-23 06:24:36
|
Revision: 16314 Author: sadrul Date: 2006-06-22 23:24:25 -0700 (Thu, 22 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16314&view=rev Log Message: ----------- New widget GntEntry. It's mostly functional. Some minor improvements to the box-packing code. Minor improvements to the skeleton code for gnt, and completely change the name from my initial choice of GN (Glib and Ncurses) to GNT (Gaim Ncurses Toolkit). Modified Paths: -------------- trunk/console/libgnt/Makefile trunk/console/libgnt/gnt-skel.c trunk/console/libgnt/gnt-skel.h trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntcolors.c trunk/console/libgnt/gntkeys.h trunk/console/libgnt/gnttree.c trunk/console/libgnt/gntwidget.c trunk/console/libgnt/test.c Added Paths: ----------- trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntentry.h Modified: trunk/console/libgnt/Makefile =================================================================== --- trunk/console/libgnt/Makefile 2006-06-23 00:57:30 UTC (rev 16313) +++ trunk/console/libgnt/Makefile 2006-06-23 06:24:25 UTC (rev 16314) @@ -6,6 +6,7 @@ gntbox.h \ gntbutton.h \ gntcolors.h \ + gntentry.h \ gntlabel.h \ gnttree.h \ gntutils.h \ @@ -16,6 +17,7 @@ gntbox.c \ gntbutton.c \ gntcolors.c \ + gntentry.c \ gntlabel.c \ gnttree.c \ gntutils.c \ @@ -26,6 +28,7 @@ gntbox.o \ gntbutton.o \ gntcolors.o \ + gntentry.o \ gntlabel.o \ gnttree.o \ gntutils.o \ @@ -34,11 +37,13 @@ all: libgnt test: $(OBJECTS) +key: $(OBJECTS) gntwidget.o: gntwidget.c $(HEADERS) gntbox.o: gntbox.c $(HEADERS) gntbutton.o: gntbutton.c $(HEADERS) gntcolors.o: gntcolors.c $(HEADERS) +gntentry.o: gntentry.c $(HEADERS) gntlabel.o: gntlabel.c $(HEADERS) gnttree.o: gnttree.c $(HEADERS) gntutils.o: gntutils.c $(HEADERS) Modified: trunk/console/libgnt/gnt-skel.c =================================================================== --- trunk/console/libgnt/gnt-skel.c 2006-06-23 00:57:30 UTC (rev 16313) +++ trunk/console/libgnt/gnt-skel.c 2006-06-23 06:24:25 UTC (rev 16314) @@ -1,4 +1,4 @@ -#include "gn-skel.h" +#include "gnt-skel.h" enum { @@ -34,11 +34,17 @@ } static void +gnt_skel_destroy(GntWidget *widget) +{ +} + +static void gnt_skel_class_init(GntWidgetClass *klass) { GObjectClass *obj_class = G_OBJECT_CLASS(klass); parent_class = GNT_WIDGET_CLASS(klass); + parent_class->destroy = gnt_skel_destroy; parent_class->draw = gnt_skel_draw; parent_class->map = gnt_skel_map; parent_class->size_request = gnt_skel_size_request; Modified: trunk/console/libgnt/gnt-skel.h =================================================================== --- trunk/console/libgnt/gnt-skel.h 2006-06-23 00:57:30 UTC (rev 16313) +++ trunk/console/libgnt/gnt-skel.h 2006-06-23 06:24:25 UTC (rev 16314) @@ -1,10 +1,10 @@ #ifndef GNT_SKEL_H #define GNT_SKEL_H -#include "gnwidget.h" -#include "gn.h" -#include "gncolors.h" -#include "gnkeys.h" +#include "gntwidget.h" +#include "gnt.h" +#include "gntcolors.h" +#include "gntkeys.h" #define GNT_TYPE_SKEL (gnt_skel_get_gtype()) #define GNT_SKEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_SKEL, GntSkel)) Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-06-23 00:57:30 UTC (rev 16313) +++ trunk/console/libgnt/gntbox.c 2006-06-23 06:24:25 UTC (rev 16314) @@ -53,15 +53,13 @@ w = h = 0; max = -1; - curx = widget->priv.x + 1; - cury = widget->priv.y + 1; + curx = widget->priv.x; + cury = widget->priv.y; if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) { has_border = TRUE; - curx += box->pad; - cury += box->pad; - if (!box->vertical) - curx++; + curx += 1; + cury += 1; } for (iter = box->list; iter; iter = iter->next) @@ -84,7 +82,7 @@ if (has_border) { - curx += 2; + curx += 1; cury += 1; max += 2; } @@ -146,16 +144,44 @@ DEBUG; } +/* Ensures that the current widget can take focus */ +static void +ensure_active(GntBox *box) +{ + int investigated = 0; + int total; + + if (box->active == NULL) + box->active = box->list; + + total = g_list_length(box->list); + + while (box->active && !GNT_WIDGET_IS_FLAG_SET(box->active->data, GNT_WIDGET_CAN_TAKE_FOCUS)) + { + box->active = box->active->next; + investigated++; + } + + /* Rotate if necessary */ + if (!box->active && investigated < total) + { + box->active = box->list; + while (investigated < total && !GNT_WIDGET_IS_FLAG_SET(box->active->data, GNT_WIDGET_CAN_TAKE_FOCUS)) + { + box->active = box->active->next; + investigated++; + } + } +} + static gboolean gnt_box_key_pressed(GntWidget *widget, const char *text) { GntBox *box = GNT_BOX(widget); - /*if (box->list == NULL)*/ - /*return FALSE;*/ - + ensure_active(box); if (box->active == NULL) - box->active = box->list; + return FALSE; if (gnt_widget_key_pressed(box->active->data, text)) return TRUE; Modified: trunk/console/libgnt/gntcolors.c =================================================================== --- trunk/console/libgnt/gntcolors.c 2006-06-23 00:57:30 UTC (rev 16313) +++ trunk/console/libgnt/gntcolors.c 2006-06-23 06:24:25 UTC (rev 16314) @@ -19,6 +19,7 @@ init_pair(GNT_COLOR_HIGHLIGHT, GNT_COLOR_BLUE, GNT_COLOR_GRAY); init_pair(GNT_COLOR_SHADOW, GNT_COLOR_BLACK, GNT_COLOR_DARK_GRAY); init_pair(GNT_COLOR_TITLE, GNT_COLOR_WHITE, GNT_COLOR_DARK_GRAY); + init_pair(GNT_COLOR_TEXT_NORMAL, GNT_COLOR_BLACK, GNT_COLOR_GRAY); } else { @@ -26,6 +27,7 @@ init_pair(GNT_COLOR_HIGHLIGHT, COLOR_CYAN, COLOR_BLACK); init_pair(GNT_COLOR_SHADOW, COLOR_BLACK, COLOR_BLACK); init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLACK); + init_pair(GNT_COLOR_TEXT_NORMAL, COLOR_BLACK, COLOR_WHITE); } } Added: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c (rev 0) +++ trunk/console/libgnt/gntentry.c 2006-06-23 06:24:25 UTC (rev 16314) @@ -0,0 +1,251 @@ +#include <string.h> +#include "gntentry.h" + +enum +{ + SIGS = 1, +}; + +static GntWidgetClass *parent_class = NULL; +static guint signals[SIGS] = { 0 }; + +static void +gnt_entry_draw(GntWidget *widget) +{ + GntEntry *entry = GNT_ENTRY(widget); + int stop; + + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TEXT_NORMAL)); + mvwprintw(widget->window, 0, 0, entry->scroll); + + stop = entry->end - entry->scroll; + if (stop < widget->priv.width) + mvwhline(widget->window, 0, stop, ENTRY_CHAR, widget->priv.width - stop); + + wrefresh(widget->window); + + DEBUG; +} + +static void +gnt_entry_size_request(GntWidget *widget) +{ + GntEntry *entry = GNT_ENTRY(widget); + widget->priv.height = 1; + widget->priv.width = 20; +} + +static void +gnt_entry_map(GntWidget *widget) +{ + if (widget->priv.width == 0 || widget->priv.height == 0) + gnt_widget_size_request(widget); + DEBUG; +} + +static gboolean +gnt_entry_key_pressed(GntWidget *widget, const char *text) +{ + GntEntry *entry = GNT_ENTRY(widget); + + if (text[0] == 27) + { + if (strcmp(text + 1, GNT_KEY_DEL) == 0 && entry->cursor < entry->end) + { + memmove(entry->cursor, entry->cursor + 1, entry->end - entry->cursor + 1); + entry->end--; + gnt_entry_draw(widget); + } + else if (strcmp(text + 1, GNT_KEY_LEFT) == 0 && entry->cursor > entry->start) + { + entry->cursor--; + if (entry->cursor < entry->scroll) + entry->scroll--; + gnt_entry_draw(widget); + } + else if (strcmp(text + 1, GNT_KEY_RIGHT) == 0 && entry->cursor < entry->end) + { + entry->cursor++; + if (entry->cursor - entry->scroll > widget->priv.width) + entry->scroll++; + gnt_entry_draw(widget); + } + /* XXX: handle other keys, like home/end, and ctrl+ goodness */ + } + else + { + if (!iscntrl(text[0])) + { + int i; + + for (i = 0; text[i]; i++) + { + /* Valid input? */ + if (ispunct(text[i]) && (entry->flag & GNT_ENTRY_FLAG_NO_PUNCT)) + continue; + if (isspace(text[i]) && (entry->flag & GNT_ENTRY_FLAG_NO_SPACE)) + continue; + if (isalpha(text[i]) && !(entry->flag & GNT_ENTRY_FLAG_ALPHA)) + continue; + if (isdigit(text[i]) && !(entry->flag & GNT_ENTRY_FLAG_INT)) + continue; + + /* Reached the max? */ + if (entry->max && entry->end - entry->start >= entry->max) + continue; + + if (entry->end - entry->start >= entry->buffer) + { + char *tmp = g_strdup_printf(entry->start); + gnt_entry_set_text(entry, tmp); + g_free(tmp); + } + + *(entry->cursor) = text[i]; + entry->cursor++; + + entry->end++; + if (entry->cursor - entry->scroll > widget->priv.width) + entry->scroll++; + } + gnt_entry_draw(widget); + } + else + { + /* Backspace is here */ + if (strcmp(text, GNT_KEY_BACKSPACE) == 0 && entry->cursor > entry->start) + { + entry->cursor--; + memmove(entry->cursor, entry->cursor + 1, entry->end - entry->cursor); + entry->end--; + + if (entry->scroll > entry->start) + entry->scroll--; + + gnt_entry_draw(widget); + } + } + } + + return FALSE; +} + +static void +gnt_entry_destroy(GntWidget *widget) +{ + GntEntry *entry = GNT_ENTRY(widget); + g_free(entry->start); +} + +static void +gnt_entry_class_init(GntWidgetClass *klass) +{ + GObjectClass *obj_class = G_OBJECT_CLASS(klass); + + parent_class = GNT_WIDGET_CLASS(klass); + parent_class->destroy = gnt_entry_destroy; + parent_class->draw = gnt_entry_draw; + parent_class->map = gnt_entry_map; + parent_class->size_request = gnt_entry_size_request; + parent_class->key_pressed = gnt_entry_key_pressed; + + DEBUG; +} + +static void +gnt_entry_init(GTypeInstance *instance, gpointer class) +{ + GntEntry *entry = GNT_ENTRY(instance); + + entry->flag = GNT_ENTRY_FLAG_ALL; + entry->max = 0; + + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(entry), + GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW | GNT_WIDGET_CAN_TAKE_FOCUS); + + DEBUG; +} + +/****************************************************************************** + * GntEntry API + *****************************************************************************/ +GType +gnt_entry_get_gtype(void) +{ + static GType type = 0; + + if(type == 0) + { + static const GTypeInfo info = { + sizeof(GntEntryClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc)gnt_entry_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof(GntEntry), + 0, /* n_preallocs */ + gnt_entry_init, /* instance_init */ + }; + + type = g_type_register_static(GNT_TYPE_WIDGET, + "GntEntry", + &info, 0); + } + + return type; +} + +GntWidget *gnt_entry_new(const char *text) +{ + GntWidget *widget = g_object_new(GNT_TYPE_ENTRY, NULL); + GntEntry *entry = GNT_ENTRY(widget); + + gnt_entry_set_text(entry, text); + + return widget; +} + +void gnt_entry_set_text(GntEntry *entry, const char *text) +{ + int len; + int scroll, cursor; + + g_free(entry->start); + + if (text && text[0]) + { + len = g_utf8_strlen(text, -1); + entry->buffer = len * 2; + } + else + { + entry->buffer = 128; + len = 0; + } + + scroll = entry->scroll - entry->start; + cursor = entry->end - entry->cursor; + + entry->start = g_new0(char, entry->buffer); + if (text) + snprintf(entry->start, len + 1, "%s", text); + entry->end = entry->start + len; + + entry->scroll = entry->start + scroll; + entry->cursor = entry->end - cursor; + + /* XXX: redraw if necessary? */ +} + +void gnt_entry_set_max(GntEntry *entry, int max) +{ + entry->max = max; +} + +void gnt_entry_set_flag(GntEntry *entry, GntEntryFlag flag) +{ + entry->flag = flag; + /* XXX: Check the existing string to make sure the flags are respected? */ +} + Property changes on: trunk/console/libgnt/gntentry.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/gntentry.h =================================================================== --- trunk/console/libgnt/gntentry.h (rev 0) +++ trunk/console/libgnt/gntentry.h 2006-06-23 06:24:25 UTC (rev 16314) @@ -0,0 +1,78 @@ +#ifndef GNT_ENTRY_H +#define GNT_ENTRY_H + +#include "gntwidget.h" +#include "gnt.h" +#include "gntcolors.h" +#include "gntkeys.h" + +#define GNT_TYPE_ENTRY (gnt_entry_get_gtype()) +#define GNT_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_ENTRY, GntEntry)) +#define GNT_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_ENTRY, GntEntryClass)) +#define GNT_IS_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNT_TYPE_ENTRY)) +#define GNT_IS_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_ENTRY)) +#define GNT_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_ENTRY, GntEntryClass)) + +#define GNT_ENTRY_FLAGS(obj) (GNT_ENTRY(obj)->priv.flags) +#define GNT_ENTRY_SET_FLAGS(obj, flags) (GNT_ENTRY_FLAGS(obj) |= flags) +#define GNT_ENTRY_UNSET_FLAGS(obj, flags) (GNT_ENTRY_FLAGS(obj) &= ~(flags)) + +#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 enum +{ + GNT_ENTRY_FLAG_ALPHA = 1 << 0, /* Only alpha */ + GNT_ENTRY_FLAG_INT = 1 << 1, /* Only integer */ + GNT_ENTRY_FLAG_NO_SPACE = 1 << 2, /* No blank space is allowed */ + GNT_ENTRY_FLAG_NO_PUNCT = 1 << 3, /* No punctuations */ + GNT_ENTRY_FLAG_MASK = 1 << 4, /* Mask the inputs */ +} GntEntryFlag; + +#define GNT_ENTRY_FLAG_ALL (GNT_ENTRY_FLAG_ALPHA | GNT_ENTRY_FLAG_INT) + +struct _GnEntry +{ + GntWidget parent; + + GntEntryFlag flag; + + char *start; + char *end; + char *scroll; /* Current scrolling position */ + char *cursor; /* Cursor location */ + /* 0 <= cursor - scroll < widget-width */ + + size_t buffer; /* Size of the buffer */ + + int max; /* 0 means infinite */ +}; + +struct _GnEntryClass +{ + GntWidgetClass parent; + + void (*gnt_reserved1)(void); + void (*gnt_reserved2)(void); + void (*gnt_reserved3)(void); + void (*gnt_reserved4)(void); +}; + +G_BEGIN_DECLS + +GType gnt_entry_get_gtype(void); + +GntWidget *gnt_entry_new(const char *text); + +void gnt_entry_set_max(GntEntry *entry, int max); + +void gnt_entry_set_text(GntEntry *entry, const char *text); + +void gnt_entry_set_flag(GntEntry *entry, GntEntryFlag flag); + +G_END_DECLS + +#endif /* GNT_ENTRY_H */ Property changes on: trunk/console/libgnt/gntentry.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/libgnt/gntkeys.h =================================================================== --- trunk/console/libgnt/gntkeys.h 2006-06-23 00:57:30 UTC (rev 16313) +++ trunk/console/libgnt/gntkeys.h 2006-06-23 06:24:25 UTC (rev 16314) @@ -1,14 +1,17 @@ #ifndef GNT_KEYS_H #define GNT_KEYS_H -#define GNT_KEY_POPUP "[29~" +#define GNT_KEY_POPUP "[29~" /* Arrow keys */ -#define GNT_KEY_LEFT "[D" -#define GNT_KEY_RIGHT "[C" -#define GNT_KEY_UP "[A" -#define GNT_KEY_DOWN "[B" +#define GNT_KEY_LEFT "[D" +#define GNT_KEY_RIGHT "[C" +#define GNT_KEY_UP "[A" +#define GNT_KEY_DOWN "[B" -#define GNT_KEY_ENTER "\r" +#define GNT_KEY_ENTER "\r" +#define GNT_KEY_BACKSPACE "\177" +#define GNT_KEY_DEL "[3~" + #endif Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-23 00:57:30 UTC (rev 16313) +++ trunk/console/libgnt/gnttree.c 2006-06-23 06:24:25 UTC (rev 16314) @@ -46,11 +46,11 @@ if ((wr = snprintf(str, widget->priv.width, "%s", row->text)) >= widget->priv.width) { /* XXX: ellipsize */ - str[widget->priv.width - 1] = 0; + str[widget->priv.width - 1 - pos] = 0; } else { - while (wr < widget->priv.width - 1) + while (wr < widget->priv.width - 1 - pos) str[wr++] = ' '; str[wr] = 0; } @@ -67,8 +67,8 @@ while (start < tree->bottom) { - wmove(widget->window, start - tree->top + pos, pos); - wclrtoeol(widget->window); + mvwhline(widget->window, start - tree->top + pos, pos, ' ', + widget->priv.width - pos * 2); start++; } Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-06-23 00:57:30 UTC (rev 16313) +++ trunk/console/libgnt/gntwidget.c 2006-06-23 06:24:25 UTC (rev 16314) @@ -286,6 +286,8 @@ 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; g_signal_emit(widget, signals[SIG_KEY_PRESSED], 0, keys, &ret); return ret; } Modified: trunk/console/libgnt/test.c =================================================================== --- trunk/console/libgnt/test.c 2006-06-23 00:57:30 UTC (rev 16313) +++ trunk/console/libgnt/test.c 2006-06-23 06:24:25 UTC (rev 16314) @@ -90,8 +90,10 @@ gnt_box_add_widget(GNT_BOX(vbox), widget2); gnt_box_add_widget(GNT_BOX(hbox), label); - gnt_box_add_widget(GNT_BOX(hbox), vbox); + /*gnt_box_add_widget(GNT_BOX(hbox), vbox);*/ + gnt_box_add_widget(GNT_BOX(hbox), gnt_entry_new("a")); + tree = gnt_tree_new(); gnt_box_add_widget(GNT_BOX(hbox), tree); @@ -106,11 +108,11 @@ /*gnt_widget_set_take_focus(vbox, TRUE);*/ /*gnt_widget_set_take_focus(hbox, TRUE);*/ - gnt_widget_set_position(hbox, 10, 10); + /*gnt_widget_set_position(hbox, 10, 10);*/ gnt_widget_show(hbox); - g_signal_connect(hbox, "key_pressed", G_CALLBACK(key_pressed), widget); + /*g_signal_connect(hbox, "key_pressed", G_CALLBACK(key_pressed), widget);*/ g_signal_connect(widget, "activate", G_CALLBACK(button1), hbox); g_signal_connect(widget2, "activate", G_CALLBACK(button2), hbox); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-27 02:34:06
|
Revision: 16355 Author: sadrul Date: 2006-06-26 19:33:55 -0700 (Mon, 26 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16355&view=rev Log Message: ----------- Change the behaviour of the widgets about how they update themselves. This makes things a little better, and hopefully easier to build more stuff on top of this. Modified Paths: -------------- trunk/console/libgnt/gnt.h trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbox.h trunk/console/libgnt/gntbutton.c trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntlabel.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gntwidget.c trunk/console/libgnt/gntwidget.h Modified: trunk/console/libgnt/gnt.h =================================================================== --- trunk/console/libgnt/gnt.h 2006-06-26 19:54:53 UTC (rev 16354) +++ trunk/console/libgnt/gnt.h 2006-06-27 02:33:55 UTC (rev 16355) @@ -11,3 +11,4 @@ void gnt_screen_release(GntWidget *widget); +void gnt_scree_update(GntWidget *widget); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-06-26 19:54:53 UTC (rev 16354) +++ trunk/console/libgnt/gntbox.c 2006-06-27 02:33:55 UTC (rev 16355) @@ -12,15 +12,11 @@ gnt_box_draw(GntWidget *widget) { GntBox *box = GNT_BOX(widget); - GList *iter; - for (iter = box->list; iter; iter = iter->next) - { - GntWidget *w = GNT_WIDGET(iter->data); - gnt_widget_draw(w); - overwrite(w->window, widget->window); - } + g_list_foreach(box->list, (GFunc)gnt_widget_draw, NULL); + gnt_box_sync_children(box); + if (box->title) { gchar *title = g_strdup(box->title); @@ -40,9 +36,6 @@ mvwprintw(widget->window, 0, pos, title); g_free(title); } - wrefresh(widget->window); - - gnt_screen_occupy(widget); DEBUG; } @@ -376,3 +369,16 @@ GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); } +void gnt_box_sync_children(GntBox *box) +{ + GList *iter; + GntWidget *widget = GNT_WIDGET(box); + + for (iter = box->list; iter; iter = iter->next) + { + GntWidget *w = GNT_WIDGET(iter->data); + copywin(w->window, widget->window, 0, 0, w->priv.y - widget->priv.y, w->priv.x - widget->priv.x, + w->priv.height, w->priv.width, FALSE); + } +} + Modified: trunk/console/libgnt/gntbox.h =================================================================== --- trunk/console/libgnt/gntbox.h 2006-06-26 19:54:53 UTC (rev 16354) +++ trunk/console/libgnt/gntbox.h 2006-06-27 02:33:55 UTC (rev 16355) @@ -57,6 +57,8 @@ void gnt_box_set_toplevel(GntBox *box, gboolean set); +void gnt_box_sync_children(GntBox *box); + G_END_DECLS #endif /* GNT_BOX_H */ Modified: trunk/console/libgnt/gntbutton.c =================================================================== --- trunk/console/libgnt/gntbutton.c 2006-06-26 19:54:53 UTC (rev 16354) +++ trunk/console/libgnt/gntbutton.c 2006-06-27 02:33:55 UTC (rev 16355) @@ -21,8 +21,6 @@ wbkgdset(widget->window, '\0' | COLOR_PAIR(type)); mvwprintw(widget->window, 1, 1, button->priv->text); - wrefresh(widget->window); - DEBUG; } Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-06-26 19:54:53 UTC (rev 16354) +++ trunk/console/libgnt/gntentry.c 2006-06-27 02:33:55 UTC (rev 16355) @@ -22,8 +22,6 @@ if (stop < widget->priv.width) mvwhline(widget->window, 0, stop, ENTRY_CHAR, widget->priv.width - stop); - wrefresh(widget->window); - DEBUG; } Modified: trunk/console/libgnt/gntlabel.c =================================================================== --- trunk/console/libgnt/gntlabel.c 2006-06-26 19:54:53 UTC (rev 16354) +++ trunk/console/libgnt/gntlabel.c 2006-06-27 02:33:55 UTC (rev 16355) @@ -24,7 +24,6 @@ wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); mvwprintw(widget->window, 0, 0, label->text); - wrefresh(widget->window); DEBUG; } Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-06-26 19:54:53 UTC (rev 16354) +++ trunk/console/libgnt/gntmain.c 2006-06-27 02:33:55 UTC (rev 16355) @@ -142,6 +142,8 @@ if (value == NULL) return; + if (n->me == nu->me) + return; if (n->me->priv.x + n->me->priv.width < nu->me->priv.x) return; @@ -153,15 +155,24 @@ if (nu->me->priv.y + nu->me->priv.height < n->me->priv.y) return; - n->above = g_list_prepend(n->above, nu->me); - nu->below = g_list_prepend(nu->below, n->me); + n->above = g_list_prepend(n->above, nu); + nu->below = g_list_prepend(nu->below, n); } void gnt_screen_occupy(GntWidget *widget) { - /* XXX: what happens if this is called more than once for the same widget? - * perhaps _release first? */ - GntNode *node = g_new0(GntNode, 1); + GntNode *node; + + if (widget->parent) + { + while (widget->parent) + widget = widget->parent; + } + + if (g_hash_table_lookup(nodes, widget)) + return; /* XXX: perhaps _update instead? */ + + node = g_new0(GntNode, 1); node->me = widget; g_hash_table_foreach(nodes, check_intersection, node); @@ -170,16 +181,21 @@ void gnt_screen_release(GntWidget *widget) { + WINDOW *win; GList *iter; GntNode *node = g_hash_table_lookup(nodes, widget); if (node == NULL || node->below == NULL) /* Yay! Nothing to do. */ return; + win = dupwin(widget->window); + werase(win); + /* XXX: This is not going to work. * It will be necessary to build a topology and go from there. */ for (iter = node->below; iter; iter = iter->next) { - GntWidget *w = iter->data; + GntNode *n = iter->data; + GntWidget *w = n->me; int left, right, top, bottom; left = MAX(widget->priv.x, w->priv.x) - w->priv.x; @@ -188,9 +204,61 @@ top = MAX(widget->priv.y, w->priv.y) - w->priv.y; bottom = MIN(widget->priv.y + widget->priv.height, w->priv.y + w->priv.height) - w->priv.y; - gnt_widget_expose(w, left, top, right - left, bottom - top); + copywin(w->window, win, top, left, + w->priv.y + top, + w->priv.x + left, + w->priv.y + bottom - top - 1, + w->priv.x + right - left - 1, FALSE); + n->above = g_list_remove(n->above, node); } + wrefresh(win); + delwin(win); + g_hash_table_remove(nodes, widget); } +void gnt_screen_update(GntWidget *widget) +{ + GList *iter; + WINDOW *win; + GntNode *node; + + if (widget->parent) + { + while (widget->parent) + widget = widget->parent; + } + + gnt_box_sync_children(widget); + node = g_hash_table_lookup(nodes, widget); + + win = dupwin(widget->window); + + if (node && node->above) + { + /* XXX: Same here: need to build a topology first. */ + for (iter = node->above; iter; iter = iter->next) + { + GntNode *n = iter->data; + GntWidget *w = n->me; + int left, right, top, bottom; + + left = MAX(widget->priv.x, w->priv.x) - w->priv.x; + right = MIN(widget->priv.x + widget->priv.width, w->priv.x + w->priv.width) - w->priv.x; + + top = MAX(widget->priv.y, w->priv.y) - w->priv.y; + bottom = MIN(widget->priv.y + widget->priv.height, w->priv.y + w->priv.height) - w->priv.y; + + copywin(w->window, win, top, left, + w->priv.y + top, + w->priv.x + left, + w->priv.y + bottom - top - 1, + w->priv.x + right - left - 1, FALSE); + } + } + + wrefresh(win); + delwin(win); +} + Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-26 19:54:53 UTC (rev 16354) +++ trunk/console/libgnt/gnttree.c 2006-06-27 02:33:55 UTC (rev 16355) @@ -219,7 +219,7 @@ start++; } - wrefresh(widget->window); + gnt_widget_queue_update(widget); } static void @@ -231,8 +231,6 @@ scrollok(widget->window, TRUE); wsetscrreg(widget->window, 0, widget->priv.height - 1); - tree->top = tree->root; - redraw_tree(tree); DEBUG; Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-06-26 19:54:53 UTC (rev 16354) +++ trunk/console/libgnt/gntwidget.c 2006-06-27 02:33:55 UTC (rev 16355) @@ -219,8 +219,15 @@ void gnt_widget_destroy(GntWidget *obj) { + int id; g_return_if_fail(GNT_IS_WIDGET(obj)); + if ((id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(obj), "gnt:queue_update")))) + { + g_source_remove(id); + g_object_set_data(G_OBJECT(obj), "gnt:queue_update", NULL); + } + gnt_widget_hide(obj); delwin(obj->window); if(!(GNT_WIDGET_FLAGS(obj) & GNT_WIDGET_DESTROYING)) @@ -244,24 +251,29 @@ { /* Draw the widget */ DEBUG; + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_DRAWING)) + return; + + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_DRAWING); if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_MAPPED)) + { gnt_widget_map(widget); + gnt_screen_occupy(widget); + } - if (widget->window) + if (widget->window == NULL) { - delwin(widget->window); + /* XXX: It may be necessary to make sure the size hasn't changed */ + widget->window = newwin(widget->priv.height, widget->priv.width, + widget->priv.y, widget->priv.x); + wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); } - - widget->window = newwin(widget->priv.height, widget->priv.width, - widget->priv.y, widget->priv.x); - wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); + if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) - { box(widget->window, 0, 0); - } else werase(widget->window); - + #if 0 /* XXX: No shadow for now :( */ if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_SHADOW)) @@ -276,10 +288,12 @@ touchline(widget->back, 0, widget->priv.height); wrefresh(widget->back); } -#endif wrefresh(widget->window); +#endif g_signal_emit(widget, signals[SIG_DRAW], 0); + gnt_widget_queue_update(widget); + GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_DRAWING); } gboolean @@ -301,16 +315,9 @@ void gnt_widget_hide(GntWidget *widget) { - int i; - - /* XXX: Currently it simply empties the window. Ideally, it will - * detect what windows are immediately beneath this one, and cause - * those windows to redraw themselves by emitting the approrpiate - * expose signal. */ - wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); werase(widget->window); - wrefresh(widget->window); + gnt_screen_release(widget); } void @@ -387,3 +394,27 @@ g_signal_emit(widget, signals[SIG_ACTIVATE], 0); } +static gboolean +update_queue_callback(gpointer data) +{ + GntWidget *widget = GNT_WIDGET(data); + + if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update")) + return FALSE; + gnt_screen_update(widget); + g_object_set_data(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(FALSE)); + return FALSE; +} + +void gnt_widget_queue_update(GntWidget *widget) +{ + while (widget->parent) + widget = widget->parent; + + if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update")) + { + int id = g_timeout_add(0, update_queue_callback, widget); + g_object_set_data(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(id)); + } +} + Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-06-26 19:54:53 UTC (rev 16354) +++ trunk/console/libgnt/gntwidget.h 2006-06-27 02:33:55 UTC (rev 16355) @@ -17,8 +17,7 @@ #define GNT_WIDGET_SET_FLAGS(obj, flags) (GNT_WIDGET_FLAGS(obj) |= flags) #define GNT_WIDGET_UNSET_FLAGS(obj, flags) (GNT_WIDGET_FLAGS(obj) &= ~(flags)) #define GNT_WIDGET_IS_FLAG_SET(obj, flags) (GNT_WIDGET_FLAGS(obj) & (flags)) -#define DEBUG -//#define DEBUG printf("%s\n", __FUNCTION__) +#define DEBUG fprintf(stderr, "%s\n", __FUNCTION__) typedef struct _GnWidget GntWidget; typedef struct _GnWidgetPriv GntWidgetPriv; @@ -28,16 +27,18 @@ typedef enum _GnWidgetFlags { - GNT_WIDGET_DESTROYING = 1 << 0, - GNT_WIDGET_CAN_TAKE_FOCUS= 1 << 1, - GNT_WIDGET_MAPPED = 1 << 2, + GNT_WIDGET_DESTROYING = 1 << 0, + GNT_WIDGET_CAN_TAKE_FOCUS = 1 << 1, + GNT_WIDGET_MAPPED = 1 << 2, /* XXX: Need to set the following two as properties, and setup a callback whenever these * get chnaged. */ - GNT_WIDGET_NO_BORDER = 1 << 3, - GNT_WIDGET_NO_SHADOW = 1 << 4, - GNT_WIDGET_HAS_FOCUS = 1 << 5 + GNT_WIDGET_NO_BORDER = 1 << 3, + GNT_WIDGET_NO_SHADOW = 1 << 4, + GNT_WIDGET_HAS_FOCUS = 1 << 5, + GNT_WIDGET_DRAWING = 1 << 6 } GntWidgetFlags; +/* XXX: I'll have to ask grim what he's using this for in guifications. */ typedef enum _GnParamFlags { GNT_PARAM_SERIALIZABLE = 1 << G_PARAM_USER_SHIFT @@ -112,6 +113,10 @@ void gnt_widget_set_name(GntWidget *widget, const char *name); +/* Widget-subclasses should call this from the draw-callback. + * Applications should just call gnt_widget_draw instead of this. */ +void gnt_widget_queue_update(GntWidget *widget); + G_END_DECLS #endif /* GNT_WIDGET_H */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-28 00:17:45
|
Revision: 16362 Author: sadrul Date: 2006-06-27 17:17:35 -0700 (Tue, 27 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16362&view=rev Log Message: ----------- New widget GntTextView. It's really simple as it is. But it 'works'. Modified Paths: -------------- trunk/console/libgnt/Makefile trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntcolors.c trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntentry.h trunk/console/libgnt/gnttree.c trunk/console/libgnt/gntwidget.c Added Paths: ----------- trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttextview.h Modified: trunk/console/libgnt/Makefile =================================================================== --- trunk/console/libgnt/Makefile 2006-06-27 21:55:47 UTC (rev 16361) +++ trunk/console/libgnt/Makefile 2006-06-28 00:17:35 UTC (rev 16362) @@ -8,6 +8,7 @@ gntcolors.h \ gntentry.h \ gntlabel.h \ + gnttextview.h \ gnttree.h \ gntutils.h \ gnt.h @@ -19,6 +20,7 @@ gntcolors.c \ gntentry.c \ gntlabel.c \ + gnttextview.c \ gnttree.c \ gntutils.c \ gntmain.c @@ -30,6 +32,7 @@ gntcolors.o \ gntentry.o \ gntlabel.o \ + gnttextview.o \ gnttree.o \ gntutils.o \ gntmain.o @@ -45,6 +48,7 @@ gntcolors.o: gntcolors.c $(HEADERS) gntentry.o: gntentry.c $(HEADERS) gntlabel.o: gntlabel.c $(HEADERS) +gnttextview.o: gnttextview.c $(HEADERS) gnttree.o: gnttree.c $(HEADERS) gntutils.o: gntutils.c $(HEADERS) gntmain.o: gntmain.c $(HEADERS) Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-06-27 21:55:47 UTC (rev 16361) +++ trunk/console/libgnt/gntbox.c 2006-06-28 00:17:35 UTC (rev 16362) @@ -374,11 +374,17 @@ GList *iter; GntWidget *widget = GNT_WIDGET(box); + /* XXX: werase first? */ + for (iter = box->list; iter; iter = iter->next) { GntWidget *w = GNT_WIDGET(iter->data); - copywin(w->window, widget->window, 0, 0, w->priv.y - widget->priv.y, w->priv.x - widget->priv.x, - w->priv.height, w->priv.width, FALSE); + copywin(w->window, widget->window, 0, 0, + w->priv.y - widget->priv.y, + w->priv.x - widget->priv.x, + w->priv.y - widget->priv.y + w->priv.height - 1, + w->priv.x - widget->priv.x + w->priv.width - 1, + FALSE); } } Modified: trunk/console/libgnt/gntcolors.c =================================================================== --- trunk/console/libgnt/gntcolors.c 2006-06-27 21:55:47 UTC (rev 16361) +++ trunk/console/libgnt/gntcolors.c 2006-06-28 00:17:35 UTC (rev 16362) @@ -20,14 +20,16 @@ init_pair(GNT_COLOR_SHADOW, GNT_COLOR_BLACK, GNT_COLOR_DARK_GRAY); init_pair(GNT_COLOR_TITLE, GNT_COLOR_WHITE, GNT_COLOR_DARK_GRAY); init_pair(GNT_COLOR_TEXT_NORMAL, GNT_COLOR_BLACK, GNT_COLOR_GRAY); + init_pair(GNT_COLOR_HIGHLIGHT_D, GNT_COLOR_BLACK, GNT_COLOR_GRAY); } else { init_pair(GNT_COLOR_NORMAL, COLOR_BLACK, COLOR_WHITE); - init_pair(GNT_COLOR_HIGHLIGHT, COLOR_CYAN, COLOR_BLACK); + init_pair(GNT_COLOR_HIGHLIGHT, COLOR_YELLOW, COLOR_BLACK); init_pair(GNT_COLOR_SHADOW, COLOR_BLACK, COLOR_BLACK); init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLACK); init_pair(GNT_COLOR_TEXT_NORMAL, COLOR_BLACK, COLOR_WHITE); + init_pair(GNT_COLOR_HIGHLIGHT_D, COLOR_CYAN, COLOR_BLACK); } } Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-06-27 21:55:47 UTC (rev 16361) +++ trunk/console/libgnt/gntentry.c 2006-06-28 00:17:35 UTC (rev 16362) @@ -29,8 +29,12 @@ gnt_entry_size_request(GntWidget *widget) { GntEntry *entry = GNT_ENTRY(widget); - widget->priv.height = 1; - widget->priv.width = 20; + + if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) + { + widget->priv.height = 1; + widget->priv.width = 20; + } } static void @@ -41,6 +45,13 @@ DEBUG; } +static void +entry_redraw(GntWidget *widget) +{ + gnt_entry_draw(widget); + gnt_widget_queue_update(widget); +} + static gboolean gnt_entry_key_pressed(GntWidget *widget, const char *text) { @@ -52,21 +63,21 @@ { memmove(entry->cursor, entry->cursor + 1, entry->end - entry->cursor + 1); entry->end--; - gnt_entry_draw(widget); + entry_redraw(widget); } else if (strcmp(text + 1, GNT_KEY_LEFT) == 0 && entry->cursor > entry->start) { entry->cursor--; if (entry->cursor < entry->scroll) entry->scroll--; - gnt_entry_draw(widget); + entry_redraw(widget); } else if (strcmp(text + 1, GNT_KEY_RIGHT) == 0 && entry->cursor < entry->end) { entry->cursor++; if (entry->cursor - entry->scroll > widget->priv.width) entry->scroll++; - gnt_entry_draw(widget); + entry_redraw(widget); } /* XXX: handle other keys, like home/end, and ctrl+ goodness */ } @@ -106,7 +117,8 @@ if (entry->cursor - entry->scroll > widget->priv.width) entry->scroll++; } - gnt_entry_draw(widget); + entry_redraw(widget); + return TRUE; } else { @@ -120,7 +132,7 @@ if (entry->scroll > entry->start) entry->scroll--; - gnt_entry_draw(widget); + entry_redraw(widget); } } } @@ -233,7 +245,8 @@ entry->scroll = entry->start + scroll; entry->cursor = entry->end - cursor; - /* XXX: redraw if necessary? */ + if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(entry), GNT_WIDGET_MAPPED)) + entry_redraw(GNT_WIDGET(entry)); } void gnt_entry_set_max(GntEntry *entry, int max) @@ -247,3 +260,16 @@ /* XXX: Check the existing string to make sure the flags are respected? */ } +const char *gnt_entry_get_text(GntEntry *entry) +{ + return entry->start; +} + +void gnt_entry_clear(GntEntry *entry) +{ + gnt_entry_set_text(entry, NULL); + entry->scroll = entry->cursor = entry->end = entry->start; + entry_redraw(GNT_WIDGET(entry)); +} + + Modified: trunk/console/libgnt/gntentry.h =================================================================== --- trunk/console/libgnt/gntentry.h 2006-06-27 21:55:47 UTC (rev 16361) +++ trunk/console/libgnt/gntentry.h 2006-06-28 00:17:35 UTC (rev 16362) @@ -69,10 +69,15 @@ void gnt_entry_set_max(GntEntry *entry, int max); +/* XXX: For now, call gnt_entry_clear before calling this */ void gnt_entry_set_text(GntEntry *entry, const char *text); void gnt_entry_set_flag(GntEntry *entry, GntEntryFlag flag); +const char *gnt_entry_get_text(GntEntry *entry); + +void gnt_entry_clear(GntEntry *entry); + G_END_DECLS #endif /* GNT_ENTRY_H */ Added: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c (rev 0) +++ trunk/console/libgnt/gnttextview.c 2006-06-28 00:17:35 UTC (rev 16362) @@ -0,0 +1,177 @@ +#include "gnttextview.h" + +enum +{ + SIGS = 1, +}; + +static GntWidgetClass *parent_class = NULL; +static guint signals[SIGS] = { 0 }; + +static void +gnt_text_view_draw(GntWidget *widget) +{ + GntTextView *view = GNT_TEXT_VIEW(widget); + + copywin(view->scroll, widget->window, view->pos, 0, 0, 0, + widget->priv.height - 1, widget->priv.width - 1, FALSE); + + DEBUG; +} + +static void +gnt_text_view_size_request(GntWidget *widget) +{ + if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) + { + gnt_widget_set_size(widget, 64, 24); + } +} + +static void +gnt_text_view_map(GntWidget *widget) +{ + if (widget->priv.width == 0 || widget->priv.height == 0) + gnt_widget_size_request(widget); + DEBUG; +} + +static gboolean +gnt_text_view_key_pressed(GntWidget *widget, const char *text) +{ + return FALSE; +} + +static void +gnt_text_view_destroy(GntWidget *widget) +{ +} + +static void +gnt_text_view_class_init(GntTextViewClass *klass) +{ + GObjectClass *obj_class = G_OBJECT_CLASS(klass); + + parent_class = GNT_WIDGET_CLASS(klass); + parent_class->destroy = gnt_text_view_destroy; + parent_class->draw = gnt_text_view_draw; + parent_class->map = gnt_text_view_map; + parent_class->size_request = gnt_text_view_size_request; + parent_class->key_pressed = gnt_text_view_key_pressed; + + DEBUG; +} + +static void +gnt_text_view_init(GTypeInstance *instance, gpointer class) +{ + DEBUG; +} + +/****************************************************************************** + * GntTextView API + *****************************************************************************/ +GType +gnt_text_view_get_gtype(void) +{ + static GType type = 0; + + if(type == 0) + { + static const GTypeInfo info = { + sizeof(GntTextViewClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc)gnt_text_view_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof(GntTextView), + 0, /* n_preallocs */ + gnt_text_view_init, /* instance_init */ + }; + + type = g_type_register_static(GNT_TYPE_WIDGET, + "GntTextView", + &info, 0); + } + + return type; +} + +GntWidget *gnt_text_view_new() +{ + GntWidget *widget = g_object_new(GNT_TYPE_TEXTVIEW, NULL); + GntTextView *view = GNT_TEXT_VIEW(widget); + + view->scroll = newwin(255, widget->priv.width, widget->priv.y, widget->priv.x); + scrollok(view->scroll, TRUE); + wsetscrreg(view->scroll, 0, 254); + wbkgd(view->scroll, COLOR_PAIR(GNT_COLOR_NORMAL)); + werase(view->scroll); + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER); + + return widget; +} + +void gnt_text_view_append_text_with_flags(GntTextView *view, const char *text, GntTextViewFlags flags) +{ + GntWidget *widget = GNT_WIDGET(view); + int fl = 0; + char **split; + int i; + + if (text == NULL || *text == '\0') + return; + + if (flags & GNT_TEXT_FLAG_BOLD) + fl |= A_BOLD; + if (flags & GNT_TEXT_FLAG_UNDERLINE) + fl |= A_UNDERLINE; + if (flags & GNT_TEXT_FLAG_BLINK) + fl |= A_BLINK; + + wattrset(view->scroll, fl | COLOR_PAIR(GNT_COLOR_NORMAL)); + + split = g_strsplit(text, "\n", 0); + for (i = 0; split[i + 1]; i++) + { + /* XXX: Do something if the strlen of split[i] is big + * enough to cause the text to wrap. */ + wprintw(view->scroll, "%s\n", split[i]); + view->lines++; + } + wprintw(view->scroll, "%s", split[i]); + g_strfreev(split); + + gnt_widget_draw(widget); +} + +void gnt_text_view_scroll(GntTextView *view, int scroll) +{ + GntWidget *widget = GNT_WIDGET(view); + int height; + + if (scroll == 0) + { + view->pos = view->lines - widget->priv.height + 1; + } + else + { + view->pos += scroll; + } + + if (view->pos + (height = widget->priv.height) > view->lines) + view->pos = view->lines - height + 1; + + if (view->pos < 0) + view->pos = 0; + + gnt_widget_draw(GNT_WIDGET(view)); +} + +void gnt_text_view_next_line(GntTextView *view) +{ + wclrtoeol(view->scroll); + gnt_text_view_append_text_with_flags(view, "\n", 0); +} + Property changes on: trunk/console/libgnt/gnttextview.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/gnttextview.h =================================================================== --- trunk/console/libgnt/gnttextview.h (rev 0) +++ trunk/console/libgnt/gnttextview.h 2006-06-28 00:17:35 UTC (rev 16362) @@ -0,0 +1,69 @@ +#ifndef GNT_TEXT_VIEW_H +#define GNT_TEXT_VIEW_H + +#include "gntwidget.h" +#include "gnt.h" +#include "gntcolors.h" +#include "gntkeys.h" + +#define GNT_TYPE_TEXTVIEW (gnt_text_view_get_gtype()) +#define GNT_TEXT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_TEXTVIEW, GntTextView)) +#define GNT_TEXT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_TEXTVIEW, GntTextViewClass)) +#define GNT_IS_TEXTVIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNT_TYPE_TEXTVIEW)) +#define GNT_IS_TEXTVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_TEXTVIEW)) +#define GNT_TEXT_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_TEXTVIEW, GntTextViewClass)) + +#define GNT_TEXT_VIEW_FLAGS(obj) (GNT_TEXT_VIEW(obj)->priv.flags) +#define GNT_TEXT_VIEW_SET_FLAGS(obj, flags) (GNT_TEXT_VIEW_FLAGS(obj) |= flags) +#define GNT_TEXT_VIEW_UNSET_FLAGS(obj, flags) (GNT_TEXT_VIEW_FLAGS(obj) &= ~(flags)) + +typedef struct _GnTextView GntTextView; +typedef struct _GnTextViewPriv GntTextViewPriv; +typedef struct _GnTextViewClass GntTextViewClass; + +struct _GnTextView +{ + GntWidget parent; + + WINDOW *scroll; /* XXX: For now, let's do with this. */ + int pos; /* Scroll position. */ + int lines; /* No. of lines of text. */ +}; + +typedef enum +{ + GNT_TEXT_FLAG_BOLD = 1 << 0, + GNT_TEXT_FLAG_UNDERLINE = 1 << 1, + GNT_TEXT_FLAG_BLINK = 1 << 2, +} GntTextViewFlags; + +struct _GnTextViewClass +{ + GntWidgetClass parent; + + void (*gnt_reserved1)(void); + void (*gnt_reserved2)(void); + void (*gnt_reserved3)(void); + void (*gnt_reserved4)(void); +}; + +G_BEGIN_DECLS + +GType gnt_text_view_get_gtype(void); + +/* XXX: For now, don't set a textview to have any border. + * If you want borders real bad, put it in a box. */ +GntWidget *gnt_text_view_new(); + +/* scroll > 0 means scroll up, < 0 means scroll down, == 0 means scroll to the end */ +void gnt_text_view_scroll(GntTextView *view, int scroll); + +void gnt_text_view_append_text_with_flags(GntTextView *view, const char *text, GntTextViewFlags flags); + +/* Move the cursor to the beginning of the next line and resets text-attributes. + * It first completes the current line with the current text-attributes. */ +void gnt_text_view_next_line(GntTextView *view); + +G_END_DECLS + +#endif /* GNT_TEXT_VIEW_H */ Property changes on: trunk/console/libgnt/gnttextview.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-27 21:55:47 UTC (rev 16361) +++ trunk/console/libgnt/gnttree.c 2006-06-28 00:17:35 UTC (rev 16362) @@ -203,7 +203,10 @@ if (row == tree->current) { - wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_HAS_FOCUS)) + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); + else + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); /* XXX: This, somehow, doesn't work */ mvwprintw(widget->window, start, pos, str); wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); } Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-06-27 21:55:47 UTC (rev 16361) +++ trunk/console/libgnt/gntwidget.c 2006-06-28 00:17:35 UTC (rev 16362) @@ -267,13 +267,13 @@ widget->window = newwin(widget->priv.height, widget->priv.width, widget->priv.y, widget->priv.x); wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); + + if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) + box(widget->window, 0, 0); + else + werase(widget->window); } - if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) - box(widget->window, 0, 0); - else - werase(widget->window); - #if 0 /* XXX: No shadow for now :( */ if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_SHADOW)) @@ -358,6 +358,7 @@ { widget->priv.width = width; widget->priv.height = height; + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED); } gboolean This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-28 00:21:47
|
Revision: 16363 Author: sadrul Date: 2006-06-27 17:21:38 -0700 (Tue, 27 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16363&view=rev Log Message: ----------- Some examples so other people can try things out. I am planning on making the conversation-pane behave like test/tv .. comments? Added Paths: ----------- trunk/console/libgnt/test/ trunk/console/libgnt/test/Makefile trunk/console/libgnt/test/focus.c trunk/console/libgnt/test/multiwin.c trunk/console/libgnt/test/tv.c Added: trunk/console/libgnt/test/Makefile =================================================================== --- trunk/console/libgnt/test/Makefile (rev 0) +++ trunk/console/libgnt/test/Makefile 2006-06-28 00:21:38 UTC (rev 16363) @@ -0,0 +1,13 @@ +CFLAGS=`pkg-config --cflags gobject-2.0` -g -I../ +LDFLAGS=`pkg-config --libs gobject-2.0` -lncursesw -pg -lgnt -L../ + +EXAMPLES=focus tv multiwin + +all: + cd .. && make + make examples + +clean: + rm -f $(EXAMPLES) + +examples: $(EXAMPLES) Property changes on: trunk/console/libgnt/test/Makefile ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/test/focus.c =================================================================== --- trunk/console/libgnt/test/focus.c (rev 0) +++ trunk/console/libgnt/test/focus.c 2006-06-28 00:21:38 UTC (rev 16363) @@ -0,0 +1,49 @@ +#include "gntbutton.h" +#include "gnt.h" +#include "gntkeys.h" +#include "gnttree.h" +#include "gntbox.h" +#include "gntentry.h" +#include "gntlabel.h" + +int main() +{ + gnt_init(); + + GntWidget *label = gnt_label_new("So wassup dudes and dudettes!!\nSo this is, like,\nthe third line!! \\o/"); + GntWidget *vbox, *hbox, *tree; + WINDOW *test; + + box(stdscr, 0, 0); + wrefresh(stdscr); + + vbox = gnt_box_new(FALSE, FALSE); + hbox = gnt_box_new(FALSE, TRUE); + + gnt_widget_set_name(vbox, "vbox"); + gnt_widget_set_name(hbox, "hbox"); + + gnt_box_add_widget(GNT_BOX(hbox), label); + gnt_box_add_widget(GNT_BOX(hbox), vbox); + + gnt_box_add_widget(GNT_BOX(hbox), gnt_entry_new("a")); + + tree = gnt_tree_new(); + gnt_box_add_widget(GNT_BOX(hbox), tree); + + gnt_tree_add_row_after(GNT_TREE(tree), "a", "a", NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "c", "c", NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "d", "d", NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "e", "e", "a", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "b", "b", "d", NULL); + + GNT_WIDGET_UNSET_FLAGS(hbox, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); + gnt_box_set_title(GNT_BOX(hbox), "This is the title …"); + + gnt_widget_show(hbox); + + gnt_main(); + + return 0; +} + Property changes on: trunk/console/libgnt/test/focus.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c (rev 0) +++ trunk/console/libgnt/test/multiwin.c 2006-06-28 00:21:38 UTC (rev 16363) @@ -0,0 +1,64 @@ +#include "gntbutton.h" +#include "gnt.h" +#include "gntkeys.h" +#include "gnttree.h" +#include "gntbox.h" + +gboolean show(GntWidget *w) +{ + gnt_widget_draw(w); + + return TRUE; +} + +int main() +{ + gnt_init(); + + GntWidget *hbox, *tree, *box2; + + box(stdscr, 0, 0); + wrefresh(stdscr); + + hbox = gnt_box_new(FALSE, TRUE); + box2 = gnt_box_new(FALSE, TRUE); + + gnt_widget_set_name(hbox, "hbox"); + gnt_widget_set_name(box2, "box2"); + + tree = gnt_tree_new(); + gnt_widget_set_name(tree, "tree"); + gnt_box_add_widget(GNT_BOX(hbox), tree); + + gnt_box_set_toplevel(GNT_BOX(hbox), TRUE); + gnt_box_set_title(GNT_BOX(hbox), "Testing the tree widget"); + + gnt_box_set_toplevel(GNT_BOX(box2), TRUE); + gnt_box_set_title(GNT_BOX(box2), "On top"); + + gnt_box_add_widget(GNT_BOX(box2), GNT_WIDGET(gnt_label_new("asdasd"))); + + gnt_widget_show(hbox); + gnt_widget_set_position(box2, 5, 5); + gnt_widget_show(box2); + + gnt_tree_add_row_after(GNT_TREE(tree), "a", "a", NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "c", "c", NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "d", "d", NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "e", "e", "a", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "b", "b", "d", NULL); + + gnt_tree_add_row_after(GNT_TREE(tree), "1", "1", NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "2", "2", NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "3", "3", NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "4", "4", "a", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "5", "5", "d", NULL); + + gnt_tree_add_row_after(GNT_TREE(tree), "6", "6", "4", NULL); + g_timeout_add(1000, (GSourceFunc)show, hbox); + + gnt_main(); + + return 0; +} + Property changes on: trunk/console/libgnt/test/multiwin.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/test/tv.c =================================================================== --- trunk/console/libgnt/test/tv.c (rev 0) +++ trunk/console/libgnt/test/tv.c 2006-06-28 00:21:38 UTC (rev 16363) @@ -0,0 +1,71 @@ +#include "gntbutton.h" +#include "gnt.h" +#include "gntkeys.h" +#include "gnttree.h" +#include "gntbox.h" +#include "gntentry.h" +#include "gnttextview.h" + +static gboolean +key_pressed(GntWidget *w, const char *key, GntWidget *view) +{ + if (key[0] == '\r' && key[1] == 0) + { + gnt_text_view_next_line(GNT_TEXT_VIEW(view)); + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(view), + gnt_entry_get_text(GNT_ENTRY(w)), + GNT_TEXT_FLAG_BOLD); + gnt_entry_clear(GNT_ENTRY(w)); + gnt_text_view_scroll(GNT_TEXT_VIEW(view), 0); + + return TRUE; + } + else if (key[0] == 27) + { + if (strcmp(key+1, GNT_KEY_UP)) + gnt_text_view_scroll(GNT_TEXT_VIEW(view), 1); + else if (strcmp(key+1, GNT_KEY_DOWN)) + gnt_text_view_scroll(GNT_TEXT_VIEW(view), -1); + } + + return FALSE; +} + +int main() +{ + GntWidget *hbox, *entry, *view; + + freopen(".error", "w", stderr); + + gnt_init(); + + box(stdscr, 0, 0); + wrefresh(stdscr); + + hbox = gnt_box_new(FALSE, TRUE); + gnt_widget_set_name(hbox, "hbox"); + gnt_box_set_toplevel(GNT_BOX(hbox), TRUE); + gnt_box_set_title(GNT_BOX(hbox), "Textview test"); + + entry = gnt_entry_new(NULL); + gnt_widget_set_name(entry, "entry"); + GNT_WIDGET_SET_FLAGS(entry, GNT_WIDGET_CAN_TAKE_FOCUS); + + view = gnt_text_view_new(); + gnt_widget_set_name(view, "view"); + + gnt_widget_set_size(view, getmaxx(stdscr) - 3, 15); + gnt_widget_set_size(entry, getmaxx(stdscr) - 3, 1); + + gnt_box_add_widget(GNT_BOX(hbox), view); + gnt_box_add_widget(GNT_BOX(hbox), entry); + + gnt_widget_show(hbox); + + g_signal_connect(G_OBJECT(entry), "key_pressed", G_CALLBACK(key_pressed), view); + + gnt_main(); + + return 0; +} + Property changes on: trunk/console/libgnt/test/tv.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-28 19:12:48
|
Revision: 16369 Author: sadrul Date: 2006-06-28 12:12:38 -0700 (Wed, 28 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16369&view=rev Log Message: ----------- Get rid of a whole lot of compile warnings. Modified Paths: -------------- trunk/console/libgnt/Makefile trunk/console/libgnt/gnt.h trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbutton.c trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntlabel.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gntwidget.h Modified: trunk/console/libgnt/Makefile =================================================================== --- trunk/console/libgnt/Makefile 2006-06-28 18:50:33 UTC (rev 16368) +++ trunk/console/libgnt/Makefile 2006-06-28 19:12:38 UTC (rev 16369) @@ -55,7 +55,7 @@ gntmain.o: gntmain.c $(HEADERS) libgnt: $(OBJECTS) - $(CC) --shared -o libgnt.so $(OBJECTS) + $(CC) --shared -o libgnt.so $(OBJECTS) $(LDFLAGS) clean: rm -f *.o Modified: trunk/console/libgnt/gnt.h =================================================================== --- trunk/console/libgnt/gnt.h 2006-06-28 18:50:33 UTC (rev 16368) +++ trunk/console/libgnt/gnt.h 2006-06-28 19:12:38 UTC (rev 16369) @@ -11,4 +11,6 @@ void gnt_screen_release(GntWidget *widget); -void gnt_scree_update(GntWidget *widget); +void gnt_screen_update(GntWidget *widget); + +void gnt_screen_take_focus(GntWidget *widget); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-06-28 18:50:33 UTC (rev 16368) +++ trunk/console/libgnt/gntbox.c 2006-06-28 19:12:38 UTC (rev 16369) @@ -1,5 +1,7 @@ #include "gntbox.h" +#include <string.h> + enum { SIGS = 1, @@ -238,7 +240,6 @@ static void gnt_box_lost_focus(GntWidget *widget) { - GntBox *box = GNT_BOX(widget); GntWidget *p = widget; while (p->parent) @@ -277,8 +278,6 @@ static void gnt_box_class_init(GntBoxClass *klass) { - GObjectClass *obj_class = G_OBJECT_CLASS(klass); - parent_class = GNT_WIDGET_CLASS(klass); parent_class->destroy = gnt_box_destroy; parent_class->draw = gnt_box_draw; Modified: trunk/console/libgnt/gntbutton.c =================================================================== --- trunk/console/libgnt/gntbutton.c 2006-06-28 18:50:33 UTC (rev 16368) +++ trunk/console/libgnt/gntbutton.c 2006-06-28 19:12:38 UTC (rev 16369) @@ -1,3 +1,5 @@ +#include <string.h> + #include "gntbutton.h" enum @@ -54,8 +56,6 @@ static void gnt_button_class_init(GntWidgetClass *klass) { - GObjectClass *obj_class = G_OBJECT_CLASS(klass); - parent_class = GNT_WIDGET_CLASS(klass); parent_class->draw = gnt_button_draw; parent_class->map = gnt_button_map; Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-06-28 18:50:33 UTC (rev 16368) +++ trunk/console/libgnt/gntentry.c 2006-06-28 19:12:38 UTC (rev 16369) @@ -1,4 +1,6 @@ +#include <ctype.h> #include <string.h> + #include "gntentry.h" enum @@ -28,8 +30,6 @@ static void gnt_entry_size_request(GntWidget *widget) { - GntEntry *entry = GNT_ENTRY(widget); - if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) { widget->priv.height = 1; @@ -150,8 +150,6 @@ static void gnt_entry_class_init(GntEntryClass *klass) { - GObjectClass *obj_class = G_OBJECT_CLASS(klass); - parent_class = GNT_WIDGET_CLASS(klass); parent_class->destroy = gnt_entry_destroy; parent_class->draw = gnt_entry_draw; Modified: trunk/console/libgnt/gntlabel.c =================================================================== --- trunk/console/libgnt/gntlabel.c 2006-06-28 18:50:33 UTC (rev 16368) +++ trunk/console/libgnt/gntlabel.c 2006-06-28 19:12:38 UTC (rev 16369) @@ -58,8 +58,6 @@ static void gnt_label_class_init(GntLabelClass *klass) { - GObjectClass *obj_class = G_OBJECT_CLASS(klass); - parent_class = GNT_WIDGET_CLASS(klass); parent_class->destroy = gnt_label_destroy; parent_class->draw = gnt_label_draw; Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-06-28 18:50:33 UTC (rev 16368) +++ trunk/console/libgnt/gntmain.c 2006-06-28 19:12:38 UTC (rev 16369) @@ -1,9 +1,13 @@ #include "gnt.h" +#include "gntbox.h" #include "gntkeys.h" #include "gntcolors.h" + #include <stdio.h> #include <stdlib.h> #include <locale.h> +#include <unistd.h> +#include <string.h> static GList *focus_list; static int max_x; @@ -248,7 +252,7 @@ widget = widget->parent; } - gnt_box_sync_children(widget); + gnt_box_sync_children(GNT_BOX(widget)); node = g_hash_table_lookup(nodes, widget); win = dupwin(widget->window); Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-06-28 18:50:33 UTC (rev 16368) +++ trunk/console/libgnt/gnttextview.c 2006-06-28 19:12:38 UTC (rev 16369) @@ -50,8 +50,6 @@ static void gnt_text_view_class_init(GntTextViewClass *klass) { - GObjectClass *obj_class = G_OBJECT_CLASS(klass); - parent_class = GNT_WIDGET_CLASS(klass); parent_class->destroy = gnt_text_view_destroy; parent_class->draw = gnt_text_view_draw; Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-28 18:50:33 UTC (rev 16368) +++ trunk/console/libgnt/gnttree.c 2006-06-28 19:12:38 UTC (rev 16369) @@ -47,7 +47,7 @@ get_next(GntTreeRow *row) { if (row == NULL) - return; + return NULL; return _get_next(row, !row->collapsed); } @@ -229,7 +229,6 @@ gnt_tree_draw(GntWidget *widget) { GntTree *tree = GNT_TREE(widget); - int bottom; scrollok(widget->window, TRUE); wsetscrreg(widget->window, 0, widget->priv.height - 1); @@ -330,8 +329,6 @@ static void gnt_tree_class_init(GntTreeClass *klass) { - GObjectClass *obj_class = G_OBJECT_CLASS(klass); - parent_class = GNT_WIDGET_CLASS(klass); parent_class->destroy = gnt_tree_destroy; parent_class->draw = gnt_tree_draw; @@ -432,7 +429,8 @@ GntWidget *widget = GNT_WIDGET(tree); int ret = widget->priv.height; if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) - widget->priv.height -= 2; + ret -= 2; + return ret; } void gnt_tree_scroll(GntTree *tree, int count) Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-06-28 18:50:33 UTC (rev 16368) +++ trunk/console/libgnt/gntwidget.h 2006-06-28 19:12:38 UTC (rev 16369) @@ -117,6 +117,7 @@ * Applications should just call gnt_widget_draw instead of this. */ void gnt_widget_queue_update(GntWidget *widget); +void gnt_widget_set_take_focus(GntWidget *widget, gboolean set); G_END_DECLS #endif /* GNT_WIDGET_H */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-29 18:16:24
|
Revision: 16374 Author: sadrul Date: 2006-06-29 11:16:07 -0700 (Thu, 29 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16374&view=rev Log Message: ----------- Add some autotool thingies. These work for me, I can almost swear. Added Paths: ----------- trunk/console/libgnt/AUTHORS trunk/console/libgnt/COPYING trunk/console/libgnt/ChangeLog trunk/console/libgnt/INSTALL trunk/console/libgnt/Makefile.am trunk/console/libgnt/NEWS trunk/console/libgnt/README trunk/console/libgnt/autogen.sh trunk/console/libgnt/configure.ac trunk/console/libgnt/gnt.pc.in Removed Paths: ------------- trunk/console/libgnt/Makefile Added: trunk/console/libgnt/AUTHORS =================================================================== Property changes on: trunk/console/libgnt/AUTHORS ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/COPYING =================================================================== --- trunk/console/libgnt/COPYING (rev 0) +++ trunk/console/libgnt/COPYING 2006-06-29 18:16:07 UTC (rev 16374) @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. Property changes on: trunk/console/libgnt/COPYING ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/ChangeLog =================================================================== Property changes on: trunk/console/libgnt/ChangeLog ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/INSTALL =================================================================== --- trunk/console/libgnt/INSTALL (rev 0) +++ trunk/console/libgnt/INSTALL 2006-06-29 18:16:07 UTC (rev 16374) @@ -0,0 +1,229 @@ +Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + Property changes on: trunk/console/libgnt/INSTALL ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Deleted: trunk/console/libgnt/Makefile =================================================================== --- trunk/console/libgnt/Makefile 2006-06-29 08:14:51 UTC (rev 16373) +++ trunk/console/libgnt/Makefile 2006-06-29 18:16:07 UTC (rev 16374) @@ -1,63 +0,0 @@ -CC=gcc -CFLAGS=`pkg-config --cflags gobject-2.0` -g -Wall -LDFLAGS=`pkg-config --libs gobject-2.0` -lncursesw -pg - -HEADERS = \ - gntwidget.h \ - gntbox.h \ - gntbutton.h \ - gntcolors.h \ - gntentry.h \ - gntlabel.h \ - gnttextview.h \ - gnttree.h \ - gntutils.h \ - gnt.h - -SOURCES = \ - gntwidget.c \ - gntbox.c \ - gntbutton.c \ - gntcolors.c \ - gntentry.c \ - gntlabel.c \ - gnttextview.c \ - gnttree.c \ - gntutils.c \ - gntmain.c - -OBJECTS = \ - gntwidget.o \ - gntbox.o \ - gntbutton.o \ - gntcolors.o \ - gntentry.o \ - gntlabel.o \ - gnttextview.o \ - gnttree.o \ - gntutils.o \ - gntmain.o - -all: libgnt - -test2: $(OBJECTS) -key: $(OBJECTS) - -gntwidget.o: gntwidget.c $(HEADERS) -gntbox.o: gntbox.c $(HEADERS) -gntbutton.o: gntbutton.c $(HEADERS) -gntcolors.o: gntcolors.c $(HEADERS) -gntentry.o: gntentry.c $(HEADERS) -gntlabel.o: gntlabel.c $(HEADERS) -gnttextview.o: gnttextview.c $(HEADERS) -gnttree.o: gnttree.c $(HEADERS) -gntutils.o: gntutils.c $(HEADERS) -gntmain.o: gntmain.c $(HEADERS) - -libgnt: $(OBJECTS) - $(CC) --shared -o libgnt.so $(OBJECTS) $(LDFLAGS) - -clean: - rm -f *.o - rm -f libgnt.so - Added: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am (rev 0) +++ trunk/console/libgnt/Makefile.am 2006-06-29 18:16:07 UTC (rev 16374) @@ -0,0 +1,43 @@ +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = gnt.pc + +lib_LTLIBRARIES = libgnt.la + +libgnt_la_SOURCES = \ + gntwidget.c \ + gntbox.c \ + gntbutton.c \ + gntcolors.c \ + gntentry.c \ + gntlabel.c \ + gnttextview.c \ + gnttree.c \ + gntutils.c \ + gntmain.c + +libgnt_la_headers = \ + gntwidget.h \ + gntbox.h \ + gntbutton.h \ + gntcolors.h \ + gntentry.h \ + gntkeys.h \ + gntlabel.h \ + gnttextview.h \ + gnttree.h \ + gntutils.h \ + gnt.h + +libgnt_laincludedir=$(includedir)/gnt +libgnt_lainclude_HEADERS = \ + $(libgnt_la_headers) + +libgnt_la_DEPENDENCIES = @LIBOBJS@ $(STATIC_LINK_LIBS) $(MS_LIBS) +libgnt_la_LDFLAGS = -export-dynamic +libgnt_la_LIBADD = \ + $(GLIB_LIBS) \ + $(STATIC_LINK_LIBS) \ + -lncursesw + +AM_CPPFLAGS = \ + $(GLIB_CFLAGS) Property changes on: trunk/console/libgnt/Makefile.am ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/NEWS =================================================================== Property changes on: trunk/console/libgnt/NEWS ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/README =================================================================== Property changes on: trunk/console/libgnt/README ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/autogen.sh =================================================================== --- trunk/console/libgnt/autogen.sh (rev 0) +++ trunk/console/libgnt/autogen.sh 2006-06-29 18:16:07 UTC (rev 16374) @@ -0,0 +1,48 @@ +#!/bin/sh + +(libtoolize --version) < /dev/null > /dev/null 2>&1 || { + echo; + echo "You must have libtool installed to compile LibGNT"; + echo; + exit; +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo; + echo "You must have automake installed to compile LibGNT"; + echo; + exit; +} + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo; + echo "You must have autoconf installed to compile LibGNT"; + echo; + exit; +} + +echo "Generating configuration files for LibGNT, please wait...." +echo; + +echo "Running libtoolize, please ignore non-fatal messages...." +echo n | libtoolize --copy --force || exit; + +# Add other directories to this list if people continue to experience +# brokennesses ... Obviously the real answer is for them to fix it +# themselves, but for Luke's sake we have this. +for dir in "/usr/local/share/aclocal" \ + "/opt/gnome-1.4/share/aclocal" +do + if test -d $dir ; then + ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I $dir" + fi +done + +libtoolize -c -f --automake +aclocal $ACLOCAL_FLAGS || exit; +autoheader || exit; +automake --add-missing --copy; +autoconf || exit; +automake || exit; +./configure $@ + Property changes on: trunk/console/libgnt/autogen.sh ___________________________________________________________________ Name: svn:executable + * Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/configure.ac =================================================================== --- trunk/console/libgnt/configure.ac (rev 0) +++ trunk/console/libgnt/configure.ac 2006-06-29 18:16:07 UTC (rev 16374) @@ -0,0 +1,257 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT([libgnt], [0.0.0dev], [gai...@li...]) +AC_CANONICAL_SYSTEM +AM_CONFIG_HEADER(config.h) +AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION) + +AC_PREREQ([2.50]) + +AC_PATH_PROG(sedpath, sed) + +dnl Storing configure arguments +AC_DEFINE_UNQUOTED(CONFIG_ARGS, "$ac_configure_args", [configure arguments]) + +dnl Checks for programs. +AC_PROG_CC +AC_DISABLE_STATIC +AM_PROG_LIBTOOL +LIBTOOL="$LIBTOOL --silent" +AC_PROG_INSTALL + +dnl we don't use autobreak on cygwin!! +dnl AC_CYGWIN + +dnl Checks for header files. +AC_HEADER_STDC +AC_HEADER_SYS_WAIT +AC_CHECK_HEADERS(arpa/nameser_compat.h fcntl.h sys/time.h unistd.h locale.h signal.h stdint.h regex.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_STRUCT_TM + +AC_C_BIGENDIAN + +dnl Checks for library functions. +AC_TYPE_SIGNAL +AC_FUNC_STRFTIME +AC_CHECK_FUNCS(strdup strstr atexit setlocale) + +dnl Check for inet_aton +AC_CHECK_FUNC(inet_aton, , [AC_CHECK_LIB(resolv, inet_aton, , + [AC_ERROR(inet_aton not found)])]) +AC_CHECK_LIB(resolv, __res_query) +AC_CHECK_LIB(nsl, gethostent) +AC_CHECK_FUNC(socket, , + [AC_CHECK_LIB(socket, socket, , [AC_ERROR([socket not found])])]) +dnl If all goes well, by this point the previous two checks will have +dnl pulled in -lsocket and -lnsl if we need them. +AC_CHECK_FUNC(getaddrinfo, [AC_DEFINE([HAVE_GETADDRINFO], [1], + [Define to 1 if you have the getaddrinfo function.])], + [AC_CHECK_LIB(socket, getaddrinfo, + [AC_DEFINE([HAVE_GETADDRINFO]) LIBS="-lsocket -lsnl $LIBS"], , , -lnsl)]) + +dnl Check for socklen_t (in Unix98) +AC_MSG_CHECKING(for socklen_t) +AC_TRY_COMPILE([ + #include <sys/types.h> + #include <sys/socket.h> + socklen_t x; +], [], +[ + AC_MSG_RESULT(yes) +], [ + AC_TRY_COMPILE([ + #include <sys/types.h> + #include <sys/socket.h> + int accept(int, struct sockaddr *, size_t *); + ], [], [ + AC_MSG_RESULT(size_t) + AC_DEFINE(socklen_t, size_t, [socklen_t size]) + ], [ + AC_MSG_RESULT(int) + AC_DEFINE(socklen_t, int, [socklen_t size]) + ]) +]) + +dnl to prevent the g_stat()/g_unlink() crash, +dnl (09:50:07) Robot101: LSchiere2: it's easy. +LC_SYS_LARGEFILE somewhere in configure.ac +AC_SYS_LARGEFILE + +dnl FreeBSD doesn't have libdl, dlopen is provided by libc +AC_CHECK_FUNC(dlopen, LIBDL="", [AC_CHECK_LIB(dl, dlopen, LIBDL="-ldl")]) + +AC_MSG_CHECKING(for the %z format string in strftime()) +AC_TRY_RUN([ +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#include <time.h> +#include <stdio.h> + +int main() +{ + char buf[6]; + time_t t = time(NULL); + + if (strftime(buf, sizeof(buf), "%z", localtime(&t)) != 5) + return 1; + + fprintf(stderr, "strftime(\"%%z\") yields: \"%s\"\n", buf); + + return !((buf[0] == '-' || buf[0] == '+') && + (buf[1] >= '0' && buf[1] <= '9') && + (buf[2] >= '0' && buf[2] <= '9') && + (buf[3] >= '0' && buf[3] <= '9') && + (buf[4] >= '0' && buf[4] <= '9') + ); +} +], +[ + AC_MSG_RESULT(yes) + AC_DEFINE([HAVE_STRFTIME_Z_FORMAT], [1], + [Define to 1 if you have a strftime() that supports the %z format string.]) +], +[ + AC_MSG_RESULT(no) +], +[ + # Fallback for Cross Compiling... + # This will enable the compatibility code. + AC_MSG_RESULT(no) +] +) + + +AC_CHECK_HEADER(sys/utsname.h) +AC_CHECK_FUNC(uname) + +if test "x$enable_debug" = "xyes" ; then + AC_DEFINE(DEBUG, 1, [Define if debugging is enabled.]) + enable_fatal_asserts="yes" +fi + +if test "x$enable_fatal_asserts" = "xyes" ; then + AC_DEFINE(GAIM_FATAL_ASSERTS, 1, [Define to make assertions fatal (useful for debugging).]) +fi + +if test "x$enable_deprecated" = "xno"; then + DEBUG_CFLAGS="$DEBUG_CFLAGS -DG_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED" +fi + +if test "x$GCC" = "xyes"; then + dnl We enable -Wall later. + dnl If it's set after the warning CFLAGS in the compiler invocation, it counteracts the -Wno... flags. + dnl This leads to warnings we don't want. + CFLAGS=`echo $CFLAGS |$sedpath 's/-Wall//'` + + dnl ENABLE WARNINGS SUPPORTED BY THE VERSION OF GCC IN USE + dnl + dnl Future Possibilities + dnl + dnl Consider adding -Wbad-function-cast. + dnl This leads to spurious warnings using GPOINTER_TO_INT(), et al. directly on a function call. + dnl We'd need an intermediate variable. + dnl + dnl Consider adding -Wfloat-equal. + dnl This leads to warnings with Perl. + dnl Perhaps we could write ugly configure magic and pass -Wno-float-equal down to that subdirectory. + dnl On the other hand, it's probably actually broken, so maybe the Perl folks should fix that? + dnl + dnl Consider removing -Wno-sign-compare (from the -Wextra set) and fixing all those cases. + dnl This is likely non-trivial. + dnl + for newflag in \ + "-Waggregate-return" \ + "-Wcast-align" \ + "-Wdeclaration-after-statement" \ + "-Werror-implicit-function-declaration" \ + "-Wextra -Wno-sign-compare -Wno-unused-parameter" \ + "-Winit-self" \ + "-Wmissing-declarations" \ + "-Wmissing-prototypes" \ + "-Wnested-externs" \ + "-Wpointer-arith" \ + "-Wundef" \ + ; do + orig_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $newflag" + AC_MSG_CHECKING(for $newflag option to gcc) + AC_TRY_COMPILE([], [ + int main() {return 0;} + ], [ + AC_MSG_RESULT(yes) + CFLAGS="$orig_CFLAGS" + DEBUG_CFLAGS="$DEBUG_CFLAGS $newflag" + ], [ + AC_MSG_RESULT(no) + CFLAGS="$orig_CFLAGS" + ]) + done + + if test "x$enable_fortify" = "xyes"; then + AC_MSG_CHECKING(for FORTIFY_SOURCE support) + AC_TRY_COMPILE([#include <features.h>], [ + int main() { + #if !(__GNUC_PREREQ (4, 1) \ + || (defined __GNUC_RH_RELEASE__ && __GNUC_PREREQ (4, 0)) \ + || (defined __GNUC_RH_RELEASE__ && __GNUC_PREREQ (3, 4) \ + && __GNUC_MINOR__ == 4 \ + && (__GNUC_PATCHLEVEL__ > 2 \ + || (__GNUC_PATCHLEVEL__ == 2 && __GNUC_RH_RELEASE__ >= 8)))) + #error No FORTIFY_SOURCE support + #endif + return 0; + } + ], [ + AC_MSG_RESULT(yes) + DEBUG_CFLAGS="$DEBUG_CFLAGS -D_FORTIFY_SOURCE=2" + ], [ + AC_MSG_RESULT(no) + ]) + fi + + DEBUG_CFLAGS="-Wall $DEBUG_CFLAGS" + CFLAGS="-g $CFLAGS" +fi +AC_SUBST(CFLAGS) + +PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.0.0 gobject-2.0 gmodule-2.0], + [ + AC_SUBST(GLIB_CFLAGS) + AC_SUBST(GLIB_LIBS) + ], + [ + AC_MSG_ERROR([ +*** GLib 2.0 is required to build Gaim; please make sure you have the GLib +*** development headers installed. The latest version of GLib is +*** always available at http://www.gtk.org/.]) + ]) + + +PKG_CHECK_MODULES(GAIM, [gaim], + [ + AC_SUBST(GAIM_CFLAGS) + AC_SUBST(GAIM_LIBS) + ], + [ + AC_MSG_ERROR([ +*** Need to have libgaim dude.]) + ]) + + +AC_MSG_CHECKING(for me pot o' gold) +AC_MSG_RESULT(no) +AC_CHECK_FUNCS(gethostid lrand48) +AC_CHECK_FUNCS(memcpy memmove random strchr strerror vprintf) +AC_CHECK_HEADERS(malloc.h paths.h sgtty.h stdarg.h sys/cdefs.h) +AC_CHECK_HEADERS(sys/file.h sys/filio.h sys/ioctl.h sys/msgbuf.h) +AC_CHECK_HEADERS(sys/select.h sys/uio.h sys/utsname.h sys/wait.h) +AC_CHECK_HEADERS(termios.h) +#AC_VAR_TIMEZONE_EXTERNALS + + +AC_OUTPUT([Makefile + gnt.pc + ]) + Property changes on: trunk/console/libgnt/configure.ac ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/gnt.pc.in =================================================================== --- trunk/console/libgnt/gnt.pc.in (rev 0) +++ trunk/console/libgnt/gnt.pc.in 2006-06-29 18:16:07 UTC (rev 16374) @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +datadir=@datadir@ +sysconfdir=@sysconfdir@ + +Name: LibGNT +Description: Gaim Ncurses Toolkit is a collection of curses-widgets. +Version: @VERSION@ +Requires: glib-2.0 +Cflags: -I${includedir}/gnt +Libs: -L${libdir} -lgnt -lncursesw Property changes on: trunk/console/libgnt/gnt.pc.in ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-08 02:11:20
|
Revision: 16457 Author: sadrul Date: 2006-07-07 19:11:11 -0700 (Fri, 07 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16457&view=rev Log Message: ----------- Enable resizing (Alt+r, then the arrow keys, then enter/escape to end). It 'works', but needs fine-tuning. But I am going to put it off for a later date. Some other minor decoration tweaks. Modified Paths: -------------- trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbutton.c trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntlabel.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gntutils.c trunk/console/libgnt/gntutils.h trunk/console/libgnt/gntwidget.c trunk/console/libgnt/gntwidget.h Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-07-07 21:57:15 UTC (rev 16456) +++ trunk/console/libgnt/gntbox.c 2006-07-08 02:11:11 UTC (rev 16457) @@ -39,24 +39,29 @@ if (box->title) { gchar *title = g_strdup(box->title); - int pos = g_utf8_strlen(title, -1); + int pos = g_utf8_strlen(title, -1), right; - if (pos >= widget->priv.width - 2) + if (pos >= widget->priv.width - 4) { - g_utf8_strncpy(title, box->title, widget->priv.width - 2); - pos = 1; + g_utf8_strncpy(title, box->title, widget->priv.width - 4); + pos = 2; + right = pos + g_utf8_strlen(title, -1); } else { /* XXX: Position of the title might be configurable */ + right = pos; pos = (widget->priv.width - pos) / 2; + right += pos; } if (gnt_widget_has_focus(widget)) wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TITLE)); 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); + mvwaddch(widget->window, 0, right, ACS_LTEE | COLOR_PAIR(GNT_COLOR_NORMAL)); g_free(title); } @@ -273,6 +278,34 @@ delwin(win); } +static gboolean +gnt_box_confirm_size(GntWidget *widget, int width, int height) +{ + GList *iter; + GntBox *box = GNT_BOX(widget); + int wchange, hchange; + int wc = 0, hc = 0; + + wchange = widget->priv.width - width; + hchange = widget->priv.height - height; + + /* XXX: Right now, I am trying to just apply all the changes to + * just one widget. It should be possible to distribute the + * changes to all the widgets in the box. */ + for (iter = box->list; iter; iter = iter->next) + { + GntWidget *wid = iter->data; + int w, h; + + gnt_widget_get_size(wid, &w, &h); + + if (gnt_widget_set_size(wid, w - wchange, h - hchange)) + return TRUE; + } + + return FALSE; +} + static void gnt_box_class_init(GntBoxClass *klass) { @@ -286,6 +319,7 @@ parent_class->key_pressed = gnt_box_key_pressed; parent_class->lost_focus = gnt_box_lost_focus; parent_class->gained_focus = gnt_box_gained_focus; + parent_class->confirm_size = gnt_box_confirm_size; DEBUG; } @@ -293,6 +327,9 @@ static void gnt_box_init(GTypeInstance *instance, gpointer class) { + /* Initially make both the height and width resizable. + * Update the flags as necessary when widgets are added to it. */ + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_X | GNT_WIDGET_GROW_Y); DEBUG; } @@ -344,6 +381,17 @@ { 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/gntbutton.c =================================================================== --- trunk/console/libgnt/gntbutton.c 2006-07-07 21:57:15 UTC (rev 16456) +++ trunk/console/libgnt/gntbutton.c 2006-07-08 02:11:11 UTC (rev 16457) @@ -71,6 +71,8 @@ { GntButton *button = GNT_BUTTON(instance); button->priv = g_new0(GntButtonPriv, 1); + + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(button), GNT_WIDGET_GROW_X); /* Can be resized sideways */ DEBUG; } Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-07-07 21:57:15 UTC (rev 16456) +++ trunk/console/libgnt/gntentry.c 2006-07-08 02:11:11 UTC (rev 16457) @@ -173,6 +173,7 @@ GNT_WIDGET_SET_FLAGS(GNT_WIDGET(entry), GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW | GNT_WIDGET_CAN_TAKE_FOCUS); + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(entry), GNT_WIDGET_GROW_X); DEBUG; } Modified: trunk/console/libgnt/gntlabel.c =================================================================== --- trunk/console/libgnt/gntlabel.c 2006-07-07 21:57:15 UTC (rev 16456) +++ trunk/console/libgnt/gntlabel.c 2006-07-08 02:11:11 UTC (rev 16457) @@ -70,6 +70,7 @@ static void gnt_label_init(GTypeInstance *instance, gpointer class) { + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_X | GNT_WIDGET_GROW_Y); DEBUG; } Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-07 21:57:15 UTC (rev 16456) +++ trunk/console/libgnt/gntmain.c 2006-07-08 02:11:11 UTC (rev 16457) @@ -325,6 +325,11 @@ mode = GNT_KP_MODE_WINDOW_LIST; show_window_list(); } + else if (strcmp(buffer + 1, "r") == 0 && focus_list) + { + /* Resize window */ + mode = GNT_KP_MODE_RESIZE; + } } } } @@ -405,7 +410,64 @@ lock_focus_list = 0; } } + else if (mode == GNT_KP_MODE_RESIZE) + { + if (buffer[0] == '\r' || (buffer[0] == 27 && buffer[1] == 0)) + mode = GNT_KP_MODE_NORMAL; + else if (buffer[0] == 27) + { + GntWidget *widget = focus_list->data; + gboolean changed = FALSE; + int width, height; + gnt_widget_get_size(widget, &width, &height); + + if (strcmp(buffer + 1, GNT_KEY_DOWN) == 0) + { + if (widget->priv.y + height < Y_MAX) + { + height++; + changed = TRUE; + } + } + else if (strcmp(buffer + 1, GNT_KEY_UP) == 0) + { + height--; + changed = TRUE; + } + else if (strcmp(buffer + 1, GNT_KEY_LEFT) == 0) + { + width--; + changed = TRUE; + } + else if (strcmp(buffer + 1, GNT_KEY_RIGHT) == 0) + { + if (widget->priv.x + width < X_MAX) + { + width++; + changed = TRUE; + } + } + + if (changed) + { + GntNode *node = g_hash_table_lookup(nodes, widget); + int x, y; + + gnt_widget_get_position(widget, &x, &y); + + hide_panel(node->panel); + gnt_widget_set_size(widget, width, height); + gnt_widget_set_position(widget, x, y); + gnt_widget_draw(widget); + replace_panel(node->panel, widget->window); + show_panel(node->panel); + update_panels(); + doupdate(); + } + } + } + draw_taskbar(); refresh(); @@ -477,11 +539,8 @@ { GntNode *node; - if (widget->parent) - { - while (widget->parent) - widget = widget->parent; - } + while (widget->parent) + widget = widget->parent; if (g_hash_table_lookup(nodes, widget)) return; /* XXX: perhaps _update instead? */ @@ -528,11 +587,8 @@ { GntNode *node; - if (widget->parent) - { - while (widget->parent) - widget = widget->parent; - } + while (widget->parent) + widget = widget->parent; gnt_box_sync_children(GNT_BOX(widget)); node = g_hash_table_lookup(nodes, widget); @@ -555,16 +611,14 @@ if (!widget) return FALSE; - if (widget == window_list.window) - return TRUE; - w = widget; while (widget->parent) - { widget = widget->parent; - } + if (widget == window_list.window) + return TRUE; + if (focus_list && focus_list->data == widget) { if (GNT_IS_BOX(widget) && Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-07-07 21:57:15 UTC (rev 16456) +++ trunk/console/libgnt/gnttextview.c 2006-07-08 02:11:11 UTC (rev 16457) @@ -113,6 +113,9 @@ static void gnt_text_view_init(GTypeInstance *instance, gpointer class) { + /* XXX: For now, resizing the width is not permitted. This is because + * of the way I am handling wrapped lines. */ + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_Y); DEBUG; } Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-07 21:57:15 UTC (rev 16456) +++ trunk/console/libgnt/gnttree.c 2006-07-08 02:11:11 UTC (rev 16457) @@ -385,6 +385,7 @@ static void gnt_tree_init(GTypeInstance *instance, gpointer class) { + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_X | GNT_WIDGET_GROW_Y); DEBUG; } Modified: trunk/console/libgnt/gntutils.c =================================================================== --- trunk/console/libgnt/gntutils.c 2006-07-07 21:57:15 UTC (rev 16456) +++ trunk/console/libgnt/gntutils.c 2006-07-08 02:11:11 UTC (rev 16457) @@ -130,3 +130,39 @@ data2); } +void gnt_closure_marshal_BOOLEAN__INT_INT(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*func) (gpointer data1, int, int, gpointer data2); + register func callback; + register GCClosure *cc = (GCClosure*)closure; + register gpointer data1, data2; + gboolean ret; + + g_return_if_fail(ret_value != NULL); + g_return_if_fail(n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA(closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer(param_values + 0); + } + else + { + data1 = g_value_peek_pointer(param_values + 0); + data2 = closure->data; + } + + callback = (func) (marshal_data ? marshal_data : cc->callback); + ret = callback(data1, + g_value_get_int(param_values + 1) , + g_value_get_int(param_values + 2) , + data2); + g_value_set_boolean(ret_value, ret); +} + + Modified: trunk/console/libgnt/gntutils.h =================================================================== --- trunk/console/libgnt/gntutils.h 2006-07-07 21:57:15 UTC (rev 16456) +++ trunk/console/libgnt/gntutils.h 2006-07-08 02:11:11 UTC (rev 16457) @@ -28,3 +28,10 @@ gpointer invocation_hint, gpointer marshal_data); +void gnt_closure_marshal_BOOLEAN__INT_INT(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-07-07 21:57:15 UTC (rev 16456) +++ trunk/console/libgnt/gntwidget.c 2006-07-08 02:11:11 UTC (rev 16457) @@ -4,6 +4,8 @@ #include "gntutils.h" #include "gnt.h" +#define MIN_SIZE 5 + enum { SIG_DESTROY, @@ -15,6 +17,7 @@ SIG_ACTIVATE, SIG_EXPOSE, SIG_SIZE_REQUEST, + SIG_CONFIRM_SIZE, SIG_POSITION, SIGS }; @@ -22,6 +25,8 @@ static GObjectClass *parent_class = NULL; static guint signals[SIGS] = { 0 }; +static void init_widget(GntWidget *widget); + static void gnt_widget_init(GTypeInstance *instance, gpointer class) { @@ -63,6 +68,18 @@ gnt_widget_draw(widget); } +static gboolean +gnt_widget_dummy_confirm_size(GntWidget *widget, int width, int height) +{ + if (width < MIN_SIZE || height < MIN_SIZE) + return FALSE; + 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; + return TRUE; +} + static void gnt_widget_class_init(GntWidgetClass *klass) { @@ -79,6 +96,7 @@ klass->map = gnt_widget_map; klass->lost_focus = gnt_widget_focus_change; klass->gained_focus = gnt_widget_focus_change; + klass->confirm_size = gnt_widget_dummy_confirm_size; klass->key_pressed = NULL; klass->activate = NULL; @@ -155,6 +173,14 @@ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + signals[SIG_CONFIRM_SIZE] = + g_signal_new("confirm_size", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GntWidgetClass, confirm_size), + NULL, NULL, + gnt_closure_marshal_BOOLEAN__INT_INT, + G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_INT); signals[SIG_KEY_PRESSED] = g_signal_new("key_pressed", G_TYPE_FROM_CLASS(klass), @@ -270,23 +296,8 @@ widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, widget->priv.y, widget->priv.x); - wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); - if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) - { - WINDOW *tmp = derwin(widget->window, widget->priv.height, widget->priv.width, 0, 0); - box(tmp, 0, 0); - delwin(tmp); - } - else - werase(widget->window); - - if (shadow) - { - wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_SHADOW)); - mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height); - mvwhline(widget->window, widget->priv.height, 1, ' ', widget->priv.width); - } + init_widget(widget); } g_signal_emit(widget, signals[SIG_DRAW], 0); @@ -362,12 +373,65 @@ } -void +static void +init_widget(GntWidget *widget) +{ + gboolean shadow = TRUE; + + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + shadow = FALSE; + + wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); + werase(widget->window); + + if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) + { + WINDOW *tmp = derwin(widget->window, widget->priv.height, widget->priv.width, 0, 0); + box(tmp, 0, 0); + delwin(tmp); + } + + if (shadow) + { + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_SHADOW)); + mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height); + mvwhline(widget->window, widget->priv.height, 1, ' ', widget->priv.width); + } +} + +gboolean gnt_widget_set_size(GntWidget *widget, int width, int height) { - widget->priv.width = width; - widget->priv.height = height; - GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED); + gboolean ret = TRUE; + + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) + { + if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + { + width--; + height--; + } + g_signal_emit(widget, signals[SIG_CONFIRM_SIZE], 0, width, height, &ret); + } + + if (ret) + { + gboolean shadow = TRUE; + + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + shadow = FALSE; + + widget->priv.width = width; + widget->priv.height = height; + if (widget->window) + wresize(widget->window, height + shadow, width + shadow); + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) + init_widget(widget); + else + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED); + } + + return ret; } gboolean Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-07-07 21:57:15 UTC (rev 16456) +++ trunk/console/libgnt/gntwidget.h 2006-07-08 02:11:11 UTC (rev 16457) @@ -36,7 +36,9 @@ GNT_WIDGET_NO_SHADOW = 1 << 4, GNT_WIDGET_HAS_FOCUS = 1 << 5, GNT_WIDGET_DRAWING = 1 << 6, - GNT_WIDGET_URGENT = 1 << 7 + GNT_WIDGET_URGENT = 1 << 7, + GNT_WIDGET_GROW_X = 1 << 8, + GNT_WIDGET_GROW_Y = 1 << 9, } GntWidgetFlags; /* XXX: I'll have to ask grim what he's using this for in guifications. */ @@ -81,6 +83,7 @@ void (*lost_focus)(GntWidget *widget); void (*size_request)(GntWidget *widget); + gboolean (*confirm_size)(GntWidget *widget, int x, int y); void (*set_position)(GntWidget *widget, int x, int y); gboolean (*key_pressed)(GntWidget *widget, const char *key); void (*activate)(GntWidget *widget); @@ -104,7 +107,7 @@ void gnt_widget_set_position(GntWidget *widget, int x, int y); void gnt_widget_size_request(GntWidget *widget); void gnt_widget_get_size(GntWidget *widget, int *width, int *height); -void gnt_widget_set_size(GntWidget *widget, int width, int height); +gboolean gnt_widget_set_size(GntWidget *widget, int width, int height); gboolean gnt_widget_key_pressed(GntWidget *widget, const char *keys); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-08 23:58:34
|
Revision: 16466 Author: sadrul Date: 2006-07-08 16:58:20 -0700 (Sat, 08 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16466&view=rev Log Message: ----------- New widget GntComboBox. I have addde a test file as an example as well. Rename gntutils.* to gntmarshal.* I am going to have some util-functions in gntutils.* later. Modified Paths: -------------- trunk/console/libgnt/Makefile.am trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h trunk/console/libgnt/gntwidget.c trunk/console/libgnt/test/Makefile Added Paths: ----------- trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gntcombobox.h trunk/console/libgnt/gntmarshal.c trunk/console/libgnt/gntmarshal.h trunk/console/libgnt/test/combo.c Removed Paths: ------------- trunk/console/libgnt/gntutils.c trunk/console/libgnt/gntutils.h Modified: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am 2006-07-08 22:43:22 UTC (rev 16465) +++ trunk/console/libgnt/Makefile.am 2006-07-08 23:58:20 UTC (rev 16466) @@ -8,11 +8,12 @@ gntbox.c \ gntbutton.c \ gntcolors.c \ + gntcombobox.c \ gntentry.c \ gntlabel.c \ + gntmarshal.c \ gnttextview.c \ gnttree.c \ - gntutils.c \ gntmain.c libgnt_la_headers = \ @@ -20,12 +21,13 @@ gntbox.h \ gntbutton.h \ gntcolors.h \ + gntcombobox.h \ gntentry.h \ gntkeys.h \ gntlabel.h \ + gntmarshal.h \ gnttextview.h \ gnttree.h \ - gntutils.h \ gnt.h libgnt_laincludedir=$(includedir)/gnt Added: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c (rev 0) +++ trunk/console/libgnt/gntcombobox.c 2006-07-08 23:58:20 UTC (rev 16466) @@ -0,0 +1,220 @@ +#include "gntbox.h" +#include "gntcombobox.h" +#include "gnttree.h" +#include "gntmarshal.h" + +#include <string.h> + +enum +{ + SIG_SELECTION_CHANGED, + SIGS, +}; + +static GntWidgetClass *parent_class = NULL; +static guint signals[SIGS] = { 0 }; +static void (*widget_lost_focus)(GntWidget *widget); + +static void +set_selection(GntComboBox *box, gpointer key) +{ + if (box->selected != key) + { + gpointer old = box->selected; + box->selected = key; + g_signal_emit(box, signals[SIG_SELECTION_CHANGED], 0, old, key); + gnt_widget_draw(GNT_WIDGET(box)); + } +} + +static void +gnt_combo_box_draw(GntWidget *widget) +{ + GntComboBox *box = GNT_COMBO_BOX(widget); + const char *text = NULL; + GntColorType type; + + if (box->dropdown) + { + text = gnt_tree_get_selection_text(GNT_TREE(box->dropdown)); + box->selected = gnt_tree_get_selection_data(GNT_TREE(box->dropdown)); + } + + if (text == NULL) + text = ""; + + if (gnt_widget_has_focus(widget)) + type = GNT_COLOR_HIGHLIGHT; + else + type = GNT_COLOR_NORMAL; + + wbkgdset(widget->window, '\0' | COLOR_PAIR(type)); + mvwprintw(widget->window, 1, 1, text); + + DEBUG; +} + +static void +gnt_combo_box_size_request(GntWidget *widget) +{ + widget->priv.height = 3; /* For now, a combobox will have border */ + widget->priv.width = 15; +} + +static void +gnt_combo_box_map(GntWidget *widget) +{ + if (widget->priv.width == 0 || widget->priv.height == 0) + gnt_widget_size_request(widget); + DEBUG; +} + +static gboolean +gnt_combo_box_key_pressed(GntWidget *widget, const char *text) +{ + GntComboBox *box = GNT_COMBO_BOX(widget); + if (GNT_WIDGET_IS_FLAG_SET(box->dropdown->parent, GNT_WIDGET_MAPPED)) + { + if (text[1] == 0) + { + switch (text[0]) + { + case '\r': + case '\t': + /* XXX: Get the selction */ + set_selection(box, gnt_tree_get_selection_data(GNT_TREE(box->dropdown))); + case 27: + gnt_widget_hide(box->dropdown->parent); + return TRUE; + break; + } + } + if (gnt_widget_key_pressed(box->dropdown, text)) + return TRUE; + } + else + { + if (text[0] == 27) + { + if (strcmp(text + 1, GNT_KEY_UP) == 0 || + strcmp(text + 1, GNT_KEY_DOWN) == 0) + { + gnt_widget_set_size(box->dropdown, widget->priv.width, 9); + gnt_widget_set_position(box->dropdown->parent, + widget->priv.x, widget->priv.y + widget->priv.height - 1); + gnt_widget_draw(box->dropdown->parent); + return TRUE; + } + } + } + + return FALSE; +} + +static void +gnt_combo_box_destroy(GntWidget *widget) +{ + gnt_widget_destroy(GNT_COMBO_BOX(widget)->dropdown->parent); +} + +static void +gnt_combo_box_lost_focus(GntWidget *widget) +{ + 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); + widget_lost_focus(widget); +} + +static void +gnt_combo_box_class_init(GntComboBoxClass *klass) +{ + parent_class = GNT_WIDGET_CLASS(klass); + + parent_class->destroy = gnt_combo_box_destroy; + parent_class->draw = gnt_combo_box_draw; + parent_class->map = gnt_combo_box_map; + parent_class->size_request = gnt_combo_box_size_request; + parent_class->key_pressed = gnt_combo_box_key_pressed; + + widget_lost_focus = parent_class->lost_focus; + parent_class->lost_focus = gnt_combo_box_lost_focus; + + signals[SIG_SELECTION_CHANGED] = + g_signal_new("selection-changed", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + gnt_closure_marshal_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); + + DEBUG; +} + +static void +gnt_combo_box_init(GTypeInstance *instance, gpointer class) +{ + GntWidget *box; + GntComboBox *combo = GNT_COMBO_BOX(instance); + + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), + GNT_WIDGET_GROW_X | GNT_WIDGET_CAN_TAKE_FOCUS | GNT_WIDGET_NO_SHADOW); + combo->dropdown = gnt_tree_new(); + + box = gnt_box_new(FALSE, FALSE); + GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_NO_SHADOW | GNT_WIDGET_NO_BORDER); + gnt_box_add_widget(GNT_BOX(box), combo->dropdown); + + DEBUG; +} + +/****************************************************************************** + * GntComboBox API + *****************************************************************************/ +GType +gnt_combo_box_get_gtype(void) +{ + static GType type = 0; + + if(type == 0) + { + static const GTypeInfo info = { + sizeof(GntComboBoxClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc)gnt_combo_box_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof(GntComboBox), + 0, /* n_preallocs */ + gnt_combo_box_init, /* instance_init */ + }; + + type = g_type_register_static(GNT_TYPE_WIDGET, + "GntComboBox", + &info, 0); + } + + return type; +} + +GntWidget *gnt_combo_box_new() +{ + GntWidget *widget = g_object_new(GNT_TYPE_COMBO_BOX, NULL); + + return widget; +} + +void gnt_combo_box_add_data(GntComboBox *box, gpointer key, const char *text) +{ + gnt_tree_add_row_after(GNT_TREE(box->dropdown), key, text, NULL, NULL); + if (box->selected == NULL) + set_selection(box, key); +} + +gpointer gnt_combo_box_get_selected_data(GntComboBox *box) +{ + return box->selected; +} + Property changes on: trunk/console/libgnt/gntcombobox.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/gntcombobox.h =================================================================== --- trunk/console/libgnt/gntcombobox.h (rev 0) +++ trunk/console/libgnt/gntcombobox.h 2006-07-08 23:58:20 UTC (rev 16466) @@ -0,0 +1,55 @@ +#ifndef GNT_COMBO_BOX_H +#define GNT_COMBO_BOX_H + +#include "gnt.h" +#include "gntcolors.h" +#include "gntkeys.h" +#include "gntwidget.h" + +#define GNT_TYPE_COMBO_BOX (gnt_combo_box_get_gtype()) +#define GNT_COMBO_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_COMBO_BOX, GntComboBox)) +#define GNT_COMBO_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_COMBO_BOX, GntComboBoxClass)) +#define GNT_IS_COMBO_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNT_TYPE_COMBO_BOX)) +#define GNT_IS_COMBO_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_COMBO_BOX)) +#define GNT_COMBO_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_COMBO_BOX, GntComboBoxClass)) + +#define GNT_COMBO_BOX_FLAGS(obj) (GNT_COMBO_BOX(obj)->priv.flags) +#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; + +struct _GnComboBox +{ + GntWidget parent; + + GntWidget *dropdown; /* This is a GntTree */ + + void *selected; /* Currently selected key */ +}; + +struct _GnComboBoxClass +{ + GntWidgetClass parent; + + void (*gnt_reserved1)(void); + void (*gnt_reserved2)(void); + void (*gnt_reserved3)(void); + void (*gnt_reserved4)(void); +}; + +G_BEGIN_DECLS + +GType gnt_combo_box_get_gtype(void); + +GntWidget *gnt_combo_box_new(); + +void gnt_combo_box_add_data(GntComboBox *box, gpointer key, const char *text); + +gpointer gnt_combo_box_get_selected_data(GntComboBox *box); + +G_END_DECLS + +#endif /* GNT_COMBO_BOX_H */ Property changes on: trunk/console/libgnt/gntcombobox.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Copied: trunk/console/libgnt/gntmarshal.c (from rev 16457, trunk/console/libgnt/gntutils.c) =================================================================== --- trunk/console/libgnt/gntmarshal.c (rev 0) +++ trunk/console/libgnt/gntmarshal.c 2006-07-08 23:58:20 UTC (rev 16466) @@ -0,0 +1,168 @@ +#include "gntmarshal.h" + +void gnt_closure_marshal_BOOLEAN__STRING(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*func) (gpointer data1, const char *arg1, gpointer data2); + register func callback; + register GCClosure *cc = (GCClosure*)closure; + register gpointer data1, data2; + gboolean ret; + + g_return_if_fail(ret_value != NULL); + g_return_if_fail(n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA(closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer(param_values + 0); + } + else + { + data1 = g_value_peek_pointer(param_values + 0); + data2 = closure->data; + } + + callback = (func) (marshal_data ? marshal_data : cc->callback); + ret = callback(data1, g_value_get_string(param_values + 1) , data2); + g_value_set_boolean(ret_value, ret); +} + +void gnt_closure_marshal_VOID__INT_INT_INT_INT(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*func) (gpointer data1, int, int, int, int, gpointer data2); + register func callback; + register GCClosure *cc = (GCClosure*)closure; + register gpointer data1, data2; + + g_return_if_fail(n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA(closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer(param_values + 0); + } + else + { + data1 = g_value_peek_pointer(param_values + 0); + data2 = closure->data; + } + + callback = (func) (marshal_data ? marshal_data : cc->callback); + callback(data1, + g_value_get_int(param_values + 1) , + g_value_get_int(param_values + 2) , + g_value_get_int(param_values + 3) , + g_value_get_int(param_values + 4) , + data2); +} + +void gnt_closure_marshal_VOID__INT_INT(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*func) (gpointer data1, int, int, gpointer data2); + register func callback; + register GCClosure *cc = (GCClosure*)closure; + register gpointer data1, data2; + + g_return_if_fail(n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA(closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer(param_values + 0); + } + else + { + data1 = g_value_peek_pointer(param_values + 0); + data2 = closure->data; + } + + callback = (func) (marshal_data ? marshal_data : cc->callback); + callback(data1, + g_value_get_int(param_values + 1) , + g_value_get_int(param_values + 2) , + data2); +} + +void gnt_closure_marshal_VOID__POINTER_POINTER(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*func) (gpointer data1, gpointer, gpointer, gpointer data2); + register func callback; + register GCClosure *cc = (GCClosure*)closure; + register gpointer data1, data2; + + g_return_if_fail(n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA(closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer(param_values + 0); + } + else + { + data1 = g_value_peek_pointer(param_values + 0); + data2 = closure->data; + } + + callback = (func) (marshal_data ? marshal_data : cc->callback); + callback(data1, + g_value_get_pointer(param_values + 1) , + g_value_get_pointer(param_values + 2) , + data2); +} + +void gnt_closure_marshal_BOOLEAN__INT_INT(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*func) (gpointer data1, int, int, gpointer data2); + register func callback; + register GCClosure *cc = (GCClosure*)closure; + register gpointer data1, data2; + gboolean ret; + + g_return_if_fail(ret_value != NULL); + g_return_if_fail(n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA(closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer(param_values + 0); + } + else + { + data1 = g_value_peek_pointer(param_values + 0); + data2 = closure->data; + } + + callback = (func) (marshal_data ? marshal_data : cc->callback); + ret = callback(data1, + g_value_get_int(param_values + 1) , + g_value_get_int(param_values + 2) , + data2); + g_value_set_boolean(ret_value, ret); +} + + Copied: trunk/console/libgnt/gntmarshal.h (from rev 16457, trunk/console/libgnt/gntutils.h) =================================================================== --- trunk/console/libgnt/gntmarshal.h (rev 0) +++ trunk/console/libgnt/gntmarshal.h 2006-07-08 23:58:20 UTC (rev 16466) @@ -0,0 +1,37 @@ +#include "gntwidget.h" + +void gnt_closure_marshal_BOOLEAN__STRING(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +void gnt_closure_marshal_VOID__INT_INT_INT_INT(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +void gnt_closure_marshal_VOID__INT_INT(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +void gnt_closure_marshal_VOID__POINTER_POINTER(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +void gnt_closure_marshal_BOOLEAN__INT_INT(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-08 22:43:22 UTC (rev 16465) +++ trunk/console/libgnt/gnttree.c 2006-07-08 23:58:20 UTC (rev 16466) @@ -1,5 +1,5 @@ #include "gnttree.h" -#include "gntutils.h" +#include "gntmarshal.h" #include <string.h> @@ -592,6 +592,13 @@ return NULL; } +const char *gnt_tree_get_selection_text(GntTree *tree) +{ + if (tree->current) + return tree->current->text; + return NULL; +} + /* XXX: Should this also remove all the children of the row being removed? */ void gnt_tree_remove(GntTree *tree, gpointer key) { @@ -707,6 +714,6 @@ return; row->flags = flags; - redraw_tree(tree); /* XXX: Is shouldn't be necessary to redraw the whole darned tree */ + redraw_tree(tree); /* XXX: It shouldn't be necessary to redraw the whole darned tree */ } Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-07-08 22:43:22 UTC (rev 16465) +++ trunk/console/libgnt/gnttree.h 2006-07-08 23:58:20 UTC (rev 16466) @@ -67,6 +67,8 @@ gpointer gnt_tree_get_selection_data(GntTree *tree); +const char *gnt_tree_get_selection_text(GntTree *tree); + void gnt_tree_remove(GntTree *tree, gpointer key); /* Returns the visible line number of the selected row */ Deleted: trunk/console/libgnt/gntutils.c =================================================================== --- trunk/console/libgnt/gntutils.c 2006-07-08 22:43:22 UTC (rev 16465) +++ trunk/console/libgnt/gntutils.c 2006-07-08 23:58:20 UTC (rev 16466) @@ -1,168 +0,0 @@ -#include "gntutils.h" - -void gnt_closure_marshal_BOOLEAN__STRING(GClosure *closure, - GValue *ret_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data) -{ - typedef gboolean (*func) (gpointer data1, const char *arg1, gpointer data2); - register func callback; - register GCClosure *cc = (GCClosure*)closure; - register gpointer data1, data2; - gboolean ret; - - g_return_if_fail(ret_value != NULL); - g_return_if_fail(n_param_values == 2); - - if (G_CCLOSURE_SWAP_DATA(closure)) - { - data1 = closure->data; - data2 = g_value_peek_pointer(param_values + 0); - } - else - { - data1 = g_value_peek_pointer(param_values + 0); - data2 = closure->data; - } - - callback = (func) (marshal_data ? marshal_data : cc->callback); - ret = callback(data1, g_value_get_string(param_values + 1) , data2); - g_value_set_boolean(ret_value, ret); -} - -void gnt_closure_marshal_VOID__INT_INT_INT_INT(GClosure *closure, - GValue *ret_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data) -{ - typedef void (*func) (gpointer data1, int, int, int, int, gpointer data2); - register func callback; - register GCClosure *cc = (GCClosure*)closure; - register gpointer data1, data2; - - g_return_if_fail(n_param_values == 5); - - if (G_CCLOSURE_SWAP_DATA(closure)) - { - data1 = closure->data; - data2 = g_value_peek_pointer(param_values + 0); - } - else - { - data1 = g_value_peek_pointer(param_values + 0); - data2 = closure->data; - } - - callback = (func) (marshal_data ? marshal_data : cc->callback); - callback(data1, - g_value_get_int(param_values + 1) , - g_value_get_int(param_values + 2) , - g_value_get_int(param_values + 3) , - g_value_get_int(param_values + 4) , - data2); -} - -void gnt_closure_marshal_VOID__INT_INT(GClosure *closure, - GValue *ret_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data) -{ - typedef void (*func) (gpointer data1, int, int, gpointer data2); - register func callback; - register GCClosure *cc = (GCClosure*)closure; - register gpointer data1, data2; - - g_return_if_fail(n_param_values == 3); - - if (G_CCLOSURE_SWAP_DATA(closure)) - { - data1 = closure->data; - data2 = g_value_peek_pointer(param_values + 0); - } - else - { - data1 = g_value_peek_pointer(param_values + 0); - data2 = closure->data; - } - - callback = (func) (marshal_data ? marshal_data : cc->callback); - callback(data1, - g_value_get_int(param_values + 1) , - g_value_get_int(param_values + 2) , - data2); -} - -void gnt_closure_marshal_VOID__POINTER_POINTER(GClosure *closure, - GValue *ret_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data) -{ - typedef void (*func) (gpointer data1, gpointer, gpointer, gpointer data2); - register func callback; - register GCClosure *cc = (GCClosure*)closure; - register gpointer data1, data2; - - g_return_if_fail(n_param_values == 3); - - if (G_CCLOSURE_SWAP_DATA(closure)) - { - data1 = closure->data; - data2 = g_value_peek_pointer(param_values + 0); - } - else - { - data1 = g_value_peek_pointer(param_values + 0); - data2 = closure->data; - } - - callback = (func) (marshal_data ? marshal_data : cc->callback); - callback(data1, - g_value_get_pointer(param_values + 1) , - g_value_get_pointer(param_values + 2) , - data2); -} - -void gnt_closure_marshal_BOOLEAN__INT_INT(GClosure *closure, - GValue *ret_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data) -{ - typedef gboolean (*func) (gpointer data1, int, int, gpointer data2); - register func callback; - register GCClosure *cc = (GCClosure*)closure; - register gpointer data1, data2; - gboolean ret; - - g_return_if_fail(ret_value != NULL); - g_return_if_fail(n_param_values == 3); - - if (G_CCLOSURE_SWAP_DATA(closure)) - { - data1 = closure->data; - data2 = g_value_peek_pointer(param_values + 0); - } - else - { - data1 = g_value_peek_pointer(param_values + 0); - data2 = closure->data; - } - - callback = (func) (marshal_data ? marshal_data : cc->callback); - ret = callback(data1, - g_value_get_int(param_values + 1) , - g_value_get_int(param_values + 2) , - data2); - g_value_set_boolean(ret_value, ret); -} - - Deleted: trunk/console/libgnt/gntutils.h =================================================================== --- trunk/console/libgnt/gntutils.h 2006-07-08 22:43:22 UTC (rev 16465) +++ trunk/console/libgnt/gntutils.h 2006-07-08 23:58:20 UTC (rev 16466) @@ -1,37 +0,0 @@ -#include "gntwidget.h" - -void gnt_closure_marshal_BOOLEAN__STRING(GClosure *closure, - GValue *ret_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data); - -void gnt_closure_marshal_VOID__INT_INT_INT_INT(GClosure *closure, - GValue *ret_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data); - -void gnt_closure_marshal_VOID__INT_INT(GClosure *closure, - GValue *ret_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data); - -void gnt_closure_marshal_VOID__POINTER_POINTER(GClosure *closure, - GValue *ret_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data); - -void gnt_closure_marshal_BOOLEAN__INT_INT(GClosure *closure, - GValue *ret_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data); - Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-07-08 22:43:22 UTC (rev 16465) +++ trunk/console/libgnt/gntwidget.c 2006-07-08 23:58:20 UTC (rev 16466) @@ -1,7 +1,7 @@ /* Stuff brutally ripped from Gflib */ #include "gntwidget.h" -#include "gntutils.h" +#include "gntmarshal.h" #include "gnt.h" #define MIN_SIZE 5 Modified: trunk/console/libgnt/test/Makefile =================================================================== --- trunk/console/libgnt/test/Makefile 2006-07-08 22:43:22 UTC (rev 16465) +++ trunk/console/libgnt/test/Makefile 2006-07-08 23:58:20 UTC (rev 16466) @@ -2,7 +2,7 @@ CFLAGS=`pkg-config --cflags gobject-2.0` -g -I../ LDFLAGS=`pkg-config --libs gobject-2.0` -pg -lgnt -L../ -EXAMPLES=focus tv multiwin +EXAMPLES=combo focus tv multiwin all: make examples Added: trunk/console/libgnt/test/combo.c =================================================================== --- trunk/console/libgnt/test/combo.c (rev 0) +++ trunk/console/libgnt/test/combo.c 2006-07-08 23:58:20 UTC (rev 16466) @@ -0,0 +1,39 @@ +#include <gnt.h> +#include <gntbox.h> +#include <gntcombobox.h> +#include <gntlabel.h> + +int main() +{ + GntWidget *box, *combo, *button; + + gnt_init(); + + box = gnt_box_new(FALSE, FALSE); + + gnt_box_set_toplevel(GNT_BOX(box), TRUE); + gnt_box_set_title(GNT_BOX(box), "Checkbox"); + + combo = gnt_combo_box_new(); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "1", "1"); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "2", "2"); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "3", "3"); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "4", "4"); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "5", "5"); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "6", "6"); + + gnt_box_add_widget(GNT_BOX(box), gnt_label_new("Select")); + gnt_box_add_widget(GNT_BOX(box), combo); + + button = gnt_button_new("OK"); + gnt_box_add_widget(GNT_BOX(box), button); + + gnt_widget_show(box); + + gnt_main(); + + gnt_quit(); + + return 0; +} + Property changes on: trunk/console/libgnt/test/combo.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-09 00:54:41
|
Revision: 16467 Author: sadrul Date: 2006-07-08 17:54:31 -0700 (Sat, 08 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16467&view=rev Log Message: ----------- Minor enhancements for the combobox. Modified Paths: -------------- trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/test/combo.c Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-07-08 23:58:20 UTC (rev 16466) +++ trunk/console/libgnt/gntcombobox.c 2006-07-09 00:54:31 UTC (rev 16467) @@ -33,6 +33,7 @@ GntComboBox *box = GNT_COMBO_BOX(widget); const char *text = NULL; GntColorType type; + int len; if (box->dropdown) { @@ -43,14 +44,28 @@ if (text == NULL) text = ""; + text = g_strdup(text); + if (gnt_widget_has_focus(widget)) type = GNT_COLOR_HIGHLIGHT; else type = GNT_COLOR_NORMAL; wbkgdset(widget->window, '\0' | COLOR_PAIR(type)); + + if ((len = g_utf8_strlen(text, -1)) > widget->priv.width - 4) + { + char *s = g_utf8_offset_to_pointer(text, widget->priv.width - 4); + *s = '\0'; + len = widget->priv.width - 4; + } + mvwprintw(widget->window, 1, 1, text); + whline(widget->window, '\0' | 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)); + g_free(text); DEBUG; } @@ -164,6 +179,7 @@ box = gnt_box_new(FALSE, FALSE); GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_NO_SHADOW | GNT_WIDGET_NO_BORDER); + gnt_box_set_pad(GNT_BOX(box), 0); gnt_box_add_widget(GNT_BOX(box), combo->dropdown); DEBUG; Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-08 23:58:20 UTC (rev 16466) +++ trunk/console/libgnt/gnttree.c 2006-07-09 00:54:31 UTC (rev 16467) @@ -201,11 +201,13 @@ g_snprintf(format, sizeof(format) - 1, "[%c] ", row->isselected ? 'X' : ' '); } - /* XXX: Need a utf8 version of snprintf */ - if ((wr = g_snprintf(str, widget->priv.width, "%s%s", format, row->text)) >= widget->priv.width) + g_snprintf(str, sizeof(str) - 1, "%s%s", format, row->text); + + if ((wr = g_utf8_strlen(str, -1)) >= widget->priv.width - 1 - pos) { /* XXX: ellipsize */ - str[widget->priv.width - 1 - pos] = 0; + char *s = g_utf8_offset_to_pointer(str, widget->priv.width - 1 - pos); + *s = '\0'; } else { Modified: trunk/console/libgnt/test/combo.c =================================================================== --- trunk/console/libgnt/test/combo.c 2006-07-08 23:58:20 UTC (rev 16466) +++ trunk/console/libgnt/test/combo.c 2006-07-09 00:54:31 UTC (rev 16467) @@ -17,7 +17,7 @@ combo = gnt_combo_box_new(); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "1", "1"); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "2", "2"); - gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "3", "3"); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "3", "3abcdefghijklmnopqrstuvwxyz"); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "4", "4"); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "5", "5"); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "6", "6"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-09 04:45:07
|
Revision: 16470 Author: sadrul Date: 2006-07-08 21:44:58 -0700 (Sat, 08 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16470&view=rev Log Message: ----------- Add an alignment option in a GntBox to align the widgets in it. Modified Paths: -------------- trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbox.h trunk/console/libgnt/test/combo.c Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-07-09 01:23:12 UTC (rev 16469) +++ trunk/console/libgnt/gntbox.c 2006-07-09 04:44:58 UTC (rev 16470) @@ -372,6 +372,10 @@ box->pad = 1; gnt_widget_set_take_focus(widget, TRUE); GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); + if (vert) + box->alignment = GNT_ALIGN_LEFT; + else + box->alignment = GNT_ALIGN_MID; return widget; } @@ -431,18 +435,42 @@ { GntWidget *w = GNT_WIDGET(iter->data); int height, width; + int x, y; if (GNT_IS_BOX(w)) gnt_box_sync_children(GNT_BOX(w)); gnt_widget_get_size(w, &width, &height); + x = w->priv.x - widget->priv.x; + y = w->priv.y - widget->priv.y; + + if (box->vertical) + { + if (box->alignment == GNT_ALIGN_RIGHT) + x += widget->priv.width - width; + else if (box->alignment == GNT_ALIGN_MID) + x += (widget->priv.width - width)/2; + if (x + width > widget->priv.width - 1) + x -= x + width - (widget->priv.width - 1); + } + else + { + if (box->alignment == GNT_ALIGN_BOTTOM) + y += widget->priv.height - height; + else if (box->alignment == GNT_ALIGN_MID) + y += (widget->priv.height - height)/2; + if (y + height > widget->priv.height - 1) + y -= y + height - (widget->priv.height - 1); + } + copywin(w->window, widget->window, 0, 0, - w->priv.y - widget->priv.y, - w->priv.x - widget->priv.x, - w->priv.y - widget->priv.y + height - 1, - w->priv.x - widget->priv.x + width - 1, - FALSE); + y, x, y + height - 1, x + width - 1, FALSE); } } +void gnt_box_set_alignment(GntBox *box, GntAlignment alignment) +{ + box->alignment = alignment; +} + Modified: trunk/console/libgnt/gntbox.h =================================================================== --- trunk/console/libgnt/gntbox.h 2006-07-09 01:23:12 UTC (rev 16469) +++ trunk/console/libgnt/gntbox.h 2006-07-09 04:44:58 UTC (rev 16470) @@ -14,6 +14,19 @@ typedef struct _GnBox GntBox; typedef struct _GnBoxClass GntBoxClass; +typedef enum +{ + /* These for vertical boxes */ + GNT_ALIGN_LEFT, + GNT_ALIGN_RIGHT, + + GNT_ALIGN_MID, + + /* These for horizontal boxes */ + GNT_ALIGN_TOP, + GNT_ALIGN_BOTTOM +} GntAlignment; + struct _GnBox { GntWidget parent; @@ -24,6 +37,7 @@ GntWidget *active; int pad; /* Number of spaces to use between widgets */ + GntAlignment alignment; /* How are the widgets going to be aligned? */ char *title; GList *focus; /* List of widgets to cycle focus (only valid for parent boxes) */ @@ -60,6 +74,8 @@ void gnt_box_sync_children(GntBox *box); +void gnt_box_set_alignment(GntBox *box, GntAlignment alignment); + G_END_DECLS #endif /* GNT_BOX_H */ Modified: trunk/console/libgnt/test/combo.c =================================================================== --- trunk/console/libgnt/test/combo.c 2006-07-09 01:23:12 UTC (rev 16469) +++ trunk/console/libgnt/test/combo.c 2006-07-09 04:44:58 UTC (rev 16470) @@ -1,19 +1,29 @@ #include <gnt.h> #include <gntbox.h> +#include <gntbutton.h> #include <gntcombobox.h> #include <gntlabel.h> int main() { GntWidget *box, *combo, *button; + GntWidget *hbox; gnt_init(); - box = gnt_box_new(FALSE, FALSE); + box = gnt_box_new(FALSE, TRUE); + gnt_widget_set_name(box, "box"); + gnt_box_set_alignment(GNT_BOX(box), GNT_ALIGN_MID); + gnt_box_set_pad(GNT_BOX(box), 0); gnt_box_set_toplevel(GNT_BOX(box), TRUE); gnt_box_set_title(GNT_BOX(box), "Checkbox"); + hbox = gnt_box_new(FALSE, FALSE); + gnt_box_set_pad(GNT_BOX(hbox), 0); + gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); + gnt_widget_set_name(hbox, "upper"); + combo = gnt_combo_box_new(); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "1", "1"); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "2", "2"); @@ -22,12 +32,20 @@ gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "5", "5"); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "6", "6"); - gnt_box_add_widget(GNT_BOX(box), gnt_label_new("Select")); - gnt_box_add_widget(GNT_BOX(box), combo); + gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new("Select")); + gnt_box_add_widget(GNT_BOX(hbox), combo); + gnt_box_add_widget(GNT_BOX(box), hbox); + + hbox = gnt_box_new(TRUE, FALSE); + gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); + gnt_widget_set_name(hbox, "lower"); + button = gnt_button_new("OK"); - gnt_box_add_widget(GNT_BOX(box), button); + gnt_box_add_widget(GNT_BOX(hbox), button); + gnt_box_add_widget(GNT_BOX(box), hbox); + gnt_widget_show(box); gnt_main(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-28 04:47:28
|
Revision: 16589 Author: sadrul Date: 2006-07-27 21:47:19 -0700 (Thu, 27 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16589&view=rev Log Message: ----------- Add a configure file (~/.gntrc) for gnt to configure its looks. This is available only for GLib 2.6 and above. Currently, it only allows changing the colors (r;g;b -- each in [0, 1000]) and color-groups. I have added gntrc.sample as an example. Modified Paths: -------------- trunk/console/libgnt/Makefile.am trunk/console/libgnt/gntcolors.c trunk/console/libgnt/gntcolors.h trunk/console/libgnt/gntmain.c Added Paths: ----------- trunk/console/libgnt/gntrc.sample trunk/console/libgnt/gntstyle.c trunk/console/libgnt/gntstyle.h Modified: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am 2006-07-27 20:11:55 UTC (rev 16588) +++ trunk/console/libgnt/Makefile.am 2006-07-28 04:47:19 UTC (rev 16589) @@ -14,6 +14,7 @@ gntlabel.c \ gntline.c \ gntmarshal.c \ + gntstyle.c \ gnttextview.c \ gnttree.c \ gntmain.c @@ -30,6 +31,7 @@ gntlabel.h \ gntline.h \ gntmarshal.h \ + gntstyle.h \ gnttextview.h \ gnttree.h \ gnt.h Modified: trunk/console/libgnt/gntcolors.c =================================================================== --- trunk/console/libgnt/gntcolors.c 2006-07-27 20:11:55 UTC (rev 16588) +++ trunk/console/libgnt/gntcolors.c 2006-07-28 04:47:19 UTC (rev 16589) @@ -1,6 +1,11 @@ #include <ncursesw/ncurses.h> #include "gntcolors.h" +#include <glib.h> + +#include <stdlib.h> +#include <string.h> + static struct { short r, g, b; @@ -75,3 +80,125 @@ restore_colors(); } +static int +get_color(char *key) +{ + int color; + + key = g_strstrip(key); + + if (strcmp(key, "black") == 0) + color = GNT_COLOR_BLACK; + else if (strcmp(key, "red") == 0) + color = GNT_COLOR_RED; + else if (strcmp(key, "green") == 0) + color = GNT_COLOR_GREEN; + else if (strcmp(key, "blue") == 0) + color = GNT_COLOR_BLUE; + else if (strcmp(key, "white") == 0) + color = GNT_COLOR_WHITE; + else if (strcmp(key, "gray") == 0) + color = GNT_COLOR_GRAY; + else if (strcmp(key, "darkgray") == 0) + color = GNT_COLOR_DARK_GRAY; + else + color = -1; + return color; +} + +void gnt_colors_parse(GKeyFile *kfile) +{ + GError *error = NULL; + gsize nkeys; + char **keys = g_key_file_get_keys(kfile, "colors", &nkeys, &error); + + if (error) + { + /* XXX: some error happened. */ + g_error_free(error); + } + else + { + while (nkeys--) + { + gsize len; + char *key = keys[nkeys]; + char **list = g_key_file_get_string_list(kfile, "colors", key, &len, NULL); + if (len == 3) + { + int r = atoi(list[0]); + int g = atoi(list[1]); + int b = atoi(list[2]); + int color = -1; + + g_ascii_strdown(key, -1); + color = get_color(key); + if (color == -1) + continue; + + init_color(color, r, g, b); + } + g_strfreev(list); + } + + g_strfreev(keys); + } + + gnt_color_pairs_parse(kfile); +} + +void gnt_color_pairs_parse(GKeyFile *kfile) +{ + GError *error = NULL; + gsize nkeys; + char **keys = g_key_file_get_keys(kfile, "colorpairs", &nkeys, &error); + + if (error) + { + /* XXX: some error happened. */ + g_error_free(error); + return; + } + + while (nkeys--) + { + gsize len; + char *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)); + if (fg == -1 || bg == -1) + continue; + + g_ascii_strdown(key, -1); + + if (strcmp(key, "normal") == 0) + type = GNT_COLOR_NORMAL; + else if (strcmp(key, "highlight") == 0) + type = GNT_COLOR_HIGHLIGHT; + else if (strcmp(key, "highlightd") == 0) + type = GNT_COLOR_HIGHLIGHT_D; + else if (strcmp(key, "shadow") == 0) + type = GNT_COLOR_SHADOW; + else if (strcmp(key, "title") == 0) + type = GNT_COLOR_TITLE; + else if (strcmp(key, "titled") == 0) + type = GNT_COLOR_TITLE_D; + else if (strcmp(key, "text") == 0) + type = GNT_COLOR_TEXT_NORMAL; + else if (strcmp(key, "disabled") == 0) + type = GNT_COLOR_DISABLED; + else + continue; + + init_pair(type, fg, bg); + } + g_strfreev(list); + } + + g_strfreev(keys); +} + Modified: trunk/console/libgnt/gntcolors.h =================================================================== --- trunk/console/libgnt/gntcolors.h 2006-07-27 20:11:55 UTC (rev 16588) +++ trunk/console/libgnt/gntcolors.h 2006-07-28 04:47:19 UTC (rev 16589) @@ -1,6 +1,8 @@ #ifndef GNT_COLORS_H #define GNT_COLORS_H +#include <glib.h> + typedef enum { GNT_COLOR_NORMAL = 1, @@ -34,4 +36,8 @@ void gnt_uninit_colors(); +void gnt_colors_parse(GKeyFile *kfile); + +void gnt_color_pairs_parse(GKeyFile *kfile); + #endif Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-27 20:11:55 UTC (rev 16588) +++ trunk/console/libgnt/gntmain.c 2006-07-28 04:47:19 UTC (rev 16589) @@ -2,8 +2,9 @@ #include "gnt.h" #include "gntbox.h" +#include "gntcolors.h" #include "gntkeys.h" -#include "gntcolors.h" +#include "gntstyle.h" #include "gnttree.h" #include <stdio.h> @@ -57,6 +58,8 @@ if (lock_focus_list) return; + if (g_list_find(g_list_first(focus_list), widget)) + return; if (focus_list) w = focus_list->data; @@ -525,6 +528,7 @@ void gnt_init() { static GIOChannel *channel = NULL; + char *filename; if (channel) return; @@ -548,6 +552,10 @@ initscr(); gnt_init_colors(); + filename = g_build_filename(g_get_home_dir(), ".gntrc", NULL); + gnt_style_read_configure_file(filename); + g_free(filename); + X_MIN = 0; Y_MIN = 0; X_MAX = getmaxx(stdscr); Added: trunk/console/libgnt/gntrc.sample =================================================================== --- trunk/console/libgnt/gntrc.sample (rev 0) +++ trunk/console/libgnt/gntrc.sample 2006-07-28 04:47:19 UTC (rev 16589) @@ -0,0 +1,21 @@ +[general] +shadow = 0 + +[colors] +black = 0; 0; 0 +red = 1000; 0; 0 +green = 0; 1000; 0 +blue = 250; 250; 700 +white = 1000; 1000; 1000 +gray = 700; 700; 700 +darkgray = 256; 256; 256 + +[colorpairs] +normal = black; white +highlight = white; blue +highlightd = black; gray +shadow = black; darkgray +title = white; blue +titled = white; gray +text = white; blue +disabled = gray; white Property changes on: trunk/console/libgnt/gntrc.sample ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/gntstyle.c =================================================================== --- trunk/console/libgnt/gntstyle.c (rev 0) +++ trunk/console/libgnt/gntstyle.c 2006-07-28 04:47:19 UTC (rev 16589) @@ -0,0 +1,21 @@ +#include "gntstyle.h" +#include "gntcolors.h" + +void gnt_style_read_configure_file(const char *filename) +{ +#if GLIB_CHECK_VERSION(2,6,0) + GKeyFile *kfile = g_key_file_new(); + GError *error = NULL; + + if (!g_key_file_load_from_file(kfile, filename, G_KEY_FILE_NONE, &error)) + { + /* XXX: Print the error or something */ + g_error_free(error); + return; + } + gnt_colors_parse(kfile); + + g_key_file_free(kfile); +#endif +} + Property changes on: trunk/console/libgnt/gntstyle.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/gntstyle.h =================================================================== --- trunk/console/libgnt/gntstyle.h (rev 0) +++ trunk/console/libgnt/gntstyle.h 2006-07-28 04:47:19 UTC (rev 16589) @@ -0,0 +1,4 @@ +#include "gnt.h" + +void gnt_style_read_configure_file(const char *filename); + Property changes on: trunk/console/libgnt/gntstyle.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-14 02:17:04
|
Revision: 16741 Author: sadrul Date: 2006-08-13 19:16:58 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16741&view=rev Log Message: ----------- Show little scroll-arrows for trees and textviews when appropriate. Modified Paths: -------------- trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttree.c Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-14 00:08:15 UTC (rev 16740) +++ trunk/console/libgnt/gntmain.c 2006-08-14 02:16:58 UTC (rev 16741) @@ -399,6 +399,10 @@ case 'j': case 'n': ch = '+'; break; + case '-': + ch = '^'; break; + case '.': + ch = 'v'; break; default: ch = ' '; break; } Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-08-14 00:08:15 UTC (rev 16740) +++ trunk/console/libgnt/gnttextview.c 2006-08-14 02:16:58 UTC (rev 16741) @@ -46,6 +46,18 @@ } } + mvwaddch(widget->window, 0, + widget->priv.width - 1, + lines ? + ACS_UARROW | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D) : + ' '| COLOR_PAIR(GNT_COLOR_NORMAL)); + + mvwaddch(widget->window, widget->priv.height - 1, + widget->priv.width - 1, + (view->list && view->list->prev) ? + ACS_DARROW | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D) : + ' '| COLOR_PAIR(GNT_COLOR_NORMAL)); + DEBUG; } Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-08-14 00:08:15 UTC (rev 16740) +++ trunk/console/libgnt/gnttree.c 2006-08-14 02:16:58 UTC (rev 16741) @@ -223,7 +223,7 @@ text = g_utf8_offset_to_pointer(col->text, len - fl); string = g_string_append_len(string, col->text, text - col->text); - if (len < tree->columns[i].width) + if (len < tree->columns[i].width && iter->next) g_string_append_printf(string, "%*s", tree->columns[i].width - len, ""); } return g_string_free(string, FALSE); @@ -306,6 +306,12 @@ else if (up >= widget->priv.height - pos) tree->top = get_prev_n(tree->current, nr); + mvwaddch(widget->window, start + pos, + widget->priv.width - pos - 1, + (tree->top != tree->root) ? + ACS_UARROW | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D) : + ' '| COLOR_PAIR(GNT_COLOR_NORMAL)); + row = tree->top; for (start = start + pos; row && start < widget->priv.height - pos; start++, row = get_next(row)) @@ -351,17 +357,23 @@ wbkgdset(widget->window, '\0' | attr); mvwprintw(widget->window, start, pos, str); - whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1)); + whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1) - 1); tree->bottom = row; g_free(str); tree_mark_columns(tree, pos, start, ACS_VLINE | attr); } + mvwaddch(widget->window, widget->priv.height - pos - 1, + widget->priv.width - pos - 1, + get_next(tree->bottom) ? + ACS_DARROW | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D) : + ' '| COLOR_PAIR(GNT_COLOR_NORMAL)); + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); while (start < widget->priv.height - pos) { mvwhline(widget->window, start, pos, ' ', - widget->priv.width - pos * 2); + widget->priv.width - pos * 2 - 1); tree_mark_columns(tree, pos, start, ACS_VLINE); start++; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-15 02:46:55
|
Revision: 16761 Author: sadrul Date: 2006-08-14 19:45:52 -0700 (Mon, 14 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16761&view=rev Log Message: ----------- Show scrollbars in trees and textviews. Modified Paths: -------------- trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/test/multiwin.c Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-14 21:48:08 UTC (rev 16760) +++ trunk/console/libgnt/gntmain.c 2006-08-15 02:45:52 UTC (rev 16761) @@ -403,6 +403,8 @@ ch = '^'; break; case '.': ch = 'v'; break; + case 'a': + ch = '#'; break; default: ch = ' '; break; } Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-08-14 21:48:08 UTC (rev 16760) +++ trunk/console/libgnt/gnttextview.c 2006-08-15 02:45:52 UTC (rev 16761) @@ -26,6 +26,7 @@ GntTextView *view = GNT_TEXT_VIEW(widget); int i = 0; GList *lines; + int showing, position, rows, scrcol; werase(widget->window); @@ -45,19 +46,36 @@ whline(widget->window, ' ' | seg->flags, widget->priv.width - line->length - 1); } } - - mvwaddch(widget->window, 0, - widget->priv.width - 1, - lines ? - ACS_UARROW | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D) : - ' '| COLOR_PAIR(GNT_COLOR_NORMAL)); - mvwaddch(widget->window, widget->priv.height - 1, - widget->priv.width - 1, - (view->list && view->list->prev) ? - ACS_DARROW | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D) : - ' '| COLOR_PAIR(GNT_COLOR_NORMAL)); + scrcol = widget->priv.width - 1; + rows = widget->priv.height - 2; + if (rows > 0) + { + showing = rows * rows / g_list_length(g_list_first(view->list)) + 1; + showing = MIN(rows, showing); + + position = showing * g_list_length(view->list) / rows; + position = MAX((lines != NULL), position); + + if (showing + position > rows) + position = rows - showing; + + if (showing + position == rows && view->list && view->list->prev) + position = MAX(1, rows - 1 - showing); + else if (showing + position < rows && view->list && !view->list->prev) + position = rows - showing; + + mvwvline(widget->window, position + 1, scrcol, + ACS_CKBOARD | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D), showing); + } + + mvwaddch(widget->window, 0, scrcol, + (lines ? ACS_UARROW : ' ') | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); + mvwaddch(widget->window, widget->priv.height - 1, scrcol, + ((view->list && view->list->prev) ? ACS_DARROW : ' ') | + COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); + DEBUG; } @@ -133,7 +151,7 @@ GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_Y); widget->priv.minw = 5; - widget->priv.minh = 1; + widget->priv.minh = 2; DEBUG; } Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-08-14 21:48:08 UTC (rev 16760) +++ trunk/console/libgnt/gnttree.c 2006-08-15 02:45:52 UTC (rev 16761) @@ -246,10 +246,11 @@ static void redraw_tree(GntTree *tree) { - int start; + int start, i; GntWidget *widget = GNT_WIDGET(tree); GntTreeRow *row; - int pos, up, down, nr; + int pos, up, down; + int showing, position, rows, scrcol; if (!GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_MAPPED)) return; @@ -273,7 +274,7 @@ int x = pos; mvwhline(widget->window, pos + 1, pos, ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL), - widget->priv.width - pos - 1); + widget->priv.width - pos); for (i = 0; i < tree->ncol; i++) { @@ -291,11 +292,11 @@ start = 2; } - nr = widget->priv.height - pos * 2 - start - 1; - tree->bottom = get_next_n_opt(tree->top, nr, &down); - if (down < nr) + rows = widget->priv.height - pos * 2 - start - 1; + tree->bottom = get_next_n_opt(tree->top, rows, &down); + if (down < rows) { - tree->top = get_prev_n(tree->bottom, nr); + tree->top = get_prev_n(tree->bottom, rows); if (tree->top == NULL) tree->top = tree->root; } @@ -304,17 +305,11 @@ if (up < 0) tree->top = tree->current; else if (up >= widget->priv.height - pos) - tree->top = get_prev_n(tree->current, nr); + tree->top = get_prev_n(tree->current, rows); - mvwaddch(widget->window, start + pos, - widget->priv.width - pos - 1, - (tree->top != tree->root) ? - ACS_UARROW | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D) : - ' '| COLOR_PAIR(GNT_COLOR_NORMAL)); - row = tree->top; - for (start = start + pos; row && start < widget->priv.height - pos; - start++, row = get_next(row)) + for (i = start + pos; row && i < widget->priv.height - pos; + i++, row = get_next(row)) { char *str; int wr; @@ -356,28 +351,56 @@ } wbkgdset(widget->window, '\0' | attr); - mvwprintw(widget->window, start, pos, str); + mvwprintw(widget->window, i, pos, str); whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1) - 1); tree->bottom = row; g_free(str); - tree_mark_columns(tree, pos, start, ACS_VLINE | attr); + tree_mark_columns(tree, pos, i, ACS_VLINE | attr); } - mvwaddch(widget->window, widget->priv.height - pos - 1, - widget->priv.width - pos - 1, - get_next(tree->bottom) ? - ACS_DARROW | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D) : - ' '| COLOR_PAIR(GNT_COLOR_NORMAL)); - wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); - while (start < widget->priv.height - pos) + while (i < widget->priv.height - pos) { - mvwhline(widget->window, start, pos, ' ', + mvwhline(widget->window, i, pos, ' ', widget->priv.width - pos * 2 - 1); - tree_mark_columns(tree, pos, start, ACS_VLINE); - start++; + tree_mark_columns(tree, pos, i, ACS_VLINE); + i++; } + scrcol = widget->priv.width - pos - 1; + rows--; + if (rows > 0) + { + get_next_n_opt(tree->root, g_list_length(tree->list), &i); + showing = rows * rows / MAX(i, 1) + 1; + showing = MIN(rows, showing); + + position = showing * get_distance(tree->root, tree->top) / rows; + position = MAX((tree->top != tree->root), position); + + if (showing + position > rows) + position = rows - showing; + + if (showing + position == rows && row) + position = MAX(0, rows - 1 - showing); + else if (showing + position < rows && !row) + position = rows - showing; + + position += pos + start + 1; + + mvwvline(widget->window, pos + start + 1, scrcol, + ' ' | COLOR_PAIR(GNT_COLOR_NORMAL), rows); + mvwvline(widget->window, position, scrcol, + ACS_CKBOARD | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D), showing); + } + + mvwaddch(widget->window, start + pos, scrcol, + ((tree->top != tree->root) ? ACS_UARROW : ' ') | + COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); + + mvwaddch(widget->window, widget->priv.height - pos - 1, scrcol, + (row ? ACS_DARROW : ' ') | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); + gnt_widget_queue_update(widget); } @@ -550,7 +573,7 @@ GntWidget *widget = GNT_WIDGET(instance); GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_GROW_X | GNT_WIDGET_GROW_Y); widget->priv.minw = 4; - widget->priv.minh = 3; + widget->priv.minh = 4; DEBUG; } @@ -1007,7 +1030,7 @@ va_start(args, tree); for (i = 0; i < tree->ncol; i++) { - list = g_list_append(list, va_arg(args, const char *)); + list = g_list_append(list, va_arg(args, char *)); } va_end(args); @@ -1041,6 +1064,7 @@ void gnt_tree_set_show_title(GntTree *tree, gboolean set) { tree->show_title = set; + GNT_WIDGET(tree)->priv.minh = (set ? 6 : 4); } void gnt_tree_set_compare_func(GntTree *tree, GCompareFunc func) Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-08-14 21:48:08 UTC (rev 16760) +++ trunk/console/libgnt/test/multiwin.c 2006-08-15 02:45:52 UTC (rev 16761) @@ -62,6 +62,14 @@ gnt_tree_add_row_after(GNT_TREE(tree), "6", gnt_tree_create_row(GNT_TREE(tree), "6", " long text", "a2"), "4", NULL); + int i; + for (i = 110; i < 130; i++) + { + char *s; + s = g_strdup_printf("%d", i); /* XXX: yes, leaking */ + gnt_tree_add_row_after(GNT_TREE(tree), s, gnt_tree_create_row(GNT_TREE(tree), s, " long text", "a2"), "4", NULL); + } + gnt_tree_set_row_flags(GNT_TREE(tree), "e", GNT_TEXT_FLAG_DIM); gnt_tree_set_selected(GNT_TREE(tree), "2"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-19 17:11:47
|
Revision: 16888 Author: sadrul Date: 2006-08-19 10:11:39 -0700 (Sat, 19 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16888&view=rev Log Message: ----------- GKeyFile is in glib-2.6 and above. Modified Paths: -------------- trunk/console/libgnt/gntcolors.c trunk/console/libgnt/gntcolors.h trunk/console/libgnt/gntstyle.c Modified: trunk/console/libgnt/gntcolors.c =================================================================== --- trunk/console/libgnt/gntcolors.c 2006-08-19 16:48:46 UTC (rev 16887) +++ trunk/console/libgnt/gntcolors.c 2006-08-19 17:11:39 UTC (rev 16888) @@ -106,6 +106,7 @@ return color; } +#if GLIB_CHECK_VERSION(2,6,0) void gnt_colors_parse(GKeyFile *kfile) { GError *error = NULL; @@ -202,3 +203,4 @@ g_strfreev(keys); } +#endif /* GKeyFile */ Modified: trunk/console/libgnt/gntcolors.h =================================================================== --- trunk/console/libgnt/gntcolors.h 2006-08-19 16:48:46 UTC (rev 16887) +++ trunk/console/libgnt/gntcolors.h 2006-08-19 17:11:39 UTC (rev 16888) @@ -36,8 +36,10 @@ void gnt_uninit_colors(); +#if GLIB_CHECK_VERSION(2,6,0) void gnt_colors_parse(GKeyFile *kfile); void gnt_color_pairs_parse(GKeyFile *kfile); +#endif #endif Modified: trunk/console/libgnt/gntstyle.c =================================================================== --- trunk/console/libgnt/gntstyle.c 2006-08-19 16:48:46 UTC (rev 16887) +++ trunk/console/libgnt/gntstyle.c 2006-08-19 17:11:39 UTC (rev 16888) @@ -41,6 +41,7 @@ return bool_styles[style]; } +#if GLIB_CHECK_VERSION(2,6,0) static void read_general_style(GKeyFile *kfile) { @@ -70,6 +71,7 @@ } } } +#endif void gnt_style_read_configure_file(const char *filename) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-19 23:51:46
|
Revision: 16894 Author: sadrul Date: 2006-08-19 16:51:43 -0700 (Sat, 19 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16894&view=rev Log Message: ----------- Keybindings for GntEntry. Modified Paths: -------------- trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntkeys.h Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-08-19 21:41:25 UTC (rev 16893) +++ trunk/console/libgnt/gntentry.c 2006-08-19 23:51:43 UTC (rev 16894) @@ -156,6 +156,83 @@ gnt_widget_queue_update(widget); } +static void +move_back(GntEntry *entry) +{ + if (entry->cursor <= entry->start) + return; + entry->cursor = g_utf8_find_prev_char(entry->start, entry->cursor); + if (entry->cursor < entry->scroll) + entry->scroll = entry->cursor; + entry_redraw(GNT_WIDGET(entry)); +} + +static void +move_forward(GntEntry *entry) +{ + if (entry->cursor >= entry->end) + return; + entry->cursor = g_utf8_find_next_char(entry->cursor, NULL); + if (g_utf8_pointer_to_offset(entry->scroll, entry->cursor) >= GNT_WIDGET(entry)->priv.width) + entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); + entry_redraw(GNT_WIDGET(entry)); +} + +static void +backspace(GntEntry *entry) +{ + int len; + + if (entry->cursor <= entry->start) + return; + + len = entry->cursor - g_utf8_find_prev_char(entry->start, entry->cursor); + entry->cursor -= len; + memmove(entry->cursor, entry->cursor + len, entry->end - entry->cursor); + entry->end -= len; + + if (entry->scroll > entry->start) + entry->scroll = g_utf8_find_prev_char(entry->start, entry->scroll); + + entry_redraw(GNT_WIDGET(entry)); + if (entry->ddown) + show_suggest_dropdown(entry); +} + +static void +delkey(GntEntry *entry) +{ + int len; + + if (entry->cursor >= entry->end) + return; + + len = g_utf8_find_next_char(entry->cursor, NULL) - entry->cursor; + memmove(entry->cursor, entry->cursor + len, entry->end - entry->cursor - len + 1); + entry->end -= len; + entry_redraw(GNT_WIDGET(entry)); + + if (entry->ddown) + show_suggest_dropdown(entry); +} + +static void +move_start(GntEntry *entry) +{ + entry->scroll = entry->cursor = entry->start; + entry_redraw(GNT_WIDGET(entry)); +} + +static void +move_end(GntEntry *entry) +{ + entry->cursor = entry->end; + /* This should be better than this */ + while (g_utf8_pointer_to_offset(entry->scroll, entry->cursor) >= GNT_WIDGET(entry)->priv.width) + entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); + entry_redraw(GNT_WIDGET(entry)); +} + static gboolean gnt_entry_key_pressed(GntWidget *widget, const char *text) { @@ -165,32 +242,17 @@ { if (strcmp(text + 1, GNT_KEY_DEL) == 0 && entry->cursor < entry->end) { - int len = g_utf8_find_next_char(entry->cursor, NULL) - entry->cursor; - memmove(entry->cursor, entry->cursor + len, entry->end - entry->cursor - len + 1); - entry->end -= len; - entry_redraw(widget); - - if (entry->ddown) - show_suggest_dropdown(entry); - + delkey(entry); return TRUE; } - else if (strcmp(text + 1, GNT_KEY_LEFT) == 0 && entry->cursor > entry->start) + else if (strcmp(text + 1, GNT_KEY_LEFT) == 0) { - entry->cursor = g_utf8_find_prev_char(entry->start, entry->cursor); - if (entry->cursor < entry->scroll) - entry->scroll = entry->cursor; - entry_redraw(widget); - + move_back(entry); return TRUE; } - else if (strcmp(text + 1, GNT_KEY_RIGHT) == 0 && entry->cursor < entry->end) + else if (strcmp(text + 1, GNT_KEY_RIGHT) == 0) { - entry->cursor = g_utf8_find_next_char(entry->cursor, NULL); - if (g_utf8_pointer_to_offset(entry->scroll, entry->cursor) >= widget->priv.width) - entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); - entry_redraw(widget); - + move_forward(entry); return TRUE; } else if (strcmp(text + 1, GNT_KEY_CTRL_DOWN) == 0 && entry->histlength) @@ -322,22 +384,57 @@ } else { - /* Backspace is here */ if (strcmp(text, GNT_KEY_BACKSPACE) == 0 && entry->cursor > entry->start) { - int len = entry->cursor - g_utf8_find_prev_char(entry->start, entry->cursor); - entry->cursor -= len; - memmove(entry->cursor, entry->cursor + len, entry->end - entry->cursor); - entry->end -= len; - - if (entry->scroll > entry->start) - entry->scroll = g_utf8_find_prev_char(entry->start, entry->scroll); - + backspace(entry); + return TRUE; + } + else if (strcmp(text, GNT_KEY_CTRL_A) == 0) + { + move_start(entry); + return TRUE; + } + else if (strcmp(text, GNT_KEY_CTRL_B) == 0) + { + move_back(entry); + return TRUE; + } + else if (strcmp(text, GNT_KEY_CTRL_D) == 0) + { + delkey(entry); + return TRUE; + } + else if (strcmp(text, GNT_KEY_CTRL_E) == 0) + { + move_end(entry); + return TRUE; + } + else if (strcmp(text, GNT_KEY_CTRL_F) == 0) + { + move_forward(entry); + return TRUE; + } + else if (strcmp(text, GNT_KEY_CTRL_H) == 0) + { + backspace(entry); + return TRUE; + } + else if (strcmp(text, GNT_KEY_CTRL_K) == 0) + { + entry->end = entry->cursor; + memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); entry_redraw(widget); - if (entry->ddown) - show_suggest_dropdown(entry); return TRUE; } + else if (strcmp(text, GNT_KEY_CTRL_U) == 0) + { + memmove(entry->start, entry->cursor, entry->end - entry->cursor); + entry->end -= (entry->cursor - entry->start); + entry->cursor = entry->scroll = entry->start; + memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); + entry_redraw(widget); + return TRUE; + } } } Modified: trunk/console/libgnt/gntkeys.h =================================================================== --- trunk/console/libgnt/gntkeys.h 2006-08-19 21:41:25 UTC (rev 16893) +++ trunk/console/libgnt/gntkeys.h 2006-08-19 23:51:43 UTC (rev 16894) @@ -22,6 +22,29 @@ #define GNT_KEY_BACKSPACE "\177" #define GNT_KEY_DEL "[3~" +#define GNT_KEY_CTRL_A "\001" +#define GNT_KEY_CTRL_B "\002" +#define GNT_KEY_CTRL_D "\004" +#define GNT_KEY_CTRL_E "\005" +#define GNT_KEY_CTRL_F "\006" +#define GNT_KEY_CTRL_G "\007" +#define GNT_KEY_CTRL_H "\010" +#define GNT_KEY_CTRL_I "\011" +#define GNT_KEY_CTRL_J "\012" +#define GNT_KEY_CTRL_K "\013" +#define GNT_KEY_CTRL_L "\014" +#define GNT_KEY_CTRL_M "\012" +#define GNT_KEY_CTRL_N "\016" +#define GNT_KEY_CTRL_O "\017" +#define GNT_KEY_CTRL_P "\020" +#define GNT_KEY_CTRL_R "\022" +#define GNT_KEY_CTRL_T "\024" +#define GNT_KEY_CTRL_U "\025" +#define GNT_KEY_CTRL_V "\026" +#define GNT_KEY_CTRL_W "\027" +#define GNT_KEY_CTRL_X "\030" +#define GNT_KEY_CTRL_Y "\031" + /** * This will do stuff with the terminal settings and stuff. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-20 07:11:15
|
Revision: 16897 Author: sadrul Date: 2006-08-20 00:11:09 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16897&view=rev Log Message: ----------- A couple more keybindings. Modified Paths: -------------- trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntkeys.h trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttree.c Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-08-20 02:24:15 UTC (rev 16896) +++ trunk/console/libgnt/gntentry.c 2006-08-20 07:11:09 UTC (rev 16897) @@ -255,6 +255,16 @@ move_forward(entry); return TRUE; } + else if (strcmp(text + 1, GNT_KEY_HOME) == 0) + { + move_start(entry); + return TRUE; + } + else if (strcmp(text + 1, GNT_KEY_END) == 0) + { + move_end(entry); + return TRUE; + } else if (strcmp(text + 1, GNT_KEY_CTRL_DOWN) == 0 && entry->histlength) { if (entry->history->prev) @@ -371,7 +381,14 @@ entry->end += len; while (str < next) - *(entry->cursor++) = *str++; + { + if (*str == '\r' || *str == '\n') + *entry->cursor = ' '; + else + *entry->cursor = *str; + entry->cursor++; + str++; + } while (g_utf8_pointer_to_offset(entry->scroll, entry->cursor) >= widget->priv.width) entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); Modified: trunk/console/libgnt/gntkeys.h =================================================================== --- trunk/console/libgnt/gntkeys.h 2006-08-20 02:24:15 UTC (rev 16896) +++ trunk/console/libgnt/gntkeys.h 2006-08-20 07:11:09 UTC (rev 16897) @@ -16,6 +16,8 @@ #define GNT_KEY_PGUP "[5~" #define GNT_KEY_PGDOWN "[6~" +#define GNT_KEY_HOME "[7~" +#define GNT_KEY_END "[8~" #define GNT_KEY_ENTER "\r" Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-20 02:24:15 UTC (rev 16896) +++ trunk/console/libgnt/gntmain.c 2006-08-20 07:11:09 UTC (rev 16897) @@ -681,7 +681,9 @@ locale = setlocale(LC_ALL, ""); - g_io_channel_unref(channel); +#if 0 + g_io_channel_unref(channel); /* Apparently this causes crash for some people */ +#endif if (locale && (strstr(locale, "UTF") || strstr(locale, "utf"))) ascii_only = FALSE; Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-08-20 02:24:15 UTC (rev 16896) +++ trunk/console/libgnt/gnttree.c 2006-08-20 07:11:09 UTC (rev 16897) @@ -490,6 +490,41 @@ else redraw_tree(tree); } + else if (strcmp(text+1, GNT_KEY_PGDOWN) == 0) + { + row = get_next(tree->bottom); + if (row) + { + int dist = get_distance(tree->top, tree->current); + tree->top = tree->bottom; + tree->current = get_next_n_opt(tree->top, dist, NULL); + redraw_tree(tree); + } + else if (tree->current != tree->bottom) + { + tree->current = tree->bottom; + redraw_tree(tree); + } + } + else if (strcmp(text+1, GNT_KEY_PGUP) == 0) + { + if (tree->top != tree->root) + { + int dist = get_distance(tree->top, tree->current); + row = get_prev_n(tree->top, widget->priv.height - 1 - + tree->show_title * 2 - 2 * (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER) == 0)); + if (row == NULL) + row = tree->root; + tree->top = row; + tree->current = get_next_n_opt(tree->top, dist, NULL); + redraw_tree(tree); + } + else if (tree->current != tree->top) + { + tree->current = tree->top; + redraw_tree(tree); + } + } } else if (iscntrl(text[0])) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-20 22:46:29
|
Revision: 16921 Author: sadrul Date: 2006-08-20 15:46:20 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16921&view=rev Log Message: ----------- Allow remapping keys for widgets. Modified Paths: -------------- trunk/console/libgnt/gntstyle.c trunk/console/libgnt/gntstyle.h trunk/console/libgnt/gntwidget.c trunk/console/libgnt/gntwidget.h Modified: trunk/console/libgnt/gntstyle.c =================================================================== --- trunk/console/libgnt/gntstyle.c 2006-08-20 22:24:13 UTC (rev 16920) +++ trunk/console/libgnt/gntstyle.c 2006-08-20 22:46:20 UTC (rev 16921) @@ -3,6 +3,10 @@ #include <string.h> +#if GLIB_CHECK_VERSION(2,6,0) +static GKeyFile *gkfile; +#endif + static char * str_styles[GNT_STYLES]; static int int_styles[GNT_STYLES]; static int bool_styles[GNT_STYLES]; @@ -41,7 +45,90 @@ return bool_styles[style]; } +void refine(char *text) +{ + char *s = text, *t = text; + + while (*s) + { + if (*s == '^' && *(s + 1) == '[') + { + *t = '\033'; /* escape */ + s++; + } + else if (*s == '\\') + { + if (*(s + 1) == '\0') + *t = ' '; + else + { + s++; + if (*s == 'r' || *s == 'n') + *t = '\r'; + else if (*s == 't') + *t = '\t'; + else + *t = *s; + } + } + else + *t = *s; + t++; + s++; + } + *t = '\0'; +} + +void gnt_styles_get_keyremaps(GType type, GHashTable *hash) +{ #if GLIB_CHECK_VERSION(2,6,0) + char *name; + GError *error = NULL; + + name = g_strdup_printf("%s::remap", g_type_name(type)); + + if (g_key_file_has_group(gkfile, name)) + { + unsigned int len = 0; + char **keys; + + keys = g_key_file_get_keys(gkfile, name, &len, &error); + if (error) + { + g_printerr("GntStyle: %s\n", error->message); + g_error_free(error); + return; + } + + while (len--) + { + char *key, *replace; + + key = g_strdup(keys[len]); + replace = g_key_file_get_string(gkfile, name, keys[len], &error); + + if (error) + { + g_printerr("GntStyle: %s\n", error->message); + g_error_free(error); + error = NULL; + g_free(key); + } + else + { + refine(key); + refine(replace); + g_hash_table_insert(hash, key, replace); + } + } + g_strfreev(keys); + } + + g_free(name); +#endif +} + +#if GLIB_CHECK_VERSION(2,6,0) static void read_general_style(GKeyFile *kfile) { @@ -58,7 +145,7 @@ if (error) { - /* XXX: some error happened. */ + g_printerr("GntStyle: %s\n", error->message); g_error_free(error); } else @@ -70,25 +157,24 @@ g_key_file_get_string(kfile, "general", styles[i].style, &error); } } + g_strfreev(keys); } #endif void gnt_style_read_configure_file(const char *filename) { #if GLIB_CHECK_VERSION(2,6,0) - GKeyFile *kfile = g_key_file_new(); + gkfile = g_key_file_new(); GError *error = NULL; - if (!g_key_file_load_from_file(kfile, filename, G_KEY_FILE_NONE, &error)) + if (!g_key_file_load_from_file(gkfile, filename, G_KEY_FILE_NONE, &error)) { - /* XXX: Print the error or something */ + g_printerr("GntStyle: %s\n", error->message); g_error_free(error); return; } - gnt_colors_parse(kfile); - read_general_style(kfile); - - g_key_file_free(kfile); + gnt_colors_parse(gkfile); + read_general_style(gkfile); #endif } @@ -108,5 +194,9 @@ int i; for (i = 0; i < GNT_STYLES; i++) g_free(str_styles[i]); + +#if GLIB_CHECK_VERSION(2,6,0) + g_key_file_free(gkfile); +#endif } Modified: trunk/console/libgnt/gntstyle.h =================================================================== --- trunk/console/libgnt/gntstyle.h 2006-08-20 22:24:13 UTC (rev 16920) +++ trunk/console/libgnt/gntstyle.h 2006-08-20 22:46:20 UTC (rev 16921) @@ -13,6 +13,9 @@ gboolean gnt_style_get_bool(GntStyle style, gboolean def); +/* This should be called only once for the each type */ +void gnt_styles_get_keyremaps(GType type, GHashTable *hash); + void gnt_init_styles(); void gnt_uninit_styles(); Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-08-20 22:24:13 UTC (rev 16920) +++ trunk/console/libgnt/gntwidget.c 2006-08-20 22:46:20 UTC (rev 16921) @@ -96,7 +96,6 @@ return continue_emission; } - static void gnt_widget_class_init(GntWidgetClass *klass) { @@ -214,6 +213,7 @@ gnt_boolean_handled_accumulator, NULL, gnt_closure_marshal_BOOLEAN__STRING, G_TYPE_BOOLEAN, 1, G_TYPE_STRING); + DEBUG; } @@ -231,7 +231,7 @@ NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc)gnt_widget_class_init, - NULL, /* class_finalize */ + NULL, NULL, /* class_data */ sizeof(GntWidget), 0, /* n_preallocs */ @@ -246,6 +246,24 @@ 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) { @@ -327,6 +345,8 @@ gboolean ret; if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_CAN_TAKE_FOCUS)) return FALSE; + + keys = gnt_widget_remap_keys(widget, keys); g_signal_emit(widget, signals[SIG_KEY_PRESSED], 0, keys, &ret); return ret; } Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-08-20 22:24:13 UTC (rev 16920) +++ trunk/console/libgnt/gntwidget.h 2006-08-20 22:46:20 UTC (rev 16921) @@ -76,6 +76,8 @@ { GObjectClass parent; + GHashTable *remaps; /* Key remaps */ + void (*map)(GntWidget *obj); void (*show)(GntWidget *obj); /* This will call draw() and take focus (if it can take focus) */ void (*destroy)(GntWidget *obj); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-22 17:02:27
|
Revision: 16982 Author: sadrul Date: 2006-08-22 10:02:20 -0700 (Tue, 22 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16982&view=rev Log Message: ----------- Make sure new windows fit in the screen. Modified Paths: -------------- trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntwidget.c trunk/console/libgnt/test/multiwin.c Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-22 16:43:19 UTC (rev 16981) +++ trunk/console/libgnt/gntmain.c 2006-08-22 17:02:20 UTC (rev 16982) @@ -846,6 +846,8 @@ g_hash_table_replace(nodes, widget, node); + refresh_node(widget, node, NULL); + if (window_list.window) { if ((GNT_IS_BOX(widget) && GNT_BOX(widget)->title) && window_list.window != widget Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-08-22 16:43:19 UTC (rev 16981) +++ trunk/console/libgnt/gntwidget.c 2006-08-22 17:02:20 UTC (rev 16982) @@ -331,6 +331,30 @@ widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, widget->priv.y, widget->priv.x); + if (widget->window == NULL) /* The size is probably too large for the screen */ + { + int x = widget->priv.x, y = widget->priv.y; + int w = widget->priv.width + shadow, h = widget->priv.height + shadow; + int maxx, maxy; /* Max-X is cool */ + + getmaxyx(stdscr, maxy, maxx); + + if (x + w >= maxx) + x = MAX(0, maxx - w); + if (y + h >= maxy) + y = MAX(0, maxy - h); + + w = MIN(w, maxx); + h = MIN(h, maxy); + + widget->priv.x = x; + widget->priv.y = y; + widget->priv.width = w - shadow; + widget->priv.height = h - shadow; + + widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, + widget->priv.y, widget->priv.x); + } init_widget(widget); } Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-08-22 16:43:19 UTC (rev 16981) +++ trunk/console/libgnt/test/multiwin.c 2006-08-22 17:02:20 UTC (rev 16982) @@ -43,7 +43,7 @@ gnt_box_add_widget(GNT_BOX(box2), gnt_entry_new(NULL)); gnt_widget_show(hbox); - gnt_widget_set_position(box2, 35, 15); + gnt_widget_set_position(box2, 80, 40); gnt_widget_show(box2); gnt_tree_add_row_after(GNT_TREE(tree), "a", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-23 01:35:54
|
Revision: 16989 Author: sadrul Date: 2006-08-22 18:35:44 -0700 (Tue, 22 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16989&view=rev Log Message: ----------- Now the customcolors should work. Apparently I didn't include it in last commit. Modified Paths: -------------- trunk/console/libgnt/gntcolors.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntstyle.c trunk/console/libgnt/gntstyle.h Modified: trunk/console/libgnt/gntcolors.c =================================================================== --- trunk/console/libgnt/gntcolors.c 2006-08-23 01:09:33 UTC (rev 16988) +++ trunk/console/libgnt/gntcolors.c 2006-08-23 01:35:44 UTC (rev 16989) @@ -1,5 +1,6 @@ #include <ncursesw/ncurses.h> #include "gntcolors.h" +#include "gntstyle.h" #include <glib.h> @@ -36,7 +37,7 @@ void gnt_init_colors() { start_color(); - if (can_change_color()) + if (gnt_style_get_bool(GNT_STYLE_COLOR, FALSE) && can_change_color()) { backup_colors(); @@ -63,6 +64,7 @@ } else { + use_default_colors(); init_pair(GNT_COLOR_NORMAL, COLOR_BLACK, COLOR_WHITE); init_pair(GNT_COLOR_HIGHLIGHT, COLOR_WHITE, COLOR_BLUE); init_pair(GNT_COLOR_SHADOW, COLOR_BLACK, COLOR_BLACK); @@ -77,7 +79,8 @@ void gnt_uninit_colors() { - restore_colors(); + if (gnt_style_get_bool(GNT_STYLE_COLOR, FALSE) && can_change_color()) + restore_colors(); } static int Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-23 01:09:33 UTC (rev 16988) +++ trunk/console/libgnt/gntmain.c 2006-08-23 01:35:44 UTC (rev 16989) @@ -782,13 +782,13 @@ noecho(); curs_set(0); - gnt_init_colors(); gnt_init_styles(); filename = g_build_filename(g_get_home_dir(), ".gntrc", NULL); gnt_style_read_configure_file(filename); g_free(filename); + gnt_init_colors(); X_MIN = 0; Y_MIN = 0; X_MAX = getmaxx(stdscr); Modified: trunk/console/libgnt/gntstyle.c =================================================================== --- trunk/console/libgnt/gntstyle.c 2006-08-23 01:09:33 UTC (rev 16988) +++ trunk/console/libgnt/gntstyle.c 2006-08-23 01:35:44 UTC (rev 16989) @@ -141,6 +141,7 @@ const char *style; GntStyle en; } styles[] = {{"shadow", GNT_STYLE_SHADOW}, + {"customcolor", GNT_STYLE_COLOR}, {NULL, 0}}; if (error) Modified: trunk/console/libgnt/gntstyle.h =================================================================== --- trunk/console/libgnt/gntstyle.h 2006-08-23 01:09:33 UTC (rev 16988) +++ trunk/console/libgnt/gntstyle.h 2006-08-23 01:35:44 UTC (rev 16989) @@ -3,6 +3,7 @@ typedef enum { GNT_STYLE_SHADOW = 0, + GNT_STYLE_COLOR = 1, GNT_STYLES } GntStyle; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-23 12:29:34
|
Revision: 17000 Author: sadrul Date: 2006-08-23 05:29:08 -0700 (Wed, 23 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=17000&view=rev Log Message: ----------- Add support for mouse. Currently you can: - click on the taskbar to bring a window on top - click on the topmost line of the *active* window and drag+drop to move the window. This is disabled by default. You can enable it by setting "mouse = 1" in ~/.gntrc. If you enable mouse support, then do shift+click to get the usual behaviours (eg. shift+middleclick to paste etc.) Modified Paths: -------------- trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntstyle.c trunk/console/libgnt/gntstyle.h trunk/console/libgnt/test/keys.c Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-23 10:48:21 UTC (rev 16999) +++ trunk/console/libgnt/gntmain.c 2006-08-23 12:29:08 UTC (rev 17000) @@ -31,6 +31,7 @@ static int Y_MAX; static gboolean ascii_only; +static gboolean mouse_enabled; static GMainLoop *loop; static struct @@ -480,7 +481,89 @@ gnt_screen_resize_widget(widget, nw, nh); } +/** + * Mouse support: + * - bring a window on top if you click on its taskbar + * - click on the top-bar of the active window and drag+drop to move a window + * wishlist: + * - have a little [X] on the windows, and clicking it will close that window. + * - click on a window to bring it to focus + * - allow scrolling in tree/textview on wheel-scroll event + * - click to activate button or select a row in tree + * - all these can be fulfilled by adding a "clicked" event for GntWidget + * which will send the (x,y) to the widget. (look at "key_pressed" for hints) + */ static gboolean +detect_mouse_action(const char *buffer) +{ + int x, y; + static enum { + MOUSE_NONE, + MOUSE_LEFT, + MOUSE_RIGHT, + MOUSE_MIDDLE + } button = MOUSE_NONE; + static GntWidget *remember = NULL; + static int offset = 0; + + if (buffer[0] != 27) + return FALSE; + + buffer++; + if (strlen(buffer) < 5) + return FALSE; + + x = buffer[3]; + y = buffer[4]; + if (x < 0) x += 256; + if (y < 0) y += 256; + x -= 33; + y -= 33; + + if (strncmp(buffer, "[M ", 3) == 0) { + /* left button down */ + /* If you clicked on the top-bar of the active window, then you can move it by dragging it */ + if (focus_list) { + GntWidget *wid = focus_list->data; + if (x >= wid->priv.x && x < wid->priv.x + wid->priv.width && + y == wid->priv.y) { + offset = x - wid->priv.x; + remember = wid; + button = MOUSE_LEFT; + } + } + } else if (strncmp(buffer, "[M\"", 3) == 0) { + /* right button down */ + } else if (strncmp(buffer, "[M!", 3) == 0) { + /* middle button down */ + } else if (strncmp(buffer, "[M`", 3) == 0) { + /* wheel up*/ + } else if (strncmp(buffer, "[Ma", 3) == 0) { + /* wheel down */ + } else if (strncmp(buffer, "[M#", 3) == 0) { + /* button up */ + if (button == MOUSE_NONE && y == getmaxy(stdscr) - 1) { + int n = g_list_length(g_list_first(focus_list)); + if (n) { + int width = getmaxx(stdscr) / n; + switch_window_n(x / width); + } + } else if (button == MOUSE_LEFT && remember) { + x -= offset; + if (x < 0) x = 0; + if (y < 0) y = 0; + gnt_screen_move_widget(remember, x, y); + refresh_node(remember, NULL, NULL); + } + button = MOUSE_NONE; + remember = NULL; + offset = 0; + } else + return FALSE; + return TRUE; +} + +static gboolean io_invoke(GIOChannel *source, GIOCondition cond, gpointer null) { char buffer[256]; @@ -511,6 +594,9 @@ gnt_keys_refine(buffer); + if (mouse_enabled && detect_mouse_action(buffer)) + return TRUE; + if (mode == GNT_KP_MODE_NORMAL) { if (focus_list) @@ -798,9 +884,10 @@ wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); refresh(); -#if 0 - mousemask(NCURSES_BUTTON_PRESSED | NCURSES_BUTTON_RELEASED | REPORT_MOUSE_POSITION, NULL); -#endif + + if ((mouse_enabled = gnt_style_get_bool(GNT_STYLE_MOUSE, FALSE))) + mousemask(NCURSES_BUTTON_PRESSED | NCURSES_BUTTON_RELEASED , NULL); + wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); werase(stdscr); wrefresh(stdscr); Modified: trunk/console/libgnt/gntstyle.c =================================================================== --- trunk/console/libgnt/gntstyle.c 2006-08-23 10:48:21 UTC (rev 16999) +++ trunk/console/libgnt/gntstyle.c 2006-08-23 12:29:08 UTC (rev 17000) @@ -142,6 +142,7 @@ GntStyle en; } styles[] = {{"shadow", GNT_STYLE_SHADOW}, {"customcolor", GNT_STYLE_COLOR}, + {"mouse", GNT_STYLE_MOUSE}, {NULL, 0}}; if (error) Modified: trunk/console/libgnt/gntstyle.h =================================================================== --- trunk/console/libgnt/gntstyle.h 2006-08-23 10:48:21 UTC (rev 16999) +++ trunk/console/libgnt/gntstyle.h 2006-08-23 12:29:08 UTC (rev 17000) @@ -4,6 +4,7 @@ { GNT_STYLE_SHADOW = 0, GNT_STYLE_COLOR = 1, + GNT_STYLE_MOUSE = 2, GNT_STYLES } GntStyle; Modified: trunk/console/libgnt/test/keys.c =================================================================== --- trunk/console/libgnt/test/keys.c 2006-08-23 10:48:21 UTC (rev 16999) +++ trunk/console/libgnt/test/keys.c 2006-08-23 12:29:08 UTC (rev 17000) @@ -10,7 +10,25 @@ gnt_entry_set_text(entry, s); g_free(s); if (text[0] == 27) - return FALSE; + { + if (strncmp(text + 1, "[M ", 3) == 0) + { + int x = (unsigned)text[4]; + int y = (unsigned)text[5]; + if (x < 0) x += 256; + if (y < 0) y += 256; + x -= 33; + y -= 33; + s = g_strdup_printf("ldown %d %d", x, y); + gnt_entry_set_text(entry, s); + g_free(s); + } + else if (strncmp(text + 1, "[M#", 3) == 0) + gnt_entry_set_text(entry, "up"); + else + return FALSE; + return TRUE; + } else return TRUE; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-25 18:25:18
|
Revision: 17031 Author: sadrul Date: 2006-08-25 11:21:22 -0700 (Fri, 25 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=17031&view=rev Log Message: ----------- Add a sample window-manager. This one removes the border and shadows from the buddylist, shows the conversation windows at the right-end of the screen, and puts all the rest of the dialogs in the middle of the screen. I was not planning on committing this just yet, but I accidentally included the change in configure.ac, and I don't want to get yelled at ;) Modified Paths: -------------- trunk/console/libgnt/Makefile.am trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntstyle.c trunk/console/libgnt/gntstyle.h trunk/console/libgnt/gntwidget.c trunk/console/libgnt/gntwidget.h Added Paths: ----------- trunk/console/libgnt/gntwm.h trunk/console/libgnt/wms/ trunk/console/libgnt/wms/Makefile.am trunk/console/libgnt/wms/s.c Modified: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am 2006-08-25 18:17:22 UTC (rev 17030) +++ trunk/console/libgnt/Makefile.am 2006-08-25 18:21:22 UTC (rev 17031) @@ -1,3 +1,4 @@ +SUBDIRS = wms pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = gnt.pc Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-25 18:17:22 UTC (rev 17030) +++ trunk/console/libgnt/gntmain.c 2006-08-25 18:21:22 UTC (rev 17031) @@ -4,12 +4,15 @@ #include <panel.h> #endif +#include <gmodule.h> + #include "gnt.h" #include "gntbox.h" #include "gntcolors.h" #include "gntkeys.h" #include "gntstyle.h" #include "gnttree.h" +#include "gntwm.h" #include <stdio.h> #include <stdlib.h> @@ -38,6 +41,8 @@ static gboolean ascii_only; static gboolean mouse_enabled; +static GntWM wm; + static GMainLoop *loop; static struct { @@ -846,6 +851,24 @@ } #endif +static void +init_wm() +{ + const char *name = gnt_style_get(GNT_STYLE_WM); + gpointer handle; + + if (!name || !*name) + return; + + handle = g_module_open(name, G_MODULE_BIND_LAZY); + if (handle) { + gboolean (*init)(GntWM *); + if (g_module_symbol(handle, "gntwm_init", &init)) { + init(&wm); + } + } +} + void gnt_init() { static GIOChannel *channel = NULL; @@ -915,6 +938,8 @@ #endif g_type_init(); + + init_wm(); } void gnt_main() @@ -999,7 +1024,10 @@ node = g_hash_table_lookup(nodes, widget); if (node && !node->panel) { - node->panel = new_panel(node->me->window); + if (wm.new_window) + node->panel = wm.new_window(node->me); + else + node->panel = new_panel(node->me->window); if (!GNT_WIDGET_IS_FLAG_SET(node->me, GNT_WIDGET_TRANSIENT)) { bottom_panel(node->panel); /* New windows should not grab focus */ Modified: trunk/console/libgnt/gntstyle.c =================================================================== --- trunk/console/libgnt/gntstyle.c 2006-08-25 18:17:22 UTC (rev 17030) +++ trunk/console/libgnt/gntstyle.c 2006-08-25 18:21:22 UTC (rev 17031) @@ -143,6 +143,7 @@ } styles[] = {{"shadow", GNT_STYLE_SHADOW}, {"customcolor", GNT_STYLE_COLOR}, {"mouse", GNT_STYLE_MOUSE}, + {"wm", GNT_STYLE_WM}, {NULL, 0}}; if (error) Modified: trunk/console/libgnt/gntstyle.h =================================================================== --- trunk/console/libgnt/gntstyle.h 2006-08-25 18:17:22 UTC (rev 17030) +++ trunk/console/libgnt/gntstyle.h 2006-08-25 18:21:22 UTC (rev 17031) @@ -5,12 +5,12 @@ GNT_STYLE_SHADOW = 0, GNT_STYLE_COLOR = 1, GNT_STYLE_MOUSE = 2, + GNT_STYLE_WM = 3, GNT_STYLES } GntStyle; void gnt_style_read_configure_file(const char *filename); -/* Returned strings are all lowercase */ const char *gnt_style_get(GntStyle style); gboolean gnt_style_get_bool(GntStyle style, gboolean def); Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-08-25 18:17:22 UTC (rev 17030) +++ trunk/console/libgnt/gntwidget.c 2006-08-25 18:21:22 UTC (rev 17031) @@ -545,6 +545,11 @@ widget->priv.name = g_strdup(name); } +const char *gnt_widget_get_name(GntWidget *widget) +{ + return widget->priv.name; +} + void gnt_widget_activate(GntWidget *widget) { g_signal_emit(widget, signals[SIG_ACTIVATE], 0); Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-08-25 18:17:22 UTC (rev 17030) +++ trunk/console/libgnt/gntwidget.h 2006-08-25 18:21:22 UTC (rev 17031) @@ -126,6 +126,8 @@ void gnt_widget_set_name(GntWidget *widget, const char *name); +const char *gnt_widget_get_name(GntWidget *widget); + /* Widget-subclasses should call this from the draw-callback. * Applications should just call gnt_widget_draw instead of this. */ void gnt_widget_queue_update(GntWidget *widget); Added: trunk/console/libgnt/gntwm.h =================================================================== --- trunk/console/libgnt/gntwm.h (rev 0) +++ trunk/console/libgnt/gntwm.h 2006-08-25 18:21:22 UTC (rev 17031) @@ -0,0 +1,18 @@ +#ifdef HAVE_NCURSESW_INC +#include <ncursesw/panel.h> +#else +#include <panel.h> +#endif + +#include "gntwidget.h" + +typedef struct _GntWM GntWM; + +struct _GntWM +{ + PANEL *(*new_window)(GntWidget *win); + gboolean (*key_pressed)(const char *key); + gboolean (*mouse_clicked)(void); /* XXX: haven't decided yet */ + void (*gntwm_uninit)(); +}; + Property changes on: trunk/console/libgnt/gntwm.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/wms/Makefile.am =================================================================== --- trunk/console/libgnt/wms/Makefile.am (rev 0) +++ trunk/console/libgnt/wms/Makefile.am 2006-08-25 18:21:22 UTC (rev 17031) @@ -0,0 +1,23 @@ +s_la_LDFLAGS = -module -avoid-version $(GLIB_LIBS) + +if PLUGINS + +plugin_LTLIBRARIES = \ + s.la + +plugindir = $(libdir)/gaim + +s_la_SOURCES = s.c + +endif # PLUGINS + +EXTRA_DIST = + +AM_CPPFLAGS = \ + -DDATADIR=\"$(datadir)\" \ + -DVERSION=\"$(VERSION)\" \ + -I$(top_srcdir)/console/libgnt \ + $(DEBUG_CFLAGS) \ + $(GLIB_CFLAGS) \ + $(PLUGIN_CFLAGS) + Property changes on: trunk/console/libgnt/wms/Makefile.am ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/wms/s.c =================================================================== --- trunk/console/libgnt/wms/s.c (rev 0) +++ trunk/console/libgnt/wms/s.c 2006-08-25 18:21:22 UTC (rev 17031) @@ -0,0 +1,56 @@ +#include "gntbox.h" +#include "gntwm.h" + +#include <string.h> + +static PANEL * +s_new_window(GntWidget *win) +{ + int x, y, w, h; + int maxx, maxy; + const char *name; + + getmaxyx(stdscr, maxy, maxx); + + gnt_widget_get_position(win, &x, &y); + gnt_widget_get_size(win, &w, &h); + + name = gnt_widget_get_name(win); + + if (name && strcmp(name, "buddylist") == 0) { + /* The buddylist doesn't have no border nor nothing! */ + x = 0; + y = 0; + h = maxy - 1; + + gnt_box_set_toplevel(GNT_BOX(win), FALSE); + GNT_WIDGET_SET_FLAGS(win, GNT_WIDGET_CAN_TAKE_FOCUS); + gnt_box_readjust(GNT_BOX(win)); + + gnt_widget_set_position(win, x, y); + mvwin(win->window, y, x); + + gnt_widget_set_size(win, w, h); + } else if (name && strcmp(name, "conversation-window") == 0) { + /* Put the conversation windows to the far-right */ + x = maxx - w; + y = 0; + gnt_widget_set_position(win, x, y); + mvwin(win->window, y, x); + } else if (!GNT_WIDGET_IS_FLAG_SET(win, GNT_WIDGET_TRANSIENT)) { + /* In the middle of the screen */ + x = (maxx - w) / 2; + y = (maxy - h) / 2; + + gnt_widget_set_position(win, x, y); + mvwin(win->window, y, x); + } + + return new_panel(win->window); +} + +void gntwm_init(GntWM *wm) +{ + wm->new_window = s_new_window; +} + Property changes on: trunk/console/libgnt/wms/s.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-26 12:54:51
|
Revision: 17044 Author: sadrul Date: 2006-08-26 05:54:39 -0700 (Sat, 26 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=17044&view=rev Log Message: ----------- A WM can now act on keystrokes. As an example, the sample WM will toggle the buddylist on pressing Alt+b. Mouse clicking and scrolling is now supported in most/all widgets. To use a WM, you need to add "wm=/path/to/wm.so" under [general] in ~/.gntrc. Modified Paths: -------------- trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbutton.c trunk/console/libgnt/gntcheckbox.c trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntmarshal.c trunk/console/libgnt/gntmarshal.h trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gntwidget.c trunk/console/libgnt/gntwidget.h trunk/console/libgnt/gntwm.h trunk/console/libgnt/wms/Makefile.am trunk/console/libgnt/wms/s.c Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gntbox.c 2006-08-26 12:54:39 UTC (rev 17044) @@ -454,6 +454,30 @@ reposition_children(widget); } +static gboolean +gnt_box_clicked(GntWidget *widget, GntMouseEvent event, int cx, int cy) +{ + GList *iter; + for (iter = GNT_BOX(widget)->list; iter; iter = iter->next) { + int x, y, w, h; + GntWidget *wid = iter->data; + + gnt_widget_get_position(wid, &x, &y); + gnt_widget_get_size(wid, &w, &h); + + if (cx >= x && cx < x + w && cy >= y && cy < y + h) { + if (event <= GNT_MIDDLE_MOUSE_DOWN && + GNT_WIDGET_IS_FLAG_SET(wid, GNT_WIDGET_CAN_TAKE_FOCUS)) { + while (widget->parent) + widget = widget->parent; + gnt_box_give_focus_to_child(GNT_BOX(widget), wid); + } + return gnt_widget_clicked(wid, event, cx, cy); + } + } + return FALSE; +} + static void gnt_box_class_init(GntBoxClass *klass) { @@ -465,6 +489,7 @@ parent_class->size_request = gnt_box_size_request; parent_class->set_position = gnt_box_set_position; parent_class->key_pressed = gnt_box_key_pressed; + parent_class->clicked = gnt_box_clicked; parent_class->lost_focus = gnt_box_lost_focus; parent_class->gained_focus = gnt_box_gained_focus; parent_class->confirm_size = gnt_box_confirm_size; @@ -603,6 +628,7 @@ if (box->vertical) { + x = pos; if (box->alignment == GNT_ALIGN_RIGHT) x += widget->priv.width - width; else if (box->alignment == GNT_ALIGN_MID) @@ -612,6 +638,7 @@ } else { + y = pos; if (box->alignment == GNT_ALIGN_BOTTOM) y += widget->priv.height - height; else if (box->alignment == GNT_ALIGN_MID) @@ -622,6 +649,7 @@ copywin(w->window, widget->window, 0, 0, y, x, y + height - 1, x + width - 1, FALSE); + gnt_widget_set_position(w, x + widget->priv.x, y + widget->priv.y); } } Modified: trunk/console/libgnt/gntbutton.c =================================================================== --- trunk/console/libgnt/gntbutton.c 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gntbutton.c 2006-08-26 12:54:39 UTC (rev 17044) @@ -58,6 +58,16 @@ return FALSE; } +static gboolean +gnt_button_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) +{ + if (event == GNT_LEFT_MOUSE_DOWN) { + gnt_widget_activate(widget); + return TRUE; + } + return FALSE; +} + static void gnt_button_class_init(GntWidgetClass *klass) { @@ -66,6 +76,7 @@ parent_class->map = gnt_button_map; parent_class->size_request = gnt_button_size_request; parent_class->key_pressed = gnt_button_key_pressed; + parent_class->clicked = gnt_button_clicked; DEBUG; } Modified: trunk/console/libgnt/gntcheckbox.c =================================================================== --- trunk/console/libgnt/gntcheckbox.c 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gntcheckbox.c 2006-08-26 12:54:39 UTC (rev 17044) @@ -46,20 +46,36 @@ DEBUG; } +static void +toggle_selection(GntWidget *widget) +{ + GNT_CHECK_BOX(widget)->checked = !GNT_CHECK_BOX(widget)->checked; + g_signal_emit(widget, signals[SIG_TOGGLED], 0); + gnt_widget_draw(widget); +} + static gboolean gnt_check_box_key_pressed(GntWidget *widget, const char *text) { if (text[0] == ' ' && text[1] == '\0') { - GNT_CHECK_BOX(widget)->checked = !GNT_CHECK_BOX(widget)->checked; - g_signal_emit(widget, signals[SIG_TOGGLED], 0); - gnt_widget_draw(widget); + toggle_selection(widget); return TRUE; } return FALSE; } +static gboolean +gnt_check_box_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) +{ + if (event == GNT_LEFT_MOUSE_DOWN) { + toggle_selection(widget); + return TRUE; + } + return FALSE; +} + static void gnt_check_box_destroy(GntWidget *widget) { @@ -76,6 +92,7 @@ /*parent_class->map = gnt_check_box_map;*/ /*parent_class->size_request = gnt_check_box_size_request;*/ wclass->key_pressed = gnt_check_box_key_pressed; + wclass->clicked = gnt_check_box_clicked; signals[SIG_TOGGLED] = g_signal_new("toggled", Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gntcombobox.c 2006-08-26 12:54:39 UTC (rev 17044) @@ -91,6 +91,26 @@ DEBUG; } +static void +popup_dropdown(GntComboBox *box) +{ + GntWidget *widget = GNT_WIDGET(box); + GntWidget *parent = box->dropdown->parent; + int height = g_list_length(GNT_TREE(box->dropdown)->list); + int y = widget->priv.y + widget->priv.height - 1; + gnt_widget_set_size(box->dropdown, widget->priv.width, height + 2); + + if (y + height + 2 >= getmaxy(stdscr)) + y = widget->priv.y - height - 1; + gnt_widget_set_position(parent, widget->priv.x, y); + if (parent->window) + { + mvwin(parent->window, y, widget->priv.x); + } + + gnt_widget_draw(parent); +} + static gboolean gnt_combo_box_key_pressed(GntWidget *widget, const char *text) { @@ -121,20 +141,7 @@ if (strcmp(text + 1, GNT_KEY_UP) == 0 || strcmp(text + 1, GNT_KEY_DOWN) == 0) { - GntWidget *parent = box->dropdown->parent; - int height = g_list_length(GNT_TREE(box->dropdown)->list); - int y = widget->priv.y + widget->priv.height - 1; - gnt_widget_set_size(box->dropdown, widget->priv.width, height + 2); - - if (y + height + 2 >= getmaxy(stdscr)) - y = widget->priv.y - height - 1; - gnt_widget_set_position(parent, widget->priv.x, y); - if (parent->window) - { - mvwin(parent->window, y, widget->priv.x); - } - - gnt_widget_draw(parent); + popup_dropdown(box); return TRUE; } } @@ -158,6 +165,32 @@ widget_lost_focus(widget); } +static gboolean +gnt_combo_box_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) +{ + GntComboBox *box = GNT_COMBO_BOX(widget); + gboolean dshowing = GNT_WIDGET_IS_FLAG_SET(box->dropdown->parent, GNT_WIDGET_MAPPED); + + if (event == GNT_MOUSE_SCROLL_UP) { + if (dshowing) + gnt_widget_key_pressed(box->dropdown, "\033" GNT_KEY_UP); + } else if (event == GNT_MOUSE_SCROLL_DOWN) { + if (dshowing) + gnt_widget_key_pressed(box->dropdown, "\033" 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_tree_set_selected(GNT_TREE(box->dropdown), box->selected); + gnt_widget_hide(box->dropdown->parent); + } else { + popup_dropdown(GNT_COMBO_BOX(widget)); + return TRUE; + } + } else + return FALSE; + return TRUE; +} + static void gnt_combo_box_class_init(GntComboBoxClass *klass) { @@ -168,6 +201,7 @@ parent_class->map = gnt_combo_box_map; 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; widget_lost_focus = parent_class->lost_focus; parent_class->lost_focus = gnt_combo_box_lost_focus; Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gntmain.c 2006-08-26 12:54:39 UTC (rev 17044) @@ -41,8 +41,6 @@ static gboolean ascii_only; static gboolean mouse_enabled; -static GntWM wm; - static GMainLoop *loop; static struct { @@ -73,7 +71,24 @@ static void bring_on_top(GntWidget *widget); static gboolean refresh_screen(); +static const GList *list_all_windows(); +static GntWM wm = +{ + NULL, /* new_window */ + NULL, /* close_window */ + NULL, /* key_pressed */ + NULL, /* mouse clicked */ + bring_on_top, /* give_focus */ + NULL, /* uninit */ + list_all_windows, /* window_list */ +}; + +static const GList *list_all_windows() +{ + return focus_list; +} + static GList * g_list_bring_to_front(GList *list, gpointer data) { @@ -127,7 +142,7 @@ if (ordered) { - bring_on_top(ordered->data); + wm.give_focus(ordered->data); } draw_taskbar(FALSE); } @@ -139,6 +154,12 @@ if (!node) return; + + if (ordered->data != widget) { + GntWidget *w = ordered->data; + ordered = g_list_bring_to_front(ordered, widget); + gnt_widget_set_focus(w, FALSE); + } gnt_widget_set_focus(widget, TRUE); gnt_widget_draw(widget); @@ -247,7 +268,7 @@ ordered = g_list_bring_to_front(ordered, wid); - bring_on_top(ordered->data); + wm.give_focus(ordered->data); if (w != wid) { @@ -269,7 +290,7 @@ if ((l = g_list_nth(focus_list, n)) != NULL) { ordered = g_list_bring_to_front(ordered, l->data); - bring_on_top(ordered->data); + wm.give_focus(ordered->data); } if (l && w != l->data) @@ -289,7 +310,7 @@ old = ordered->data; ordered = g_list_bring_to_front(ordered, widget); - bring_on_top(widget); + wm.give_focus(widget); if (old != widget) { @@ -514,8 +535,9 @@ } button = MOUSE_NONE; static GntWidget *remember = NULL; static int offset = 0; + GntMouseEvent event; - if (buffer[0] != 27) + if (!ordered || buffer[0] != 27) return FALSE; buffer++; @@ -541,7 +563,7 @@ if (iter != ordered) { GntWidget *w = ordered->data; ordered = g_list_bring_to_front(ordered, iter->data); - bring_on_top(ordered->data); + wm.give_focus(ordered->data); gnt_widget_set_focus(w, FALSE); } if (y == wid->priv.y) { @@ -553,14 +575,19 @@ } } } + event = GNT_LEFT_MOUSE_DOWN; } else if (strncmp(buffer, "[M\"", 3) == 0) { /* right button down */ + event = GNT_RIGHT_MOUSE_DOWN; } else if (strncmp(buffer, "[M!", 3) == 0) { /* middle button down */ + event = GNT_MIDDLE_MOUSE_DOWN; } else if (strncmp(buffer, "[M`", 3) == 0) { /* wheel up*/ + event = GNT_MOUSE_SCROLL_UP; } else if (strncmp(buffer, "[Ma", 3) == 0) { /* wheel down */ + event = GNT_MOUSE_SCROLL_DOWN; } else if (strncmp(buffer, "[M#", 3) == 0) { /* button up */ if (button == MOUSE_NONE && y == getmaxy(stdscr) - 1) { @@ -579,19 +606,23 @@ button = MOUSE_NONE; remember = NULL; offset = 0; + event = GNT_MOUSE_UP; } else return FALSE; + + gnt_widget_clicked(ordered->data, event, x, y); return FALSE; /* XXX: this should be TRUE */ } static gboolean io_invoke(GIOChannel *source, GIOCondition cond, gpointer null) { - char buffer[256]; + char keys[256]; gboolean ret = FALSE; static GntKeyPressMode mode = GNT_KP_MODE_NORMAL; + const char *buffer; - int rd = read(STDIN_FILENO, buffer, sizeof(buffer) - 1); + int rd = read(STDIN_FILENO, keys, sizeof(keys) - 1); if (rd < 0) { endwin(); @@ -605,18 +636,25 @@ exit(1); } - buffer[rd] = 0; + keys[rd] = 0; - if (buffer[0] == 27 && buffer[1] == 'd' && buffer[2] == 0) + if (keys[0] == 27 && keys[1] == 'd' && keys[2] == 0) { /* This dumps the screen contents in an html file */ dump_screen(); } - gnt_keys_refine(buffer); + gnt_keys_refine(keys); - if (mouse_enabled && detect_mouse_action(buffer)) + if (mouse_enabled && detect_mouse_action(keys)) return TRUE; + + if (wm.key_pressed) { + buffer = wm.key_pressed(keys); + if (buffer == NULL) + return TRUE; + } else + buffer = keys; if (mode == GNT_KP_MODE_NORMAL) { Modified: trunk/console/libgnt/gntmarshal.c =================================================================== --- trunk/console/libgnt/gntmarshal.c 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gntmarshal.c 2006-08-26 12:54:39 UTC (rev 17044) @@ -166,3 +166,40 @@ } +void gnt_closure_marshal_BOOLEAN__INT_INT_INT(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*func) (gpointer data1, int, int, int, gpointer data2); + register func callback; + register GCClosure *cc = (GCClosure*)closure; + register gpointer data1, data2; + gboolean ret; + + g_return_if_fail(ret_value != NULL); + g_return_if_fail(n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA(closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer(param_values + 0); + } + else + { + data1 = g_value_peek_pointer(param_values + 0); + data2 = closure->data; + } + + callback = (func) (marshal_data ? marshal_data : cc->callback); + ret = callback(data1, + g_value_get_int(param_values + 1) , + g_value_get_int(param_values + 2) , + g_value_get_int(param_values + 3) , + data2); + g_value_set_boolean(ret_value, ret); +} + + Modified: trunk/console/libgnt/gntmarshal.h =================================================================== --- trunk/console/libgnt/gntmarshal.h 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gntmarshal.h 2006-08-26 12:54:39 UTC (rev 17044) @@ -35,3 +35,10 @@ gpointer invocation_hint, gpointer marshal_data); +void gnt_closure_marshal_BOOLEAN__INT_INT_INT(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gnttextview.c 2006-08-26 12:54:39 UTC (rev 17044) @@ -135,6 +135,18 @@ g_list_free(view->list); } +static gboolean +gnt_text_view_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) +{ + if (event == GNT_MOUSE_SCROLL_UP) { + gnt_text_view_scroll(GNT_TEXT_VIEW(widget), -1); + } else if (event == GNT_MOUSE_SCROLL_DOWN) { + gnt_text_view_scroll(GNT_TEXT_VIEW(widget), 1); + } else + return FALSE; + return TRUE; +} + static void gnt_text_view_class_init(GntTextViewClass *klass) { @@ -144,6 +156,7 @@ parent_class->map = gnt_text_view_map; parent_class->size_request = gnt_text_view_size_request; parent_class->key_pressed = gnt_text_view_key_pressed; + parent_class->clicked = gnt_text_view_clicked; DEBUG; } Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gnttree.c 2006-08-26 12:54:39 UTC (rev 17044) @@ -463,6 +463,34 @@ return g_hash_table_lookup(tree->hash, key); } +static void +action_down(GntTree *tree) +{ + int dist; + GntTreeRow *row = get_next(tree->current); + if (row == NULL) + return; + tree->current = row; + if ((dist = get_distance(tree->current, tree->bottom)) < 0) + gnt_tree_scroll(tree, -dist); + else + redraw_tree(tree); +} + +static void +action_up(GntTree *tree) +{ + int dist; + GntTreeRow *row = get_prev(tree->current); + if (!row) + return; + tree->current = row; + if ((dist = get_distance(tree->current, tree->top)) > 0) + gnt_tree_scroll(tree, -dist); + else + redraw_tree(tree); +} + static gboolean gnt_tree_key_pressed(GntWidget *widget, const char *text) { @@ -473,22 +501,13 @@ if (text[0] == 27) { - if (strcmp(text+1, GNT_KEY_DOWN) == 0 && (row = get_next(tree->current)) != NULL) + if (strcmp(text+1, GNT_KEY_DOWN) == 0) { - tree->current = row; - if ((dist = get_distance(tree->current, tree->bottom)) < 0) - gnt_tree_scroll(tree, -dist); - else - redraw_tree(tree); + action_down(tree); } - else if (strcmp(text+1, GNT_KEY_UP) == 0 && (row = get_prev(tree->current)) != NULL) + else if (strcmp(text+1, GNT_KEY_UP) == 0) { - tree->current = row; - - if ((dist = get_distance(tree->current, tree->top)) > 0) - gnt_tree_scroll(tree, -dist); - else - redraw_tree(tree); + action_up(tree); } else if (strcmp(text+1, GNT_KEY_PGDOWN) == 0) { @@ -592,6 +611,39 @@ g_free(tree->columns); } +static gboolean +gnt_tree_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) +{ + if (event == GNT_MOUSE_SCROLL_UP) { + action_up(GNT_TREE(widget)); + } else if (event == GNT_MOUSE_SCROLL_DOWN) { + action_down(GNT_TREE(widget)); + } else if (event == GNT_LEFT_MOUSE_DOWN) { + GntTreeRow *row; + GntTree *tree = GNT_TREE(widget); + int pos = 1; + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) + pos = 0; + if (tree->show_title) + pos += 2; + pos = y - widget->priv.y - pos; + row = get_next_n(tree->top, pos); + if (row && tree->current != row) { + GntTreeRow *old = tree->current; + tree->current = row; + redraw_tree(tree); + tree_selection_changed(tree, old, tree->current); + } else if (row == tree->current && row->choice) { + row->isselected = !row->isselected; + g_signal_emit(tree, signals[SIG_TOGGLED], 0, row->key); + redraw_tree(tree); + } + } else { + return FALSE; + } + return TRUE; +} + static void gnt_tree_class_init(GntTreeClass *klass) { @@ -601,6 +653,7 @@ parent_class->map = gnt_tree_map; parent_class->size_request = gnt_tree_size_request; parent_class->key_pressed = gnt_tree_key_pressed; + parent_class->clicked = gnt_tree_clicked; signals[SIG_SELECTION_CHANGED] = g_signal_new("selection-changed", Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gntwidget.c 2006-08-26 12:54:39 UTC (rev 17044) @@ -19,6 +19,7 @@ SIG_CONFIRM_SIZE, SIG_SIZE_CHANGED, SIG_POSITION, + SIG_CLICKED, SIGS }; @@ -116,6 +117,7 @@ klass->key_pressed = NULL; klass->activate = NULL; + klass->clicked = NULL; signals[SIG_DESTROY] = g_signal_new("destroy", @@ -214,6 +216,15 @@ gnt_closure_marshal_BOOLEAN__STRING, G_TYPE_BOOLEAN, 1, G_TYPE_STRING); + signals[SIG_CLICKED] = + g_signal_new("clicked", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GntWidgetClass, clicked), + gnt_boolean_handled_accumulator, NULL, + gnt_closure_marshal_BOOLEAN__INT_INT_INT, + G_TYPE_BOOLEAN, 3, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); + DEBUG; } @@ -375,6 +386,14 @@ return ret; } +gboolean +gnt_widget_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) +{ + gboolean ret; + g_signal_emit(widget, signals[SIG_CLICKED], 0, event, x, y, &ret); + return ret; +} + void gnt_widget_expose(GntWidget *widget, int x, int y, int width, int height) { Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gntwidget.h 2006-08-26 12:54:39 UTC (rev 17044) @@ -45,6 +45,16 @@ GNT_WIDGET_TRANSIENT = 1 << 11, } GntWidgetFlags; +typedef enum _GnMouseEvent +{ + GNT_LEFT_MOUSE_DOWN = 1, + GNT_RIGHT_MOUSE_DOWN, + GNT_MIDDLE_MOUSE_DOWN, + GNT_MOUSE_UP, + GNT_MOUSE_SCROLL_UP, + GNT_MOUSE_SCROLL_DOWN +} GntMouseEvent; + /* XXX: I'll have to ask grim what he's using this for in guifications. */ typedef enum _GnParamFlags { @@ -96,6 +106,7 @@ void (*set_position)(GntWidget *widget, int x, int y); gboolean (*key_pressed)(GntWidget *widget, const char *key); void (*activate)(GntWidget *widget); + gboolean (*clicked)(GntWidget *widget, GntMouseEvent event, int x, int y); void (*gnt_reserved1)(void); void (*gnt_reserved2)(void); @@ -121,6 +132,8 @@ gboolean gnt_widget_key_pressed(GntWidget *widget, const char *keys); +gboolean gnt_widget_clicked(GntWidget *widget, GntMouseEvent event, int x, int y); + gboolean gnt_widget_set_focus(GntWidget *widget, gboolean set); void gnt_widget_activate(GntWidget *widget); Modified: trunk/console/libgnt/gntwm.h =================================================================== --- trunk/console/libgnt/gntwm.h 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/gntwm.h 2006-08-26 12:54:39 UTC (rev 17044) @@ -10,9 +10,31 @@ struct _GntWM { + /* This should return a PANEL for the win */ PANEL *(*new_window)(GntWidget *win); - gboolean (*key_pressed)(const char *key); - gboolean (*mouse_clicked)(void); /* XXX: haven't decided yet */ + + /* This is called when a window is being closed */ + gboolean (*close_window)(GntWidget *win); + + /* This should usually return NULL if the keys were processed by the WM. + * If not, the WM can simply return the original string, which will be + * processed by the default WM. The custom WM can also return a different + * static string for the default WM to process. + */ + const char *(*key_pressed)(const char *key); + + /* Not decided yet */ + gboolean (*mouse_clicked)(void); + + /* Whatever the WM wants to do when a window is given focus */ + void (*give_focus)(GntWidget *widget); + + /* If something needs to be uninited */ void (*gntwm_uninit)(); + + /* List of windows. Although the WM can keep a list of its own for the windows, + * it'd be better if there was a way to share between the 'core' and the WM. + */ + const GList *(*window_list)(); }; Modified: trunk/console/libgnt/wms/Makefile.am =================================================================== --- trunk/console/libgnt/wms/Makefile.am 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/wms/Makefile.am 2006-08-26 12:54:39 UTC (rev 17044) @@ -16,6 +16,8 @@ AM_CPPFLAGS = \ -DDATADIR=\"$(datadir)\" \ -DVERSION=\"$(VERSION)\" \ + -I$(top_srcdir)/libgaim \ + -I$(top_srcdir)/console \ -I$(top_srcdir)/console/libgnt \ $(DEBUG_CFLAGS) \ $(GLIB_CFLAGS) \ Modified: trunk/console/libgnt/wms/s.c =================================================================== --- trunk/console/libgnt/wms/s.c 2006-08-26 11:30:40 UTC (rev 17043) +++ trunk/console/libgnt/wms/s.c 2006-08-26 12:54:39 UTC (rev 17044) @@ -1,8 +1,12 @@ #include "gntbox.h" #include "gntwm.h" +#include "gntblist.h" + #include <string.h> +static GntWM *gwm; + static PANEL * s_new_window(GntWidget *win) { @@ -31,12 +35,14 @@ mvwin(win->window, y, x); gnt_widget_set_size(win, w, h); + gnt_widget_draw(win); } else if (name && strcmp(name, "conversation-window") == 0) { /* Put the conversation windows to the far-right */ x = maxx - w; y = 0; gnt_widget_set_position(win, x, y); mvwin(win->window, y, x); + gnt_widget_draw(win); } else if (!GNT_WIDGET_IS_FLAG_SET(win, GNT_WIDGET_TRANSIENT)) { /* In the middle of the screen */ x = (maxx - w) / 2; @@ -49,8 +55,42 @@ return new_panel(win->window); } +static GntWidget * +find_widget(const char *wname) +{ + const GList *iter = gwm->window_list(); + for (; iter; iter = iter->next) { + GntWidget *widget = iter->data; + const char *name = gnt_widget_get_name(widget); + if (name && strcmp(name, wname) == 0) { + return widget; + } + } + return NULL; +} + +static const char* +s_key_pressed(const char *key) +{ + /* Alt+b to toggle the buddylist */ + if (key[0] == 27 && key[1] == 'b' && key[2] == '\0') { + GntWidget *w = find_widget("buddylist"); + if (w == NULL) { + gg_blist_show(); + w = find_widget("buddylist"); + gwm->give_focus(w); + } else { + gnt_widget_destroy(w); + } + return NULL; + } + return key; +} + void gntwm_init(GntWM *wm) { + gwm = wm; wm->new_window = s_new_window; + wm->key_pressed = s_key_pressed; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-28 05:40:19
|
Revision: 17068 Author: sadrul Date: 2006-08-27 22:39:42 -0700 (Sun, 27 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=17068&view=rev Log Message: ----------- Fix the wm to give focus to the buddylist after you toggle it on with alt+b. Draw a line on the right of the buddylist. this should also show how to add other window-decorations. Draw a [X] at the corner of the windows, clicking which closes the windows. Modified Paths: -------------- trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntwm.h trunk/console/libgnt/wms/s.c Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-27 23:04:55 UTC (rev 17067) +++ trunk/console/libgnt/gntmain.c 2006-08-28 05:39:42 UTC (rev 17068) @@ -77,6 +77,7 @@ { NULL, /* new_window */ NULL, /* close_window */ + NULL, /* window_resized */ NULL, /* key_pressed */ NULL, /* mouse clicked */ bring_on_top, /* give_focus */ @@ -516,12 +517,10 @@ * - bring a window on top if you click on its taskbar * - click on the top-bar of the active window and drag+drop to move a window * - click on a window to bring it to focus + * - allow scrolling in tree/textview on wheel-scroll event + * - click to activate button or select a row in tree * wishlist: * - have a little [X] on the windows, and clicking it will close that window. - * - allow scrolling in tree/textview on wheel-scroll event - * - click to activate button or select a row in tree - * - all these can be fulfilled by adding a "clicked" event for GntWidget - * which will send the (x,y) to the widget. (look at "key_pressed" for hints) */ static gboolean detect_mouse_action(const char *buffer) @@ -536,6 +535,8 @@ static GntWidget *remember = NULL; static int offset = 0; GntMouseEvent event; + GntWidget *widget = NULL; + GList *iter; if (!ordered || buffer[0] != 27) return FALSE; @@ -551,30 +552,19 @@ x -= 33; y -= 33; + for (iter = ordered; iter; iter = iter->next) { + GntWidget *wid = iter->data; + if (x >= wid->priv.x && x < wid->priv.x + wid->priv.width) { + if (y >= wid->priv.y && y < wid->priv.y + wid->priv.height) { + widget = wid; + break; + } + } + } if (strncmp(buffer, "[M ", 3) == 0) { /* left button down */ /* Bring the window you clicked on to front */ /* If you click on the topbar, then you can drag to move the window */ - GList *iter; - for (iter = ordered; iter; iter = iter->next) { - GntWidget *wid = iter->data; - if (x >= wid->priv.x && x < wid->priv.x + wid->priv.width) { - if (y >= wid->priv.y && y < wid->priv.y + wid->priv.height) { - if (iter != ordered) { - GntWidget *w = ordered->data; - ordered = g_list_bring_to_front(ordered, iter->data); - wm.give_focus(ordered->data); - gnt_widget_set_focus(w, FALSE); - } - if (y == wid->priv.y) { - offset = x - wid->priv.x; - remember = wid; - button = MOUSE_LEFT; - } - break; - } - } - } event = GNT_LEFT_MOUSE_DOWN; } else if (strncmp(buffer, "[M\"", 3) == 0) { /* right button down */ @@ -590,7 +580,28 @@ event = GNT_MOUSE_SCROLL_DOWN; } else if (strncmp(buffer, "[M#", 3) == 0) { /* button up */ + event = GNT_MOUSE_UP; + } else + return FALSE; + + if (wm.mouse_clicked && wm.mouse_clicked(event, x, y, widget)) + return TRUE; + + if (event == GNT_LEFT_MOUSE_DOWN && widget) { + if (widget != ordered->data) { + GntWidget *w = ordered->data; + ordered = g_list_bring_to_front(ordered, widget); + wm.give_focus(ordered->data); + gnt_widget_set_focus(w, FALSE); + } + if (y == widget->priv.y) { + offset = x - widget->priv.x; + remember = widget; + button = MOUSE_LEFT; + } + } else if (event == GNT_MOUSE_UP) { if (button == MOUSE_NONE && y == getmaxy(stdscr) - 1) { + /* Clicked on the taskbar */ int n = g_list_length(focus_list); if (n) { int width = getmaxx(stdscr) / n; @@ -606,9 +617,7 @@ button = MOUSE_NONE; remember = NULL; offset = 0; - event = GNT_MOUSE_UP; - } else - return FALSE; + } gnt_widget_clicked(ordered->data, event, x, y); return FALSE; /* XXX: this should be TRUE */ @@ -1141,7 +1150,10 @@ hide_panel(node->panel); gnt_widget_set_size(widget, width, height); gnt_widget_draw(widget); - replace_panel(node->panel, widget->window); + if (wm.window_resized) + node->panel = wm.window_resized(node->panel, widget); + else + replace_panel(node->panel, widget->window); show_panel(node->panel); update_screen(NULL); } Modified: trunk/console/libgnt/gntwm.h =================================================================== --- trunk/console/libgnt/gntwm.h 2006-08-27 23:04:55 UTC (rev 17067) +++ trunk/console/libgnt/gntwm.h 2006-08-28 05:39:42 UTC (rev 17068) @@ -16,6 +16,10 @@ /* This is called when a window is being closed */ gboolean (*close_window)(GntWidget *win); + /* Can del_panel the old panel and return a new_panel. + * Otherwise, this should at least do a replace_panel. */ + PANEL *(*window_resized)(PANEL *pan, GntWidget *win); + /* This should usually return NULL if the keys were processed by the WM. * If not, the WM can simply return the original string, which will be * processed by the default WM. The custom WM can also return a different @@ -23,8 +27,7 @@ */ const char *(*key_pressed)(const char *key); - /* Not decided yet */ - gboolean (*mouse_clicked)(void); + gboolean (*mouse_clicked)(GntMouseEvent event, int x, int y, GntWidget *widget); /* Whatever the WM wants to do when a window is given focus */ void (*give_focus)(GntWidget *widget); Modified: trunk/console/libgnt/wms/s.c =================================================================== --- trunk/console/libgnt/wms/s.c 2006-08-27 23:04:55 UTC (rev 17067) +++ trunk/console/libgnt/wms/s.c 2006-08-28 05:39:42 UTC (rev 17068) @@ -7,7 +7,44 @@ static GntWM *gwm; +static void +envelope_buddylist(GntWidget *win) +{ + int w, h; + gnt_widget_get_size(win, &w, &h); + wresize(win->window, h, w + 1); + mvwvline(win->window, 0, w, ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL), h); +} + +static void +envelope_normal_window(GntWidget *win) +{ + int w, h; + + if (GNT_WIDGET_IS_FLAG_SET(win, GNT_WIDGET_NO_BORDER)) + return; + + gnt_widget_get_size(win, &w, &h); + wbkgdset(win->window, ' ' | COLOR_PAIR(GNT_COLOR_NORMAL)); + mvwprintw(win->window, 0, w - 4, "[X]"); +} + static PANEL * +s_resize_window(PANEL *panel, GntWidget *win) +{ + const char *name; + + name = gnt_widget_get_name(win); + if (name && strcmp(name, "buddylist") == 0) { + envelope_buddylist(win); + } else { + envelope_normal_window(win); + } + replace_panel(panel, win->window); + return panel; +} + +static PANEL * s_new_window(GntWidget *win) { int x, y, w, h; @@ -36,6 +73,7 @@ gnt_widget_set_size(win, w, h); gnt_widget_draw(win); + envelope_buddylist(win); } else if (name && strcmp(name, "conversation-window") == 0) { /* Put the conversation windows to the far-right */ x = maxx - w; @@ -43,6 +81,7 @@ gnt_widget_set_position(win, x, y); mvwin(win->window, y, x); gnt_widget_draw(win); + envelope_normal_window(win); } else if (!GNT_WIDGET_IS_FLAG_SET(win, GNT_WIDGET_TRANSIENT)) { /* In the middle of the screen */ x = (maxx - w) / 2; @@ -50,6 +89,7 @@ gnt_widget_set_position(win, x, y); mvwin(win->window, y, x); + envelope_normal_window(win); } return new_panel(win->window); @@ -69,6 +109,13 @@ return NULL; } +static gboolean +give_the_darned_focus(gpointer w) +{ + gwm->give_focus(w); + return FALSE; +} + static const char* s_key_pressed(const char *key) { @@ -78,7 +125,7 @@ if (w == NULL) { gg_blist_show(); w = find_widget("buddylist"); - gwm->give_focus(w); + g_timeout_add(0, give_the_darned_focus, w); } else { gnt_widget_destroy(w); } @@ -87,10 +134,34 @@ return key; } +static gboolean +s_mouse_clicked(GntMouseEvent event, int cx, int cy, GntWidget *widget) +{ + int x, y, w, h; + + if (!widget) + return FALSE; /* This might a place to bring up a context menu */ + + if (event != GNT_LEFT_MOUSE_DOWN || + GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) + return FALSE; /* For now, just the left-button to close a window */ + + gnt_widget_get_position(widget, &x, &y); + gnt_widget_get_size(widget, &w, &h); + + if (cy == y && cx == x + w - 3) { + gnt_widget_destroy(widget); + return TRUE; + } + return FALSE; +} + void gntwm_init(GntWM *wm) { gwm = wm; wm->new_window = s_new_window; + wm->window_resized = s_resize_window; wm->key_pressed = s_key_pressed; + wm->mouse_clicked = s_mouse_clicked; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |