Compare commits

...

68 Commits

Author SHA1 Message Date
Arnavion
77d73c6351 Added ability to ignore joins, parts and quits of an ignored user.
Mentioned in #500
2016-06-11 15:46:32 -07:00
Arnavion
cadff706e7 Use unsigned int consistently for ignore type, and use IG_* constants instead of numeric literals. 2016-06-11 15:46:32 -07:00
tomek
a031a24cfd Bump version to 2.12.1-2 2016-06-05 11:22:24 +02:00
Erik de Castro Lopo
c698e13c0d Couple of minor const correctness fixes 2016-05-28 16:52:26 +10:00
Erik de Castro Lopo
10e429b85d Remove two un-needed type casts 2016-05-28 16:35:45 +10:00
Patrick Griffis
6554a8d63c servlistgui: Show invalid nick/user on open
It is possible to have an invalid config from a previous upgrade

Fixes #1715
2016-05-16 08:51:18 -04:00
Arnavion
d32aa65bc7 Ignore VS2015 crap. 2016-05-12 22:21:26 -07:00
TingPing
3c329727c7 servlist: Default to UTF-8 on PTNet
Fixes #1697
2016-05-03 20:16:49 -04:00
tomek
e223840fa6 Bump version to 2.12.1 2016-05-01 20:52:05 +02:00
Patrick Griffis
ca6411c591 Bump version to 2.12.1 2016-05-01 14:34:46 -04:00
Patrick Griffis
823ef320a5 lua: Use luaL_checkinteger 2016-04-27 14:55:04 -04:00
Arnavion
fe9da9314c Fixed warning from MSVC that not all branches return a value. 2016-04-27 11:39:29 -07:00
Arnavion
1c73f84f3a installer project needs to depend on lua plugin project. 2016-04-27 11:34:48 -07:00
Patrick Griffis
d995272922 win32: Install doat by default 2016-04-26 12:08:11 -04:00
Patrick Griffis
5b097f560d More minor scrollback loading improvements 2016-04-26 12:06:28 -04:00
Patrick Griffis
f06a38c384 configure: Bundle ax_python_devel.m4
Upstream broke API so older distributions have broken system versions

Fixes #1632
2016-04-19 14:07:27 -04:00
Patrick Griffis
44aa999598 Fix challengeauth lower casing username 2016-04-13 18:47:51 -04:00
Marcel Telka
54c6418d61 Support for older libnotify versions 2016-04-10 21:22:12 -04:00
Patrick Griffis
bd358dd570 win32: Reflect lua path changes in gtk-win32 2016-04-09 12:18:02 -07:00
Patrick Griffis
529ae4cc89 lua: Fix explicit braces warning 2016-04-07 19:02:38 -04:00
Patrick Griffis
5b05271e4c win32: Install lgi with lua plugin 2016-04-07 18:27:43 -07:00
Patrick Griffis
d11b7f258c lua: Minor formating cleanup 2016-04-07 18:27:40 -07:00
Patrick Griffis
0694cb9045 lua: More consistency with Python plugin 2016-04-07 18:27:39 -07:00
Patrick Griffis
8099f23bdf travis: Build on Ubuntu 14.04 2016-04-07 18:27:38 -07:00
Patrick Griffis
a3e1a287ac Bump glib requirement to 2.34
This is still rather old but does drop Ubuntu 12.04 support.
2016-04-07 18:27:37 -07:00
mniip
f501e948ae lua: Some more refactoring. Fix unload hook in the interpreter. 2016-04-07 18:27:30 -07:00
Patrick Griffis
ba6a1190cd lua: More missing statics 2016-04-07 18:27:30 -07:00
Patrick Griffis
4abcd53044 lua: Make better use of GLib
- Use GPtrArray everywhere
- Remove unessary NULL checks
- Make use of g_clear macros
- Use g_str_has_suffix
2016-04-07 18:27:29 -07:00
mniip
2fe52bbf58 lua: Bump version and update copyright year. 2016-04-07 18:27:21 -07:00
mniip
5998696c2a lua: Use glib allocators 2016-04-07 18:27:13 -07:00
mniip
bc9a59d264 lua: Replace some pushnumbers with pushintegers 2016-04-07 18:27:07 -07:00
mniip
5699bf9e65 lua: Error if luaL_newstate returns NULL 2016-04-07 18:26:58 -07:00
Patrick Griffis
c4c1c64f00 travis: Build with Lua 2016-04-07 18:26:47 -07:00
Patrick Griffis
fb7f27fcdd lua: Build on win32 2016-04-03 12:02:04 -07:00
Patrick Griffis
2e2b895ebe lua: Don't used mixed declarations
This requires a lot more cleanup
2016-04-03 11:04:48 -04:00
Patrick Griffis
2e478f1b5a Import lua plugin
Written by @mniip
2016-04-03 10:30:01 -04:00
Patrick Griffis
a77c6df7e2 configure: Place auxiliary files in own dir 2016-03-31 08:01:06 -04:00
Patrick Griffis
19c4adf8ba autogen: Don't copy all files by default 2016-03-31 07:51:08 -04:00
Patrick Griffis
1f48f9dd6f Increase default size of some util windows 2016-03-31 07:21:02 -04:00
Patrick Griffis
b7373f4ddc unix: Open urls in existing instance if supported 2016-03-31 07:02:23 -04:00
Patrick Griffis
9402a31111 Improve help message for /close
Closes #1397
2016-03-30 08:58:25 -04:00
Patrick Griffis
58fb36ee34 Fix warning
Fixes #1533
2016-03-30 08:48:23 -04:00
Patrick Griffis
f656569eb9 plugin: Fix padding for chanopts in channel flags
This is an API break but it didn't really work
properly before anyway.

Fixes #1666
2016-03-30 08:28:51 -04:00
LemonBoy
0635e91dd6 Don't flush the chanopt_list when saving it
Closes #1665
Fixes #1134
2016-03-30 08:11:07 -04:00
Jactry Zeng
5f2d6a3c11 servlistgui: Removes leading and trailing whitespace from hostnames
Closes #1651
2016-03-30 08:07:42 -04:00
Scott Scheiner
356241bdfb url: Add support for ts3server:// uris
Closes #1659
2016-03-30 08:05:32 -04:00
Patrick Griffis
dce6a7612a plugingui: Use full path when unloading/reloading plugins
Mentioned in mniip/hexchat-lua#5
2016-03-29 12:19:19 -04:00
Patrick Griffis
60b3b43f3e Translate chanopt output 2016-03-28 21:31:35 -04:00
Patrick Griffis
6cbcc73a79 chanopt: Ensure values are 0-2
If chanopt was set to any other value it would overwrite
other values in the plugin API for channel flags.
2016-03-28 21:19:39 -04:00
Patrick Griffis
edcd9af47f installer: Use https for Python downloads 2016-03-28 05:10:08 -04:00
Patrick Griffis
dd080fa6f3 Fix building on old glib 2016-03-28 01:36:02 -04:00
Patrick Griffis
bcb4eec754 identd: Fix ipv6 support on Windows 2016-03-28 01:28:56 -04:00
Patrick Griffis
795e97f428 identd: Fix respecting USE_GLOBAL network flag 2016-03-28 00:31:00 -04:00
Patrick Griffis
77ac0863f8 identd: Respond for INVALID-PORT and NO-USER errors 2016-03-27 23:44:05 -04:00
Patrick Griffis
963ba2bf2d identd: Ensure connection is closed 2016-03-27 23:18:24 -04:00
Patrick Griffis
c280029436 servlist: Update DALnet default login type 2016-03-25 18:44:16 -04:00
Patrick Griffis
47b357b2e1 Only intercept QuakeNet challengeauth when enabled 2016-03-24 15:42:49 -04:00
Patrick Griffis
c1a94e2879 servlist: Add GlobalGamers
Closes #1334
2016-03-20 20:47:52 -04:00
tomek
c874a9525c Bump version to 2.12.0 2016-03-12 16:21:52 +01:00
Patrick Griffis
fc20786a5e Bump version to 2.12.0 2016-03-12 03:04:42 -05:00
Arnavion
d48f31191f Updated location of GTK theme engines in 2.24.30. 2016-03-11 21:00:06 -08:00
Patrick Griffis
7c078db879 Fix loading encoding from network list on connect
- Fix setting new encoding when switching networks
- Ignore ports when looking for network by hostname
- Only set UTF-8 when nothing explicitly set

Fixes #1628
2016-03-11 02:15:42 -05:00
Patrick Griffis
ebb0fd6905 identd: Fix leak 2016-03-09 00:38:56 -05:00
Patrick Griffis
ed029357d1 sysinfo: Clean up ifdefs and handle unsupported CPU
Mentioned in #1624
2016-03-06 23:10:04 -05:00
Patrick Griffis
10fa3b1878 build: Keep macros newer than Ubuntu...
Mostly for travis
2016-03-06 19:09:23 -05:00
Patrick Griffis
98b0186feb build: Don't store autoconf-archive macros in repo
The release tarballs will still have them
2016-03-06 18:54:07 -05:00
tomek
35254fa6eb win32: Update Python to 3.5 2016-03-06 18:27:59 -05:00
Patrick Griffis
6706b23a0b build: Use more secure flags 2016-03-06 18:27:59 -05:00
48 changed files with 2296 additions and 464 deletions

19
.gitignore vendored
View File

@@ -7,31 +7,19 @@ Makefile
Makefile.in
aclocal.m4
autom4te.cache/
compile
ar-lib
/build-aux/
confdefs.h
conftest
conftest.c
conftest.err
config.guess
config.h.in
config.h.in~
config.h
config.log
config.status
config.sub
config.*
config-win32.h
configure
configure.tmp
depcomp
doxygen*.tmp
html/
install-sh
intl/
libtool
ltmain.sh
m4/
missing
plugins/perl/irc.pm.h
plugins/perl/xchat.pm.h
plugins/perl/hexchat.pm.h
@@ -44,6 +32,7 @@ data/man/hexchat.1
data/pkgconfig/hexchat-plugin.pc
data/misc/hexchat.appdata.xml
data/misc/hexchat.desktop
data/misc/hexchat.desktop.in
data/misc/htm.desktop
src/common/dbus/example
src/common/dbus/org.hexchat.service.service
@@ -96,3 +85,5 @@ osx/.HexChat.app
po/.intltool-merge-cache
*.zip
*.dmg
*.VC.db
*.VC.opendb

View File

@@ -1,4 +1,5 @@
sudo: false
sudo: required
dist: trusty
language: c
cache: apt
compiler: clang
@@ -16,13 +17,14 @@ addons:
apt:
packages:
- automake
- autoconf
- autoconf-archive
- imagemagick
- intltool
- libcanberra-dev
- libdbus-glib-1-dev
- libglib2.0-dev
- libgtk2.0-dev
- libluajit-5.1-dev
- libnotify-dev
- libpci-dev
- libperl-dev

View File

