diff options
48 files changed, 430 insertions, 126 deletions
diff --git a/src/fe-text/statusbar-items.c b/src/fe-text/statusbar-items.c index 3cb496c9..7969c5ea 100644 --- a/src/fe-text/statusbar-items.c +++ b/src/fe-text/statusbar-items.c @@ -33,7 +33,6 @@ #define MAX_LAG_UNKNOWN_TIME 30 /* activity */ -static GSList *activity_items; static GList *activity_list; static GHashTable *input_entries; @@ -195,7 +194,7 @@ static void sig_statusbar_activity_hilight(WINDOW_REC *window, gpointer oldlevel activity_list = g_list_remove(activity_list, window); if (window->data_level != 0) activity_list = g_list_prepend(activity_list, window); - statusbar_items_redraw(activity_items); + statusbar_items_redraw("act"); return; } @@ -204,12 +203,12 @@ static void sig_statusbar_activity_hilight(WINDOW_REC *window, gpointer oldlevel if (window->data_level == 0) { /* remove from activity list */ activity_list = g_list_remove(activity_list, window); - statusbar_items_redraw(activity_items); + statusbar_items_redraw("act"); } else if (window->data_level != GPOINTER_TO_INT(oldlevel) || window->hilight_color != 0) { /* different level as last time (or maybe different hilight color?), just redraw it. */ - statusbar_items_redraw(activity_items); + statusbar_items_redraw("act"); } return; } @@ -231,7 +230,7 @@ static void sig_statusbar_activity_hilight(WINDOW_REC *window, gpointer oldlevel if (tmp == NULL) activity_list = g_list_append(activity_list, window); - statusbar_items_redraw(activity_items); + statusbar_items_redraw("act"); } static void sig_statusbar_activity_window_destroyed(WINDOW_REC *window) @@ -240,12 +239,12 @@ static void sig_statusbar_activity_window_destroyed(WINDOW_REC *window) if (g_list_find(activity_list, window) != NULL) activity_list = g_list_remove(activity_list, window); - statusbar_items_redraw(activity_items); + statusbar_items_redraw("act"); } static void sig_statusbar_activity_updated(void) { - statusbar_items_redraw(activity_items); + statusbar_items_redraw("act"); } static void item_more(SBAR_ITEM_REC *item, int get_size_only) @@ -276,24 +275,14 @@ static void item_input(SBAR_ITEM_REC *item, int get_size_only) } } -static void sig_statusbar_item_created(SBAR_ITEM_REC *item) -{ - if (item->func == item_act) - activity_items = g_slist_prepend(activity_items, item); -} - static void sig_statusbar_item_destroyed(SBAR_ITEM_REC *item) { - if (item->func == item_act) - activity_items = g_slist_remove(activity_items, item); - else { - GUI_ENTRY_REC *rec; - - rec = g_hash_table_lookup(input_entries, item); - if (rec != NULL) { - gui_entry_destroy(rec); - g_hash_table_remove(input_entries, item); - } + GUI_ENTRY_REC *rec; + + rec = g_hash_table_lookup(input_entries, item); + if (rec != NULL) { + gui_entry_destroy(rec); + g_hash_table_remove(input_entries, item); } } @@ -319,7 +308,6 @@ void statusbar_items_init(void) signal_add("window destroyed", (SIGNAL_FUNC) sig_statusbar_activity_window_destroyed); signal_add("window refnum changed", (SIGNAL_FUNC) sig_statusbar_activity_updated); - signal_add("statusbar item created", (SIGNAL_FUNC) sig_statusbar_item_created); signal_add("statusbar item destroyed", (SIGNAL_FUNC) sig_statusbar_item_destroyed); } @@ -334,6 +322,5 @@ void statusbar_items_deinit(void) g_list_free(activity_list); activity_list = NULL; - signal_remove("statusbar item created", (SIGNAL_FUNC) sig_statusbar_item_created); signal_remove("statusbar item destroyed", (SIGNAL_FUNC) sig_statusbar_item_destroyed); } diff --git a/src/fe-text/statusbar.c b/src/fe-text/statusbar.c index f8f42b0d..ed9a8ea1 100644 --- a/src/fe-text/statusbar.c +++ b/src/fe-text/statusbar.c @@ -39,10 +39,11 @@ STATUSBAR_GROUP_REC *active_statusbar_group; sbar_item_funcs: char *name => STATUSBAR_FUNC func sbar_signal_items: int signal_id => GSList *(SBAR_ITEM_REC *items) sbar_item_signals: SBAR_ITEM_REC *item => GSList *(int *signal_ids) - + named_sbar_items: const char *name => GSList *(SBAR_ITEM_REC *items) */ static GHashTable *sbar_item_defs, *sbar_item_funcs; static GHashTable *sbar_signal_items, *sbar_item_signals; +static GHashTable *named_sbar_items; void statusbar_item_register(const char *name, const char *value, STATUSBAR_FUNC func) @@ -322,6 +323,12 @@ void statusbar_item_redraw(SBAR_ITEM_REC *item) active_win = old_active_win; } +void statusbar_items_redraw(const char *name) +{ + g_slist_foreach(g_hash_table_lookup(named_sbar_items, name), + (GFunc) statusbar_item_redraw, NULL); +} + static void statusbars_recalc_ypos(STATUSBAR_REC *bar) { GSList *tmp, *bar_group; @@ -532,6 +539,32 @@ void statusbar_destroy(STATUSBAR_REC *bar) g_free(bar); } +void statusbar_recreate_items(STATUSBAR_REC *bar) +{ + GSList *tmp; + + /* destroy */ + while (bar->items != NULL) + statusbar_item_destroy(bar->items->data); + + /* create */ + for (tmp = bar->config->items; tmp != NULL; tmp = tmp->next) { + SBAR_ITEM_CONFIG_REC *rec = tmp->data; + + statusbar_item_create(bar, rec); + } + + statusbar_redraw(bar); +} + +void statusbars_recreate_items(void) +{ + if (active_statusbar_group != NULL) { + g_slist_foreach(active_statusbar_group->bars, + (GFunc) statusbar_recreate_items, NULL); + } +} + STATUSBAR_REC *statusbar_find(STATUSBAR_GROUP_REC *group, const char *name, MAIN_WINDOW_REC *window) { @@ -782,6 +815,7 @@ SBAR_ITEM_REC *statusbar_item_create(STATUSBAR_REC *bar, SBAR_ITEM_CONFIG_REC *config) { SBAR_ITEM_REC *rec; + GSList *items; g_return_val_if_fail(bar != NULL, NULL); g_return_val_if_fail(config != NULL, NULL); @@ -797,6 +831,10 @@ SBAR_ITEM_REC *statusbar_item_create(STATUSBAR_REC *bar, rec->func = statusbar_item_default_func; statusbar_item_default_signals(rec); + items = g_hash_table_lookup(named_sbar_items, config->name); + items = g_slist_append(items, rec); + g_hash_table_insert(named_sbar_items, config->name, items); + signal_emit("statusbar item created", 1, rec); return rec; } @@ -834,6 +872,14 @@ void statusbar_item_destroy(SBAR_ITEM_REC *item) g_return_if_fail(item != NULL); item->bar->items = g_slist_remove(item->bar->items, item); + + list = g_hash_table_lookup(named_sbar_items, item->config->name); + list = g_slist_remove(list, item); + if (list == NULL) + g_hash_table_remove(named_sbar_items, item->config->name); + else + g_hash_table_insert(named_sbar_items, item->config->name, list); + signal_emit("statusbar item destroyed", 1, item); list = g_hash_table_lookup(sbar_item_signals, item); @@ -943,13 +989,15 @@ void statusbar_init(void) statusbar_groups = NULL; active_statusbar_group = NULL; sbar_item_defs = g_hash_table_new((GHashFunc) g_str_hash, - (GCompareFunc) g_str_equal); + (GCompareFunc) g_str_equal); sbar_item_funcs = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal); sbar_signal_items = g_hash_table_new((GHashFunc) g_direct_hash, (GCompareFunc) g_direct_equal); sbar_item_signals = g_hash_table_new((GHashFunc) g_direct_hash, (GCompareFunc) g_direct_equal); + named_sbar_items = g_hash_table_new((GHashFunc) g_str_hash, + (GCompareFunc) g_str_equal); signal_add("terminal resized", (SIGNAL_FUNC) sig_terminal_resized); signal_add("mainwindow resized", (SIGNAL_FUNC) sig_mainwindow_resized); @@ -980,6 +1028,7 @@ void statusbar_deinit(void) g_hash_table_foreach(sbar_item_signals, (GHFunc) statusbar_item_signal_destroy, NULL); g_hash_table_destroy(sbar_item_signals); + g_hash_table_destroy(named_sbar_items); signal_remove("terminal resized", (SIGNAL_FUNC) sig_terminal_resized); signal_remove("mainwindow resized", (SIGNAL_FUNC) sig_mainwindow_resized); diff --git a/src/fe-text/statusbar.h b/src/fe-text/statusbar.h index 4a1865db..08e9ba80 100644 --- a/src/fe-text/statusbar.h +++ b/src/fe-text/statusbar.h @@ -100,8 +100,10 @@ void statusbar_item_default_handler(SBAR_ITEM_REC *item, int get_size_only, /* redraw statusbar, NULL = all */ void statusbar_redraw(STATUSBAR_REC *bar); void statusbar_item_redraw(SBAR_ITEM_REC *item); -#define statusbar_items_redraw(list) \ - g_slist_foreach(list, (GFunc) statusbar_item_redraw, NULL); +void statusbar_items_redraw(const char *name); + +void statusbar_recreate_items(STATUSBAR_REC *bar); +void statusbars_recreate_items(void); void statusbar_init(void); void statusbar_deinit(void); diff --git a/src/perl/Makefile.am b/src/perl/Makefile.am index 6e345126..8bfef386 100644 --- a/src/perl/Makefile.am +++ b/src/perl/Makefile.am @@ -90,9 +90,9 @@ IRC_SOURCES = \ irc/Irc.xs \ irc/Irc.pm \ irc/Dcc.xs \ - irc/IrcChannel.xs \ - irc/IrcQuery.xs \ - irc/IrcServer.xs \ + irc/Channel.xs \ + irc/Query.xs \ + irc/Server.xs \ irc/Modes.xs \ irc/Netsplit.xs \ irc/Notifylist.xs \ @@ -114,6 +114,7 @@ TEXTUI_SOURCES = \ textui/TextUI.pm \ textui/TextBuffer.xs \ textui/TextBufferView.xs \ + textui/Statusbar.xs \ textui/Makefile.PL.in \ textui/typemap \ textui/module.h diff --git a/src/perl/common/.cvsignore b/src/perl/common/.cvsignore index d424b077..e9658495 100644 --- a/src/perl/common/.cvsignore +++ b/src/perl/common/.cvsignore @@ -1,7 +1,7 @@ Makefile Makefile.PL -Irssi.c Irssi.bs +*.c *.o pm_to_blib blib diff --git a/src/perl/common/Channel.xs b/src/perl/common/Channel.xs index cfcf72a2..4763e708 100644 --- a/src/perl/common/Channel.xs +++ b/src/perl/common/Channel.xs @@ -1,4 +1,7 @@ -MODULE = Irssi PACKAGE = Irssi +#include "module.h" + +MODULE = Irssi::Channel PACKAGE = Irssi +PROTOTYPES: ENABLE void channels() @@ -18,7 +21,7 @@ OUTPUT: RETVAL #******************************* -MODULE = Irssi PACKAGE = Irssi::Server +MODULE = Irssi::Channel PACKAGE = Irssi::Server #******************************* void @@ -68,7 +71,7 @@ PPCODE: g_slist_free(list); #******************************* -MODULE = Irssi PACKAGE = Irssi::Channel PREFIX = channel_ +MODULE = Irssi::Channel PACKAGE = Irssi::Channel PREFIX = channel_ #******************************* void diff --git a/src/perl/common/Core.xs b/src/perl/common/Core.xs index 4378c5c6..5439efbf 100644 --- a/src/perl/common/Core.xs +++ b/src/perl/common/Core.xs @@ -1,4 +1,7 @@ -MODULE = Irssi PACKAGE = Irssi +#include "module.h" + +MODULE = Irssi::Core PACKAGE = Irssi +PROTOTYPES: ENABLE void signal_emit(signal, ...) @@ -374,7 +377,7 @@ OUTPUT: RETVAL #******************************* -MODULE = Irssi PACKAGE = Irssi::Server +MODULE = Irssi::Core PACKAGE = Irssi::Server #******************************* char * @@ -389,7 +392,7 @@ OUTPUT: RETVAL #******************************* -MODULE = Irssi PACKAGE = Irssi::Windowitem +MODULE = Irssi::Core PACKAGE = Irssi::Windowitem #******************************* char * diff --git a/src/perl/common/Ignore.xs b/src/perl/common/Ignore.xs index 30b8590c..2a053b16 100644 --- a/src/perl/common/Ignore.xs +++ b/src/perl/common/Ignore.xs @@ -1,4 +1,7 @@ -MODULE = Irssi PACKAGE = Irssi +#include "module.h" + +MODULE = Irssi::Ignore PACKAGE = Irssi +PROTOTYPES: ENABLE void ignores() @@ -22,7 +25,7 @@ OUTPUT: RETVAL #******************************* -MODULE = Irssi PACKAGE = Irssi::Server +MODULE = Irssi::Ignore PACKAGE = Irssi::Server #******************************* int @@ -35,7 +38,7 @@ ignore_check(server, nick, host, channel, text, level) int level #******************************* -MODULE = Irssi PACKAGE = Irssi::Ignore PREFIX = ignore_ +MODULE = Irssi::Ignore PACKAGE = Irssi::Ignore PREFIX = ignore_ #******************************* void diff --git a/src/perl/common/Irssi.pm b/src/perl/common/Irssi.pm index 17d463c4..c082c0c0 100644 --- a/src/perl/common/Irssi.pm +++ b/src/perl/common/Irssi.pm @@ -7,7 +7,7 @@ package Irssi; use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); -$VERSION = "0.8"; +$VERSION = "0.9"; require Exporter; require DynaLoader; diff --git a/src/perl/common/Irssi.xs b/src/perl/common/Irssi.xs index 59e4ebe6..5e28bed8 100644 --- a/src/perl/common/Irssi.xs +++ b/src/perl/common/Irssi.xs @@ -9,12 +9,17 @@ init() CODE: perl_api_version_check("Irssi"); -INCLUDE: Channel.xs -INCLUDE: Core.xs -INCLUDE: Ignore.xs -INCLUDE: Log.xs -INCLUDE: Masks.xs -INCLUDE: Query.xs -INCLUDE: Rawlog.xs -INCLUDE: Server.xs -INCLUDE: Settings.xs +void +deinit() +CODE: + +BOOT: + irssi_boot(Channel); + irssi_boot(Core); + irssi_boot(Ignore); + irssi_boot(Log); + irssi_boot(Masks); + irssi_boot(Query); + irssi_boot(Rawlog); + irssi_boot(Server); + irssi_boot(Settings); diff --git a/src/perl/common/Log.xs b/src/perl/common/Log.xs index 4879aef9..c87ee45b 100644 --- a/src/perl/common/Log.xs +++ b/src/perl/common/Log.xs @@ -1,4 +1,7 @@ -MODULE = Irssi PACKAGE = Irssi +#include "module.h" + +MODULE = Irssi::Log PACKAGE = Irssi +PROTOTYPES: ENABLE void logs() @@ -19,7 +22,7 @@ log_find(fname) char *fname #******************************* -MODULE = Irssi PACKAGE = Irssi::Log PREFIX = log_ +MODULE = Irssi::Log PACKAGE = Irssi::Log PREFIX = log_ #******************************* void diff --git a/src/perl/common/Makefile.PL.in b/src/perl/common/Makefile.PL.in index 76887f64..4e545e7c 100644 --- a/src/perl/common/Makefile.PL.in +++ b/src/perl/common/Makefile.PL.in @@ -2,5 +2,6 @@ use ExtUtils::MakeMaker; WriteMakefile('NAME' => 'Irssi', 'LIBS' => '', + 'OBJECT' => '$(O_FILES)', 'INC' => '-I../../.. -I@top_srcdir@ -I@top_srcdir@/src -I@top_srcdir@/src/core @GLIB_CFLAGS@', 'VERSION_FROM' => '@srcdir@/Irssi.pm'); diff --git a/src/perl/common/Masks.xs b/src/perl/common/Masks.xs index d27e32f3..1ea13969 100644 --- a/src/perl/common/Masks.xs +++ b/src/perl/common/Masks.xs @@ -1,4 +1,7 @@ -MODULE = Irssi PACKAGE = Irssi +#include "module.h" + +MODULE = Irssi::Masks PACKAGE = Irssi +PROTOTYPES: ENABLE int mask_match(mask, nick, user, host) @@ -32,7 +35,7 @@ OUTPUT: RETVAL #******************************* -MODULE = Irssi PACKAGE = Irssi::Server +MODULE = Irssi::Masks PACKAGE = Irssi::Server #******************************* int diff --git a/src/perl/common/Query.xs b/src/perl/common/Query.xs index 191b334a..b0766b91 100644 --- a/src/perl/common/Query.xs +++ b/src/perl/common/Query.xs @@ -1,4 +1,7 @@ -MODULE = Irssi PACKAGE = Irssi +#include "module.h" + +MODULE = Irssi::Query PACKAGE = Irssi +PROTOTYPES: ENABLE void queries() @@ -20,7 +23,7 @@ OUTPUT: RETVAL #******************************* -MODULE = Irssi PACKAGE = Irssi::Server +MODULE = Irssi::Query PACKAGE = Irssi::Server #******************************* void @@ -41,7 +44,7 @@ query_find(server, nick) char *nick #******************************* -MODULE = Irssi PACKAGE = Irssi::Query PREFIX = query_ +MODULE = Irssi::Query PACKAGE = Irssi::Query PREFIX = query_ #******************************* void diff --git a/src/perl/common/Rawlog.xs b/src/perl/common/Rawlog.xs index 115b08cb..dd95ce50 100644 --- a/src/perl/common/Rawlog.xs +++ b/src/perl/common/Rawlog.xs @@ -1,4 +1,7 @@ -MODULE = Irssi PACKAGE = Irssi +#include "module.h" + +MODULE = Irssi::Rawlog PACKAGE = Irssi +PROTOTYPES: ENABLE void rawlog_set_size(lines) @@ -8,7 +11,7 @@ Irssi::Rawlog rawlog_create() #******************************* -MODULE = Irssi PACKAGE = Irssi::Rawlog PREFIX = rawlog_ +MODULE = Irssi::Rawlog PACKAGE = Irssi::Rawlog PREFIX = rawlog_ #******************************* void diff --git a/src/perl/common/Server.xs b/src/perl/common/Server.xs index dd44fe08..1580e235 100644 --- a/src/perl/common/Server.xs +++ b/src/perl/common/Server.xs @@ -1,4 +1,7 @@ -MODULE = Irssi PACKAGE = Irssi +#include "module.h" + +MODULE = Irssi::Server PACKAGE = Irssi +PROTOTYPES: ENABLE void servers() @@ -36,7 +39,7 @@ server_find_chatnet(chatnet) char *chatnet #******************************* -MODULE = Irssi PACKAGE = Irssi::Server PREFIX = server_ +MODULE = Irssi::Server PACKAGE = Irssi::Server PREFIX = server_ #******************************* void diff --git a/src/perl/common/Settings.xs b/src/perl/common/Settings.xs index 6f5c0915..eeb30c39 100644 --- a/src/perl/common/Settings.xs +++ b/src/perl/common/Settings.xs @@ -1,4 +1,7 @@ -MODULE = Irssi PACKAGE = Irssi +#include "module.h" + +MODULE = Irssi::Settings PACKAGE = Irssi +PROTOTYPES: ENABLE char * settings_get_str(key) diff --git a/src/perl/irc/.cvsignore b/src/perl/irc/.cvsignore index 092c3980..b99999fd 100644 --- a/src/perl/irc/.cvsignore +++ b/src/perl/irc/.cvsignore @@ -1,7 +1,7 @@ Makefile Makefile.PL -Irc.c Irc.bs +*.c *.o pm_to_blib blib diff --git a/src/perl/irc/IrcChannel.xs b/src/perl/irc/Channel.xs index fb8ff3fc..bd88be79 100644 --- a/src/perl/irc/IrcChannel.xs +++ b/src/perl/irc/Channel.xs @@ -1,4 +1,7 @@ -MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Channel PREFIX = irc_ +#include "module.h" + +MODULE = Irssi::Irc::Channel PACKAGE = Irssi::Irc::Channel PREFIX = irc_ +PROTOTYPES: ENABLE void bans(channel) @@ -42,7 +45,7 @@ CODE: OUTPUT: RETVAL -MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server PREFIX = irc_ +MODULE = Irssi::Irc::Channel PACKAGE = Irssi::Irc::Server PREFIX = irc_ Irssi::Irc::Channel irc_channel_create(server, name, automatic) diff --git a/src/perl/irc/Dcc.xs b/src/perl/irc/Dcc.xs index 8b6d7155..a46f171f 100644 --- a/src/perl/irc/Dcc.xs +++ b/src/perl/irc/Dcc.xs @@ -1,4 +1,7 @@ -MODULE = Irssi::Irc PACKAGE = Irssi::Irc +#include "module.h" + +MODULE = Irssi::Irc::Dcc PACKAGE = Irssi::Irc +PROTOTYPES: ENABLE void dccs() @@ -60,7 +63,7 @@ dcc_get_download_path(fname) char *fname #******************************* -MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Dcc PREFIX = dcc_ +MODULE = Irssi::Irc::Dcc PACKAGE = Irssi::Irc::Dcc PREFIX = dcc_ #******************************* void @@ -85,7 +88,7 @@ dcc_reject(dcc, server) Irssi::Irc::Server server #******************************* -MODULE = Irssi::Irc PACKAGE = Irssi::Windowitem PREFIX = item_ +MODULE = Irssi::Irc::Dcc PACKAGE = Irssi::Windowitem PREFIX = item_ #******************************* Irssi::Irc::Dcc::Chat diff --git a/src/perl/irc/Irc.pm b/src/perl/irc/Irc.pm index 48260a27..5baeba7e 100644 --- a/src/perl/irc/Irc.pm +++ b/src/perl/irc/Irc.pm @@ -7,7 +7,7 @@ package Irssi::Irc; use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); -$VERSION = "0.8"; +$VERSION = "0.9"; require Exporter; require DynaLoader; diff --git a/src/perl/irc/Irc.xs b/src/perl/irc/Irc.xs index 306e3a4f..3ab20ac4 100644 --- a/src/perl/irc/Irc.xs +++ b/src/perl/irc/Irc.xs @@ -178,11 +178,15 @@ CODE: "@Irssi::Irc::Dcc::Send::ISA = qw(Irssi::Irc::Dcc);\n", TRUE); -INCLUDE: IrcServer.xs -INCLUDE: IrcChannel.xs -INCLUDE: IrcQuery.xs -INCLUDE: Modes.xs -INCLUDE: Netsplit.xs - -INCLUDE: Dcc.xs -INCLUDE: Notifylist.xs +void +deinit() +CODE: + +BOOT: + irssi_boot(Irc__Channel); + irssi_boot(Irc__Dcc); + irssi_boot(Irc__Modes); + irssi_boot(Irc__Netsplit); + irssi_boot(Irc__Notifylist); + irssi_boot(Irc__Query); + irssi_boot(Irc__Server); diff --git a/src/perl/irc/IrcQuery.xs b/src/perl/irc/IrcQuery.xs deleted file mode 100644 index db292852..00000000 --- a/src/perl/irc/IrcQuery.xs +++ /dev/null @@ -1,7 +0,0 @@ -MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server PREFIX = irc_ - -Irssi::Irc::Query -irc_query_create(server_tag, nick, automatic) - char *server_tag - char *nick - int automatic diff --git a/src/perl/irc/Makefile.PL.in b/src/perl/irc/Makefile.PL.in index de7bbbff..8f1e94d5 100644 --- a/src/perl/irc/Makefile.PL.in +++ b/src/perl/irc/Makefile.PL.in @@ -2,6 +2,7 @@ use ExtUtils::MakeMaker; WriteMakefile('NAME' => 'Irssi::Irc', 'LIBS' => '', + 'OBJECT' => '$(O_FILES)', 'TYPEMAPS' => ['../common/typemap'], 'INC' => '-I../../.. -I@top_srcdir@/src -I@top_srcdir@/src/core -I@top_srcdir@/src/irc/core -I@top_srcdir@/src/irc @GLIB_CFLAGS@', 'VERSION_FROM' => '@srcdir@/Irc.pm'); diff --git a/src/perl/irc/Modes.xs b/src/perl/irc/Modes.xs index f3c2991f..e25c887f 100644 --- a/src/perl/irc/Modes.xs +++ b/src/perl/irc/Modes.xs @@ -1,4 +1,7 @@ -MODULE = Irssi::Irc PACKAGE = Irssi::Irc +#include "module.h" + +MODULE = Irssi::Irc::Modes PACKAGE = Irssi::Irc +PROTOTYPES: ENABLE char * modes_join(old, mode, channel) @@ -7,7 +10,7 @@ modes_join(old, mode, channel) int channel #******************************* -MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Channel PREFIX = channel_ +MODULE = Irssi::Irc::Modes PACKAGE = Irssi::Irc::Channel PREFIX = channel_ #******************************* char * diff --git a/src/perl/irc/Netsplit.xs b/src/perl/irc/Netsplit.xs index c6d7c6e8..e4ef85e4 100644 --- a/src/perl/irc/Netsplit.xs +++ b/src/perl/irc/Netsplit.xs @@ -1,4 +1,7 @@ -MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server +#include "module.h" + +MODULE = Irssi::Irc::Netsplit PACKAGE = Irssi::Irc::Server +PROTOTYPES: ENABLE Irssi::Irc::Netsplit netsplit_find(server, nick, address) diff --git a/src/perl/irc/Notifylist.xs b/src/perl/irc/Notifylist.xs index 1951c125..33f8a9ac 100644 --- a/src/perl/irc/Notifylist.xs +++ b/src/perl/irc/Notifylist.xs @@ -1,4 +1,7 @@ -MODULE = Irssi::Irc PACKAGE = Irssi::Irc +#include "module.h" + +MODULE = Irssi::Irc::Notifylist PACKAGE = Irssi::Irc +PROTOTYPES: ENABLE void notifies() @@ -31,7 +34,7 @@ notifylist_find(mask, ircnet) char *ircnet #******************************* -MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server +MODULE = Irssi::Irc::Notifylist PACKAGE = Irssi::Irc::Server #******************************* int @@ -40,7 +43,7 @@ notifylist_ison_server(server, nick) char *nick #******************************* -MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Notifylist PREFIX = notifylist_ +MODULE = Irssi::Irc::Notifylist PACKAGE = Irssi::Irc::Notifylist PREFIX = notifylist_ #******************************* int diff --git a/src/perl/irc/Query.xs b/src/perl/irc/Query.xs new file mode 100644 index 00000000..a4f6bd03 --- /dev/null +++ b/src/perl/irc/Query.xs @@ -0,0 +1,10 @@ +#include "module.h" + +MODULE = Irssi::Irc::Query PACKAGE = Irssi::Irc::Server PREFIX = irc_ +PROTOTYPES: ENABLE + +Irssi::Irc::Query +irc_query_create(server_tag, nick, automatic) + char *server_tag + char *nick + int automatic diff --git a/src/perl/irc/IrcServer.xs b/src/perl/irc/Server.xs index 1ceff0c2..44813fe6 100644 --- a/src/perl/irc/IrcServer.xs +++ b/src/perl/irc/Server.xs @@ -1,4 +1,7 @@ -MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server PREFIX = irc_server_ +#include "module.h" + +MODULE = Irssi::Irc::Server PACKAGE = Irssi::Irc::Server PREFIX = irc_server_ +PROTOTYPES: ENABLE char * irc_server_get_channels(server) @@ -32,7 +35,7 @@ ctcp_send_reply(server, data) Irssi::Irc::Server server char *data -MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Connect PREFIX = irc_server_ +MODULE = Irssi::Irc::Server PACKAGE = Irssi::Irc::Connect PREFIX = irc_server_ Irssi::Irc::Server irc_server_connect(conn) diff --git a/src/perl/module.h b/src/perl/module.h index 831ded91..f936fb37 100644 --- a/src/perl/module.h +++ b/src/perl/module.h @@ -22,4 +22,4 @@ extern PerlInterpreter *my_perl; /* must be called my_perl or some perl implemen /* Change this every time when some API changes between irssi's perl module and irssi's perl libraries. */ -#define IRSSI_PERL_API_VERSION 20011020 +#define IRSSI_PERL_API_VERSION 20011021 diff --git a/src/perl/perl-common.c b/src/perl/perl-common.c index 1109dee6..276ae14e 100644 --- a/src/perl/perl-common.c +++ b/src/perl/perl-common.c @@ -190,6 +190,16 @@ char *perl_get_use_list(void) return ret; } +void irssi_callXS(void (*subaddr)(CV* cv), CV *cv, SV **mark) +{ + dSP; + + PUSHMARK(mark); + (*subaddr)(cv); + + PUTBACK; +} + void perl_connect_fill_hash(HV *hv, SERVER_CONNECT_REC *conn) { char *type, *chat_type; diff --git a/src/perl/perl-common.h b/src/perl/perl-common.h index 232d7510..da099062 100644 --- a/src/perl/perl-common.h +++ b/src/perl/perl-common.h @@ -48,6 +48,12 @@ void irssi_add_plains(PLAIN_OBJECT_INIT_REC *objects); char *perl_get_use_list(void); +#define irssi_boot(x) { \ + extern void boot_Irssi__##x(CV *cv); \ + irssi_callXS(boot_Irssi__##x, cv, mark); \ + } +void irssi_callXS(void (*subaddr)(CV* cv), CV *cv, SV **mark); + void perl_common_start(void); void perl_common_stop(void); diff --git a/src/perl/perl-core.c b/src/perl/perl-core.c index d319be04..1a970604 100644 --- a/src/perl/perl-core.c +++ b/src/perl/perl-core.c @@ -120,7 +120,8 @@ void perl_scripts_deinit(void) perl_sources_stop(); perl_common_stop(); - /* Unload all perl libraries loaded with dynaloader */ + /* Unload all perl libraries loaded with dynaloader */ + perl_eval_pv("foreach my $lib (@DynaLoader::dl_modules) { if ($lib =~ /^Irssi\\b/) { $lib .= '::deinit();'; eval $lib; } }", TRUE); perl_eval_pv("foreach my $lib (@DynaLoader::dl_librefs) { DynaLoader::dl_unload_file($lib); }", TRUE); /* perl interpreter */ diff --git a/src/perl/textui/.cvsignore b/src/perl/textui/.cvsignore index e6c0f856..517db94b 100644 --- a/src/perl/textui/.cvsignore +++ b/src/perl/textui/.cvsignore @@ -1,7 +1,7 @@ Makefile Makefile.PL -TextUI.c TextUI.bs +*.c *.o pm_to_blib blib diff --git a/src/perl/textui/Makefile.PL.in b/src/perl/textui/Makefile.PL.in index 8b5a2b6c..9e80274b 100644 --- a/src/perl/textui/Makefile.PL.in +++ b/src/perl/textui/Makefile.PL.in @@ -2,6 +2,7 @@ use ExtUtils::MakeMaker; WriteMakefile('NAME' => 'Irssi::TextUI', 'LIBS' => '', + 'OBJECT' => '$(O_FILES)', 'TYPEMAPS' => ['../common/typemap', '../ui/typemap'], 'INC' => '-I../../.. -I@top_srcdir@/src -I@top_srcdir@/src/core -I@top_srcdir@/src/fe-common/core -I@top_srcdir@/src/fe-text @GLIB_CFLAGS@', 'VERSION_FROM' => '@srcdir@/TextUI.pm'); diff --git a/src/perl/textui/Statusbar.xs b/src/perl/textui/Statusbar.xs new file mode 100644 index 00000000..d512a3ab --- /dev/null +++ b/src/perl/textui/Statusbar.xs @@ -0,0 +1,159 @@ +#include "module.h" + +static GHashTable *perl_sbar_defs; + +static int check_sbar_destroy(char *key, char *value, char *script) +{ + if (strncmp(key, script, strlen(script)) == 0 && + key[strlen(script)] == ':') { + g_free(key); + g_free(value); + return TRUE; + } + + return FALSE; +} + +static void sig_script_destroy(PERL_SCRIPT_REC *script) +{ + g_hash_table_foreach_remove(perl_sbar_defs, + (GHRFunc) check_sbar_destroy, + script->name); +} + +void perl_statusbar_init(void) +{ + perl_sbar_defs = g_hash_table_new((GHashFunc) g_str_hash, + (GCompareFunc) g_str_equal); + signal_add("script destroy", (SIGNAL_FUNC) sig_script_destroy); +} + +static void statusbar_item_def_destroy(void *key, void *value) +{ + g_free(key); + g_free(value); +} + +void perl_statusbar_deinit(void) +{ + signal_remove("script destroy", (SIGNAL_FUNC) sig_script_destroy); + + g_hash_table_foreach(perl_sbar_defs, + (GHFunc) statusbar_item_def_destroy, NULL); + g_hash_table_destroy(perl_sbar_defs); +} + +static void perl_statusbar_event(char *function, SBAR_ITEM_REC *item, + int get_size_only) +{ + dSP; + int retcount; + SV *item_sv, **sv; + HV *hv; + + ENTER; + SAVETMPS; + + PUSHMARK(SP); + item_sv = plain_bless(item, "Irssi::TextUI::StatusbarItem"); + XPUSHs(sv_2mortal(item_sv)); + XPUSHs(sv_2mortal(newSViv(get_size_only))); + PUTBACK; + + retcount = perl_call_pv(function, G_EVAL|G_DISCARD); + SPAGAIN; + + if (SvTRUE(ERRSV)) { + STRLEN n_a; + char *package; + + package = perl_function_get_package(function); + signal_emit("script error", 2, + perl_script_find_package(package), + SvPV(ERRSV, n_a)); + g_free(package); + } + + /* min_size and max_size can be changed, move them to SBAR_ITEM_REC */ + hv = hvref(item_sv); + if (hv != NULL) { + sv = hv_fetch(hv, "min_size", 8, 0); + if (sv != NULL) item->min_size = SvIV(*sv); + sv = hv_fetch(hv, "max_size", 8, 0); + if (sv != NULL) item->max_size = SvIV(*sv); + } + + PUTBACK; + FREETMPS; + LEAVE; +} + + +static void sig_perl_statusbar(SBAR_ITEM_REC *item, int get_size_only) +{ + char *function; + + function = g_hash_table_lookup(perl_sbar_defs, item->config->name); + if (function != NULL) + perl_statusbar_event(function, item, get_size_only); + else { + /* use default function - this shouldn't actually happen.. */ + statusbar_item_default_handler(item, get_size_only, NULL, "", TRUE); + } +} + +MODULE = Irssi::TextUI::Statusbar PACKAGE = Irssi +PROTOTYPES: ENABLE + +void +statusbar_item_register(name, value, func = NULL) + char *name + char *value + char *func +CODE: + statusbar_item_register(name, value, func == NULL || *func == '\0' ? NULL : sig_perl_statusbar); + if (func != NULL) { + g_hash_table_insert(perl_sbar_defs, g_strdup(name), + g_strdup_printf("%s::%s", perl_get_package(), func)); + } + +void +statusbar_item_unregister(name) + char *name +PREINIT: + gpointer key, value; +CODE: + if (g_hash_table_lookup_extended(perl_sbar_defs, name, &key, &value)) { + g_hash_table_remove(perl_sbar_defs, name); + g_free(key); + g_free(value); + } + statusbar_item_unregister(name); + +void +statusbar_items_redraw(name) + char *name + +void +statusbars_recreate_items() + +#******************************* +MODULE = Irssi::TextUI::Statusbar PACKAGE = Irssi::TextUI::StatusbarItem PREFIX = statusbar_item_ +#******************************* + +void +statusbar_item_default_handler(item, get_size_only, str, data, escape_vars = TRUE) + Irssi::TextUI::StatusbarItem item + int get_size_only + char *str + char *data + int escape_vars +PREINIT: + HV *hv; +CODE: + statusbar_item_default_handler(item, get_size_only, + *str == '\0' ? NULL : str, + data, escape_vars); + hv = hvref(ST(0)); + hv_store(hv, "min_size", 8, newSViv(item->min_size), 0); + hv_store(hv, "max_size", 8, newSViv(item->max_size), 0); diff --git a/src/perl/textui/TextBuffer.xs b/src/perl/textui/TextBuffer.xs index 83b1582c..4fb92f11 100644 --- a/src/perl/textui/TextBuffer.xs +++ b/src/perl/textui/TextBuffer.xs @@ -1,10 +1,13 @@ -MODULE = Irssi::TextUI PACKAGE = Irssi +#include "module.h" + +MODULE = Irssi::TextUI::TextBuffer PACKAGE = Irssi +PROTOTYPES: ENABLE Irssi::TextUI::TextBuffer textbuffer_create() #******************************* -MODULE = Irssi::TextUI PACKAGE = Irssi::TextUI::TextBuffer PREFIX = textbuffer_ +MODULE = Irssi::TextUI::TextBuffer PACKAGE = Irssi::TextUI::TextBuffer PREFIX = textbuffer_ #******************************* void @@ -36,7 +39,7 @@ textbuffer_remove_all_lines(buffer) Irssi::TextUI::TextBuffer buffer #******************************* -MODULE = Irssi::TextUI PACKAGE = Irssi::TextUI::Line PREFIX = textbuffer_line_ +MODULE = Irssi::TextUI::TextBuffer PACKAGE = Irssi::TextUI::Line PREFIX = textbuffer_line_ #******************************* Irssi::TextUI::Line diff --git a/src/perl/textui/TextBufferView.xs b/src/perl/textui/TextBufferView.xs index e38bf483..dfb1d036 100644 --- a/src/perl/textui/TextBufferView.xs +++ b/src/perl/textui/TextBufferView.xs @@ -1,4 +1,7 @@ -MODULE = Irssi::TextUI PACKAGE = Irssi::TextUI::TextBuffer PREFIX = textbuffer_ +#include "module.h" + +MODULE = Irssi::TextUI::TextBufferView PACKAGE = Irssi::TextUI::TextBuffer PREFIX = textbuffer_ +PROTOTYPES: ENABLE Irssi::TextUI::TextBufferView textbuffer_view_create(buffer, width, height, default_indent, longword_noindent, scroll) @@ -10,7 +13,7 @@ textbuffer_view_create(buffer, width, height, default_indent, longword_noindent, int scroll #******************************* -MODULE = Irssi::TextUI PACKAGE = Irssi::TextUI::TextBufferView PREFIX = textbuffer_view_ +MODULE = Irssi::TextUI::TextBufferView PACKAGE = Irssi::TextUI::TextBufferView PREFIX = textbuffer_view_ #******************************* void @@ -92,7 +95,7 @@ textbuffer_view_redraw(view) Irssi::TextUI::TextBufferView view #******************************* -MODULE = Irssi::TextUI PACKAGE = Irssi::UI::Window +MODULE = Irssi::TextUI::TextBufferView PACKAGE = Irssi::UI::Window #******************************* Irssi::TextUI::TextBufferView diff --git a/src/perl/textui/TextUI.pm b/src/perl/textui/TextUI.pm index 21f6d03b..2bcd17ff 100644 --- a/src/perl/textui/TextUI.pm +++ b/src/perl/textui/TextUI.pm @@ -7,7 +7,7 @@ package Irssi::TextUI; use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); -$VERSION = "0.8"; +$VERSION = "0.9"; require Exporter; require DynaLoader; diff --git a/src/perl/textui/TextUI.xs b/src/perl/textui/TextUI.xs index f3978212..c92da84a 100644 --- a/src/perl/textui/TextUI.xs +++ b/src/perl/textui/TextUI.xs @@ -61,6 +61,14 @@ static void perl_line_info_fill_hash(HV *hv, LINE_INFO_REC *info) hv_store(hv, "time", 4, newSViv(info->time), 0); } +static void perl_statusbar_item_fill_hash(HV *hv, SBAR_ITEM_REC *item) +{ + hv_store(hv, "min_size", 8, newSViv(item->min_size), 0); + hv_store(hv, "max_size", 8, newSViv(item->max_size), 0); + hv_store(hv, "xpos", 4, newSViv(item->xpos), 0); + hv_store(hv, "size", 4, newSViv(item->size), 0); +} + 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 }, @@ -68,6 +76,7 @@ static PLAIN_OBJECT_INIT_REC textui_plains[] = { { "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 } }; @@ -86,6 +95,12 @@ CODE: initialized = TRUE; irssi_add_plains(textui_plains); + perl_statusbar_init(); + +void +deinit() +CODE: + perl_statusbar_deinit(); MODULE = Irssi::TextUI PACKAGE = Irssi @@ -95,5 +110,7 @@ gui_printtext(xpos, ypos, str) int ypos char *str -INCLUDE: TextBuffer.xs -INCLUDE: TextBufferView.xs +BOOT: + irssi_boot(TextUI__Statusbar); + irssi_boot(TextUI__TextBuffer); + irssi_boot(TextUI__TextBufferView); diff --git a/src/perl/textui/module.h b/src/perl/textui/module.h index 239b0b02..9123afb2 100644 --- a/src/perl/textui/module.h +++ b/src/perl/textui/module.h @@ -3,6 +3,7 @@ #include "mainwindows.h" #include "gui-windows.h" #include "gui-printtext.h" +#include "statusbar.h" #include "textbuffer.h" #include "textbuffer-view.h" @@ -12,3 +13,4 @@ typedef TEXT_BUFFER_VIEW_REC *Irssi__TextUI__TextBufferView; typedef LINE_REC *Irssi__TextUI__Line; typedef LINE_CACHE_REC *Irssi__TextUI__LineCache; typedef LINE_INFO_REC *Irssi__TextUI__LineInfo; +typedef SBAR_ITEM_REC *Irssi__TextUI__StatusbarItem; diff --git a/src/perl/textui/typemap b/src/perl/textui/typemap index a31b6478..364cdf32 100644 --- a/src/perl/textui/typemap +++ b/src/perl/textui/typemap @@ -5,6 +5,7 @@ Irssi::TextUI::TextBufferView T_PlainObj Irssi::TextUI::Line T_PlainObj Irssi::TextUI::LineCache T_PlainObj Irssi::TextUI::LineInfo T_PlainObj +Irssi::TextUI::StatusbarItem T_PlainObj INPUT diff --git a/src/perl/ui/.cvsignore b/src/perl/ui/.cvsignore index 239deafc..335ef887 100644 --- a/src/perl/ui/.cvsignore +++ b/src/perl/ui/.cvsignore @@ -1,7 +1,7 @@ Makefile Makefile.PL -UI.c UI.bs +*.c *.o pm_to_blib blib diff --git a/src/perl/ui/Makefile.PL.in b/src/perl/ui/Makefile.PL.in index 601c3b9d..a349918e 100644 --- a/src/perl/ui/Makefile.PL.in +++ b/src/perl/ui/Makefile.PL.in @@ -2,6 +2,7 @@ use ExtUtils::MakeMaker; WriteMakefile('NAME' => 'Irssi::UI', 'LIBS' => '', + 'OBJECT' => '$(O_FILES)', 'TYPEMAPS' => ['../common/typemap'], 'INC' => '-I../../.. -I@top_srcdir@/src -I@top_srcdir@/src/core -I@top_srcdir@/src/fe-common/core @GLIB_CFLAGS@', 'VERSION_FROM' => '@srcdir@/UI.pm'); diff --git a/src/perl/ui/Themes.xs b/src/perl/ui/Themes.xs index 427952ff..c2a0f1bc 100644 --- a/src/perl/ui/Themes.xs +++ b/src/perl/ui/Themes.xs @@ -1,5 +1,7 @@ +#include "module.h" -MODULE = Irssi::UI PACKAGE = Irssi +MODULE = Irssi::UI::Themes PACKAGE = Irssi +PROTOTYPES: ENABLE void theme_register(formats) @@ -53,7 +55,7 @@ CODE: printformat_perl(&dest, format, arglist); #******************************* -MODULE = Irssi::UI PACKAGE = Irssi::Server +MODULE = Irssi::UI::Themes PACKAGE = Irssi::Server #******************************* void @@ -77,7 +79,7 @@ CODE: printformat_perl(&dest, format, arglist); #******************************* -MODULE = Irssi::UI PACKAGE = Irssi::UI::Window +MODULE = Irssi::UI::Themes PACKAGE = Irssi::UI::Window #******************************* void @@ -100,7 +102,7 @@ CODE: printformat_perl(&dest, format, arglist); #******************************* -MODULE = Irssi::UI PACKAGE = Irssi::Windowitem +MODULE = Irssi::UI::Themes PACKAGE = Irssi::Windowitem #******************************* void diff --git a/src/perl/ui/UI.pm b/src/perl/ui/UI.pm index 7701d178..0ef9c711 100644 --- a/src/perl/ui/UI.pm +++ b/src/perl/ui/UI.pm @@ -7,7 +7,7 @@ package Irssi::UI; use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); -$VERSION = "0.8"; +$VERSION = "0.9"; require Exporter; require DynaLoader; @@ -21,4 +21,3 @@ bootstrap Irssi::UI $VERSION; Irssi::UI::init(); 1; - diff --git a/src/perl/ui/UI.xs b/src/perl/ui/UI.xs index 2e9dbeac..8ad60bd7 100644 --- a/src/perl/ui/UI.xs +++ b/src/perl/ui/UI.xs @@ -104,12 +104,6 @@ static PLAIN_OBJECT_INIT_REC fe_plains[] = { { NULL, NULL } }; -static void sig_deinit(void) -{ - signal_remove("script destroy", (SIGNAL_FUNC) sig_script_destroy); - signal_remove("perl scripts deinit", (SIGNAL_FUNC) sig_deinit); -} - MODULE = Irssi::UI PACKAGE = Irssi::UI PROTOTYPES: ENABLE @@ -126,8 +120,12 @@ CODE: irssi_add_plains(fe_plains); signal_add("script destroy", (SIGNAL_FUNC) sig_script_destroy); - signal_add("perl scripts deinit", (SIGNAL_FUNC) sig_deinit); +void +deinit() +CODE: + signal_remove("script destroy", (SIGNAL_FUNC) sig_script_destroy); -INCLUDE: Themes.xs -INCLUDE: Window.xs +BOOT: + irssi_boot(UI__Themes); + irssi_boot(UI__Window); diff --git a/src/perl/ui/Window.xs b/src/perl/ui/Window.xs index 520c5bb8..322be79c 100644 --- a/src/perl/ui/Window.xs +++ b/src/perl/ui/Window.xs @@ -1,4 +1,7 @@ -MODULE = Irssi::UI PACKAGE = Irssi +#include "module.h" + +MODULE = Irssi::UI::Window PACKAGE = Irssi +PROTOTYPES: ENABLE void windows() @@ -93,7 +96,7 @@ OUTPUT: #******************************* -MODULE = Irssi::UI PACKAGE = Irssi::Server +MODULE = Irssi::UI::Window PACKAGE = Irssi::Server #******************************* void @@ -135,7 +138,7 @@ window_find_closest(server, name, level) #******************************* -MODULE = Irssi::UI PACKAGE = Irssi::UI::Window PREFIX=window_ +MODULE = Irssi::UI::Window PACKAGE = Irssi::UI::Window PREFIX=window_ #******************************* void @@ -230,7 +233,7 @@ OUTPUT: RETVAL #******************************* -MODULE = Irssi::UI PACKAGE = Irssi::Windowitem PREFIX = window_item_ +MODULE = Irssi::UI::Window PACKAGE = Irssi::Windowitem PREFIX = window_item_ #******************************* void |