diff options
Diffstat (limited to 'src/perl/textui/TextUI.xs')
-rw-r--r-- | src/perl/textui/TextUI.xs | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/src/perl/textui/TextUI.xs b/src/perl/textui/TextUI.xs new file mode 100644 index 0000000..0ebcc7a --- /dev/null +++ b/src/perl/textui/TextUI.xs @@ -0,0 +1,318 @@ +#define PERL_NO_GET_CONTEXT +#include "module.h" +#include "wrapper_buffer_line.h" + +void perl_statusbar_init(void); +void perl_statusbar_deinit(void); + +static int initialized = FALSE; + +static SV *buffer_line_bless(TEXT_BUFFER_REC *buffer, LINE_REC *line) +{ + return perl_buffer_line_bless(perl_wrap_buffer_line(buffer, line)); +} + +static void perl_main_window_fill_hash(HV *hv, MAIN_WINDOW_REC *window) +{ + (void) hv_store(hv, "active", 6, plain_bless(window->active, "Irssi::UI::Window"), 0); + + (void) hv_store(hv, "first_line", 10, newSViv(window->first_line), 0); + (void) hv_store(hv, "last_line", 9, newSViv(window->last_line), 0); + (void) hv_store(hv, "width", 5, newSViv(window->width), 0); + (void) hv_store(hv, "height", 6, newSViv(window->height), 0); + + (void) hv_store(hv, "statusbar_lines", 15, newSViv(window->statusbar_lines), 0); +} + +static void perl_text_buffer_fill_hash(HV *hv, TEXT_BUFFER_REC *buffer) +{ + (void) hv_store(hv, "first_line", 10, buffer_line_bless(buffer, buffer->first_line), 0); + (void) hv_store(hv, "lines_count", 11, newSViv(buffer->lines_count), 0); + (void) hv_store(hv, "cur_line", 8, buffer_line_bless(buffer, buffer->cur_line), 0); + (void) hv_store(hv, "last_eol", 8, newSViv(buffer->last_eol), 0); +} + +static void perl_text_buffer_view_fill_hash(HV *hv, TEXT_BUFFER_VIEW_REC *view) +{ + (void) hv_store(hv, "buffer", 6, plain_bless(view->buffer, "Irssi::TextUI::TextBuffer"), 0); + (void) hv_store(hv, "width", 5, newSViv(view->width), 0); + (void) hv_store(hv, "height", 6, newSViv(view->height), 0); + + (void) hv_store(hv, "default_indent", 14, newSViv(view->default_indent), 0); + (void) hv_store(hv, "longword_noindent", 17, newSViv(view->longword_noindent), 0); + (void) hv_store(hv, "scroll", 6, newSViv(view->scroll), 0); + + (void) hv_store(hv, "ypos", 4, newSViv(view->ypos), 0); + + (void) hv_store(hv, "startline", 9, buffer_line_bless(view->buffer, view->startline), 0); + (void) hv_store(hv, "subline", 7, newSViv(view->subline), 0); + (void) hv_store(hv, "hidden_level", 12, newSViv(view->hidden_level), 0); + + (void) hv_store(hv, "bottom_startline", 16, + buffer_line_bless(view->buffer, view->bottom_startline), 0); + (void) hv_store(hv, "bottom_subline", 14, newSViv(view->bottom_subline), 0); + + (void) hv_store(hv, "empty_linecount", 15, newSViv(view->empty_linecount), 0); + (void) hv_store(hv, "bottom", 6, newSViv(view->bottom), 0); +} + +static void perl_line_fill_hash(HV *hv, struct Buffer_Line_Wrapper *line) +{ + (void) hv_store(hv, "info", 4, plain_bless(&Line(line)->info, "Irssi::TextUI::LineInfo"), + 0); +} + +static void perl_line_cache_fill_hash(HV *hv, LINE_CACHE_REC *cache) +{ + (void) hv_store(hv, "last_access", 11, newSViv(cache->last_access), 0); + (void) hv_store(hv, "count", 5, newSViv(cache->count), 0); + /*LINE_CACHE_SUB_REC lines[1];*/ +} + +static void perl_line_info_fill_hash(HV *hv, LINE_INFO_REC *info) +{ + (void) hv_store(hv, "level", 5, newSViv(info->level), 0); + (void) hv_store(hv, "time", 4, newSViv(info->time), 0); +} + +static void perl_statusbar_item_fill_hash(HV *hv, SBAR_ITEM_REC *item) +{ + (void) hv_store(hv, "min_size", 8, newSViv(item->min_size), 0); + (void) hv_store(hv, "max_size", 8, newSViv(item->max_size), 0); + (void) hv_store(hv, "xpos", 4, newSViv(item->xpos), 0); + (void) hv_store(hv, "size", 4, newSViv(item->size), 0); + if (item->bar->parent_window != NULL) + (void) hv_store(hv, "window", 6, plain_bless(item->bar->parent_window->active, "Irssi::UI::Window"), 0); +} + +static SV *perl_line_signal_arg_conv(LINE_REC *line, TEXT_BUFFER_VIEW_REC *view, WINDOW_REC *window) +{ + if (view != NULL) + return buffer_line_bless(view->buffer, line); + else if (window != NULL) + return buffer_line_bless(WINDOW_GUI(window)->view->buffer, line); + else + return &PL_sv_undef; +} + +static PLAIN_OBJECT_INIT_REC textui_plains[] = { + { "Irssi::TextUI::MainWindow", (PERL_OBJECT_FUNC) perl_main_window_fill_hash }, + { "Irssi::TextUI::TextBuffer", (PERL_OBJECT_FUNC) perl_text_buffer_fill_hash }, + { "Irssi::TextUI::TextBufferView", (PERL_OBJECT_FUNC) perl_text_buffer_view_fill_hash }, + { "Irssi::TextUI::Line", (PERL_OBJECT_FUNC) perl_line_fill_hash }, + { "Irssi::TextUI::LineCache", (PERL_OBJECT_FUNC) perl_line_cache_fill_hash }, + { "Irssi::TextUI::LineInfo", (PERL_OBJECT_FUNC) perl_line_info_fill_hash }, + { "Irssi::TextUI::StatusbarItem", (PERL_OBJECT_FUNC) perl_statusbar_item_fill_hash }, + + { NULL, NULL } +}; + +MODULE = Irssi::TextUI PACKAGE = Irssi::TextUI + +PROTOTYPES: ENABLE + +void +init() +CODE: + if (initialized) return; + perl_api_version_check("Irssi::TextUI"); + initialized = TRUE; + + irssi_add_plains(textui_plains); + irssi_add_signal_arg_conv("Irssi::TextUI::Line", + (PERL_BLESS_FUNC) perl_line_signal_arg_conv); + perl_statusbar_init(); + +void +deinit() +CODE: + if (!initialized) return; + perl_statusbar_deinit(); + initialized = FALSE; + +MODULE = Irssi::TextUI PACKAGE = Irssi + +void +gui_printtext(xpos, ypos, str) + int xpos + int ypos + char *str + +void +gui_input_set(str) + char *str +CODE: + gui_entry_set_text(active_entry, str); + +void +gui_input_set_extent(pos, text) + int pos + char *text +PREINIT: + char *tt; +CODE: + tt = text != NULL ? format_string_expand(text, NULL) : NULL; + gui_entry_set_extent(active_entry, pos, tt); + g_free(tt); + +void +gui_input_set_extents(pos, len, left, right) + int pos + int len + char *left + char *right +PREINIT: + char *tl; + char *tr; +CODE: + tl = left != NULL ? format_string_expand(left, NULL) : NULL; + tr = right != NULL ? format_string_expand(right, NULL) : NULL; + gui_entry_set_extents(active_entry, pos, len, tl, tr); + g_free(tl); + g_free(tr); + +void +gui_input_clear_extents(pos, len = 0) + int pos + int len +CODE: + gui_entry_clear_extents(active_entry, pos, len); + +char * +gui_input_get_extent(pos) + int pos +CODE: + RETVAL = gui_entry_get_extent(active_entry, pos); +OUTPUT: + RETVAL + +void +gui_input_get_text_and_extents() +PREINIT: + GSList *ret, *tmp; +PPCODE: + ret = gui_entry_get_text_and_extents(active_entry); + for (tmp = ret; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(new_pv(tmp->data))); + } + g_slist_free_full(ret, g_free); + +void +gui_input_set_text_and_extents(...) +PREINIT: + GSList *list; + int i; +PPCODE: + list = NULL; + for (i = items; i > 0; i--) { + list = g_slist_prepend(list, SvPV_nolen(ST(i-1))); + } + gui_entry_set_text_and_extents(active_entry, list); + g_slist_free(list); + +int +gui_input_get_pos() +CODE: + RETVAL = gui_entry_get_pos(active_entry); +OUTPUT: + RETVAL + +void +gui_input_set_pos(pos) + int pos +CODE: + gui_entry_set_pos(active_entry, pos); + +int +wcwidth(c) + char *c +CODE: + if (term_type == TERM_TYPE_UTF8) { + unichar chr = g_utf8_get_char_validated((const char *) c, -1); + + if (chr & 0x80000000) { + RETVAL = 1; + } else { + RETVAL = i_wcwidth(chr); + } + } else if (term_type != TERM_TYPE_BIG5 || + c[1] == '\0' || + !is_big5((unsigned char) c[0], (unsigned char) c[1])) { + RETVAL = i_wcwidth((unsigned char) *c); + } else { + RETVAL = 2; + } +OUTPUT: + RETVAL + +MODULE = Irssi::TextUI PACKAGE = Irssi::UI::Window + +void +print_after(window, prev, level, str, time = 0) + Irssi::UI::Window window + Irssi::TextUI::Line prev + int level + char *str + time_t time +PREINIT: + TEXT_DEST_REC dest; + char *text; + char *text2; +CODE: + format_create_dest(&dest, NULL, NULL, level, window); + text = format_string_expand(str, NULL); + text2 = g_strconcat(text, "\n", NULL); + gui_printtext_after_time(&dest, Line(prev), text2, time); + g_free(text); + g_free(text2); + +void +gui_printtext_after(window, prev, level, str, time = 0) + Irssi::UI::Window window + Irssi::TextUI::Line prev + int level + char *str + time_t time +PREINIT: + TEXT_DEST_REC dest; +CODE: + format_create_dest(&dest, NULL, NULL, level, window); + gui_printtext_after_time(&dest, Line(prev), str, time); + +Irssi::TextUI::Line +last_line_insert(window) + Irssi::UI::Window window +CODE: + RETVAL = perl_wrap_buffer_line(WINDOW_GUI(window)->view->buffer, + WINDOW_GUI(window)->insert_after); +OUTPUT: + RETVAL + +MODULE = Irssi::TextUI PACKAGE = Irssi::Server + +void +gui_printtext_after(server, target, prev, level, str, time = 0) + Irssi::Server server + char *target + Irssi::TextUI::Line prev + int level + char *str + time_t time +PREINIT: + TEXT_DEST_REC dest; +CODE: + format_create_dest(&dest, server, target, level, NULL); + gui_printtext_after_time(&dest, Line(prev), str, time); + +BOOT: + irssi_boot(TextUI__Statusbar); + irssi_boot(TextUI__TextBuffer); + irssi_boot(TextUI__TextBufferView); + +MODULE = Irssi::TextUI PACKAGE = Irssi + +void +term_refresh_freeze() + +void +term_refresh_thaw() |