@@ -9,10 +9,15 @@ test -z "$srcdir" && srcdir=.
exit 1
}
aclocal --install -I m4 || exit 1
glib-gettextize --force --copy || exit 1
intltoolize --force --copy --automake || exit 1
autoreconf --force --install -Wno-portability || exit 1
if [ "$1" = "--copy" ]; then
shift
aclocal --force --install || exit 1
intltoolize --force --copy --automake || exit 1
autoreconf --force --install --include=m4 -Wno-portability || exit 1
else
intltoolize --automake || exit 1
autoreconf --install --symlink --include=m4 -Wno-portability || exit 1
fi
if [ "$NOCONFIGURE" = "" ]; then
$srcdir/configure "$@" || exit 1

View File

@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT([HexChat],[2.11.0])
AC_INIT([HexChat],[2.12.1])
AC_PREREQ([2.64])
AC_COPYRIGHT([Copyright (C) 1998-2010 Peter Zelezny])
@@ -9,13 +9,18 @@ AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([1.11.1 dist-xz no-dist-gzip subdir-objects no-define foreign])
AM_SILENT_RULES([yes])
AC_DEFUN([HEX_CHECK_MACRO], [m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined. Is ]$2[ installed?])])])
HEX_CHECK_MACRO([AX_APPEND_COMPILE_FLAGS], [autoconf-archive])
HEX_CHECK_MACRO([PKG_PROG_PKG_CONFIG], [pkg-config])
AX_IS_RELEASE([minor-version])
AX_CHECK_ENABLE_DEBUG([yes])
AX_REQUIRE_DEFINED([PKG_PROG_PKG_CONFIG])
AC_USE_SYSTEM_EXTENSIONS
AM_MAINTAINER_MODE([enable])
@@ -113,6 +118,10 @@ AC_ARG_ENABLE(perl,
[AS_HELP_STRING([--disable-perl],[don\'t build the perl plugin])],
perl=$enableval, perl=yes)
AC_ARG_ENABLE(lua,
[AS_HELP_STRING([--disable-lua],[don\'t build the lua plugin])],
lua=$enableval, lua=yes)
AC_ARG_ENABLE(perl_old,
[AS_HELP_STRING([--disable-perl_old],[no backwards compatibility for perl plugin])],
perl_old=$enableval, perl_old=yes)
@@ -181,11 +190,11 @@ dnl *********************************************************************
dnl ** GLIB *************************************************************
dnl *********************************************************************
AM_PATH_GLIB_2_0([2.32.0], [], [AC_MSG_ERROR([Glib not found!])], [gmodule gobject gio])
AM_PATH_GLIB_2_0([2.34.0], [], [AC_MSG_ERROR([Glib not found!])], [gmodule gobject gio])
COMMON_CFLAGS="$GLIB_CFLAGS -DG_DISABLE_SINGLE_INCLUDES"
COMMON_LIBS="$GLIB_LIBS"
AC_DEFINE([GLIB_VERSION_MIN_REQUIRED], [GLIB_VERSION_2_32], [Dont warn using older APIs])
AC_DEFINE([GLIB_VERSION_MAX_ALLOWED], [GLIB_VERSION_2_32], [Prevents using newer APIs])
AC_DEFINE([GLIB_VERSION_MIN_REQUIRED], [GLIB_VERSION_2_34], [Dont warn using older APIs])
AC_DEFINE([GLIB_VERSION_MAX_ALLOWED], [GLIB_VERSION_2_34], [Prevents using newer APIs])
dnl *********************************************************************
dnl ** GTK **************************************************************
@@ -213,6 +222,40 @@ AS_IF([test "x$_gdk_tgt" = xquartz], [
])
])
dnl *********************************************************************
dnl ** Lua **************************************************************
dnl *********************************************************************
AS_IF([test "$lua" = yes], [
AC_MSG_CHECKING(for plugin interface used by lua)
AS_IF([test "$plugin" = yes], [
AC_MSG_RESULT([yes])
m4_define_default([_LUA_LIST], [luajit lua lua5.3 lua53 lua5.2 lua52 lua5.1 lua51])
AC_ARG_VAR([LUA], [The Lua pkgconfig name, e.g. luajit or lua5.2])
AS_IF([test "x$LUA" = 'x'], [
for lua_var in _LUA_LIST; do
$PKG_CONFIG --exists $lua_var || continue
LUA=$lua_var
break
done
AS_IF([test "x$LUA" = 'x'], [
AC_MSG_ERROR([Failed to find lua])
])
])
PKG_CHECK_MODULES([LUA], $LUA, [
AC_SUBST([LUA_CFLAGS])
AC_SUBST([LUA_LIBS])
])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option for lua])
lua=no
])
])
dnl *********************************************************************
dnl ** PERL *************************************************************
dnl *********************************************************************
@@ -559,6 +602,7 @@ AM_CONDITIONAL(USE_LIBCANBERRA, test "x$libcanberra" = "xyes")
AM_CONDITIONAL(DO_TEXT, test "x$textfe" = "xyes")
AM_CONDITIONAL(DO_GTK, test "x$gtkfe" = "xyes")
AM_CONDITIONAL(DO_PERL, test "x$perl" = "xyes")
AM_CONDITIONAL(DO_LUA, test "x$lua" = "xyes")
AM_CONDITIONAL(DO_PYTHON, test "x$python" != "xno")
AM_CONDITIONAL(DO_PLUGIN, test "x$plugin" = "xyes")
AM_CONDITIONAL(DO_CHECKSUM, test "x$checksum" = "xyes")
@@ -576,9 +620,12 @@ dnl *********************************************************************
dnl ** CFLAGS ***********************************************************
dnl *********************************************************************
CC_CHECK_FLAGS_APPEND([CFLAGS], [CFLAGS], [ \
AX_APPEND_COMPILE_FLAGS([\
-pipe \
-funsigned-char \
-fstack-protector-strong \
-fPIE \
-fPIC \
-Wall \
-Wextra \
-Wstrict-prototypes \
@@ -596,6 +643,12 @@ CC_CHECK_FLAGS_APPEND([CFLAGS], [CFLAGS], [ \
-Werror=pointer-arith \
])
AX_APPEND_LINK_FLAGS([ \
-pie \
-Wl,-z,relro \
-Wl,-z,now \
])
dnl *********************************************************************
dnl ** FUNCTIONS/LIBS/CFLAGS ********************************************
dnl *********************************************************************
@@ -702,6 +755,7 @@ src/htm/Makefile
src/htm/thememan
osx/Info.plist
plugins/Makefile
plugins/lua/Makefile
plugins/python/Makefile
plugins/perl/Makefile
plugins/checksum/Makefile
@@ -727,6 +781,7 @@ echo libcanberra support ... : $libcanberra
echo Plugin interface ...... : $plugin
echo libproxy support ...... : $libproxy
echo
echo Lua ................... : $lua \($LUA\)
echo Perl .................. : $perl
echo Python ................ : $python
echo

View File

@@ -3,6 +3,15 @@ appdata_DATA = $(appdata_in_files:.xml.in=.xml)
appdatadir = $(datadir)/appdata
@INTLTOOL_XML_RULE@
if USE_DBUS
exec_command = 'hexchat --existing %U'
else
exec_command = 'hexchat %U'
endif
hexchat.desktop.in: hexchat.desktop.in.in
$(AM_V_GEN)sed -e s!\@exec_command\@!$(exec_command)! < $< > $@
data_desktopdir = $(datadir)/applications
data_desktop_in_files = hexchat.desktop.in
@@ -26,6 +35,6 @@ uninstall-hook:
$(UPDATE_MIME_DATABASE);
$(UPDATE_DESKTOP_DATABASE);
EXTRA_DIST = hexchat.appdata.xml.in hexchat.desktop.in htm.desktop.in htm-mime.xml
EXTRA_DIST = hexchat.appdata.xml.in hexchat.desktop.in.in htm.desktop.in htm-mime.xml
CLEANFILES = $(appdata_DATA) $(data_desktop_DATA)
CLEANFILES = $(appdata_DATA) $(data_desktop_DATA) hexchat.desktop.in

View File

@@ -3,7 +3,7 @@ _Name=HexChat
_GenericName=IRC Client
_Comment=Chat with other people online
_Keywords=IM;Chat;
Exec=hexchat %U
Exec=@exec_command@
Icon=hexchat
Terminal=false
Type=Application

View File

@@ -1,60 +0,0 @@
dnl Macros to check the presence of generic (non-typed) symbols.
dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes@gmail.com>
dnl Copyright (c) 2006-2008 xine project
dnl Copyright (c) 2012 Lucas De Marchi <lucas.de.marchi@gmail.com>
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 2, or (at your option)
dnl any later version.
dnl
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
dnl 02110-1301, USA.
dnl
dnl As a special exception, the copyright owners of the
dnl macro gives unlimited permission to copy, distribute and modify the
dnl configure scripts that are the output of Autoconf when processing the
dnl Macro. You need not follow the terms of the GNU General Public
dnl License when using or distributing such scripts, even though portions
dnl of the text of the Macro appear in them. The GNU General Public
dnl License (GPL) does govern all other use of the material that
dnl constitutes the Autoconf Macro.
dnl
dnl This special exception to the GPL applies to versions of the
dnl Autoconf Macro released by this project. When you make and
dnl distribute a modified version of the Autoconf Macro, you may extend
dnl this special exception to the GPL to apply to your modified version as
dnl well.
dnl Check if FLAG in ENV-VAR is supported by compiler and append it
dnl to WHERE-TO-APPEND variable
dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG])
AC_DEFUN([CC_CHECK_FLAG_APPEND], [
AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2],
AS_TR_SH([cc_cv_$2_$3]),
[eval "AS_TR_SH([cc_save_$2])='${$2}'"
eval "AS_TR_SH([$2])='$3'"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a = 0; int main(void) { return a; } ])],
[eval "AS_TR_SH([cc_cv_$2_$3])='yes'"],
[eval "AS_TR_SH([cc_cv_$2_$3])='no'"])
eval "AS_TR_SH([$2])='$cc_save_$2'"])
AS_IF([eval test x$]AS_TR_SH([cc_cv_$2_$3])[ = xyes],
[eval "$1='${$1} $3'"])
])
dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2])
AC_DEFUN([CC_CHECK_FLAGS_APPEND], [
for flag in $3; do
CC_CHECK_FLAG_APPEND($1, $2, $flag)
done
])

View File

