Mercurial > pidgin
diff console/libgnt/gntmain.c @ 13850:0e1e59770cb0
[gaim-migrate @ 16308]
This is my first commit here. So don't yell at me if things get borked.
Also, I haven't looked at the auto-thingies yet. So don't puke at the
Makefiles.
Files in console/libgnt/ are for the 'Gaim/GObjectified Ncurses Toolkit'
library. Files in console/ uses libgaim and libgnt. Currently, only the
buddylist-ui is 'functional', ie. the buddy-list updates when someone
logs on or logs off. It still needs a lot of work.
committer: Tailor Script <tailor@pidgin.im>
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Thu, 22 Jun 2006 08:33:54 +0000 |
parents | |
children | c1e3f7c75c3f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/console/libgnt/gntmain.c Thu Jun 22 08:33:54 2006 +0000 @@ -0,0 +1,111 @@ +#include "gnt.h" +#include "gntkeys.h" +#include "gntcolors.h" +#include <stdio.h> +#include <stdlib.h> +#include <locale.h> + +static GList *focus_list; +static int max_x; +static int max_y; + +void gnt_screen_take_focus(GntWidget *widget) +{ + focus_list = g_list_prepend(focus_list, widget); +} + +void gnt_screen_remove_widget(GntWidget *widget) +{ + focus_list = g_list_remove(focus_list, widget); + if (focus_list) + gnt_widget_draw(focus_list->data); +} + +static gboolean +io_invoke(GIOChannel *source, GIOCondition cond, gpointer null) +{ + char buffer[256]; + + int rd = read(0, buffer, sizeof(buffer) - 1); + if (rd < 0) + { + endwin(); + printf("ERROR!\n"); + exit(1); + } + else if (rd == 0) + { + endwin(); + printf("EOF\n"); + exit(1); + } + + buffer[rd] = 0; + + if (focus_list) + { + gboolean ret = FALSE; + /*g_signal_emit_by_name(focus_list->data, "key_pressed", buffer, &ret);*/ + ret = gnt_widget_key_pressed(focus_list->data, buffer); + } + + if (buffer[0] == 27) + { + /* Some special key has been pressed */ + if (strcmp(buffer+1, GNT_KEY_POPUP) == 0) + { + /*printf("popup\n");*/ + } + else + { + /*printf("Unknown: %s\n", buffer+1);*/ + } + } + else + { + if (buffer[0] == 'q') + { + endwin(); + exit(1); + } + /*printf("%s\n", buffer);*/ + } + refresh(); + + return TRUE; +} + +void gnt_init() +{ + GIOChannel *channel = g_io_channel_unix_new(0); + + g_io_channel_set_encoding(channel, NULL, NULL); + g_io_channel_set_buffered(channel, FALSE); + g_io_channel_set_flags(channel, G_IO_FLAG_NONBLOCK, NULL ); + + int result = g_io_add_watch(channel, + (G_IO_IN | G_IO_HUP | G_IO_ERR), + io_invoke, NULL); + + setlocale(LC_ALL, ""); + initscr(); + start_color(); + /*use_default_colors();*/ + gnt_init_colors(); + + max_x = getmaxx(stdscr); + max_y = getmaxy(stdscr); + + wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); + noecho(); + refresh(); + mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL); + g_type_init(); +} + +void gnt_main() +{ + GMainLoop *loop = g_main_new(FALSE); + g_main_run(loop); +} +