1 Commits

6 changed files with 109 additions and 326 deletions

68
.github/workflows/theme-tests.yml vendored Normal file
View File

@@ -0,0 +1,68 @@
name: Theme Tests
on:
push:
branches: [master, main]
paths:
- '.github/workflows/theme-tests.yml'
- 'meson.build'
- 'meson_options.txt'
- 'src/common/**'
- 'src/fe-gtk/meson.build'
- 'src/fe-gtk/theme/**'
pull_request:
branches: [master, main]
paths:
- '.github/workflows/theme-tests.yml'
- 'meson.build'
- 'meson_options.txt'
- 'src/common/**'
- 'src/fe-gtk/meson.build'
- 'src/fe-gtk/theme/**'
workflow_dispatch:
permissions:
contents: read
jobs:
theme_tests:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v5
with:
submodules: true
- name: Install dependencies
run: |
set -eux
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential \
meson \
ninja-build \
pkg-config \
gettext \
libgtk-3-dev \
libglib2.0-dev \
libdbus-glib-1-dev \
libcanberra-dev \
libarchive-dev \
libssl-dev \
xvfb
- name: Configure
run: |
set -eux
meson setup build-theme-tests \
-Dauto_features=disabled \
-Dplugin=false \
-Dtext-frontend=true
- name: Run theme tests
run: |
set -eux
xvfb-run -a env NO_AT_BRIDGE=1 GSETTINGS_BACKEND=memory \
meson test -C build-theme-tests --print-errorlogs \
--timeout-multiplier 2 \
'Theme Manager Dispatch Routing Tests'

View File

@@ -758,15 +758,11 @@ fe_set_topic (session *sess, char *topic, char *stripped_topic)
{ {
if (prefs.hex_text_stripcolor_topic) if (prefs.hex_text_stripcolor_topic)
{ {
gtk_text_buffer_set_text ( gtk_entry_set_text (GTK_ENTRY (sess->gui->topic_entry), stripped_topic);
gtk_text_view_get_buffer (GTK_TEXT_VIEW (sess->gui->topic_entry)),
stripped_topic, -1);
} }
else else
{ {
gtk_text_buffer_set_text ( gtk_entry_set_text (GTK_ENTRY (sess->gui->topic_entry), topic);
gtk_text_view_get_buffer (GTK_TEXT_VIEW (sess->gui->topic_entry)),
topic, -1);
} }
mg_set_topic_tip (sess); mg_set_topic_tip (sess);
} }

View File