@@ -1,116 +0,0 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_perl_ext_flags.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_PERL_EXT_FLAGS([CFLAGS-VARIABLE], [LDFLAGS-VARIABLE], [EXTRA-MODULES])
# AX_PERL_EXT_CFLAGS([CFLAGS-VARIABLE])
# AX_PERL_EXT_LDFLAGS([LDFLAGS-VARIABLE], [EXTRA-MODULES])
#
# DESCRIPTION
#
# Fetches the linker flags and C compiler flags for compiling and linking
# programs that embed a Perl interpreter. If the EXTRA-MODULES argument is
# submitted, it is a space separated list of extra modules to link. The
# flags will be stored in the provided variables.
#
# Examples:
#
# AX_PERL_EXT_FLAGS([PERLXS_CFLAGS], [PERLXS_LDFLAGS])
# AC_SUBST([PERLXS_CFLAGS])
# AC_SUBST([PERLXS_LDFLAGS])
#
# AX_PERL_EXT_CFLAGS([PERLXS_CFLAGS])
# AC_SUBST([PERLXS_CFLAGS])
#
# AX_PERL_EXT_LDFLAGS([PERLXS_LDFLAGS], [-std Socket])
#
# LICENSE
#
# Copyright (c) 2009 Mats Kindahl of Sun Microsystems <mats@sun.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. The name of the author may not be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#serial 5
AC_DEFUN([AX_PERL_EXT_CFLAGS],
[AC_CHECK_PROG(PERL,perl,perl)
_AX_PERL_EXT_MODULE_CHECK([ExtUtils::Embed], [have_embed=yes],
[have_embed=no])
AS_IF([test $have_embed = no],
AC_MSG_ERROR([Require ExtUtils::Embed to proceed]))
_AX_PERL_EXT_EMBED_CHECK([$1],[ccopts])
])
AC_DEFUN([AX_PERL_EXT_LDFLAGS],
[AC_CHECK_PROG(PERL,perl,perl)
_AX_PERL_EXT_MODULE_CHECK([ExtUtils::Embed], [have_embed=yes],
[have_embed=no])
AS_IF([test $have_embed = no],
AC_MSG_ERROR([Require ExtUtils::Embed to proceed]))
_AX_PERL_EXT_EMBED_CHECK([$1],[ldopts],[$2])
])
AC_DEFUN([AX_PERL_EXT_FLAGS],
[AC_CHECK_PROG(PERL,perl,perl)
_AX_PERL_EXT_MODULE_CHECK([ExtUtils::Embed], [have_embed=yes],
[have_embed=no])
AS_IF([test $have_embed = no],
AC_MSG_ERROR([Require ExtUtils::Embed to proceed]))
_AX_PERL_EXT_EMBED_CHECK([$1],[ccopts])
_AX_PERL_EXT_EMBED_CHECK([$2],[ldopts],[$3])
])
dnl _AX_PERL_EXT_MODULE_CHECK(MODULE-NAME, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
dnl
dnl Check for the existance of the perl module given by MODULE-NAME.
dnl
AC_DEFUN([_AX_PERL_EXT_MODULE_CHECK],
[AC_MSG_CHECKING([for perl module $1])
$PERL "-M$1" -e exit > /dev/null 2>&1
AS_IF([test $? -eq 0],
[AC_MSG_RESULT(yes)
$2],
[AC_MSG_RESULT(no)
$3])
])
dnl _AX_PERL_EXT_EMBED_CHECK(VARIABLE, COMMAND, [EXTRA-FLAGS]) Use
dnl
dnl ExtUtils::Embed fetch flags for embedding Perl in a C/C++
dnl application
dnl
AC_DEFUN([_AX_PERL_EXT_EMBED_CHECK],
[AC_MSG_CHECKING([for perl $2 embed flags])
ax_c_perlxs_extras="$3"
$1=`$PERL -MExtUtils::Embed -e $2 ${ax_c_perlxs_extras:+"-- $3"}`
AC_MSG_RESULT($$1)
])

View File

@@ -1,37 +0,0 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_require_defined.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_REQUIRE_DEFINED(MACRO)
#
# DESCRIPTION
#
# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have
# been defined and thus are available for use. This avoids random issues
# where a macro isn't expanded. Instead the configure script emits a
# non-fatal:
#
# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found
#
# It's like AC_REQUIRE except it doesn't expand the required macro.
#
# Here's an example:
#
# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
#
# LICENSE
#
# Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 1
AC_DEFUN([AX_REQUIRE_DEFINED], [dnl
m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])])
])dnl AX_REQUIRE_DEFINED

View File

@@ -1,3 +1,7 @@
if DO_LUA
lua = lua
endif
if DO_PYTHON
pythondir = python
endif
@@ -22,4 +26,4 @@ if DO_SYSINFO
sysinfodir = sysinfo
endif
SUBDIRS = $(pythondir) $(perldir) $(checksumdir) $(doatdir) $(fishlimdir) $(sysinfodir)
SUBDIRS = $(lua) $(pythondir) $(perldir) $(checksumdir) $(doatdir) $(fishlimdir) $(sysinfodir)

9
plugins/lua/Makefile.am Normal file
View File

@@ -0,0 +1,9 @@
libdir = $(hexchatlibdir)
lib_LTLIBRARIES = lua.la
lua_la_SOURCES = lua.c
lua_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
lua_la_LIBADD = $(LUA_LIBS) $(GLIB_LIBS)
lua_la_CPPFLAGS = -I$(top_srcdir)/src/common
lua_la_CFLAGS = $(GLIB_CFLAGS) $(LUA_CFLAGS)

1725
plugins/lua/lua.c Normal file

File diff suppressed because it is too large Load Diff

54
plugins/lua/lua.vcxproj Normal file
View File

@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>lua</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>$(LuaOutput)</TargetName>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(Glib);$(LuaInclude);..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalDependencies>"$(LuaLib).lib";$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(Glib);$(LuaInclude);..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalDependencies>"$(LuaLib).lib";$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="lua.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{f4eaf231-f095-42d3-8427-b2b6006cacb1}</UniqueIdentifier>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{0166c0f9-7968-4a09-9ef5-a5179c7746eb}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="lua.c" />
</ItemGroup>
</Project>

View File

@@ -40,32 +40,37 @@ int xs_parse_cpu(char *model, char *vendor, double *freq)
#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || defined(__alpha__) || defined(__ia64__) || defined(__parisc__) || defined(__sparc__)
char buffer[bsize];
#endif
#if defined(__powerpc__)
char *pos = NULL;
#endif
FILE *fp = fopen("/proc/cpuinfo", "r");
FILE *fp;
fp = fopen("/proc/cpuinfo", "r");
if(fp == NULL)
return 1;
#if defined(__i386__) || defined(__x86_64__)
#if defined(__i386__) || defined(__x86_64__)
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "model name", model);
find_match_char(buffer, "vendor_id", vendor);
find_match_double(buffer, "cpu MHz", freq);
}
#endif
#ifdef __powerpc__
while(fgets(buffer, bsize, fp) != NULL)
#elif defined(__powerpc__)
{
find_match_char(buffer, "cpu", model);
find_match_char(buffer, "machine", vendor);
find_match_double(buffer, "clock", freq);
char *pos;
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu", model);
find_match_char(buffer, "machine", vendor);
find_match_double(buffer, "clock", freq);
}
pos = strstr(model, ",");
if (pos != NULL)
*pos = '\0';
}
pos = strstr(model, ",");
if (pos != NULL) *pos = '\0';
#endif
#ifdef __alpha__
#elif defined( __alpha__)
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu model", model);
@@ -73,37 +78,47 @@ int xs_parse_cpu(char *model, char *vendor, double *freq)
find_match_double(buffer, "cycle frequency [Hz]", freq);
}
*freq = *freq / 1000000;
#endif
#ifdef __ia64__
#elif defined(__ia64__)
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "model", model);
find_match_char(buffer, "vendor", vendor);
find_match_double(buffer, "cpu MHz", freq);
}
#endif
#ifdef __parisc__
#elif defined(__parisc__)
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu ", model);
find_match_char(buffer, "cpu family", vendor);
find_match_double(buffer, "cpu MHz", freq);
}
#endif
#ifdef __sparc__
DIR *dir;
struct dirent *entry;
FILE *fp2;
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu ", model);
find_match_char(buffer, "type ", vendor);
find_match_double_hex(buffer, "Cpu0ClkTck", freq);
}
*freq = *freq / 1000000;
#endif
#elif defined(__sparc__)
{
DIR *dir;
struct dirent *entry;
FILE *fp2;
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "cpu ", model);
find_match_char(buffer, "type ", vendor);
find_match_double_hex(buffer, "Cpu0ClkTck", freq);
}
*freq = *freq / 1000000;
}
#else
fclose(fp);
return 1; /* Unsupported */
#endif
fclose(fp);
return 0;
}

1
po/POTFILES.skip Normal file
View File

@@ -0,0 +1 @@
data/misc/hexchat.desktop.in.in

View File

@@ -76,14 +76,28 @@ chanopt_value (guint8 val)
switch (val)
{
case SET_OFF:
return "OFF";
return _("OFF");
case SET_ON:
return "ON";
return _("ON");
case SET_DEFAULT:
return _("{unset}");
default:
return "{unset}";
g_assert_not_reached ();
return NULL;
}
}
static guint8
str_to_chanopt (const char *str)
{
if (!g_ascii_strcasecmp (str, "ON") || !strcmp (str, "1"))
return SET_ON;
else if (!g_ascii_strcasecmp (str, "OFF") || !strcmp (str, "0"))
return SET_OFF;
else
return SET_DEFAULT;
}
/* handle the /CHANOPT command */
int
@@ -106,19 +120,14 @@ chanopt_command (session *sess, char *tbuf, char *word[], char *word_eol[])
if (word[offset][0])
{
if (!g_ascii_strcasecmp (word[offset], "ON"))
newval = 1;
else if (!g_ascii_strcasecmp (word[offset], "OFF"))
newval = 0;
else if (word[offset][0] == 'u')
newval = SET_DEFAULT;
else
newval = atoi (word[offset]);
newval = str_to_chanopt (word[offset]);
}
if (!quiet)
PrintTextf (sess, "\002Network\002: %s \002Channel\002: %s\n",
PrintTextf (sess, "\002%s\002: %s \002%s\002: %s\n",
_("Network"),
sess->server->network ? server_get_network (sess->server, TRUE) : _("<none>"),
_("Channel"),
sess->session_name[0] ? sess->session_name : _("<none>"));
while (i < sizeof (chanopt) / sizeof (channel_options))
@@ -281,7 +290,7 @@ chanopt_load_all (void)
else
{
if (current)
chanopt_add_opt (current, buf, atoi (eq + 2));
chanopt_add_opt (current, buf, str_to_chanopt (eq + 2));
}
}
@@ -388,7 +397,7 @@ chanopt_save_one_channel (chanopt_in_memory *co, int fh)
}
void
chanopt_save_all (void)
chanopt_save_all (gboolean flush)
{
int i;
int num_saved;
@@ -430,15 +439,21 @@ chanopt_save_all (void)
}
cont:
g_free (co->network);
g_free (co->channel);
g_free (co);
if (flush)
{
g_free (co->network);
g_free (co->channel);
g_free (co);
}
}
close (fh);
g_slist_free (chanopt_list);
chanopt_list = NULL;
if (flush)
{
g_slist_free (chanopt_list);
chanopt_list = NULL;
}
chanopt_open = FALSE;
chanopt_changed = FALSE;

