Compare commits

...

29 Commits

Author SHA1 Message Date
Sadie Powell 07873ca4e9 Migrate from gtk_widget_is_composited to gdk_screen_is_composited.
gtk_widget_is_composited is gone in GTK 3.
2023-01-28 11:30:07 -06:00
Sadie Powell bde8d9d20a Remove gtk_tree_view_set_rules_hint.
This function is deprecated and is ignored by GTK 3. It also does
not really do anything with most modern GTK2 themes either.
2023-01-28 11:30:07 -06:00
Sadie Powell c550dc9cb1 Migrate from gdk_drawable_get_size to gdk_window_get_{width,height}.
gdk_drawable_get_size is gone in GDK 3.
2023-01-28 11:30:07 -06:00
Sadie Powell df8f516a40 Migrate from gdk_beep to gdk_desktop_beep.
gdk_beep is gone in GDK 3.
2023-01-28 11:30:07 -06:00
konsolebox 67b25fddf1 Add option to exclude nickname in window title (#2759) 2023-01-24 17:03:53 -06:00
Sadie Powell bb7a03e9f6 Fix updating the topic (user@host) of dialogs on CHGHOST.
This is updated when a user receives a new message but would have
not been updated when a user sent a CHGHOST.
2022-11-05 12:42:51 -05:00
Sadie Powell 9d175cc459 Also request the extended-monitor capability.
This allows getting hostname/awaymsg/etc updates for monitored clients
which will update the internal cache for that data.
2022-11-05 12:42:51 -05:00
Patrick 4ad7afe884 ci: Add gtk-update-icon-cache to msys2 workflow 2022-10-29 15:57:29 -05:00
DjLegolas 221283ba19 add shortcut options in setup
will allow the user to control on which of the shortcuts to create:
* start menu - will now show the relevant window
* desktop
* quick launch

on uninstall, all will be removed on uninstall
2022-10-29 15:42:30 -05:00
Sadie Powell 8cf2aa5586 Make it more clear that /SERVER and /SERVCHAN use SSL by default. 2022-10-16 15:35:43 -05:00
Sadie Powell 8fb0d2311f Default /SERVER and friends to use SSL when built with OpenSSL.
Since commit 747a52aae8 users have to
opt-out of using SSL when creating a new server. This commit makes
it so /SERVER also uses SSL by default.

In order to connect insecurely users must now use one of these
methods:

    /SERVER -insecure irc.example.com
    /SERVER irc.example.com -6667

The `-ssl` flag and the `+port` syntax have been retained for compat
reasons.
2022-10-16 15:35:43 -05:00
Sadie Powell 2dbc6adbc2 Fix PROTOCTL NAMESX and only send when not using multi-prefix.
This capability is the equivalent of the old protoctl token.
2022-09-22 12:07:07 -05:00
Andreas Schärtl bd4290a1a9 Support whitespace between language codes
So far, when configuring multiple spell check languages, Hexchat
requires the user to separate multiple entries with commas and
only commas. This patch allows users to also enter whitespace, e.g.

  de_DE, en_US

as is common in many applications.
2022-09-20 18:08:37 -05:00
Sadie Powell 46c9df1863 Fix various compiler warnings.
fish.c: -Wincompatible-pointer-types
fkeys.c: -Wmisleading-indentation
proto-irc.c: -Wincompatible-pointer-types
util.c: -Wdeprecated-declarations
xtext.c: -Wmaybe-uninitialized
2022-08-29 13:50:03 -05:00
Adrian 20c50fd7ef notification_plugin_deinit: Set function signature to int(void *)
Previously the function signature was inconsistent throughout
src/fe-gtk/plugin-notification.{h,c}: One file had the signature
int(void), while the other had int(void *). Since this type mismatch
might lead to problems (especially with LTO) and the (possibly provided)
function argument isn't used in the function's definition, this commit
sets int(void *) as function signature for both the declaration and
definition of the function.

Fixes: https://github.com/hexchat/hexchat/issues/2726
2022-08-26 12:40:15 -05:00
Patrick d7c6c424e8 servlist: Remove ACN
They are no longer supporting TLS and let their cert expire.

Non-TLS networks do not belong in our default list.

Closes #2722
2022-08-01 14:07:31 -05:00
Patrick Griffis ec9653e754 servlist: Remove IRCHighWay
They have self-signed certs which doesn't belong in our default list.
2022-07-15 13:17:25 -05:00
DjLegolas dfda8f2eee fix sysinfo print of cpu name
the cpu name might have tailing spaces in Windows, which weren't remove before printing.
2022-05-14 12:42:46 -05:00
Artem Zhurikhin b8645bfbf2 Split long SASL auth strings into 400-byte chunks (#2709)
Fixes #2705
2022-05-13 15:56:26 -05:00
Ashpool 778047bc65 raise the max length of a server password to 1024
- alleviate #1296
2022-05-10 12:31:12 -05:00
DjLegolas 2638c88479 update python3 from 3.6 to 3.8.10
Signed-off-by: DjLegolas <djlegolas@protonmail.com>
2022-05-08 14:20:58 -05:00
DjLegolas 6da8f97e37 fix addons load in python2 2022-05-07 11:34:47 -05:00
Patrick Griffis 2dd7636134 appdata: Update appstream usage for desktop applications 2022-04-30 16:47:04 -05:00
Patrick Griffis 13b6a40b9c Change preferences sub-dialogs to be modal
This solves the issue where the parent dialog is closed and then
the child dialog is used.

This is however only a partial fix:

- Many other dialogs throughout the codebase do not currently have
  parent windows and need to be refactored.

- Not all window managers respect modal so users can still trigger
  bugs. We can be more defensive against this but it requires more
  refactoring.

Closes #2686
2022-04-16 18:41:34 -05:00
Patrick dd167b4c83 python: Fix API break in hook_timer()
Closes #2691
2022-04-15 13:43:22 -05:00
Sadie Powell 133f628064 Display common help numerics as SERVTEXT.
This makes it a lot easier for users to actually read.
2022-04-02 12:17:54 -05:00
Patrick d99a98ff4c notification: Don't print failure to load backend in UI
This isn't actually helpful information to users generally

Closes #2152
Closes #2684
2022-03-26 11:18:00 -05:00
Masoud Naservand 94efa378f7 Reverse the notify.conf linked list before writing
hexchat populates the single linked list `notify_list` defined in
`src/common/notify.c` from `notify.conf` file. Each new line read from
the file is added to the list by `g_slist_prepend()` which adds it to
the front of the list. But in `notify_save()` the list elements are read
from the start to end of the list and written to the `notify.conf`. This
means everytime hexchat is opened and closed, the contents of
`notify.conf` get reversed. This commit creates a
temporary glist in `notify_save()` and applies `g_slist_reverse()` on it
and writes the contents of this reversed list to `notify.conf`. And
solves issue #2680
2022-02-17 10:24:59 -06:00
William D. Jones ccf6f431bb Return userdata from pluginprefs __pairs metamethod to avoid immediate GC. 2022-02-16 12:44:09 -06:00
38 changed files with 188 additions and 109 deletions
+1
View File
@@ -19,6 +19,7 @@ jobs:
mingw-w64-x86_64-python3-cffi
mingw-w64-x86_64-meson
mingw-w64-x86_64-gtk2
mingw-w64-x86_64-gtk-update-icon-cache
mingw-w64-x86_64-luajit
mingw-w64-x86_64-desktop-file-utils
+3 -3
View File
@@ -41,11 +41,11 @@ jobs:
& 7z.exe x deps\perl-${{ matrix.arch }}.7z -oC:\gtk-build\perl-5.20\${{ matrix.platform }}
New-Item -Path "c:\gtk-build" -Name "python-2.7" -ItemType "Directory"
New-Item -Path "c:\gtk-build" -Name "python-3.6" -ItemType "Directory"
New-Item -Path "c:\gtk-build" -Name "python-3.8" -ItemType "Directory"
New-Item -Path "c:\gtk-build\python-2.7" -Name "${{ matrix.platform }}" -ItemType "SymbolicLink" -Value "C:/hostedtoolcache/windows/Python/2.7.18/${{ matrix.arch }}"
New-Item -Path "c:\gtk-build\python-3.6" -Name "${{ matrix.platform }}" -ItemType "SymbolicLink" -Value "C:/hostedtoolcache/windows/Python/3.6.8/${{ matrix.arch }}"
New-Item -Path "c:\gtk-build\python-3.8" -Name "${{ matrix.platform }}" -ItemType "SymbolicLink" -Value "C:/hostedtoolcache/windows/Python/3.8.10/${{ matrix.arch }}"
C:/hostedtoolcache/windows/Python/3.6.8/${{ matrix.arch }}/python.exe -m pip install cffi
C:/hostedtoolcache/windows/Python/3.8.10/${{ matrix.arch }}/python.exe -m pip install cffi
C:/hostedtoolcache/windows/Python/2.7.18/${{ matrix.arch }}/python.exe -m pip install -qq cffi
shell: powershell
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="addon">
<id>io.github.Hexchat.Plugin.@NAME@</id>
<extends>io.github.Hexchat.desktop</extends>
<extends>io.github.Hexchat</extends>
<name>@NAME@ Plugin</name>
<summary>@SUMMARY@</summary>
<url type="homepage">https://hexchat.github.io/</url>
+3 -2
View File
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop">
<id>io.github.Hexchat.desktop</id>
<component type="desktop-application">
<id>io.github.Hexchat</id>
<name>HexChat</name>
<launchable type="desktop-id">io.github.Hexchat.desktop</launchable>
<developer_name>HexChat</developer_name>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-2.0+</project_license>
+1 -1
View File
@@ -91,7 +91,7 @@ static const signed char fish_unbase64[256] = {
#include <openssl/provider.h>
static OSSL_PROVIDER *legacy_provider;
static OSSL_PROVIDER *default_provider;
static OSSL_LIB_CTX* *ossl_ctx;
static OSSL_LIB_CTX *ossl_ctx;
#endif
int fish_init(void)
+6 -2
View File
@@ -957,16 +957,21 @@ static int api_hexchat_pluginprefs_meta_pairs(lua_State *L)
hexchat_plugin *h;
if(!script->name)
return luaL_error(L, "cannot use hexchat.pluginprefs before registering with hexchat.register");
dest = lua_newuserdata(L, 4096);
h = script->handle;
if(!hexchat_pluginpref_list(h, dest))
strcpy(dest, "");
lua_pushlightuserdata(L, dest);
lua_pushlightuserdata(L, dest);
lua_pushcclosure(L, api_hexchat_pluginprefs_meta_pairs_closure, 2);
return 1;
lua_insert(L, -2); // Return the userdata (second return value from pairs),
// even though it's not used by the closure (first return
// value from pairs), so that Lua knows not to GC it.
return 2;
}
static int api_attrs_meta_index(lua_State *L)
@@ -1764,4 +1769,3 @@ G_MODULE_EXPORT int hexchat_plugin_deinit(hexchat_plugin *plugin_handle)
g_clear_pointer(&expand_buffer, g_free);
return 1;
}
+3 -3
View File
@@ -146,8 +146,8 @@ class Plugin:
def loadfile(self, filename):
try:
self.filename = filename
with open(filename, encoding='utf-8') as f:
data = f.read()
with open(filename, 'rb') as f:
data = f.read().decode('utf-8')
compiled = compile_file(data, filename)
exec(compiled, self.globals)
@@ -284,7 +284,7 @@ def _on_server_attrs_hook(word, word_eol, attrs, userdata):
@ffi.def_extern()
def _on_timer_hook(userdata):
hook = ffi.from_handle(userdata)
if hook.callback(hook.userdata) is True:
if hook.callback(hook.userdata) == True:
return 1
hook.is_unload = True # Don't unhook
+2
View File
@@ -468,6 +468,7 @@ const struct prefs vars[] =
{"gui_win_fullscreen", P_OFFINT (hex_gui_win_fullscreen), TYPE_INT},
{"gui_win_left", P_OFFINT (hex_gui_win_left), TYPE_INT},
{"gui_win_modes", P_OFFINT (hex_gui_win_modes), TYPE_BOOL},
{"gui_win_nick", P_OFFINT (hex_gui_win_nick), TYPE_BOOL},
{"gui_win_save", P_OFFINT (hex_gui_win_save), TYPE_BOOL},
{"gui_win_state", P_OFFINT (hex_gui_win_state), TYPE_INT},
{"gui_win_swap", P_OFFINT (hex_gui_win_swap), TYPE_BOOL},
@@ -772,6 +773,7 @@ load_default_config(void)
prefs.hex_gui_ulist_count = 1;
prefs.hex_gui_ulist_icons = 1;
prefs.hex_gui_ulist_style = 1;
prefs.hex_gui_win_nick = 1;
prefs.hex_gui_win_save = 1;
prefs.hex_input_filter_beep = 1;
prefs.hex_input_flash_hilight = 1;
+1
View File
@@ -141,6 +141,7 @@ void fe_get_int (char *prompt, int def, void *callback, void *ud);
#define FRF_NOASKOVERWRITE 32 /* don't ask to overwrite existing files */
#define FRF_EXTENSIONS 64 /* specify file extensions to be displayed */
#define FRF_MIMETYPES 128 /* specify file mimetypes to be displayed */
#define FRF_MODAL 256 /* dialog should be modal to parent */
void fe_get_file (const char *title, char *initial,
void (*callback) (void *userdata, char *file), void *userdata,
int flags);
+2 -1
View File
@@ -150,6 +150,7 @@ struct hexchatprefs
unsigned int hex_gui_ulist_style;
unsigned int hex_gui_usermenu;
unsigned int hex_gui_win_modes;
unsigned int hex_gui_win_nick;
unsigned int hex_gui_win_save;
unsigned int hex_gui_win_swap;
unsigned int hex_gui_win_ucount;
@@ -501,7 +502,7 @@ typedef struct server
int joindelay_tag; /* waiting before we send JOIN */
char hostname[128]; /* real ip number */
char servername[128]; /* what the server says is its name */
char password[86];
char password[1024];
char nick[NICKLEN];
char linebuf[8704]; /* RFC says 512 chars including \r\n, IRCv3 message tags add 8191, plus the NUL byte */
char *last_away_reason;
+27 -2
View File
@@ -1474,10 +1474,17 @@ inbound_user_info (session *sess, char *chan, char *user, char *host,
for (list = sess_list; list; list = list->next)
{
sess = list->data;
if (sess->type == SESS_CHANNEL && sess->server == serv)
if (sess->server != serv)
continue;
if (sess->type == SESS_CHANNEL)
{
userlist_add_hostname (sess, nick, uhost, realname, servname, account, away);
}
else if (sess->type == SESS_DIALOG && uhost && !serv->p_cmp (sess->channel, nick))
{
set_topic (sess, uhost, uhost);
}
}
}
@@ -1728,6 +1735,7 @@ static const char * const supported_caps[] = {
"setname",
"invite-notify",
"account-tag",
"extended-monitor",
/* ZNC */
"znc.in/server-time-iso",
@@ -1929,7 +1937,24 @@ inbound_sasl_authenticate (server *serv, char *data)
return;
}
tcp_sendf (serv, "AUTHENTICATE %s\r\n", pass);
/* long SASL passwords must be split into 400-byte chunks
https://ircv3.net/specs/extensions/sasl-3.1#the-authenticate-command */
size_t pass_len = strlen (pass);
if (pass_len <= 400)
tcp_sendf (serv, "AUTHENTICATE %s\r\n", pass);
else
{
size_t sent = 0;
while (sent < pass_len)
{
char *pass_chunk = g_strndup (pass + sent, 400);
tcp_sendf (serv, "AUTHENTICATE %s\r\n", pass_chunk);
sent += 400;
g_free (pass_chunk);
}
}
if (pass_len % 400 == 0)
tcp_sendf (serv, "AUTHENTICATE +\r\n");
g_free (pass);
+6 -2
View File
@@ -918,8 +918,12 @@ inbound_005 (server * serv, char *word[], const message_tags_data *tags_data)
server_set_encoding (serv, "UTF-8");
} else if (g_strcmp0 (tokname, "NAMESX") == 0)
{
/* 12345678901234567 */
tcp_send_len (serv, "PROTOCTL NAMESX\r\n", 17);
if (tokadding && !serv->have_namesx)
{
/* only use protoctl if the server doesn't have the equivalent cap */
tcp_send_len (serv, "PROTOCTL NAMESX\r\n", 17);
serv->have_namesx = TRUE;
}
} else if (g_strcmp0 (tokname, "WHOX") == 0)
{
serv->have_whox = tokadding;
+6 -1
View File
@@ -123,7 +123,11 @@ notify_save (void)
{
int fh;
struct notify *notify;
GSList *list = notify_list;
// while reading the notify.conf file, elements are added by prepending to the
// list. reverse the list before writing to disk to keep the original
// order of the list
GSList *list = g_slist_copy(notify_list);
list = g_slist_reverse(list);
fh = hexchat_open_file ("notify.conf", O_TRUNC | O_WRONLY | O_CREAT, 0600, XOF_DOMODE);
if (fh != -1)
@@ -142,6 +146,7 @@ notify_save (void)
}
close (fh);
}
g_slist_free(list);
}
void
+24 -5
View File
@@ -3249,7 +3249,7 @@ cmd_reconnect (struct session *sess, char *tbuf, char *word[], char *word_eol[])
int offset = 0;
#ifdef USE_OPENSSL
int use_ssl = FALSE;
int use_ssl = TRUE;
int use_ssl_noverify = FALSE;
if (g_strcmp0 (word[2], "-ssl") == 0)
{
@@ -3261,6 +3261,11 @@ cmd_reconnect (struct session *sess, char *tbuf, char *word[], char *word_eol[])
use_ssl = TRUE;
use_ssl_noverify = TRUE;
offset++; /* args move up by 1 word */
} else if (g_strcmp0 (word[2], "-insecure") == 0)
{
use_ssl = FALSE;
use_ssl_noverify = FALSE;
offset++; /* args move up by 1 word */
}
serv->use_ssl = use_ssl;
serv->accept_invalid_cert = use_ssl_noverify;
@@ -3450,8 +3455,10 @@ cmd_server (struct session *sess, char *tbuf, char *word[], char *word_eol[])
char *pass = NULL;
char *channel = NULL;
char *key = NULL;
int use_ssl = FALSE;
#ifdef USE_OPENSSL
int use_ssl = TRUE;
int use_ssl_noverify = FALSE;
#endif
int is_url = TRUE;
server *serv = sess->server;
ircnet *net = NULL;
@@ -3469,6 +3476,11 @@ cmd_server (struct session *sess, char *tbuf, char *word[], char *word_eol[])
use_ssl_noverify = TRUE;
offset++; /* args move up by 1 word */
}
else if (g_strcmp0 (word[2], "-insecure") == 0)
{
use_ssl = FALSE;
offset++; /* args move up by 1 word */
}
#endif
if (!parse_irc_url (word[2 + offset], &server_name, &port, &channel, &key, &use_ssl))
@@ -3509,6 +3521,13 @@ cmd_server (struct session *sess, char *tbuf, char *word[], char *word_eol[])
use_ssl = TRUE;
#endif
}
else if (port[0] == '-')
{
port++;
#ifdef USE_OPENSSL
use_ssl = FALSE;
#endif
}
if (*pass)
{
@@ -3564,7 +3583,7 @@ cmd_servchan (struct session *sess, char *tbuf, char *word[],
int offset = 0;
#ifdef USE_OPENSSL
if (g_strcmp0 (word[2], "-ssl") == 0 || g_strcmp0 (word[2], "-ssl-noverify") == 0)
if (g_strcmp0 (word[2], "-ssl") == 0 || g_strcmp0 (word[2], "-ssl-noverify") == 0 || g_strcmp0 (word[2], "-insecure") == 0)
offset++;
#endif
@@ -4098,14 +4117,14 @@ const struct commands xc_cmds[] = {
{"SEND", cmd_send, 0, 0, 1, N_("SEND <nick> [<file>]")},
#ifdef USE_OPENSSL
{"SERVCHAN", cmd_servchan, 0, 0, 1,
N_("SERVCHAN [-ssl|-ssl-noverify] <host> <port> <channel>, connects and joins a channel")},
N_("SERVCHAN [-insecure|-ssl|-ssl-noverify] <host> <port> <channel>, connects and joins a channel using ssl unless otherwise specified")},
#else
{"SERVCHAN", cmd_servchan, 0, 0, 1,
N_("SERVCHAN <host> <port> <channel>, connects and joins a channel")},
#endif
#ifdef USE_OPENSSL
{"SERVER", cmd_server, 0, 0, 1,
N_("SERVER [-ssl|-ssl-noverify] <host> [<port>] [<password>], connects to a server, the default port is 6667 for normal connections, and 6697 for ssl connections")},
N_("SERVER [-insecure|-ssl|-ssl-noverify] <host> [<port>] [<password>], connects to a server using ssl unless otherwise specified, the default port is 6697 for ssl connections and 6667 for insecure connections")},
#else
{"SERVER", cmd_server, 0, 0, 1,
N_("SERVER <host> [<port>] [<password>], connects to a server, the default port is 6667")},
+9 -1
View File
@@ -461,7 +461,7 @@ channel_date (session *sess, char *chan, char *timestr,
}
static int
trailing_index(const char *word_eol[])
trailing_index(char *word_eol[])
{
int param_index;
for (param_index = 3; param_index < PDIWORDS; ++param_index)
@@ -920,6 +920,14 @@ process_numeric (session * sess, int n,
notify_set_online (serv, word[4], tags_data);
break;
case 524: // ERR_HELPNOTFOUND
case 704: // RPL_HELPSTART
case 705: // RPL_HELPTXT
case 706: // RPL_ENDOFHELP
EMIT_SIGNAL_TIMESTAMP (XP_TE_SERVTEXT, sess, STRIP_COLON(word, word_eol, 5), NULL, NULL, NULL,
0, tags_data->timestamp);
break;
case 728: /* +q-list entry */
/* NOTE: FREENODE returns these results inconsistent with e.g. +b */
/* Who else has imlemented MODE_QUIET, I wonder? */
-5
View File
@@ -54,8 +54,6 @@ static const struct defaultserver def[] =
/* Invalid hostname in cert */
{0, "irc.2600.net"},
{"ACN", 0, 0, 0, LOGIN_SASL, 0, TRUE},
{0, "global.acn.gr"},
{"AfterNET", 0, 0, 0, LOGIN_SASL, 0, TRUE},
{0, "irc.afternet.org"},
@@ -193,9 +191,6 @@ static const struct defaultserver def[] =
{"IRC4Fun", 0, 0, 0, LOGIN_SASL, 0, TRUE},
{0, "irc.irc4fun.net"},
{"IRCHighWay", 0, 0, 0, 0, 0, TRUE},
{0, "irc.irchighway.net"},
{"IRCNet", 0},
{0, "open.ircnet.net"},
+2
View File
@@ -356,6 +356,8 @@ static char *read_cpu_info (IWbemClassObject *object)
VariantClear (&max_clock_speed_variant);
g_strchomp (name_utf8);
if (cpu_freq_mhz > 1000)
{
result = g_strdup_printf ("%s (%.2fGHz)", name_utf8, cpu_freq_mhz / 1000.f);
+5
View File
@@ -1375,11 +1375,16 @@ str_sha256hash (char *string)
int i;
unsigned char hash[SHA256_DIGEST_LENGTH];
char buf[SHA256_DIGEST_LENGTH * 2 + 1]; /* 64 digit hash + '\0' */
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
SHA256 (string, strlen (string), hash);
#else
SHA256_CTX sha256;
SHA256_Init (&sha256);
SHA256_Update (&sha256, string, strlen (string));
SHA256_Final (hash, &sha256);
#endif
for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
+2 -3
View File
@@ -459,7 +459,7 @@ chanlist_join (GtkWidget * wid, server *serv)
g_snprintf (tbuf, sizeof (tbuf), "join %s", chan);
handle_command (serv->server_session, tbuf, FALSE);
} else
gdk_beep ();
gdk_display_beep (gdk_display_get_default ());
g_free (chan);
}
}
@@ -512,7 +512,7 @@ chanlist_save (GtkWidget * wid, server *serv)
GtkTreeModel *model = GET_MODEL (serv);
if (gtk_tree_model_get_iter_first (model, &iter))
gtkutil_file_req (_("Select an output filename"), chanlist_filereq_done,
gtkutil_file_req (NULL, _("Select an output filename"), chanlist_filereq_done,
serv, NULL, NULL, FRF_WRITE);
}
@@ -777,7 +777,6 @@ chanlist_opengui (server *serv, int do_refresh)
chanlist_add_column (view, COL_CHANNEL, 96, _("Channel"), FALSE);
chanlist_add_column (view, COL_USERS, 50, _("Users"), TRUE);
chanlist_add_column (view, COL_TOPIC, 50, _("Topic"), FALSE);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE);
/* this is a speed up, but no horizontal scrollbar :( */
/*gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (view), TRUE);*/
gtk_widget_show (view);
+1 -3
View File
@@ -146,7 +146,7 @@ fe_dcc_send_filereq (struct session *sess, char *nick, int maxcps, int passive)
mdc->maxcps = maxcps;
mdc->passive = passive;
gtkutil_file_req (tbuf, dcc_send_filereq_file, mdc, prefs.hex_dcc_dir, NULL, FRF_MULTIPLE|FRF_FILTERISINITIAL);
gtkutil_file_req (NULL, tbuf, dcc_send_filereq_file, mdc, prefs.hex_dcc_dir, NULL, FRF_MULTIPLE|FRF_FILTERISINITIAL);
g_free (tbuf);
}
@@ -812,7 +812,6 @@ fe_dcc_open_recv_win (int passive)
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_POINTER, GDK_TYPE_COLOR);
view = gtkutil_treeview_new (vbox, GTK_TREE_MODEL (store), NULL, -1);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE);
/* Up/Down Icon column */
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), -1, NULL,
gtk_cell_renderer_pixbuf_new (),
@@ -1067,7 +1066,6 @@ fe_dcc_open_chat_win (int passive)
dcc_add_column (view, CCOL_START, CCOL_COLOR, _("Start Time"), FALSE);
gtk_tree_view_column_set_expand (gtk_tree_view_get_column (GTK_TREE_VIEW (view), 1), TRUE);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE);
dcccwin.list = view;
dcccwin.store = store;
-2
View File
@@ -288,8 +288,6 @@ editlist_treeview_new (GtkWidget *box, char *title1, char *title2)
g_signal_connect (G_OBJECT (view), "key_press_event",
G_CALLBACK (editlist_keypress), NULL);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE);
render = gtk_cell_renderer_text_new ();
g_object_set (render, "editable", TRUE, NULL);
g_signal_connect (G_OBJECT (render), "edited",
+3 -3
View File
@@ -698,7 +698,7 @@ fe_beep (session *sess)
if (ca_context_play (ca_con, 0, CA_PROP_EVENT_ID, "message-new-instant", NULL) != 0)
#endif
gdk_beep ();
gdk_display_beep (gdk_display_get_default ());
#endif
}
@@ -903,7 +903,7 @@ fe_confirm (const char *message, void (*yesproc)(void *), void (*noproc)(void *)
if (dcc->file)
{
char *filepath = g_build_filename (prefs.hex_dcc_dir, dcc->file, NULL);
gtkutil_file_req (message, dcc_saveas_cb, ud, filepath, NULL,
gtkutil_file_req (NULL, message, dcc_saveas_cb, ud, filepath, NULL,
FRF_WRITE|FRF_NOASKOVERWRITE|FRF_FILTERISINITIAL);
g_free (filepath);
}
@@ -1216,7 +1216,7 @@ fe_get_file (const char *title, char *initial,
{
/* OK: Call callback once per file, then once more with file=NULL. */
/* CANCEL: Call callback once with file=NULL. */
gtkutil_file_req (title, callback, userdata, initial, NULL, flags | FRF_FILTERISINITIAL);
gtkutil_file_req (NULL, title, callback, userdata, initial, NULL, flags | FRF_FILTERISINITIAL);
}
void
+1 -3
View File
@@ -674,8 +674,6 @@ key_dialog_treeview_new (GtkWidget *box)
g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW(view))),
"changed", G_CALLBACK (key_dialog_selection_changed), NULL);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE);
render = gtk_cell_renderer_accel_new ();
g_object_set (render, "editable", TRUE,
#ifndef WIN32
@@ -894,7 +892,7 @@ key_save_kbs (void)
#define STRIP_WHITESPACE \
while (buf[0] == ' ' || buf[0] == '\t') \
buf++; \
len = strlen (buf); \
len = strlen (buf); \
while (buf[len] == ' ' || buf[len] == '\t') \
{ \
buf[len] = 0; \
+11 -1
View File
@@ -190,7 +190,7 @@ gtkutil_file_req_response (GtkWidget *dialog, gint res, struct file_req *freq)
}
void
gtkutil_file_req (const char *title, void *callback, void *userdata, char *filter, char *extensions,
gtkutil_file_req (GtkWindow *parent, const char *title, void *callback, void *userdata, char *filter, char *extensions,
int flags)
{
struct file_req *freq;
@@ -269,6 +269,16 @@ gtkutil_file_req (const char *title, void *callback, void *userdata, char *filte
G_CALLBACK (gtkutil_file_req_response), freq);
g_signal_connect (G_OBJECT (dialog), "destroy",
G_CALLBACK (gtkutil_file_req_destroy), (gpointer) freq);
if (parent)
gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
if (flags & FRF_MODAL)
{
g_assert (parent);
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
}
gtk_widget_show (dialog);
}
+1 -1
View File
@@ -25,7 +25,7 @@
typedef void (*filereqcallback) (void *, char *file);
void gtkutil_file_req (const char *title, void *callback, void *userdata, char *filter, char *extensions, int flags);
void gtkutil_file_req (GtkWindow *parent, const char *title, void *callback, void *userdata, char *filter, char *extensions, int flags);
void gtkutil_destroy (GtkWidget * igad, GtkWidget * dgad);
void gtkutil_destroy_on_esc (GtkWidget *win);
GtkWidget *gtkutil_button (GtkWidget *box, char *stock, char *tip, void *callback,
-1
View File
@@ -165,7 +165,6 @@ ignore_treeview_new (GtkWidget *box)
UNIGNORE_COLUMN, _("Unignore"),
-1);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE);
gtk_tree_view_column_set_expand (gtk_tree_view_get_column (GTK_TREE_VIEW (view), 0), TRUE);
/* attach to signals and customise columns */
+14 -18
View File
@@ -399,27 +399,22 @@ fe_set_title (session *sess)
_(DISPLAY_NAME));
break;
case SESS_SERVER:
g_snprintf (tbuf, sizeof (tbuf), "%s @ %s - %s",
sess->server->nick, server_get_network (sess->server, TRUE),
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 */
if (prefs.hex_gui_win_modes)
{
g_snprintf (tbuf, sizeof (tbuf),
"%s @ %s / %s (%s) - %s",
sess->server->nick, server_get_network (sess->server, TRUE),
sess->channel, sess->current_modes ? sess->current_modes : "",
_(DISPLAY_NAME));
}
else
{
g_snprintf (tbuf, sizeof (tbuf),
"%s @ %s / %s - %s",
sess->server->nick, server_get_network (sess->server, TRUE),
sess->channel, _(DISPLAY_NAME));
}
"%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);
@@ -427,8 +422,9 @@ fe_set_title (session *sess)
break;
case SESS_NOTICES:
case SESS_SNOTICES:
g_snprintf (tbuf, sizeof (tbuf), "%s @ %s (notices) - %s",
sess->server->nick, server_get_network (sess->server, TRUE),
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:
+1 -1
View File
@@ -1362,7 +1362,7 @@ savebuffer_req_done (session *sess, char *file)
static void
menu_savebuffer (GtkWidget * wid, gpointer none)
{
gtkutil_file_req (_("Select an output filename"), savebuffer_req_done,
gtkutil_file_req (NULL, _("Select an output filename"), savebuffer_req_done,
current_sess, NULL, NULL, FRF_WRITE);
}
+2 -2
View File
@@ -218,7 +218,7 @@ notification_plugin_init (hexchat_plugin *plugin_handle, char **plugin_name, cha
if (!notification_backend_init (&error))
{
if (error)
hexchat_printf(plugin_handle, "Failed loading notification plugin: %s\n", error);
g_debug("Failed loading notification plugin: %s\n", error);
return 0;
}
@@ -246,7 +246,7 @@ notification_plugin_init (hexchat_plugin *plugin_handle, char **plugin_name, cha
int
notification_plugin_deinit (void)
notification_plugin_deinit (void *unused_param)
{
notification_backend_deinit ();
return 1;
+1 -2
View File
@@ -66,7 +66,6 @@ plugingui_treeview_new (GtkWidget *box)
FILE_COLUMN, _("File"),
DESC_COLUMN, _("Description"),
FILEPATH_COLUMN, NULL, -1);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE);
for (col_id=0; (col = gtk_tree_view_get_column (GTK_TREE_VIEW (view), col_id));
col_id++)
gtk_tree_view_column_set_alignment (col, 0.5);
@@ -161,7 +160,7 @@ plugingui_load (void)
{
char *sub_dir = g_build_filename (get_xdir(), "addons", NULL);
gtkutil_file_req (_("Select a Plugin or Script to load"), plugingui_load_cb, current_sess,
gtkutil_file_req (NULL, _("Select a Plugin or Script to load"), plugingui_load_cb, current_sess,
sub_dir, "*."PLUGIN_SUFFIX";*.lua;*.pl;*.py;*.tcl;*.js", FRF_FILTERISINITIAL|FRF_EXTENSIONS);
g_free (sub_dir);
+1 -1
View File
@@ -77,7 +77,7 @@ rawlog_clearbutton (GtkWidget * wid, server *serv)
static int
rawlog_savebutton (GtkWidget * wid, server *serv)
{
gtkutil_file_req (_("Save As..."), rawlog_save, serv, NULL, NULL, FRF_WRITE);
gtkutil_file_req (NULL, _("Save As..."), rawlog_save, serv, NULL, NULL, FRF_WRITE);
return FALSE;
}
+13 -9
View File
@@ -48,6 +48,7 @@ GtkStyle *create_input_style (GtkStyle *);
#define LABEL_INDENT 12
static GtkWidget *setup_window = NULL;
static int last_selected_page = 0;
static int last_selected_row = 0; /* sound row */
static gboolean color_change;
@@ -175,6 +176,7 @@ static const setting appearance_settings[] =
{ST_HEADER, N_("Title Bar"),0,0,0},
{ST_TOGGLE, N_("Show channel modes"), P_OFFINTNL(hex_gui_win_modes),0,0,0},
{ST_TOGGLR, N_("Show number of users"), P_OFFINTNL(hex_gui_win_ucount),0,0,0},
{ST_TOGGLE, N_("Show nickname"), P_OFFINTNL(hex_gui_win_nick),0,0,0},
{ST_END, 0, 0, 0, 0, 0}
};
@@ -907,7 +909,7 @@ setup_create_hscale (GtkWidget *table, int row, const setting *set)
#ifndef WIN32 /* Windows always supports this */
/* Only used for transparency currently */
if (!gtk_widget_is_composited (current_sess->gui->window))
if (!gdk_screen_is_composited (gdk_window_get_screen (GDK_WINDOW (current_sess->gui->window))))
gtk_widget_set_sensitive (wid, FALSE);
#endif
}
@@ -1105,8 +1107,8 @@ setup_browsefile_cb (GtkWidget *button, GtkWidget *entry)
filter = "image/*";
filter_type = FRF_MIMETYPES;
#endif
gtkutil_file_req (_("Select an Image File"), setup_filereq_cb,
entry, NULL, filter, filter_type|FRF_RECENTLYUSED);
gtkutil_file_req (GTK_WINDOW (setup_window), _("Select an Image File"), setup_filereq_cb,
entry, NULL, filter, filter_type|FRF_RECENTLYUSED|FRF_MODAL);
}
static void
@@ -1141,7 +1143,7 @@ setup_fontsel_cancel (GtkWidget *button, GtkFontSelectionDialog *dialog)
static void
setup_browsefolder_cb (GtkWidget *button, GtkEntry *entry)
{
gtkutil_file_req (_("Select Download Folder"), setup_filereq_cb, entry, (char*)gtk_entry_get_text (entry), NULL, FRF_CHOOSEFOLDER);
gtkutil_file_req (GTK_WINDOW (setup_window), _("Select Download Folder"), setup_filereq_cb, entry, (char*)gtk_entry_get_text (entry), NULL, FRF_CHOOSEFOLDER|FRF_MODAL);
}
static void
@@ -1154,6 +1156,9 @@ setup_browsefont_cb (GtkWidget *button, GtkWidget *entry)
dialog = (GtkFontSelectionDialog *) gtk_font_selection_dialog_new (_("Select font"));
font_dialog = (GtkWidget *)dialog; /* global var */
gtk_window_set_transient_for (GTK_WINDOW (font_dialog), GTK_WINDOW (setup_window));
gtk_window_set_modal (GTK_WINDOW (font_dialog), TRUE);
sel = (GtkFontSelection *) gtk_font_selection_dialog_get_font_selection (dialog);
if (gtk_entry_get_text (GTK_ENTRY (entry))[0])
@@ -1457,6 +1462,8 @@ setup_color_cb (GtkWidget *button, gpointer userdata)
g_object_set_data (G_OBJECT (ok_button), "b", button);
gtk_widget_set_sensitive (help_button, FALSE);
gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (gtk_color_selection_dialog_get_color_selection (cdialog)), color);
gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (setup_window));
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
gtk_widget_show (dialog);
g_object_unref (cancel_button);
@@ -1711,8 +1718,8 @@ setup_snd_browse_cb (GtkWidget *button, GtkEntry *entry)
filter_type = FRF_MIMETYPES;
#endif
gtkutil_file_req (_("Select a sound file"), setup_snd_filereq_cb, entry,
sounds_dir, filter, FRF_FILTERISINITIAL|filter_type);
gtkutil_file_req (GTK_WINDOW (setup_window), _("Select a sound file"), setup_snd_filereq_cb, entry,
sounds_dir, filter, FRF_MODAL|FRF_FILTERISINITIAL|filter_type);
g_free (sounds_dir);
}
@@ -1787,7 +1794,6 @@ setup_create_sound_page (void)
G_CALLBACK (setup_snd_row_cb), NULL);
gtk_widget_show (sound_tree);
gtk_container_add (GTK_CONTAINER (scrolledwindow1), sound_tree);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (sound_tree), TRUE);
table1 = gtk_table_new (2, 3, FALSE);
gtk_widget_show (table1);
@@ -2336,8 +2342,6 @@ setup_close_cb (GtkWidget *win, GtkWidget **swin)
void
setup_open (void)
{
static GtkWidget *setup_window = NULL;
if (setup_window)
{
gtk_window_present (GTK_WINDOW (setup_window));
+6 -6
View File
@@ -1255,7 +1255,7 @@ void
sexy_spell_entry_activate_default_languages(SexySpellEntry *entry)
{
GSList *enchant_langs;
char *lang, *langs;
char *lang, **i, **langs;
if (!have_enchant)
return;
@@ -1265,21 +1265,21 @@ sexy_spell_entry_activate_default_languages(SexySpellEntry *entry)
enchant_langs = sexy_spell_entry_get_languages(entry);
langs = g_strdup (prefs.hex_text_spell_langs);
langs = g_strsplit_set (prefs.hex_text_spell_langs, ", \t", 0);
lang = strtok (langs, ",");
while (lang != NULL)
for (i = langs; *i; i++)
{
lang = *i;
if (enchant_has_lang (lang, enchant_langs))
{
sexy_spell_entry_activate_language_internal (entry, lang, NULL);
}
lang = strtok (NULL, ",");
}
g_slist_foreach(enchant_langs, (GFunc) g_free, NULL);
g_slist_free(enchant_langs);
g_free (langs);
g_strfreev (langs);
/* If we don't have any languages activated, use "en" */
if (entry->priv->dict_list == NULL)
+3 -4
View File
@@ -131,7 +131,7 @@ PrintTextRaw (void *xtbuf, unsigned char *text, int indent, time_t stamp)
{
beep_done = TRUE;
if (!prefs.hex_input_filter_beep)
gdk_beep ();
gdk_display_beep (gdk_display_get_default ());
}
default:
text++;
@@ -282,7 +282,7 @@ pevent_save_cb (GtkWidget * wid, void *data)
{
if (data)
{
gtkutil_file_req (_("Print Texts File"), pevent_save_req_cb, NULL,
gtkutil_file_req (NULL, _("Print Texts File"), pevent_save_req_cb, NULL,
NULL, NULL, FRF_WRITE);
return;
}
@@ -304,7 +304,7 @@ pevent_load_req_cb (void *arg1, char *file)
static void
pevent_load_cb (GtkWidget * wid, void *data)
{
gtkutil_file_req (_("Print Texts File"), pevent_load_req_cb, NULL, NULL, NULL, 0);
gtkutil_file_req (NULL, _("Print Texts File"), pevent_load_req_cb, NULL, NULL, NULL, 0);
}
static void
@@ -356,7 +356,6 @@ pevent_treeview_new (GtkWidget *box)
view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (view), TRUE);
gtk_tree_view_set_enable_search (GTK_TREE_VIEW (view), TRUE);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE);
sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
g_signal_connect (G_OBJECT (sel), "changed",
+1 -1
View File
@@ -145,7 +145,7 @@ url_save_callback (void *arg1, char *file)
static void
url_button_save (void)
{
gtkutil_file_req (_("Select an output filename"),
gtkutil_file_req (NULL, _("Select an output filename"),
url_save_callback, NULL, NULL, NULL, FRF_WRITE);
}
+3 -2
View File
@@ -947,7 +947,7 @@ gtk_xtext_find_char (GtkXText * xtext, int x, int y, int *off, int *out_of_bound
textentry *ent;
int line;
int subline;
int outofbounds;
int outofbounds = FALSE;
/* Adjust y value for negative rounding, double to int */
if (y < 0)
@@ -3811,7 +3811,8 @@ gtk_xtext_render_page (GtkXText * xtext)
if (xtext->buffer->indent < MARGIN)
xtext->buffer->indent = MARGIN; /* 2 pixels is our left margin */
gdk_drawable_get_size (GTK_WIDGET (xtext)->window, &width, &height);
width = gdk_window_get_width (GTK_WIDGET (xtext)->window);
height = gdk_window_get_height (GTK_WIDGET (xtext)->window);
if (width < 34 || height < xtext->fontsize || width < xtext->buffer->indent + 32)
return;
+2 -2
View File
@@ -8,7 +8,7 @@
<YourGendefPath>c:\gtk-build\gendef</YourGendefPath>
<YourPerlPath>c:\gtk-build\perl-5.20</YourPerlPath>
<YourPython2Path>c:\gtk-build\python-2.7</YourPython2Path>
<YourPython3Path>c:\gtk-build\python-3.6</YourPython3Path>
<YourPython3Path>c:\gtk-build\python-3.8</YourPython3Path>
<YourWinSparklePath>c:\gtk-build\WinSparkle</YourWinSparklePath>
<!-- YOU SHOULDN'T TOUCH ANYTHING BELOW -->
@@ -26,7 +26,7 @@
<Python2Lib>python27</Python2Lib>
<Python2Output>hcpython2</Python2Output>
<Python3Path>$(YourPython3Path)\$(PlatformName)</Python3Path>
<Python3Lib>python36</Python3Lib>
<Python3Lib>python38</Python3Lib>
<Python3Output>hcpython3</Python3Output>
<LuaInclude>$(DepsRoot)\include\luajit-2.1</LuaInclude>
<LuaOutput>hclua</LuaOutput>
+20 -15
View File
@@ -25,7 +25,7 @@ DefaultDirName={pf64}\HexChat
DefaultDirName={pf32}\HexChat
#endif
DefaultGroupName=HexChat
DisableProgramGroupPage=yes
AllowNoIcons=yes
SolidCompression=yes
Compression=lzma2/ultra64
SourceDir=..\rel
@@ -60,6 +60,9 @@ Name: "custom"; Description: "Custom Installation"; Flags: iscustom
Name: "libs"; Description: "HexChat"; Types: normal minimal custom; Flags: fixed
Name: "xctext"; Description: "HexChat-Text"; Types: custom; Flags: disablenouninstallwarning
Name: "xtm"; Description: "HexChat Theme Manager"; Types: normal custom; Flags: disablenouninstallwarning
Name: "icons"; Description: "Create Shortcuts"; Types: custom; Flags: disablenouninstallwarning
Name: "icons\desktopicon"; Description: "Create Desktop Shortcut"; Types: custom; Flags: disablenouninstallwarning
Name: "icons\quicklaunchicon"; Description: "Create Quick Launch Shortcut"; Types: custom; Flags: disablenouninstallwarning
Name: "translations"; Description: "Translations"; Types: normal custom; Flags: disablenouninstallwarning
Name: "spell"; Description: "Spelling Dictionaries"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins"; Description: "Plugins"; Types: custom; Flags: disablenouninstallwarning
@@ -74,7 +77,7 @@ Name: "langs\lua"; Description: "Lua"; Types: normal custom; Flags: disablenouni
Name: "langs\perl"; Description: "Perl (requires Perl 5.20)"; Types: custom; Flags: disablenouninstallwarning
Name: "langs\python"; Description: "Python Interface"; Types: custom; Flags: disablenouninstallwarning
Name: "langs\python\python2"; Description: "Python (requires Python 2.7)"; Types: custom; Flags: disablenouninstallwarning exclusive
Name: "langs\python\python3"; Description: "Python (requires Python 3.6)"; Types: custom; Flags: disablenouninstallwarning exclusive
Name: "langs\python\python3"; Description: "Python (requires Python 3.8)"; Types: custom; Flags: disablenouninstallwarning exclusive
[Tasks]
Name: portable; Description: "Yes"; GroupDescription: "Portable Mode: Stores configuration files within install directory for portable drives."; Flags: unchecked
@@ -196,14 +199,16 @@ Source: "hexchat-text.exe"; DestDir: "{app}"; Flags: ignoreversion; Components:
Source: "thememan.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: xtm
[Icons]
Name: "{group}\HexChat"; Filename: "{app}\hexchat.exe"; AppUserModelID: "HexChat.Desktop.Notify"; Tasks: not portable
Name: "{group}\HexChat Safe Mode"; Filename: "{app}\hexchat.exe"; Parameters: "--no-auto --no-plugins"; Tasks: not portable
Name: "{group}\HexChat ChangeLog"; Filename: "{app}\changelog.url"; IconFilename: "{sys}\shell32.dll"; IconIndex: 165; Tasks: not portable
Name: "{group}\HexChat ReadMe"; Filename: "{app}\readme.url"; IconFilename: "{sys}\shell32.dll"; IconIndex: 23; Tasks: not portable
Name: "{group}\HexChat Config Folder"; Filename: "%APPDATA%\HexChat\"; Tasks: not portable
Name: "{group}\HexChat-Text"; Filename: "{app}\hexchat-text.exe"; Components: xctext; Tasks: not portable
Name: "{group}\HexChat Theme Manager"; Filename: "{app}\thememan.exe"; Components: xtm; Tasks: not portable
Name: "{group}\Uninstall HexChat"; Filename: "{uninstallexe}"; Tasks: not portable
Name: "{group}\HexChat"; Filename: "{app}\hexchat.exe"; AppUserModelID: "HexChat.Desktop.Notify"; Tasks: not portable; Check: not WizardNoIcons
Name: "{group}\HexChat Safe Mode"; Filename: "{app}\hexchat.exe"; Parameters: "--no-auto --no-plugins"; Tasks: not portable; Check: not WizardNoIcons
Name: "{group}\HexChat ChangeLog"; Filename: "{app}\changelog.url"; IconFilename: "{sys}\shell32.dll"; IconIndex: 165; Tasks: not portable; Check: not WizardNoIcons
Name: "{group}\HexChat ReadMe"; Filename: "{app}\readme.url"; IconFilename: "{sys}\shell32.dll"; IconIndex: 23; Tasks: not portable; Check: not WizardNoIcons
Name: "{group}\HexChat Config Folder"; Filename: "%APPDATA%\HexChat\"; Tasks: not portable; Check: not WizardNoIcons
Name: "{group}\HexChat-Text"; Filename: "{app}\hexchat-text.exe"; Components: xctext; Tasks: not portable; Check: not WizardNoIcons
Name: "{group}\HexChat Theme Manager"; Filename: "{app}\thememan.exe"; Components: xtm; Tasks: not portable; Check: not WizardNoIcons
Name: "{group}\Uninstall HexChat"; Filename: "{uninstallexe}"; Tasks: not portable; Check: not WizardNoIcons
Name: "{commondesktop}\HexChat"; Filename: "{app}\hexchat.exe"; AppUserModelID: "HexChat.Desktop.Notify"; Components: icons\desktopicon; Tasks: not portable
Name: "{commonappdata}\Microsoft\Internet Explorer\Quick Launch\HexChat"; Filename: "{app}\hexchat.exe"; Components: icons\quicklaunchicon; Tasks: not portable
[Messages]
BeveledLabel= {#APPNAM}
@@ -298,14 +303,14 @@ begin
REDIST := 'https://dl.hexchat.net/misc/vcredist_2015_x64.exe';
REDIST_2013 := 'https://dl.hexchat.net/misc/vcredist_2013_x64.exe';
PERL := 'https://dl.hexchat.net/misc/perl/Perl%205.20.0%20x64.msi';
PY2 := 'https://www.python.org/ftp/python/2.7.14/python-2.7.14.amd64.msi';
PY3 := 'https://www.python.org/ftp/python/3.6.4/python-3.6.4-amd64.exe';
PY2 := 'https://www.python.org/ftp/python/2.7.18/python-2.7.18.amd64.msi';
PY3 := 'https://www.python.org/ftp/python/3.8.10/python-3.8.10-amd64.exe';
#else
REDIST := 'https://dl.hexchat.net/misc/vcredist_2015_x86.exe';
REDIST_2013 := 'https://dl.hexchat.net/misc/vcredist_2013_x86.exe';
PERL := 'https://dl.hexchat.net/misc/perl/Perl%205.20.0%20x86.msi';
PY2 := 'https://www.python.org/ftp/python/2.7.14/python-2.7.14.msi';
PY3 := 'https://www.python.org/ftp/python/3.6.4/python-3.6.4.exe';
PY2 := 'https://www.python.org/ftp/python/2.7.18/python-2.7.18.msi';
PY3 := 'https://www.python.org/ftp/python/3.8.10/python-3.8.10.exe';
#endif
DOTNET := 'https://dl.hexchat.net/misc/dotnet_40.exe';
SPELL := 'https://dl.hexchat.net/hexchat/HexChat%20Spelling%20Dictionaries%20r2.exe';
@@ -332,7 +337,7 @@ begin
if IsComponentSelected('langs\python\python2') and not CheckDLL('python27.dll') then
idpAddFile(PY2, ExpandConstant('{tmp}\python.msi'));
if IsComponentSelected('langs\python\python3') and not CheckDLL('python36.dll') then
if IsComponentSelected('langs\python\python3') and not CheckDLL('python38.dll') then
idpAddFile(PY3, ExpandConstant('{tmp}\python.exe'));
end;
end;