summaryrefslogtreecommitdiff
path: root/src/gui/gui-bar-item.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/gui-bar-item.c')
-rw-r--r--src/gui/gui-bar-item.c592
1 files changed, 592 insertions, 0 deletions
diff --git a/src/gui/gui-bar-item.c b/src/gui/gui-bar-item.c
new file mode 100644
index 000000000..2239486ed
--- /dev/null
+++ b/src/gui/gui-bar-item.c
@@ -0,0 +1,592 @@
+/*
+ * Copyright (c) 2003-2008 by FlashCode <flashcode@flashtux.org>
+ * See README for License detail, AUTHORS for developers list.
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/* gui-bar-item.c: bar item functions, used by all GUI */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "../core/weechat.h"
+#include "../core/wee-config.h"
+#include "../core/wee-hook.h"
+#include "../core/wee-log.h"
+#include "../core/wee-string.h"
+#include "../plugins/plugin.h"
+#include "gui-bar-item.h"
+#include "gui-bar.h"
+#include "gui-buffer.h"
+#include "gui-color.h"
+#include "gui-hotlist.h"
+#include "gui-window.h"
+
+
+struct t_gui_bar_item *gui_bar_items = NULL; /* first bar item */
+struct t_gui_bar_item *last_gui_bar_item = NULL; /* last bar item */
+char *gui_bar_item_names[GUI_BAR_NUM_ITEMS] =
+{ "buffer_count", "buffer_plugin", "buffer_name", "nicklist_count", "scroll",
+ "hotlist"
+};
+struct t_hook *gui_bar_item_hook1 = NULL;
+struct t_hook *gui_bar_item_hook2 = NULL;
+struct t_hook *gui_bar_item_hook3 = NULL;
+struct t_hook *gui_bar_item_hook4 = NULL;
+struct t_hook *gui_bar_item_hook5 = NULL;
+struct t_hook *gui_bar_item_hook6 = NULL;
+struct t_hook *gui_bar_item_hook7 = NULL;
+
+
+/*
+ * gui_bar_item_search: search a bar item
+ */
+
+struct t_gui_bar_item *
+gui_bar_item_search (char *name)
+{
+ struct t_gui_bar_item *ptr_item;
+
+ if (!name || !name[0])
+ return NULL;
+
+ for (ptr_item = gui_bar_items; ptr_item; ptr_item = ptr_item->next_item)
+ {
+ if (strcmp (ptr_item->name, name) == 0)
+ return ptr_item;
+ }
+
+ /* bar item not found */
+ return NULL;
+}
+
+/*
+ * gui_bar_item_search_with_plugin: search a bar item for a plugin
+ */
+
+struct t_gui_bar_item *
+gui_bar_item_search_with_plugin (struct t_weechat_plugin *plugin, char *name)
+{
+ struct t_gui_bar_item *ptr_item;
+
+ if (!name || !name[0])
+ return NULL;
+
+ for (ptr_item = gui_bar_items; ptr_item; ptr_item = ptr_item->next_item)
+ {
+ if ((ptr_item->plugin == plugin)
+ && (strcmp (ptr_item->name, name) == 0))
+ return ptr_item;
+ }
+
+ /* bar item not found */
+ return NULL;
+}
+
+/*
+ * gui_bar_item_new: create a new bar item
+ */
+
+struct t_gui_bar_item *
+gui_bar_item_new (struct t_weechat_plugin *plugin, char *name,
+ char *(*build_callback)(void *data,
+ struct t_gui_bar_item *item,
+ struct t_gui_window *window,
+ int max_width),
+ void *build_callback_data)
+{
+ struct t_gui_bar_item *new_bar_item;
+
+ if (!name || !name[0])
+ return NULL;
+
+ /* it's not possible to create 2 bar items with same name for same plugin*/
+ if (gui_bar_item_search_with_plugin (plugin, name))
+ return NULL;
+
+ /* create bar item */
+ new_bar_item = (struct t_gui_bar_item *) malloc (sizeof (struct t_gui_bar_item));
+ if (new_bar_item)
+ {
+ new_bar_item->plugin = plugin;
+ new_bar_item->name = strdup (name);
+ new_bar_item->build_callback = build_callback;
+ new_bar_item->build_callback_data = build_callback_data;
+
+ /* add bar item to bar items queue */
+ new_bar_item->prev_item = last_gui_bar_item;
+ if (gui_bar_items)
+ last_gui_bar_item->next_item = new_bar_item;
+ else
+ gui_bar_items = new_bar_item;
+ last_gui_bar_item = new_bar_item;
+ new_bar_item->next_item = NULL;
+
+ return new_bar_item;
+ }
+
+ /* failed to create bar item */
+ return NULL;
+}
+
+/*
+ * gui_bar_contains_item: return 1 if a bar contains item, O otherwise
+ */
+
+int
+gui_bar_contains_item (struct t_gui_bar *bar, char *name)
+{
+ int i;
+
+ if (!bar || !name || !name[0])
+ return 0;
+
+ for (i = 0; i < bar->items_count; i++)
+ {
+ if (strcmp (bar->items_array[i], name) == 0)
+ return 1;
+ }
+
+ /* item is not in bar */
+ return 0;
+}
+
+/*
+ * gui_bar_item_update: update an item on all bars displayed on screen
+ */
+
+void
+gui_bar_item_update (char *name)
+{
+ struct t_gui_bar *ptr_bar;
+
+ for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar)
+ {
+ if (gui_bar_contains_item (ptr_bar, name))
+ gui_bar_draw (ptr_bar);
+ }
+}
+
+/*
+ * gui_bar_item_free: delete a bar item
+ */
+
+void
+gui_bar_item_free (struct t_gui_bar_item *item)
+{
+ /* remove bar item from bar items list */
+ if (item->prev_item)
+ item->prev_item->next_item = item->next_item;
+ if (item->next_item)
+ item->next_item->prev_item = item->prev_item;
+ if (gui_bar_items == item)
+ gui_bar_items = item->next_item;
+ if (last_gui_bar_item == item)
+ last_gui_bar_item = item->prev_item;
+
+ /* free data */
+ if (item->name)
+ free (item->name);
+
+ free (item);
+}
+
+/*
+ * gui_bar_item_free_all: delete all bar items
+ */
+
+void
+gui_bar_item_free_all ()
+{
+ while (gui_bar_items)
+ {
+ gui_bar_item_free (gui_bar_items);
+ }
+}
+
+/*
+ * gui_bar_item_free_all_plugin: delete all bar items for a plugin
+ */
+
+void
+gui_bar_item_free_all_plugin (struct t_weechat_plugin *plugin)
+{
+ struct t_gui_bar_item *ptr_item, *next_item;
+
+ ptr_item = gui_bar_items;
+ while (ptr_item)
+ {
+ next_item = ptr_item->next_item;
+
+ if (ptr_item->plugin == plugin)
+ gui_bar_item_free (ptr_item);
+
+ ptr_item = next_item;
+ }
+}
+
+/*
+ * gui_bar_item_default_buffer_count: default item for number of buffers
+ */
+
+char *
+gui_bar_item_default_buffer_count (void *data, struct t_gui_bar_item *item,
+ struct t_gui_window *window,
+ int max_width)
+{
+ char buf[64];
+
+ /* make C compiler happy */
+ (void) data;
+ (void) item;
+ (void) window;
+ (void) max_width;
+
+ snprintf (buf, sizeof (buf), "%s[%s%d%s] ",
+ GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS),
+ GUI_COLOR(GUI_COLOR_STATUS),
+ (last_gui_buffer) ? last_gui_buffer->number : 0,
+ GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS));
+
+ return strdup (buf);
+}
+
+/*
+ * gui_bar_item_default_buffer_plugin: default item for name of buffer plugin
+ */
+
+char *
+gui_bar_item_default_buffer_plugin (void *data, struct t_gui_bar_item *item,
+ struct t_gui_window *window,
+ int max_width)
+{
+ char buf[64];
+
+ /* make C compiler happy */
+ (void) data;
+ (void) item;
+ (void) max_width;
+
+ if (!window)
+ return NULL;
+
+ snprintf (buf, sizeof (buf), "%s[%s%s%s] ",
+ GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS),
+ GUI_COLOR(GUI_COLOR_STATUS),
+ (window->buffer->plugin) ? window->buffer->plugin->name : "core",
+ GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS));
+
+ return strdup (buf);
+}
+
+/*
+ * gui_bar_item_default_buffer_name: default item for name of buffer
+ */
+
+char *
+gui_bar_item_default_buffer_name (void *data, struct t_gui_bar_item *item,
+ struct t_gui_window *window,
+ int max_width)
+{
+ char buf[256];
+
+ /* make C compiler happy */
+ (void) data;
+ (void) item;
+ (void) max_width;
+
+ if (!window)
+ return NULL;
+
+ snprintf (buf, sizeof (buf), "%s%d%s:%s%s%s/%s%s ",
+ GUI_COLOR(GUI_COLOR_STATUS_NUMBER),
+ window->buffer->number,
+ GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS),
+ GUI_COLOR(GUI_COLOR_STATUS_CATEGORY),
+ window->buffer->category,
+ GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS),
+ GUI_COLOR(GUI_COLOR_STATUS_NAME),
+ window->buffer->name);
+
+ return strdup (buf);
+}
+
+/*
+ * gui_bar_item_default_nicklist_count: default item for number of nicks in
+ * buffer nicklist
+ */
+
+char *
+gui_bar_item_default_nicklist_count (void *data, struct t_gui_bar_item *item,
+ struct t_gui_window *window,
+ int max_width)
+{
+ char buf[64];
+
+ /* make C compiler happy */
+ (void) data;
+ (void) item;
+ (void) max_width;
+
+ if (!window || !window->buffer->nicklist)
+ return NULL;
+
+ snprintf (buf, sizeof (buf), "%s[%s%d%s] ",
+ GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS),
+ GUI_COLOR(GUI_COLOR_STATUS),
+ window->buffer->nicklist_visible_count,
+ GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS));
+
+ return strdup (buf);
+}
+
+/*
+ * gui_bar_item_default_scroll: default item for scrolling indicator
+ */
+
+char *
+gui_bar_item_default_scroll (void *data, struct t_gui_bar_item *item,
+ struct t_gui_window *window,
+ int max_width)
+{
+ char buf[64];
+
+ /* make C compiler happy */
+ (void) data;
+ (void) item;
+ (void) max_width;
+
+ if (!window || !window->scroll)
+ return NULL;
+
+ snprintf (buf, sizeof (buf), "%s%s ",
+ GUI_COLOR(GUI_COLOR_STATUS_MORE),
+ _("(MORE)"));
+
+ return strdup (buf);
+}
+
+/*
+ * gui_bar_item_default_hotlist: default item for hotlist
+ */
+
+char *
+gui_bar_item_default_hotlist (void *data, struct t_gui_bar_item *item,
+ struct t_gui_window *window,
+ int max_width)
+{
+ char buf[1024], format[32];
+ struct t_gui_hotlist *ptr_hotlist;
+ int names_count, display_name;
+
+ /* make C compiler happy */
+ (void) data;
+ (void) item;
+ (void) window;
+ (void) max_width;
+
+ if (!gui_hotlist)
+ return NULL;
+
+ buf[0] = '\0';
+
+ strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS));
+ strcat (buf, "[");
+ strcat (buf, GUI_COLOR(GUI_COLOR_STATUS));
+ strcat (buf, _("Act: "));
+
+ names_count = 0;
+ for (ptr_hotlist = gui_hotlist; ptr_hotlist;
+ ptr_hotlist = ptr_hotlist->next_hotlist)
+ {
+ switch (ptr_hotlist->priority)
+ {
+ case GUI_HOTLIST_LOW:
+ strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DATA_OTHER));
+ display_name = ((CONFIG_INTEGER(config_look_hotlist_names_level) & 1) != 0);
+ break;
+ case GUI_HOTLIST_MESSAGE:
+ strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DATA_MSG));
+ display_name = ((CONFIG_INTEGER(config_look_hotlist_names_level) & 2) != 0);
+ break;
+ case GUI_HOTLIST_PRIVATE:
+ strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DATA_PRIVATE));
+ display_name = ((CONFIG_INTEGER(config_look_hotlist_names_level) & 4) != 0);
+ break;
+ case GUI_HOTLIST_HIGHLIGHT:
+ strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DATA_HIGHLIGHT));
+ display_name = ((CONFIG_INTEGER(config_look_hotlist_names_level) & 8) != 0);
+ break;
+ default:
+ display_name = 0;
+ break;
+ }
+
+ sprintf (buf + strlen (buf), "%d", ptr_hotlist->buffer->number);
+
+ if (display_name
+ && (CONFIG_INTEGER(config_look_hotlist_names_count) != 0)
+ && (names_count < CONFIG_INTEGER(config_look_hotlist_names_count)))
+ {
+ names_count++;
+
+ strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS));
+ strcat (buf, ":");
+ strcat (buf, GUI_COLOR(GUI_COLOR_STATUS));
+ if (CONFIG_INTEGER(config_look_hotlist_names_length) == 0)
+ snprintf (format, sizeof (format) - 1, "%%s");
+ else
+ snprintf (format, sizeof (format) - 1,
+ "%%.%ds",
+ CONFIG_INTEGER(config_look_hotlist_names_length));
+ sprintf (buf + strlen (buf), format, ptr_hotlist->buffer->name);
+ }
+
+ if (ptr_hotlist->next_hotlist)
+ strcat (buf, ",");
+
+ if (strlen (buf) > sizeof (buf) - 32)
+ break;
+ }
+ strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS));
+ strcat (buf, "] ");
+
+ return strdup (buf);
+}
+
+/*
+ * gui_bar_item_signal_cb: callback when a signal is received, for rebuilding
+ * an item
+ */
+
+int
+gui_bar_item_signal_cb (void *data, char *signal,
+ char *type_data, void *signal_data)
+{
+ /* make C compiler happy */
+ (void) signal;
+ (void) type_data;
+ (void) signal_data;
+
+ gui_bar_item_update ((char *)data);
+
+ return WEECHAT_RC_OK;
+}
+
+/*
+ * gui_bar_item_init: init default items in WeeChat
+ */
+
+void
+gui_bar_item_init ()
+{
+ /* buffer count */
+ gui_bar_item_new (NULL,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_COUNT],
+ &gui_bar_item_default_buffer_count, NULL);
+ gui_bar_item_hook1 = hook_signal (NULL, "buffer_open",
+ &gui_bar_item_signal_cb,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_COUNT]);
+ gui_bar_item_hook2 = hook_signal (NULL, "buffer_closed",
+ &gui_bar_item_signal_cb,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_COUNT]);
+
+ /* buffer plugin */
+ gui_bar_item_new (NULL,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_PLUGIN],
+ &gui_bar_item_default_buffer_plugin, NULL);
+
+ /* buffer name */
+ gui_bar_item_new (NULL,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_NAME],
+ &gui_bar_item_default_buffer_name, NULL);
+ gui_bar_item_hook3 = hook_signal (NULL, "buffer_renamed",
+ &gui_bar_item_signal_cb,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_NAME]);
+ gui_bar_item_hook4 = hook_signal (NULL, "buffer_moved",
+ &gui_bar_item_signal_cb,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_NAME]);
+
+ /* nicklist count */
+ gui_bar_item_new (NULL,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_NICKLIST_COUNT],
+ &gui_bar_item_default_nicklist_count, NULL);
+ gui_bar_item_hook5 = hook_signal (NULL, "nicklist_changed",
+ &gui_bar_item_signal_cb,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_NICKLIST_COUNT]);
+
+ /* scroll indicator */
+ gui_bar_item_new (NULL,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_SCROLL],
+ &gui_bar_item_default_scroll, NULL);
+ gui_bar_item_hook6 = hook_signal (NULL, "window_scrolled",
+ &gui_bar_item_signal_cb,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_SCROLL]);
+
+ /* hotlist */
+ gui_bar_item_new (NULL,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_HOTLIST],
+ &gui_bar_item_default_hotlist, NULL);
+ gui_bar_item_hook7 = hook_signal (NULL, "hotlist_changed",
+ &gui_bar_item_signal_cb,
+ gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_HOTLIST]);
+}
+
+/*
+ * gui_bar_item_end: remove bar items and hooks
+ */
+
+void
+gui_bar_item_end ()
+{
+ /* remove hooks */
+ unhook (gui_bar_item_hook1);
+ unhook (gui_bar_item_hook2);
+ unhook (gui_bar_item_hook3);
+ unhook (gui_bar_item_hook4);
+ unhook (gui_bar_item_hook5);
+ unhook (gui_bar_item_hook6);
+ unhook (gui_bar_item_hook7);
+
+ /* remove bar items */
+ gui_bar_item_free_all ();
+}
+
+/*
+ * gui_bar_item_print_log: print bar items infos in log (usually for crash dump)
+ */
+
+void
+gui_bar_item_print_log ()
+{
+ struct t_gui_bar_item *ptr_item;
+
+ for (ptr_item = gui_bar_items; ptr_item; ptr_item = ptr_item->next_item)
+ {
+ log_printf ("");
+ log_printf ("[bar item (addr:0x%x)]", ptr_item);
+ log_printf (" plugin . . . . . . . . : 0x%x", ptr_item->plugin);
+ log_printf (" name . . . . . . . . . : '%s'", ptr_item->name);
+ log_printf (" build_callback . . . . : 0x%x", ptr_item->build_callback);
+ log_printf (" build_callback_data. . : 0x%x", ptr_item->build_callback_data);
+ log_printf (" prev_item. . . . . . . : 0x%x", ptr_item->prev_item);
+ log_printf (" next_item. . . . . . . : 0x%x", ptr_item->next_item);
+ }
+}