@@ -920,18 +920,13 @@ mg_unpopulate (session *sess)
{ {
restore_gui *res; restore_gui *res;
session_gui *gui; session_gui *gui;
GtkTextBuffer *topic_buffer;
GtkTextIter start;
GtkTextIter end;
int i; int i;
gui = sess->gui; gui = sess->gui;
res = sess->res; res = sess->res;
res->input_text = g_strdup (SPELL_ENTRY_GET_TEXT (gui->input_box)); res->input_text = g_strdup (SPELL_ENTRY_GET_TEXT (gui->input_box));
topic_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (gui->topic_entry)); res->topic_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (gui->topic_entry)));
gtk_text_buffer_get_bounds (topic_buffer, &start, &end);
res->topic_text = gtk_text_buffer_get_text (topic_buffer, &start, &end, FALSE);
res->limit_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (gui->limit_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))); res->key_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (gui->key_entry)));
if (gui->laginfo) if (gui->laginfo)
@@ -1008,9 +1003,6 @@ void
mg_set_topic_tip (session *sess) mg_set_topic_tip (session *sess)
{ {
char *text; char *text;
GtkTextBuffer *topic_buffer;
GtkTextIter start;
GtkTextIter end;
switch (sess->type) switch (sess->type)
{ {
@@ -1025,14 +1017,11 @@ mg_set_topic_tip (session *sess)
gtk_widget_set_tooltip_text (sess->gui->topic_entry, _("No topic is set")); gtk_widget_set_tooltip_text (sess->gui->topic_entry, _("No topic is set"));
break; break;
default: default:
topic_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (sess->gui->topic_entry)); if (gtk_entry_get_text (GTK_ENTRY (sess->gui->topic_entry)) &&
gtk_text_buffer_get_bounds (topic_buffer, &start, &end); gtk_entry_get_text (GTK_ENTRY (sess->gui->topic_entry))[0])
text = gtk_text_buffer_get_text (topic_buffer, &start, &end, FALSE); gtk_widget_set_tooltip_text (sess->gui->topic_entry, (char *)gtk_entry_get_text (GTK_ENTRY (sess->gui->topic_entry)));
if (text[0])
gtk_widget_set_tooltip_text (sess->gui->topic_entry, text);
else else
gtk_widget_set_tooltip_text (sess->gui->topic_entry, NULL); gtk_widget_set_tooltip_text (sess->gui->topic_entry, NULL);
g_free (text);
} }
} }
@@ -1175,7 +1164,7 @@ mg_populate (session *sess)
/* hide the userlist */ /* hide the userlist */
mg_decide_userlist (sess, FALSE); mg_decide_userlist (sess, FALSE);
/* shouldn't edit the topic */ /* shouldn't edit the topic */
gtk_text_view_set_editable (GTK_TEXT_VIEW (gui->topic_entry), FALSE); gtk_editable_set_editable (GTK_EDITABLE (gui->topic_entry), FALSE);
/* might be hidden from server tab */ /* might be hidden from server tab */
if (prefs.hex_gui_topicbar) if (prefs.hex_gui_topicbar)
gtk_widget_show (gui->topic_bar); gtk_widget_show (gui->topic_bar);
@@ -1197,8 +1186,8 @@ mg_populate (session *sess)
gtk_widget_show (gui->topicbutton_box); gtk_widget_show (gui->topicbutton_box);
/* show the userlist */ /* show the userlist */
mg_decide_userlist (sess, FALSE); mg_decide_userlist (sess, FALSE);
/* let the topic be edited */ /* let the topic be editted */
gtk_text_view_set_editable (GTK_TEXT_VIEW (gui->topic_entry), TRUE); gtk_editable_set_editable (GTK_EDITABLE (gui->topic_entry), TRUE);
if (prefs.hex_gui_topicbar) if (prefs.hex_gui_topicbar)
gtk_widget_show (gui->topic_bar); gtk_widget_show (gui->topic_bar);
} }
@@ -1218,21 +1207,8 @@ mg_populate (session *sess)
if (gui->is_tab) if (gui->is_tab)
gtk_widget_set_sensitive (gui->menu, TRUE); gtk_widget_set_sensitive (gui->menu, TRUE);
if (res->topic_text) /* restore all the GtkEntry's */
{ mg_restore_entry (gui->topic_entry, &res->topic_text);
GtkTextBuffer *topic_buffer;
topic_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (gui->topic_entry));
gtk_text_buffer_set_text (topic_buffer, res->topic_text, -1);
g_free (res->topic_text);
res->topic_text = NULL;
} else
{
GtkTextBuffer *topic_buffer;
topic_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (gui->topic_entry));
gtk_text_buffer_set_text (topic_buffer, "", -1);
}
mg_restore_speller (gui->input_box, &res->input_text); mg_restore_speller (gui->input_box, &res->input_text);
mg_restore_entry (gui->key_entry, &res->key_text); mg_restore_entry (gui->key_entry, &res->key_text);
mg_restore_entry (gui->limit_entry, &res->limit_text); mg_restore_entry (gui->limit_entry, &res->limit_text);
@@ -2138,173 +2114,24 @@ mg_create_userlistbuttons (GtkWidget *box)
} }
static void static void
mg_topic_cb (GtkWidget *entry) mg_topic_cb (GtkWidget *entry, gpointer userdata)
{ {
session *sess = current_sess; session *sess = current_sess;
GtkTextBuffer *topic_buffer;
GtkTextIter start;
GtkTextIter end;
char *text; char *text;
if (sess->channel[0] && sess->server->connected && sess->type == SESS_CHANNEL) if (sess->channel[0] && sess->server->connected && sess->type == SESS_CHANNEL)
{ {
topic_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (entry)); text = (char *)gtk_entry_get_text (GTK_ENTRY (entry));
gtk_text_buffer_get_bounds (topic_buffer, &start, &end);
text = gtk_text_buffer_get_text (topic_buffer, &start, &end, FALSE);
if (text[0] == 0) if (text[0] == 0)
sess->server->p_topic (sess->server, sess->channel, NULL); text = NULL;
else sess->server->p_topic (sess->server, sess->channel, text);
sess->server->p_topic (sess->server, sess->channel, text);
g_free (text);
} else } else
{ gtk_entry_set_text (GTK_ENTRY (entry), "");
topic_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (entry));
gtk_text_buffer_set_text (topic_buffer, "", -1);
}
/* restore focus to the input widget, where the next input will most /* restore focus to the input widget, where the next input will most
likely be */ likely be */
gtk_widget_grab_focus (sess->gui->input_box); gtk_widget_grab_focus (sess->gui->input_box);
} }
static gboolean
mg_topic_key_press_cb (GtkWidget *entry, GdkEventKey *event, gpointer userdata)
{
if (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter)
{
mg_topic_cb (entry);
return TRUE;
}
return FALSE;
}
static char *
mg_topic_get_word_at_pos (GtkWidget *entry, gdouble event_x, gdouble event_y)
{
GtkTextBuffer *buffer;
GtkTextIter iter;
GtkTextIter start;
GtkTextIter end;
int x;
int y;
x = (int)event_x;
y = (int)event_y;
gtk_text_view_window_to_buffer_coords (GTK_TEXT_VIEW (entry), GTK_TEXT_WINDOW_TEXT,
x, y, &x, &y);
gtk_text_view_get_iter_at_location (GTK_TEXT_VIEW (entry), &iter, x, y);
start = iter;
while (!gtk_text_iter_starts_line (&start))
{
GtkTextIter prev = start;
gunichar ch;
gtk_text_iter_backward_char (&prev);
ch = gtk_text_iter_get_char (&prev);
if (g_unichar_isspace (ch))
break;
start = prev;
}
end = iter;
while (!gtk_text_iter_ends_line (&end))
{
gunichar ch;
ch = gtk_text_iter_get_char (&end);
if (ch == 0 || g_unichar_isspace (ch))
break;
gtk_text_iter_forward_char (&end);
}
if (gtk_text_iter_equal (&start, &end))
return NULL;
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (entry));
return gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
}
static void
mg_topic_set_cursor (GtkWidget *entry, GdkCursorType cursor_type)
{
GdkWindow *text_window;
GdkDisplay *display;
GdkCursor *cursor;
text_window = gtk_text_view_get_window (GTK_TEXT_VIEW (entry), GTK_TEXT_WINDOW_TEXT);
if (!text_window)
return;
display = gdk_window_get_display (text_window);
cursor = gdk_cursor_new_for_display (display, cursor_type);
gdk_window_set_cursor (text_window, cursor);
g_object_unref (cursor);
}
static gboolean
mg_topic_word_is_clickable (const char *word)
{
if (!word || word[0] == 0)
return FALSE;
if (strcmp (word, "/") == 0)
return FALSE;
return url_check_word (word) != 0;
}
static gboolean
mg_topic_motion_cb (GtkWidget *entry, GdkEventMotion *event, gpointer userdata)
{
char *word;
gboolean word_is_clickable;
word = mg_topic_get_word_at_pos (entry, event->x, event->y);
word_is_clickable = mg_topic_word_is_clickable (word);
if (word_is_clickable)
mg_topic_set_cursor (entry, GDK_HAND2);
else
mg_topic_set_cursor (entry, GDK_XTERM);
g_free (word);
return FALSE;
}
static gboolean
mg_topic_leave_cb (GtkWidget *entry, GdkEventCrossing *event, gpointer userdata)
{
mg_topic_set_cursor (entry, GDK_XTERM);
return FALSE;
}
static gboolean
mg_topic_button_release_cb (GtkWidget *entry, GdkEventButton *event, gpointer userdata)
{
char *word;
int start;
int end;
if (event->button != 1)
return FALSE;
word = mg_topic_get_word_at_pos (entry, event->x, event->y);
if (!word)
return FALSE;
if (mg_topic_word_is_clickable (word))
{
url_last (&start, &end);
word[end] = 0;
fe_open_url (word + start);
g_free (word);
return TRUE;
}
g_free (word);
return FALSE;
}
static void static void
mg_tabwindow_kill_cb (GtkWidget *win, gpointer userdata) mg_tabwindow_kill_cb (GtkWidget *win, gpointer userdata)
{ {
@@ -2588,20 +2415,6 @@ mg_apply_entry_style (GtkWidget *entry)
theme_manager_apply_entry_palette (entry, input_style->font_desc); theme_manager_apply_entry_palette (entry, input_style->font_desc);
} }
static gboolean
mg_entry_select_all (GtkWidget *entry, GdkEventKey *event, gpointer userdata)
{
if ((event->state & GDK_CONTROL_MASK) &&
!(event->state & (GDK_SHIFT_MASK | GDK_MOD1_MASK | GDK_META_MASK)) &&
(event->keyval == GDK_KEY_a || event->keyval == GDK_KEY_A))
{
gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1);
return TRUE;
}
return FALSE;
}
static void static void
mg_create_chanmodebuttons (session_gui *gui, GtkWidget *box) mg_create_chanmodebuttons (session_gui *gui, GtkWidget *box)
{ {
@@ -2621,8 +2434,6 @@ mg_create_chanmodebuttons (session_gui *gui, GtkWidget *box)
mg_apply_emoji_fallback_widget (gui->key_entry); mg_apply_emoji_fallback_widget (gui->key_entry);
g_signal_connect (G_OBJECT (gui->key_entry), "activate", g_signal_connect (G_OBJECT (gui->key_entry), "activate",
G_CALLBACK (mg_key_entry_cb), NULL); G_CALLBACK (mg_key_entry_cb), NULL);
g_signal_connect (G_OBJECT (gui->key_entry), "key_press_event",
G_CALLBACK (mg_entry_select_all), NULL);
if (prefs.hex_gui_input_style) if (prefs.hex_gui_input_style)
mg_apply_entry_style (gui->key_entry); mg_apply_entry_style (gui->key_entry);
@@ -2636,8 +2447,6 @@ mg_create_chanmodebuttons (session_gui *gui, GtkWidget *box)
mg_apply_emoji_fallback_widget (gui->limit_entry); mg_apply_emoji_fallback_widget (gui->limit_entry);
g_signal_connect (G_OBJECT (gui->limit_entry), "activate", g_signal_connect (G_OBJECT (gui->limit_entry), "activate",
G_CALLBACK (mg_limit_entry_cb), NULL); G_CALLBACK (mg_limit_entry_cb), NULL);
g_signal_connect (G_OBJECT (gui->limit_entry), "key_press_event",
G_CALLBACK (mg_entry_select_all), NULL);
if (prefs.hex_gui_input_style) if (prefs.hex_gui_input_style)
mg_apply_entry_style (gui->limit_entry); mg_apply_entry_style (gui->limit_entry);
@@ -2661,18 +2470,12 @@ mg_dialog_button_cb (GtkWidget *wid, char *cmd)
char buf[128]; char buf[128];
char *host = ""; char *host = "";
char *topic; char *topic;
char *topic_text;
GtkTextBuffer *topic_buffer;
GtkTextIter start;
GtkTextIter end;
if (!current_sess) if (!current_sess)
return; return;
topic_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (current_sess->gui->topic_entry)); topic = (char *)(gtk_entry_get_text (GTK_ENTRY (current_sess->gui->topic_entry)));
gtk_text_buffer_get_bounds (topic_buffer, &start, &end); topic = strrchr (topic, '@');
topic_text = gtk_text_buffer_get_text (topic_buffer, &start, &end, FALSE);
topic = strrchr (topic_text, '@');
if (topic) if (topic)
host = topic + 1; host = topic + 1;
@@ -2681,7 +2484,6 @@ mg_dialog_button_cb (GtkWidget *wid, char *cmd)
current_sess->channel, ""); current_sess->channel, "");
handle_command (current_sess, buf, TRUE); handle_command (current_sess, buf, TRUE);
g_free (topic_text);
/* dirty trick to avoid auto-selection */ /* dirty trick to avoid auto-selection */
SPELL_ENTRY_SET_EDITABLE (current_sess->gui->input_box, FALSE); SPELL_ENTRY_SET_EDITABLE (current_sess->gui->input_box, FALSE);
@@ -2728,23 +2530,16 @@ mg_create_topicbar (session *sess, GtkWidget *box)
if (!gui->is_tab) if (!gui->is_tab)
sess->res->tab = NULL; sess->res->tab = NULL;
gui->topic_entry = topic = gtk_text_view_new (); gui->topic_entry = topic = sexy_spell_entry_new ();
gtk_widget_set_name (topic, "zoitechat-inputbox"); gtk_widget_set_name (topic, "zoitechat-inputbox");
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (topic), GTK_WRAP_WORD_CHAR); sexy_spell_entry_set_checked (SEXY_SPELL_ENTRY (topic), FALSE);
gtk_text_view_set_left_margin (GTK_TEXT_VIEW (topic), 4);
gtk_text_view_set_right_margin (GTK_TEXT_VIEW (topic), 4);
gtk_box_pack_start (GTK_BOX (hbox), topic, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (hbox), topic, TRUE, TRUE, 0);
mg_apply_emoji_fallback_widget (topic); mg_apply_emoji_fallback_widget (topic);
gtk_widget_add_events (topic, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | g_signal_connect (G_OBJECT (topic), "activate",
GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); G_CALLBACK (mg_topic_cb), 0);
g_signal_connect (G_OBJECT (topic), "key-press-event",
G_CALLBACK (mg_topic_key_press_cb), NULL); if (prefs.hex_gui_input_style)
g_signal_connect (G_OBJECT (topic), "button-release-event", mg_apply_entry_style (topic);
G_CALLBACK (mg_topic_button_release_cb), NULL);
g_signal_connect (G_OBJECT (topic), "motion-notify-event",
G_CALLBACK (mg_topic_motion_cb), NULL);
g_signal_connect (G_OBJECT (topic), "leave-notify-event",
G_CALLBACK (mg_topic_leave_cb), NULL);
gui->topicbutton_box = bbox = mg_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0); gui->topicbutton_box = bbox = mg_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), bbox, 0, 0, 0); gtk_box_pack_start (GTK_BOX (hbox), bbox, 0, 0, 0);
@@ -3189,15 +2984,15 @@ mg_create_center (session *sess, session_gui *gui, GtkWidget *box)
if (prefs.hex_gui_win_swap) if (prefs.hex_gui_win_swap)
{ {
gtk_paned_pack2 (GTK_PANED (gui->hpane_left), gui->vpane_left, FALSE, FALSE); 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); gtk_paned_pack1 (GTK_PANED (gui->hpane_left), gui->hpane_right, TRUE, TRUE);
} }
else else
{ {
gtk_paned_pack1 (GTK_PANED (gui->hpane_left), gui->vpane_left, FALSE, FALSE); 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_left), gui->hpane_right, TRUE, TRUE);
} }
gtk_paned_pack2 (GTK_PANED (gui->hpane_right), gui->vpane_right, FALSE, FALSE); gtk_paned_pack2 (GTK_PANED (gui->hpane_right), gui->vpane_right, FALSE, TRUE);
gtk_box_pack_start (GTK_BOX (box), gui->hpane_left, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box), gui->hpane_left, TRUE, TRUE, 0);
@@ -4293,8 +4088,7 @@ fe_clear_channel (session *sess)
if (!sess->gui->is_tab || sess == current_tab) if (!sess->gui->is_tab || sess == current_tab)
{ {
gtk_text_buffer_set_text ( gtk_entry_set_text (GTK_ENTRY (gui->topic_entry), "");
gtk_text_view_get_buffer (GTK_TEXT_VIEW (gui->topic_entry)), "", -1);
if (gui->op_xpm) if (gui->op_xpm)
{ {

View File

@@ -926,11 +926,6 @@ menu_setting_foreach (void (*callback) (session *), int id, guint state)
while (list) while (list)
{ {
sess = list->data; sess = list->data;
if (!sess || !sess->gui)
{
list = list->next;
continue;
}
if (!sess->gui->is_tab || !maindone) if (!sess->gui->is_tab || !maindone)
{ {
@@ -942,18 +937,7 @@ menu_setting_foreach (void (*callback) (session *), int id, guint state)
if (menu_item != NULL) if (menu_item != NULL)
{ {
guint toggled_signal = g_signal_lookup ("toggled", G_OBJECT_TYPE (menu_item)); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), state);
if (toggled_signal != 0)
{
g_signal_handlers_block_matched (menu_item, G_SIGNAL_MATCH_ID, toggled_signal, 0, NULL, NULL, NULL);
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), state);
g_signal_handlers_unblock_matched (menu_item, G_SIGNAL_MATCH_ID, toggled_signal, 0, NULL, NULL, NULL);
}
else
{
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), state);
}
} }
} }
if (callback) if (callback)
@@ -2186,11 +2170,6 @@ menu_foreach_gui (menu_entry *me, void (*callback) (GtkWidget *, menu_entry *, c
while (list) while (list)
{ {
sess = list->data; sess = list->data;
if (!sess || !sess->gui)
{
list = list->next;
continue;
}
/* do it only once for tab sessions, since they share a GUI */ /* do it only once for tab sessions, since they share a GUI */
if (!sess->gui->is_tab || !tabdone) if (!sess->gui->is_tab || !tabdone)
{ {
@@ -2616,14 +2595,13 @@ menu_create_main (void *accel_group, int bar, int away, int toplevel,
normalitem: normalitem:
if (mymenu[i].key != 0) if (mymenu[i].key != 0)
gtk_widget_add_accelerator (item, "activate", accel_group, gtk_widget_add_accelerator (item, "activate", accel_group,
mymenu[i].key, mymenu[i].key,
mymenu[i].key == GDK_KEY_F1 ? 0 : mymenu[i].key == GDK_KEY_F1 ? 0 :
mymenu[i].key == GDK_KEY_w ? close_mask : mymenu[i].key == GDK_KEY_w ? close_mask :
mymenu[i].id == MENU_ID_AWAY ? away_mask : (g_ascii_isupper (mymenu[i].key)) ?
(g_ascii_isupper (mymenu[i].key)) ? STATE_SHIFT | STATE_CTRL :
STATE_SHIFT | STATE_CTRL : STATE_CTRL,
STATE_CTRL, GTK_ACCEL_VISIBLE);
GTK_ACCEL_VISIBLE);
if (mymenu[i].callback) if (mymenu[i].callback)
g_signal_connect (G_OBJECT (item), "activate", g_signal_connect (G_OBJECT (item), "activate",
G_CALLBACK (mymenu[i].callback), 0); G_CALLBACK (mymenu[i].callback), 0);

View File

@@ -27,12 +27,6 @@ typedef struct
guint16 bg_red; guint16 bg_red;
guint16 bg_green; guint16 bg_green;
guint16 bg_blue; guint16 bg_blue;
guint16 sel_fg_red;
guint16 sel_fg_green;
guint16 sel_fg_blue;
guint16 sel_bg_red;
guint16 sel_bg_green;
guint16 sel_bg_blue;
} ThemeCssInputFingerprint; } ThemeCssInputFingerprint;
static GtkCssProvider *theme_css_input_provider; static GtkCssProvider *theme_css_input_provider;
@@ -98,12 +92,6 @@ theme_css_input_fingerprint_matches (const ThemeCssInputFingerprint *next)
if (theme_css_input_fp.bg_red != next->bg_red || theme_css_input_fp.bg_green != next->bg_green if (theme_css_input_fp.bg_red != next->bg_red || theme_css_input_fp.bg_green != next->bg_green
|| theme_css_input_fp.bg_blue != next->bg_blue) || theme_css_input_fp.bg_blue != next->bg_blue)
return FALSE; return FALSE;
if (theme_css_input_fp.sel_fg_red != next->sel_fg_red || theme_css_input_fp.sel_fg_green != next->sel_fg_green
|| theme_css_input_fp.sel_fg_blue != next->sel_fg_blue)
return FALSE;
if (theme_css_input_fp.sel_bg_red != next->sel_bg_red || theme_css_input_fp.sel_bg_green != next->sel_bg_green
|| theme_css_input_fp.sel_bg_blue != next->sel_bg_blue)
return FALSE;
if (g_strcmp0 (theme_css_input_fp.theme_name, next->theme_name) != 0) if (g_strcmp0 (theme_css_input_fp.theme_name, next->theme_name) != 0)
return FALSE; return FALSE;
if (g_strcmp0 (theme_css_input_fp.font, next->font) != 0) if (g_strcmp0 (theme_css_input_fp.font, next->font) != 0)
@@ -131,9 +119,7 @@ theme_css_input_fingerprint_clear (void)
static char * static char *
theme_css_build_input (const char *theme_name, guint16 fg_red, guint16 fg_green, guint16 fg_blue, theme_css_build_input (const char *theme_name, guint16 fg_red, guint16 fg_green, guint16 fg_blue,
guint16 bg_red, guint16 bg_green, guint16 bg_blue, guint16 bg_red, guint16 bg_green, guint16 bg_blue)
guint16 sel_fg_red, guint16 sel_fg_green, guint16 sel_fg_blue,
guint16 sel_bg_red, guint16 sel_bg_green, guint16 sel_bg_blue)
{ {
GString *css = g_string_new (""); GString *css = g_string_new ("");
@@ -151,11 +137,6 @@ theme_css_build_input (const char *theme_name, guint16 fg_red, guint16 fg_green,
"%s {" "%s {"
"color: #%02x%02x%02x;" "color: #%02x%02x%02x;"
"caret-color: #%02x%02x%02x;" "caret-color: #%02x%02x%02x;"
"}"
"%s selection, %s text selection, %s:focus selection, %s:focus text selection, %s *:selected, %s *:selected:focus {"
"background-color: #%02x%02x%02x;"
"color: #%02x%02x%02x;"
"text-shadow: none;"
"}", "}",
theme_css_selector_input, theme_css_selector_input,
(bg_red >> 8), (bg_green >> 8), (bg_blue >> 8), (bg_red >> 8), (bg_green >> 8), (bg_blue >> 8),
@@ -163,15 +144,7 @@ theme_css_build_input (const char *theme_name, guint16 fg_red, guint16 fg_green,
(fg_red >> 8), (fg_green >> 8), (fg_blue >> 8), (fg_red >> 8), (fg_green >> 8), (fg_blue >> 8),
theme_css_selector_input_text, theme_css_selector_input_text,
(fg_red >> 8), (fg_green >> 8), (fg_blue >> 8), (fg_red >> 8), (fg_green >> 8), (fg_blue >> 8),
(fg_red >> 8), (fg_green >> 8), (fg_blue >> 8), (fg_red >> 8), (fg_green >> 8), (fg_blue >> 8));
theme_css_selector_input,
theme_css_selector_input,
theme_css_selector_input,
theme_css_selector_input,
theme_css_selector_input,
theme_css_selector_input,
(sel_bg_red >> 8), (sel_bg_green >> 8), (sel_bg_blue >> 8),
(sel_fg_red >> 8), (sel_fg_green >> 8), (sel_fg_blue >> 8));
return g_string_free (css, FALSE); return g_string_free (css, FALSE);
} }
@@ -204,10 +177,6 @@ theme_css_reload_input_style (gboolean enabled, const PangoFontDescription *font
&next.fg_red, &next.fg_green, &next.fg_blue); &next.fg_red, &next.fg_green, &next.fg_blue);
theme_palette_color_get_rgb16 (&style_values.background, theme_palette_color_get_rgb16 (&style_values.background,
&next.bg_red, &next.bg_green, &next.bg_blue); &next.bg_red, &next.bg_green, &next.bg_blue);
theme_palette_color_get_rgb16 (&style_values.selection_foreground,
&next.sel_fg_red, &next.sel_fg_green, &next.sel_fg_blue);
theme_palette_color_get_rgb16 (&style_values.selection_background,
&next.sel_bg_red, &next.sel_bg_green, &next.sel_bg_blue);
next.colors_set = TRUE; next.colors_set = TRUE;
} }
@@ -224,9 +193,7 @@ theme_css_reload_input_style (gboolean enabled, const PangoFontDescription *font
css = theme_css_build_input (theme_name ? theme_name : "", css = theme_css_build_input (theme_name ? theme_name : "",
next.fg_red, next.fg_green, next.fg_blue, next.fg_red, next.fg_green, next.fg_blue,
next.bg_red, next.bg_green, next.bg_blue, next.bg_red, next.bg_green, next.bg_blue);
next.sel_fg_red, next.sel_fg_green, next.sel_fg_blue,
next.sel_bg_red, next.sel_bg_green, next.sel_bg_blue);
gtk_css_provider_load_from_data (theme_css_input_provider, css, -1, NULL); gtk_css_provider_load_from_data (theme_css_input_provider, css, -1, NULL);
g_free (css); g_free (css);
theme_css_apply_app_provider (GTK_STYLE_PROVIDER (theme_css_input_provider)); theme_css_apply_app_provider (GTK_STYLE_PROVIDER (theme_css_input_provider));
@@ -309,7 +276,7 @@ theme_css_apply_palette_widget (GtkWidget *widget, const GdkRGBA *bg, const GdkR
if (fg) if (fg)
g_string_append_printf (css, " color: %s;", fg_color); g_string_append_printf (css, " color: %s;", fg_color);
g_string_append (css, " }"); g_string_append (css, " }");
g_string_append_printf (css, ".%s *:selected, .%s *:selected:focus, .%s *:selected:hover, .%s treeview.view:selected, .%s treeview.view:selected:focus, .%s treeview.view:selected:hover, .%s row:selected, .%s row:selected:focus, .%s row:selected:hover, .%s selection, .%s text selection, .%s entry selection, .%s entry text selection, .%s:focus selection, .%s:focus text selection {", theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class); g_string_append_printf (css, ".%s *:selected, .%s *:selected:focus, .%s *:selected:hover, .%s treeview.view:selected, .%s treeview.view:selected:focus, .%s treeview.view:selected:hover, .%s row:selected, .%s row:selected:focus, .%s row:selected:hover {", theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class, theme_css_selector_palette_class);
if (sel_bg_color) if (sel_bg_color)
g_string_append_printf (css, " background-color: %s;", sel_bg_color); g_string_append_printf (css, " background-color: %s;", sel_bg_color);
else if (bg) else if (bg)

View File

@@ -52,24 +52,6 @@ enum
static void userlist_store_color (GtkListStore *store, GtkTreeIter *iter, ThemeSemanticToken token, gboolean has_token); static void userlist_store_color (GtkListStore *store, GtkTreeIter *iter, ThemeSemanticToken token, gboolean has_token);
static void
userlist_update_min_width (session *sess)
{
GtkRequisition minimum;
GtkRequisition natural;
int width;
if (!sess || !sess->gui || !sess->gui->user_box || !sess->gui->namelistinfo)
return;
gtk_widget_get_preferred_size (sess->gui->namelistinfo, &minimum, &natural);
width = MAX (minimum.width, natural.width) + 16;
if (width < 1)
width = 1;
gtk_widget_set_size_request (sess->gui->user_box, width, -1);
}
GdkPixbuf * GdkPixbuf *
get_user_icon (server *serv, struct User *user) get_user_icon (server *serv, struct User *user)
{ {
@@ -128,11 +110,9 @@ fe_userlist_numbers (session *sess)
g_snprintf (tbuf, sizeof (tbuf), _("%d ops, %d total"), sess->ops, sess->total); g_snprintf (tbuf, sizeof (tbuf), _("%d ops, %d total"), sess->ops, sess->total);
tbuf[sizeof (tbuf) - 1] = 0; tbuf[sizeof (tbuf) - 1] = 0;
gtk_label_set_text (GTK_LABEL (sess->gui->namelistinfo), tbuf); gtk_label_set_text (GTK_LABEL (sess->gui->namelistinfo), tbuf);
userlist_update_min_width (sess);
} else } else
{ {
gtk_label_set_text (GTK_LABEL (sess->gui->namelistinfo), NULL); gtk_label_set_text (GTK_LABEL (sess->gui->namelistinfo), NULL);
userlist_update_min_width (sess);
} }
if (sess->type == SESS_CHANNEL && prefs.hex_gui_win_ucount) if (sess->type == SESS_CHANNEL && prefs.hex_gui_win_ucount)