Files
zoitechat/src/fe-gtk/rawlog.c
deepend f6b78bd167 Standardized GTK menu-icon fallback mapping so stock names for Save As, Previous, and Next now resolve through the bundled zc-menu-* icon family (and map back correctly on GTK2), ensuring these menu actions use the same icon set path as the rest of your menu icons.
Updated search controls in the main UI to use zc-menu-previous / zc-menu-next and to load through gtkutil_image_new_from_stock(...), so those menu-sized icons are rendered from the same data/icons/menu resources instead of theme-dependent icon names.

    Updated URL Grabber and Raw Log “Save As” icon constants to use zc-menu-save-as for consistency with the menu icon set.

    Added new menu SVGs (save-as, previous, next) in both light and dark variants, and registered all of them in the GResource manifest so they’re available cross-platform from the bundled resource system.
2026-02-18 00:32:42 -07:00

195 lines
5.3 KiB
C

/* X-Chat
* Copyright (C) 1998 Peter Zelezny.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#ifdef WIN32
#include <io.h>
#else
#include <unistd.h>
#endif
#include "fe-gtk.h"
#include <gdk/gdkkeysyms.h>
#include "../common/zoitechat.h"
#include "../common/zoitechatc.h"
#include "../common/cfgfiles.h"
#include "../common/server.h"
#include "gtkutil.h"
#include "palette.h"
#include "maingui.h"
#include "rawlog.h"
#include "xtext.h"
#include "fkeys.h"
#if HAVE_GTK3
#define ICON_RAWLOG_CLEAR "zc-menu-clear"
#define ICON_RAWLOG_SAVE_AS "zc-menu-save-as"
#endif
#if !HAVE_GTK3
#define ICON_RAWLOG_CLEAR GTK_STOCK_CLEAR
#define ICON_RAWLOG_SAVE_AS GTK_STOCK_SAVE_AS
#endif
static void
close_rawlog (GtkWidget *wid, server *serv)
{
if (is_server (serv))
serv->gui->rawlog_window = 0;
}
static void
rawlog_save (server *serv, char *file)
{
int fh = -1;
if (file)
{
if (serv->gui->rawlog_window)
fh = zoitechat_open_file (file, O_TRUNC | O_WRONLY | O_CREAT,
0600, XOF_DOMODE | XOF_FULLPATH);
if (fh != -1)
{
gtk_xtext_save (GTK_XTEXT (serv->gui->rawlog_textlist), fh);
close (fh);
}
}
}
static int
rawlog_clearbutton (GtkWidget * wid, server *serv)
{
gtk_xtext_clear (GTK_XTEXT (serv->gui->rawlog_textlist)->buffer, 0);
return FALSE;
}
static int
rawlog_savebutton (GtkWidget * wid, server *serv)
{
gtkutil_file_req (NULL, _("Save As..."), rawlog_save, serv, NULL, NULL, FRF_WRITE);
return FALSE;
}
static gboolean
rawlog_key_cb (GtkWidget * wid, GdkEventKey * key, gpointer userdata)
{
/* Copy rawlog selection to clipboard when Ctrl+Shift+C is pressed,
* but make sure not to copy twice, i.e. when auto-copy is enabled.
*/
if (!prefs.hex_text_autocopy_text &&
(key->keyval == GDK_KEY_c || key->keyval == GDK_KEY_C) &&
key->state & STATE_SHIFT &&
key->state & STATE_CTRL)
{
gtk_xtext_copy_selection (userdata);
}
return FALSE;
}
void
open_rawlog (struct server *serv)
{
GtkWidget *bbox, *scrolledwindow, *vbox;
XTextColor xtext_palette[XTEXT_COLS];
char tbuf[256];
if (serv->gui->rawlog_window)
{
mg_bring_tofront (serv->gui->rawlog_window);
return;
}
g_snprintf (tbuf, sizeof tbuf, _("Raw Log (%s) - %s"), serv->servername, _(DISPLAY_NAME));
serv->gui->rawlog_window =
mg_create_generic_tab ("RawLog", tbuf, FALSE, TRUE, close_rawlog, serv,
640, 320, &vbox, serv);
gtkutil_destroy_on_esc (serv->gui->rawlog_window);
scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_SHADOW_IN);
#if HAVE_GTK3
gtk_widget_set_hexpand (scrolledwindow, TRUE);
gtk_widget_set_vexpand (scrolledwindow, TRUE);
gtk_box_pack_start (GTK_BOX (vbox), scrolledwindow, TRUE, TRUE, 0);
#elif !HAVE_GTK3
gtk_container_add (GTK_CONTAINER (vbox), scrolledwindow);
#endif
palette_get_xtext_colors (xtext_palette, XTEXT_COLS);
serv->gui->rawlog_textlist = gtk_xtext_new (xtext_palette, 0);
gtk_container_add (GTK_CONTAINER (scrolledwindow), serv->gui->rawlog_textlist);
gtk_xtext_set_font (GTK_XTEXT (serv->gui->rawlog_textlist), prefs.hex_text_font);
GTK_XTEXT (serv->gui->rawlog_textlist)->ignore_hidden = 1;
#if HAVE_GTK3
bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_SPREAD);
#elif !HAVE_GTK3
bbox = gtk_hbutton_box_new ();
gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_SPREAD);
#endif
gtk_box_pack_end (GTK_BOX (vbox), bbox, 0, 0, 4);
gtkutil_button (bbox, ICON_RAWLOG_CLEAR, NULL, rawlog_clearbutton,
serv, _("Clear Raw Log"));
gtkutil_button (bbox, ICON_RAWLOG_SAVE_AS, NULL, rawlog_savebutton,
serv, _("Save As..."));
/* Copy selection to clipboard when Ctrl+Shift+C is pressed AND text auto-copy is disabled */
g_signal_connect (G_OBJECT (serv->gui->rawlog_window), "key_press_event", G_CALLBACK (rawlog_key_cb), serv->gui->rawlog_textlist);
gtk_widget_show_all (serv->gui->rawlog_window);
}
void
fe_add_rawlog (server *serv, char *text, int len, int outbound)
{
char **split_text;
char *new_text;
size_t i;
if (!serv->gui->rawlog_window)
return;
split_text = g_strsplit (text, "\r\n", 0);
for (i = 0; i < g_strv_length (split_text); i++)
{
if (split_text[i][0] == 0)
break;
if (outbound)
new_text = g_strconcat ("\0034<<\017 ", split_text[i], NULL);
else
new_text = g_strconcat ("\0033>>\017 ", split_text[i], NULL);
gtk_xtext_append (GTK_XTEXT (serv->gui->rawlog_textlist)->buffer, new_text, strlen (new_text), 0);
g_free (new_text);
}
g_strfreev (split_text);
}