View File

@@ -22,7 +22,7 @@
int chanopt_command (session *sess, char *tbuf, char *word[], char *word_eol[]);
gboolean chanopt_is_set (unsigned int global, guint8 per_chan_setting);
void chanopt_save_all (void);
void chanopt_save_all (gboolean flush);
void chanopt_save (session *sess);
void chanopt_load (session *sess);

View File

@@ -960,7 +960,7 @@ hexchat_exit (void)
notify_save ();
ignore_save ();
free_sessions ();
chanopt_save_all ();
chanopt_save_all (TRUE);
servlist_cleanup ();
fe_exit ();
}

View File

@@ -77,7 +77,7 @@ ignore_exists (char *mask)
*/
int
ignore_add (char *mask, int type, gboolean overwrite)
ignore_add (char *mask, unsigned int type, gboolean overwrite)
{
struct ignore *ig = NULL;
int change_only = FALSE;
@@ -151,6 +151,10 @@ ignore_showlist (session *sess)
strcat (tbuf, _("YES "));
else
strcat (tbuf, _("NO "));
if (ig->type & IG_JOINS_PARTS)
strcat (tbuf, _("YES "));
else
strcat (tbuf, _("NO "));
strcat (tbuf, "\n");
PrintText (sess, tbuf);
/*EMIT_SIGNAL (XP_TE_IGNORELIST, sess, ig->mask, 0, 0, 0, 0); */
@@ -200,7 +204,7 @@ ignore_del (char *mask, struct ignore *ig)
/* check if a msg should be ignored by browsing our ignore list */
int
ignore_check (char *host, int type)
ignore_check (char *host, unsigned int type)
{
struct ignore *ig;
GSList *list = ignore_list;

View File

@@ -36,6 +36,7 @@ extern int ignored_invi;
#define IG_UNIG 32
#define IG_NOSAVE 64
#define IG_DCC 128
#define IG_JOINS_PARTS 256
struct ignore
{
@@ -44,10 +45,10 @@ struct ignore
};
struct ignore *ignore_exists (char *mask);
int ignore_add (char *mask, int type, gboolean overwrite);
int ignore_add (char *mask, unsigned int type, gboolean overwrite);
void ignore_showlist (session *sess);
int ignore_del (char *mask, struct ignore *ig);
int ignore_check (char *mask, int type);
int ignore_check (char *mask, unsigned int type);
void ignore_load (void);
void ignore_save (void);
void ignore_gui_open (void);

View File

@@ -770,14 +770,15 @@ inbound_topicnew (server *serv, char *nick, char *chan, char *topic,
}
void
inbound_join (server *serv, char *chan, char *user, char *ip, char *account,
inbound_join (server *serv, char *chan, char *host, char *user, char *ip, char *account,
char *realname, const message_tags_data *tags_data)
{
session *sess = find_channel (serv, chan);
if (sess)
{
EMIT_SIGNAL_TIMESTAMP (XP_TE_JOIN, sess, user, chan, ip, account, 0,
tags_data->timestamp);
if (!ignore_check(host, IG_JOINS_PARTS))
EMIT_SIGNAL_TIMESTAMP (XP_TE_JOIN, sess, user, chan, ip, account, 0,
tags_data->timestamp);
userlist_add (sess, user, ip, account, realname, tags_data);
}
}
@@ -796,18 +797,19 @@ inbound_kick (server *serv, char *chan, char *user, char *kicker, char *reason,
}
void
inbound_part (server *serv, char *chan, char *user, char *ip, char *reason,
inbound_part (server *serv, char *chan, char *host, char *user, char *ip, char *reason,
const message_tags_data *tags_data)
{
session *sess = find_channel (serv, chan);
if (sess)
{
if (*reason)
EMIT_SIGNAL_TIMESTAMP (XP_TE_PARTREASON, sess, user, ip, chan, reason,
0, tags_data->timestamp);
else
EMIT_SIGNAL_TIMESTAMP (XP_TE_PART, sess, user, ip, chan, NULL, 0,
tags_data->timestamp);
if (!ignore_check(host, IG_JOINS_PARTS))
if (*reason)
EMIT_SIGNAL_TIMESTAMP (XP_TE_PARTREASON, sess, user, ip, chan, reason,
0, tags_data->timestamp);
else
EMIT_SIGNAL_TIMESTAMP (XP_TE_PART, sess, user, ip, chan, NULL, 0,
tags_data->timestamp);
userlist_remove (sess, user);
}
}
@@ -828,7 +830,7 @@ inbound_topictime (server *serv, char *chan, char *nick, time_t stamp,
}
void
inbound_quit (server *serv, char *nick, char *ip, char *reason,
inbound_quit (server *serv, char *host, char *nick, char *ip, char *reason,
const message_tags_data *tags_data)
{
GSList *list = sess_list;
@@ -845,8 +847,9 @@ inbound_quit (server *serv, char *nick, char *ip, char *reason,
was_on_front_session = TRUE;
if ((user = userlist_find (sess, nick)))
{
EMIT_SIGNAL_TIMESTAMP (XP_TE_QUIT, sess, nick, reason, ip, NULL, 0,
tags_data->timestamp);
if (!ignore_check(host, IG_JOINS_PARTS))
EMIT_SIGNAL_TIMESTAMP (XP_TE_QUIT, sess, nick, reason, ip, NULL, 0,
tags_data->timestamp);
userlist_remove_user (sess, user);
} else if (sess->type == SESS_DIALOG && !serv->p_cmp (sess->channel, nick))
{

View File

@@ -28,7 +28,7 @@ void inbound_uback (server *serv, const message_tags_data *tags_data);
void inbound_uaway (server *serv, const message_tags_data *tags_data);
void inbound_account (server *serv, char *nick, char *account,
const message_tags_data *tags_data);
void inbound_part (server *serv, char *chan, char *user, char *ip, char *reason,
void inbound_part (server *serv, char *chan, char *host, char *user, char *ip, char *reason,
const message_tags_data *tags_data);
void inbound_upart (server *serv, char *chan, char *ip, char *reason,
const message_tags_data *tags_data);
@@ -38,11 +38,11 @@ void inbound_kick (server *serv, char *chan, char *user, char *kicker,
char *reason, const message_tags_data *tags_data);
void inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip,
int id, const message_tags_data *tags_data);
void inbound_quit (server *serv, char *nick, char *ip, char *reason,
void inbound_quit (server *serv, char *host, char *nick, char *ip, char *reason,
const message_tags_data *tags_data);
void inbound_topicnew (server *serv, char *nick, char *chan, char *topic,
const message_tags_data *tags_data);
void inbound_join (server *serv, char *chan, char *user, char *ip,
void inbound_join (server *serv, char *chan, char *host, char *user, char *ip,
char *account, char *realname,
const message_tags_data *tags_data);
void inbound_ujoin (server *serv, char *chan, char *nick, char *ip,

View File

@@ -162,8 +162,8 @@ process_data_init (char *buf, char *cmd, char *word[],
word[0] = "\000\000";
word_eol[0] = "\000\000";
word[1] = (char *)buf;
word_eol[1] = (char *)cmd;
word[1] = buf;
word_eol[1] = cmd;
while (1)
{
@@ -581,7 +581,7 @@ cmd_chanopt (struct session *sess, char *tbuf, char *word[], char *word_eol[])
/* chanopt.c */
ret = chanopt_command (sess, tbuf, word, word_eol);
chanopt_save_all ();
chanopt_save_all (FALSE);
return ret;
}
@@ -3439,10 +3439,9 @@ cmd_server (struct session *sess, char *tbuf, char *word[], char *word_eol[])
}
/* try to associate this connection with a listed network */
if (!serv->network)
/* search for this hostname in the entire server list */
serv->network = servlist_net_find_from_server (server_name);
/* may return NULL, but that's OK */
/* may return NULL, but that's OK */
if ((serv->network = servlist_net_find_from_server (server_name)))
server_set_encoding (serv, ((ircnet*)serv->network)->encoding);
return TRUE;
}
@@ -3870,7 +3869,7 @@ const struct commands xc_cmds[] = {
{"CHANOPT", cmd_chanopt, 0, 0, 1, N_("CHANOPT [-quiet] <variable> [<value>]")},
{"CHARSET", cmd_charset, 0, 0, 1, N_("CHARSET [<encoding>], get or set the encoding used for the current connection")},
{"CLEAR", cmd_clear, 0, 0, 1, N_("CLEAR [ALL|HISTORY|[-]<amount>], Clears the current text window or command history")},
{"CLOSE", cmd_close, 0, 0, 1, N_("CLOSE [-m], Closes the current window/tab or all queries")},
{"CLOSE", cmd_close, 0, 0, 1, N_("CLOSE [-m], Closes the current tab, closing the window if this is the only open tab, or with the \"-m\" flag, closes all queries.")},
{"COUNTRY", cmd_country, 0, 0, 1,
N_("COUNTRY [-s] <code|wildcard>, finds a country code, eg: au = australia")},

View File

@@ -34,6 +34,32 @@ typedef struct ident_info
gchar *username;
} ident_info;
static void
stream_close_ready (GObject *source, GAsyncResult *res, gpointer userdata)
{
GError *err = NULL;
if (!g_io_stream_close_finish (G_IO_STREAM(source), res, &err))
{
g_warning ("%s", err->message);
g_error_free (err);
}
g_object_unref (source);
}
static void
ident_info_free (ident_info *info)
{
if (G_LIKELY(info))
{
g_io_stream_close_async (G_IO_STREAM(info->conn), G_PRIORITY_DEFAULT,
NULL, stream_close_ready, NULL);
g_free (info->username);
g_free (info);
}
}
static int
identd_cleanup_response_cb (gpointer userdata)
{
@@ -90,9 +116,7 @@ identd_write_ready (GOutputStream *stream, GAsyncResult *res, ident_info *info)
{
g_output_stream_write_finish (stream, res, NULL);
g_free (info->username);
g_object_unref (info->conn);
g_free (info);
ident_info_free (info);
}
static void
@@ -116,30 +140,47 @@ identd_read_ready (GDataInputStream *in_stream, GAsyncResult *res, ident_info *i
remote = g_ascii_strtoull (p + 1, NULL, 0);
g_free (read_buf);
g_snprintf (buf, sizeof (buf), "%"G_GUINT16_FORMAT", %"G_GUINT16_FORMAT" : ",
(guint16)MIN(local, G_MAXUINT16), (guint16)MIN(remote, G_MAXUINT16));
if (!local || !remote || local > G_MAXUINT16 || remote > G_MAXUINT16)
goto cleanup;
info->username = g_strdup (g_hash_table_lookup (responses, GINT_TO_POINTER (local)));
if (!info->username)
goto cleanup;
g_hash_table_remove (responses, GINT_TO_POINTER (local));
if ((sok_addr = g_socket_connection_get_remote_address (info->conn, NULL)))
{
GInetAddress *inet_addr;
gchar *addr;
g_strlcat (buf, "ERROR : INVALID-PORT\r\n", sizeof (buf));
g_debug ("Identd: Recieved invalid port");
}
else
{
info->username = g_hash_table_lookup (responses, GINT_TO_POINTER (local));
if (!info->username)
{
g_strlcat (buf, "ERROR : NO-USER\r\n", sizeof (buf));
g_debug ("Identd: Recieved invalid local port");
}
else
{
const gsize len = strlen (buf);
inet_addr = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (sok_addr));
addr = g_inet_address_to_string (inet_addr);
g_hash_table_steal (responses, GINT_TO_POINTER (local));
hexchat_printf (ph, _("*\tServicing ident request from %s as %s"), addr, info->username);
g_snprintf (buf + len, sizeof (buf) - len, "USERID : UNIX : %s\r\n", info->username);
g_object_unref (sok_addr);
g_object_unref (inet_addr);
g_free (addr);
if ((sok_addr = g_socket_connection_get_remote_address (info->conn, NULL)))
{
GInetAddress *inet_addr;
gchar *addr;
inet_addr = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (sok_addr));
addr = g_inet_address_to_string (inet_addr);
hexchat_printf (ph, _("*\tServicing ident request from %s as %s"), addr, info->username);
g_object_unref (sok_addr);
g_object_unref (inet_addr);
g_free (addr);
}
}
}
g_snprintf (buf, sizeof (buf), "%"G_GUINT16_FORMAT", %"G_GUINT16_FORMAT" : USERID : UNIX : %s\r\n", (guint16)local, (guint16)remote, info->username);
out_stream = g_io_stream_get_output_stream (G_IO_STREAM (info->conn));
g_output_stream_write_async (out_stream, buf, strlen (buf), G_PRIORITY_DEFAULT,
NULL, (GAsyncReadyCallback)identd_write_ready, info);
@@ -148,8 +189,7 @@ identd_read_ready (GDataInputStream *in_stream, GAsyncResult *res, ident_info *i
return;
cleanup:
g_object_unref (info->conn);
g_free (info);
ident_info_free (info);
}
static gboolean
@@ -197,6 +237,7 @@ identd_start_server (void)
{
hexchat_printf (ph, _("*\tError starting identd server: %s"), error->message);
g_error_free (error);
g_clear_object (&service);
return;
}

View File

@@ -426,14 +426,14 @@ plugin_auto_load_cb (char *filename)
}
}
static char *
static const char *
plugin_get_libdir (void)
{
const char *libdir;
libdir = g_getenv ("HEXCHAT_LIBDIR");
if (libdir && *libdir)
return (char*)libdir;
return libdir;
else
return HEXCHATLIBDIR;
}
@@ -441,7 +441,7 @@ plugin_get_libdir (void)
void
plugin_auto_load (session *sess)
{
char *lib_dir;
const char *lib_dir;
char *sub_dir;
ps = sess;
@@ -455,6 +455,7 @@ plugin_auto_load (session *sess)
for_files (lib_dir, "hcdoat.dll", plugin_auto_load_cb);
for_files (lib_dir, "hcexec.dll", plugin_auto_load_cb);
for_files (lib_dir, "hcfishlim.dll", plugin_auto_load_cb);
for_files(lib_dir, "hclua.dll", plugin_auto_load_cb);
for_files (lib_dir, "hcmpcinfo.dll", plugin_auto_load_cb);
for_files (lib_dir, "hcperl.dll", plugin_auto_load_cb);
for_files (lib_dir, "hcpython2.dll", plugin_auto_load_cb);
@@ -1567,6 +1568,14 @@ hexchat_list_int (hexchat_plugin *ph, hexchat_list *xlist, const char *name)
case 0xd1b: /* id */
return ((struct session *)data)->server->id;
case 0x5cfee87: /* flags */
/* used if alert_taskbar is unset */ /* 20 */
tmp <<= 1;
tmp |= ((struct session *)data)->alert_taskbar; /* 19 */
tmp <<= 1;
/* used if alert_tray is unset */ /* 18 */
tmp <<= 1;
tmp |= ((struct session *)data)->alert_tray; /* 17 */
tmp <<= 1;
/* used if text_strip is unset */ /* 16 */
tmp <<= 1;
tmp |= ((struct session *)data)->text_strip; /* 15 */
@@ -1579,9 +1588,9 @@ hexchat_list_int (hexchat_plugin *ph, hexchat_list *xlist, const char *name)
tmp <<= 1;
tmp |= ((struct session *)data)->text_logging; /* 11 */
tmp <<= 1;
tmp |= ((struct session *)data)->alert_taskbar; /* 10 */
/* unused for historical reasons */ /* 10 */
tmp <<= 1;
tmp |= ((struct session *)data)->alert_tray; /* 9 */
/* used if alert_beep is unset */ /* 9 */
tmp <<= 1;
tmp |= ((struct session *)data)->alert_beep; /* 8 */
tmp <<= 1;

View File

@@ -1046,8 +1046,8 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
if (!serv->p_cmp (nick, serv->nick))
inbound_ujoin (serv, chan, nick, ip, tags_data);
else
inbound_join (serv, chan, nick, ip, account, realname,
tags_data);
inbound_join (serv, chan, word[1], nick, ip, account, realname,
tags_data);
}
return;
@@ -1100,7 +1100,7 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
if (!strcmp (nick, serv->nick))
inbound_upart (serv, chan, ip, reason, tags_data);
else
inbound_part (serv, chan, nick, ip, reason, tags_data);
inbound_part (serv, chan, word[1], nick, ip, reason, tags_data);
}
return;
@@ -1115,9 +1115,9 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
return;
case WORDL('Q','U','I','T'):
inbound_quit (serv, nick, ip,
(word_eol[3][0] == ':') ? word_eol[3] + 1 : word_eol[3],
tags_data);
inbound_quit (serv, word[1], nick, ip,
(word_eol[3][0] == ':') ? word_eol[3] + 1 : word_eol[3],
tags_data);
return;
case WORDL('A','W','A','Y'):
@@ -1178,13 +1178,19 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
}
#ifdef USE_OPENSSL
if (!strncmp (text, "CHALLENGE ", 10)) /* QuakeNet CHALLENGE upon our request */
/* QuakeNet CHALLENGE upon our request */
if (serv->loginmethod == LOGIN_CHALLENGEAUTH && !serv->p_cmp (word[1], CHALLENGEAUTH_FULLHOST)
&& !strncmp (text, "CHALLENGE ", 10) && *serv->password)
{
char *response = challengeauth_response (((ircnet *)serv->network)->user ? ((ircnet *)serv->network)->user : prefs.hex_irc_user_name, serv->password, word[5]);
char *response;
ircnet *net = serv->network;
char *user = net && net->user ? net->user : prefs.hex_irc_user_name;
response = challengeauth_response (user, serv->password, word[5]);
tcp_sendf (serv, "PRIVMSG %s :CHALLENGEAUTH %s %s %s\r\n",
CHALLENGEAUTH_NICK,
((ircnet *)serv->network)->user ? ((ircnet *)serv->network)->user : prefs.hex_irc_user_name,
user,
response,
CHALLENGEAUTH_ALGO);

View File

@@ -833,20 +833,21 @@ server_read_child (GIOChannel *source, GIOCondition condition, server *serv)
}
{
struct sockaddr addr;
struct sockaddr_storage addr;
int addr_len = sizeof (addr);
guint16 port;
ircnet *net = serv->network;
if (!getsockname (serv->sok, &addr, &addr_len))
if (!getsockname (serv->sok, (struct sockaddr *)&addr, &addr_len))
{
if (addr.sa_family == AF_INET)
if (addr.ss_family == AF_INET)
port = ntohs(((struct sockaddr_in *)&addr)->sin_port);
else
port = ntohs(((struct sockaddr_in6 *)&addr)->sin6_port);
g_snprintf (outbuf, sizeof (outbuf), "IDENTD %"G_GUINT16_FORMAT" ", port);
if (serv->network && ((ircnet *)serv->network)->user)
g_strlcat (outbuf, ((ircnet *)serv->network)->user, sizeof (outbuf));
if (net && net->user && !(net->flags & FLAG_USE_GLOBAL))
g_strlcat (outbuf, net->user, sizeof (outbuf));
else
g_strlcat (outbuf, prefs.hex_irc_user_name, sizeof (outbuf));
@@ -1728,7 +1729,8 @@ server_set_defaults (server *serv)
serv->nick_modes = g_strdup ("ohv");
serv->sasl_mech = MECH_PLAIN;
server_set_encoding (serv, "UTF-8");
if (!serv->encoding)
server_set_encoding (serv, "UTF-8");
serv->nickcount = 1;
serv->end_of_motd = FALSE;

View File

@@ -117,7 +117,7 @@ static const struct defaultserver def[] =
/* Self signed */
{0, "irc.criten.net"},
{"DALnet", 0},
{"DALnet", 0, 0, 0, LOGIN_NICKSERV},
/* Self signed */
{0, "us.dal.net"},
@@ -189,6 +189,12 @@ static const struct defaultserver def[] =
{0, "irc.gimp.org"},
{0, "irc.gnome.org"},
{"GlobalGamers", 0},
#ifdef USE_OPENSSL
{0, "irc.globalgamers.net/+6660"},
#endif
{0, "irc.globalgamers.net"},
{"Hashmark", 0},
{0, "irc.hashmark.net"},
@@ -266,7 +272,8 @@ static const struct defaultserver def[] =
{"PonyChat", 0, 0, 0, LOGIN_SASL, 0, TRUE},
{0, "irc.ponychat.net"},
{"PTNet.org", 0, 0, "ISO-8859-1"},
{"PTNet.org", 0},
/* Note that the network suggests ISO-8859-1 but most users ignore this */
{0, "uevora.ptnet.org"},
{0, "vianetworks.ptnet.org"},
@@ -357,42 +364,6 @@ static const struct defaultserver def[] =
GSList *network_list = 0;
#if !GLIB_CHECK_VERSION(2,34,0)
#define g_slist_copy_deep servlist_slist_copy_deep
/* FIXME copy-paste from gslist.c, should be dumped sometime */
static GSList*
servlist_slist_copy_deep (GSList *list, GCopyFunc func, gpointer user_data)
{
GSList *new_list = NULL;
if (list)
{
GSList *last;
new_list = g_slice_new (GSList);
if (func)
new_list->data = func (list->data, user_data);
else
new_list->data = list->data;
last = new_list;
list = list->next;
while (list)
{
last->next = g_slice_new (GSList);
last = last->next;
if (func)
last->data = func (list->data, user_data);
else
last->data = list->data;
list = list->next;
}
last->next = NULL;
}
return new_list;
}
#endif
favchannel *
servlist_favchan_copy (favchannel *fav)
{
@@ -714,8 +685,19 @@ servlist_net_find_from_server (char *server_name)
slist = net->servlist;
while (slist)
{
gsize hostname_len;
const char *hostname, *p;
serv = slist->data;
if (g_ascii_strcasecmp (serv->hostname, server_name) == 0)
hostname = serv->hostname;
/* Ignore port when comparing */
if ((p = strchr (hostname, '/')))
hostname_len = p - hostname;
else
hostname_len = strlen (hostname);
if (g_ascii_strncasecmp (hostname, server_name, hostname_len) == 0)
return net;
slist = slist->next;
}

View File

@@ -82,6 +82,7 @@ extern GSList *network_list;
#define CHALLENGEAUTH_ALGO "HMAC-SHA-256"
#define CHALLENGEAUTH_NICK "Q@CServe.quakenet.org"
#define CHALLENGEAUTH_FULLHOST "Q!TheQBot@CServe.quakenet.org"
/* DEFAULT_CHARSET is already defined in wingdi.h */
#define IRC_DEFAULT_CHARSET "UTF-8 (Unicode)"

View File

@@ -222,7 +222,7 @@ scrollback_load (session *sess)
GDataInputStream *istream;
gchar *buf, *text;
gint lines = 0;
time_t stamp;
time_t stamp = 0;
if (sess->text_scrollback == SET_DEFAULT)
{
@@ -272,12 +272,19 @@ scrollback_load (session *sess)
* Some don't even have a timestamp
* Some don't have any text at all
*/
if (buf[0] == 'T')
if (buf[0] == 'T' && buf[1] == ' ')
{
if (sizeof (time_t) == 4)
stamp = g_ascii_strtoull (buf + 2, NULL, 10);
stamp = strtoul (buf + 2, NULL, 10);
else
stamp = g_ascii_strtoull (buf + 2, NULL, 10); /* in case time_t is 64 bits */
if (G_UNLIKELY(stamp == 0))
{
g_warning ("Invalid timestamp in scrollback file");
continue;
}
text = strchr (buf + 3, ' ');
if (text && text[1])
{
@@ -314,7 +321,7 @@ scrollback_load (session *sess)
/* If its only an encoding error it may be specific to the line */
if (g_error_matches (err, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE))
{
g_warning ("Invalid utf8 in scrollback file\n");
g_warning ("Invalid utf8 in scrollback file");
g_clear_error (&err);
continue;
}
@@ -336,8 +343,7 @@ scrollback_load (session *sess)
if (lines)
{
text = ctime (&stamp);
text[24] = 0; /* get rid of the \n */
buf = g_strdup_printf ("\n*\t%s %s\n\n", _("Loaded log from"), text);
buf = g_strdup_printf ("\n*\t%s %s\n", _("Loaded log from"), text);
fe_print_text (sess, buf, 0, TRUE);
g_free (buf);
/*EMIT_SIGNAL (XP_TE_GENMSG, sess, "*", buf, NULL, NULL, NULL, 0);*/

View File

@@ -469,7 +469,7 @@ pevt_generic_none_help
Ignore Header
XP_TE_IGNOREHEADER
pevt_generic_none_help
%C16,17 Hostmask PRIV NOTI CHAN CTCP DCC INVI UNIG
%C16,17 Hostmask PRIV NOTI CHAN CTCP DCC INVI UNIG JOINS_PARTS
0
Ignore Remove

View File

@@ -533,6 +533,7 @@ struct
{ "spotify", "", URI_PATH },
{ "lastfm", "/", URI_PATH },
{ "xfire", "", URI_PATH },
{ "ts3server", "", URI_PATH },
{ NULL, "", 0}
};

View File

@@ -634,7 +634,7 @@ break_while:
}
void
for_files (char *dirname, char *mask, void callback (char *file))
for_files (const char *dirname, const char *mask, void callback (char *file))
{
GDir *dir;
const gchar *entry_name;
@@ -1414,6 +1414,21 @@ str_sha256hash (char *string)
return g_strdup (buf);
}
static char *
rfc_strlower (const char *str)
{
size_t i, len = strlen(str);
char *lower = g_new(char, len + 1);
for (i = 0; i < len; ++i)
{
lower[i] = rfc_tolower(str[i]);
}
lower[i] = '\0';
return lower;
}
/**
* \brief Generate CHALLENGEAUTH response for QuakeNet login.
*
@@ -1430,7 +1445,7 @@ str_sha256hash (char *string)
* <a href="http://stackoverflow.com/questions/242665/understanding-engine-initialization-in-openssl">example 2</a>.
*/
char *
challengeauth_response (char *username, char *password, char *challenge)
challengeauth_response (const char *username, const char *password, const char *challenge)
{
int i;
char *user;
@@ -1441,8 +1456,7 @@ challengeauth_response (char *username, char *password, char *challenge)
unsigned char *digest;
GString *buf = g_string_new_len (NULL, SHA256_DIGEST_LENGTH * 2);
user = g_strdup (username);
*user = rfc_tolower (*username); /* convert username to lowercase as per the RFC */
user = rfc_strlower (username); /* convert username to lowercase as per the RFC */
pass = g_strndup (password, 10); /* truncate to 10 characters */
passhash = str_sha256hash (pass);

View File

@@ -41,7 +41,7 @@ char *expand_homedir (char *file);
void path_part (char *file, char *path, int pathlen);
int match (const char *mask, const char *string);
char *file_part (char *file);
void for_files (char *dirname, char *mask, void callback (char *file));
void for_files (const char *dirname, const char *mask, void callback (char *file));
int rfc_casecmp (const char *, const char *);
int rfc_ncasecmp (char *, char *, int);
int buf_get_line (char *, char **, int *, int len);
@@ -76,7 +76,7 @@ void canonalize_key (char *key);
int portable_mode (void);
int unity_mode (void);
char *encode_sasl_pass_plain (char *user, char *pass);
char *challengeauth_response (char *username, char *password, char *challenge);
char *challengeauth_response (const char *username, const char *password, const char *challenge);
size_t strftime_validated (char *dest, size_t destsize, const char *format, const struct tm *time);
gsize strftime_utf8 (char *dest, gsize destsize, const char *format, time_t time);
#endif

View File

@@ -809,7 +809,7 @@ banlist_opengui (struct session *sess)
sess->server->servername);
banl->window = mg_create_generic_tab ("BanList", tbuf, FALSE,
TRUE, banlist_closegui, banl, 550, 200, &vbox, sess->server);
TRUE, banlist_closegui, banl, 700, 300, &vbox, sess->server);
gtkutil_destroy_on_esc (banl->window);
gtk_container_set_border_width (GTK_CONTAINER (banl->window), 3);

View File

@@ -685,6 +685,8 @@ gtkutil_treeview_new (GtkWidget *box, GtkTreeModel *model,
attr, col_id, NULL);
}
gtk_tree_view_append_column (GTK_TREE_VIEW (view), col);
if (title == NULL)
gtk_tree_view_column_set_visible (col, FALSE);
}
va_end (args);

View File

@@ -40,6 +40,7 @@ enum
CTCP_COLUMN,
DCC_COLUMN,
INVITE_COLUMN,
JOINS_PARTS_COLUMN,
UNIGNORE_COLUMN,
N_COLUMNS
};
@@ -58,14 +59,23 @@ get_store (void)
return gtk_tree_view_get_model (g_object_get_data (G_OBJECT (ignorewin), "view"));
}
static int
static unsigned int
ignore_get_flags (GtkTreeModel *model, GtkTreeIter *iter)
{
gboolean chan, priv, noti, ctcp, dcc, invi, unig;
int flags = 0;
gboolean chan, priv, noti, ctcp, dcc, invi, joins_parts, unig;
unsigned int flags = 0;
gtk_tree_model_get (model, iter, 1, &chan, 2, &priv, 3, &noti,
4, &ctcp, 5, &dcc, 6, &invi, 7, &unig, -1);
gtk_tree_model_get (
model, iter,
CHAN_COLUMN, &chan,
PRIV_COLUMN, &priv,
NOTICE_COLUMN, &noti,
CTCP_COLUMN, &ctcp,
DCC_COLUMN, &dcc,
INVITE_COLUMN, &invi,
JOINS_PARTS_COLUMN, &joins_parts,
UNIGNORE_COLUMN, &unig,
-1);
if (chan)
flags |= IG_CHAN;
if (priv)
@@ -78,6 +88,8 @@ ignore_get_flags (GtkTreeModel *model, GtkTreeIter *iter)
flags |= IG_DCC;
if (invi)
flags |= IG_INVI;
if (joins_parts)
flags |= IG_JOINS_PARTS;
if (unig)
flags |= IG_UNIG;
return flags;
@@ -89,11 +101,11 @@ mask_edited (GtkCellRendererText *render, gchar *path, gchar *new, gpointer dat)
GtkListStore *store = GTK_LIST_STORE (get_store ());
GtkTreeIter iter;
char *old;
int flags;
unsigned int flags;
gtkutil_treemodel_string_to_iter (GTK_TREE_MODEL (store), path, &iter);
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &old, -1);
if (!strcmp (old, new)) /* no change */
;
else if (ignore_exists (new)) /* duplicate, ignore */
@@ -109,7 +121,6 @@ mask_edited (GtkCellRendererText *render, gchar *path, gchar *new, gpointer dat)
gtk_list_store_set (store, &iter, MASK_COLUMN, new, -1);
}
g_free (old);
}
static void
@@ -120,7 +131,7 @@ option_toggled (GtkCellRendererToggle *render, gchar *path, gpointer data)
int col_id = GPOINTER_TO_INT (data);
gboolean active;
char *mask;
int flags;
unsigned int flags;
gtkutil_treemodel_string_to_iter (GTK_TREE_MODEL (store), path, &iter);
@@ -162,6 +173,7 @@ ignore_treeview_new (GtkWidget *box)
CTCP_COLUMN, _("CTCP"),
DCC_COLUMN, _("DCC"),
INVITE_COLUMN, _("Invite"),
JOINS_PARTS_COLUMN, _("Joins & Parts"),
UNIGNORE_COLUMN, _("Unignore"),
-1);
@@ -233,7 +245,7 @@ ignore_store_new (int cancel, char *mask, gpointer data)
GtkListStore *store = GTK_LIST_STORE (get_store ());
GtkTreeIter iter;
GtkTreePath *path;
int flags = IG_CHAN | IG_PRIV | IG_NOTI | IG_CTCP | IG_DCC | IG_INVI;
unsigned int flags = IG_CHAN | IG_PRIV | IG_NOTI | IG_CTCP | IG_DCC | IG_INVI | IG_JOINS_PARTS;
if (cancel)
return;
@@ -248,8 +260,18 @@ ignore_store_new (int cancel, char *mask, gpointer data)
gtk_list_store_append (store, &iter);
/* ignore everything by default */
gtk_list_store_set (store, &iter, 0, mask, 1, TRUE, 2, TRUE, 3, TRUE,
4, TRUE, 5, TRUE, 6, TRUE, 7, FALSE, -1);
gtk_list_store_set (
store, &iter,
MASK_COLUMN, mask,
CHAN_COLUMN, TRUE,
PRIV_COLUMN, TRUE,
NOTICE_COLUMN, TRUE,
CTCP_COLUMN, TRUE,
DCC_COLUMN, TRUE,
INVITE_COLUMN, TRUE,
JOINS_PARTS_COLUMN, TRUE,
UNIGNORE_COLUMN, FALSE,
-1);
/* make sure the new row is visible and selected */
path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
gtk_tree_view_scroll_to_cell (view, path, NULL, TRUE, 1.0, 0.0);
@@ -338,7 +360,7 @@ ignore_gui_open ()
GtkTreeIter iter;
GSList *temp = ignore_list;
char *mask;
gboolean private, chan, notice, ctcp, dcc, invite, unignore;
gboolean private, chan, notice, ctcp, dcc, invite, joins_parts, unignore;
if (ignorewin)
{
@@ -349,7 +371,7 @@ ignore_gui_open ()
ignorewin =
mg_create_generic_tab ("IgnoreList", _(DISPLAY_NAME": Ignore list"),
FALSE, TRUE, close_ignore_gui_callback,
NULL, 600, 256, &vbox, 0);
NULL, 700, 300, &vbox, 0);
gtkutil_destroy_on_esc (ignorewin);
view = ignore_treeview_new (vbox);
@@ -397,6 +419,7 @@ ignore_gui_open ()
ctcp = (ignore->type & IG_CTCP);
dcc = (ignore->type & IG_DCC);
invite = (ignore->type & IG_INVI);
joins_parts = (ignore->type & IG_JOINS_PARTS);
unignore = (ignore->type & IG_UNIG);
gtk_list_store_append (store, &iter);
@@ -408,6 +431,7 @@ ignore_gui_open ()
CTCP_COLUMN, ctcp,
DCC_COLUMN, dcc,
INVITE_COLUMN, invite,
JOINS_PARTS_COLUMN, joins_parts,
UNIGNORE_COLUMN, unignore,
-1);

View File

@@ -1514,7 +1514,7 @@ mg_set_guint8 (GtkCheckMenuItem *item, guint8 *setting)
log_open_or_close (sess);
chanopt_save (sess);
chanopt_save_all ();
chanopt_save_all (FALSE);
}
static void

View File

@@ -20,6 +20,10 @@
#include <glib.h>
#include <libnotify/notify.h>
#ifndef NOTIFY_CHECK_VERSION
#define NOTIFY_CHECK_VERSION(x,y,z) 0
#endif
static gboolean strip_markup = FALSE;
void
@@ -30,8 +34,16 @@ notification_backend_show (const char *title, const char *text)
if (strip_markup)
text = g_markup_escape_text (text, -1);
#if NOTIFY_CHECK_VERSION(0,7,0)
notification = notify_notification_new (title, text, "hexchat");
#else
notification = notify_notification_new (title, text, "hexchat", NULL);
#endif
#if NOTIFY_CHECK_VERSION(0,6,0)
notify_notification_set_hint (notification, "desktop-entry", g_variant_new_string ("hexchat"));
#else
notify_notification_set_hint_string (notification, "desktop-entry", "hexchat");
#endif
notify_notification_show (notification, NULL);
@@ -45,9 +57,6 @@ notification_backend_init (void)
{
GList* server_caps;
if (!NOTIFY_CHECK_VERSION (0, 7, 0))
return 0;
if (!notify_init (PACKAGE_NAME))
return 0;

View File

@@ -42,6 +42,7 @@ enum
VERSION_COLUMN,
FILE_COLUMN,
DESC_COLUMN,
FILEPATH_COLUMN,
N_COLUMNS
};
@@ -57,13 +58,14 @@ plugingui_treeview_new (GtkWidget *box)
int col_id;
store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING);
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
g_return_val_if_fail (store != NULL, NULL);
view = gtkutil_treeview_new (box, GTK_TREE_MODEL (store), NULL,
NAME_COLUMN, _("Name"),
VERSION_COLUMN, _("Version"),
FILE_COLUMN, _("File"),
DESC_COLUMN, _("Description"), -1);
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++)
@@ -86,7 +88,7 @@ plugingui_getfilename (GtkTreeView *view)
sel = gtk_tree_view_get_selection (view);
if (gtk_tree_selection_get_selected (sel, &model, &iter))
{
gtk_tree_model_get_value (model, &iter, FILE_COLUMN, &file);
gtk_tree_model_get_value (model, &iter, FILEPATH_COLUMN, &file);
str = g_value_dup_string (&file);
g_value_unset (&file);
@@ -131,7 +133,8 @@ fe_pluginlist_update (void)
gtk_list_store_set (store, &iter, NAME_COLUMN, pl->name,
VERSION_COLUMN, pl->version,
FILE_COLUMN, file_part (pl->filename),
DESC_COLUMN, pl->desc, -1);
DESC_COLUMN, pl->desc,
FILEPATH_COLUMN, pl->filename, -1);
}
list = list->next;
}
@@ -179,7 +182,7 @@ plugingui_unload (GtkWidget * wid, gpointer unused)
view = g_object_get_data (G_OBJECT (plugin_window), "view");
if (!gtkutil_treeview_get_selected (view, &iter, NAME_COLUMN, &modname,
FILE_COLUMN, &file, -1))
FILEPATH_COLUMN, &file, -1))
return;
if (g_str_has_suffix (file, "."G_MODULE_SUFFIX))
@@ -236,7 +239,7 @@ plugingui_open (void)
plugin_window = mg_create_generic_tab ("Addons", _(DISPLAY_NAME": Plugins and Scripts"),
FALSE, TRUE, plugingui_close, NULL,
500, 250, &vbox, 0);
700, 300, &vbox, 0);
gtkutil_destroy_on_esc (plugin_window);
view = plugingui_treeview_new (vbox);

