From fa1912bb5dc9c00858c9bc0c7c9e32d9e4e6013f Mon Sep 17 00:00:00 2001
From: deepend-tildeclub <58404188+deepend-tildeclub@users.noreply.github.com>
Date: Thu, 15 Jan 2026 18:35:27 -0700
Subject: [PATCH 1/4] Update maingui.c
---
src/fe-gtk/maingui.c | 5461 ++++++++++++++++++++++--------------------
1 file changed, 2843 insertions(+), 2618 deletions(-)
diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c
index ce367149..feac87bb 100644
--- a/src/fe-gtk/maingui.c
+++ b/src/fe-gtk/maingui.c
@@ -62,31 +62,38 @@
enum
{
- POS_INVALID = 0,
- POS_TOPLEFT = 1,
- POS_BOTTOMLEFT = 2,
- POS_TOPRIGHT = 3,
- POS_BOTTOMRIGHT = 4,
- POS_TOP = 5, /* for tabs only */
- POS_BOTTOM = 6,
- POS_HIDDEN = 7
+ POS_INVALID = 0,
+ POS_TOPLEFT = 1,
+ POS_BOTTOMLEFT = 2,
+ POS_TOPRIGHT = 3,
+ POS_BOTTOMRIGHT = 4,
+ POS_TOP = 5, /* for tabs only */
+ POS_BOTTOM = 6,
+ POS_HIDDEN = 7
};
/* two different types of tabs */
-#define TAG_IRC 0 /* server, channel, dialog */
-#define TAG_UTIL 1 /* dcc, notify, chanlist */
+#define TAG_IRC 0 /* server, channel, dialog */
+#define TAG_UTIL 1 /* dcc, notify, chanlist */
+
+static void mg_apply_emoji_fallback_widget (GtkWidget *widget);
+static void mg_apply_emoji_primary_widget (GtkWidget *widget);
+static gchar *mg_font_string_with_emoji_fallback (const gchar *font_string);
+static void mg_emoji_button_cb (GtkWidget *widget, session_gui *gui);
+static GtkWidget *mg_create_emoji_menu (session_gui *gui);
+static void mg_emoji_insert_cb (GtkMenuItem *item, session_gui *gui);
static void mg_create_entry (session *sess, GtkWidget *box);
static void mg_create_search (session *sess, GtkWidget *box);
static void mg_link_irctab (session *sess, int focus);
static session_gui static_mg_gui;
-static session_gui *mg_gui = NULL; /* the shared irc tab */
+static session_gui *mg_gui = NULL; /* the shared irc tab */
static int ignore_chanmode = FALSE;
static const char chan_flags[] = { 'c', 'n', 't', 'i', 'm', 'l', 'k' };
-static chan *active_tab = NULL; /* active tab */
-GtkWidget *parent_window = NULL; /* the master window */
+static chan *active_tab = NULL; /* active tab */
+GtkWidget *parent_window = NULL; /* the master window */
GtkStyle *input_style;
@@ -99,68 +106,68 @@ static PangoAttrList *plain_list = NULL;
static PangoAttrList *
mg_attr_list_create (GdkColor *col, int size)
{
- PangoAttribute *attr;
- PangoAttrList *list;
+ PangoAttribute *attr;
+ PangoAttrList *list;
- list = pango_attr_list_new ();
+ list = pango_attr_list_new ();
- if (col)
- {
- attr = pango_attr_foreground_new (col->red, col->green, col->blue);
- attr->start_index = 0;
- attr->end_index = 0xffff;
- pango_attr_list_insert (list, attr);
- }
+ if (col)
+ {
+ attr = pango_attr_foreground_new (col->red, col->green, col->blue);
+ attr->start_index = 0;
+ attr->end_index = 0xffff;
+ pango_attr_list_insert (list, attr);
+ }
- if (size > 0)
- {
- attr = pango_attr_scale_new (size == 1 ? PANGO_SCALE_SMALL : PANGO_SCALE_X_SMALL);
- attr->start_index = 0;
- attr->end_index = 0xffff;
- pango_attr_list_insert (list, attr);
- }
+ if (size > 0)
+ {
+ attr = pango_attr_scale_new (size == 1 ? PANGO_SCALE_SMALL : PANGO_SCALE_X_SMALL);
+ attr->start_index = 0;
+ attr->end_index = 0xffff;
+ pango_attr_list_insert (list, attr);
+ }
- return list;
+ return list;
}
static void
mg_create_tab_colors (void)
{
- if (plain_list)
- {
- pango_attr_list_unref (plain_list);
- pango_attr_list_unref (newmsg_list);
- pango_attr_list_unref (newdata_list);
- pango_attr_list_unref (nickseen_list);
- pango_attr_list_unref (away_list);
- }
+ if (plain_list)
+ {
+ pango_attr_list_unref (plain_list);
+ pango_attr_list_unref (newmsg_list);
+ pango_attr_list_unref (newdata_list);
+ pango_attr_list_unref (nickseen_list);
+ pango_attr_list_unref (away_list);
+ }
- plain_list = mg_attr_list_create (NULL, prefs.hex_gui_tab_small);
- newdata_list = mg_attr_list_create (&colors[COL_NEW_DATA], prefs.hex_gui_tab_small);
- nickseen_list = mg_attr_list_create (&colors[COL_HILIGHT], prefs.hex_gui_tab_small);
- newmsg_list = mg_attr_list_create (&colors[COL_NEW_MSG], prefs.hex_gui_tab_small);
- away_list = mg_attr_list_create (&colors[COL_AWAY], FALSE);
+ plain_list = mg_attr_list_create (NULL, prefs.hex_gui_tab_small);
+ newdata_list = mg_attr_list_create (&colors[COL_NEW_DATA], prefs.hex_gui_tab_small);
+ nickseen_list = mg_attr_list_create (&colors[COL_HILIGHT], prefs.hex_gui_tab_small);
+ newmsg_list = mg_attr_list_create (&colors[COL_NEW_MSG], prefs.hex_gui_tab_small);
+ away_list = mg_attr_list_create (&colors[COL_AWAY], FALSE);
}
static void
set_window_urgency (GtkWidget *win, gboolean set)
{
- gtk_window_set_urgency_hint (GTK_WINDOW (win), set);
+ gtk_window_set_urgency_hint (GTK_WINDOW (win), set);
}
static void
flash_window (GtkWidget *win)
{
#ifdef HAVE_GTK_MAC
- gtkosx_application_attention_request (osx_app, INFO_REQUEST);
+ gtkosx_application_attention_request (osx_app, INFO_REQUEST);
#endif
- set_window_urgency (win, TRUE);
+ set_window_urgency (win, TRUE);
}
static void
unflash_window (GtkWidget *win)
{
- set_window_urgency (win, FALSE);
+ set_window_urgency (win, FALSE);
}
/* flash the taskbar button */
@@ -168,8 +175,8 @@ unflash_window (GtkWidget *win)
void
fe_flash_window (session *sess)
{
- if (fe_gui_info (sess, 0) != 1) /* only do it if not focused */
- flash_window (sess->gui->window);
+ if (fe_gui_info (sess, 0) != 1) /* only do it if not focused */
+ flash_window (sess->gui->window);
}
/* set a tab plain, red, light-red, or blue */
@@ -177,72 +184,72 @@ fe_flash_window (session *sess)
void
fe_set_tab_color (struct session *sess, tabcolor col)
{
- struct session *server_sess = sess->server->server_session;
- int col_noflags = (col & ~FE_COLOR_ALLFLAGS);
- int col_shouldoverride = !(col & FE_COLOR_FLAG_NOOVERRIDE);
+ struct session *server_sess = sess->server->server_session;
+ int col_noflags = (col & ~FE_COLOR_ALLFLAGS);
+ int col_shouldoverride = !(col & FE_COLOR_FLAG_NOOVERRIDE);
- if (sess->res->tab && sess->gui->is_tab && (col == 0 || sess != current_tab))
- {
- switch (col_noflags)
- {
- case 0: /* no particular color (theme default) */
- sess->tab_state = TAB_STATE_NONE;
- chan_set_color (sess->res->tab, plain_list);
- break;
- case 1: /* new data has been displayed (dark red) */
- if (col_shouldoverride || !((sess->tab_state & TAB_STATE_NEW_MSG)
- || (sess->tab_state & TAB_STATE_NEW_HILIGHT))) {
- sess->tab_state = TAB_STATE_NEW_DATA;
- chan_set_color (sess->res->tab, newdata_list);
- }
+ if (sess->res->tab && sess->gui->is_tab && (col == 0 || sess != current_tab))
+ {
+ switch (col_noflags)
+ {
+ case 0: /* no particular color (theme default) */
+ sess->tab_state = TAB_STATE_NONE;
+ chan_set_color (sess->res->tab, plain_list);
+ break;
+ case 1: /* new data has been displayed (dark red) */
+ if (col_shouldoverride || !((sess->tab_state & TAB_STATE_NEW_MSG)
+ || (sess->tab_state & TAB_STATE_NEW_HILIGHT))) {
+ sess->tab_state = TAB_STATE_NEW_DATA;
+ chan_set_color (sess->res->tab, newdata_list);
+ }
- if (chan_is_collapsed (sess->res->tab)
- && !((server_sess->tab_state & TAB_STATE_NEW_MSG)
- || (server_sess->tab_state & TAB_STATE_NEW_HILIGHT))
- && !(server_sess == current_tab))
- {
- server_sess->tab_state = TAB_STATE_NEW_DATA;
- chan_set_color (chan_get_parent (sess->res->tab), newdata_list);
- }
+ if (chan_is_collapsed (sess->res->tab)
+ && !((server_sess->tab_state & TAB_STATE_NEW_MSG)
+ || (server_sess->tab_state & TAB_STATE_NEW_HILIGHT))
+ && !(server_sess == current_tab))
+ {
+ server_sess->tab_state = TAB_STATE_NEW_DATA;
+ chan_set_color (chan_get_parent (sess->res->tab), newdata_list);
+ }
- break;
- case 2: /* new message arrived in channel (light red) */
- if (col_shouldoverride || !(sess->tab_state & TAB_STATE_NEW_HILIGHT)) {
- sess->tab_state = TAB_STATE_NEW_MSG;
- chan_set_color (sess->res->tab, newmsg_list);
- }
+ break;
+ case 2: /* new message arrived in channel (light red) */
+ if (col_shouldoverride || !(sess->tab_state & TAB_STATE_NEW_HILIGHT)) {
+ sess->tab_state = TAB_STATE_NEW_MSG;
+ chan_set_color (sess->res->tab, newmsg_list);
+ }
- if (chan_is_collapsed (sess->res->tab)
- && !(server_sess->tab_state & TAB_STATE_NEW_HILIGHT)
- && !(server_sess == current_tab))
- {
- server_sess->tab_state = TAB_STATE_NEW_MSG;
- chan_set_color (chan_get_parent (sess->res->tab), newmsg_list);
- }
+ if (chan_is_collapsed (sess->res->tab)
+ && !(server_sess->tab_state & TAB_STATE_NEW_HILIGHT)
+ && !(server_sess == current_tab))
+ {
+ server_sess->tab_state = TAB_STATE_NEW_MSG;
+ chan_set_color (chan_get_parent (sess->res->tab), newmsg_list);
+ }
- break;
- case 3: /* your nick has been seen (blue) */
- sess->tab_state = TAB_STATE_NEW_HILIGHT;
- chan_set_color (sess->res->tab, nickseen_list);
+ break;
+ case 3: /* your nick has been seen (blue) */
+ sess->tab_state = TAB_STATE_NEW_HILIGHT;
+ chan_set_color (sess->res->tab, nickseen_list);
- if (chan_is_collapsed (sess->res->tab) && !(server_sess == current_tab))
- {
- server_sess->tab_state = TAB_STATE_NEW_MSG;
- chan_set_color (chan_get_parent (sess->res->tab), nickseen_list);
- }
+ if (chan_is_collapsed (sess->res->tab) && !(server_sess == current_tab))
+ {
+ server_sess->tab_state = TAB_STATE_NEW_MSG;
+ chan_set_color (chan_get_parent (sess->res->tab), nickseen_list);
+ }
- break;
- }
- lastact_update (sess);
- sess->last_tab_state = sess->tab_state; /* For plugins handling future prints */
- }
+ break;
+ }
+ lastact_update (sess);
+ sess->last_tab_state = sess->tab_state; /* For plugins handling future prints */
+ }
}
static void
mg_set_myself_away (session_gui *gui, gboolean away)
{
- gtk_label_set_attributes (GTK_LABEL (gtk_bin_get_child (GTK_BIN (gui->nick_label))),
- away ? away_list : NULL);
+ gtk_label_set_attributes (GTK_LABEL (gtk_bin_get_child (GTK_BIN (gui->nick_label))),
+ away ? away_list : NULL);
}
/* change the little icon to the left of your nickname */
@@ -250,248 +257,248 @@ mg_set_myself_away (session_gui *gui, gboolean away)
void
mg_set_access_icon (session_gui *gui, GdkPixbuf *pix, gboolean away)
{
- if (gui->op_xpm)
- {
- if (pix == gtk_image_get_pixbuf (GTK_IMAGE (gui->op_xpm))) /* no change? */
- {
- mg_set_myself_away (gui, away);
- return;
- }
+ if (gui->op_xpm)
+ {
+ if (pix == gtk_image_get_pixbuf (GTK_IMAGE (gui->op_xpm))) /* no change? */
+ {
+ mg_set_myself_away (gui, away);
+ return;
+ }
- gtk_widget_destroy (gui->op_xpm);
- gui->op_xpm = NULL;
- }
+ gtk_widget_destroy (gui->op_xpm);
+ gui->op_xpm = NULL;
+ }
- if (pix && prefs.hex_gui_input_icon)
- {
- gui->op_xpm = gtk_image_new_from_pixbuf (pix);
- gtk_box_pack_start (GTK_BOX (gui->nick_box), gui->op_xpm, 0, 0, 0);
- gtk_widget_show (gui->op_xpm);
- }
+ if (pix && prefs.hex_gui_input_icon)
+ {
+ gui->op_xpm = gtk_image_new_from_pixbuf (pix);
+ gtk_box_pack_start (GTK_BOX (gui->nick_box), gui->op_xpm, 0, 0, 0);
+ gtk_widget_show (gui->op_xpm);
+ }
- mg_set_myself_away (gui, away);
+ mg_set_myself_away (gui, away);
}
static gboolean
mg_inputbox_focus (GtkWidget *widget, GdkEventFocus *event, session_gui *gui)
{
- GSList *list;
- session *sess;
+ GSList *list;
+ session *sess;
- if (gui->is_tab)
- return FALSE;
+ if (gui->is_tab)
+ return FALSE;
- list = sess_list;
- while (list)
- {
- sess = list->data;
- if (sess->gui == gui)
- {
- current_sess = sess;
- if (!sess->server->server_session)
- sess->server->server_session = sess;
- break;
- }
- list = list->next;
- }
+ list = sess_list;
+ while (list)
+ {
+ sess = list->data;
+ if (sess->gui == gui)
+ {
+ current_sess = sess;
+ if (!sess->server->server_session)
+ sess->server->server_session = sess;
+ break;
+ }
+ list = list->next;
+ }
- return FALSE;
+ return FALSE;
}
void
mg_inputbox_cb (GtkWidget *igad, session_gui *gui)
{
- char *cmd;
- static int ignore = FALSE;
- GSList *list;
- session *sess = NULL;
+ char *cmd;
+ static int ignore = FALSE;
+ GSList *list;
+ session *sess = NULL;
- if (ignore)
- return;
+ if (ignore)
+ return;
- cmd = SPELL_ENTRY_GET_TEXT (igad);
- if (cmd[0] == 0)
- return;
+ cmd = SPELL_ENTRY_GET_TEXT (igad);
+ if (cmd[0] == 0)
+ return;
- cmd = g_strdup (cmd);
+ cmd = g_strdup (cmd);
- /* avoid recursive loop */
- ignore = TRUE;
- SPELL_ENTRY_SET_TEXT (igad, "");
- ignore = FALSE;
+ /* avoid recursive loop */
+ ignore = TRUE;
+ SPELL_ENTRY_SET_TEXT (igad, "");
+ ignore = FALSE;
- /* where did this event come from? */
- if (gui->is_tab)
- {
- sess = current_tab;
- } else
- {
- list = sess_list;
- while (list)
- {
- sess = list->data;
- if (sess->gui == gui)
- break;
- list = list->next;
- }
- if (!list)
- sess = NULL;
- }
+ /* where did this event come from? */
+ if (gui->is_tab)
+ {
+ sess = current_tab;
+ } else
+ {
+ list = sess_list;
+ while (list)
+ {
+ sess = list->data;
+ if (sess->gui == gui)
+ break;
+ list = list->next;
+ }
+ if (!list)
+ sess = NULL;
+ }
- if (sess)
- handle_multiline (sess, cmd, TRUE, FALSE);
+ if (sess)
+ handle_multiline (sess, cmd, TRUE, FALSE);
- g_free (cmd);
+ g_free (cmd);
}
static gboolean
mg_spellcheck_cb (SexySpellEntry *entry, gchar *word, gpointer data)
{
- /* This can cause freezes on long words, nicks arn't very long anyway. */
- if (strlen (word) > 20)
- return TRUE;
+ /* This can cause freezes on long words, nicks arn't very long anyway. */
+ if (strlen (word) > 20)
+ return TRUE;
- /* Ignore anything we think is a valid url */
- if (url_check_word (word) != 0)
- return FALSE;
+ /* Ignore anything we think is a valid url */
+ if (url_check_word (word) != 0)
+ return FALSE;
- return TRUE;
+ return TRUE;
}
#if 0
static gboolean
has_key (char *modes)
{
- if (!modes)
- return FALSE;
- /* this is a crude check, but "-k" can't exist, so it works. */
- while (*modes)
- {
- if (*modes == 'k')
- return TRUE;
- if (*modes == ' ')
- return FALSE;
- modes++;
- }
- return FALSE;
+ if (!modes)
+ return FALSE;
+ /* this is a crude check, but "-k" can't exist, so it works. */
+ while (*modes)
+ {
+ if (*modes == 'k')
+ return TRUE;
+ if (*modes == ' ')
+ return FALSE;
+ modes++;
+ }
+ return FALSE;
}
#endif
void
fe_set_title (session *sess)
{
- char tbuf[512];
- int type;
+ char tbuf[512];
+ int type;
- if (sess->gui->is_tab && sess != current_tab)
- return;
+ if (sess->gui->is_tab && sess != current_tab)
+ return;
- type = sess->type;
+ type = sess->type;
- if (sess->server->connected == FALSE && sess->type != SESS_DIALOG)
- goto def;
+ if (sess->server->connected == FALSE && sess->type != SESS_DIALOG)
+ goto def;
- switch (type)
- {
- case SESS_DIALOG:
- g_snprintf (tbuf, sizeof (tbuf), "%s %s @ %s - %s",
- _("Dialog with"), sess->channel, server_get_network (sess->server, TRUE),
- _(DISPLAY_NAME));
- break;
- case SESS_SERVER:
- g_snprintf (tbuf, sizeof (tbuf), "%s%s%s - %s",
- prefs.hex_gui_win_nick ? sess->server->nick : "",
- prefs.hex_gui_win_nick ? " @ " : "", server_get_network (sess->server, TRUE),
- _(DISPLAY_NAME));
- break;
- case SESS_CHANNEL:
- /* don't display keys in the titlebar */
- g_snprintf (tbuf, sizeof (tbuf),
- "%s%s%s / %s%s%s%s - %s",
- prefs.hex_gui_win_nick ? sess->server->nick : "",
- prefs.hex_gui_win_nick ? " @ " : "",
- server_get_network (sess->server, TRUE), sess->channel,
- prefs.hex_gui_win_modes && sess->current_modes ? " (" : "",
- prefs.hex_gui_win_modes && sess->current_modes ? sess->current_modes : "",
- prefs.hex_gui_win_modes && sess->current_modes ? ")" : "",
- _(DISPLAY_NAME));
- if (prefs.hex_gui_win_ucount)
- {
- g_snprintf (tbuf + strlen (tbuf), 9, " (%d)", sess->total);
- }
- break;
- case SESS_NOTICES:
- case SESS_SNOTICES:
- g_snprintf (tbuf, sizeof (tbuf), "%s%s%s (notices) - %s",
- prefs.hex_gui_win_nick ? sess->server->nick : "",
- prefs.hex_gui_win_nick ? " @ " : "", server_get_network (sess->server, TRUE),
- _(DISPLAY_NAME));
- break;
- default:
- def:
- g_snprintf (tbuf, sizeof (tbuf), _(DISPLAY_NAME));
- gtk_window_set_title (GTK_WINDOW (sess->gui->window), tbuf);
- return;
- }
+ switch (type)
+ {
+ case SESS_DIALOG:
+ g_snprintf (tbuf, sizeof (tbuf), "%s %s @ %s - %s",
+ _("Dialog with"), sess->channel, server_get_network (sess->server, TRUE),
+ _(DISPLAY_NAME));
+ break;
+ case SESS_SERVER:
+ g_snprintf (tbuf, sizeof (tbuf), "%s%s%s - %s",
+ prefs.hex_gui_win_nick ? sess->server->nick : "",
+ prefs.hex_gui_win_nick ? " @ " : "", server_get_network (sess->server, TRUE),
+ _(DISPLAY_NAME));
+ break;
+ case SESS_CHANNEL:
+ /* don't display keys in the titlebar */
+ g_snprintf (tbuf, sizeof (tbuf),
+ "%s%s%s / %s%s%s%s - %s",
+ prefs.hex_gui_win_nick ? sess->server->nick : "",
+ prefs.hex_gui_win_nick ? " @ " : "",
+ server_get_network (sess->server, TRUE), sess->channel,
+ prefs.hex_gui_win_modes && sess->current_modes ? " (" : "",
+ prefs.hex_gui_win_modes && sess->current_modes ? sess->current_modes : "",
+ prefs.hex_gui_win_modes && sess->current_modes ? ")" : "",
+ _(DISPLAY_NAME));
+ if (prefs.hex_gui_win_ucount)
+ {
+ g_snprintf (tbuf + strlen (tbuf), 9, " (%d)", sess->total);
+ }
+ break;
+ case SESS_NOTICES:
+ case SESS_SNOTICES:
+ g_snprintf (tbuf, sizeof (tbuf), "%s%s%s (notices) - %s",
+ prefs.hex_gui_win_nick ? sess->server->nick : "",
+ prefs.hex_gui_win_nick ? " @ " : "", server_get_network (sess->server, TRUE),
+ _(DISPLAY_NAME));
+ break;
+ default:
+ def:
+ g_snprintf (tbuf, sizeof (tbuf), _(DISPLAY_NAME));
+ gtk_window_set_title (GTK_WINDOW (sess->gui->window), tbuf);
+ return;
+ }
- gtk_window_set_title (GTK_WINDOW (sess->gui->window), tbuf);
+ gtk_window_set_title (GTK_WINDOW (sess->gui->window), tbuf);
}
static gboolean
mg_windowstate_cb (GtkWindow *wid, GdkEventWindowState *event, gpointer userdata)
{
- if ((event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) &&
- (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) &&
- prefs.hex_gui_tray_minimize && prefs.hex_gui_tray &&
- gtkutil_tray_icon_supported (wid))
- {
- tray_toggle_visibility (TRUE);
- gtk_window_deiconify (wid);
- }
+ if ((event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) &&
+ (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) &&
+ prefs.hex_gui_tray_minimize && prefs.hex_gui_tray &&
+ gtkutil_tray_icon_supported (wid))
+ {
+ tray_toggle_visibility (TRUE);
+ gtk_window_deiconify (wid);
+ }
- prefs.hex_gui_win_state = 0;
- if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED)
- prefs.hex_gui_win_state = 1;
+ prefs.hex_gui_win_state = 0;
+ if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED)
+ prefs.hex_gui_win_state = 1;
- prefs.hex_gui_win_fullscreen = 0;
- if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)
- prefs.hex_gui_win_fullscreen = 1;
+ prefs.hex_gui_win_fullscreen = 0;
+ if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)
+ prefs.hex_gui_win_fullscreen = 1;
- menu_set_fullscreen (current_sess->gui, prefs.hex_gui_win_fullscreen);
+ menu_set_fullscreen (current_sess->gui, prefs.hex_gui_win_fullscreen);
- return FALSE;
+ return FALSE;
}
static gboolean
mg_configure_cb (GtkWidget *wid, GdkEventConfigure *event, session *sess)
{
- if (sess == NULL) /* for the main_window */
- {
- if (mg_gui)
- {
- if (prefs.hex_gui_win_save && !prefs.hex_gui_win_state && !prefs.hex_gui_win_fullscreen)
- {
- sess = current_sess;
- gtk_window_get_position (GTK_WINDOW (wid), &prefs.hex_gui_win_left,
- &prefs.hex_gui_win_top);
- gtk_window_get_size (GTK_WINDOW (wid), &prefs.hex_gui_win_width,
- &prefs.hex_gui_win_height);
- }
- }
- }
+ if (sess == NULL) /* for the main_window */
+ {
+ if (mg_gui)
+ {
+ if (prefs.hex_gui_win_save && !prefs.hex_gui_win_state && !prefs.hex_gui_win_fullscreen)
+ {
+ sess = current_sess;
+ gtk_window_get_position (GTK_WINDOW (wid), &prefs.hex_gui_win_left,
+ &prefs.hex_gui_win_top);
+ gtk_window_get_size (GTK_WINDOW (wid), &prefs.hex_gui_win_width,
+ &prefs.hex_gui_win_height);
+ }
+ }
+ }
- if (sess)
- {
- if (sess->type == SESS_DIALOG && prefs.hex_gui_win_save)
- {
- gtk_window_get_position (GTK_WINDOW (wid), &prefs.hex_gui_dialog_left,
- &prefs.hex_gui_dialog_top);
- gtk_window_get_size (GTK_WINDOW (wid), &prefs.hex_gui_dialog_width,
- &prefs.hex_gui_dialog_height);
- }
- }
+ if (sess)
+ {
+ if (sess->type == SESS_DIALOG && prefs.hex_gui_win_save)
+ {
+ gtk_window_get_position (GTK_WINDOW (wid), &prefs.hex_gui_dialog_left,
+ &prefs.hex_gui_dialog_top);
+ gtk_window_get_size (GTK_WINDOW (wid), &prefs.hex_gui_dialog_width,
+ &prefs.hex_gui_dialog_height);
+ }
+ }
- return FALSE;
+ return FALSE;
}
/* move to a non-irc tab */
@@ -499,21 +506,21 @@ mg_configure_cb (GtkWidget *wid, GdkEventConfigure *event, session *sess)
static void
mg_show_generic_tab (GtkWidget *box)
{
- int num;
- GtkWidget *f = NULL;
+ int num;
+ GtkWidget *f = NULL;
- if (current_sess && gtk_widget_has_focus (current_sess->gui->input_box))
- f = current_sess->gui->input_box;
+ if (current_sess && gtk_widget_has_focus (current_sess->gui->input_box))
+ f = current_sess->gui->input_box;
- num = gtk_notebook_page_num (GTK_NOTEBOOK (mg_gui->note_book), box);
- gtk_notebook_set_current_page (GTK_NOTEBOOK (mg_gui->note_book), num);
- gtk_tree_view_set_model (GTK_TREE_VIEW (mg_gui->user_tree), NULL);
- gtk_window_set_title (GTK_WINDOW (mg_gui->window),
- g_object_get_data (G_OBJECT (box), "title"));
- gtk_widget_set_sensitive (mg_gui->menu, FALSE);
+ num = gtk_notebook_page_num (GTK_NOTEBOOK (mg_gui->note_book), box);
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (mg_gui->note_book), num);
+ gtk_tree_view_set_model (GTK_TREE_VIEW (mg_gui->user_tree), NULL);
+ gtk_window_set_title (GTK_WINDOW (mg_gui->window),
+ g_object_get_data (G_OBJECT (box), "title"));
+ gtk_widget_set_sensitive (mg_gui->menu, FALSE);
- if (f)
- gtk_widget_grab_focus (f);
+ if (f)
+ gtk_widget_grab_focus (f);
}
/* a channel has been focused */
@@ -521,74 +528,74 @@ mg_show_generic_tab (GtkWidget *box)
static void
mg_focus (session *sess)
{
- if (sess->gui->is_tab)
- current_tab = sess;
- current_sess = sess;
+ if (sess->gui->is_tab)
+ current_tab = sess;
+ current_sess = sess;
- /* dirty trick to avoid auto-selection */
- SPELL_ENTRY_SET_EDITABLE (sess->gui->input_box, FALSE);
- gtk_widget_grab_focus (sess->gui->input_box);
- SPELL_ENTRY_SET_EDITABLE (sess->gui->input_box, TRUE);
+ /* dirty trick to avoid auto-selection */
+ SPELL_ENTRY_SET_EDITABLE (sess->gui->input_box, FALSE);
+ gtk_widget_grab_focus (sess->gui->input_box);
+ SPELL_ENTRY_SET_EDITABLE (sess->gui->input_box, TRUE);
- sess->server->front_session = sess;
+ sess->server->front_session = sess;
- if (sess->server->server_session != NULL)
- {
- if (sess->server->server_session->type != SESS_SERVER)
- sess->server->server_session = sess;
- } else
- {
- sess->server->server_session = sess;
- }
+ if (sess->server->server_session != NULL)
+ {
+ if (sess->server->server_session->type != SESS_SERVER)
+ sess->server->server_session = sess;
+ } else
+ {
+ sess->server->server_session = sess;
+ }
- /* when called via mg_changui_new, is_tab might be true, but
- sess->res->tab is still NULL. */
- if (sess->res->tab)
- fe_set_tab_color (sess, FE_COLOR_NONE);
+ /* when called via mg_changui_new, is_tab might be true, but
+ sess->res->tab is still NULL. */
+ if (sess->res->tab)
+ fe_set_tab_color (sess, FE_COLOR_NONE);
}
static int
mg_progressbar_update (GtkWidget *bar)
{
- static int type = 0;
- static gdouble pos = 0;
+ static int type = 0;
+ static gdouble pos = 0;
- pos += 0.05;
- if (pos >= 0.99)
- {
- if (type == 0)
- {
- type = 1;
- gtk_progress_bar_set_orientation ((GtkProgressBar *) bar,
- GTK_PROGRESS_RIGHT_TO_LEFT);
- } else
- {
- type = 0;
- gtk_progress_bar_set_orientation ((GtkProgressBar *) bar,
- GTK_PROGRESS_LEFT_TO_RIGHT);
- }
- pos = 0.05;
- }
- gtk_progress_bar_set_fraction ((GtkProgressBar *) bar, pos);
- return 1;
+ pos += 0.05;
+ if (pos >= 0.99)
+ {
+ if (type == 0)
+ {
+ type = 1;
+ gtk_progress_bar_set_orientation ((GtkProgressBar *) bar,
+ GTK_PROGRESS_RIGHT_TO_LEFT);
+ } else
+ {
+ type = 0;
+ gtk_progress_bar_set_orientation ((GtkProgressBar *) bar,
+ GTK_PROGRESS_LEFT_TO_RIGHT);
+ }
+ pos = 0.05;
+ }
+ gtk_progress_bar_set_fraction ((GtkProgressBar *) bar, pos);
+ return 1;
}
void
mg_progressbar_create (session_gui *gui)
{
- gui->bar = gtk_progress_bar_new ();
- gtk_box_pack_start (GTK_BOX (gui->nick_box), gui->bar, 0, 0, 0);
- gtk_widget_show (gui->bar);
- gui->bartag = fe_timeout_add (50, mg_progressbar_update, gui->bar);
+ gui->bar = gtk_progress_bar_new ();
+ gtk_box_pack_start (GTK_BOX (gui->nick_box), gui->bar, 0, 0, 0);
+ gtk_widget_show (gui->bar);
+ gui->bartag = fe_timeout_add (50, mg_progressbar_update, gui->bar);
}
void
mg_progressbar_destroy (session_gui *gui)
{
- fe_timeout_remove (gui->bartag);
- gtk_widget_destroy (gui->bar);
- gui->bar = 0;
- gui->bartag = 0;
+ fe_timeout_remove (gui->bartag);
+ gtk_widget_destroy (gui->bar);
+ gui->bar = 0;
+ gui->bartag = 0;
}
/* switching tabs away from this one, so remember some info about it! */
@@ -596,176 +603,176 @@ mg_progressbar_destroy (session_gui *gui)
static void
mg_unpopulate (session *sess)
{
- restore_gui *res;
- session_gui *gui;
- int i;
+ restore_gui *res;
+ session_gui *gui;
+ int i;
- gui = sess->gui;
- res = sess->res;
+ gui = sess->gui;
+ res = sess->res;
- res->input_text = g_strdup (SPELL_ENTRY_GET_TEXT (gui->input_box));
- res->topic_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (gui->topic_entry)));
- res->limit_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (gui->limit_entry)));
- res->key_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (gui->key_entry)));
- if (gui->laginfo)
- res->lag_text = g_strdup (gtk_label_get_text (GTK_LABEL (gui->laginfo)));
- if (gui->throttleinfo)
- res->queue_text = g_strdup (gtk_label_get_text (GTK_LABEL (gui->throttleinfo)));
+ res->input_text = g_strdup (SPELL_ENTRY_GET_TEXT (gui->input_box));
+ res->topic_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (gui->topic_entry)));
+ res->limit_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (gui->limit_entry)));
+ res->key_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (gui->key_entry)));
+ if (gui->laginfo)
+ res->lag_text = g_strdup (gtk_label_get_text (GTK_LABEL (gui->laginfo)));
+ if (gui->throttleinfo)
+ res->queue_text = g_strdup (gtk_label_get_text (GTK_LABEL (gui->throttleinfo)));
- for (i = 0; i < NUM_FLAG_WIDS - 1; i++)
- res->flag_wid_state[i] = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gui->flag_wid[i]));
+ for (i = 0; i < NUM_FLAG_WIDS - 1; i++)
+ res->flag_wid_state[i] = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gui->flag_wid[i]));
- res->old_ul_value = userlist_get_value (gui->user_tree);
- if (gui->lagometer)
- res->lag_value = gtk_progress_bar_get_fraction (
- GTK_PROGRESS_BAR (gui->lagometer));
- if (gui->throttlemeter)
- res->queue_value = gtk_progress_bar_get_fraction (
- GTK_PROGRESS_BAR (gui->throttlemeter));
+ res->old_ul_value = userlist_get_value (gui->user_tree);
+ if (gui->lagometer)
+ res->lag_value = gtk_progress_bar_get_fraction (
+ GTK_PROGRESS_BAR (gui->lagometer));
+ if (gui->throttlemeter)
+ res->queue_value = gtk_progress_bar_get_fraction (
+ GTK_PROGRESS_BAR (gui->throttlemeter));
- if (gui->bar)
- {
- res->c_graph = TRUE; /* still have a graph, just not visible now */
- mg_progressbar_destroy (gui);
- }
+ if (gui->bar)
+ {
+ res->c_graph = TRUE; /* still have a graph, just not visible now */
+ mg_progressbar_destroy (gui);
+ }
}
static void
mg_restore_label (GtkWidget *label, char **text)
{
- if (!label)
- return;
+ if (!label)
+ return;
- if (*text)
- {
- gtk_label_set_text (GTK_LABEL (label), *text);
- g_free (*text);
- *text = NULL;
- } else
- {
- gtk_label_set_text (GTK_LABEL (label), "");
- }
+ if (*text)
+ {
+ gtk_label_set_text (GTK_LABEL (label), *text);
+ g_free (*text);
+ *text = NULL;
+ } else
+ {
+ gtk_label_set_text (GTK_LABEL (label), "");
+ }
}
static void
mg_restore_entry (GtkWidget *entry, char **text)
{
- if (*text)
- {
- gtk_entry_set_text (GTK_ENTRY (entry), *text);
- g_free (*text);
- *text = NULL;
- } else
- {
- gtk_entry_set_text (GTK_ENTRY (entry), "");
- }
- gtk_editable_set_position (GTK_EDITABLE (entry), -1);
+ if (*text)
+ {
+ gtk_entry_set_text (GTK_ENTRY (entry), *text);
+ g_free (*text);
+ *text = NULL;
+ } else
+ {
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+ }
+ gtk_editable_set_position (GTK_EDITABLE (entry), -1);
}
static void
mg_restore_speller (GtkWidget *entry, char **text)
{
- if (*text)
- {
- SPELL_ENTRY_SET_TEXT (entry, *text);
- g_free (*text);
- *text = NULL;
- } else
- {
- SPELL_ENTRY_SET_TEXT (entry, "");
- }
- SPELL_ENTRY_SET_POS (entry, -1);
+ if (*text)
+ {
+ SPELL_ENTRY_SET_TEXT (entry, *text);
+ g_free (*text);
+ *text = NULL;
+ } else
+ {
+ SPELL_ENTRY_SET_TEXT (entry, "");
+ }
+ SPELL_ENTRY_SET_POS (entry, -1);
}
void
mg_set_topic_tip (session *sess)
{
- char *text;
+ char *text;
- switch (sess->type)
- {
- case SESS_CHANNEL:
- if (sess->topic)
- {
- text = g_strdup_printf (_("Topic for %s is: %s"), sess->channel,
- sess->topic);
- gtk_widget_set_tooltip_text (sess->gui->topic_entry, text);
- g_free (text);
- } else
- gtk_widget_set_tooltip_text (sess->gui->topic_entry, _("No topic is set"));
- break;
- default:
- if (gtk_entry_get_text (GTK_ENTRY (sess->gui->topic_entry)) &&
- gtk_entry_get_text (GTK_ENTRY (sess->gui->topic_entry))[0])
- gtk_widget_set_tooltip_text (sess->gui->topic_entry, (char *)gtk_entry_get_text (GTK_ENTRY (sess->gui->topic_entry)));
- else
- gtk_widget_set_tooltip_text (sess->gui->topic_entry, NULL);
- }
+ switch (sess->type)
+ {
+ case SESS_CHANNEL:
+ if (sess->topic)
+ {
+ text = g_strdup_printf (_("Topic for %s is: %s"), sess->channel,
+ sess->topic);
+ gtk_widget_set_tooltip_text (sess->gui->topic_entry, text);
+ g_free (text);
+ } else
+ gtk_widget_set_tooltip_text (sess->gui->topic_entry, _("No topic is set"));
+ break;
+ default:
+ if (gtk_entry_get_text (GTK_ENTRY (sess->gui->topic_entry)) &&
+ gtk_entry_get_text (GTK_ENTRY (sess->gui->topic_entry))[0])
+ gtk_widget_set_tooltip_text (sess->gui->topic_entry, (char *)gtk_entry_get_text (GTK_ENTRY (sess->gui->topic_entry)));
+ else
+ gtk_widget_set_tooltip_text (sess->gui->topic_entry, NULL);
+ }
}
static void
mg_hide_empty_pane (GtkPaned *pane)
{
- if ((gtk_paned_get_child1 (pane) == NULL || !gtk_widget_get_visible (gtk_paned_get_child1 (pane))) &&
- (gtk_paned_get_child2 (pane) == NULL || !gtk_widget_get_visible (gtk_paned_get_child2 (pane))))
- {
- gtk_widget_hide (GTK_WIDGET (pane));
- return;
- }
+ if ((gtk_paned_get_child1 (pane) == NULL || !gtk_widget_get_visible (gtk_paned_get_child1 (pane))) &&
+ (gtk_paned_get_child2 (pane) == NULL || !gtk_widget_get_visible (gtk_paned_get_child2 (pane))))
+ {
+ gtk_widget_hide (GTK_WIDGET (pane));
+ return;
+ }
- gtk_widget_show (GTK_WIDGET (pane));
+ gtk_widget_show (GTK_WIDGET (pane));
}
static void
mg_hide_empty_boxes (session_gui *gui)
{
- /* hide empty vpanes - so the handle is not shown */
- mg_hide_empty_pane ((GtkPaned*)gui->vpane_right);
- mg_hide_empty_pane ((GtkPaned*)gui->vpane_left);
+ /* hide empty vpanes - so the handle is not shown */
+ mg_hide_empty_pane ((GtkPaned*)gui->vpane_right);
+ mg_hide_empty_pane ((GtkPaned*)gui->vpane_left);
}
static void
mg_userlist_showhide (session *sess, int show)
{
- session_gui *gui = sess->gui;
- int handle_size;
- int right_size;
- GtkAllocation allocation;
+ session_gui *gui = sess->gui;
+ int handle_size;
+ int right_size;
+ GtkAllocation allocation;
- right_size = MAX (prefs.hex_gui_pane_right_size, prefs.hex_gui_pane_right_size_min);
+ right_size = MAX (prefs.hex_gui_pane_right_size, prefs.hex_gui_pane_right_size_min);
- if (show)
- {
- gtk_widget_show (gui->user_box);
- gui->ul_hidden = 0;
+ if (show)
+ {
+ gtk_widget_show (gui->user_box);
+ gui->ul_hidden = 0;
- gtk_widget_get_allocation (gui->hpane_right, &allocation);
- gtk_widget_style_get (GTK_WIDGET (gui->hpane_right), "handle-size", &handle_size, NULL);
- gtk_paned_set_position (GTK_PANED (gui->hpane_right), allocation.width - (right_size + handle_size));
- }
- else
- {
- gtk_widget_hide (gui->user_box);
- gui->ul_hidden = 1;
- }
+ gtk_widget_get_allocation (gui->hpane_right, &allocation);
+ gtk_widget_style_get (GTK_WIDGET (gui->hpane_right), "handle-size", &handle_size, NULL);
+ gtk_paned_set_position (GTK_PANED (gui->hpane_right), allocation.width - (right_size + handle_size));
+ }
+ else
+ {
+ gtk_widget_hide (gui->user_box);
+ gui->ul_hidden = 1;
+ }
- mg_hide_empty_boxes (gui);
+ mg_hide_empty_boxes (gui);
}
static gboolean
mg_is_userlist_and_tree_combined (void)
{
- if (prefs.hex_gui_tab_pos == POS_TOPLEFT && prefs.hex_gui_ulist_pos == POS_BOTTOMLEFT)
- return TRUE;
- if (prefs.hex_gui_tab_pos == POS_BOTTOMLEFT && prefs.hex_gui_ulist_pos == POS_TOPLEFT)
- return TRUE;
+ if (prefs.hex_gui_tab_pos == POS_TOPLEFT && prefs.hex_gui_ulist_pos == POS_BOTTOMLEFT)
+ return TRUE;
+ if (prefs.hex_gui_tab_pos == POS_BOTTOMLEFT && prefs.hex_gui_ulist_pos == POS_TOPLEFT)
+ return TRUE;
- if (prefs.hex_gui_tab_pos == POS_TOPRIGHT && prefs.hex_gui_ulist_pos == POS_BOTTOMRIGHT)
- return TRUE;
- if (prefs.hex_gui_tab_pos == POS_BOTTOMRIGHT && prefs.hex_gui_ulist_pos == POS_TOPRIGHT)
- return TRUE;
+ if (prefs.hex_gui_tab_pos == POS_TOPRIGHT && prefs.hex_gui_ulist_pos == POS_BOTTOMRIGHT)
+ return TRUE;
+ if (prefs.hex_gui_tab_pos == POS_BOTTOMRIGHT && prefs.hex_gui_ulist_pos == POS_TOPRIGHT)
+ return TRUE;
- return FALSE;
+ return FALSE;
}
/* decide if the userlist should be shown or hidden for this tab */
@@ -773,30 +780,30 @@ mg_is_userlist_and_tree_combined (void)
void
mg_decide_userlist (session *sess, gboolean switch_to_current)
{
- /* when called from menu.c we need this */
- if (sess->gui == mg_gui && switch_to_current)
- sess = current_tab;
+ /* when called from menu.c we need this */
+ if (sess->gui == mg_gui && switch_to_current)
+ sess = current_tab;
- if (prefs.hex_gui_ulist_hide)
- {
- mg_userlist_showhide (sess, FALSE);
- return;
- }
+ if (prefs.hex_gui_ulist_hide)
+ {
+ mg_userlist_showhide (sess, FALSE);
+ return;
+ }
- switch (sess->type)
- {
- case SESS_SERVER:
- case SESS_DIALOG:
- case SESS_NOTICES:
- case SESS_SNOTICES:
- if (mg_is_userlist_and_tree_combined ())
- mg_userlist_showhide (sess, TRUE); /* show */
- else
- mg_userlist_showhide (sess, FALSE); /* hide */
- break;
- default:
- mg_userlist_showhide (sess, TRUE); /* show */
- }
+ switch (sess->type)
+ {
+ case SESS_SERVER:
+ case SESS_DIALOG:
+ case SESS_NOTICES:
+ case SESS_SNOTICES:
+ if (mg_is_userlist_and_tree_combined ())
+ mg_userlist_showhide (sess, TRUE); /* show */
+ else
+ mg_userlist_showhide (sess, FALSE); /* hide */
+ break;
+ default:
+ mg_userlist_showhide (sess, TRUE); /* show */
+ }
}
static int ul_tag = 0;
@@ -804,21 +811,21 @@ static int ul_tag = 0;
static gboolean
mg_populate_userlist (session *sess)
{
- if (!sess)
- sess = current_tab;
+ if (!sess)
+ sess = current_tab;
- if (is_session (sess))
- {
- if (sess->type == SESS_DIALOG)
- mg_set_access_icon (sess->gui, NULL, sess->server->is_away);
- else
- mg_set_access_icon (sess->gui, get_user_icon (sess->server, sess->me), sess->server->is_away);
- userlist_show (sess);
- userlist_set_value (sess->gui->user_tree, sess->res->old_ul_value);
- }
+ if (is_session (sess))
+ {
+ if (sess->type == SESS_DIALOG)
+ mg_set_access_icon (sess->gui, NULL, sess->server->is_away);
+ else
+ mg_set_access_icon (sess->gui, get_user_icon (sess->server, sess->me), sess->server->is_away);
+ userlist_show (sess);
+ userlist_set_value (sess->gui->user_tree, sess->res->old_ul_value);
+ }
- ul_tag = 0;
- return 0;
+ ul_tag = 0;
+ return 0;
}
/* fill the irc tab with a new channel */
@@ -826,168 +833,168 @@ mg_populate_userlist (session *sess)
static void
mg_populate (session *sess)
{
- session_gui *gui = sess->gui;
- restore_gui *res = sess->res;
- int i, render = TRUE;
- guint16 vis = gui->ul_hidden;
- GtkAllocation allocation;
+ session_gui *gui = sess->gui;
+ restore_gui *res = sess->res;
+ int i, render = TRUE;
+ guint16 vis = gui->ul_hidden;
+ GtkAllocation allocation;
- switch (sess->type)
- {
- case SESS_DIALOG:
- /* show the dialog buttons */
- gtk_widget_show (gui->dialogbutton_box);
- /* hide the chan-mode buttons */
- gtk_widget_hide (gui->topicbutton_box);
- /* hide the userlist */
- mg_decide_userlist (sess, FALSE);
- /* shouldn't edit the topic */
- gtk_editable_set_editable (GTK_EDITABLE (gui->topic_entry), FALSE);
- /* might be hidden from server tab */
- if (prefs.hex_gui_topicbar)
- gtk_widget_show (gui->topic_bar);
- break;
- case SESS_SERVER:
- if (prefs.hex_gui_mode_buttons)
- gtk_widget_show (gui->topicbutton_box);
- /* hide the dialog buttons */
- gtk_widget_hide (gui->dialogbutton_box);
- /* hide the userlist */
- mg_decide_userlist (sess, FALSE);
- /* servers don't have topics */
- gtk_widget_hide (gui->topic_bar);
- break;
- default:
- /* hide the dialog buttons */
- gtk_widget_hide (gui->dialogbutton_box);
- if (prefs.hex_gui_mode_buttons)
- gtk_widget_show (gui->topicbutton_box);
- /* show the userlist */
- mg_decide_userlist (sess, FALSE);
- /* let the topic be editted */
- gtk_editable_set_editable (GTK_EDITABLE (gui->topic_entry), TRUE);
- if (prefs.hex_gui_topicbar)
- gtk_widget_show (gui->topic_bar);
- }
+ switch (sess->type)
+ {
+ case SESS_DIALOG:
+ /* show the dialog buttons */
+ gtk_widget_show (gui->dialogbutton_box);
+ /* hide the chan-mode buttons */
+ gtk_widget_hide (gui->topicbutton_box);
+ /* hide the userlist */
+ mg_decide_userlist (sess, FALSE);
+ /* shouldn't edit the topic */
+ gtk_editable_set_editable (GTK_EDITABLE (gui->topic_entry), FALSE);
+ /* might be hidden from server tab */
+ if (prefs.hex_gui_topicbar)
+ gtk_widget_show (gui->topic_bar);
+ break;
+ case SESS_SERVER:
+ if (prefs.hex_gui_mode_buttons)
+ gtk_widget_show (gui->topicbutton_box);
+ /* hide the dialog buttons */
+ gtk_widget_hide (gui->dialogbutton_box);
+ /* hide the userlist */
+ mg_decide_userlist (sess, FALSE);
+ /* servers don't have topics */
+ gtk_widget_hide (gui->topic_bar);
+ break;
+ default:
+ /* hide the dialog buttons */
+ gtk_widget_hide (gui->dialogbutton_box);
+ if (prefs.hex_gui_mode_buttons)
+ gtk_widget_show (gui->topicbutton_box);
+ /* show the userlist */
+ mg_decide_userlist (sess, FALSE);
+ /* let the topic be editted */
+ gtk_editable_set_editable (GTK_EDITABLE (gui->topic_entry), TRUE);
+ if (prefs.hex_gui_topicbar)
+ gtk_widget_show (gui->topic_bar);
+ }
- /* move to THE irc tab */
- if (gui->is_tab)
- gtk_notebook_set_current_page (GTK_NOTEBOOK (gui->note_book), 0);
+ /* move to THE irc tab */
+ if (gui->is_tab)
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (gui->note_book), 0);
- /* xtext size change? Then don't render, wait for the expose caused
+ /* xtext size change? Then don't render, wait for the expose caused
by showing/hidding the userlist */
- gtk_widget_get_allocation (gui->user_box, &allocation);
- if (vis != gui->ul_hidden && allocation.width > 1)
- render = FALSE;
+ gtk_widget_get_allocation (gui->user_box, &allocation);
+ if (vis != gui->ul_hidden && allocation.width > 1)
+ render = FALSE;
- gtk_xtext_buffer_show (GTK_XTEXT (gui->xtext), res->buffer, render);
+ gtk_xtext_buffer_show (GTK_XTEXT (gui->xtext), res->buffer, render);
- if (gui->is_tab)
- gtk_widget_set_sensitive (gui->menu, TRUE);
+ if (gui->is_tab)
+ gtk_widget_set_sensitive (gui->menu, TRUE);
- /* restore all the GtkEntry's */
- mg_restore_entry (gui->topic_entry, &res->topic_text);
- mg_restore_speller (gui->input_box, &res->input_text);
- mg_restore_entry (gui->key_entry, &res->key_text);
- mg_restore_entry (gui->limit_entry, &res->limit_text);
- mg_restore_label (gui->laginfo, &res->lag_text);
- mg_restore_label (gui->throttleinfo, &res->queue_text);
+ /* restore all the GtkEntry's */
+ mg_restore_entry (gui->topic_entry, &res->topic_text);
+ mg_restore_speller (gui->input_box, &res->input_text);
+ mg_restore_entry (gui->key_entry, &res->key_text);
+ mg_restore_entry (gui->limit_entry, &res->limit_text);
+ mg_restore_label (gui->laginfo, &res->lag_text);
+ mg_restore_label (gui->throttleinfo, &res->queue_text);
- mg_focus (sess);
- fe_set_title (sess);
+ mg_focus (sess);
+ fe_set_title (sess);
- /* this one flickers, so only change if necessary */
- if (strcmp (sess->server->nick, gtk_button_get_label (GTK_BUTTON (gui->nick_label))) != 0)
- gtk_button_set_label (GTK_BUTTON (gui->nick_label), sess->server->nick);
+ /* this one flickers, so only change if necessary */
+ if (strcmp (sess->server->nick, gtk_button_get_label (GTK_BUTTON (gui->nick_label))) != 0)
+ gtk_button_set_label (GTK_BUTTON (gui->nick_label), sess->server->nick);
- /* this is slow, so make it a timeout event */
- if (!gui->is_tab)
- {
- mg_populate_userlist (sess);
- } else
- {
- if (ul_tag == 0)
- ul_tag = g_idle_add ((GSourceFunc)mg_populate_userlist, NULL);
- }
+ /* this is slow, so make it a timeout event */
+ if (!gui->is_tab)
+ {
+ mg_populate_userlist (sess);
+ } else
+ {
+ if (ul_tag == 0)
+ ul_tag = g_idle_add ((GSourceFunc)mg_populate_userlist, NULL);
+ }
- fe_userlist_numbers (sess);
+ fe_userlist_numbers (sess);
- /* restore all the channel mode buttons */
- ignore_chanmode = TRUE;
- for (i = 0; i < NUM_FLAG_WIDS - 1; i++)
- {
- /* Hide if mode not supported */
- if (sess->server && strchr (sess->server->chanmodes, chan_flags[i]) == NULL)
- gtk_widget_hide (sess->gui->flag_wid[i]);
- else
- gtk_widget_show (sess->gui->flag_wid[i]);
+ /* restore all the channel mode buttons */
+ ignore_chanmode = TRUE;
+ for (i = 0; i < NUM_FLAG_WIDS - 1; i++)
+ {
+ /* Hide if mode not supported */
+ if (sess->server && strchr (sess->server->chanmodes, chan_flags[i]) == NULL)
+ gtk_widget_hide (sess->gui->flag_wid[i]);
+ else
+ gtk_widget_show (sess->gui->flag_wid[i]);
- /* Update state */
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gui->flag_wid[i]),
- res->flag_wid_state[i]);
- }
- ignore_chanmode = FALSE;
+ /* Update state */
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gui->flag_wid[i]),
+ res->flag_wid_state[i]);
+ }
+ ignore_chanmode = FALSE;
- if (gui->lagometer)
- {
- gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (gui->lagometer),
- res->lag_value);
- if (res->lag_tip)
- gtk_widget_set_tooltip_text (gtk_widget_get_parent (sess->gui->lagometer), res->lag_tip);
- }
- if (gui->throttlemeter)
- {
- gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (gui->throttlemeter),
- res->queue_value);
- if (res->queue_tip)
- gtk_widget_set_tooltip_text (gtk_widget_get_parent (sess->gui->throttlemeter), res->queue_tip);
- }
+ if (gui->lagometer)
+ {
+ gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (gui->lagometer),
+ res->lag_value);
+ if (res->lag_tip)
+ gtk_widget_set_tooltip_text (gtk_widget_get_parent (sess->gui->lagometer), res->lag_tip);
+ }
+ if (gui->throttlemeter)
+ {
+ gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (gui->throttlemeter),
+ res->queue_value);
+ if (res->queue_tip)
+ gtk_widget_set_tooltip_text (gtk_widget_get_parent (sess->gui->throttlemeter), res->queue_tip);
+ }
- /* did this tab have a connecting graph? restore it.. */
- if (res->c_graph)
- {
- res->c_graph = FALSE;
- mg_progressbar_create (gui);
- }
+ /* did this tab have a connecting graph? restore it.. */
+ if (res->c_graph)
+ {
+ res->c_graph = FALSE;
+ mg_progressbar_create (gui);
+ }
- /* menu items */
- menu_set_away (gui, sess->server->is_away);
- gtk_widget_set_sensitive (gui->menu_item[MENU_ID_AWAY], sess->server->connected);
- gtk_widget_set_sensitive (gui->menu_item[MENU_ID_JOIN], sess->server->end_of_motd);
- gtk_widget_set_sensitive (gui->menu_item[MENU_ID_DISCONNECT],
- sess->server->connected || sess->server->recondelay_tag);
+ /* menu items */
+ menu_set_away (gui, sess->server->is_away);
+ gtk_widget_set_sensitive (gui->menu_item[MENU_ID_AWAY], sess->server->connected);
+ gtk_widget_set_sensitive (gui->menu_item[MENU_ID_JOIN], sess->server->end_of_motd);
+ gtk_widget_set_sensitive (gui->menu_item[MENU_ID_DISCONNECT],
+ sess->server->connected || sess->server->recondelay_tag);
- mg_set_topic_tip (sess);
+ mg_set_topic_tip (sess);
- plugin_emit_dummy_print (sess, "Focus Tab");
+ plugin_emit_dummy_print (sess, "Focus Tab");
}
void
-mg_bring_tofront_sess (session *sess) /* IRC tab or window */
+mg_bring_tofront_sess (session *sess) /* IRC tab or window */
{
- if (sess->gui->is_tab)
- chan_focus (sess->res->tab);
- else
- gtk_window_present (GTK_WINDOW (sess->gui->window));
+ if (sess->gui->is_tab)
+ chan_focus (sess->res->tab);
+ else
+ gtk_window_present (GTK_WINDOW (sess->gui->window));
}
void
-mg_bring_tofront (GtkWidget *vbox) /* non-IRC tab or window */
+mg_bring_tofront (GtkWidget *vbox) /* non-IRC tab or window */
{
- chan *ch;
+ chan *ch;
- ch = g_object_get_data (G_OBJECT (vbox), "ch");
- if (ch)
- chan_focus (ch);
- else
- gtk_window_present (GTK_WINDOW (gtk_widget_get_toplevel (vbox)));
+ ch = g_object_get_data (G_OBJECT (vbox), "ch");
+ if (ch)
+ chan_focus (ch);
+ else
+ gtk_window_present (GTK_WINDOW (gtk_widget_get_toplevel (vbox)));
}
void
mg_switch_page (int relative, int num)
{
- if (mg_gui)
- chanview_move_focus (mg_gui->chanview, relative, num);
+ if (mg_gui)
+ chanview_move_focus (mg_gui->chanview, relative, num);
}
/* a toplevel IRC window was destroyed */
@@ -995,8 +1002,8 @@ mg_switch_page (int relative, int num)
static void
mg_topdestroy_cb (GtkWidget *win, session *sess)
{
-/* printf("enter mg_topdestroy. sess %p was destroyed\n", sess);*/
- session_free (sess); /* tell zoitechat.c about it */
+/* printf("enter mg_topdestroy. sess %p was destroyed\n", sess);*/
+ session_free (sess); /* tell zoitechat.c about it */
}
/* cleanup an IRC tab */
@@ -1004,305 +1011,305 @@ mg_topdestroy_cb (GtkWidget *win, session *sess)
static void
mg_ircdestroy (session *sess)
{
- GSList *list;
+ GSList *list;
- session_free (sess); /* tell zoitechat.c about it */
+ session_free (sess); /* tell zoitechat.c about it */
- if (mg_gui == NULL)
- {
-/* puts("-> mg_gui is already NULL");*/
- return;
- }
+ if (mg_gui == NULL)
+ {
+/* puts("-> mg_gui is already NULL");*/
+ return;
+ }
- list = sess_list;
- while (list)
- {
- sess = list->data;
- if (sess->gui->is_tab)
- {
-/* puts("-> some tabs still remain");*/
- return;
- }
- list = list->next;
- }
+ list = sess_list;
+ while (list)
+ {
+ sess = list->data;
+ if (sess->gui->is_tab)
+ {
+/* puts("-> some tabs still remain");*/
+ return;
+ }
+ list = list->next;
+ }
-/* puts("-> no tabs left, killing main tabwindow");*/
- gtk_widget_destroy (mg_gui->window);
- active_tab = NULL;
- mg_gui = NULL;
- parent_window = NULL;
+/* puts("-> no tabs left, killing main tabwindow");*/
+ gtk_widget_destroy (mg_gui->window);
+ active_tab = NULL;
+ mg_gui = NULL;
+ parent_window = NULL;
}
static void
mg_tab_close_cb (GtkWidget *dialog, gint arg1, session *sess)
{
- GSList *list, *next;
+ GSList *list, *next;
- gtk_widget_destroy (dialog);
- if (arg1 == GTK_RESPONSE_OK && is_session (sess))
- {
- /* force it NOT to send individual PARTs */
- sess->server->sent_quit = TRUE;
+ gtk_widget_destroy (dialog);
+ if (arg1 == GTK_RESPONSE_OK && is_session (sess))
+ {
+ /* force it NOT to send individual PARTs */
+ sess->server->sent_quit = TRUE;
- for (list = sess_list; list;)
- {
- next = list->next;
- if (((session *)list->data)->server == sess->server &&
- ((session *)list->data) != sess)
- fe_close_window ((session *)list->data);
- list = next;
- }
+ for (list = sess_list; list;)
+ {
+ next = list->next;
+ if (((session *)list->data)->server == sess->server &&
+ ((session *)list->data) != sess)
+ fe_close_window ((session *)list->data);
+ list = next;
+ }
- /* just send one QUIT - better for BNCs */
- sess->server->sent_quit = FALSE;
- fe_close_window (sess);
- }
+ /* just send one QUIT - better for BNCs */
+ sess->server->sent_quit = FALSE;
+ fe_close_window (sess);
+ }
}
void
mg_tab_close (session *sess)
{
- GtkWidget *dialog;
- GSList *list;
- int i;
+ GtkWidget *dialog;
+ GSList *list;
+ int i;
- if (chan_remove (sess->res->tab, FALSE))
- {
- sess->res->tab = NULL;
- mg_ircdestroy (sess);
- }
- else
- {
- for (i = 0, list = sess_list; list; list = list->next)
- {
- session *s = (session*)list->data;
- if (s->server == sess->server && (s->type == SESS_CHANNEL || s->type == SESS_DIALOG))
- i++;
- }
- dialog = gtk_message_dialog_new (GTK_WINDOW (parent_window), 0,
- GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL,
- _("This server still has %d channels or dialogs associated with it. "
- "Close them all?"), i);
- g_signal_connect (G_OBJECT (dialog), "response",
- G_CALLBACK (mg_tab_close_cb), sess);
- if (prefs.hex_gui_tab_layout)
- {
- gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
- }
- else
- {
- gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
- }
- gtk_widget_show (dialog);
- }
+ if (chan_remove (sess->res->tab, FALSE))
+ {
+ sess->res->tab = NULL;
+ mg_ircdestroy (sess);
+ }
+ else
+ {
+ for (i = 0, list = sess_list; list; list = list->next)
+ {
+ session *s = (session*)list->data;
+ if (s->server == sess->server && (s->type == SESS_CHANNEL || s->type == SESS_DIALOG))
+ i++;
+ }
+ dialog = gtk_message_dialog_new (GTK_WINDOW (parent_window), 0,
+ GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL,
+ _("This server still has %d channels or dialogs associated with it. "
+ "Close them all?"), i);
+ g_signal_connect (G_OBJECT (dialog), "response",
+ G_CALLBACK (mg_tab_close_cb), sess);
+ if (prefs.hex_gui_tab_layout)
+ {
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
+ }
+ else
+ {
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
+ }
+ gtk_widget_show (dialog);
+ }
}
static void
mg_menu_destroy (GtkWidget *menu, gpointer userdata)
{
- gtk_widget_destroy (menu);
- g_object_unref (menu);
+ gtk_widget_destroy (menu);
+ g_object_unref (menu);
}
void
mg_create_icon_item (char *label, char *stock, GtkWidget *menu,
- void *callback, void *userdata)
+ void *callback, void *userdata)
{
- GtkWidget *item;
+ GtkWidget *item;
- item = create_icon_menu (label, stock, TRUE);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (callback),
- userdata);
- gtk_widget_show (item);
+ item = create_icon_menu (label, stock, TRUE);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (callback),
+ userdata);
+ gtk_widget_show (item);
}
static int
mg_count_networks (void)
{
- int cons = 0;
- GSList *list;
+ int cons = 0;
+ GSList *list;
- for (list = serv_list; list; list = list->next)
- {
- if (((server *)list->data)->connected)
- cons++;
- }
- return cons;
+ for (list = serv_list; list; list = list->next)
+ {
+ if (((server *)list->data)->connected)
+ cons++;
+ }
+ return cons;
}
static int
mg_count_dccs (void)
{
- GSList *list;
- struct DCC *dcc;
- int dccs = 0;
+ GSList *list;
+ struct DCC *dcc;
+ int dccs = 0;
- list = dcc_list;
- while (list)
- {
- dcc = list->data;
- if ((dcc->type == TYPE_SEND || dcc->type == TYPE_RECV) &&
- dcc->dccstat == STAT_ACTIVE)
- dccs++;
- list = list->next;
- }
+ list = dcc_list;
+ while (list)
+ {
+ dcc = list->data;
+ if ((dcc->type == TYPE_SEND || dcc->type == TYPE_RECV) &&
+ dcc->dccstat == STAT_ACTIVE)
+ dccs++;
+ list = list->next;
+ }
- return dccs;
+ return dccs;
}
void
mg_open_quit_dialog (gboolean minimize_button)
{
- static GtkWidget *dialog = NULL;
- GtkWidget *dialog_vbox1;
- GtkWidget *table1;
- GtkWidget *image;
- GtkWidget *checkbutton1;
- GtkWidget *label;
- GtkWidget *dialog_action_area1;
- GtkWidget *button;
- char *text, *connecttext;
- int cons;
- int dccs;
+ static GtkWidget *dialog = NULL;
+ GtkWidget *dialog_vbox1;
+ GtkWidget *table1;
+ GtkWidget *image;
+ GtkWidget *checkbutton1;
+ GtkWidget *label;
+ GtkWidget *dialog_action_area1;
+ GtkWidget *button;
+ char *text, *connecttext;
+ int cons;
+ int dccs;
- if (dialog)
- {
- gtk_window_present (GTK_WINDOW (dialog));
- return;
- }
+ if (dialog)
+ {
+ gtk_window_present (GTK_WINDOW (dialog));
+ return;
+ }
- dccs = mg_count_dccs ();
- cons = mg_count_networks ();
- if (dccs + cons == 0 || !prefs.hex_gui_quit_dialog)
- {
- zoitechat_exit ();
- return;
- }
+ dccs = mg_count_dccs ();
+ cons = mg_count_networks ();
+ if (dccs + cons == 0 || !prefs.hex_gui_quit_dialog)
+ {
+ zoitechat_exit ();
+ return;
+ }
- dialog = gtk_dialog_new ();
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
- gtk_window_set_title (GTK_WINDOW (dialog), _("Quit ZoiteChat?"));
- gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent_window));
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+ dialog = gtk_dialog_new ();
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Quit ZoiteChat?"));
+ gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent_window));
+ gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
- dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
- gtk_widget_show (dialog_vbox1);
+ dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+ gtk_widget_show (dialog_vbox1);
- table1 = gtk_table_new (2, 2, FALSE);
- gtk_widget_show (table1);
- gtk_box_pack_start (GTK_BOX (dialog_vbox1), table1, TRUE, TRUE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (table1), 6);
- gtk_table_set_row_spacings (GTK_TABLE (table1), 12);
- gtk_table_set_col_spacings (GTK_TABLE (table1), 12);
+ table1 = gtk_table_new (2, 2, FALSE);
+ gtk_widget_show (table1);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox1), table1, TRUE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (table1), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table1), 12);
+ gtk_table_set_col_spacings (GTK_TABLE (table1), 12);
- image = gtk_image_new_from_stock ("gtk-dialog-warning", GTK_ICON_SIZE_DIALOG);
- gtk_widget_show (image);
- gtk_table_attach (GTK_TABLE (table1), image, 0, 1, 0, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (GTK_FILL), 0, 0);
+ image = gtk_image_new_from_stock ("gtk-dialog-warning", GTK_ICON_SIZE_DIALOG);
+ gtk_widget_show (image);
+ gtk_table_attach (GTK_TABLE (table1), image, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
- checkbutton1 = gtk_check_button_new_with_mnemonic (_("Don't ask next time."));
- gtk_widget_show (checkbutton1);
- gtk_table_attach (GTK_TABLE (table1), checkbutton1, 0, 2, 1, 2,
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
- (GtkAttachOptions) (0), 0, 4);
+ checkbutton1 = gtk_check_button_new_with_mnemonic (_("Don't ask next time."));
+ gtk_widget_show (checkbutton1);
+ gtk_table_attach (GTK_TABLE (table1), checkbutton1, 0, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 4);
- connecttext = g_strdup_printf (_("You are connected to %i IRC networks."), cons);
- text = g_strdup_printf ("%s\n\n%s\n%s",
- _("Are you sure you want to quit?"),
- cons ? connecttext : "",
- dccs ? _("Some file transfers are still active.") : "");
- g_free (connecttext);
- label = gtk_label_new (text);
- g_free (text);
- gtk_widget_show (label);
- gtk_table_attach (GTK_TABLE (table1), label, 1, 2, 0, 1,
- (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
- (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK), 0, 0);
- gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+ connecttext = g_strdup_printf (_("You are connected to %i IRC networks."), cons);
+ text = g_strdup_printf ("%s\n\n%s\n%s",
+ _("Are you sure you want to quit?"),
+ cons ? connecttext : "",
+ dccs ? _("Some file transfers are still active.") : "");
+ g_free (connecttext);
+ label = gtk_label_new (text);
+ g_free (text);
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table1), label, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK), 0, 0);
+ gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
- dialog_action_area1 = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
- gtk_widget_show (dialog_action_area1);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1),
- GTK_BUTTONBOX_END);
+ dialog_action_area1 = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
+ gtk_widget_show (dialog_action_area1);
+ gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1),
+ GTK_BUTTONBOX_END);
- if (minimize_button && gtkutil_tray_icon_supported (GTK_WINDOW(dialog)))
- {
- button = gtk_button_new_with_mnemonic (_("_Minimize to Tray"));
- gtk_widget_show (button);
- gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, 1);
- }
+ if (minimize_button && gtkutil_tray_icon_supported (GTK_WINDOW(dialog)))
+ {
+ button = gtk_button_new_with_mnemonic (_("_Minimize to Tray"));
+ gtk_widget_show (button);
+ gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, 1);
+ }
- button = gtk_button_new_from_stock ("gtk-cancel");
- gtk_widget_show (button);
- gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button,
- GTK_RESPONSE_CANCEL);
- gtk_widget_grab_focus (button);
+ button = gtk_button_new_from_stock ("gtk-cancel");
+ gtk_widget_show (button);
+ gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button,
+ GTK_RESPONSE_CANCEL);
+ gtk_widget_grab_focus (button);
- button = gtk_button_new_from_stock ("gtk-quit");
- gtk_widget_show (button);
- gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, 0);
+ button = gtk_button_new_from_stock ("gtk-quit");
+ gtk_widget_show (button);
+ gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, 0);
- gtk_widget_show (dialog);
+ gtk_widget_show (dialog);
- switch (gtk_dialog_run (GTK_DIALOG (dialog)))
- {
- case 0:
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton1)))
- prefs.hex_gui_quit_dialog = 0;
- zoitechat_exit ();
- break;
- case 1: /* minimize to tray */
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton1)))
- {
- prefs.hex_gui_tray_close = 1;
- /*prefs.hex_gui_quit_dialog = 0;*/
- }
- /* force tray icon ON, if not already */
- if (!prefs.hex_gui_tray)
- {
- prefs.hex_gui_tray = 1;
- tray_apply_setup ();
- }
- tray_toggle_visibility (TRUE);
- break;
- }
+ switch (gtk_dialog_run (GTK_DIALOG (dialog)))
+ {
+ case 0:
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton1)))
+ prefs.hex_gui_quit_dialog = 0;
+ zoitechat_exit ();
+ break;
+ case 1: /* minimize to tray */
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton1)))
+ {
+ prefs.hex_gui_tray_close = 1;
+ /*prefs.hex_gui_quit_dialog = 0;*/
+ }
+ /* force tray icon ON, if not already */
+ if (!prefs.hex_gui_tray)
+ {
+ prefs.hex_gui_tray = 1;
+ tray_apply_setup ();
+ }
+ tray_toggle_visibility (TRUE);
+ break;
+ }
- gtk_widget_destroy (dialog);
- dialog = NULL;
+ gtk_widget_destroy (dialog);
+ dialog = NULL;
}
void
mg_close_sess (session *sess)
{
- if (sess_list->next == NULL)
- {
- mg_open_quit_dialog (FALSE);
- return;
- }
+ if (sess_list->next == NULL)
+ {
+ mg_open_quit_dialog (FALSE);
+ return;
+ }
- fe_close_window (sess);
+ fe_close_window (sess);
}
static int
mg_chan_remove (chan *ch)
{
- /* remove the tab from chanview */
- chan_remove (ch, TRUE);
- /* any tabs left? */
- if (chanview_get_size (mg_gui->chanview) < 1)
- {
- /* if not, destroy the main tab window */
- gtk_widget_destroy (mg_gui->window);
- current_tab = NULL;
- active_tab = NULL;
- mg_gui = NULL;
- parent_window = NULL;
- return TRUE;
- }
- return FALSE;
+ /* remove the tab from chanview */
+ chan_remove (ch, TRUE);
+ /* any tabs left? */
+ if (chanview_get_size (mg_gui->chanview) < 1)
+ {
+ /* if not, destroy the main tab window */
+ gtk_widget_destroy (mg_gui->window);
+ current_tab = NULL;
+ active_tab = NULL;
+ mg_gui = NULL;
+ parent_window = NULL;
+ return TRUE;
+ }
+ return FALSE;
}
/* destroy non-irc tab/window */
@@ -1310,18 +1317,18 @@ mg_chan_remove (chan *ch)
static void
mg_close_gen (chan *ch, GtkWidget *box)
{
- if (!ch)
- ch = g_object_get_data (G_OBJECT (box), "ch");
- if (ch)
- {
- /* remove from notebook */
- gtk_widget_destroy (box);
- /* remove the tab from chanview */
- mg_chan_remove (ch);
- } else
- {
- gtk_widget_destroy (gtk_widget_get_toplevel (box));
- }
+ if (!ch)
+ ch = g_object_get_data (G_OBJECT (box), "ch");
+ if (ch)
+ {
+ /* remove from notebook */
+ gtk_widget_destroy (box);
+ /* remove the tab from chanview */
+ mg_chan_remove (ch);
+ } else
+ {
+ gtk_widget_destroy (gtk_widget_get_toplevel (box));
+ }
}
/* the "X" close button has been pressed (tab-view) */
@@ -1329,354 +1336,354 @@ mg_close_gen (chan *ch, GtkWidget *box)
static void
mg_xbutton_cb (chanview *cv, chan *ch, int tag, gpointer userdata)
{
- if (tag == TAG_IRC) /* irc tab */
- mg_close_sess (userdata);
- else /* non-irc utility tab */
- mg_close_gen (ch, userdata);
+ if (tag == TAG_IRC) /* irc tab */
+ mg_close_sess (userdata);
+ else /* non-irc utility tab */
+ mg_close_gen (ch, userdata);
}
static void
mg_link_gentab (chan *ch, GtkWidget *box)
{
- int num;
- GtkWidget *win;
+ int num;
+ GtkWidget *win;
- g_object_ref (box);
+ g_object_ref (box);
- num = gtk_notebook_page_num (GTK_NOTEBOOK (mg_gui->note_book), box);
- gtk_notebook_remove_page (GTK_NOTEBOOK (mg_gui->note_book), num);
- mg_chan_remove (ch);
+ num = gtk_notebook_page_num (GTK_NOTEBOOK (mg_gui->note_book), box);
+ gtk_notebook_remove_page (GTK_NOTEBOOK (mg_gui->note_book), num);
+ mg_chan_remove (ch);
- win = gtkutil_window_new (g_object_get_data (G_OBJECT (box), "title"), "",
- GPOINTER_TO_INT (g_object_get_data (G_OBJECT (box), "w")),
- GPOINTER_TO_INT (g_object_get_data (G_OBJECT (box), "h")),
- 2);
- /* so it doesn't try to chan_remove (there's no tab anymore) */
- g_object_steal_data (G_OBJECT (box), "ch");
- gtk_container_set_border_width (GTK_CONTAINER (box), 0);
- gtk_container_add (GTK_CONTAINER (win), box);
- gtk_widget_show (win);
+ win = gtkutil_window_new (g_object_get_data (G_OBJECT (box), "title"), "",
+ GPOINTER_TO_INT (g_object_get_data (G_OBJECT (box), "w")),
+ GPOINTER_TO_INT (g_object_get_data (G_OBJECT (box), "h")),
+ 2);
+ /* so it doesn't try to chan_remove (there's no tab anymore) */
+ g_object_steal_data (G_OBJECT (box), "ch");
+ gtk_container_set_border_width (GTK_CONTAINER (box), 0);
+ gtk_container_add (GTK_CONTAINER (win), box);
+ gtk_widget_show (win);
- g_object_unref (box);
+ g_object_unref (box);
}
static void
mg_detach_tab_cb (GtkWidget *item, chan *ch)
{
- if (chan_get_tag (ch) == TAG_IRC) /* IRC tab */
- {
- /* userdata is session * */
- mg_link_irctab (chan_get_userdata (ch), 1);
- return;
- }
+ if (chan_get_tag (ch) == TAG_IRC) /* IRC tab */
+ {
+ /* userdata is session * */
+ mg_link_irctab (chan_get_userdata (ch), 1);
+ return;
+ }
- /* userdata is GtkWidget * */
- mg_link_gentab (ch, chan_get_userdata (ch)); /* non-IRC tab */
+ /* userdata is GtkWidget * */
+ mg_link_gentab (ch, chan_get_userdata (ch)); /* non-IRC tab */
}
static void
mg_destroy_tab_cb (GtkWidget *item, chan *ch)
{
- /* treat it just like the X button press */
- mg_xbutton_cb (mg_gui->chanview, ch, chan_get_tag (ch), chan_get_userdata (ch));
+ /* treat it just like the X button press */
+ mg_xbutton_cb (mg_gui->chanview, ch, chan_get_tag (ch), chan_get_userdata (ch));
}
static void
mg_color_insert (GtkWidget *item, gpointer userdata)
{
- char buf[32];
- char *text;
- int num = GPOINTER_TO_INT (userdata);
+ char buf[32];
+ char *text;
+ int num = GPOINTER_TO_INT (userdata);
- if (num > 99)
- {
- switch (num)
- {
- case 100:
- text = "\002"; break;
- case 101:
- text = "\037"; break;
- case 102:
- text = "\035"; break;
- case 103:
- text = "\036"; break;
- default:
- text = "\017"; break;
- }
- key_action_insert (current_sess->gui->input_box, 0, text, 0, 0);
- } else
- {
- sprintf (buf, "\003%02d", num);
- key_action_insert (current_sess->gui->input_box, 0, buf, 0, 0);
- }
+ if (num > 99)
+ {
+ switch (num)
+ {
+ case 100:
+ text = "\002"; break;
+ case 101:
+ text = "\037"; break;
+ case 102:
+ text = "\035"; break;
+ case 103:
+ text = "\036"; break;
+ default:
+ text = "\017"; break;
+ }
+ key_action_insert (current_sess->gui->input_box, 0, text, 0, 0);
+ } else
+ {
+ sprintf (buf, "\003%02d", num);
+ key_action_insert (current_sess->gui->input_box, 0, buf, 0, 0);
+ }
}
static void
mg_markup_item (GtkWidget *menu, char *text, int arg)
{
- GtkWidget *item;
+ GtkWidget *item;
- item = gtk_menu_item_new_with_label ("");
- gtk_label_set_markup (GTK_LABEL (gtk_bin_get_child (GTK_BIN (item))), text);
- g_signal_connect (G_OBJECT (item), "activate",
- G_CALLBACK (mg_color_insert), GINT_TO_POINTER (arg));
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
+ item = gtk_menu_item_new_with_label ("");
+ gtk_label_set_markup (GTK_LABEL (gtk_bin_get_child (GTK_BIN (item))), text);
+ g_signal_connect (G_OBJECT (item), "activate",
+ G_CALLBACK (mg_color_insert), GINT_TO_POINTER (arg));
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
}
GtkWidget *
mg_submenu (GtkWidget *menu, char *text)
{
- GtkWidget *submenu, *item;
+ GtkWidget *submenu, *item;
- item = gtk_menu_item_new_with_mnemonic (text);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
+ item = gtk_menu_item_new_with_mnemonic (text);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
- submenu = gtk_menu_new ();
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu);
- gtk_widget_show (submenu);
+ submenu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu);
+ gtk_widget_show (submenu);
- return submenu;
+ return submenu;
}
static void
mg_create_color_menu (GtkWidget *menu, session *sess)
{
- GtkWidget *submenu;
- GtkWidget *subsubmenu;
- char buf[256];
- int i;
+ GtkWidget *submenu;
+ GtkWidget *subsubmenu;
+ char buf[256];
+ int i;
- submenu = mg_submenu (menu, _("Insert Attribute or Color Code"));
+ submenu = mg_submenu (menu, _("Insert Attribute or Color Code"));
- mg_markup_item (submenu, _("Bold"), 100);
- mg_markup_item (submenu, _("Underline"), 101);
- mg_markup_item (submenu, _("Italic"), 102);
- mg_markup_item (submenu, _("Strikethrough"), 103);
- mg_markup_item (submenu, _("Normal"), 999);
+ mg_markup_item (submenu, _("Bold"), 100);
+ mg_markup_item (submenu, _("Underline"), 101);
+ mg_markup_item (submenu, _("Italic"), 102);
+ mg_markup_item (submenu, _("Strikethrough"), 103);
+ mg_markup_item (submenu, _("Normal"), 999);
- subsubmenu = mg_submenu (submenu, _("Colors 0-7"));
+ subsubmenu = mg_submenu (submenu, _("Colors 0-7"));
- for (i = 0; i < 8; i++)
- {
- sprintf (buf, "%02d "
- " ",
- i, colors[i].red >> 8, colors[i].green >> 8, colors[i].blue >> 8);
- mg_markup_item (subsubmenu, buf, i);
- }
+ for (i = 0; i < 8; i++)
+ {
+ sprintf (buf, "%02d "
+ " ",
+ i, colors[i].red >> 8, colors[i].green >> 8, colors[i].blue >> 8);
+ mg_markup_item (subsubmenu, buf, i);
+ }
- subsubmenu = mg_submenu (submenu, _("Colors 8-15"));
+ subsubmenu = mg_submenu (submenu, _("Colors 8-15"));
- for (i = 8; i < 16; i++)
- {
- sprintf (buf, "%02d "
- " ",
- i, colors[i].red >> 8, colors[i].green >> 8, colors[i].blue >> 8);
- mg_markup_item (subsubmenu, buf, i);
- }
+ for (i = 8; i < 16; i++)
+ {
+ sprintf (buf, "%02d "
+ " ",
+ i, colors[i].red >> 8, colors[i].green >> 8, colors[i].blue >> 8);
+ mg_markup_item (subsubmenu, buf, i);
+ }
}
static void
mg_set_guint8 (GtkCheckMenuItem *item, guint8 *setting)
{
- session *sess = current_sess;
- guint8 logging = sess->text_logging;
+ session *sess = current_sess;
+ guint8 logging = sess->text_logging;
- *setting = SET_OFF;
- if (gtk_check_menu_item_get_active (item))
- *setting = SET_ON;
+ *setting = SET_OFF;
+ if (gtk_check_menu_item_get_active (item))
+ *setting = SET_ON;
- /* has the logging setting changed? */
- if (logging != sess->text_logging)
- log_open_or_close (sess);
+ /* has the logging setting changed? */
+ if (logging != sess->text_logging)
+ log_open_or_close (sess);
- chanopt_save (sess);
- chanopt_save_all (FALSE);
+ chanopt_save (sess);
+ chanopt_save_all (FALSE);
}
static void
mg_perchan_menu_item (char *label, GtkWidget *menu, guint8 *setting, guint global)
{
- guint8 initial_value = *setting;
+ guint8 initial_value = *setting;
- /* if it's using global value, use that as initial state */
- if (initial_value == SET_DEFAULT)
- initial_value = global;
+ /* if it's using global value, use that as initial state */
+ if (initial_value == SET_DEFAULT)
+ initial_value = global;
- menu_toggle_item (label, menu, mg_set_guint8, setting, initial_value);
+ menu_toggle_item (label, menu, mg_set_guint8, setting, initial_value);
}
static void
mg_create_perchannelmenu (session *sess, GtkWidget *menu)
{
- GtkWidget *submenu;
+ GtkWidget *submenu;
- submenu = menu_quick_sub (_("_Settings"), menu, NULL, XCMENU_MNEMONIC, -1);
+ submenu = menu_quick_sub (_("_Settings"), menu, NULL, XCMENU_MNEMONIC, -1);
- mg_perchan_menu_item (_("_Log to Disk"), submenu, &sess->text_logging, prefs.hex_irc_logging);
- mg_perchan_menu_item (_("_Reload Scrollback"), submenu, &sess->text_scrollback, prefs.hex_text_replay);
- if (sess->type == SESS_CHANNEL)
- {
- mg_perchan_menu_item (_("Strip _Colors"), submenu, &sess->text_strip, prefs.hex_text_stripcolor_msg);
- mg_perchan_menu_item (_("_Hide Join/Part Messages"), submenu, &sess->text_hidejoinpart, prefs.hex_irc_conf_mode);
- }
+ mg_perchan_menu_item (_("_Log to Disk"), submenu, &sess->text_logging, prefs.hex_irc_logging);
+ mg_perchan_menu_item (_("_Reload Scrollback"), submenu, &sess->text_scrollback, prefs.hex_text_replay);
+ if (sess->type == SESS_CHANNEL)
+ {
+ mg_perchan_menu_item (_("Strip _Colors"), submenu, &sess->text_strip, prefs.hex_text_stripcolor_msg);
+ mg_perchan_menu_item (_("_Hide Join/Part Messages"), submenu, &sess->text_hidejoinpart, prefs.hex_irc_conf_mode);
+ }
}
static void
mg_create_alertmenu (session *sess, GtkWidget *menu)
{
- GtkWidget *submenu;
- int hex_balloon, hex_beep, hex_tray, hex_flash;
+ GtkWidget *submenu;
+ int hex_balloon, hex_beep, hex_tray, hex_flash;
- switch (sess->type) {
- case SESS_DIALOG:
- hex_balloon = prefs.hex_input_balloon_priv;
- hex_beep = prefs.hex_input_beep_priv;
- hex_tray = prefs.hex_input_tray_priv;
- hex_flash = prefs.hex_input_flash_priv;
- break;
- default:
- hex_balloon = prefs.hex_input_balloon_chans;
- hex_beep = prefs.hex_input_beep_chans;
- hex_tray = prefs.hex_input_tray_chans;
- hex_flash = prefs.hex_input_flash_chans;
- }
+ switch (sess->type) {
+ case SESS_DIALOG:
+ hex_balloon = prefs.hex_input_balloon_priv;
+ hex_beep = prefs.hex_input_beep_priv;
+ hex_tray = prefs.hex_input_tray_priv;
+ hex_flash = prefs.hex_input_flash_priv;
+ break;
+ default:
+ hex_balloon = prefs.hex_input_balloon_chans;
+ hex_beep = prefs.hex_input_beep_chans;
+ hex_tray = prefs.hex_input_tray_chans;
+ hex_flash = prefs.hex_input_flash_chans;
+ }
- submenu = menu_quick_sub(_("_Extra Alerts"), menu, NULL, XCMENU_MNEMONIC, -1);
+ submenu = menu_quick_sub(_("_Extra Alerts"), menu, NULL, XCMENU_MNEMONIC, -1);
- mg_perchan_menu_item(_("Show Notifications"), submenu, &sess->alert_balloon, hex_balloon);
+ mg_perchan_menu_item(_("Show Notifications"), submenu, &sess->alert_balloon, hex_balloon);
- mg_perchan_menu_item(_("Beep on _Message"), submenu, &sess->alert_beep, hex_beep);
+ mg_perchan_menu_item(_("Beep on _Message"), submenu, &sess->alert_beep, hex_beep);
- mg_perchan_menu_item(_("Blink Tray _Icon"), submenu, &sess->alert_tray, hex_tray);
+ mg_perchan_menu_item(_("Blink Tray _Icon"), submenu, &sess->alert_tray, hex_tray);
- mg_perchan_menu_item(_("Blink Task _Bar"), submenu, &sess->alert_taskbar, hex_flash);
+ mg_perchan_menu_item(_("Blink Task _Bar"), submenu, &sess->alert_taskbar, hex_flash);
}
static void
mg_create_tabmenu (session *sess, GdkEventButton *event, chan *ch)
{
- GtkWidget *menu, *item;
- char buf[256];
+ GtkWidget *menu, *item;
+ char buf[256];
- menu = gtk_menu_new ();
+ menu = gtk_menu_new ();
- if (sess)
- {
- char *name = g_markup_escape_text (sess->channel[0] ? sess->channel : _(""), -1);
- g_snprintf (buf, sizeof (buf), "%s", name);
- g_free (name);
+ if (sess)
+ {
+ char *name = g_markup_escape_text (sess->channel[0] ? sess->channel : _(""), -1);
+ g_snprintf (buf, sizeof (buf), "%s", name);
+ g_free (name);
- item = gtk_menu_item_new_with_label ("");
- gtk_label_set_markup (GTK_LABEL (gtk_bin_get_child (GTK_BIN (item))), buf);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
+ item = gtk_menu_item_new_with_label ("");
+ gtk_label_set_markup (GTK_LABEL (gtk_bin_get_child (GTK_BIN (item))), buf);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
- /* separator */
- menu_quick_item (0, 0, menu, XCMENU_SHADED, 0, 0);
+ /* separator */
+ menu_quick_item (0, 0, menu, XCMENU_SHADED, 0, 0);
- /* per-channel alerts */
- mg_create_alertmenu (sess, menu);
+ /* per-channel alerts */
+ mg_create_alertmenu (sess, menu);
- /* per-channel settings */
- mg_create_perchannelmenu (sess, menu);
+ /* per-channel settings */
+ mg_create_perchannelmenu (sess, menu);
- /* separator */
- menu_quick_item (0, 0, menu, XCMENU_SHADED, 0, 0);
+ /* separator */
+ menu_quick_item (0, 0, menu, XCMENU_SHADED, 0, 0);
- if (sess->type == SESS_CHANNEL)
- menu_addfavoritemenu (sess->server, menu, sess->channel, TRUE);
- else if (sess->type == SESS_SERVER)
- menu_addconnectmenu (sess->server, menu);
- }
+ if (sess->type == SESS_CHANNEL)
+ menu_addfavoritemenu (sess->server, menu, sess->channel, TRUE);
+ else if (sess->type == SESS_SERVER)
+ menu_addconnectmenu (sess->server, menu);
+ }
- mg_create_icon_item (_("_Detach"), GTK_STOCK_REDO, menu,
- mg_detach_tab_cb, ch);
- mg_create_icon_item (_("_Close"), GTK_STOCK_CLOSE, menu,
- mg_destroy_tab_cb, ch);
- if (sess && tabmenu_list)
- menu_create (menu, tabmenu_list, sess->channel, FALSE);
- if (sess)
- menu_add_plugin_items (menu, "\x4$TAB", sess->channel);
+ mg_create_icon_item (_("_Detach"), GTK_STOCK_REDO, menu,
+ mg_detach_tab_cb, ch);
+ mg_create_icon_item (_("_Close"), GTK_STOCK_CLOSE, menu,
+ mg_destroy_tab_cb, ch);
+ if (sess && tabmenu_list)
+ menu_create (menu, tabmenu_list, sess->channel, FALSE);
+ if (sess)
+ menu_add_plugin_items (menu, "\x4$TAB", sess->channel);
- if (event->window)
- gtk_menu_set_screen (GTK_MENU (menu), gdk_window_get_screen (event->window));
- g_object_ref (menu);
- g_object_ref_sink (menu);
- g_object_unref (menu);
- g_signal_connect (G_OBJECT (menu), "selection-done",
- G_CALLBACK (mg_menu_destroy), NULL);
- gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 0, event->time);
+ if (event->window)
+ gtk_menu_set_screen (GTK_MENU (menu), gdk_window_get_screen (event->window));
+ g_object_ref (menu);
+ g_object_ref_sink (menu);
+ g_object_unref (menu);
+ g_signal_connect (G_OBJECT (menu), "selection-done",
+ G_CALLBACK (mg_menu_destroy), NULL);
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 0, event->time);
}
static gboolean
mg_tab_contextmenu_cb (chanview *cv, chan *ch, int tag, gpointer ud, GdkEventButton *event)
{
- /* middle-click to close a tab */
- if (((prefs.hex_gui_tab_middleclose && event->button == 2))
- && event->type == GDK_BUTTON_PRESS)
- {
- mg_xbutton_cb (cv, ch, tag, ud);
- return TRUE;
- }
+ /* middle-click to close a tab */
+ if (((prefs.hex_gui_tab_middleclose && event->button == 2))
+ && event->type == GDK_BUTTON_PRESS)
+ {
+ mg_xbutton_cb (cv, ch, tag, ud);
+ return TRUE;
+ }
- if (event->button != 3)
- return FALSE;
+ if (event->button != 3)
+ return FALSE;
- if (tag == TAG_IRC)
- mg_create_tabmenu (ud, event, ch);
- else
- mg_create_tabmenu (NULL, event, ch);
+ if (tag == TAG_IRC)
+ mg_create_tabmenu (ud, event, ch);
+ else
+ mg_create_tabmenu (NULL, event, ch);
- return TRUE;
+ return TRUE;
}
void
mg_dnd_drop_file (session *sess, char *target, char *uri)
{
- char *p, *data, *next, *fname;
+ char *p, *data, *next, *fname;
- p = data = g_strdup (uri);
- while (*p)
- {
- next = strchr (p, '\r');
- if (g_ascii_strncasecmp ("file:", p, 5) == 0)
- {
- if (next)
- *next = 0;
- fname = g_filename_from_uri (p, NULL, NULL);
- if (fname)
- {
- /* dcc_send() expects utf-8 */
- p = g_filename_from_utf8 (fname, -1, 0, 0, 0);
- if (p)
- {
- dcc_send (sess, target, p, prefs.hex_dcc_max_send_cps, 0);
- g_free (p);
- }
- g_free (fname);
- }
- }
- if (!next)
- break;
- p = next + 1;
- if (*p == '\n')
- p++;
- }
- g_free (data);
+ p = data = g_strdup (uri);
+ while (*p)
+ {
+ next = strchr (p, '\r');
+ if (g_ascii_strncasecmp ("file:", p, 5) == 0)
+ {
+ if (next)
+ *next = 0;
+ fname = g_filename_from_uri (p, NULL, NULL);
+ if (fname)
+ {
+ /* dcc_send() expects utf-8 */
+ p = g_filename_from_utf8 (fname, -1, 0, 0, 0);
+ if (p)
+ {
+ dcc_send (sess, target, p, prefs.hex_dcc_max_send_cps, 0);
+ g_free (p);
+ }
+ g_free (fname);
+ }
+ }
+ if (!next)
+ break;
+ p = next + 1;
+ if (*p == '\n')
+ p++;
+ }
+ g_free (data);
}
static void
mg_dialog_dnd_drop (GtkWidget * widget, GdkDragContext * context, gint x,
- gint y, GtkSelectionData * selection_data, guint info,
- guint32 time, gpointer ud)
+ gint y, GtkSelectionData * selection_data, guint info,
+ guint32 time, gpointer ud)
{
- if (current_sess->type == SESS_DIALOG)
- /* sess->channel is really the nickname of dialogs */
- mg_dnd_drop_file (current_sess, current_sess->channel, (char *)gtk_selection_data_get_data (selection_data));
+ if (current_sess->type == SESS_DIALOG)
+ /* sess->channel is really the nickname of dialogs */
+ mg_dnd_drop_file (current_sess, current_sess->channel, (char *)gtk_selection_data_get_data (selection_data));
}
/* add a tabbed channel */
@@ -1684,518 +1691,521 @@ mg_dialog_dnd_drop (GtkWidget * widget, GdkDragContext * context, gint x,
static void
mg_add_chan (session *sess)
{
- GdkPixbuf *icon;
- char *name = _("");
+ GdkPixbuf *icon;
+ char *name = _("");
- if (sess->channel[0])
- name = sess->channel;
+ if (sess->channel[0])
+ name = sess->channel;
- switch (sess->type)
- {
- case SESS_CHANNEL:
- icon = pix_tree_channel;
- break;
- case SESS_SERVER:
- icon = pix_tree_server;
- break;
- default:
- icon = pix_tree_dialog;
- }
+ switch (sess->type)
+ {
+ case SESS_CHANNEL:
+ icon = pix_tree_channel;
+ break;
+ case SESS_SERVER:
+ icon = pix_tree_server;
+ break;
+ default:
+ icon = pix_tree_dialog;
+ }
- sess->res->tab = chanview_add (sess->gui->chanview, name, sess->server, sess,
- sess->type == SESS_SERVER ? FALSE : TRUE,
- TAG_IRC, icon);
- if (plain_list == NULL)
- mg_create_tab_colors ();
+ sess->res->tab = chanview_add (sess->gui->chanview, name, sess->server, sess,
+ sess->type == SESS_SERVER ? FALSE : TRUE,
+ TAG_IRC, icon);
+ if (plain_list == NULL)
+ mg_create_tab_colors ();
- chan_set_color (sess->res->tab, plain_list);
+ chan_set_color (sess->res->tab, plain_list);
- if (sess->res->buffer == NULL)
- {
- sess->res->buffer = gtk_xtext_buffer_new (GTK_XTEXT (sess->gui->xtext));
- gtk_xtext_set_time_stamp (sess->res->buffer, prefs.hex_stamp_text);
- sess->res->user_model = userlist_create_model (sess);
- }
+ if (sess->res->buffer == NULL)
+ {
+ sess->res->buffer = gtk_xtext_buffer_new (GTK_XTEXT (sess->gui->xtext));
+ gtk_xtext_set_time_stamp (sess->res->buffer, prefs.hex_stamp_text);
+ sess->res->user_model = userlist_create_model (sess);
+ }
}
static void
mg_userlist_button (GtkWidget * box, char *label, char *cmd,
- int a, int b, int c, int d)
+ int a, int b, int c, int d)
{
- GtkWidget *wid = gtk_button_new_with_label (label);
- g_signal_connect (G_OBJECT (wid), "clicked",
- G_CALLBACK (userlist_button_cb), cmd);
- gtk_table_attach_defaults (GTK_TABLE (box), wid, a, b, c, d);
- show_and_unfocus (wid);
+ GtkWidget *wid = gtk_button_new_with_label (label);
+ g_signal_connect (G_OBJECT (wid), "clicked",
+ G_CALLBACK (userlist_button_cb), cmd);
+ gtk_table_attach_defaults (GTK_TABLE (box), wid, a, b, c, d);
+ show_and_unfocus (wid);
}
static GtkWidget *
mg_create_userlistbuttons (GtkWidget *box)
{
- struct popup *pop;
- GSList *list = button_list;
- int a = 0, b = 0;
- GtkWidget *tab;
+ struct popup *pop;
+ GSList *list = button_list;
+ int a = 0, b = 0;
+ GtkWidget *tab;
- tab = gtk_table_new (5, 2, FALSE);
- gtk_box_pack_end (GTK_BOX (box), tab, FALSE, FALSE, 0);
+ tab = gtk_table_new (5, 2, FALSE);
+ gtk_box_pack_end (GTK_BOX (box), tab, FALSE, FALSE, 0);
- while (list)
- {
- pop = list->data;
- if (pop->cmd[0])
- {
- mg_userlist_button (tab, pop->name, pop->cmd, a, a + 1, b, b + 1);
- a++;
- if (a == 2)
- {
- a = 0;
- b++;
- }
- }
- list = list->next;
- }
+ while (list)
+ {
+ pop = list->data;
+ if (pop->cmd[0])
+ {
+ mg_userlist_button (tab, pop->name, pop->cmd, a, a + 1, b, b + 1);
+ a++;
+ if (a == 2)
+ {
+ a = 0;
+ b++;
+ }
+ }
+ list = list->next;
+ }
- return tab;
+ return tab;
}
static void
mg_topic_cb (GtkWidget *entry, gpointer userdata)
{
- session *sess = current_sess;
- char *text;
+ session *sess = current_sess;
+ char *text;
- if (sess->channel[0] && sess->server->connected && sess->type == SESS_CHANNEL)
- {
- text = (char *)gtk_entry_get_text (GTK_ENTRY (entry));
- if (text[0] == 0)
- text = NULL;
- sess->server->p_topic (sess->server, sess->channel, text);
- } else
- gtk_entry_set_text (GTK_ENTRY (entry), "");
- /* restore focus to the input widget, where the next input will most
+ if (sess->channel[0] && sess->server->connected && sess->type == SESS_CHANNEL)
+ {
+ text = (char *)gtk_entry_get_text (GTK_ENTRY (entry));
+ if (text[0] == 0)
+ text = NULL;
+ sess->server->p_topic (sess->server, sess->channel, text);
+ } else
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+ /* restore focus to the input widget, where the next input will most
likely be */
- gtk_widget_grab_focus (sess->gui->input_box);
+ gtk_widget_grab_focus (sess->gui->input_box);
}
static void
mg_tabwindow_kill_cb (GtkWidget *win, gpointer userdata)
{
- GSList *list, *next;
- session *sess;
+ GSList *list, *next;
+ session *sess;
-/* puts("enter mg_tabwindow_kill_cb");*/
- zoitechat_is_quitting = TRUE;
+/* puts("enter mg_tabwindow_kill_cb");*/
+ zoitechat_is_quitting = TRUE;
- /* see if there's any non-tab windows left */
- list = sess_list;
- while (list)
- {
- sess = list->data;
- next = list->next;
- if (!sess->gui->is_tab)
- {
- zoitechat_is_quitting = FALSE;
-/* puts("-> will not exit, some toplevel windows left");*/
- } else
- {
- mg_ircdestroy (sess);
- }
- list = next;
- }
+ /* see if there's any non-tab windows left */
+ list = sess_list;
+ while (list)
+ {
+ sess = list->data;
+ next = list->next;
+ if (!sess->gui->is_tab)
+ {
+ zoitechat_is_quitting = FALSE;
+/* puts("-> will not exit, some toplevel windows left");*/
+ } else
+ {
+ mg_ircdestroy (sess);
+ }
+ list = next;
+ }
- current_tab = NULL;
- active_tab = NULL;
- mg_gui = NULL;
- parent_window = NULL;
+ current_tab = NULL;
+ active_tab = NULL;
+ mg_gui = NULL;
+ parent_window = NULL;
}
static GtkWidget *
mg_changui_destroy (session *sess)
{
- GtkWidget *ret = NULL;
+ GtkWidget *ret = NULL;
- if (sess->gui->is_tab)
- {
- /* avoid calling the "destroy" callback */
- g_signal_handlers_disconnect_by_func (G_OBJECT (sess->gui->window),
- mg_tabwindow_kill_cb, 0);
- /* remove the tab from the chanview */
- if (!mg_chan_remove (sess->res->tab))
- /* if the window still exists, restore the signal handler */
- g_signal_connect (G_OBJECT (sess->gui->window), "destroy",
- G_CALLBACK (mg_tabwindow_kill_cb), 0);
- } else
- {
- /* avoid calling the "destroy" callback */
- g_signal_handlers_disconnect_by_func (G_OBJECT (sess->gui->window),
- mg_topdestroy_cb, sess);
- /*gtk_widget_destroy (sess->gui->window);*/
- /* don't destroy until the new one is created. Not sure why, but */
- /* it fixes: Gdk-CRITICAL **: gdk_colormap_get_screen: */
- /* assertion `GDK_IS_COLORMAP (cmap)' failed */
- ret = sess->gui->window;
- g_free (sess->gui);
- sess->gui = NULL;
- }
- return ret;
+ if (sess->gui->is_tab)
+ {
+ /* avoid calling the "destroy" callback */
+ g_signal_handlers_disconnect_by_func (G_OBJECT (sess->gui->window),
+ mg_tabwindow_kill_cb, 0);
+ /* remove the tab from the chanview */
+ if (!mg_chan_remove (sess->res->tab))
+ /* if the window still exists, restore the signal handler */
+ g_signal_connect (G_OBJECT (sess->gui->window), "destroy",
+ G_CALLBACK (mg_tabwindow_kill_cb), 0);
+ } else
+ {
+ /* avoid calling the "destroy" callback */
+ g_signal_handlers_disconnect_by_func (G_OBJECT (sess->gui->window),
+ mg_topdestroy_cb, sess);
+ /*gtk_widget_destroy (sess->gui->window);*/
+ /* don't destroy until the new one is created. Not sure why, but */
+ /* it fixes: Gdk-CRITICAL **: gdk_colormap_get_screen: */
+ /* assertion `GDK_IS_COLORMAP (cmap)' failed */
+ ret = sess->gui->window;
+ g_free (sess->gui);
+ sess->gui = NULL;
+ }
+ return ret;
}
static void
mg_link_irctab (session *sess, int focus)
{
- GtkWidget *win;
+ GtkWidget *win;
- if (sess->gui->is_tab)
- {
- win = mg_changui_destroy (sess);
- mg_changui_new (sess, sess->res, 0, focus);
- mg_populate (sess);
- zoitechat_is_quitting = FALSE;
- if (win)
- gtk_widget_destroy (win);
- return;
- }
+ if (sess->gui->is_tab)
+ {
+ win = mg_changui_destroy (sess);
+ mg_changui_new (sess, sess->res, 0, focus);
+ mg_populate (sess);
+ zoitechat_is_quitting = FALSE;
+ if (win)
+ gtk_widget_destroy (win);
+ return;
+ }
- mg_unpopulate (sess);
- win = mg_changui_destroy (sess);
- mg_changui_new (sess, sess->res, 1, focus);
- /* the buffer is now attached to a different widget */
- ((xtext_buffer *)sess->res->buffer)->xtext = (GtkXText *)sess->gui->xtext;
- if (win)
- gtk_widget_destroy (win);
+ mg_unpopulate (sess);
+ win = mg_changui_destroy (sess);
+ mg_changui_new (sess, sess->res, 1, focus);
+ /* the buffer is now attached to a different widget */
+ ((xtext_buffer *)sess->res->buffer)->xtext = (GtkXText *)sess->gui->xtext;
+ if (win)
+ gtk_widget_destroy (win);
}
void
mg_detach (session *sess, int mode)
{
- switch (mode)
- {
- /* detach only */
- case 1:
- if (sess->gui->is_tab)
- mg_link_irctab (sess, 1);
- break;
- /* attach only */
- case 2:
- if (!sess->gui->is_tab)
- mg_link_irctab (sess, 1);
- break;
- /* toggle */
- default:
- mg_link_irctab (sess, 1);
- }
+ switch (mode)
+ {
+ /* detach only */
+ case 1:
+ if (sess->gui->is_tab)
+ mg_link_irctab (sess, 1);
+ break;
+ /* attach only */
+ case 2:
+ if (!sess->gui->is_tab)
+ mg_link_irctab (sess, 1);
+ break;
+ /* toggle */
+ default:
+ mg_link_irctab (sess, 1);
+ }
}
static int
check_is_number (char *t)
{
- while (*t)
- {
- if (*t < '0' || *t > '9')
- return FALSE;
- t++;
- }
- return TRUE;
+ while (*t)
+ {
+ if (*t < '0' || *t > '9')
+ return FALSE;
+ t++;
+ }
+ return TRUE;
}
static void
mg_change_flag (GtkWidget * wid, session *sess, char flag)
{
- server *serv = sess->server;
- char mode[3];
+ server *serv = sess->server;
+ char mode[3];
- mode[1] = flag;
- mode[2] = '\0';
- if (serv->connected && sess->channel[0])
- {
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (wid)))
- mode[0] = '+';
- else
- mode[0] = '-';
- serv->p_mode (serv, sess->channel, mode);
- serv->p_join_info (serv, sess->channel);
- sess->ignore_mode = TRUE;
- sess->ignore_date = TRUE;
- }
+ mode[1] = flag;
+ mode[2] = '\0';
+ if (serv->connected && sess->channel[0])
+ {
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (wid)))
+ mode[0] = '+';
+ else
+ mode[0] = '-';
+ serv->p_mode (serv, sess->channel, mode);
+ serv->p_join_info (serv, sess->channel);
+ sess->ignore_mode = TRUE;
+ sess->ignore_date = TRUE;
+ }
}
static void
flagl_hit (GtkWidget * wid, struct session *sess)
{
- char modes[512];
- const char *limit_str;
- server *serv = sess->server;
+ char modes[512];
+ const char *limit_str;
+ server *serv = sess->server;
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (wid)))
- {
- if (serv->connected && sess->channel[0])
- {
- limit_str = gtk_entry_get_text (GTK_ENTRY (sess->gui->limit_entry));
- if (check_is_number ((char *)limit_str) == FALSE)
- {
- fe_message (_("User limit must be a number!\n"), FE_MSG_ERROR);
- gtk_entry_set_text (GTK_ENTRY (sess->gui->limit_entry), "");
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wid), FALSE);
- return;
- }
- g_snprintf (modes, sizeof (modes), "+l %d", atoi (limit_str));
- serv->p_mode (serv, sess->channel, modes);
- serv->p_join_info (serv, sess->channel);
- }
- } else
- mg_change_flag (wid, sess, 'l');
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (wid)))
+ {
+ if (serv->connected && sess->channel[0])
+ {
+ limit_str = gtk_entry_get_text (GTK_ENTRY (sess->gui->limit_entry));
+ if (check_is_number ((char *)limit_str) == FALSE)
+ {
+ fe_message (_("User limit must be a number!\n"), FE_MSG_ERROR);
+ gtk_entry_set_text (GTK_ENTRY (sess->gui->limit_entry), "");
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wid), FALSE);
+ return;
+ }
+ g_snprintf (modes, sizeof (modes), "+l %d", atoi (limit_str));
+ serv->p_mode (serv, sess->channel, modes);
+ serv->p_join_info (serv, sess->channel);
+ }
+ } else
+ mg_change_flag (wid, sess, 'l');
}
static void
flagk_hit (GtkWidget * wid, struct session *sess)
{
- char modes[512];
- server *serv = sess->server;
+ char modes[512];
+ server *serv = sess->server;
- if (serv->connected && sess->channel[0])
- {
- g_snprintf (modes, sizeof (modes), "-k %s",
- gtk_entry_get_text (GTK_ENTRY (sess->gui->key_entry)));
+ if (serv->connected && sess->channel[0])
+ {
+ g_snprintf (modes, sizeof (modes), "-k %s",
+ gtk_entry_get_text (GTK_ENTRY (sess->gui->key_entry)));
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (wid)))
- modes[0] = '+';
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (wid)))
+ modes[0] = '+';
- serv->p_mode (serv, sess->channel, modes);
- }
+ serv->p_mode (serv, sess->channel, modes);
+ }
}
static void
mg_flagbutton_cb (GtkWidget *but, char *flag)
{
- session *sess;
- char mode;
+ session *sess;
+ char mode;
- if (ignore_chanmode)
- return;
+ if (ignore_chanmode)
+ return;
- sess = current_sess;
- mode = tolower ((unsigned char) flag[0]);
+ sess = current_sess;
+ mode = tolower ((unsigned char) flag[0]);
- switch (mode)
- {
- case 'l':
- flagl_hit (but, sess);
- break;
- case 'k':
- flagk_hit (but, sess);
- break;
- case 'b':
- ignore_chanmode = TRUE;
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sess->gui->flag_b), FALSE);
- ignore_chanmode = FALSE;
- banlist_opengui (sess);
- break;
- default:
- mg_change_flag (but, sess, mode);
- }
+ switch (mode)
+ {
+ case 'l':
+ flagl_hit (but, sess);
+ break;
+ case 'k':
+ flagk_hit (but, sess);
+ break;
+ case 'b':
+ ignore_chanmode = TRUE;
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sess->gui->flag_b), FALSE);
+ ignore_chanmode = FALSE;
+ banlist_opengui (sess);
+ break;
+ default:
+ mg_change_flag (but, sess, mode);
+ }
}
static GtkWidget *
mg_create_flagbutton (char *tip, GtkWidget *box, char *face)
{
- GtkWidget *btn, *lbl;
- char label_markup[16];
+ GtkWidget *btn, *lbl;
+ char label_markup[16];
- g_snprintf (label_markup, sizeof(label_markup), "%s", face);
- lbl = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL(lbl), label_markup);
+ g_snprintf (label_markup, sizeof(label_markup), "%s", face);
+ lbl = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL(lbl), label_markup);
- btn = gtk_toggle_button_new ();
- gtk_widget_set_size_request (btn, -1, 0);
- gtk_widget_set_tooltip_text (btn, tip);
- gtk_container_add (GTK_CONTAINER(btn), lbl);
+ btn = gtk_toggle_button_new ();
+ gtk_widget_set_size_request (btn, -1, 0);
+ gtk_widget_set_tooltip_text (btn, tip);
+ gtk_container_add (GTK_CONTAINER(btn), lbl);
- gtk_box_pack_start (GTK_BOX (box), btn, 0, 0, 0);
- g_signal_connect (G_OBJECT (btn), "toggled",
- G_CALLBACK (mg_flagbutton_cb), face);
- show_and_unfocus (btn);
+ gtk_box_pack_start (GTK_BOX (box), btn, 0, 0, 0);
+ g_signal_connect (G_OBJECT (btn), "toggled",
+ G_CALLBACK (mg_flagbutton_cb), face);
+ show_and_unfocus (btn);
- return btn;
+ return btn;
}
static void
mg_key_entry_cb (GtkWidget * igad, gpointer userdata)
{
- char modes[512];
- session *sess = current_sess;
- server *serv = sess->server;
+ char modes[512];
+ session *sess = current_sess;
+ server *serv = sess->server;
- if (serv->connected && sess->channel[0])
- {
- g_snprintf (modes, sizeof (modes), "+k %s",
- gtk_entry_get_text (GTK_ENTRY (igad)));
- serv->p_mode (serv, sess->channel, modes);
- serv->p_join_info (serv, sess->channel);
- }
+ if (serv->connected && sess->channel[0])
+ {
+ g_snprintf (modes, sizeof (modes), "+k %s",
+ gtk_entry_get_text (GTK_ENTRY (igad)));
+ serv->p_mode (serv, sess->channel, modes);
+ serv->p_join_info (serv, sess->channel);
+ }
}
static void
mg_limit_entry_cb (GtkWidget * igad, gpointer userdata)
{
- char modes[512];
- session *sess = current_sess;
- server *serv = sess->server;
+ char modes[512];
+ session *sess = current_sess;
+ server *serv = sess->server;
- if (serv->connected && sess->channel[0])
- {
- if (check_is_number ((char *)gtk_entry_get_text (GTK_ENTRY (igad))) == FALSE)
- {
- gtk_entry_set_text (GTK_ENTRY (igad), "");
- fe_message (_("User limit must be a number!\n"), FE_MSG_ERROR);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sess->gui->flag_l), FALSE);
- return;
- }
- g_snprintf (modes, sizeof(modes), "+l %d",
- atoi (gtk_entry_get_text (GTK_ENTRY (igad))));
- serv->p_mode (serv, sess->channel, modes);
- serv->p_join_info (serv, sess->channel);
- }
+ if (serv->connected && sess->channel[0])
+ {
+ if (check_is_number ((char *)gtk_entry_get_text (GTK_ENTRY (igad))) == FALSE)
+ {
+ gtk_entry_set_text (GTK_ENTRY (igad), "");
+ fe_message (_("User limit must be a number!\n"), FE_MSG_ERROR);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sess->gui->flag_l), FALSE);
+ return;
+ }
+ g_snprintf (modes, sizeof(modes), "+l %d",
+ atoi (gtk_entry_get_text (GTK_ENTRY (igad))));
+ serv->p_mode (serv, sess->channel, modes);
+ serv->p_join_info (serv, sess->channel);
+ }
}
static void
mg_apply_entry_style (GtkWidget *entry)
{
- gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &colors[COL_BG]);
- gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &colors[COL_FG]);
- gtk_widget_modify_font (entry, input_style->font_desc);
+ gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &colors[COL_BG]);
+ gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &colors[COL_FG]);
+ gtk_widget_modify_font (entry, input_style->font_desc);
}
static void
mg_create_chanmodebuttons (session_gui *gui, GtkWidget *box)
{
- gui->flag_c = mg_create_flagbutton (_("Filter Colors"), box, "c");
- gui->flag_n = mg_create_flagbutton (_("No outside messages"), box, "n");
- gui->flag_t = mg_create_flagbutton (_("Topic Protection"), box, "t");
- gui->flag_i = mg_create_flagbutton (_("Invite Only"), box, "i");
- gui->flag_m = mg_create_flagbutton (_("Moderated"), box, "m");
- gui->flag_b = mg_create_flagbutton (_("Ban List"), box, "b");
+ gui->flag_c = mg_create_flagbutton (_("Filter Colors"), box, "c");
+ gui->flag_n = mg_create_flagbutton (_("No outside messages"), box, "n");
+ gui->flag_t = mg_create_flagbutton (_("Topic Protection"), box, "t");
+ gui->flag_i = mg_create_flagbutton (_("Invite Only"), box, "i");
+ gui->flag_m = mg_create_flagbutton (_("Moderated"), box, "m");
+ gui->flag_b = mg_create_flagbutton (_("Ban List"), box, "b");
- gui->flag_k = mg_create_flagbutton (_("Keyword"), box, "k");
- gui->key_entry = gtk_entry_new ();
- gtk_widget_set_name (gui->key_entry, "zoitechat-inputbox");
- gtk_entry_set_max_length (GTK_ENTRY (gui->key_entry), 23);
- gtk_widget_set_size_request (gui->key_entry, 115, -1);
- gtk_box_pack_start (GTK_BOX (box), gui->key_entry, 0, 0, 0);
- g_signal_connect (G_OBJECT (gui->key_entry), "activate",
- G_CALLBACK (mg_key_entry_cb), NULL);
+ gui->flag_k = mg_create_flagbutton (_("Keyword"), box, "k");
+ gui->key_entry = gtk_entry_new ();
+ gtk_widget_set_name (gui->key_entry, "zoitechat-inputbox");
+ gtk_entry_set_max_length (GTK_ENTRY (gui->key_entry), 23);
+ gtk_widget_set_size_request (gui->key_entry, 115, -1);
+ gtk_box_pack_start (GTK_BOX (box), gui->key_entry, 0, 0, 0);
+ mg_apply_emoji_fallback_widget (gui->key_entry);
+ g_signal_connect (G_OBJECT (gui->key_entry), "activate",
+ G_CALLBACK (mg_key_entry_cb), NULL);
- if (prefs.hex_gui_input_style)
- mg_apply_entry_style (gui->key_entry);
+ if (prefs.hex_gui_input_style)
+ mg_apply_entry_style (gui->key_entry);
- gui->flag_l = mg_create_flagbutton (_("User Limit"), box, "l");
- gui->limit_entry = gtk_entry_new ();
- gtk_widget_set_name (gui->limit_entry, "zoitechat-inputbox");
- gtk_entry_set_max_length (GTK_ENTRY (gui->limit_entry), 10);
- gtk_widget_set_size_request (gui->limit_entry, 30, -1);
- gtk_box_pack_start (GTK_BOX (box), gui->limit_entry, 0, 0, 0);
- g_signal_connect (G_OBJECT (gui->limit_entry), "activate",
- G_CALLBACK (mg_limit_entry_cb), NULL);
+ gui->flag_l = mg_create_flagbutton (_("User Limit"), box, "l");
+ gui->limit_entry = gtk_entry_new ();
+ gtk_widget_set_name (gui->limit_entry, "zoitechat-inputbox");
+ gtk_entry_set_max_length (GTK_ENTRY (gui->limit_entry), 10);
+ gtk_widget_set_size_request (gui->limit_entry, 30, -1);
+ gtk_box_pack_start (GTK_BOX (box), gui->limit_entry, 0, 0, 0);
+ mg_apply_emoji_fallback_widget (gui->limit_entry);
+ g_signal_connect (G_OBJECT (gui->limit_entry), "activate",
+ G_CALLBACK (mg_limit_entry_cb), NULL);
- if (prefs.hex_gui_input_style)
- mg_apply_entry_style (gui->limit_entry);
+ if (prefs.hex_gui_input_style)
+ mg_apply_entry_style (gui->limit_entry);
}
/*static void
mg_create_link_buttons (GtkWidget *box, gpointer userdata)
{
- gtkutil_button (box, GTK_STOCK_CLOSE, _("Close this tab/window"),
- mg_x_click_cb, userdata, 0);
+ gtkutil_button (box, GTK_STOCK_CLOSE, _("Close this tab/window"),
+ mg_x_click_cb, userdata, 0);
- if (!userdata)
- gtkutil_button (box, GTK_STOCK_REDO, _("Attach/Detach this tab"),
- mg_link_cb, userdata, 0);
+ if (!userdata)
+ gtkutil_button (box, GTK_STOCK_REDO, _("Attach/Detach this tab"),
+ mg_link_cb, userdata, 0);
}*/
static void
mg_dialog_button_cb (GtkWidget *wid, char *cmd)
{
- /* the longest cmd is 12, and the longest nickname is 64 */
- char buf[128];
- char *host = "";
- char *topic;
+ /* the longest cmd is 12, and the longest nickname is 64 */
+ char buf[128];
+ char *host = "";
+ char *topic;
- if (!current_sess)
- return;
+ if (!current_sess)
+ return;
- topic = (char *)(gtk_entry_get_text (GTK_ENTRY (current_sess->gui->topic_entry)));
- topic = strrchr (topic, '@');
- if (topic)
- host = topic + 1;
+ topic = (char *)(gtk_entry_get_text (GTK_ENTRY (current_sess->gui->topic_entry)));
+ topic = strrchr (topic, '@');
+ if (topic)
+ host = topic + 1;
- auto_insert (buf, sizeof (buf), cmd, 0, 0, "", "", "",
- server_get_network (current_sess->server, TRUE), host, "",
- current_sess->channel, "");
+ auto_insert (buf, sizeof (buf), cmd, 0, 0, "", "", "",
+ server_get_network (current_sess->server, TRUE), host, "",
+ current_sess->channel, "");
- handle_command (current_sess, buf, TRUE);
+ handle_command (current_sess, buf, TRUE);
- /* dirty trick to avoid auto-selection */
- SPELL_ENTRY_SET_EDITABLE (current_sess->gui->input_box, FALSE);
- gtk_widget_grab_focus (current_sess->gui->input_box);
- SPELL_ENTRY_SET_EDITABLE (current_sess->gui->input_box, TRUE);
+ /* dirty trick to avoid auto-selection */
+ SPELL_ENTRY_SET_EDITABLE (current_sess->gui->input_box, FALSE);
+ gtk_widget_grab_focus (current_sess->gui->input_box);
+ SPELL_ENTRY_SET_EDITABLE (current_sess->gui->input_box, TRUE);
}
static void
mg_dialog_button (GtkWidget *box, char *name, char *cmd)
{
- GtkWidget *wid;
+ GtkWidget *wid;
- wid = gtk_button_new_with_label (name);
- gtk_box_pack_start (GTK_BOX (box), wid, FALSE, FALSE, 0);
- g_signal_connect (G_OBJECT (wid), "clicked",
- G_CALLBACK (mg_dialog_button_cb), cmd);
- gtk_widget_set_size_request (wid, -1, 0);
+ wid = gtk_button_new_with_label (name);
+ gtk_box_pack_start (GTK_BOX (box), wid, FALSE, FALSE, 0);
+ g_signal_connect (G_OBJECT (wid), "clicked",
+ G_CALLBACK (mg_dialog_button_cb), cmd);
+ gtk_widget_set_size_request (wid, -1, 0);
}
static void
mg_create_dialogbuttons (GtkWidget *box)
{
- struct popup *pop;
- GSList *list = dlgbutton_list;
+ struct popup *pop;
+ GSList *list = dlgbutton_list;
- while (list)
- {
- pop = list->data;
- if (pop->cmd[0])
- mg_dialog_button (box, pop->name, pop->cmd);
- list = list->next;
- }
+ while (list)
+ {
+ pop = list->data;
+ if (pop->cmd[0])
+ mg_dialog_button (box, pop->name, pop->cmd);
+ list = list->next;
+ }
}
static void
mg_create_topicbar (session *sess, GtkWidget *box)
{
- GtkWidget *hbox, *topic, *bbox;
- session_gui *gui = sess->gui;
+ GtkWidget *hbox, *topic, *bbox;
+ session_gui *gui = sess->gui;
- gui->topic_bar = hbox = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (box), hbox, 0, 0, 0);
+ gui->topic_bar = hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (box), hbox, 0, 0, 0);
- if (!gui->is_tab)
- sess->res->tab = NULL;
+ if (!gui->is_tab)
+ sess->res->tab = NULL;
- gui->topic_entry = topic = sexy_spell_entry_new ();
- gtk_widget_set_name (topic, "zoitechat-inputbox");
- sexy_spell_entry_set_checked (SEXY_SPELL_ENTRY (topic), FALSE);
- gtk_container_add (GTK_CONTAINER (hbox), topic);
- g_signal_connect (G_OBJECT (topic), "activate",
- G_CALLBACK (mg_topic_cb), 0);
+ gui->topic_entry = topic = sexy_spell_entry_new ();
+ gtk_widget_set_name (topic, "zoitechat-inputbox");
+ sexy_spell_entry_set_checked (SEXY_SPELL_ENTRY (topic), FALSE);
+ gtk_container_add (GTK_CONTAINER (hbox), topic);
+ mg_apply_emoji_fallback_widget (topic);
+ g_signal_connect (G_OBJECT (topic), "activate",
+ G_CALLBACK (mg_topic_cb), 0);
- if (prefs.hex_gui_input_style)
- mg_apply_entry_style (topic);
+ if (prefs.hex_gui_input_style)
+ mg_apply_entry_style (topic);
- gui->topicbutton_box = bbox = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), bbox, 0, 0, 0);
- mg_create_chanmodebuttons (gui, bbox);
+ gui->topicbutton_box = bbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), bbox, 0, 0, 0);
+ mg_create_chanmodebuttons (gui, bbox);
- gui->dialogbutton_box = bbox = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), bbox, 0, 0, 0);
- mg_create_dialogbuttons (bbox);
+ gui->dialogbutton_box = bbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), bbox, 0, 0, 0);
+ mg_create_dialogbuttons (bbox);
}
/* check if a word is clickable */
@@ -2203,14 +2213,14 @@ mg_create_topicbar (session *sess, GtkWidget *box)
static int
mg_word_check (GtkWidget * xtext, char *word)
{
- session *sess = current_sess;
- int ret;
+ session *sess = current_sess;
+ int ret;
- ret = url_check_word (word);
- if (ret == 0 && sess->type == SESS_DIALOG)
- return WORD_DIALOG;
+ ret = url_check_word (word);
+ if (ret == 0 && sess->type == SESS_DIALOG)
+ return WORD_DIALOG;
- return ret;
+ return ret;
}
/* mouse click inside text area */
@@ -2218,408 +2228,414 @@ mg_word_check (GtkWidget * xtext, char *word)
static void
mg_word_clicked (GtkWidget *xtext, char *word, GdkEventButton *even)
{
- session *sess = current_sess;
- int word_type = 0, start, end;
- char *tmp;
+ session *sess = current_sess;
+ int word_type = 0, start, end;
+ char *tmp;
- if (word)
- {
- word_type = mg_word_check (xtext, word);
- url_last (&start, &end);
- }
+ if (word)
+ {
+ word_type = mg_word_check (xtext, word);
+ url_last (&start, &end);
+ }
- if (even->button == 1) /* left button */
- {
- if (word == NULL)
- {
- mg_focus (sess);
- return;
- }
+ if (even->button == 1) /* left button */
+ {
+ if (word == NULL)
+ {
+ mg_focus (sess);
+ return;
+ }
- if ((even->state & 13) == prefs.hex_gui_url_mod)
- {
- switch (word_type)
- {
- case WORD_URL:
- case WORD_HOST6:
- case WORD_HOST:
- word[end] = 0;
- fe_open_url (word + start);
- }
- }
- return;
- }
+ if ((even->state & 13) == prefs.hex_gui_url_mod)
+ {
+ switch (word_type)
+ {
+ case WORD_URL:
+ case WORD_HOST6:
+ case WORD_HOST:
+ word[end] = 0;
+ fe_open_url (word + start);
+ }
+ }
+ return;
+ }
- if (even->button == 2)
- {
- if (sess->type == SESS_DIALOG)
- menu_middlemenu (sess, even);
- else if (even->type == GDK_2BUTTON_PRESS)
- userlist_select (sess, word);
- return;
- }
- if (word == NULL)
- return;
+ if (even->button == 2)
+ {
+ if (sess->type == SESS_DIALOG)
+ menu_middlemenu (sess, even);
+ else if (even->type == GDK_2BUTTON_PRESS)
+ userlist_select (sess, word);
+ return;
+ }
+ if (word == NULL)
+ return;
- switch (word_type)
- {
- case 0:
- case WORD_PATH:
- menu_middlemenu (sess, even);
- break;
- case WORD_URL:
- case WORD_HOST6:
- case WORD_HOST:
- word[end] = 0;
- word += start;
- menu_urlmenu (even, word);
- break;
- case WORD_NICK:
- word[end] = 0;
- word += start;
- menu_nickmenu (sess, even, word, FALSE);
- break;
- case WORD_CHANNEL:
- word[end] = 0;
- word += start;
- menu_chanmenu (sess, even, word);
- break;
- case WORD_EMAIL:
- word[end] = 0;
- word += start;
- tmp = g_strdup_printf ("mailto:%s", word + (ispunct (*word) ? 1 : 0));
- menu_urlmenu (even, tmp);
- g_free (tmp);
- break;
- case WORD_DIALOG:
- menu_nickmenu (sess, even, sess->channel, FALSE);
- break;
- }
+ switch (word_type)
+ {
+ case 0:
+ case WORD_PATH:
+ menu_middlemenu (sess, even);
+ break;
+ case WORD_URL:
+ case WORD_HOST6:
+ case WORD_HOST:
+ word[end] = 0;
+ word += start;
+ menu_urlmenu (even, word);
+ break;
+ case WORD_NICK:
+ word[end] = 0;
+ word += start;
+ menu_nickmenu (sess, even, word, FALSE);
+ break;
+ case WORD_CHANNEL:
+ word[end] = 0;
+ word += start;
+ menu_chanmenu (sess, even, word);
+ break;
+ case WORD_EMAIL:
+ word[end] = 0;
+ word += start;
+ tmp = g_strdup_printf ("mailto:%s", word + (ispunct (*word) ? 1 : 0));
+ menu_urlmenu (even, tmp);
+ g_free (tmp);
+ break;
+ case WORD_DIALOG:
+ menu_nickmenu (sess, even, sess->channel, FALSE);
+ break;
+ }
}
void
mg_update_xtext (GtkWidget *wid)
{
- GtkXText *xtext = GTK_XTEXT (wid);
+ GtkXText *xtext = GTK_XTEXT (wid);
+ gchar *font_with_emoji;
- gtk_xtext_set_palette (xtext, colors);
- gtk_xtext_set_max_lines (xtext, prefs.hex_text_max_lines);
- gtk_xtext_set_background (xtext, channelwin_pix);
- gtk_xtext_set_wordwrap (xtext, prefs.hex_text_wordwrap);
- gtk_xtext_set_show_marker (xtext, prefs.hex_text_show_marker);
- gtk_xtext_set_show_separator (xtext, prefs.hex_text_indent ? prefs.hex_text_show_sep : 0);
- gtk_xtext_set_indent (xtext, prefs.hex_text_indent);
- if (!gtk_xtext_set_font (xtext, prefs.hex_text_font))
- {
- fe_message ("Failed to open any font. I'm out of here!", FE_MSG_WAIT | FE_MSG_ERROR);
- exit (1);
- }
+ gtk_xtext_set_palette (xtext, colors);
+ gtk_xtext_set_max_lines (xtext, prefs.hex_text_max_lines);
+ gtk_xtext_set_background (xtext, channelwin_pix);
+ gtk_xtext_set_wordwrap (xtext, prefs.hex_text_wordwrap);
+ gtk_xtext_set_show_marker (xtext, prefs.hex_text_show_marker);
+ gtk_xtext_set_show_separator (xtext, prefs.hex_text_indent ? prefs.hex_text_show_sep : 0);
+ gtk_xtext_set_indent (xtext, prefs.hex_text_indent);
- gtk_xtext_refresh (xtext);
+ /* Ensure emoji-capable fallback for the main chat buffer font */
+ font_with_emoji = mg_font_string_with_emoji_fallback (prefs.hex_text_font);
+ if (!gtk_xtext_set_font (xtext, font_with_emoji))
+ {
+ g_free (font_with_emoji);
+ fe_message ("Failed to open any font. I'm out of here!", FE_MSG_WAIT | FE_MSG_ERROR);
+ exit (1);
+ }
+ g_free (font_with_emoji);
+
+ gtk_xtext_refresh (xtext);
}
static void
mg_create_textarea (session *sess, GtkWidget *box)
{
- GtkWidget *inbox, *vbox, *frame;
- GtkXText *xtext;
- session_gui *gui = sess->gui;
- static const GtkTargetEntry dnd_targets[] =
- {
- {"text/uri-list", 0, 1}
- };
- static const GtkTargetEntry dnd_dest_targets[] =
- {
- {"HEXCHAT_CHANVIEW", GTK_TARGET_SAME_APP, 75 },
- {"HEXCHAT_USERLIST", GTK_TARGET_SAME_APP, 75 }
- };
+ GtkWidget *inbox, *vbox, *frame;
+ GtkXText *xtext;
+ session_gui *gui = sess->gui;
+ static const GtkTargetEntry dnd_targets[] =
+ {
+ {"text/uri-list", 0, 1}
+ };
+ static const GtkTargetEntry dnd_dest_targets[] =
+ {
+ {"HEXCHAT_CHANVIEW", GTK_TARGET_SAME_APP, 75 },
+ {"HEXCHAT_USERLIST", GTK_TARGET_SAME_APP, 75 }
+ };
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_add (GTK_CONTAINER (box), vbox);
- inbox = gtk_hbox_new (FALSE, 2);
- gtk_container_add (GTK_CONTAINER (vbox), inbox);
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (box), vbox);
+ inbox = gtk_hbox_new (FALSE, 2);
+ gtk_container_add (GTK_CONTAINER (vbox), inbox);
- frame = gtk_frame_new (NULL);
- gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
- gtk_container_add (GTK_CONTAINER (inbox), frame);
+ frame = gtk_frame_new (NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+ gtk_container_add (GTK_CONTAINER (inbox), frame);
- gui->xtext = gtk_xtext_new (colors, TRUE);
- xtext = GTK_XTEXT (gui->xtext);
- gtk_xtext_set_max_indent (xtext, prefs.hex_text_max_indent);
- gtk_xtext_set_thin_separator (xtext, prefs.hex_text_thin_sep);
- gtk_xtext_set_urlcheck_function (xtext, mg_word_check);
- gtk_xtext_set_max_lines (xtext, prefs.hex_text_max_lines);
- gtk_container_add (GTK_CONTAINER (frame), GTK_WIDGET (xtext));
+ gui->xtext = gtk_xtext_new (colors, TRUE);
+ xtext = GTK_XTEXT (gui->xtext);
+ gtk_xtext_set_max_indent (xtext, prefs.hex_text_max_indent);
+ gtk_xtext_set_thin_separator (xtext, prefs.hex_text_thin_sep);
+ gtk_xtext_set_urlcheck_function (xtext, mg_word_check);
+ gtk_xtext_set_max_lines (xtext, prefs.hex_text_max_lines);
+ gtk_container_add (GTK_CONTAINER (frame), GTK_WIDGET (xtext));
- mg_update_xtext (GTK_WIDGET (xtext));
+ mg_update_xtext (GTK_WIDGET (xtext));
- g_signal_connect (G_OBJECT (xtext), "word_click",
- G_CALLBACK (mg_word_clicked), NULL);
+ g_signal_connect (G_OBJECT (xtext), "word_click",
+ G_CALLBACK (mg_word_clicked), NULL);
- gui->vscrollbar = gtk_vscrollbar_new (GTK_XTEXT (xtext)->adj);
- gtk_box_pack_start (GTK_BOX (inbox), gui->vscrollbar, FALSE, TRUE, 0);
+ gui->vscrollbar = gtk_vscrollbar_new (GTK_XTEXT (xtext)->adj);
+ gtk_box_pack_start (GTK_BOX (inbox), gui->vscrollbar, FALSE, TRUE, 0);
- gtk_drag_dest_set (gui->vscrollbar, 5, dnd_dest_targets, 2,
- GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK);
- g_signal_connect (G_OBJECT (gui->vscrollbar), "drag_begin",
- G_CALLBACK (mg_drag_begin_cb), NULL);
- g_signal_connect (G_OBJECT (gui->vscrollbar), "drag_drop",
- G_CALLBACK (mg_drag_drop_cb), NULL);
- g_signal_connect (G_OBJECT (gui->vscrollbar), "drag_motion",
- G_CALLBACK (mg_drag_motion_cb), gui->vscrollbar);
- g_signal_connect (G_OBJECT (gui->vscrollbar), "drag_end",
- G_CALLBACK (mg_drag_end_cb), NULL);
+ gtk_drag_dest_set (gui->vscrollbar, 5, dnd_dest_targets, 2,
+ GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK);
+ g_signal_connect (G_OBJECT (gui->vscrollbar), "drag_begin",
+ G_CALLBACK (mg_drag_begin_cb), NULL);
+ g_signal_connect (G_OBJECT (gui->vscrollbar), "drag_drop",
+ G_CALLBACK (mg_drag_drop_cb), NULL);
+ g_signal_connect (G_OBJECT (gui->vscrollbar), "drag_motion",
+ G_CALLBACK (mg_drag_motion_cb), gui->vscrollbar);
+ g_signal_connect (G_OBJECT (gui->vscrollbar), "drag_end",
+ G_CALLBACK (mg_drag_end_cb), NULL);
- gtk_drag_dest_set (gui->xtext, GTK_DEST_DEFAULT_ALL, dnd_targets, 1,
- GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK);
- g_signal_connect (G_OBJECT (gui->xtext), "drag_data_received",
- G_CALLBACK (mg_dialog_dnd_drop), NULL);
+ gtk_drag_dest_set (gui->xtext, GTK_DEST_DEFAULT_ALL, dnd_targets, 1,
+ GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK);
+ g_signal_connect (G_OBJECT (gui->xtext), "drag_data_received",
+ G_CALLBACK (mg_dialog_dnd_drop), NULL);
}
static GtkWidget *
mg_create_infoframe (GtkWidget *box)
{
- GtkWidget *frame, *label, *hbox;
+ GtkWidget *frame, *label, *hbox;
- frame = gtk_frame_new (0);
- gtk_frame_set_shadow_type ((GtkFrame*)frame, GTK_SHADOW_OUT);
- gtk_container_add (GTK_CONTAINER (box), frame);
+ frame = gtk_frame_new (0);
+ gtk_frame_set_shadow_type ((GtkFrame*)frame, GTK_SHADOW_OUT);
+ gtk_container_add (GTK_CONTAINER (box), frame);
- hbox = gtk_hbox_new (0, 0);
- gtk_container_add (GTK_CONTAINER (frame), hbox);
+ hbox = gtk_hbox_new (0, 0);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
- label = gtk_label_new (NULL);
- gtk_container_add (GTK_CONTAINER (hbox), label);
+ label = gtk_label_new (NULL);
+ gtk_container_add (GTK_CONTAINER (hbox), label);
- return label;
+ return label;
}
static void
mg_create_meters (session_gui *gui, GtkWidget *parent_box)
{
- GtkWidget *infbox, *wid, *box;
+ GtkWidget *infbox, *wid, *box;
- gui->meter_box = infbox = box = gtk_vbox_new (0, 1);
- gtk_box_pack_start (GTK_BOX (parent_box), box, 0, 0, 0);
+ gui->meter_box = infbox = box = gtk_vbox_new (0, 1);
+ gtk_box_pack_start (GTK_BOX (parent_box), box, 0, 0, 0);
- if ((prefs.hex_gui_lagometer & 2) || (prefs.hex_gui_throttlemeter & 2))
- {
- infbox = gtk_hbox_new (0, 0);
- gtk_box_pack_start (GTK_BOX (box), infbox, 0, 0, 0);
- }
+ if ((prefs.hex_gui_lagometer & 2) || (prefs.hex_gui_throttlemeter & 2))
+ {
+ infbox = gtk_hbox_new (0, 0);
+ gtk_box_pack_start (GTK_BOX (box), infbox, 0, 0, 0);
+ }
- if (prefs.hex_gui_lagometer & 1)
- {
- gui->lagometer = wid = gtk_progress_bar_new ();
+ if (prefs.hex_gui_lagometer & 1)
+ {
+ gui->lagometer = wid = gtk_progress_bar_new ();
#ifdef WIN32
- gtk_widget_set_size_request (wid, 1, 10);
+ gtk_widget_set_size_request (wid, 1, 10);
#else
- gtk_widget_set_size_request (wid, 1, 8);
+ gtk_widget_set_size_request (wid, 1, 8);
#endif
- wid = gtk_event_box_new ();
- gtk_container_add (GTK_CONTAINER (wid), gui->lagometer);
- gtk_box_pack_start (GTK_BOX (box), wid, 0, 0, 0);
- }
- if (prefs.hex_gui_lagometer & 2)
- {
- gui->laginfo = wid = mg_create_infoframe (infbox);
- gtk_label_set_text ((GtkLabel *) wid, "Lag");
- }
+ wid = gtk_event_box_new ();
+ gtk_container_add (GTK_CONTAINER (wid), gui->lagometer);
+ gtk_box_pack_start (GTK_BOX (box), wid, 0, 0, 0);
+ }
+ if (prefs.hex_gui_lagometer & 2)
+ {
+ gui->laginfo = wid = mg_create_infoframe (infbox);
+ gtk_label_set_text ((GtkLabel *) wid, "Lag");
+ }
- if (prefs.hex_gui_throttlemeter & 1)
- {
- gui->throttlemeter = wid = gtk_progress_bar_new ();
+ if (prefs.hex_gui_throttlemeter & 1)
+ {
+ gui->throttlemeter = wid = gtk_progress_bar_new ();
#ifdef WIN32
- gtk_widget_set_size_request (wid, 1, 10);
+ gtk_widget_set_size_request (wid, 1, 10);
#else
- gtk_widget_set_size_request (wid, 1, 8);
+ gtk_widget_set_size_request (wid, 1, 8);
#endif
- wid = gtk_event_box_new ();
- gtk_container_add (GTK_CONTAINER (wid), gui->throttlemeter);
- gtk_box_pack_start (GTK_BOX (box), wid, 0, 0, 0);
- }
- if (prefs.hex_gui_throttlemeter & 2)
- {
- gui->throttleinfo = wid = mg_create_infoframe (infbox);
- gtk_label_set_text ((GtkLabel *) wid, "Throttle");
- }
+ wid = gtk_event_box_new ();
+ gtk_container_add (GTK_CONTAINER (wid), gui->throttlemeter);
+ gtk_box_pack_start (GTK_BOX (box), wid, 0, 0, 0);
+ }
+ if (prefs.hex_gui_throttlemeter & 2)
+ {
+ gui->throttleinfo = wid = mg_create_infoframe (infbox);
+ gtk_label_set_text ((GtkLabel *) wid, "Throttle");
+ }
}
void
mg_update_meters (session_gui *gui)
{
- gtk_widget_destroy (gui->meter_box);
- gui->lagometer = NULL;
- gui->laginfo = NULL;
- gui->throttlemeter = NULL;
- gui->throttleinfo = NULL;
+ gtk_widget_destroy (gui->meter_box);
+ gui->lagometer = NULL;
+ gui->laginfo = NULL;
+ gui->throttlemeter = NULL;
+ gui->throttleinfo = NULL;
- mg_create_meters (gui, gui->button_box_parent);
- gtk_widget_show_all (gui->meter_box);
+ mg_create_meters (gui, gui->button_box_parent);
+ gtk_widget_show_all (gui->meter_box);
}
static void
mg_create_userlist (session_gui *gui, GtkWidget *box)
{
- GtkWidget *frame, *ulist, *vbox;
+ GtkWidget *frame, *ulist, *vbox;
- vbox = gtk_vbox_new (0, 1);
- gtk_container_add (GTK_CONTAINER (box), vbox);
+ vbox = gtk_vbox_new (0, 1);
+ gtk_container_add (GTK_CONTAINER (box), vbox);
- frame = gtk_frame_new (NULL);
- if (prefs.hex_gui_ulist_count)
- gtk_box_pack_start (GTK_BOX (vbox), frame, 0, 0, GUI_SPACING);
+ frame = gtk_frame_new (NULL);
+ if (prefs.hex_gui_ulist_count)
+ gtk_box_pack_start (GTK_BOX (vbox), frame, 0, 0, GUI_SPACING);
- gui->namelistinfo = gtk_label_new (NULL);
- gtk_container_add (GTK_CONTAINER (frame), gui->namelistinfo);
+ gui->namelistinfo = gtk_label_new (NULL);
+ gtk_container_add (GTK_CONTAINER (frame), gui->namelistinfo);
- gui->user_tree = ulist = userlist_create (vbox);
+ gui->user_tree = ulist = userlist_create (vbox);
- if (prefs.hex_gui_ulist_style)
- {
- gtk_widget_set_style (ulist, input_style);
- }
+ if (prefs.hex_gui_ulist_style)
+ {
+ gtk_widget_set_style (ulist, input_style);
+ }
- /*
- * Keep the user list in sync with the chat palette.
- *
- * - When "Use the text box font and colors" is enabled, we already want the
- * palette background.
- * - When "Dark mode" is enabled, we also force the user list to use the
- * palette colors so it doesn't stay blindingly white on GTK2 themes.
- */
- if (prefs.hex_gui_ulist_style || prefs.hex_gui_dark_mode)
- {
- gtk_widget_modify_base (ulist, GTK_STATE_NORMAL, &colors[COL_BG]);
- gtk_widget_modify_text (ulist, GTK_STATE_NORMAL, &colors[COL_FG]);
- }
+ /*
+ * Keep the user list in sync with the chat palette.
+ *
+ * - When "Use the text box font and colors" is enabled, we already want the
+ * palette background.
+ * - When "Dark mode" is enabled, we also force the user list to use the
+ * palette colors so it doesn't stay blindingly white on GTK2 themes.
+ */
+ if (prefs.hex_gui_ulist_style || prefs.hex_gui_dark_mode)
+ {
+ gtk_widget_modify_base (ulist, GTK_STATE_NORMAL, &colors[COL_BG]);
+ gtk_widget_modify_text (ulist, GTK_STATE_NORMAL, &colors[COL_FG]);
+ }
- mg_create_meters (gui, vbox);
+ mg_create_meters (gui, vbox);
- gui->button_box_parent = vbox;
- gui->button_box = mg_create_userlistbuttons (vbox);
+ gui->button_box_parent = vbox;
+ gui->button_box = mg_create_userlistbuttons (vbox);
}
static void
mg_vpane_cb (GtkPaned *pane, GParamSpec *param, session_gui *gui)
{
- prefs.hex_gui_pane_divider_position = gtk_paned_get_position (pane);
+ prefs.hex_gui_pane_divider_position = gtk_paned_get_position (pane);
}
static void
mg_leftpane_cb (GtkPaned *pane, GParamSpec *param, session_gui *gui)
{
- prefs.hex_gui_pane_left_size = gtk_paned_get_position (pane);
+ prefs.hex_gui_pane_left_size = gtk_paned_get_position (pane);
}
static void
mg_rightpane_cb (GtkPaned *pane, GParamSpec *param, session_gui *gui)
{
- int handle_size;
- GtkAllocation allocation;
+ int handle_size;
+ GtkAllocation allocation;
- gtk_widget_style_get (GTK_WIDGET (pane), "handle-size", &handle_size, NULL);
- /* record the position from the RIGHT side */
- gtk_widget_get_allocation (GTK_WIDGET(pane), &allocation);
- prefs.hex_gui_pane_right_size = allocation.width - gtk_paned_get_position (pane) - handle_size;
+ gtk_widget_style_get (GTK_WIDGET (pane), "handle-size", &handle_size, NULL);
+ /* record the position from the RIGHT side */
+ gtk_widget_get_allocation (GTK_WIDGET(pane), &allocation);
+ prefs.hex_gui_pane_right_size = allocation.width - gtk_paned_get_position (pane) - handle_size;
}
static gboolean
mg_add_pane_signals (session_gui *gui)
{
- g_signal_connect (G_OBJECT (gui->hpane_right), "notify::position",
- G_CALLBACK (mg_rightpane_cb), gui);
- g_signal_connect (G_OBJECT (gui->hpane_left), "notify::position",
- G_CALLBACK (mg_leftpane_cb), gui);
- g_signal_connect (G_OBJECT (gui->vpane_left), "notify::position",
- G_CALLBACK (mg_vpane_cb), gui);
- g_signal_connect (G_OBJECT (gui->vpane_right), "notify::position",
- G_CALLBACK (mg_vpane_cb), gui);
- return FALSE;
+ g_signal_connect (G_OBJECT (gui->hpane_right), "notify::position",
+ G_CALLBACK (mg_rightpane_cb), gui);
+ g_signal_connect (G_OBJECT (gui->hpane_left), "notify::position",
+ G_CALLBACK (mg_leftpane_cb), gui);
+ g_signal_connect (G_OBJECT (gui->vpane_left), "notify::position",
+ G_CALLBACK (mg_vpane_cb), gui);
+ g_signal_connect (G_OBJECT (gui->vpane_right), "notify::position",
+ G_CALLBACK (mg_vpane_cb), gui);
+ return FALSE;
}
static void
mg_create_center (session *sess, session_gui *gui, GtkWidget *box)
{
- GtkWidget *vbox, *hbox, *book;
+ GtkWidget *vbox, *hbox, *book;
- /* sep between top and bottom of left side */
- gui->vpane_left = gtk_vpaned_new ();
+ /* sep between top and bottom of left side */
+ gui->vpane_left = gtk_vpaned_new ();
- /* sep between top and bottom of right side */
- gui->vpane_right = gtk_vpaned_new ();
+ /* sep between top and bottom of right side */
+ gui->vpane_right = gtk_vpaned_new ();
- /* sep between left and xtext */
- gui->hpane_left = gtk_hpaned_new ();
- gtk_paned_set_position (GTK_PANED (gui->hpane_left), prefs.hex_gui_pane_left_size);
+ /* sep between left and xtext */
+ gui->hpane_left = gtk_hpaned_new ();
+ gtk_paned_set_position (GTK_PANED (gui->hpane_left), prefs.hex_gui_pane_left_size);
- /* sep between xtext and right side */
- gui->hpane_right = gtk_hpaned_new ();
+ /* sep between xtext and right side */
+ gui->hpane_right = gtk_hpaned_new ();
- if (prefs.hex_gui_win_swap)
- {
- gtk_paned_pack2 (GTK_PANED (gui->hpane_left), gui->vpane_left, FALSE, TRUE);
- gtk_paned_pack1 (GTK_PANED (gui->hpane_left), gui->hpane_right, TRUE, TRUE);
- }
- else
- {
- gtk_paned_pack1 (GTK_PANED (gui->hpane_left), gui->vpane_left, FALSE, TRUE);
- gtk_paned_pack2 (GTK_PANED (gui->hpane_left), gui->hpane_right, TRUE, TRUE);
- }
- gtk_paned_pack2 (GTK_PANED (gui->hpane_right), gui->vpane_right, FALSE, TRUE);
+ if (prefs.hex_gui_win_swap)
+ {
+ gtk_paned_pack2 (GTK_PANED (gui->hpane_left), gui->vpane_left, FALSE, TRUE);
+ gtk_paned_pack1 (GTK_PANED (gui->hpane_left), gui->hpane_right, TRUE, TRUE);
+ }
+ else
+ {
+ gtk_paned_pack1 (GTK_PANED (gui->hpane_left), gui->vpane_left, FALSE, TRUE);
+ gtk_paned_pack2 (GTK_PANED (gui->hpane_left), gui->hpane_right, TRUE, TRUE);
+ }
+ gtk_paned_pack2 (GTK_PANED (gui->hpane_right), gui->vpane_right, FALSE, TRUE);
- gtk_container_add (GTK_CONTAINER (box), gui->hpane_left);
+ gtk_container_add (GTK_CONTAINER (box), gui->hpane_left);
- gui->note_book = book = gtk_notebook_new ();
- gtk_notebook_set_show_tabs (GTK_NOTEBOOK (book), FALSE);
- gtk_notebook_set_show_border (GTK_NOTEBOOK (book), FALSE);
- gtk_paned_pack1 (GTK_PANED (gui->hpane_right), book, TRUE, TRUE);
+ gui->note_book = book = gtk_notebook_new ();
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (book), FALSE);
+ gtk_notebook_set_show_border (GTK_NOTEBOOK (book), FALSE);
+ gtk_paned_pack1 (GTK_PANED (gui->hpane_right), book, TRUE, TRUE);
- hbox = gtk_hbox_new (FALSE, 0);
- gtk_paned_pack1 (GTK_PANED (gui->vpane_right), hbox, FALSE, TRUE);
- mg_create_userlist (gui, hbox);
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_paned_pack1 (GTK_PANED (gui->vpane_right), hbox, FALSE, TRUE);
+ mg_create_userlist (gui, hbox);
- gui->user_box = hbox;
+ gui->user_box = hbox;
- vbox = gtk_vbox_new (FALSE, 3);
- gtk_notebook_append_page (GTK_NOTEBOOK (book), vbox, NULL);
- mg_create_topicbar (sess, vbox);
+ vbox = gtk_vbox_new (FALSE, 3);
+ gtk_notebook_append_page (GTK_NOTEBOOK (book), vbox, NULL);
+ mg_create_topicbar (sess, vbox);
- if (prefs.hex_gui_search_pos)
- {
- mg_create_search (sess, vbox);
- mg_create_textarea (sess, vbox);
- }
- else
- {
- mg_create_textarea (sess, vbox);
- mg_create_search (sess, vbox);
- }
+ if (prefs.hex_gui_search_pos)
+ {
+ mg_create_search (sess, vbox);
+ mg_create_textarea (sess, vbox);
+ }
+ else
+ {
+ mg_create_textarea (sess, vbox);
+ mg_create_search (sess, vbox);
+ }
- mg_create_entry (sess, vbox);
+ mg_create_entry (sess, vbox);
- mg_add_pane_signals (gui);
+ mg_add_pane_signals (gui);
}
static void
mg_change_nick (int cancel, char *text, gpointer userdata)
{
- char buf[256];
+ char buf[256];
- if (!cancel)
- {
- g_snprintf (buf, sizeof (buf), "nick %s", text);
- handle_command (current_sess, buf, FALSE);
- }
+ if (!cancel)
+ {
+ g_snprintf (buf, sizeof (buf), "nick %s", text);
+ handle_command (current_sess, buf, FALSE);
+ }
}
static void
mg_nickclick_cb (GtkWidget *button, gpointer userdata)
{
- fe_get_str (_("Enter new nickname:"), current_sess->server->nick,
- mg_change_nick, (void *) 1);
+ fe_get_str (_("Enter new nickname:"), current_sess->server->nick,
+ mg_change_nick, (void *) 1);
}
/* make sure chanview and userlist positions are sane */
@@ -2627,424 +2643,633 @@ mg_nickclick_cb (GtkWidget *button, gpointer userdata)
static void
mg_sanitize_positions (int *cv, int *ul)
{
- if (prefs.hex_gui_tab_layout == 2)
- {
- /* treeview can't be on TOP or BOTTOM */
- if (*cv == POS_TOP || *cv == POS_BOTTOM)
- *cv = POS_TOPLEFT;
- }
+ if (prefs.hex_gui_tab_layout == 2)
+ {
+ /* treeview can't be on TOP or BOTTOM */
+ if (*cv == POS_TOP || *cv == POS_BOTTOM)
+ *cv = POS_TOPLEFT;
+ }
- /* userlist can't be on TOP or BOTTOM */
- if (*ul == POS_TOP || *ul == POS_BOTTOM)
- *ul = POS_TOPRIGHT;
+ /* userlist can't be on TOP or BOTTOM */
+ if (*ul == POS_TOP || *ul == POS_BOTTOM)
+ *ul = POS_TOPRIGHT;
- /* can't have both in the same place */
- if (*cv == *ul)
- {
- *cv = POS_TOPRIGHT;
- if (*ul == POS_TOPRIGHT)
- *cv = POS_BOTTOMRIGHT;
- }
+ /* can't have both in the same place */
+ if (*cv == *ul)
+ {
+ *cv = POS_TOPRIGHT;
+ if (*ul == POS_TOPRIGHT)
+ *cv = POS_BOTTOMRIGHT;
+ }
}
static void
mg_place_userlist_and_chanview_real (session_gui *gui, GtkWidget *userlist, GtkWidget *chanview)
{
- int unref_userlist = FALSE;
- int unref_chanview = FALSE;
+ int unref_userlist = FALSE;
+ int unref_chanview = FALSE;
- /* first, remove userlist/treeview from their containers */
- if (userlist && gtk_widget_get_parent (userlist))
- {
- g_object_ref (userlist);
- gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (userlist)), userlist);
- unref_userlist = TRUE;
- }
+ /* first, remove userlist/treeview from their containers */
+ if (userlist && gtk_widget_get_parent (userlist))
+ {
+ g_object_ref (userlist);
+ gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (userlist)), userlist);
+ unref_userlist = TRUE;
+ }
- if (chanview && gtk_widget_get_parent (chanview))
- {
- g_object_ref (chanview);
- gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (chanview)), chanview);
- unref_chanview = TRUE;
- }
+ if (chanview && gtk_widget_get_parent (chanview))
+ {
+ g_object_ref (chanview);
+ gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (chanview)), chanview);
+ unref_chanview = TRUE;
+ }
- if (chanview)
- {
- /* incase the previous pos was POS_HIDDEN */
- gtk_widget_show (chanview);
+ if (chanview)
+ {
+ /* incase the previous pos was POS_HIDDEN */
+ gtk_widget_show (chanview);
- gtk_table_set_row_spacing (GTK_TABLE (gui->main_table), 1, 0);
- gtk_table_set_row_spacing (GTK_TABLE (gui->main_table), 2, 2);
+ gtk_table_set_row_spacing (GTK_TABLE (gui->main_table), 1, 0);
+ gtk_table_set_row_spacing (GTK_TABLE (gui->main_table), 2, 2);
- /* then place them back in their new positions */
- switch (prefs.hex_gui_tab_pos)
- {
- case POS_TOPLEFT:
- gtk_paned_pack1 (GTK_PANED (gui->vpane_left), chanview, FALSE, TRUE);
- break;
- case POS_BOTTOMLEFT:
- gtk_paned_pack2 (GTK_PANED (gui->vpane_left), chanview, FALSE, TRUE);
- break;
- case POS_TOPRIGHT:
- gtk_paned_pack1 (GTK_PANED (gui->vpane_right), chanview, FALSE, TRUE);
- break;
- case POS_BOTTOMRIGHT:
- gtk_paned_pack2 (GTK_PANED (gui->vpane_right), chanview, FALSE, TRUE);
- break;
- case POS_TOP:
- gtk_table_set_row_spacing (GTK_TABLE (gui->main_table), 1, GUI_SPACING-1);
- gtk_table_attach (GTK_TABLE (gui->main_table), chanview,
- 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
- break;
- case POS_HIDDEN:
- gtk_widget_hide (chanview);
- /* always attach it to something to avoid ref_count=0 */
- if (prefs.hex_gui_ulist_pos == POS_TOP)
- gtk_table_attach (GTK_TABLE (gui->main_table), chanview,
- 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
+ /* then place them back in their new positions */
+ switch (prefs.hex_gui_tab_pos)
+ {
+ case POS_TOPLEFT:
+ gtk_paned_pack1 (GTK_PANED (gui->vpane_left), chanview, FALSE, TRUE);
+ break;
+ case POS_BOTTOMLEFT:
+ gtk_paned_pack2 (GTK_PANED (gui->vpane_left), chanview, FALSE, TRUE);
+ break;
+ case POS_TOPRIGHT:
+ gtk_paned_pack1 (GTK_PANED (gui->vpane_right), chanview, FALSE, TRUE);
+ break;
+ case POS_BOTTOMRIGHT:
+ gtk_paned_pack2 (GTK_PANED (gui->vpane_right), chanview, FALSE, TRUE);
+ break;
+ case POS_TOP:
+ gtk_table_set_row_spacing (GTK_TABLE (gui->main_table), 1, GUI_SPACING-1);
+ gtk_table_attach (GTK_TABLE (gui->main_table), chanview,
+ 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
+ break;
+ case POS_HIDDEN:
+ gtk_widget_hide (chanview);
+ /* always attach it to something to avoid ref_count=0 */
+ if (prefs.hex_gui_ulist_pos == POS_TOP)
+ gtk_table_attach (GTK_TABLE (gui->main_table), chanview,
+ 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
- else
- gtk_table_attach (GTK_TABLE (gui->main_table), chanview,
- 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
- break;
- default:/* POS_BOTTOM */
- gtk_table_set_row_spacing (GTK_TABLE (gui->main_table), 2, 3);
- gtk_table_attach (GTK_TABLE (gui->main_table), chanview,
- 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
- }
- }
+ else
+ gtk_table_attach (GTK_TABLE (gui->main_table), chanview,
+ 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
+ break;
+ default:/* POS_BOTTOM */
+ gtk_table_set_row_spacing (GTK_TABLE (gui->main_table), 2, 3);
+ gtk_table_attach (GTK_TABLE (gui->main_table), chanview,
+ 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
+ }
+ }
- if (userlist)
- {
- switch (prefs.hex_gui_ulist_pos)
- {
- case POS_TOPLEFT:
- gtk_paned_pack1 (GTK_PANED (gui->vpane_left), userlist, FALSE, TRUE);
- break;
- case POS_BOTTOMLEFT:
- gtk_paned_pack2 (GTK_PANED (gui->vpane_left), userlist, FALSE, TRUE);
- break;
- case POS_BOTTOMRIGHT:
- gtk_paned_pack2 (GTK_PANED (gui->vpane_right), userlist, FALSE, TRUE);
- break;
- /*case POS_HIDDEN:
- break;*/ /* Hide using the VIEW menu instead */
- default:/* POS_TOPRIGHT */
- gtk_paned_pack1 (GTK_PANED (gui->vpane_right), userlist, FALSE, TRUE);
- }
- }
+ if (userlist)
+ {
+ switch (prefs.hex_gui_ulist_pos)
+ {
+ case POS_TOPLEFT:
+ gtk_paned_pack1 (GTK_PANED (gui->vpane_left), userlist, FALSE, TRUE);
+ break;
+ case POS_BOTTOMLEFT:
+ gtk_paned_pack2 (GTK_PANED (gui->vpane_left), userlist, FALSE, TRUE);
+ break;
+ case POS_BOTTOMRIGHT:
+ gtk_paned_pack2 (GTK_PANED (gui->vpane_right), userlist, FALSE, TRUE);
+ break;
+ /*case POS_HIDDEN:
+ break;*/ /* Hide using the VIEW menu instead */
+ default:/* POS_TOPRIGHT */
+ gtk_paned_pack1 (GTK_PANED (gui->vpane_right), userlist, FALSE, TRUE);
+ }
+ }
- if (mg_is_userlist_and_tree_combined () && prefs.hex_gui_pane_divider_position != 0)
- {
- gtk_paned_set_position (GTK_PANED (gui->vpane_left), prefs.hex_gui_pane_divider_position);
- gtk_paned_set_position (GTK_PANED (gui->vpane_right), prefs.hex_gui_pane_divider_position);
- }
+ if (mg_is_userlist_and_tree_combined () && prefs.hex_gui_pane_divider_position != 0)
+ {
+ gtk_paned_set_position (GTK_PANED (gui->vpane_left), prefs.hex_gui_pane_divider_position);
+ gtk_paned_set_position (GTK_PANED (gui->vpane_right), prefs.hex_gui_pane_divider_position);
+ }
- if (unref_chanview)
- g_object_unref (chanview);
- if (unref_userlist)
- g_object_unref (userlist);
+ if (unref_chanview)
+ g_object_unref (chanview);
+ if (unref_userlist)
+ g_object_unref (userlist);
- mg_hide_empty_boxes (gui);
+ mg_hide_empty_boxes (gui);
}
static void
mg_place_userlist_and_chanview (session_gui *gui)
{
- GtkOrientation orientation;
- GtkWidget *chanviewbox = NULL;
- int pos;
+ GtkOrientation orientation;
+ GtkWidget *chanviewbox = NULL;
+ int pos;
- mg_sanitize_positions (&prefs.hex_gui_tab_pos, &prefs.hex_gui_ulist_pos);
+ mg_sanitize_positions (&prefs.hex_gui_tab_pos, &prefs.hex_gui_ulist_pos);
- if (gui->chanview)
- {
- pos = prefs.hex_gui_tab_pos;
+ if (gui->chanview)
+ {
+ pos = prefs.hex_gui_tab_pos;
- orientation = chanview_get_orientation (gui->chanview);
- if ((pos == POS_BOTTOM || pos == POS_TOP) && orientation == GTK_ORIENTATION_VERTICAL)
- chanview_set_orientation (gui->chanview, FALSE);
- else if ((pos == POS_TOPLEFT || pos == POS_BOTTOMLEFT || pos == POS_TOPRIGHT || pos == POS_BOTTOMRIGHT) && orientation == GTK_ORIENTATION_HORIZONTAL)
- chanview_set_orientation (gui->chanview, TRUE);
- chanviewbox = chanview_get_box (gui->chanview);
- }
+ orientation = chanview_get_orientation (gui->chanview);
+ if ((pos == POS_BOTTOM || pos == POS_TOP) && orientation == GTK_ORIENTATION_VERTICAL)
+ chanview_set_orientation (gui->chanview, FALSE);
+ else if ((pos == POS_TOPLEFT || pos == POS_BOTTOMLEFT || pos == POS_TOPRIGHT || pos == POS_BOTTOMRIGHT) && orientation == GTK_ORIENTATION_HORIZONTAL)
+ chanview_set_orientation (gui->chanview, TRUE);
+ chanviewbox = chanview_get_box (gui->chanview);
+ }
- mg_place_userlist_and_chanview_real (gui, gui->user_box, chanviewbox);
+ mg_place_userlist_and_chanview_real (gui, gui->user_box, chanviewbox);
}
void
mg_change_layout (int type)
{
- if (mg_gui)
- {
- /* put tabs at the bottom */
- if (type == 0 && prefs.hex_gui_tab_pos != POS_BOTTOM && prefs.hex_gui_tab_pos != POS_TOP)
- prefs.hex_gui_tab_pos = POS_BOTTOM;
+ if (mg_gui)
+ {
+ /* put tabs at the bottom */
+ if (type == 0 && prefs.hex_gui_tab_pos != POS_BOTTOM && prefs.hex_gui_tab_pos != POS_TOP)
+ prefs.hex_gui_tab_pos = POS_BOTTOM;
- mg_place_userlist_and_chanview (mg_gui);
- chanview_set_impl (mg_gui->chanview, type);
- }
+ mg_place_userlist_and_chanview (mg_gui);
+ chanview_set_impl (mg_gui->chanview, type);
+ }
}
static void
mg_inputbox_rightclick (GtkEntry *entry, GtkWidget *menu)
{
- mg_create_color_menu (menu, NULL);
+ mg_create_color_menu (menu, NULL);
+}
+
+/* ------------------------------------------------------------------------- *
+ * Emoji font handling (GTK2)
+ *
+ * Goal: prefer color emoji fonts when available, without changing existing
+ * font size/style/weight, and without breaking user-configured fonts.
+ * ------------------------------------------------------------------------- */
+
+static const char *mg_emoji_family_fallback =
+ "Noto Color Emoji, Segoe UI Emoji, Apple Color Emoji, Twemoji Mozilla, EmojiOne Color";
+
+static gboolean
+mg_family_already_has_emoji (const gchar *family)
+{
+ if (!family || !*family)
+ return FALSE;
+
+ /* cheap but effective */
+ return (strstr (family, "Noto Color Emoji") != NULL) ||
+ (strstr (family, "Segoe UI Emoji") != NULL) ||
+ (strstr (family, "Apple Color Emoji") != NULL) ||
+ (strstr (family, "Twemoji") != NULL) ||
+ (strstr (family, "EmojiOne") != NULL);
+}
+
+static PangoFontDescription *
+mg_fontdesc_with_fallback (const PangoFontDescription *base_desc, gboolean emoji_first)
+{
+ PangoFontDescription *desc;
+ const gchar *base_family;
+ gchar *family_list;
+
+ if (!base_desc)
+ return NULL;
+
+ desc = pango_font_description_copy (base_desc);
+ base_family = pango_font_description_get_family (desc);
+
+ if (mg_family_already_has_emoji (base_family))
+ return desc;
+
+ if (emoji_first)
+ {
+ family_list = g_strdup_printf ("%s, %s",
+ mg_emoji_family_fallback,
+ (base_family && *base_family) ? base_family : "Sans");
+ }
+ else
+ {
+ family_list = g_strdup_printf ("%s, %s",
+ (base_family && *base_family) ? base_family : "Sans",
+ mg_emoji_family_fallback);
+ }
+
+ pango_font_description_set_family (desc, family_list);
+ g_free (family_list);
+
+ return desc;
+}
+
+static void
+mg_apply_emoji_fallback_widget (GtkWidget *widget)
+{
+ GtkStyle *style;
+ PangoFontDescription *desc;
+
+ if (!widget)
+ return;
+
+ style = gtk_widget_get_style (widget);
+ if (!style || !style->font_desc)
+ return;
+
+ desc = mg_fontdesc_with_fallback (style->font_desc, FALSE);
+ if (!desc)
+ return;
+
+ gtk_widget_modify_font (widget, desc);
+ pango_font_description_free (desc);
+}
+
+static void
+mg_apply_emoji_primary_widget (GtkWidget *widget)
+{
+ GtkStyle *style;
+ PangoFontDescription *desc;
+
+ if (!widget)
+ return;
+
+ style = gtk_widget_get_style (widget);
+ if (!style || !style->font_desc)
+ return;
+
+ desc = mg_fontdesc_with_fallback (style->font_desc, TRUE);
+ if (!desc)
+ return;
+
+ gtk_widget_modify_font (widget, desc);
+ pango_font_description_free (desc);
+}
+
+static gchar *
+mg_font_string_with_emoji_fallback (const gchar *font_string)
+{
+ PangoFontDescription *base;
+ PangoFontDescription *with_fallback;
+ gchar *out;
+
+ /* Keep existing behavior if unset, but still allow emoji fallback */
+ base = pango_font_description_from_string (font_string && *font_string ? font_string : "Sans 10");
+ with_fallback = mg_fontdesc_with_fallback (base, FALSE);
+
+ out = pango_font_description_to_string (with_fallback ? with_fallback : base);
+
+ if (with_fallback)
+ pango_font_description_free (with_fallback);
+ pango_font_description_free (base);
+
+ return out;
+}
+
+/* ------------------------------------------------------------------------- *
+ * Emoji picker (optional UI sugar)
+ * ------------------------------------------------------------------------- */
+
+static void
+mg_emoji_insert_cb (GtkMenuItem *item, session_gui *gui)
+{
+ const char *emoji = g_object_get_data (G_OBJECT (item), "emoji");
+ gint pos;
+
+ if (!emoji || !gui || !gui->input_box)
+ return;
+
+ pos = SPELL_ENTRY_GET_POS (gui->input_box);
+ gtk_editable_insert_text (GTK_EDITABLE (gui->input_box), emoji, -1, &pos);
+ gtk_editable_set_position (GTK_EDITABLE (gui->input_box), pos);
+ gtk_widget_grab_focus (gui->input_box);
+}
+
+static GtkWidget *
+mg_create_emoji_menu (session_gui *gui)
+{
+ /* VS16 (emoji presentation). No, it does not need a space. */
+#define VS16 "\xEF\xB8\x8F"
+ static const char *emoji_list[] = {
+ "😀","😃","😄","😁","😆","😂","🤣","😊","😇","😉","😍",
+ "🥰","😘","😜","🤪","😎","🤩","🤔","🤨","😐","😶","🙄",
+ "😏","😣","😥","😮","😯","😪","😴","😌","😔","😢",
+ "😭","😤","😠","😡","🤬","🥺","😳","🤗","🤭","🤫",
+ "🤐","😷","🤒","🤕","🤢","🤮","🥵","🥶","🥴","🤯",
+ "👍"VS16,"👎"VS16,"👏"VS16,"🙌"VS16,"🙏"VS16,"💪"VS16,
+ "👀"VS16,"💯"VS16,"✅"VS16,"❌"VS16,"🎉"VS16,"🔥"VS16,
+ "❤","💔","💖","💙","💚","💛","💜","🧡","🤍","🖤",
+ "⭐"VS16,"🌟","✨","⚡"VS16,"☀","🌈","☕"VS16,"🍕",
+ "🍔","🍟","🍣","🍩","🎂","🍺","🍷","🎁","🎈","🎯",
+ "🎵","🎶","🎮","🚀","✈","🚗","🚕","🚲","🏡","🌍",
+ NULL
+ };
+#undef VS16
+
+ GtkWidget *menu;
+ const int columns = 8;
+ int i;
+
+ menu = gtk_menu_new ();
+
+ for (i = 0; emoji_list[i]; i++)
+ {
+ GtkWidget *item = gtk_menu_item_new_with_label (emoji_list[i]);
+ int row = i / columns;
+ int col = i % columns;
+
+ g_object_set_data_full (G_OBJECT (item), "emoji", g_strdup (emoji_list[i]), g_free);
+ g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (mg_emoji_insert_cb), gui);
+
+ /* Prefer emoji fonts for the label itself */
+ mg_apply_emoji_primary_widget (item);
+
+ gtk_menu_attach (GTK_MENU (menu), item, col, col + 1, row, row + 1);
+ gtk_widget_show (item);
+ }
+
+ g_signal_connect (G_OBJECT (menu), "selection-done", G_CALLBACK (gtk_widget_destroy), NULL);
+ return menu;
+}
+
+static void
+mg_emoji_button_cb (GtkWidget *widget, session_gui *gui)
+{
+ GtkWidget *menu;
+
+ menu = mg_create_emoji_menu (gui);
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ());
}
/* Search bar adapted from Conspire's by William Pitcock */
-#define SEARCH_CHANGE 1
-#define SEARCH_NEXT 2
-#define SEARCH_PREVIOUS 3
-#define SEARCH_REFRESH 4
+#define SEARCH_CHANGE 1
+#define SEARCH_NEXT 2
+#define SEARCH_PREVIOUS 3
+#define SEARCH_REFRESH 4
static void
search_handle_event(int search_type, session *sess)
{
- textentry *last;
- const gchar *text = NULL;
- gtk_xtext_search_flags flags;
- GError *err = NULL;
- gboolean backwards = FALSE;
+ textentry *last;
+ const gchar *text = NULL;
+ gtk_xtext_search_flags flags;
+ GError *err = NULL;
+ gboolean backwards = FALSE;
- /* When just typing show most recent first */
- if (search_type == SEARCH_PREVIOUS || search_type == SEARCH_CHANGE)
- backwards = TRUE;
+ /* When just typing show most recent first */
+ if (search_type == SEARCH_PREVIOUS || search_type == SEARCH_CHANGE)
+ backwards = TRUE;
- flags = ((prefs.hex_text_search_case_match == 1? case_match: 0) |
- (backwards? backward: 0) |
- (prefs.hex_text_search_highlight_all == 1? highlight: 0) |
- (prefs.hex_text_search_follow == 1? follow: 0) |
- (prefs.hex_text_search_regexp == 1? regexp: 0));
+ flags = ((prefs.hex_text_search_case_match == 1? case_match: 0) |
+ (backwards? backward: 0) |
+ (prefs.hex_text_search_highlight_all == 1? highlight: 0) |
+ (prefs.hex_text_search_follow == 1? follow: 0) |
+ (prefs.hex_text_search_regexp == 1? regexp: 0));
- if (search_type != SEARCH_REFRESH)
- text = gtk_entry_get_text (GTK_ENTRY(sess->gui->shentry));
- last = gtk_xtext_search (GTK_XTEXT (sess->gui->xtext), text, flags, &err);
+ if (search_type != SEARCH_REFRESH)
+ text = gtk_entry_get_text (GTK_ENTRY(sess->gui->shentry));
+ last = gtk_xtext_search (GTK_XTEXT (sess->gui->xtext), text, flags, &err);
- if (err)
- {
- gtk_entry_set_icon_from_stock (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_DIALOG_ERROR);
- gtk_entry_set_icon_tooltip_text (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, _(err->message));
- g_error_free (err);
- }
- else if (!last)
- {
- if (text && text[0] == 0) /* empty string, no error */
- {
- gtk_entry_set_icon_from_stock (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, NULL);
- }
- else
- {
- /* Either end of search or not found, try again to wrap if only end */
- last = gtk_xtext_search (GTK_XTEXT (sess->gui->xtext), text, flags, &err);
- if (!last) /* Not found error */
- {
- gtk_entry_set_icon_from_stock (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_DIALOG_ERROR);
- gtk_entry_set_icon_tooltip_text (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, _("No results found."));
- }
- }
- }
- else
- {
- gtk_entry_set_icon_from_stock (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, NULL);
- }
+ if (err)
+ {
+ gtk_entry_set_icon_from_stock (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_DIALOG_ERROR);
+ gtk_entry_set_icon_tooltip_text (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, _(err->message));
+ g_error_free (err);
+ }
+ else if (!last)
+ {
+ if (text && text[0] == 0) /* empty string, no error */
+ {
+ gtk_entry_set_icon_from_stock (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, NULL);
+ }
+ else
+ {
+ /* Either end of search or not found, try again to wrap if only end */
+ last = gtk_xtext_search (GTK_XTEXT (sess->gui->xtext), text, flags, &err);
+ if (!last) /* Not found error */
+ {
+ gtk_entry_set_icon_from_stock (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_DIALOG_ERROR);
+ gtk_entry_set_icon_tooltip_text (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, _("No results found."));
+ }
+ }
+ }
+ else
+ {
+ gtk_entry_set_icon_from_stock (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, NULL);
+ }
}
static void
search_handle_change(GtkWidget *wid, session *sess)
{
- search_handle_event(SEARCH_CHANGE, sess);
+ search_handle_event(SEARCH_CHANGE, sess);
}
static void
search_handle_refresh(GtkWidget *wid, session *sess)
{
- search_handle_event(SEARCH_REFRESH, sess);
+ search_handle_event(SEARCH_REFRESH, sess);
}
void
mg_search_handle_previous(GtkWidget *wid, session *sess)
{
- search_handle_event(SEARCH_PREVIOUS, sess);
+ search_handle_event(SEARCH_PREVIOUS, sess);
}
void
mg_search_handle_next(GtkWidget *wid, session *sess)
{
- search_handle_event(SEARCH_NEXT, sess);
+ search_handle_event(SEARCH_NEXT, sess);
}
static void
search_set_option (GtkToggleButton *but, guint *pref)
{
- *pref = gtk_toggle_button_get_active(but);
- save_config();
+ *pref = gtk_toggle_button_get_active(but);
+ save_config();
}
void
mg_search_toggle(session *sess)
{
- if (gtk_widget_get_visible(sess->gui->shbox))
- {
- gtk_widget_hide(sess->gui->shbox);
- gtk_widget_grab_focus(sess->gui->input_box);
- gtk_entry_set_text(GTK_ENTRY(sess->gui->shentry), "");
- }
- else
- {
- /* Reset search state */
- gtk_entry_set_icon_from_stock (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, NULL);
+ if (gtk_widget_get_visible(sess->gui->shbox))
+ {
+ gtk_widget_hide(sess->gui->shbox);
+ gtk_widget_grab_focus(sess->gui->input_box);
+ gtk_entry_set_text(GTK_ENTRY(sess->gui->shentry), "");
+ }
+ else
+ {
+ /* Reset search state */
+ gtk_entry_set_icon_from_stock (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, NULL);
- /* Show and focus */
- gtk_widget_show(sess->gui->shbox);
- gtk_widget_grab_focus(sess->gui->shentry);
- }
+ /* Show and focus */
+ gtk_widget_show(sess->gui->shbox);
+ gtk_widget_grab_focus(sess->gui->shentry);
+ }
}
static gboolean
search_handle_esc (GtkWidget *win, GdkEventKey *key, session *sess)
{
- if (key->keyval == GDK_KEY_Escape)
- mg_search_toggle(sess);
-
- return FALSE;
+ if (key->keyval == GDK_KEY_Escape)
+ mg_search_toggle(sess);
+
+ return FALSE;
}
static void
mg_create_search(session *sess, GtkWidget *box)
{
- GtkWidget *entry, *label, *next, *previous, *highlight, *matchcase, *regex, *close;
- session_gui *gui = sess->gui;
+ GtkWidget *entry, *label, *next, *previous, *highlight, *matchcase, *regex, *close;
+ session_gui *gui = sess->gui;
- gui->shbox = gtk_hbox_new(FALSE, 5);
- gtk_box_pack_start(GTK_BOX(box), gui->shbox, FALSE, FALSE, 0);
+ gui->shbox = gtk_hbox_new(FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(box), gui->shbox, FALSE, FALSE, 0);
- close = gtk_button_new ();
- gtk_button_set_image (GTK_BUTTON (close), gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU));
- gtk_button_set_relief(GTK_BUTTON(close), GTK_RELIEF_NONE);
- gtk_widget_set_can_focus (close, FALSE);
- gtk_box_pack_start(GTK_BOX(gui->shbox), close, FALSE, FALSE, 0);
- g_signal_connect_swapped(G_OBJECT(close), "clicked", G_CALLBACK(mg_search_toggle), sess);
+ close = gtk_button_new ();
+ gtk_button_set_image (GTK_BUTTON (close), gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU));
+ gtk_button_set_relief(GTK_BUTTON(close), GTK_RELIEF_NONE);
+ gtk_widget_set_can_focus (close, FALSE);
+ gtk_box_pack_start(GTK_BOX(gui->shbox), close, FALSE, FALSE, 0);
+ g_signal_connect_swapped(G_OBJECT(close), "clicked", G_CALLBACK(mg_search_toggle), sess);
- label = gtk_label_new(_("Find:"));
- gtk_box_pack_start(GTK_BOX(gui->shbox), label, FALSE, FALSE, 0);
+ label = gtk_label_new(_("Find:"));
+ gtk_box_pack_start(GTK_BOX(gui->shbox), label, FALSE, FALSE, 0);
- gui->shentry = entry = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(gui->shbox), entry, FALSE, FALSE, 0);
- gtk_widget_set_size_request (gui->shentry, 180, -1);
- gui->search_changed_signal = g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(search_handle_change), sess);
- g_signal_connect (G_OBJECT (entry), "key_press_event", G_CALLBACK (search_handle_esc), sess);
- g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(mg_search_handle_next), sess);
- gtk_entry_set_icon_activatable (GTK_ENTRY (entry), GTK_ENTRY_ICON_SECONDARY, FALSE);
- gtk_entry_set_icon_tooltip_text (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, _("Search hit end or not found."));
+ gui->shentry = entry = gtk_entry_new();
+ gtk_box_pack_start(GTK_BOX(gui->shbox), entry, FALSE, FALSE, 0);
+ gtk_widget_set_size_request (gui->shentry, 180, -1);
+ mg_apply_emoji_fallback_widget (entry);
+ gui->search_changed_signal = g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(search_handle_change), sess);
+ g_signal_connect (G_OBJECT (entry), "key_press_event", G_CALLBACK (search_handle_esc), sess);
+ g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(mg_search_handle_next), sess);
+ gtk_entry_set_icon_activatable (GTK_ENTRY (entry), GTK_ENTRY_ICON_SECONDARY, FALSE);
+ gtk_entry_set_icon_tooltip_text (GTK_ENTRY (sess->gui->shentry), GTK_ENTRY_ICON_SECONDARY, _("Search hit end or not found."));
- previous = gtk_button_new ();
- gtk_button_set_image (GTK_BUTTON (previous), gtk_image_new_from_stock (GTK_STOCK_GO_BACK, GTK_ICON_SIZE_MENU));
- gtk_button_set_relief(GTK_BUTTON(previous), GTK_RELIEF_NONE);
- gtk_widget_set_can_focus (previous, FALSE);
- gtk_box_pack_start(GTK_BOX(gui->shbox), previous, FALSE, FALSE, 0);
- g_signal_connect(G_OBJECT(previous), "clicked", G_CALLBACK(mg_search_handle_previous), sess);
+ previous = gtk_button_new ();
+ gtk_button_set_image (GTK_BUTTON (previous), gtk_image_new_from_stock (GTK_STOCK_GO_BACK, GTK_ICON_SIZE_MENU));
+ gtk_button_set_relief(GTK_BUTTON(previous), GTK_RELIEF_NONE);
+ gtk_widget_set_can_focus (previous, FALSE);
+ gtk_box_pack_start(GTK_BOX(gui->shbox), previous, FALSE, FALSE, 0);
+ g_signal_connect(G_OBJECT(previous), "clicked", G_CALLBACK(mg_search_handle_previous), sess);
- next = gtk_button_new ();
- gtk_button_set_image (GTK_BUTTON (next), gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD, GTK_ICON_SIZE_MENU));
- gtk_button_set_relief(GTK_BUTTON(next), GTK_RELIEF_NONE);
- gtk_widget_set_can_focus (next, FALSE);
- gtk_box_pack_start(GTK_BOX(gui->shbox), next, FALSE, FALSE, 0);
- g_signal_connect(G_OBJECT(next), "clicked", G_CALLBACK(mg_search_handle_next), sess);
+ next = gtk_button_new ();
+ gtk_button_set_image (GTK_BUTTON (next), gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD, GTK_ICON_SIZE_MENU));
+ gtk_button_set_relief(GTK_BUTTON(next), GTK_RELIEF_NONE);
+ gtk_widget_set_can_focus (next, FALSE);
+ gtk_box_pack_start(GTK_BOX(gui->shbox), next, FALSE, FALSE, 0);
+ g_signal_connect(G_OBJECT(next), "clicked", G_CALLBACK(mg_search_handle_next), sess);
- highlight = gtk_check_button_new_with_mnemonic (_("_Highlight all"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(highlight), prefs.hex_text_search_highlight_all);
- gtk_widget_set_can_focus (highlight, FALSE);
- g_signal_connect (G_OBJECT (highlight), "toggled", G_CALLBACK (search_set_option), &prefs.hex_text_search_highlight_all);
- g_signal_connect (G_OBJECT (highlight), "toggled", G_CALLBACK (search_handle_refresh), sess);
- gtk_box_pack_start(GTK_BOX(gui->shbox), highlight, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text (highlight, _("Highlight all occurrences, and underline the current occurrence."));
+ highlight = gtk_check_button_new_with_mnemonic (_("_Highlight all"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(highlight), prefs.hex_text_search_highlight_all);
+ gtk_widget_set_can_focus (highlight, FALSE);
+ g_signal_connect (G_OBJECT (highlight), "toggled", G_CALLBACK (search_set_option), &prefs.hex_text_search_highlight_all);
+ g_signal_connect (G_OBJECT (highlight), "toggled", G_CALLBACK (search_handle_refresh), sess);
+ gtk_box_pack_start(GTK_BOX(gui->shbox), highlight, FALSE, FALSE, 0);
+ gtk_widget_set_tooltip_text (highlight, _("Highlight all occurrences, and underline the current occurrence."));
- matchcase = gtk_check_button_new_with_mnemonic (_("Mat_ch case"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(matchcase), prefs.hex_text_search_case_match);
- gtk_widget_set_can_focus (matchcase, FALSE);
- g_signal_connect (G_OBJECT (matchcase), "toggled", G_CALLBACK (search_set_option), &prefs.hex_text_search_case_match);
- gtk_box_pack_start(GTK_BOX(gui->shbox), matchcase, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text (matchcase, _("Perform a case-sensitive search."));
+ matchcase = gtk_check_button_new_with_mnemonic (_("Mat_ch case"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(matchcase), prefs.hex_text_search_case_match);
+ gtk_widget_set_can_focus (matchcase, FALSE);
+ g_signal_connect (G_OBJECT (matchcase), "toggled", G_CALLBACK (search_set_option), &prefs.hex_text_search_case_match);
+ gtk_box_pack_start(GTK_BOX(gui->shbox), matchcase, FALSE, FALSE, 0);
+ gtk_widget_set_tooltip_text (matchcase, _("Perform a case-sensitive search."));
- regex = gtk_check_button_new_with_mnemonic (_("_Regex"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(regex), prefs.hex_text_search_regexp);
- gtk_widget_set_can_focus (regex, FALSE);
- g_signal_connect (G_OBJECT (regex), "toggled", G_CALLBACK (search_set_option), &prefs.hex_text_search_regexp);
- gtk_box_pack_start(GTK_BOX(gui->shbox), regex, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text (regex, _("Regard search string as a regular expression."));
+ regex = gtk_check_button_new_with_mnemonic (_("_Regex"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(regex), prefs.hex_text_search_regexp);
+ gtk_widget_set_can_focus (regex, FALSE);
+ g_signal_connect (G_OBJECT (regex), "toggled", G_CALLBACK (search_set_option), &prefs.hex_text_search_regexp);
+ gtk_box_pack_start(GTK_BOX(gui->shbox), regex, FALSE, FALSE, 0);
+ gtk_widget_set_tooltip_text (regex, _("Regard search string as a regular expression."));
}
static void
mg_create_entry (session *sess, GtkWidget *box)
{
- GtkWidget *hbox, *but, *entry;
- session_gui *gui = sess->gui;
+ GtkWidget *hbox, *but, *entry, *emoji_button;
+ session_gui *gui = sess->gui;
- hbox = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (box), hbox, 0, 0, 0);
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (box), hbox, 0, 0, 0);
- gui->nick_box = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), gui->nick_box, 0, 0, 0);
+ gui->nick_box = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), gui->nick_box, 0, 0, 0);
- gui->nick_label = but = gtk_button_new_with_label (sess->server->nick);
- gtk_button_set_relief (GTK_BUTTON (but), GTK_RELIEF_NONE);
- gtk_widget_set_can_focus (but, FALSE);
- gtk_box_pack_end (GTK_BOX (gui->nick_box), but, 0, 0, 0);
- g_signal_connect (G_OBJECT (but), "clicked",
- G_CALLBACK (mg_nickclick_cb), NULL);
+ gui->nick_label = but = gtk_button_new_with_label (sess->server->nick);
+ gtk_button_set_relief (GTK_BUTTON (but), GTK_RELIEF_NONE);
+ gtk_widget_set_can_focus (but, FALSE);
+ gtk_box_pack_end (GTK_BOX (gui->nick_box), but, 0, 0, 0);
+ g_signal_connect (G_OBJECT (but), "clicked",
+ G_CALLBACK (mg_nickclick_cb), NULL);
- gui->input_box = entry = sexy_spell_entry_new ();
- sexy_spell_entry_set_checked ((SexySpellEntry *)entry, prefs.hex_gui_input_spell);
- sexy_spell_entry_set_parse_attributes ((SexySpellEntry *)entry, prefs.hex_gui_input_attr);
+ gui->input_box = entry = sexy_spell_entry_new ();
+ sexy_spell_entry_set_checked ((SexySpellEntry *)entry, prefs.hex_gui_input_spell);
+ sexy_spell_entry_set_parse_attributes ((SexySpellEntry *)entry, prefs.hex_gui_input_attr);
- gtk_entry_set_max_length (GTK_ENTRY (gui->input_box), 0);
- g_signal_connect (G_OBJECT (entry), "activate",
- G_CALLBACK (mg_inputbox_cb), gui);
- g_signal_connect (G_OBJECT (entry), "changed",
- G_CALLBACK (key_check_replace_on_change), NULL);
- gtk_container_add (GTK_CONTAINER (hbox), entry);
+ gtk_entry_set_max_length (GTK_ENTRY (gui->input_box), 0);
+ g_signal_connect (G_OBJECT (entry), "activate",
+ G_CALLBACK (mg_inputbox_cb), gui);
+ g_signal_connect (G_OBJECT (entry), "changed",
+ G_CALLBACK (key_check_replace_on_change), NULL);
+ gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
- gtk_widget_set_name (entry, "zoitechat-inputbox");
- g_signal_connect (G_OBJECT (entry), "key_press_event",
- G_CALLBACK (key_handle_key_press), NULL);
- g_signal_connect (G_OBJECT (entry), "focus_in_event",
- G_CALLBACK (mg_inputbox_focus), gui);
- g_signal_connect (G_OBJECT (entry), "populate_popup",
- G_CALLBACK (mg_inputbox_rightclick), NULL);
- g_signal_connect (G_OBJECT (entry), "word-check",
- G_CALLBACK (mg_spellcheck_cb), NULL);
- gtk_widget_grab_focus (entry);
+ gtk_widget_set_name (entry, "zoitechat-inputbox");
+ g_signal_connect (G_OBJECT (entry), "key_press_event",
+ G_CALLBACK (key_handle_key_press), NULL);
+ g_signal_connect (G_OBJECT (entry), "focus_in_event",
+ G_CALLBACK (mg_inputbox_focus), gui);
+ g_signal_connect (G_OBJECT (entry), "populate_popup",
+ G_CALLBACK (mg_inputbox_rightclick), NULL);
+ g_signal_connect (G_OBJECT (entry), "word-check",
+ G_CALLBACK (mg_spellcheck_cb), NULL);
+ gtk_widget_grab_focus (entry);
- if (prefs.hex_gui_input_style)
- mg_apply_entry_style (entry);
+ if (prefs.hex_gui_input_style)
+ mg_apply_entry_style (entry);
+
+ /* Make emoji render in the input box regardless of chosen font */
+ mg_apply_emoji_fallback_widget (entry);
+
+ /* Optional emoji button (kept since you already added it) */
+ emoji_button = gtk_button_new_with_label ("😊");
+ gtk_button_set_relief (GTK_BUTTON (emoji_button), GTK_RELIEF_NONE);
+ gtk_widget_set_can_focus (emoji_button, FALSE);
+ gtk_widget_set_tooltip_text (emoji_button, _("Insert emoji"));
+ mg_apply_emoji_primary_widget (emoji_button);
+ g_signal_connect (G_OBJECT (emoji_button), "clicked", G_CALLBACK (mg_emoji_button_cb), gui);
+ gtk_box_pack_start (GTK_BOX (hbox), emoji_button, FALSE, FALSE, 4);
}
static void
mg_switch_tab_cb (chanview *cv, chan *ch, int tag, gpointer ud)
{
- chan *old;
- session *sess = ud;
+ chan *old;
+ session *sess = ud;
- old = active_tab;
- active_tab = ch;
+ old = active_tab;
+ active_tab = ch;
- if (tag == TAG_IRC)
- {
- if (active_tab != old)
- {
- if (old && current_tab)
- mg_unpopulate (current_tab);
- mg_populate (sess);
- }
- } else if (old != active_tab)
- {
- /* userdata for non-irc tabs is actually the GtkBox */
- mg_show_generic_tab (ud);
- if (!mg_is_userlist_and_tree_combined ())
- mg_userlist_showhide (current_sess, FALSE); /* hide */
- }
+ if (tag == TAG_IRC)
+ {
+ if (active_tab != old)
+ {
+ if (old && current_tab)
+ mg_unpopulate (current_tab);
+ mg_populate (sess);
+ }
+ } else if (old != active_tab)
+ {
+ /* userdata for non-irc tabs is actually the GtkBox */
+ mg_show_generic_tab (ud);
+ if (!mg_is_userlist_and_tree_combined ())
+ mg_userlist_showhide (current_sess, FALSE); /* hide */
+ }
}
/* compare two tabs (for tab sorting function) */
@@ -3052,392 +3277,392 @@ mg_switch_tab_cb (chanview *cv, chan *ch, int tag, gpointer ud)
static int
mg_tabs_compare (session *a, session *b)
{
- /* server tabs always go first */
- if (a->type == SESS_SERVER)
- return -1;
+ /* server tabs always go first */
+ if (a->type == SESS_SERVER)
+ return -1;
- /* then channels */
- if (a->type == SESS_CHANNEL && b->type != SESS_CHANNEL)
- return -1;
- if (a->type != SESS_CHANNEL && b->type == SESS_CHANNEL)
- return 1;
+ /* then channels */
+ if (a->type == SESS_CHANNEL && b->type != SESS_CHANNEL)
+ return -1;
+ if (a->type != SESS_CHANNEL && b->type == SESS_CHANNEL)
+ return 1;
- return g_ascii_strcasecmp (a->channel, b->channel);
+ return g_ascii_strcasecmp (a->channel, b->channel);
}
static void
mg_create_tabs (session_gui *gui)
{
- gboolean use_icons = FALSE;
+ gboolean use_icons = FALSE;
- /* if any one of these PNGs exist, the chanview will create
- * the extra column for icons. */
- if (prefs.hex_gui_tab_icons && (pix_tree_channel || pix_tree_dialog || pix_tree_server || pix_tree_util))
- {
- use_icons = TRUE;
- }
+ /* if any one of these PNGs exist, the chanview will create
+ * the extra column for icons. */
+ if (prefs.hex_gui_tab_icons && (pix_tree_channel || pix_tree_dialog || pix_tree_server || pix_tree_util))
+ {
+ use_icons = TRUE;
+ }
- gui->chanview = chanview_new (prefs.hex_gui_tab_layout, prefs.hex_gui_tab_trunc,
- prefs.hex_gui_tab_sort, use_icons,
- prefs.hex_gui_ulist_style ? input_style : NULL);
- chanview_set_callbacks (gui->chanview, mg_switch_tab_cb, mg_xbutton_cb,
- mg_tab_contextmenu_cb, (void *)mg_tabs_compare);
- mg_place_userlist_and_chanview (gui);
+ gui->chanview = chanview_new (prefs.hex_gui_tab_layout, prefs.hex_gui_tab_trunc,
+ prefs.hex_gui_tab_sort, use_icons,
+ prefs.hex_gui_ulist_style ? input_style : NULL);
+ chanview_set_callbacks (gui->chanview, mg_switch_tab_cb, mg_xbutton_cb,
+ mg_tab_contextmenu_cb, (void *)mg_tabs_compare);
+ mg_place_userlist_and_chanview (gui);
}
static gboolean
mg_tabwin_focus_cb (GtkWindow * win, GdkEventFocus *event, gpointer userdata)
{
- current_sess = current_tab;
- if (current_sess)
- {
- gtk_xtext_check_marker_visibility (GTK_XTEXT (current_sess->gui->xtext));
- plugin_emit_dummy_print (current_sess, "Focus Window");
- }
- unflash_window (GTK_WIDGET (win));
- return FALSE;
+ current_sess = current_tab;
+ if (current_sess)
+ {
+ gtk_xtext_check_marker_visibility (GTK_XTEXT (current_sess->gui->xtext));
+ plugin_emit_dummy_print (current_sess, "Focus Window");
+ }
+ unflash_window (GTK_WIDGET (win));
+ return FALSE;
}
static gboolean
mg_topwin_focus_cb (GtkWindow * win, GdkEventFocus *event, session *sess)
{
- current_sess = sess;
- if (!sess->server->server_session)
- sess->server->server_session = sess;
- gtk_xtext_check_marker_visibility(GTK_XTEXT (current_sess->gui->xtext));
- unflash_window (GTK_WIDGET (win));
- plugin_emit_dummy_print (sess, "Focus Window");
- return FALSE;
+ current_sess = sess;
+ if (!sess->server->server_session)
+ sess->server->server_session = sess;
+ gtk_xtext_check_marker_visibility(GTK_XTEXT (current_sess->gui->xtext));
+ unflash_window (GTK_WIDGET (win));
+ plugin_emit_dummy_print (sess, "Focus Window");
+ return FALSE;
}
static void
mg_create_menu (session_gui *gui, GtkWidget *table, int away_state)
{
- GtkAccelGroup *accel_group;
+ GtkAccelGroup *accel_group;
- accel_group = gtk_accel_group_new ();
- gtk_window_add_accel_group (GTK_WINDOW (gtk_widget_get_toplevel (table)),
- accel_group);
- g_object_unref (accel_group);
+ accel_group = gtk_accel_group_new ();
+ gtk_window_add_accel_group (GTK_WINDOW (gtk_widget_get_toplevel (table)),
+ accel_group);
+ g_object_unref (accel_group);
- gui->menu = menu_create_main (accel_group, TRUE, away_state, !gui->is_tab,
- gui->menu_item);
- gtk_table_attach (GTK_TABLE (table), gui->menu, 0, 3, 0, 1,
- GTK_EXPAND | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+ gui->menu = menu_create_main (accel_group, TRUE, away_state, !gui->is_tab,
+ gui->menu_item);
+ gtk_table_attach (GTK_TABLE (table), gui->menu, 0, 3, 0, 1,
+ GTK_EXPAND | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
}
static void
mg_create_irctab (session *sess, GtkWidget *table)
{
- GtkWidget *vbox;
- session_gui *gui = sess->gui;
+ GtkWidget *vbox;
+ session_gui *gui = sess->gui;
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_table_attach (GTK_TABLE (table), vbox, 1, 2, 2, 3,
- GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
- mg_create_center (sess, gui, vbox);
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_table_attach (GTK_TABLE (table), vbox, 1, 2, 2, 3,
+ GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+ mg_create_center (sess, gui, vbox);
}
static void
mg_create_topwindow (session *sess)
{
- GtkWidget *win;
- GtkWidget *table;
+ GtkWidget *win;
+ GtkWidget *table;
- if (sess->type == SESS_DIALOG)
- win = gtkutil_window_new ("ZoiteChat", NULL,
- prefs.hex_gui_dialog_width, prefs.hex_gui_dialog_height, 0);
- else
- win = gtkutil_window_new ("ZoiteChat", NULL,
- prefs.hex_gui_win_width,
- prefs.hex_gui_win_height, 0);
- sess->gui->window = win;
- gtk_container_set_border_width (GTK_CONTAINER (win), GUI_BORDER);
- gtk_window_set_opacity (GTK_WINDOW (win), (prefs.hex_gui_transparency / 255.));
+ if (sess->type == SESS_DIALOG)
+ win = gtkutil_window_new ("ZoiteChat", NULL,
+ prefs.hex_gui_dialog_width, prefs.hex_gui_dialog_height, 0);
+ else
+ win = gtkutil_window_new ("ZoiteChat", NULL,
+ prefs.hex_gui_win_width,
+ prefs.hex_gui_win_height, 0);
+ sess->gui->window = win;
+ gtk_container_set_border_width (GTK_CONTAINER (win), GUI_BORDER);
+ gtk_window_set_opacity (GTK_WINDOW (win), (prefs.hex_gui_transparency / 255.));
- g_signal_connect (G_OBJECT (win), "focus_in_event",
- G_CALLBACK (mg_topwin_focus_cb), sess);
- g_signal_connect (G_OBJECT (win), "destroy",
- G_CALLBACK (mg_topdestroy_cb), sess);
- g_signal_connect (G_OBJECT (win), "configure_event",
- G_CALLBACK (mg_configure_cb), sess);
+ g_signal_connect (G_OBJECT (win), "focus_in_event",
+ G_CALLBACK (mg_topwin_focus_cb), sess);
+ g_signal_connect (G_OBJECT (win), "destroy",
+ G_CALLBACK (mg_topdestroy_cb), sess);
+ g_signal_connect (G_OBJECT (win), "configure_event",
+ G_CALLBACK (mg_configure_cb), sess);
- palette_alloc (win);
+ palette_alloc (win);
- table = gtk_table_new (4, 3, FALSE);
- /* spacing under the menubar */
- gtk_table_set_row_spacing (GTK_TABLE (table), 0, GUI_SPACING);
- /* left and right borders */
- gtk_table_set_col_spacing (GTK_TABLE (table), 0, 1);
- gtk_table_set_col_spacing (GTK_TABLE (table), 1, 1);
- gtk_container_add (GTK_CONTAINER (win), table);
+ table = gtk_table_new (4, 3, FALSE);
+ /* spacing under the menubar */
+ gtk_table_set_row_spacing (GTK_TABLE (table), 0, GUI_SPACING);
+ /* left and right borders */
+ gtk_table_set_col_spacing (GTK_TABLE (table), 0, 1);
+ gtk_table_set_col_spacing (GTK_TABLE (table), 1, 1);
+ gtk_container_add (GTK_CONTAINER (win), table);
- mg_create_irctab (sess, table);
- mg_create_menu (sess->gui, table, sess->server->is_away);
+ mg_create_irctab (sess, table);
+ mg_create_menu (sess->gui, table, sess->server->is_away);
- if (sess->res->buffer == NULL)
- {
- sess->res->buffer = gtk_xtext_buffer_new (GTK_XTEXT (sess->gui->xtext));
- gtk_xtext_buffer_show (GTK_XTEXT (sess->gui->xtext), sess->res->buffer, TRUE);
- gtk_xtext_set_time_stamp (sess->res->buffer, prefs.hex_stamp_text);
- sess->res->user_model = userlist_create_model (sess);
- }
+ if (sess->res->buffer == NULL)
+ {
+ sess->res->buffer = gtk_xtext_buffer_new (GTK_XTEXT (sess->gui->xtext));
+ gtk_xtext_buffer_show (GTK_XTEXT (sess->gui->xtext), sess->res->buffer, TRUE);
+ gtk_xtext_set_time_stamp (sess->res->buffer, prefs.hex_stamp_text);
+ sess->res->user_model = userlist_create_model (sess);
+ }
- userlist_show (sess);
+ userlist_show (sess);
- gtk_widget_show_all (table);
+ gtk_widget_show_all (table);
- if (prefs.hex_gui_hide_menu)
- gtk_widget_hide (sess->gui->menu);
+ if (prefs.hex_gui_hide_menu)
+ gtk_widget_hide (sess->gui->menu);
- /* Will be shown when needed */
- gtk_widget_hide (sess->gui->topic_bar);
+ /* Will be shown when needed */
+ gtk_widget_hide (sess->gui->topic_bar);
- if (!prefs.hex_gui_ulist_buttons)
- gtk_widget_hide (sess->gui->button_box);
+ if (!prefs.hex_gui_ulist_buttons)
+ gtk_widget_hide (sess->gui->button_box);
- if (!prefs.hex_gui_input_nick)
- gtk_widget_hide (sess->gui->nick_box);
+ if (!prefs.hex_gui_input_nick)
+ gtk_widget_hide (sess->gui->nick_box);
- gtk_widget_hide(sess->gui->shbox);
+ gtk_widget_hide(sess->gui->shbox);
- mg_decide_userlist (sess, FALSE);
+ mg_decide_userlist (sess, FALSE);
- if (sess->type == SESS_DIALOG)
- {
- /* hide the chan-mode buttons */
- gtk_widget_hide (sess->gui->topicbutton_box);
- } else
- {
- gtk_widget_hide (sess->gui->dialogbutton_box);
+ if (sess->type == SESS_DIALOG)
+ {
+ /* hide the chan-mode buttons */
+ gtk_widget_hide (sess->gui->topicbutton_box);
+ } else
+ {
+ gtk_widget_hide (sess->gui->dialogbutton_box);
- if (!prefs.hex_gui_mode_buttons)
- gtk_widget_hide (sess->gui->topicbutton_box);
- }
+ if (!prefs.hex_gui_mode_buttons)
+ gtk_widget_hide (sess->gui->topicbutton_box);
+ }
- mg_place_userlist_and_chanview (sess->gui);
+ mg_place_userlist_and_chanview (sess->gui);
- gtk_widget_show (win);
+ gtk_widget_show (win);
}
static gboolean
mg_tabwindow_de_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
- GSList *list;
- session *sess;
- GtkWindow *win = GTK_WINDOW(gtk_widget_get_toplevel (widget));
+ GSList *list;
+ session *sess;
+ GtkWindow *win = GTK_WINDOW(gtk_widget_get_toplevel (widget));
- if (prefs.hex_gui_tray_close && gtkutil_tray_icon_supported (win) && tray_toggle_visibility (FALSE))
- return TRUE;
+ if (prefs.hex_gui_tray_close && gtkutil_tray_icon_supported (win) && tray_toggle_visibility (FALSE))
+ return TRUE;
- /* check for remaining toplevel windows */
- list = sess_list;
- while (list)
- {
- sess = list->data;
- if (!sess->gui->is_tab)
- return FALSE;
- list = list->next;
- }
+ /* check for remaining toplevel windows */
+ list = sess_list;
+ while (list)
+ {
+ sess = list->data;
+ if (!sess->gui->is_tab)
+ return FALSE;
+ list = list->next;
+ }
- mg_open_quit_dialog (TRUE);
- return TRUE;
+ mg_open_quit_dialog (TRUE);
+ return TRUE;
}
#ifdef G_OS_WIN32
static GdkFilterReturn
mg_time_change (GdkXEvent *xevent, GdkEvent *event, gpointer data)
{
- MSG *msg = (MSG*)xevent;
+ MSG *msg = (MSG*)xevent;
- if (msg->message == WM_TIMECHANGE)
- {
- _tzset();
- }
+ if (msg->message == WM_TIMECHANGE)
+ {
+ _tzset();
+ }
- return GDK_FILTER_CONTINUE;
+ return GDK_FILTER_CONTINUE;
}
#endif
static void
mg_create_tabwindow (session *sess)
{
- GtkWidget *win;
- GtkWidget *table;
+ GtkWidget *win;
+ GtkWidget *table;
#ifdef G_OS_WIN32
- GdkWindow *parent_win;
+ GdkWindow *parent_win;
#endif
- win = gtkutil_window_new ("ZoiteChat", NULL, prefs.hex_gui_win_width,
- prefs.hex_gui_win_height, 0);
- sess->gui->window = win;
- gtk_window_move (GTK_WINDOW (win), prefs.hex_gui_win_left,
- prefs.hex_gui_win_top);
- if (prefs.hex_gui_win_state)
- gtk_window_maximize (GTK_WINDOW (win));
- if (prefs.hex_gui_win_fullscreen)
- gtk_window_fullscreen (GTK_WINDOW (win));
- gtk_window_set_opacity (GTK_WINDOW (win), (prefs.hex_gui_transparency / 255.));
- gtk_container_set_border_width (GTK_CONTAINER (win), GUI_BORDER);
+ win = gtkutil_window_new ("ZoiteChat", NULL, prefs.hex_gui_win_width,
+ prefs.hex_gui_win_height, 0);
+ sess->gui->window = win;
+ gtk_window_move (GTK_WINDOW (win), prefs.hex_gui_win_left,
+ prefs.hex_gui_win_top);
+ if (prefs.hex_gui_win_state)
+ gtk_window_maximize (GTK_WINDOW (win));
+ if (prefs.hex_gui_win_fullscreen)
+ gtk_window_fullscreen (GTK_WINDOW (win));
+ gtk_window_set_opacity (GTK_WINDOW (win), (prefs.hex_gui_transparency / 255.));
+ gtk_container_set_border_width (GTK_CONTAINER (win), GUI_BORDER);
- g_signal_connect (G_OBJECT (win), "delete_event",
- G_CALLBACK (mg_tabwindow_de_cb), 0);
- g_signal_connect (G_OBJECT (win), "destroy",
- G_CALLBACK (mg_tabwindow_kill_cb), 0);
- g_signal_connect (G_OBJECT (win), "focus_in_event",
- G_CALLBACK (mg_tabwin_focus_cb), NULL);
- g_signal_connect (G_OBJECT (win), "configure_event",
- G_CALLBACK (mg_configure_cb), NULL);
- g_signal_connect (G_OBJECT (win), "window_state_event",
- G_CALLBACK (mg_windowstate_cb), NULL);
+ g_signal_connect (G_OBJECT (win), "delete_event",
+ G_CALLBACK (mg_tabwindow_de_cb), 0);
+ g_signal_connect (G_OBJECT (win), "destroy",
+ G_CALLBACK (mg_tabwindow_kill_cb), 0);
+ g_signal_connect (G_OBJECT (win), "focus_in_event",
+ G_CALLBACK (mg_tabwin_focus_cb), NULL);
+ g_signal_connect (G_OBJECT (win), "configure_event",
+ G_CALLBACK (mg_configure_cb), NULL);
+ g_signal_connect (G_OBJECT (win), "window_state_event",
+ G_CALLBACK (mg_windowstate_cb), NULL);
- palette_alloc (win);
+ palette_alloc (win);
- sess->gui->main_table = table = gtk_table_new (4, 3, FALSE);
- /* spacing under the menubar */
- gtk_table_set_row_spacing (GTK_TABLE (table), 0, GUI_SPACING);
- /* left and right borders */
- gtk_table_set_col_spacing (GTK_TABLE (table), 0, 1);
- gtk_table_set_col_spacing (GTK_TABLE (table), 1, 1);
- gtk_container_add (GTK_CONTAINER (win), table);
+ sess->gui->main_table = table = gtk_table_new (4, 3, FALSE);
+ /* spacing under the menubar */
+ gtk_table_set_row_spacing (GTK_TABLE (table), 0, GUI_SPACING);
+ /* left and right borders */
+ gtk_table_set_col_spacing (GTK_TABLE (table), 0, 1);
+ gtk_table_set_col_spacing (GTK_TABLE (table), 1, 1);
+ gtk_container_add (GTK_CONTAINER (win), table);
- mg_create_irctab (sess, table);
- mg_create_tabs (sess->gui);
- mg_create_menu (sess->gui, table, sess->server->is_away);
+ mg_create_irctab (sess, table);
+ mg_create_tabs (sess->gui);
+ mg_create_menu (sess->gui, table, sess->server->is_away);
- mg_focus (sess);
+ mg_focus (sess);
- gtk_widget_show_all (table);
+ gtk_widget_show_all (table);
- if (prefs.hex_gui_hide_menu)
- gtk_widget_hide (sess->gui->menu);
+ if (prefs.hex_gui_hide_menu)
+ gtk_widget_hide (sess->gui->menu);
- mg_decide_userlist (sess, FALSE);
+ mg_decide_userlist (sess, FALSE);
- /* Will be shown when needed */
- gtk_widget_hide (sess->gui->topic_bar);
+ /* Will be shown when needed */
+ gtk_widget_hide (sess->gui->topic_bar);
- if (!prefs.hex_gui_mode_buttons)
- gtk_widget_hide (sess->gui->topicbutton_box);
+ if (!prefs.hex_gui_mode_buttons)
+ gtk_widget_hide (sess->gui->topicbutton_box);
- if (!prefs.hex_gui_ulist_buttons)
- gtk_widget_hide (sess->gui->button_box);
+ if (!prefs.hex_gui_ulist_buttons)
+ gtk_widget_hide (sess->gui->button_box);
- if (!prefs.hex_gui_input_nick)
- gtk_widget_hide (sess->gui->nick_box);
+ if (!prefs.hex_gui_input_nick)
+ gtk_widget_hide (sess->gui->nick_box);
- gtk_widget_hide (sess->gui->shbox);
+ gtk_widget_hide (sess->gui->shbox);
- mg_place_userlist_and_chanview (sess->gui);
+ mg_place_userlist_and_chanview (sess->gui);
- gtk_widget_show (win);
+ gtk_widget_show (win);
#ifdef G_OS_WIN32
- parent_win = gtk_widget_get_window (win);
- gdk_window_add_filter (parent_win, mg_time_change, NULL);
+ parent_win = gtk_widget_get_window (win);
+ gdk_window_add_filter (parent_win, mg_time_change, NULL);
#endif
}
void
mg_apply_setup (void)
{
- GSList *list = sess_list;
- session *sess;
- int done_main = FALSE;
+ GSList *list = sess_list;
+ session *sess;
+ int done_main = FALSE;
- mg_create_tab_colors ();
+ mg_create_tab_colors ();
- while (list)
- {
- sess = list->data;
- gtk_xtext_set_time_stamp (sess->res->buffer, prefs.hex_stamp_text);
- ((xtext_buffer *)sess->res->buffer)->needs_recalc = TRUE;
- if (!sess->gui->is_tab || !done_main)
- mg_place_userlist_and_chanview (sess->gui);
- if (sess->gui->is_tab)
- done_main = TRUE;
- list = list->next;
- }
+ while (list)
+ {
+ sess = list->data;
+ gtk_xtext_set_time_stamp (sess->res->buffer, prefs.hex_stamp_text);
+ ((xtext_buffer *)sess->res->buffer)->needs_recalc = TRUE;
+ if (!sess->gui->is_tab || !done_main)
+ mg_place_userlist_and_chanview (sess->gui);
+ if (sess->gui->is_tab)
+ done_main = TRUE;
+ list = list->next;
+ }
}
static chan *
mg_add_generic_tab (char *name, char *title, void *family, GtkWidget *box)
{
- chan *ch;
+ chan *ch;
- gtk_notebook_append_page (GTK_NOTEBOOK (mg_gui->note_book), box, NULL);
- gtk_widget_show (box);
+ gtk_notebook_append_page (GTK_NOTEBOOK (mg_gui->note_book), box, NULL);
+ gtk_widget_show (box);
- ch = chanview_add (mg_gui->chanview, name, NULL, box, TRUE, TAG_UTIL, pix_tree_util);
- chan_set_color (ch, plain_list);
+ ch = chanview_add (mg_gui->chanview, name, NULL, box, TRUE, TAG_UTIL, pix_tree_util);
+ chan_set_color (ch, plain_list);
- g_object_set_data_full (G_OBJECT (box), "title", g_strdup (title), g_free);
- g_object_set_data (G_OBJECT (box), "ch", ch);
+ g_object_set_data_full (G_OBJECT (box), "title", g_strdup (title), g_free);
+ g_object_set_data (G_OBJECT (box), "ch", ch);
- if (prefs.hex_gui_tab_newtofront)
- chan_focus (ch);
+ if (prefs.hex_gui_tab_newtofront)
+ chan_focus (ch);
- return ch;
+ return ch;
}
void
fe_buttons_update (session *sess)
{
- session_gui *gui = sess->gui;
+ session_gui *gui = sess->gui;
- gtk_widget_destroy (gui->button_box);
- gui->button_box = mg_create_userlistbuttons (gui->button_box_parent);
+ gtk_widget_destroy (gui->button_box);
+ gui->button_box = mg_create_userlistbuttons (gui->button_box_parent);
- if (prefs.hex_gui_ulist_buttons)
- gtk_widget_show (sess->gui->button_box);
- else
- gtk_widget_hide (sess->gui->button_box);
+ if (prefs.hex_gui_ulist_buttons)
+ gtk_widget_show (sess->gui->button_box);
+ else
+ gtk_widget_hide (sess->gui->button_box);
}
void
fe_clear_channel (session *sess)
{
- char tbuf[CHANLEN+6];
- session_gui *gui = sess->gui;
+ char tbuf[CHANLEN+6];
+ session_gui *gui = sess->gui;
- if (sess->gui->is_tab)
- {
- if (sess->waitchannel[0])
- {
- if (prefs.hex_gui_tab_trunc > 2 && g_utf8_strlen (sess->waitchannel, -1) > prefs.hex_gui_tab_trunc)
- {
- /* truncate long channel names */
- tbuf[0] = '(';
- strcpy (tbuf + 1, sess->waitchannel);
- g_utf8_offset_to_pointer(tbuf, prefs.hex_gui_tab_trunc)[0] = 0;
- strcat (tbuf, "..)");
- } else
- {
- sprintf (tbuf, "(%s)", sess->waitchannel);
- }
- }
- else
- strcpy (tbuf, _(""));
- chan_rename (sess->res->tab, tbuf, prefs.hex_gui_tab_trunc);
- }
+ if (sess->gui->is_tab)
+ {
+ if (sess->waitchannel[0])
+ {
+ if (prefs.hex_gui_tab_trunc > 2 && g_utf8_strlen (sess->waitchannel, -1) > prefs.hex_gui_tab_trunc)
+ {
+ /* truncate long channel names */
+ tbuf[0] = '(';
+ strcpy (tbuf + 1, sess->waitchannel);
+ g_utf8_offset_to_pointer(tbuf, prefs.hex_gui_tab_trunc)[0] = 0;
+ strcat (tbuf, "..)");
+ } else
+ {
+ sprintf (tbuf, "(%s)", sess->waitchannel);
+ }
+ }
+ else
+ strcpy (tbuf, _(""));
+ chan_rename (sess->res->tab, tbuf, prefs.hex_gui_tab_trunc);
+ }
- if (!sess->gui->is_tab || sess == current_tab)
- {
- gtk_entry_set_text (GTK_ENTRY (gui->topic_entry), "");
+ if (!sess->gui->is_tab || sess == current_tab)
+ {
+ gtk_entry_set_text (GTK_ENTRY (gui->topic_entry), "");
- if (gui->op_xpm)
- {
- gtk_widget_destroy (gui->op_xpm);
- gui->op_xpm = 0;
- }
- } else
- {
- if (sess->res->topic_text)
- {
- g_free (sess->res->topic_text);
- sess->res->topic_text = NULL;
- }
- }
+ if (gui->op_xpm)
+ {
+ gtk_widget_destroy (gui->op_xpm);
+ gui->op_xpm = 0;
+ }
+ } else
+ {
+ if (sess->res->topic_text)
+ {
+ g_free (sess->res->topic_text);
+ sess->res->topic_text = NULL;
+ }
+ }
}
void
@@ -3448,238 +3673,238 @@ fe_set_nonchannel (session *sess, int state)
void
fe_dlgbuttons_update (session *sess)
{
- GtkWidget *box;
- session_gui *gui = sess->gui;
+ GtkWidget *box;
+ session_gui *gui = sess->gui;
- gtk_widget_destroy (gui->dialogbutton_box);
+ gtk_widget_destroy (gui->dialogbutton_box);
- gui->dialogbutton_box = box = gtk_hbox_new (0, 0);
- gtk_box_pack_start (GTK_BOX (gui->topic_bar), box, 0, 0, 0);
- gtk_box_reorder_child (GTK_BOX (gui->topic_bar), box, 3);
- mg_create_dialogbuttons (box);
+ gui->dialogbutton_box = box = gtk_hbox_new (0, 0);
+ gtk_box_pack_start (GTK_BOX (gui->topic_bar), box, 0, 0, 0);
+ gtk_box_reorder_child (GTK_BOX (gui->topic_bar), box, 3);
+ mg_create_dialogbuttons (box);
- gtk_widget_show_all (box);
+ gtk_widget_show_all (box);
- if (current_tab && current_tab->type != SESS_DIALOG)
- gtk_widget_hide (current_tab->gui->dialogbutton_box);
+ if (current_tab && current_tab->type != SESS_DIALOG)
+ gtk_widget_hide (current_tab->gui->dialogbutton_box);
}
void
fe_update_mode_buttons (session *sess, char mode, char sign)
{
- int state, i;
+ int state, i;
- if (sign == '+')
- state = TRUE;
- else
- state = FALSE;
+ if (sign == '+')
+ state = TRUE;
+ else
+ state = FALSE;
- for (i = 0; i < NUM_FLAG_WIDS - 1; i++)
- {
- if (chan_flags[i] == mode)
- {
- if (!sess->gui->is_tab || sess == current_tab)
- {
- ignore_chanmode = TRUE;
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (sess->gui->flag_wid[i])) != state)
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sess->gui->flag_wid[i]), state);
- ignore_chanmode = FALSE;
- } else
- {
- sess->res->flag_wid_state[i] = state;
- }
- return;
- }
- }
+ for (i = 0; i < NUM_FLAG_WIDS - 1; i++)
+ {
+ if (chan_flags[i] == mode)
+ {
+ if (!sess->gui->is_tab || sess == current_tab)
+ {
+ ignore_chanmode = TRUE;
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (sess->gui->flag_wid[i])) != state)
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sess->gui->flag_wid[i]), state);
+ ignore_chanmode = FALSE;
+ } else
+ {
+ sess->res->flag_wid_state[i] = state;
+ }
+ return;
+ }
+ }
}
void
fe_set_nick (server *serv, char *newnick)
{
- GSList *list = sess_list;
- session *sess;
+ GSList *list = sess_list;
+ session *sess;
- while (list)
- {
- sess = list->data;
- if (sess->server == serv)
- {
- if (current_tab == sess || !sess->gui->is_tab)
- gtk_button_set_label (GTK_BUTTON (sess->gui->nick_label), newnick);
- }
- list = list->next;
- }
+ while (list)
+ {
+ sess = list->data;
+ if (sess->server == serv)
+ {
+ if (current_tab == sess || !sess->gui->is_tab)
+ gtk_button_set_label (GTK_BUTTON (sess->gui->nick_label), newnick);
+ }
+ list = list->next;
+ }
}
void
fe_set_away (server *serv)
{
- GSList *list = sess_list;
- session *sess;
+ GSList *list = sess_list;
+ session *sess;
- while (list)
- {
- sess = list->data;
- if (sess->server == serv)
- {
- if (!sess->gui->is_tab || sess == current_tab)
- {
- menu_set_away (sess->gui, serv->is_away);
- /* gray out my nickname */
- mg_set_myself_away (sess->gui, serv->is_away);
- }
- }
- list = list->next;
- }
+ while (list)
+ {
+ sess = list->data;
+ if (sess->server == serv)
+ {
+ if (!sess->gui->is_tab || sess == current_tab)
+ {
+ menu_set_away (sess->gui, serv->is_away);
+ /* gray out my nickname */
+ mg_set_myself_away (sess->gui, serv->is_away);
+ }
+ }
+ list = list->next;
+ }
}
void
fe_set_channel (session *sess)
{
- if (sess->res->tab != NULL)
- chan_rename (sess->res->tab, sess->channel, prefs.hex_gui_tab_trunc);
+ if (sess->res->tab != NULL)
+ chan_rename (sess->res->tab, sess->channel, prefs.hex_gui_tab_trunc);
}
void
mg_changui_new (session *sess, restore_gui *res, int tab, int focus)
{
- int first_run = FALSE;
- session_gui *gui;
+ int first_run = FALSE;
+ session_gui *gui;
- if (res == NULL)
- {
- res = g_new0 (restore_gui, 1);
- }
+ if (res == NULL)
+ {
+ res = g_new0 (restore_gui, 1);
+ }
- sess->res = res;
+ sess->res = res;
- if (sess->server->front_session == NULL)
- {
- sess->server->front_session = sess;
- }
+ if (sess->server->front_session == NULL)
+ {
+ sess->server->front_session = sess;
+ }
- if (!tab)
- {
- gui = g_new0 (session_gui, 1);
- gui->is_tab = FALSE;
- sess->gui = gui;
- mg_create_topwindow (sess);
- fe_set_title (sess);
- return;
- }
+ if (!tab)
+ {
+ gui = g_new0 (session_gui, 1);
+ gui->is_tab = FALSE;
+ sess->gui = gui;
+ mg_create_topwindow (sess);
+ fe_set_title (sess);
+ return;
+ }
- if (mg_gui == NULL)
- {
- first_run = TRUE;
- gui = &static_mg_gui;
- memset (gui, 0, sizeof (session_gui));
- gui->is_tab = TRUE;
- sess->gui = gui;
- mg_create_tabwindow (sess);
- mg_gui = gui;
- parent_window = gui->window;
- } else
- {
- sess->gui = gui = mg_gui;
- gui->is_tab = TRUE;
- }
+ if (mg_gui == NULL)
+ {
+ first_run = TRUE;
+ gui = &static_mg_gui;
+ memset (gui, 0, sizeof (session_gui));
+ gui->is_tab = TRUE;
+ sess->gui = gui;
+ mg_create_tabwindow (sess);
+ mg_gui = gui;
+ parent_window = gui->window;
+ } else
+ {
+ sess->gui = gui = mg_gui;
+ gui->is_tab = TRUE;
+ }
- mg_add_chan (sess);
+ mg_add_chan (sess);
- if (first_run || (prefs.hex_gui_tab_newtofront == FOCUS_NEW_ONLY_ASKED && focus)
- || prefs.hex_gui_tab_newtofront == FOCUS_NEW_ALL )
- chan_focus (res->tab);
+ if (first_run || (prefs.hex_gui_tab_newtofront == FOCUS_NEW_ONLY_ASKED && focus)
+ || prefs.hex_gui_tab_newtofront == FOCUS_NEW_ALL )
+ chan_focus (res->tab);
}
GtkWidget *
mg_create_generic_tab (char *name, char *title, int force_toplevel,
- int link_buttons,
- void *close_callback, void *userdata,
- int width, int height, GtkWidget **vbox_ret,
- void *family)
+ int link_buttons,
+ void *close_callback, void *userdata,
+ int width, int height, GtkWidget **vbox_ret,
+ void *family)
{
- GtkWidget *vbox, *win;
+ GtkWidget *vbox, *win;
- if (prefs.hex_gui_tab_pos == POS_HIDDEN && prefs.hex_gui_tab_utils)
- prefs.hex_gui_tab_utils = 0;
+ if (prefs.hex_gui_tab_pos == POS_HIDDEN && prefs.hex_gui_tab_utils)
+ prefs.hex_gui_tab_utils = 0;
- if (force_toplevel || !prefs.hex_gui_tab_utils)
- {
- win = gtkutil_window_new (title, name, width, height, 2);
- vbox = gtk_vbox_new (0, 0);
- *vbox_ret = vbox;
- gtk_container_add (GTK_CONTAINER (win), vbox);
- gtk_widget_show (vbox);
- if (close_callback)
- g_signal_connect (G_OBJECT (win), "destroy",
- G_CALLBACK (close_callback), userdata);
- return win;
- }
+ if (force_toplevel || !prefs.hex_gui_tab_utils)
+ {
+ win = gtkutil_window_new (title, name, width, height, 2);
+ vbox = gtk_vbox_new (0, 0);
+ *vbox_ret = vbox;
+ gtk_container_add (GTK_CONTAINER (win), vbox);
+ gtk_widget_show (vbox);
+ if (close_callback)
+ g_signal_connect (G_OBJECT (win), "destroy",
+ G_CALLBACK (close_callback), userdata);
+ return win;
+ }
- vbox = gtk_vbox_new (0, 2);
- g_object_set_data (G_OBJECT (vbox), "w", GINT_TO_POINTER (width));
- g_object_set_data (G_OBJECT (vbox), "h", GINT_TO_POINTER (height));
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
- *vbox_ret = vbox;
+ vbox = gtk_vbox_new (0, 2);
+ g_object_set_data (G_OBJECT (vbox), "w", GINT_TO_POINTER (width));
+ g_object_set_data (G_OBJECT (vbox), "h", GINT_TO_POINTER (height));
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
+ *vbox_ret = vbox;
- if (close_callback)
- g_signal_connect (G_OBJECT (vbox), "destroy",
- G_CALLBACK (close_callback), userdata);
+ if (close_callback)
+ g_signal_connect (G_OBJECT (vbox), "destroy",
+ G_CALLBACK (close_callback), userdata);
- mg_add_generic_tab (name, title, family, vbox);
+ mg_add_generic_tab (name, title, family, vbox);
-/* if (link_buttons)
- {
- hbox = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, 0, 0, 0);
- mg_create_link_buttons (hbox, ch);
- gtk_widget_show (hbox);
- }*/
+/* if (link_buttons)
+ {
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, 0, 0, 0);
+ mg_create_link_buttons (hbox, ch);
+ gtk_widget_show (hbox);
+ }*/
- return vbox;
+ return vbox;
}
void
mg_move_tab (session *sess, int delta)
{
- if (sess->gui->is_tab)
- chan_move (sess->res->tab, delta);
+ if (sess->gui->is_tab)
+ chan_move (sess->res->tab, delta);
}
void
mg_move_tab_family (session *sess, int delta)
{
- if (sess->gui->is_tab)
- chan_move_family (sess->res->tab, delta);
+ if (sess->gui->is_tab)
+ chan_move_family (sess->res->tab, delta);
}
void
mg_set_title (GtkWidget *vbox, char *title) /* for non-irc tab/window only */
{
- char *old;
+ char *old;
- old = g_object_get_data (G_OBJECT (vbox), "title");
- if (old)
- {
- g_object_set_data_full (G_OBJECT (vbox), "title", g_strdup (title), g_free);
- } else
- {
- gtk_window_set_title (GTK_WINDOW (vbox), title);
- }
+ old = g_object_get_data (G_OBJECT (vbox), "title");
+ if (old)
+ {
+ g_object_set_data_full (G_OBJECT (vbox), "title", g_strdup (title), g_free);
+ } else
+ {
+ gtk_window_set_title (GTK_WINDOW (vbox), title);
+ }
}
void
fe_server_callback (server *serv)
{
- joind_close (serv);
+ joind_close (serv);
- if (serv->gui->chanlist_window)
- mg_close_gen (NULL, serv->gui->chanlist_window);
+ if (serv->gui->chanlist_window)
+ mg_close_gen (NULL, serv->gui->chanlist_window);
- if (serv->gui->rawlog_window)
- mg_close_gen (NULL, serv->gui->rawlog_window);
+ if (serv->gui->rawlog_window)
+ mg_close_gen (NULL, serv->gui->rawlog_window);
- g_free (serv->gui);
+ g_free (serv->gui);
}
/* called when a session is being killed */
@@ -3687,27 +3912,27 @@ fe_server_callback (server *serv)
void
fe_session_callback (session *sess)
{
- gtk_xtext_buffer_free (sess->res->buffer);
- g_object_unref (G_OBJECT (sess->res->user_model));
+ gtk_xtext_buffer_free (sess->res->buffer);
+ g_object_unref (G_OBJECT (sess->res->user_model));
- if (sess->res->banlist && sess->res->banlist->window)
- mg_close_gen (NULL, sess->res->banlist->window);
+ if (sess->res->banlist && sess->res->banlist->window)
+ mg_close_gen (NULL, sess->res->banlist->window);
- g_free (sess->res->input_text);
- g_free (sess->res->topic_text);
- g_free (sess->res->limit_text);
- g_free (sess->res->key_text);
- g_free (sess->res->queue_text);
- g_free (sess->res->queue_tip);
- g_free (sess->res->lag_text);
- g_free (sess->res->lag_tip);
+ g_free (sess->res->input_text);
+ g_free (sess->res->topic_text);
+ g_free (sess->res->limit_text);
+ g_free (sess->res->key_text);
+ g_free (sess->res->queue_text);
+ g_free (sess->res->queue_tip);
+ g_free (sess->res->lag_text);
+ g_free (sess->res->lag_tip);
- if (sess->gui->bartag)
- fe_timeout_remove (sess->gui->bartag);
+ if (sess->gui->bartag)
+ fe_timeout_remove (sess->gui->bartag);
- if (sess->gui != &static_mg_gui)
- g_free (sess->gui);
- g_free (sess->res);
+ if (sess->gui != &static_mg_gui)
+ g_free (sess->gui);
+ g_free (sess->res);
}
/* ===== DRAG AND DROP STUFF ===== */
@@ -3715,83 +3940,83 @@ fe_session_callback (session *sess)
static gboolean
is_child_of (GtkWidget *widget, GtkWidget *parent)
{
- while (widget)
- {
- if (gtk_widget_get_parent (widget) == parent)
- return TRUE;
- widget = gtk_widget_get_parent (widget);
- }
- return FALSE;
+ while (widget)
+ {
+ if (gtk_widget_get_parent (widget) == parent)
+ return TRUE;
+ widget = gtk_widget_get_parent (widget);
+ }
+ return FALSE;
}
static void
mg_handle_drop (GtkWidget *widget, int y, int *pos, int *other_pos)
{
- int height;
- session_gui *gui = current_sess->gui;
+ int height;
+ session_gui *gui = current_sess->gui;
- height = gdk_window_get_height (gtk_widget_get_window (widget));
+ height = gdk_window_get_height (gtk_widget_get_window (widget));
- if (y < height / 2)
- {
- if (is_child_of (widget, gui->vpane_left))
- *pos = 1; /* top left */
- else
- *pos = 3; /* top right */
- }
- else
- {
- if (is_child_of (widget, gui->vpane_left))
- *pos = 2; /* bottom left */
- else
- *pos = 4; /* bottom right */
- }
+ if (y < height / 2)
+ {
+ if (is_child_of (widget, gui->vpane_left))
+ *pos = 1; /* top left */
+ else
+ *pos = 3; /* top right */
+ }
+ else
+ {
+ if (is_child_of (widget, gui->vpane_left))
+ *pos = 2; /* bottom left */
+ else
+ *pos = 4; /* bottom right */
+ }
- /* both in the same pos? must move one */
- if (*pos == *other_pos)
- {
- switch (*other_pos)
- {
- case 1:
- *other_pos = 2;
- break;
- case 2:
- *other_pos = 1;
- break;
- case 3:
- *other_pos = 4;
- break;
- case 4:
- *other_pos = 3;
- break;
- }
- }
+ /* both in the same pos? must move one */
+ if (*pos == *other_pos)
+ {
+ switch (*other_pos)
+ {
+ case 1:
+ *other_pos = 2;
+ break;
+ case 2:
+ *other_pos = 1;
+ break;
+ case 3:
+ *other_pos = 4;
+ break;
+ case 4:
+ *other_pos = 3;
+ break;
+ }
+ }
- mg_place_userlist_and_chanview (gui);
+ mg_place_userlist_and_chanview (gui);
}
static gboolean
mg_is_gui_target (GdkDragContext *context)
{
- char *target_name;
+ char *target_name;
- if (!context || !gdk_drag_context_list_targets (context) || !gdk_drag_context_list_targets (context)->data)
- return FALSE;
+ if (!context || !gdk_drag_context_list_targets (context) || !gdk_drag_context_list_targets (context)->data)
+ return FALSE;
- target_name = gdk_atom_name (gdk_drag_context_list_targets (context)->data);
- if (target_name)
- {
- /* if it's not HEXCHAT_CHANVIEW or HEXCHAT_USERLIST */
- /* we should ignore it. */
- if (target_name[0] != 'H')
- {
- g_free (target_name);
- return FALSE;
- }
- g_free (target_name);
- }
+ target_name = gdk_atom_name (gdk_drag_context_list_targets (context)->data);
+ if (target_name)
+ {
+ /* if it's not HEXCHAT_CHANVIEW or HEXCHAT_USERLIST */
+ /* we should ignore it. */
+ if (target_name[0] != 'H')
+ {
+ g_free (target_name);
+ return FALSE;
+ }
+ g_free (target_name);
+ }
- return TRUE;
+ return TRUE;
}
/* this begin callback just creates an nice of the source */
@@ -3799,36 +4024,36 @@ mg_is_gui_target (GdkDragContext *context)
gboolean
mg_drag_begin_cb (GtkWidget *widget, GdkDragContext *context, gpointer userdata)
{
- int width, height;
- GdkColormap *cmap;
- GdkPixbuf *pix, *pix2;
+ int width, height;
+ GdkColormap *cmap;
+ GdkPixbuf *pix, *pix2;
- /* ignore file drops */
- if (!mg_is_gui_target (context))
- return FALSE;
+ /* ignore file drops */
+ if (!mg_is_gui_target (context))
+ return FALSE;
- cmap = gtk_widget_get_colormap (widget);
- width = gdk_window_get_width (gtk_widget_get_window (widget));
- height = gdk_window_get_height (gtk_widget_get_window (widget));
+ cmap = gtk_widget_get_colormap (widget);
+ width = gdk_window_get_width (gtk_widget_get_window (widget));
+ height = gdk_window_get_height (gtk_widget_get_window (widget));
- pix = gdk_pixbuf_get_from_drawable (NULL, gtk_widget_get_window (widget), cmap, 0, 0, 0, 0, width, height);
- pix2 = gdk_pixbuf_scale_simple (pix, width * 4 / 5, height / 2, GDK_INTERP_HYPER);
- g_object_unref (pix);
+ pix = gdk_pixbuf_get_from_drawable (NULL, gtk_widget_get_window (widget), cmap, 0, 0, 0, 0, width, height);
+ pix2 = gdk_pixbuf_scale_simple (pix, width * 4 / 5, height / 2, GDK_INTERP_HYPER);
+ g_object_unref (pix);
- gtk_drag_set_icon_pixbuf (context, pix2, 0, 0);
- g_object_set_data (G_OBJECT (widget), "ico", pix2);
+ gtk_drag_set_icon_pixbuf (context, pix2, 0, 0);
+ g_object_set_data (G_OBJECT (widget), "ico", pix2);
- return TRUE;
+ return TRUE;
}
void
mg_drag_end_cb (GtkWidget *widget, GdkDragContext *context, gpointer userdata)
{
- /* ignore file drops */
- if (!mg_is_gui_target (context))
- return;
+ /* ignore file drops */
+ if (!mg_is_gui_target (context))
+ return;
- g_object_unref (g_object_get_data (G_OBJECT (widget), "ico"));
+ g_object_unref (g_object_get_data (G_OBJECT (widget), "ico"));
}
/* drop complete */
@@ -3836,25 +4061,25 @@ mg_drag_end_cb (GtkWidget *widget, GdkDragContext *context, gpointer userdata)
gboolean
mg_drag_drop_cb (GtkWidget *widget, GdkDragContext *context, int x, int y, guint time, gpointer user_data)
{
- /* ignore file drops */
- if (!mg_is_gui_target (context))
- return FALSE;
+ /* ignore file drops */
+ if (!mg_is_gui_target (context))
+ return FALSE;
- switch (gdk_drag_context_get_selected_action (context))
- {
- case GDK_ACTION_MOVE:
- /* from userlist */
- mg_handle_drop (widget, y, &prefs.hex_gui_ulist_pos, &prefs.hex_gui_tab_pos);
- break;
- case GDK_ACTION_COPY:
- /* from tree - we use GDK_ACTION_COPY for the tree */
- mg_handle_drop (widget, y, &prefs.hex_gui_tab_pos, &prefs.hex_gui_ulist_pos);
- break;
- default:
- return FALSE;
- }
+ switch (gdk_drag_context_get_selected_action (context))
+ {
+ case GDK_ACTION_MOVE:
+ /* from userlist */
+ mg_handle_drop (widget, y, &prefs.hex_gui_ulist_pos, &prefs.hex_gui_tab_pos);
+ break;
+ case GDK_ACTION_COPY:
+ /* from tree - we use GDK_ACTION_COPY for the tree */
+ mg_handle_drop (widget, y, &prefs.hex_gui_tab_pos, &prefs.hex_gui_ulist_pos);
+ break;
+ default:
+ return FALSE;
+ }
- return TRUE;
+ return TRUE;
}
/* draw highlight rectangle in the destination */
@@ -3862,74 +4087,74 @@ mg_drag_drop_cb (GtkWidget *widget, GdkDragContext *context, int x, int y, guint
gboolean
mg_drag_motion_cb (GtkWidget *widget, GdkDragContext *context, int x, int y, guint time, gpointer scbar)
{
- GdkGC *gc;
- GdkColor col;
- GdkGCValues val;
- int half, width, height;
- int ox, oy;
- GdkDrawable *draw;
- GtkAllocation allocation;
+ GdkGC *gc;
+ GdkColor col;
+ GdkGCValues val;
+ int half, width, height;
+ int ox, oy;
+ GdkDrawable *draw;
+ GtkAllocation allocation;
- /* ignore file drops */
- if (!mg_is_gui_target (context))
- return FALSE;
+ /* ignore file drops */
+ if (!mg_is_gui_target (context))
+ return FALSE;
- if (scbar) /* scrollbar */
- {
- gtk_widget_get_allocation (widget, &allocation);
- ox = allocation.x;
- oy = allocation.y;
- width = allocation.width;
- height = allocation.height;
- draw = gtk_widget_get_window (widget);
- }
- else
- {
- ox = oy = 0;
- width = gdk_window_get_width (gtk_widget_get_window (widget));
- height = gdk_window_get_height (gtk_widget_get_window (widget));
- draw = gtk_widget_get_window (widget);
- }
+ if (scbar) /* scrollbar */
+ {
+ gtk_widget_get_allocation (widget, &allocation);
+ ox = allocation.x;
+ oy = allocation.y;
+ width = allocation.width;
+ height = allocation.height;
+ draw = gtk_widget_get_window (widget);
+ }
+ else
+ {
+ ox = oy = 0;
+ width = gdk_window_get_width (gtk_widget_get_window (widget));
+ height = gdk_window_get_height (gtk_widget_get_window (widget));
+ draw = gtk_widget_get_window (widget);
+ }
- val.subwindow_mode = GDK_INCLUDE_INFERIORS;
- val.graphics_exposures = 0;
- val.function = GDK_XOR;
+ val.subwindow_mode = GDK_INCLUDE_INFERIORS;
+ val.graphics_exposures = 0;
+ val.function = GDK_XOR;
- gc = gdk_gc_new_with_values (gtk_widget_get_window (widget), &val, GDK_GC_EXPOSURES | GDK_GC_SUBWINDOW | GDK_GC_FUNCTION);
- col.red = rand() % 0xffff;
- col.green = rand() % 0xffff;
- col.blue = rand() % 0xffff;
- gdk_colormap_alloc_color (gtk_widget_get_colormap (widget), &col, FALSE, TRUE);
- gdk_gc_set_foreground (gc, &col);
+ gc = gdk_gc_new_with_values (gtk_widget_get_window (widget), &val, GDK_GC_EXPOSURES | GDK_GC_SUBWINDOW | GDK_GC_FUNCTION);
+ col.red = rand() % 0xffff;
+ col.green = rand() % 0xffff;
+ col.blue = rand() % 0xffff;
+ gdk_colormap_alloc_color (gtk_widget_get_colormap (widget), &col, FALSE, TRUE);
+ gdk_gc_set_foreground (gc, &col);
- half = height / 2;
+ half = height / 2;
#if 0
- /* are both tree/userlist on the same side? */
- paned = (GtkPaned *)widget->parent->parent;
- if (paned->child1 != NULL && paned->child2 != NULL)
- {
- gdk_draw_rectangle (draw, gc, 0, 1, 2, width - 3, height - 4);
- gdk_draw_rectangle (draw, gc, 0, 0, 1, width - 1, height - 2);
- g_object_unref (gc);
- return TRUE;
- }
+ /* are both tree/userlist on the same side? */
+ paned = (GtkPaned *)widget->parent->parent;
+ if (paned->child1 != NULL && paned->child2 != NULL)
+ {
+ gdk_draw_rectangle (draw, gc, 0, 1, 2, width - 3, height - 4);
+ gdk_draw_rectangle (draw, gc, 0, 0, 1, width - 1, height - 2);
+ g_object_unref (gc);
+ return TRUE;
+ }
#endif
- if (y < half)
- {
- gdk_draw_rectangle (draw, gc, FALSE, 1 + ox, 2 + oy, width - 3, half - 4);
- gdk_draw_rectangle (draw, gc, FALSE, 0 + ox, 1 + oy, width - 1, half - 2);
- gtk_widget_queue_draw_area (widget, ox, half + oy, width, height - half);
- }
- else
- {
- gdk_draw_rectangle (draw, gc, FALSE, 0 + ox, half + 1 + oy, width - 1, half - 2);
- gdk_draw_rectangle (draw, gc, FALSE, 1 + ox, half + 2 + oy, width - 3, half - 4);
- gtk_widget_queue_draw_area (widget, ox, oy, width, half);
- }
+ if (y < half)
+ {
+ gdk_draw_rectangle (draw, gc, FALSE, 1 + ox, 2 + oy, width - 3, half - 4);
+ gdk_draw_rectangle (draw, gc, FALSE, 0 + ox, 1 + oy, width - 1, half - 2);
+ gtk_widget_queue_draw_area (widget, ox, half + oy, width, height - half);
+ }
+ else
+ {
+ gdk_draw_rectangle (draw, gc, FALSE, 0 + ox, half + 1 + oy, width - 1, half - 2);
+ gdk_draw_rectangle (draw, gc, FALSE, 1 + ox, half + 2 + oy, width - 3, half - 4);
+ gtk_widget_queue_draw_area (widget, ox, oy, width, half);
+ }
- g_object_unref (gc);
+ g_object_unref (gc);
- return TRUE;
+ return TRUE;
}
From 81b2325aa1238f3f9e82ced6d35af8fbf3525cd4 Mon Sep 17 00:00:00 2001
From: deepend-tildeclub <58404188+deepend-tildeclub@users.noreply.github.com>
Date: Thu, 15 Jan 2026 19:58:12 -0700
Subject: [PATCH 2/4] Refactor emoji font handling in mg_update_xtext
Removed the emoji fallback font function and related code.
---
src/fe-gtk/maingui.c | 35 +++++------------------------------
1 file changed, 5 insertions(+), 30 deletions(-)
diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c
index feac87bb..f8438224 100644
--- a/src/fe-gtk/maingui.c
+++ b/src/fe-gtk/maingui.c
@@ -78,7 +78,6 @@ enum
static void mg_apply_emoji_fallback_widget (GtkWidget *widget);
static void mg_apply_emoji_primary_widget (GtkWidget *widget);
-static gchar *mg_font_string_with_emoji_fallback (const gchar *font_string);
static void mg_emoji_button_cb (GtkWidget *widget, session_gui *gui);
static GtkWidget *mg_create_emoji_menu (session_gui *gui);
static void mg_emoji_insert_cb (GtkMenuItem *item, session_gui *gui);
@@ -2311,7 +2310,7 @@ void
mg_update_xtext (GtkWidget *wid)
{
GtkXText *xtext = GTK_XTEXT (wid);
- gchar *font_with_emoji;
+ const gchar *font_name;
gtk_xtext_set_palette (xtext, colors);
gtk_xtext_set_max_lines (xtext, prefs.hex_text_max_lines);
@@ -2321,15 +2320,14 @@ mg_update_xtext (GtkWidget *wid)
gtk_xtext_set_show_separator (xtext, prefs.hex_text_indent ? prefs.hex_text_show_sep : 0);
gtk_xtext_set_indent (xtext, prefs.hex_text_indent);
- /* Ensure emoji-capable fallback for the main chat buffer font */
- font_with_emoji = mg_font_string_with_emoji_fallback (prefs.hex_text_font);
- if (!gtk_xtext_set_font (xtext, font_with_emoji))
+ font_name = (prefs.hex_text_font && *prefs.hex_text_font)
+ ? prefs.hex_text_font
+ : "Sans 10";
+ if (!gtk_xtext_set_font (xtext, (char *)font_name))
{
- g_free (font_with_emoji);
fe_message ("Failed to open any font. I'm out of here!", FE_MSG_WAIT | FE_MSG_ERROR);
exit (1);
}
- g_free (font_with_emoji);
gtk_xtext_refresh (xtext);
}
@@ -2909,26 +2907,6 @@ mg_apply_emoji_primary_widget (GtkWidget *widget)
pango_font_description_free (desc);
}
-static gchar *
-mg_font_string_with_emoji_fallback (const gchar *font_string)
-{
- PangoFontDescription *base;
- PangoFontDescription *with_fallback;
- gchar *out;
-
- /* Keep existing behavior if unset, but still allow emoji fallback */
- base = pango_font_description_from_string (font_string && *font_string ? font_string : "Sans 10");
- with_fallback = mg_fontdesc_with_fallback (base, FALSE);
-
- out = pango_font_description_to_string (with_fallback ? with_fallback : base);
-
- if (with_fallback)
- pango_font_description_free (with_fallback);
- pango_font_description_free (base);
-
- return out;
-}
-
/* ------------------------------------------------------------------------- *
* Emoji picker (optional UI sugar)
* ------------------------------------------------------------------------- */
@@ -3233,9 +3211,6 @@ mg_create_entry (session *sess, GtkWidget *box)
if (prefs.hex_gui_input_style)
mg_apply_entry_style (entry);
- /* Make emoji render in the input box regardless of chosen font */
- mg_apply_emoji_fallback_widget (entry);
-
/* Optional emoji button (kept since you already added it) */
emoji_button = gtk_button_new_with_label ("😊");
gtk_button_set_relief (GTK_BUTTON (emoji_button), GTK_RELIEF_NONE);
From 20dca7dc2fd73a1ef7e4dfed9c609bc53cb6c011 Mon Sep 17 00:00:00 2001
From: deepend-tildeclub <58404188+deepend-tildeclub@users.noreply.github.com>
Date: Thu, 15 Jan 2026 20:10:58 -0700
Subject: [PATCH 3/4] Enhance emoji widget handling in menu items
---
src/fe-gtk/maingui.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c
index f8438224..b6a800a4 100644
--- a/src/fe-gtk/maingui.c
+++ b/src/fe-gtk/maingui.c
@@ -2964,6 +2964,8 @@ mg_create_emoji_menu (session_gui *gui)
/* Prefer emoji fonts for the label itself */
mg_apply_emoji_primary_widget (item);
+ if (gtk_bin_get_child (GTK_BIN (item)))
+ mg_apply_emoji_primary_widget (gtk_bin_get_child (GTK_BIN (item)));
gtk_menu_attach (GTK_MENU (menu), item, col, col + 1, row, row + 1);
gtk_widget_show (item);
From 44f6fc357ef97da18880fcc56b02362b9273b21f Mon Sep 17 00:00:00 2001
From: deepend-tildeclub <58404188+deepend-tildeclub@users.noreply.github.com>
Date: Thu, 15 Jan 2026 20:21:30 -0700
Subject: [PATCH 4/4] Refactor emoji widget application to use child handling
---
src/fe-gtk/maingui.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c
index b6a800a4..43b50c8a 100644
--- a/src/fe-gtk/maingui.c
+++ b/src/fe-gtk/maingui.c
@@ -2907,6 +2907,23 @@ mg_apply_emoji_primary_widget (GtkWidget *widget)
pango_font_description_free (desc);
}
+static void
+mg_apply_emoji_primary_widget_with_child (GtkWidget *widget)
+{
+ GtkWidget *child;
+
+ if (!widget)
+ return;
+
+ mg_apply_emoji_primary_widget (widget);
+ if (!GTK_IS_BIN (widget))
+ return;
+
+ child = gtk_bin_get_child (GTK_BIN (widget));
+ if (child)
+ mg_apply_emoji_primary_widget (child);
+}
+
/* ------------------------------------------------------------------------- *
* Emoji picker (optional UI sugar)
* ------------------------------------------------------------------------- */
@@ -2963,9 +2980,7 @@ mg_create_emoji_menu (session_gui *gui)
g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (mg_emoji_insert_cb), gui);
/* Prefer emoji fonts for the label itself */
- mg_apply_emoji_primary_widget (item);
- if (gtk_bin_get_child (GTK_BIN (item)))
- mg_apply_emoji_primary_widget (gtk_bin_get_child (GTK_BIN (item)));
+ mg_apply_emoji_primary_widget_with_child (item);
gtk_menu_attach (GTK_MENU (menu), item, col, col + 1, row, row + 1);
gtk_widget_show (item);
@@ -3218,7 +3233,7 @@ mg_create_entry (session *sess, GtkWidget *box)
gtk_button_set_relief (GTK_BUTTON (emoji_button), GTK_RELIEF_NONE);
gtk_widget_set_can_focus (emoji_button, FALSE);
gtk_widget_set_tooltip_text (emoji_button, _("Insert emoji"));
- mg_apply_emoji_primary_widget (emoji_button);
+ mg_apply_emoji_primary_widget_with_child (emoji_button);
g_signal_connect (G_OBJECT (emoji_button), "clicked", G_CALLBACK (mg_emoji_button_cb), gui);
gtk_box_pack_start (GTK_BOX (hbox), emoji_button, FALSE, FALSE, 4);
}