mirror of
https://github.com/ZoiteChat/zoitechat.git
synced 2026-04-01 02:00:19 +00:00
Compare commits
7 Commits
78219bf9e1
...
tab_close_
| Author | SHA1 | Date | |
|---|---|---|---|
| 654796c221 | |||
| 9f2529adb6 | |||
|
|
3903d7b9e5 | ||
| ec4d698021 | |||
|
|
da06c71389 | ||
| 0f508bf438 | |||
| 97dd7c5d57 |
@@ -1,6 +1,30 @@
|
|||||||
ZoiteChat ChangeLog
|
ZoiteChat ChangeLog
|
||||||
=================
|
=================
|
||||||
|
|
||||||
|
2.18.0~pre6 (2026-03-30)
|
||||||
|
|
||||||
|
- Applied app theme CSS to the menubar consistently across the app.
|
||||||
|
- Restored horizontal separator lines in menus.
|
||||||
|
- Improved Windows installer VC++ redistributable handling by failing loudly when missing and using the official Microsoft download endpoint.
|
||||||
|
- Fixed Windows locale path resolution in both GTK and text frontends.
|
||||||
|
- Fixed duplicate dialog buttons persisting in the UI.
|
||||||
|
- Fixed GTK auto-replace cursor snapback.
|
||||||
|
- Restored hiding of formatting control bytes so only formatted output is shown.
|
||||||
|
- Added one-click client SSL certificate tools, including generation with P-256 certificates.
|
||||||
|
- Added client SSL certificate import support in the network editor.
|
||||||
|
- Added 99-color support.
|
||||||
|
- Fixed xtext link hit-testing coordinates.
|
||||||
|
- Fixed short-palette fallback clobbering tab colors.
|
||||||
|
- Lazy-loads Preferences pages on first open for faster dialog startup.
|
||||||
|
- Removed unused UI icons.
|
||||||
|
- Added a None option for resetting the GTK3 theme back to system/default behavior.
|
||||||
|
- Added channel-only mode to Ctrl+F search.
|
||||||
|
- Disabled disk info in sysinfo.
|
||||||
|
- Wrapped the topic bar in a scroller with bounded height.
|
||||||
|
- Added close buttons to tabs.
|
||||||
|
- Fixed fallback GTK menu highlight states.
|
||||||
|
- Applied configured font preferences to the topic bar, channel tree, user list, and input box.
|
||||||
|
|
||||||
2.18.0~pre5 (2026-03-22)
|
2.18.0~pre5 (2026-03-22)
|
||||||
------------------------
|
------------------------
|
||||||
- Overhauled preferences/config saving: fully staged and transactional, debounced
|
- Overhauled preferences/config saving: fully staged and transactional, debounced
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<extends>net.zoite.Zoitechat</extends>
|
<extends>net.zoite.Zoitechat</extends>
|
||||||
<name>@NAME@ Plugin</name>
|
<name>@NAME@ Plugin</name>
|
||||||
<summary>@SUMMARY@</summary>
|
<summary>@SUMMARY@</summary>
|
||||||
<url type="homepage">https://zoitechat.zoite.net/</url>
|
<url type="homepage">https://zoitechat.org/</url>
|
||||||
<project_license>@LICENSE@</project_license>
|
<project_license>@LICENSE@</project_license>
|
||||||
<metadata_license>CC0-1.0</metadata_license>
|
<metadata_license>CC0-1.0</metadata_license>
|
||||||
<update_contact>deepend_AT_zoite.net</update_contact>
|
<update_contact>deepend_AT_zoite.net</update_contact>
|
||||||
|
|||||||
@@ -16,12 +16,12 @@
|
|||||||
<p>ZoiteChat is an easy to use yet extensible IRC Client based on Hexchat. It allows you to securely join multiple networks and talk to users privately or in channels using a customizable interface. You can even transfer files.</p>
|
<p>ZoiteChat is an easy to use yet extensible IRC Client based on Hexchat. It allows you to securely join multiple networks and talk to users privately or in channels using a customizable interface. You can even transfer files.</p>
|
||||||
<p>ZoiteChat supports features such as: DCC, SASL, proxies, spellcheck, alerts, logging, custom themes, and Python/Perl scripts.</p>
|
<p>ZoiteChat supports features such as: DCC, SASL, proxies, spellcheck, alerts, logging, custom themes, and Python/Perl scripts.</p>
|
||||||
</description>
|
</description>
|
||||||
<url type="homepage">https://zoitechat.zoite.net</url>
|
<url type="homepage">https://zoitechat.org</url>
|
||||||
<url type="bugtracker">https://github.com/zoitechat/zoitechat</url>
|
<url type="bugtracker">https://github.com/zoitechat/zoitechat</url>
|
||||||
<url type="help">https://docs.zoitechat.zoite.net/en/latest/</url>
|
<url type="help">https://docs.zoitechat.org/en/latest/</url>
|
||||||
<screenshots>
|
<screenshots>
|
||||||
<screenshot type="default">
|
<screenshot type="default">
|
||||||
<image>https://zoitechat.zoite.net/assets/ZoiteChat.png</image>
|
<image>https://zoitechat.org/assets/ZoiteChat.png</image>
|
||||||
<caption>Main Chat Window</caption>
|
<caption>Main Chat Window</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
</screenshots>
|
</screenshots>
|
||||||
@@ -29,6 +29,46 @@
|
|||||||
<id>zoitechat.desktop</id>
|
<id>zoitechat.desktop</id>
|
||||||
</provides>
|
</provides>
|
||||||
<releases>
|
<releases>
|
||||||
|
<release date="2026-03-30" version="2.18.0~pre6">
|
||||||
|
<description>
|
||||||
|
<p>GTK theme and UI:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Applied app theme CSS to the menubar consistently across the app.</li>
|
||||||
|
<li>Restored horizontal separator lines in menus.</li>
|
||||||
|
<li>Fixed duplicate dialog buttons persisting in the UI.</li>
|
||||||
|
<li>Fixed GTK auto-replace cursor snapback.</li>
|
||||||
|
<li>Restored hiding of formatting control bytes so only formatted output is shown.</li>
|
||||||
|
<li>Fixed xtext link hit-testing coordinates.</li>
|
||||||
|
<li>Fixed short-palette fallback clobbering tab colors.</li>
|
||||||
|
<li>Added a None option for resetting the GTK3 theme back to system/default behavior.</li>
|
||||||
|
<li>Wrapped the topic bar in a scroller with bounded height.</li>
|
||||||
|
<li>Fixed fallback GTK menu highlight states.</li>
|
||||||
|
<li>Applied configured font preferences to the topic bar, channel tree, user list, and input box.</li>
|
||||||
|
<li>Removed unused UI icons.</li>
|
||||||
|
<li>Added close buttons to tabs.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Preferences and search:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Lazy-loads Preferences pages on first open for faster dialog startup.</li>
|
||||||
|
<li>Added channel-only mode to Ctrl+F search.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Security and certificates:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added one-click client SSL certificate tools, including generation with P-256 certificates.</li>
|
||||||
|
<li>Added client SSL certificate import support in the network editor.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Windows and packaging:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Improved Windows installer VC++ redistributable handling by failing loudly when missing and using the official Microsoft download endpoint.</li>
|
||||||
|
<li>Fixed Windows locale path resolution in both GTK and text frontends.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Other changes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added 99-color support.</li>
|
||||||
|
<li>Disabled disk info in sysinfo.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
<release date="2026-03-22" version="2.18.0~pre5">
|
<release date="2026-03-22" version="2.18.0~pre5">
|
||||||
<description>
|
<description>
|
||||||
<p>Preferences and config saving:</p>
|
<p>Preferences and config saving:</p>
|
||||||
@@ -60,14 +100,6 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</description>
|
</description>
|
||||||
</release>
|
</release>
|
||||||
<release date="2026-03-22" version="2.18.0~pre5">
|
|
||||||
<description>
|
|
||||||
<p>Version metadata update:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Bumped release version references to <code>2.18.0~pre5</code> across build and packaging files.</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
<release date="2026-03-14" version="2.18.0~pre4">
|
<release date="2026-03-14" version="2.18.0~pre4">
|
||||||
<description>
|
<description>
|
||||||
<p>UI fixes, topic bar improvements, and selection styling updates:</p>
|
<p>UI fixes, topic bar improvements, and selection styling updates:</p>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
project('zoitechat', 'c',
|
project('zoitechat', 'c',
|
||||||
version: '2.18.0~pre5',
|
version: '2.18.0~pre6',
|
||||||
meson_version: '>= 0.55.0',
|
meson_version: '>= 0.55.0',
|
||||||
default_options: [
|
default_options: [
|
||||||
'c_std=c17',
|
'c_std=c17',
|
||||||
|
|||||||
@@ -1457,14 +1457,14 @@ perl_load_file (char *filename)
|
|||||||
"You must have a Visual C++ build of Perl "
|
"You must have a Visual C++ build of Perl "
|
||||||
PERL_REQUIRED_VERSION " installed in order to\n"
|
PERL_REQUIRED_VERSION " installed in order to\n"
|
||||||
"run Perl scripts. A reboot may be required.\n\n"
|
"run Perl scripts. A reboot may be required.\n\n"
|
||||||
"http://zoitechat.zoite.net/downloads.html\n\n"
|
"http://zoitechat.org/downloads.html\n\n"
|
||||||
"I have found Perl 5.6, but that is too old.");
|
"I have found Perl 5.6, but that is too old.");
|
||||||
} else {
|
} else {
|
||||||
thread_mbox ("Cannot open " PERL_DLL "!\n\n"
|
thread_mbox ("Cannot open " PERL_DLL "!\n\n"
|
||||||
"You must have a Visual C++ build of Perl "
|
"You must have a Visual C++ build of Perl "
|
||||||
PERL_REQUIRED_VERSION " installed in order to\n"
|
PERL_REQUIRED_VERSION " installed in order to\n"
|
||||||
"run Perl scripts. A reboot may be required.\n\n"
|
"run Perl scripts. A reboot may be required.\n\n"
|
||||||
"http://zoitechat.zoite.net/downloads.html\n\n"
|
"http://zoitechat.org/downloads.html\n\n"
|
||||||
"Make sure Perl's bin directory is in your PATH.");
|
"Make sure Perl's bin directory is in your PATH.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ else:
|
|||||||
if not hasattr(sys, 'argv'):
|
if not hasattr(sys, 'argv'):
|
||||||
sys.argv = ['<zoitechat>']
|
sys.argv = ['<zoitechat>']
|
||||||
|
|
||||||
VERSION = b'2.18.0~pre5'
|
VERSION = b'2.18.0~pre6'
|
||||||
PLUGIN_NAME = ffi.new('char[]', b'Python')
|
PLUGIN_NAME = ffi.new('char[]', b'Python')
|
||||||
PLUGIN_DESC = ffi.new('char[]', b'Python %d.%d scripting interface' % (sys.version_info[0], sys.version_info[1]))
|
PLUGIN_DESC = ffi.new('char[]', b'Python %d.%d scripting interface' % (sys.version_info[0], sys.version_info[1]))
|
||||||
PLUGIN_VERSION = ffi.new('char[]', VERSION)
|
PLUGIN_VERSION = ffi.new('char[]', VERSION)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "zoitechat-plugin.h"
|
#include "zoitechat-plugin.h"
|
||||||
|
|
||||||
#define APPCAST_URL "https://zoitechat.zoite.net/appcast.xml"
|
#define APPCAST_URL "https://zoitechat.org/appcast.xml"
|
||||||
|
|
||||||
static zoitechat_plugin *ph;
|
static zoitechat_plugin *ph;
|
||||||
static char name[] = "Update Checker";
|
static char name[] = "Update Checker";
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
[![Version][github-version-img]][github-version-uri] [![Downloads][github-downloads-img]][github-downloads-uri] [![Size][github-size-img]][github-size-img] [![Last Commit][github-commit-img]][github-commit-img] [![Contributors][contribs-all-img]](#contributors-)
|
[![Version][github-version-img]][github-version-uri] [![Downloads][github-downloads-img]][github-downloads-uri] [![Size][github-size-img]][github-size-img] [![Last Commit][github-commit-img]][github-commit-img] [![Contributors][contribs-all-img]](#contributors-)
|
||||||
|
|
||||||
[](https://docs.zoitechat.zoite.net)
|
[](https://docs.zoitechat.org)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -33,8 +33,8 @@
|
|||||||
|
|
||||||
ZoiteChat is an HexChat based IRC client for Windows and UNIX-like operating systems.
|
ZoiteChat is an HexChat based IRC client for Windows and UNIX-like operating systems.
|
||||||
See [IRCHelp.org](http://irchelp.org) for information about IRC in general.
|
See [IRCHelp.org](http://irchelp.org) for information about IRC in general.
|
||||||
For more information on ZoiteChat please read our [documentation](https://docs.zoitechat.zoite.net/):
|
For more information on ZoiteChat please read our [documentation](https://docs.zoitechat.org/):
|
||||||
- [Downloads](https://zoitechat.zoite.net/download)
|
- [Downloads](https://zoitechat.org/download)
|
||||||
|
|
||||||
- [Troubleshooting](troubleshooting.md)
|
- [Troubleshooting](troubleshooting.md)
|
||||||
|
|
||||||
|
|||||||
@@ -445,6 +445,7 @@ const struct prefs vars[] =
|
|||||||
{"gui_dark_mode", P_OFFINT (hex_gui_dark_mode), TYPE_INT},
|
{"gui_dark_mode", P_OFFINT (hex_gui_dark_mode), TYPE_INT},
|
||||||
{"gui_gtk3_variant", P_OFFINT (hex_gui_gtk3_variant), TYPE_INT},
|
{"gui_gtk3_variant", P_OFFINT (hex_gui_gtk3_variant), TYPE_INT},
|
||||||
{"gui_tab_layout", P_OFFINT (hex_gui_tab_layout), TYPE_INT},
|
{"gui_tab_layout", P_OFFINT (hex_gui_tab_layout), TYPE_INT},
|
||||||
|
{"gui_tab_closebuttons", P_OFFINT (hex_gui_tab_closebuttons), TYPE_BOOL},
|
||||||
{"gui_tab_middleclose", P_OFFINT (hex_gui_tab_middleclose), TYPE_BOOL},
|
{"gui_tab_middleclose", P_OFFINT (hex_gui_tab_middleclose), TYPE_BOOL},
|
||||||
{"gui_tab_newtofront", P_OFFINT (hex_gui_tab_newtofront), TYPE_INT},
|
{"gui_tab_newtofront", P_OFFINT (hex_gui_tab_newtofront), TYPE_INT},
|
||||||
{"gui_tab_pos", P_OFFINT (hex_gui_tab_pos), TYPE_INT},
|
{"gui_tab_pos", P_OFFINT (hex_gui_tab_pos), TYPE_INT},
|
||||||
@@ -777,6 +778,7 @@ load_default_config(void)
|
|||||||
prefs.hex_gui_tab_chans = 1;
|
prefs.hex_gui_tab_chans = 1;
|
||||||
prefs.hex_gui_tab_dialogs = 1;
|
prefs.hex_gui_tab_dialogs = 1;
|
||||||
prefs.hex_gui_tab_icons = 1;
|
prefs.hex_gui_tab_icons = 1;
|
||||||
|
prefs.hex_gui_tab_closebuttons = 1;
|
||||||
prefs.hex_gui_tab_middleclose = 1;
|
prefs.hex_gui_tab_middleclose = 1;
|
||||||
prefs.hex_gui_tab_server = 1;
|
prefs.hex_gui_tab_server = 1;
|
||||||
prefs.hex_gui_tab_sort = 1;
|
prefs.hex_gui_tab_sort = 1;
|
||||||
|
|||||||
@@ -4070,7 +4070,7 @@ const struct commands xc_cmds[] = {
|
|||||||
{"ME", cmd_me, 0, 0, 1,
|
{"ME", cmd_me, 0, 0, 1,
|
||||||
N_("ME <action>, sends the action to the current channel (actions are written in the 3rd person, like /me jumps)")},
|
N_("ME <action>, sends the action to the current channel (actions are written in the 3rd person, like /me jumps)")},
|
||||||
{"MENU", cmd_menu, 0, 0, 1, "MENU [-eX] [-i<ICONFILE>] [-k<mod>,<key>] [-m] [-pX] [-r<X,group>] [-tX] {ADD|DEL} <path> [command] [unselect command]\n"
|
{"MENU", cmd_menu, 0, 0, 1, "MENU [-eX] [-i<ICONFILE>] [-k<mod>,<key>] [-m] [-pX] [-r<X,group>] [-tX] {ADD|DEL} <path> [command] [unselect command]\n"
|
||||||
" See https://docs.zoitechat.zoite.net/en/latest/en/latest/plugins.html#controlling-the-gui for more details."},
|
" See https://docs.zoitechat.org/en/latest/en/latest/plugins.html#controlling-the-gui for more details."},
|
||||||
{"MHOP", cmd_mhop, 1, 1, 1,
|
{"MHOP", cmd_mhop, 1, 1, 1,
|
||||||
N_("MHOP, Mass hop's all users in the current channel (needs chanop)")},
|
N_("MHOP, Mass hop's all users in the current channel (needs chanop)")},
|
||||||
{"MKICK", cmd_mkick, 1, 1, 1,
|
{"MKICK", cmd_mkick, 1, 1, 1,
|
||||||
|
|||||||
@@ -265,6 +265,7 @@ struct zoitechatprefs
|
|||||||
int hex_gui_search_pos;
|
int hex_gui_search_pos;
|
||||||
int hex_gui_slist_select;
|
int hex_gui_slist_select;
|
||||||
int hex_gui_tab_layout;
|
int hex_gui_tab_layout;
|
||||||
|
int hex_gui_tab_closebuttons;
|
||||||
int hex_gui_tab_middleclose;
|
int hex_gui_tab_middleclose;
|
||||||
int hex_gui_tab_newtofront;
|
int hex_gui_tab_newtofront;
|
||||||
int hex_gui_tab_pos;
|
int hex_gui_tab_pos;
|
||||||
|
|||||||
@@ -653,7 +653,7 @@ tab_click_cb (GtkWidget *wid, GdkEventButton *event, chan *ch)
|
|||||||
if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
|
if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
|
||||||
{
|
{
|
||||||
close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button");
|
close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button");
|
||||||
if (close_button &&
|
if (prefs.hex_gui_tab_closebuttons && close_button &&
|
||||||
gtk_widget_translate_coordinates (close_button, wid, 0, 0, &close_x, &close_y))
|
gtk_widget_translate_coordinates (close_button, wid, 0, 0, &close_x, &close_y))
|
||||||
{
|
{
|
||||||
gtk_widget_get_allocation (close_button, &close_alloc);
|
gtk_widget_get_allocation (close_button, &close_alloc);
|
||||||
@@ -679,7 +679,7 @@ tab_close_motion_cb (GtkWidget *wid, GdkEventMotion *event, chan *ch)
|
|||||||
gboolean hover = FALSE;
|
gboolean hover = FALSE;
|
||||||
|
|
||||||
close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button");
|
close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button");
|
||||||
if (close_button &&
|
if (prefs.hex_gui_tab_closebuttons && close_button &&
|
||||||
gtk_widget_translate_coordinates (close_button, wid, 0, 0, &close_x, &close_y))
|
gtk_widget_translate_coordinates (close_button, wid, 0, 0, &close_x, &close_y))
|
||||||
{
|
{
|
||||||
gtk_widget_get_allocation (close_button, &close_alloc);
|
gtk_widget_get_allocation (close_button, &close_alloc);
|
||||||
@@ -714,7 +714,7 @@ tab_close_leave_cb (GtkWidget *wid, GdkEventCrossing *event, chan *ch)
|
|||||||
GtkWidget *close_button;
|
GtkWidget *close_button;
|
||||||
|
|
||||||
close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button");
|
close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button");
|
||||||
if (close_button)
|
if (prefs.hex_gui_tab_closebuttons && close_button)
|
||||||
gtk_widget_unset_state_flags (close_button, GTK_STATE_FLAG_PRELIGHT);
|
gtk_widget_unset_state_flags (close_button, GTK_STATE_FLAG_PRELIGHT);
|
||||||
if (gtk_widget_get_window (wid))
|
if (gtk_widget_get_window (wid))
|
||||||
gdk_window_set_cursor (gtk_widget_get_window (wid), NULL);
|
gdk_window_set_cursor (gtk_widget_get_window (wid), NULL);
|
||||||
@@ -780,6 +780,8 @@ cv_tabs_add (chanview *cv, chan *ch, char *name, GtkTreeIter *parent)
|
|||||||
G_CALLBACK (tab_toggled_cb), ch);
|
G_CALLBACK (tab_toggled_cb), ch);
|
||||||
g_object_set_data (G_OBJECT (but), "u", ch->userdata);
|
g_object_set_data (G_OBJECT (but), "u", ch->userdata);
|
||||||
gtk_widget_show_all (hbox);
|
gtk_widget_show_all (hbox);
|
||||||
|
if (!prefs.hex_gui_tab_closebuttons)
|
||||||
|
gtk_widget_hide (close_button);
|
||||||
|
|
||||||
tab_add_real (cv, but, ch);
|
tab_add_real (cv, but, ch);
|
||||||
|
|
||||||
|
|||||||
@@ -1717,7 +1717,7 @@ menu_ctcpguiopen (void)
|
|||||||
static void
|
static void
|
||||||
menu_docs (GtkWidget *wid, gpointer none)
|
menu_docs (GtkWidget *wid, gpointer none)
|
||||||
{
|
{
|
||||||
fe_open_url ("https://docs.zoitechat.zoite.net/en/latest/");
|
fe_open_url ("https://docs.zoitechat.org/en/latest/");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*static void
|
/*static void
|
||||||
@@ -1862,7 +1862,7 @@ about_dialog_response (GtkDialog *dialog, int response, gpointer data)
|
|||||||
{
|
{
|
||||||
if (response == GTK_RESPONSE_HELP)
|
if (response == GTK_RESPONSE_HELP)
|
||||||
{
|
{
|
||||||
fe_open_url ("http://zoitechat.zoite.net");
|
fe_open_url ("http://zoitechat.org");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (response == GTK_RESPONSE_APPLY)
|
if (response == GTK_RESPONSE_APPLY)
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ static GtkWidget *edit_label_real;
|
|||||||
static GtkWidget *edit_label_user;
|
static GtkWidget *edit_label_user;
|
||||||
static GtkWidget *edit_trees[N_TREES];
|
static GtkWidget *edit_trees[N_TREES];
|
||||||
static GtkWidget *edit_button_cert_generate;
|
static GtkWidget *edit_button_cert_generate;
|
||||||
|
static GtkWidget *edit_button_cert_import;
|
||||||
static GtkWidget *edit_button_cert_info;
|
static GtkWidget *edit_button_cert_info;
|
||||||
static GtkWidget *edit_button_cert_delete;
|
static GtkWidget *edit_button_cert_delete;
|
||||||
|
|
||||||
@@ -135,12 +136,98 @@ servlist_update_cert_buttons (ircnet *net)
|
|||||||
|
|
||||||
if (edit_button_cert_generate)
|
if (edit_button_cert_generate)
|
||||||
gtk_widget_set_visible (edit_button_cert_generate, !has_cert);
|
gtk_widget_set_visible (edit_button_cert_generate, !has_cert);
|
||||||
|
if (edit_button_cert_import)
|
||||||
|
gtk_widget_set_visible (edit_button_cert_import, !has_cert);
|
||||||
if (edit_button_cert_info)
|
if (edit_button_cert_info)
|
||||||
gtk_widget_set_visible (edit_button_cert_info, has_cert);
|
gtk_widget_set_visible (edit_button_cert_info, has_cert);
|
||||||
if (edit_button_cert_delete)
|
if (edit_button_cert_delete)
|
||||||
gtk_widget_set_visible (edit_button_cert_delete, has_cert);
|
gtk_widget_set_visible (edit_button_cert_delete, has_cert);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
servlist_import_client_cert_cb (GtkWidget *button, gpointer userdata)
|
||||||
|
{
|
||||||
|
ircnet *net = (ircnet *)userdata;
|
||||||
|
GtkWidget *dialog;
|
||||||
|
GtkWidget *message;
|
||||||
|
GtkFileFilter *filter;
|
||||||
|
char *cert_dir;
|
||||||
|
char *cert_file;
|
||||||
|
char *source_file;
|
||||||
|
char *contents;
|
||||||
|
gsize length;
|
||||||
|
|
||||||
|
if (!net || !net->name || !net->name[0])
|
||||||
|
return;
|
||||||
|
|
||||||
|
dialog = gtk_file_chooser_dialog_new (_("Import Client Certificate"),
|
||||||
|
GTK_WINDOW (edit_win),
|
||||||
|
GTK_FILE_CHOOSER_ACTION_OPEN,
|
||||||
|
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
||||||
|
_("_Open"), GTK_RESPONSE_ACCEPT,
|
||||||
|
NULL);
|
||||||
|
filter = gtk_file_filter_new ();
|
||||||
|
gtk_file_filter_set_name (filter, _("Certificate files"));
|
||||||
|
gtk_file_filter_add_pattern (filter, "*.pem");
|
||||||
|
gtk_file_filter_add_pattern (filter, "*.crt");
|
||||||
|
gtk_file_filter_add_pattern (filter, "*.cer");
|
||||||
|
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
|
||||||
|
filter = gtk_file_filter_new ();
|
||||||
|
gtk_file_filter_set_name (filter, _("All files"));
|
||||||
|
gtk_file_filter_add_pattern (filter, "*");
|
||||||
|
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
|
||||||
|
theme_manager_attach_window (dialog);
|
||||||
|
|
||||||
|
if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_ACCEPT)
|
||||||
|
{
|
||||||
|
gtk_widget_destroy (dialog);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
source_file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
|
||||||
|
gtk_widget_destroy (dialog);
|
||||||
|
if (!source_file)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cert_dir = g_build_filename (get_xdir (), "certs", NULL);
|
||||||
|
cert_file = servlist_get_cert_file (net);
|
||||||
|
contents = NULL;
|
||||||
|
length = 0;
|
||||||
|
|
||||||
|
if (cert_file &&
|
||||||
|
g_mkdir_with_parents (cert_dir, 0700) == 0 &&
|
||||||
|
g_file_get_contents (source_file, &contents, &length, NULL) &&
|
||||||
|
g_file_set_contents (cert_file, contents, length, NULL))
|
||||||
|
{
|
||||||
|
chmod (cert_file, 0600);
|
||||||
|
servlist_update_cert_buttons (net);
|
||||||
|
message = gtk_message_dialog_new (GTK_WINDOW (edit_win),
|
||||||
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
||||||
|
GTK_MESSAGE_INFO,
|
||||||
|
GTK_BUTTONS_CLOSE,
|
||||||
|
_("Client certificate imported for \"%s\"."),
|
||||||
|
net->name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message = gtk_message_dialog_new (GTK_WINDOW (edit_win),
|
||||||
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
||||||
|
GTK_MESSAGE_ERROR,
|
||||||
|
GTK_BUTTONS_CLOSE,
|
||||||
|
_("Failed to import client certificate for \"%s\"."),
|
||||||
|
net->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
theme_manager_attach_window (message);
|
||||||
|
g_signal_connect_swapped (message, "response", G_CALLBACK (gtk_widget_destroy), message);
|
||||||
|
gtk_widget_show (message);
|
||||||
|
|
||||||
|
g_free (contents);
|
||||||
|
g_free (cert_file);
|
||||||
|
g_free (cert_dir);
|
||||||
|
g_free (source_file);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
||||||
{
|
{
|
||||||
@@ -165,6 +252,7 @@ servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
|||||||
gboolean success;
|
gboolean success;
|
||||||
gint status;
|
gint status;
|
||||||
char *argv[20];
|
char *argv[20];
|
||||||
|
char **envp;
|
||||||
|
|
||||||
if (!net || !net->name || !net->name[0])
|
if (!net || !net->name || !net->name[0])
|
||||||
return;
|
return;
|
||||||
@@ -187,6 +275,7 @@ servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
|||||||
crt_len = 0;
|
crt_len = 0;
|
||||||
success = FALSE;
|
success = FALSE;
|
||||||
status = 0;
|
status = 0;
|
||||||
|
envp = g_environ_unsetenv (g_get_environ (), "LD_LIBRARY_PATH");
|
||||||
|
|
||||||
if (g_mkdir_with_parents (cert_dir, 0700) == 0 &&
|
if (g_mkdir_with_parents (cert_dir, 0700) == 0 &&
|
||||||
g_file_set_contents (openssl_conf, conf_data, -1, NULL))
|
g_file_set_contents (openssl_conf, conf_data, -1, NULL))
|
||||||
@@ -212,7 +301,7 @@ servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
|||||||
argv[18] = subject;
|
argv[18] = subject;
|
||||||
argv[19] = NULL;
|
argv[19] = NULL;
|
||||||
|
|
||||||
spawned = g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
|
spawned = g_spawn_sync (NULL, argv, envp, G_SPAWN_SEARCH_PATH, NULL, NULL,
|
||||||
&stdout_data, &stderr_data, &status, NULL);
|
&stdout_data, &stderr_data, &status, NULL);
|
||||||
if (spawned && g_spawn_check_exit_status (status, NULL) &&
|
if (spawned && g_spawn_check_exit_status (status, NULL) &&
|
||||||
g_file_get_contents (key_file, &key_data, &key_len, NULL) &&
|
g_file_get_contents (key_file, &key_data, &key_len, NULL) &&
|
||||||
@@ -267,6 +356,7 @@ servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
|||||||
g_free (openssl_conf);
|
g_free (openssl_conf);
|
||||||
g_free (cert_file);
|
g_free (cert_file);
|
||||||
g_free (cert_dir);
|
g_free (cert_dir);
|
||||||
|
g_strfreev (envp);
|
||||||
#else
|
#else
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
@@ -284,6 +374,7 @@ servlist_cert_info_cb (GtkWidget *button, gpointer userdata)
|
|||||||
gboolean spawned;
|
gboolean spawned;
|
||||||
gint status;
|
gint status;
|
||||||
char *argv[12];
|
char *argv[12];
|
||||||
|
char **envp;
|
||||||
|
|
||||||
cert_file = servlist_get_cert_file (net);
|
cert_file = servlist_get_cert_file (net);
|
||||||
if (!cert_file)
|
if (!cert_file)
|
||||||
@@ -292,6 +383,7 @@ servlist_cert_info_cb (GtkWidget *button, gpointer userdata)
|
|||||||
stdout_data = NULL;
|
stdout_data = NULL;
|
||||||
stderr_data = NULL;
|
stderr_data = NULL;
|
||||||
status = 0;
|
status = 0;
|
||||||
|
envp = g_environ_unsetenv (g_get_environ (), "LD_LIBRARY_PATH");
|
||||||
argv[0] = "openssl";
|
argv[0] = "openssl";
|
||||||
argv[1] = "x509";
|
argv[1] = "x509";
|
||||||
argv[2] = "-in";
|
argv[2] = "-in";
|
||||||
@@ -305,7 +397,7 @@ servlist_cert_info_cb (GtkWidget *button, gpointer userdata)
|
|||||||
argv[10] = "-sha256";
|
argv[10] = "-sha256";
|
||||||
argv[11] = NULL;
|
argv[11] = NULL;
|
||||||
|
|
||||||
spawned = g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
|
spawned = g_spawn_sync (NULL, argv, envp, G_SPAWN_SEARCH_PATH, NULL, NULL,
|
||||||
&stdout_data, &stderr_data, &status, NULL);
|
&stdout_data, &stderr_data, &status, NULL);
|
||||||
|
|
||||||
if (spawned && g_spawn_check_exit_status (status, NULL) && stdout_data && stdout_data[0])
|
if (spawned && g_spawn_check_exit_status (status, NULL) && stdout_data && stdout_data[0])
|
||||||
@@ -336,6 +428,7 @@ servlist_cert_info_cb (GtkWidget *button, gpointer userdata)
|
|||||||
g_free (stdout_data);
|
g_free (stdout_data);
|
||||||
g_free (stderr_data);
|
g_free (stderr_data);
|
||||||
g_free (cert_file);
|
g_free (cert_file);
|
||||||
|
g_strfreev (envp);
|
||||||
#else
|
#else
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
@@ -2285,6 +2378,11 @@ servlist_open_edit (GtkWidget *parent, ircnet *net)
|
|||||||
G_CALLBACK (servlist_generate_client_cert_cb), net);
|
G_CALLBACK (servlist_generate_client_cert_cb), net);
|
||||||
gtk_box_pack_start (GTK_BOX (hbox_cert_buttons), edit_button_cert_generate, FALSE, FALSE, 0);
|
gtk_box_pack_start (GTK_BOX (hbox_cert_buttons), edit_button_cert_generate, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
edit_button_cert_import = gtk_button_new_with_mnemonic (_("Import client SSL cert"));
|
||||||
|
g_signal_connect (G_OBJECT (edit_button_cert_import), "clicked",
|
||||||
|
G_CALLBACK (servlist_import_client_cert_cb), net);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox_cert_buttons), edit_button_cert_import, FALSE, FALSE, 0);
|
||||||
|
|
||||||
edit_button_cert_info = gtk_button_new_with_mnemonic (_("Client SSL cert info"));
|
edit_button_cert_info = gtk_button_new_with_mnemonic (_("Client SSL cert info"));
|
||||||
g_signal_connect (G_OBJECT (edit_button_cert_info), "clicked",
|
g_signal_connect (G_OBJECT (edit_button_cert_info), "clicked",
|
||||||
G_CALLBACK (servlist_cert_info_cb), net);
|
G_CALLBACK (servlist_cert_info_cb), net);
|
||||||
|
|||||||
@@ -330,6 +330,7 @@ static const setting tabs_settings[] =
|
|||||||
{ST_TOGGLE, N_("Show icons in the channel tree"), P_OFFINTNL(hex_gui_tab_icons), 0, 0, 0},
|
{ST_TOGGLE, N_("Show icons in the channel tree"), P_OFFINTNL(hex_gui_tab_icons), 0, 0, 0},
|
||||||
{ST_TOGGLE, N_("Show dotted lines in the channel tree"), P_OFFINTNL(hex_gui_tab_dots), 0, 0, 0},
|
{ST_TOGGLE, N_("Show dotted lines in the channel tree"), P_OFFINTNL(hex_gui_tab_dots), 0, 0, 0},
|
||||||
{ST_TOGGLE, N_("Scroll mouse-wheel to change tabs"), P_OFFINTNL (hex_gui_tab_scrollchans), 0, 0, 0},
|
{ST_TOGGLE, N_("Scroll mouse-wheel to change tabs"), P_OFFINTNL (hex_gui_tab_scrollchans), 0, 0, 0},
|
||||||
|
{ST_TOGGLE, N_("Show close button on tabs"), P_OFFINTNL(hex_gui_tab_closebuttons), 0, 0, 0},
|
||||||
{ST_TOGGLE, N_("Middle click to close tab"), P_OFFINTNL(hex_gui_tab_middleclose), 0, 0, 0},
|
{ST_TOGGLE, N_("Middle click to close tab"), P_OFFINTNL(hex_gui_tab_middleclose), 0, 0, 0},
|
||||||
{ST_TOGGLE, N_("Smaller text"), P_OFFINTNL(hex_gui_tab_small), 0, 0, 0},
|
{ST_TOGGLE, N_("Smaller text"), P_OFFINTNL(hex_gui_tab_small), 0, 0, 0},
|
||||||
{ST_MENU, N_("Focus new tabs:"), P_OFFINTNL(hex_gui_tab_newtofront), 0, focusnewtabsmenu, 0},
|
{ST_MENU, N_("Focus new tabs:"), P_OFFINTNL(hex_gui_tab_newtofront), 0, focusnewtabsmenu, 0},
|
||||||
@@ -2186,6 +2187,8 @@ setup_apply (struct zoitechatprefs *pr)
|
|||||||
noapply = TRUE;
|
noapply = TRUE;
|
||||||
if (DIFF (hex_gui_tab_icons))
|
if (DIFF (hex_gui_tab_icons))
|
||||||
noapply = TRUE;
|
noapply = TRUE;
|
||||||
|
if (DIFF (hex_gui_tab_closebuttons))
|
||||||
|
noapply = TRUE;
|
||||||
if (DIFF (hex_gui_tab_server))
|
if (DIFF (hex_gui_tab_server))
|
||||||
noapply = TRUE;
|
noapply = TRUE;
|
||||||
if (DIFF (hex_gui_tab_small))
|
if (DIFF (hex_gui_tab_small))
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ AppName=ZoiteChat
|
|||||||
AppVersion={#APPVER}
|
AppVersion={#APPVER}
|
||||||
AppVerName=ZoiteChat {#APPVER}
|
AppVerName=ZoiteChat {#APPVER}
|
||||||
AppPublisher=ZoiteChat
|
AppPublisher=ZoiteChat
|
||||||
AppPublisherURL=http://zoitechat.zoite.net
|
AppPublisherURL=http://zoitechat.org
|
||||||
AppCopyright=Copyright (C) 1998-2010 Peter Zelezny
|
AppCopyright=Copyright (C) 1998-2010 Peter Zelezny
|
||||||
AppSupportURL=https://github.com/zoitechat/zoitechat/issues
|
AppSupportURL=https://github.com/zoitechat/zoitechat/issues
|
||||||
AppUpdatesURL=http://zoitechat.zoite.net/downloads.html
|
AppUpdatesURL=http://zoitechat.org/downloads.html
|
||||||
LicenseFile=share\doc\zoitechat\COPYING
|
LicenseFile=share\doc\zoitechat\COPYING
|
||||||
UninstallDisplayIcon={app}\zoitechat.exe
|
UninstallDisplayIcon={app}\zoitechat.exe
|
||||||
UninstallDisplayName=ZoiteChat
|
UninstallDisplayName=ZoiteChat
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2.18.0~pre5
|
2.18.0~pre6
|
||||||
|
|||||||
Reference in New Issue
Block a user