View File

@@ -1319,7 +1319,7 @@ servlist_sanitize_hostname (char *host)
if (c && c == e)
*c = '/';
return ret;
return g_strstrip(ret);
}
/* remove leading slash */
@@ -2198,6 +2198,10 @@ servlist_open_networks (void)
g_signal_connect (G_OBJECT (entry_nick2), "changed",
G_CALLBACK(servlist_nick_changed_cb), button_connect);
/* Run validity checks now */
servlist_nick_changed_cb (GTK_ENTRY(entry_nick2), button_connect);
servlist_username_changed_cb (GTK_ENTRY(entry_guser), button_connect);
gtk_label_set_mnemonic_widget (GTK_LABEL (label3), entry1);
gtk_label_set_mnemonic_widget (GTK_LABEL (label6), entry4);
/* gtk_label_set_mnemonic_widget (GTK_LABEL (label7), entry5); */

View File

@@ -1410,7 +1410,7 @@ sexy_spell_entry_activate_language(SexySpellEntry *entry, const gchar *lang, GEr
g_return_val_if_fail(entry != NULL, FALSE);
g_return_val_if_fail(SEXY_IS_SPELL_ENTRY(entry), FALSE);
g_return_val_if_fail(lang != NULL && lang != '\0', FALSE);
g_return_val_if_fail(lang != NULL && *lang != '\0', FALSE);
if (!have_enchant)
return FALSE;

View File

@@ -41,6 +41,7 @@
<None Include="$(DepsRoot)\bin\iconv.dll" />
<None Include="$(DepsRoot)\bin\libeay32.dll" />
<None Include="$(DepsRoot)\bin\libenchant.dll" />
<None Include="$(DepsRoot)\bin\libffi.dll" />
<None Include="$(DepsRoot)\bin\libintl.dll" />
<None Include="$(DepsRoot)\bin\libpng16.dll" />
<None Include="$(DepsRoot)\bin\libxml2.dll" />
@@ -56,7 +57,15 @@
<None Include="changelog.url" />
<None Include="readme.url" />
<Engines Include="$(DepsRoot)\lib\gtk-2.0\i686-pc-vs10\engines\**\*" />
<None Include="$(DepsRoot)\bin\lua51.dll" />
<None Include="$(DepsRoot)\bin\girepository-1.0.dll" />
<LuaLib Include="$(DepsRoot)\lib\lua\**\*.dll" />
<LuaShare Include="$(DepsRoot)\share\lua\*.lua" />
<LuaShare Include="$(DepsRoot)\share\lua\**\*.lua" />
<LuaShare Include="$(DepsRoot)\share\lua\**\**\*.lua" />
<Typelib Include="$(DepsRoot)\lib\girepository-1.0\*.typelib" />
<Engines Include="$(DepsRoot)\lib\gtk-2.0\i686-pc-vs14\engines\**\*" />
<Share Include="share\**\*" />
@@ -69,7 +78,7 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Target Name="Build">
<Copy SourceFiles="@(None)" DestinationFolder="$(HexChatRel)" />
<Copy SourceFiles="@(Engines)" DestinationFiles="@(Engines->'$(HexChatRel)\lib\gtk-2.0\i686-pc-vs10\engines\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(Engines)" DestinationFiles="@(Engines->'$(HexChatRel)\lib\gtk-2.0\i686-pc-vs14\engines\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(Share)" DestinationFiles="@(Share->'$(HexChatRel)\share\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(DepsRootDocs)" DestinationFiles="@(DepsRootDocs->'$(HexChatRel)\share\doc\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="..\..\COPYING" DestinationFolder="$(HexChatRel)\share\doc\hexchat" />
@@ -77,7 +86,10 @@
<Copy SourceFiles="$(DepsRoot)\lib\enchant\libenchant_myspell.dll" DestinationFolder="$(HexChatRel)\lib\enchant" />
<Copy SourceFiles="@(Locale)" DestinationFiles="@(Locale->'$(HexChatRel)\share\locale\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(MSWindowsTheme)" DestinationFiles="@(MSWindowsTheme->'$(HexChatRel)\share\themes\MS-Windows\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(LuaShare)" DestinationFiles="@(LuaShare->'$(HexChatRel)\share\lua\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(LuaLib)" DestinationFiles="@(LuaLib->'$(HexChatRel)\lib\lua\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(Typelib)" DestinationFiles="@(Typelib->'$(HexChatRel)\lib\girepository-1.0\%(Filename)%(Extension)')" />
<WriteLinesToFile File="$(HexChatRel)portable-mode" Lines="2" Overwrite="true" />
</Target>
</Project>

View File

@@ -9,7 +9,7 @@
<YourMsgfmtPath>c:\gtk-build\msgfmt</YourMsgfmtPath>
<YourPerlPath>c:\gtk-build\perl-5.20</YourPerlPath>
<YourPython2Path>c:\gtk-build\python-2.7</YourPython2Path>
<YourPython3Path>c:\gtk-build\python-3.4</YourPython3Path>
<YourPython3Path>c:\gtk-build\python-3.5</YourPython3Path>
<YourWinSparklePath>c:\gtk-build\WinSparkle</YourWinSparklePath>
<!-- YOU SHOULDN'T TOUCH ANYTHING BELOW -->
@@ -27,8 +27,11 @@
<Python2Lib>python27</Python2Lib>
<Python2Output>hcpython2</Python2Output>
<Python3Path>$(YourPython3Path)\$(PlatformName)</Python3Path>
<Python3Lib>python34</Python3Lib>
<Python3Lib>python35</Python3Lib>
<Python3Output>hcpython3</Python3Output>
<LuaInclude>$(DepsRoot)\include\luajit-2.0</LuaInclude>
<LuaOutput>hclua</LuaOutput>
<LuaLib>lua51</LuaLib>
<Glib>$(DepsRoot)\include\glib-2.0;$(DepsRoot)\lib\glib-2.0\include;$(DepsRoot)\include\libxml2</Glib>
<Gtk>$(DepsRoot)\include\gtk-2.0;$(DepsRoot)\lib\gtk-2.0\include;$(DepsRoot)\include\atk-1.0;$(DepsRoot)\include\cairo;$(DepsRoot)\include\pango-1.0;$(DepsRoot)\include\gdk-pixbuf-2.0</Gtk>
<DepLibs>gtk-win32-2.0.lib;gdk-win32-2.0.lib;atk-1.0.lib;gio-2.0.lib;gdk_pixbuf-2.0.lib;pangowin32-1.0.lib;pangocairo-1.0.lib;pango-1.0.lib;cairo.lib;gobject-2.0.lib;gmodule-2.0.lib;glib-2.0.lib;libintl.lib;libxml2.lib;libeay32.lib;ssleay32.lib;wininet.lib;winmm.lib;ws2_32.lib</DepLibs>

View File

@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.30501.0
# Visual Studio 14
VisualStudioVersion = 14.0.25123.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "..\src\common\common.vcxproj", "{87554B59-006C-4D94-9714-897B27067BA3}"
ProjectSection(ProjectDependencies) = postProject
@@ -89,6 +89,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "installer", "installer\inst
{BF0EBC16-68AD-4CD1-864C-5B56836EBE2A} = {BF0EBC16-68AD-4CD1-864C-5B56836EBE2A}
{4980AF24-9D42-427D-A8E6-0DF3B97C455D} = {4980AF24-9D42-427D-A8E6-0DF3B97C455D}
{17E4BE39-76F7-4A06-AD21-EFD0C5091F76} = {17E4BE39-76F7-4A06-AD21-EFD0C5091F76}
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4} = {4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}
{B10A2C41-344C-43E0-A32D-B9587C198D8B} = {B10A2C41-344C-43E0-A32D-B9587C198D8B}
{461DC24A-A410-4171-8C02-CCDBF3702C2A} = {461DC24A-A410-4171-8C02-CCDBF3702C2A}
{E93E1255-95D1-4B08-8FDF-B53CC6A21280} = {E93E1255-95D1-4B08-8FDF-B53CC6A21280}
@@ -131,6 +132,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libenchant_win8", "..\src\l
{87554B59-006C-4D94-9714-897B27067BA3} = {87554B59-006C-4D94-9714-897B27067BA3}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua", "..\plugins\lua\lua.vcxproj", "{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|Win32 = Release|Win32
@@ -221,6 +224,10 @@ Global
{BF0EBC16-68AD-4CD1-864C-5B56836EBE2A}.Release|Win32.Build.0 = Release|Win32
{BF0EBC16-68AD-4CD1-864C-5B56836EBE2A}.Release|x64.ActiveCfg = Release|x64
{BF0EBC16-68AD-4CD1-864C-5B56836EBE2A}.Release|x64.Build.0 = Release|x64
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}.Release|Win32.ActiveCfg = Release|Win32
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}.Release|Win32.Build.0 = Release|Win32
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}.Release|x64.ActiveCfg = Release|x64
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -247,5 +254,6 @@ Global
{C2321A03-0BA7-45B3-8740-ABD82B36B0BF} = {D237DA6B-BD5F-46C0-8BEA-50E9A1340240}
{C53145CC-D021-40C9-B97C-0249AB9A43C9} = {561126F4-FA18-45FC-A2BF-8F858F161D6D}
{BF0EBC16-68AD-4CD1-864C-5B56836EBE2A} = {021EC1D0-FF67-4700-9AB2-EAABF1159C09}
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4} = {D237DA6B-BD5F-46C0-8BEA-50E9A1340240}
EndGlobalSection
EndGlobal

View File

@@ -64,7 +64,7 @@ Name: "translations"; Description: "Translations"; Types: normal custom; Flags:
Name: "spell"; Description: "Spelling Dictionaries"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins"; Description: "Plugins"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins\checksum"; Description: "Checksum"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins\doat"; Description: "Do At"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins\doat"; Description: "Do At"; Types: normal custom; Flags: disablenouninstallwarning
Name: "plugins\exec"; Description: "Exec"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins\fishlim"; Description: "FiSHLiM"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins\mpcinfo"; Description: "mpcInfo"; Types: custom; Flags: disablenouninstallwarning
@@ -72,10 +72,11 @@ Name: "plugins\sysinfo"; Description: "SysInfo"; Types: custom; Flags: disableno
Name: "plugins\upd"; Description: "Update Checker"; Types: normal custom; Flags: disablenouninstallwarning
Name: "plugins\winamp"; Description: "Winamp"; Types: custom; Flags: disablenouninstallwarning
Name: "langs"; Description: "Language Interfaces"; Types: custom; Flags: disablenouninstallwarning
Name: "langs\lua"; Description: "Lua"; Types: normal custom; Flags: disablenouninstallwarning
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.4)"; Types: custom; Flags: disablenouninstallwarning exclusive
Name: "langs\python\python3"; Description: "Python (requires Python 3.5)"; Types: custom; Flags: disablenouninstallwarning exclusive
[Tasks]
Name: portable; Description: "Yes"; GroupDescription: "Portable Mode: Stores configuration files within install directory for portable drives."; Flags: unchecked
@@ -102,6 +103,7 @@ Filename: "{tmp}\vcredist.exe"; Parameters: "/install /quiet /norestart"; Status
Filename: "{tmp}\dotnet4.exe"; Parameters: "/q /norestart"; StatusMsg: "Installing .NET"; Components: xtm; Flags: skipifdoesntexist; Tasks: not portable
Filename: "{tmp}\perl.msi"; StatusMsg: "Installing Perl"; Components: langs\perl; Flags: shellexec skipifdoesntexist; Tasks: not portable
Filename: "{tmp}\python.msi"; StatusMsg: "Installing Python"; Components: langs\python; Flags: shellexec skipifdoesntexist; Tasks: not portable
Filename: "{tmp}\python.exe"; Parameters: "InstallAllUsers=1 PrependPath=1"; StatusMsg: "Installing Python"; Components: langs\python; Flags: shellexec skipifdoesntexist; Tasks: not portable
Filename: "{tmp}\spelling-dicts.exe"; Parameters: "/verysilent"; StatusMsg: "Installing Spelling Dictionaries"; Components: spell; Flags: skipifdoesntexist; Tasks: not portable
[Files]
@@ -137,6 +139,7 @@ Source: "harfbuzz.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "iconv.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libeay32.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libenchant.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libffi.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libintl.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libpng16.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libxml2.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
@@ -152,7 +155,15 @@ Source: "plugins\hcnotifications-winrt.dll"; DestDir: "{app}\plugins"; Flags: ig
Source: "lib\enchant\*"; DestDir: "{app}\lib\enchant"; Flags: ignoreversion; Components: libs
Source: "lib\gtk-2.0\i686-pc-vs10\engines\*"; DestDir: "{app}\lib\gtk-2.0\i686-pc-vs10\engines"; Flags: ignoreversion; Components: libs
Source: "lib\gtk-2.0\i686-pc-vs14\engines\*"; DestDir: "{app}\lib\gtk-2.0\i686-pc-vs14\engines"; Flags: ignoreversion; Components: libs
Source: "girepository-1.0.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: langs\lua
Source: "lua51.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: langs\lua
Source: "lib\lua\lgi\*.dll"; DestDir: "{app}\lib\lua\lgi"; Flags: ignoreversion; Components: langs\lua
Source: "lib\girepository-1.0\*.typelib"; DestDir: "{app}\lib\girepository-1.0"; Flags: ignoreversion; Components: langs\lua
Source: "share\lua\*.lua"; DestDir: "{app}\share\lua"; Flags: ignoreversion; Components: langs\lua
Source: "share\lua\lgi\*.lua"; DestDir: "{app}\share\lua\lgi"; Flags: ignoreversion; Components: langs\lua
Source: "share\lua\lgi\override\*.lua"; DestDir: "{app}\share\lua\lgi\override"; Flags: ignoreversion; Components: langs\lua
Source: "plugins\hcchecksum.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\checksum
Source: "plugins\hcdoat.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\doat
@@ -170,6 +181,7 @@ Source: "plugins\hcsysinfo.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion;
Source: "plugins\hcpython2.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: langs\python\python2
Source: "plugins\hcpython3.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: langs\python\python3
Source: "plugins\hcperl.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: langs\perl
Source: "plugins\hclua.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: langs\lua
Source: "hexchat.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "hexchat-text.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: xctext
@@ -270,13 +282,13 @@ begin
#if APPARCH == "x64"
REDIST := 'https://dl.hexchat.net/misc/vcredist_2015_x64.exe';
PERL := 'https://dl.hexchat.net/misc/perl/Perl%205.20.0%20x64.msi';
PY2 := 'http://python.org/ftp/python/2.7.8/python-2.7.8.amd64.msi';
PY3 := 'http://python.org/ftp/python/3.4.1/python-3.4.1.amd64.msi';
PY2 := 'https://python.org/ftp/python/2.7.10/python-2.7.10.amd64.msi';
PY3 := 'https://python.org/ftp/python/3.5.1/python-3.5.1-amd64.exe';
#else
REDIST := 'https://dl.hexchat.net/misc/vcredist_2015_x86.exe';
PERL := 'https://dl.hexchat.net/misc/perl/Perl%205.20.0%20x86.msi';
PY2 := 'http://python.org/ftp/python/2.7.8/python-2.7.8.msi';
PY3 := 'http://python.org/ftp/python/3.4.1/python-3.4.1.msi';
PY2 := 'https://python.org/ftp/python/2.7.10/python-2.7.10.msi';
PY3 := 'https://python.org/ftp/python/3.5.1/python-3.5.1.exe';
#endif
DOTNET := 'https://dl.hexchat.net/misc/dotnet_40.exe';
SPELL := 'https://dl.hexchat.net/hexchat/HexChat%20Spelling%20Dictionaries%20r2.exe';
@@ -298,8 +310,8 @@ 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('python34.dll') then
idpAddFile(PY3, ExpandConstant('{tmp}\python.msi'));
if IsComponentSelected('langs\python\python3') and not CheckDLL('python35.dll') then
idpAddFile(PY3, ExpandConstant('{tmp}\python.exe'));
end;
end;
end;

View File

@@ -1 +1 @@
2.10.2
2.12.1-2