Compare commits
29 Commits
54f80a8ee8
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 51e9ac15df | |||
|
|
4df579e0d3 | ||
| 2cf69d2e67 | |||
|
|
64bffd0dc8 | ||
|
|
b451240dfd | ||
| 41cc1f617f | |||
| ed671eac25 | |||
| 9f2529adb6 | |||
|
|
3903d7b9e5 | ||
| ec4d698021 | |||
|
|
da06c71389 | ||
| 0f508bf438 | |||
| 97dd7c5d57 | |||
|
|
78219bf9e1 | ||
|
|
1c30cbfab1 | ||
| ac33dc5250 | |||
| 8de5db18d6 | |||
|
|
913aa49df4 | ||
| 5e4633ee53 | |||
|
|
30e573d87a | ||
| 9e91d60bb1 | |||
|
|
069652a5f1 | ||
|
|
ab1e25bfb1 | ||
|
|
862aa0ede5 | ||
| f75c27c843 | |||
| 687b5fb40d | |||
| bb36651548 | |||
| 65a2702294 | |||
| 94bcb57118 |
6
.github/workflows/appimage-build.yml
vendored
@@ -37,11 +37,7 @@ jobs:
|
|||||||
libluajit-5.1-dev libpci-dev libperl-dev libssl-dev libayatana-appindicator3-dev \
|
libluajit-5.1-dev libpci-dev libperl-dev libssl-dev libayatana-appindicator3-dev \
|
||||||
perl python3 python3-minimal python3-dev python3-cffi mono-devel desktop-file-utils \
|
perl python3 python3-minimal python3-dev python3-cffi mono-devel desktop-file-utils \
|
||||||
fonts-noto-color-emoji breeze-gtk-theme \
|
fonts-noto-color-emoji breeze-gtk-theme \
|
||||||
patchelf file curl imagemagick
|
patchelf file curl
|
||||||
if ! command -v magick >/dev/null 2>&1 && command -v convert >/dev/null 2>&1; then
|
|
||||||
printf '%s\n' '#!/bin/sh' 'exec convert "$@"' | sudo tee /usr/local/bin/magick >/dev/null
|
|
||||||
sudo chmod +x /usr/local/bin/magick
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Configure
|
- name: Configure
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
7
.github/workflows/manjaro-package-build.yml
vendored
@@ -41,12 +41,7 @@ jobs:
|
|||||||
perl \
|
perl \
|
||||||
python \
|
python \
|
||||||
python-cffi \
|
python-cffi \
|
||||||
pciutils \
|
pciutils
|
||||||
imagemagick
|
|
||||||
if ! command -v magick >/dev/null 2>&1 && command -v convert >/dev/null 2>&1; then
|
|
||||||
printf '%s\n' '#!/bin/sh' 'exec convert "$@"' > /usr/local/bin/magick
|
|
||||||
chmod +x /usr/local/bin/magick
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v5
|
||||||
|
|||||||
7
.github/workflows/windows-build.yml
vendored
@@ -39,13 +39,6 @@ jobs:
|
|||||||
python -m pip install --upgrade pip
|
python -m pip install --upgrade pip
|
||||||
python -m pip install cffi
|
python -m pip install cffi
|
||||||
python -m pip install zstandard
|
python -m pip install zstandard
|
||||||
choco install imagemagick -y --no-progress
|
|
||||||
if (-not (Get-Command magick -ErrorAction SilentlyContinue)) {
|
|
||||||
$magickDir = Get-ChildItem 'C:\Program Files\ImageMagick-*' -Directory -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | Select-Object -First 1
|
|
||||||
if ($magickDir) {
|
|
||||||
$magickDir.FullName | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$ProgressPreference = 'SilentlyContinue'
|
$ProgressPreference = 'SilentlyContinue'
|
||||||
function Download-WithRetry {
|
function Download-WithRetry {
|
||||||
|
|||||||
@@ -1,6 +1,30 @@
|
|||||||
ZoiteChat ChangeLog
|
ZoiteChat ChangeLog
|
||||||
=================
|
=================
|
||||||
|
|
||||||
|
2.18.0~pre6 (2026-03-30)
|
||||||
|
|
||||||
|
- Applied app theme CSS to the menubar consistently across the app.
|
||||||
|
- Restored horizontal separator lines in menus.
|
||||||
|
- Improved Windows installer VC++ redistributable handling by failing loudly when missing and using the official Microsoft download endpoint.
|
||||||
|
- Fixed Windows locale path resolution in both GTK and text frontends.
|
||||||
|
- Fixed duplicate dialog buttons persisting in the UI.
|
||||||
|
- Fixed GTK auto-replace cursor snapback.
|
||||||
|
- Restored hiding of formatting control bytes so only formatted output is shown.
|
||||||
|
- Added one-click client SSL certificate tools, including generation with P-256 certificates.
|
||||||
|
- Added client SSL certificate import support in the network editor.
|
||||||
|
- Added 99-color support.
|
||||||
|
- Fixed xtext link hit-testing coordinates.
|
||||||
|
- Fixed short-palette fallback clobbering tab colors.
|
||||||
|
- Lazy-loads Preferences pages on first open for faster dialog startup.
|
||||||
|
- Removed unused UI icons.
|
||||||
|
- Added a None option for resetting the GTK3 theme back to system/default behavior.
|
||||||
|
- Added channel-only mode to Ctrl+F search.
|
||||||
|
- Disabled disk info in sysinfo.
|
||||||
|
- Wrapped the topic bar in a scroller with bounded height.
|
||||||
|
- Added close buttons to tabs.
|
||||||
|
- Fixed fallback GTK menu highlight states.
|
||||||
|
- Applied configured font preferences to the topic bar, channel tree, user list, and input box.
|
||||||
|
|
||||||
2.18.0~pre5 (2026-03-22)
|
2.18.0~pre5 (2026-03-22)
|
||||||
------------------------
|
------------------------
|
||||||
- Overhauled preferences/config saving: fully staged and transactional, debounced
|
- Overhauled preferences/config saving: fully staged and transactional, debounced
|
||||||
|
|||||||
@@ -1,120 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import argparse
|
|
||||||
import contextlib
|
|
||||||
import pathlib
|
|
||||||
import shutil
|
|
||||||
import subprocess
|
|
||||||
import tempfile
|
|
||||||
|
|
||||||
SIZES = [16, 24, 32, 40, 48, 64, 96, 128, 256]
|
|
||||||
|
|
||||||
|
|
||||||
def run(cmd):
|
|
||||||
subprocess.run(cmd, check=True)
|
|
||||||
|
|
||||||
|
|
||||||
def try_run(cmd):
|
|
||||||
result = subprocess.run(cmd, text=True, capture_output=True)
|
|
||||||
return result.returncode == 0, result.stderr.strip()
|
|
||||||
|
|
||||||
|
|
||||||
def magick_cmd():
|
|
||||||
magick = shutil.which('magick')
|
|
||||||
if not magick:
|
|
||||||
raise RuntimeError('missing tool: install ImageMagick (magick)')
|
|
||||||
return magick
|
|
||||||
|
|
||||||
|
|
||||||
@contextlib.contextmanager
|
|
||||||
def magick_svg(svg):
|
|
||||||
text = pathlib.Path(svg).read_text(encoding='utf-8')
|
|
||||||
fixed = text.replace('href="image/', 'href="data:image/')
|
|
||||||
fixed = fixed.replace('xlink:href="image/', 'xlink:href="data:image/')
|
|
||||||
if fixed == text:
|
|
||||||
yield str(svg)
|
|
||||||
return
|
|
||||||
with tempfile.NamedTemporaryFile('w', suffix='.svg', delete=False, encoding='utf-8') as tmp:
|
|
||||||
tmp.write(fixed)
|
|
||||||
tmp_path = tmp.name
|
|
||||||
try:
|
|
||||||
yield tmp_path
|
|
||||||
finally:
|
|
||||||
pathlib.Path(tmp_path).unlink(missing_ok=True)
|
|
||||||
|
|
||||||
|
|
||||||
def render_png(svg, out_png, size):
|
|
||||||
errors = []
|
|
||||||
rsvg = shutil.which('rsvg-convert')
|
|
||||||
if rsvg:
|
|
||||||
ok, err = try_run([rsvg, '-w', str(size), '-h', str(size), '-o', str(out_png), str(svg)])
|
|
||||||
if ok:
|
|
||||||
return
|
|
||||||
errors.append(err)
|
|
||||||
inkscape = shutil.which('inkscape')
|
|
||||||
if inkscape:
|
|
||||||
ok, err = try_run([
|
|
||||||
inkscape,
|
|
||||||
str(svg),
|
|
||||||
'--export-type=png',
|
|
||||||
'--export-width',
|
|
||||||
str(size),
|
|
||||||
'--export-height',
|
|
||||||
str(size),
|
|
||||||
'--export-filename',
|
|
||||||
str(out_png),
|
|
||||||
])
|
|
||||||
if ok:
|
|
||||||
return
|
|
||||||
errors.append(err)
|
|
||||||
with magick_svg(svg) as svg_for_magick:
|
|
||||||
ok, err = try_run([
|
|
||||||
magick_cmd(),
|
|
||||||
svg_for_magick,
|
|
||||||
'-background',
|
|
||||||
'none',
|
|
||||||
'-resize',
|
|
||||||
f'{size}x{size}',
|
|
||||||
str(out_png),
|
|
||||||
])
|
|
||||||
if ok:
|
|
||||||
return
|
|
||||||
errors.append(err)
|
|
||||||
raise RuntimeError('failed to render png: ' + ' | '.join(e for e in errors if e))
|
|
||||||
|
|
||||||
|
|
||||||
def build_ico(svg, out_ico):
|
|
||||||
with magick_svg(svg) as svg_for_magick:
|
|
||||||
run([
|
|
||||||
magick_cmd(),
|
|
||||||
svg_for_magick,
|
|
||||||
'-background',
|
|
||||||
'none',
|
|
||||||
'-define',
|
|
||||||
'icon:auto-resize=' + ','.join(str(size) for size in SIZES),
|
|
||||||
str(out_ico),
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
def parse_args():
|
|
||||||
parser = argparse.ArgumentParser(prog='generate_icons.py')
|
|
||||||
parser.add_argument('input_svg')
|
|
||||||
parser.add_argument('output_png')
|
|
||||||
parser.add_argument('--ico', dest='output_ico')
|
|
||||||
parser.add_argument('--size', type=int, default=48)
|
|
||||||
return parser.parse_args()
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
args = parse_args()
|
|
||||||
svg = pathlib.Path(args.input_svg)
|
|
||||||
out_png = pathlib.Path(args.output_png)
|
|
||||||
out_png.parent.mkdir(parents=True, exist_ok=True)
|
|
||||||
render_png(svg, out_png, args.size)
|
|
||||||
if args.output_ico:
|
|
||||||
out_ico = pathlib.Path(args.output_ico)
|
|
||||||
out_ico.parent.mkdir(parents=True, exist_ok=True)
|
|
||||||
build_ico(svg, out_ico)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
@@ -1,24 +1,9 @@
|
|||||||
icon_gen = find_program('generate_icons.py')
|
|
||||||
find_program('magick', required: host_machine.system() == 'windows')
|
|
||||||
|
|
||||||
icondir = join_paths(get_option('datadir'), 'icons/hicolor')
|
icondir = join_paths(get_option('datadir'), 'icons/hicolor')
|
||||||
custom_target('zoitechat_png',
|
install_data(
|
||||||
input: 'zoitechat.svg',
|
'zoitechat.png',
|
||||||
output: 'net.zoite.Zoitechat.png',
|
rename: 'net.zoite.Zoitechat.png',
|
||||||
command: [icon_gen, '@INPUT@', '@OUTPUT@', '--size', '48'],
|
install_dir: join_paths(icondir, '48x48/apps')
|
||||||
install: true,
|
|
||||||
install_dir: join_paths(icondir, '48x48/apps'),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if host_machine.system() == 'windows'
|
|
||||||
custom_target('zoitechat_ico',
|
|
||||||
input: 'zoitechat.svg',
|
|
||||||
output: 'zoitechat.ico',
|
|
||||||
command: [icon_gen, '@INPUT@', '@PRIVATE_DIR@/zoitechat.png', '--size', '48', '--ico', '@OUTPUT@'],
|
|
||||||
build_by_default: true,
|
|
||||||
)
|
|
||||||
endif
|
|
||||||
|
|
||||||
install_data(
|
install_data(
|
||||||
'zoitechat.svg',
|
'zoitechat.svg',
|
||||||
rename: 'net.zoite.Zoitechat.svg',
|
rename: 'net.zoite.Zoitechat.svg',
|
||||||
|
|||||||
16
data/icons/zoitechat-b.svg
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
version="1.1"
|
||||||
|
width="0.213333in" height="0.213333in"
|
||||||
|
viewBox="0 0 64 64">
|
||||||
|
<defs>
|
||||||
|
</defs>
|
||||||
|
<image id="raster0"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="64"
|
||||||
|
height="64"
|
||||||
|
opacity="1.000000"
|
||||||
|
href="data:image/png;base64,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" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.8 KiB |
16
data/icons/zoitechat-shadowless.svg
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
version="1.1"
|
||||||
|
width="0.213333in" height="0.213333in"
|
||||||
|
viewBox="0 0 64 64">
|
||||||
|
<defs>
|
||||||
|
</defs>
|
||||||
|
<image id="raster0"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="64"
|
||||||
|
height="64"
|
||||||
|
opacity="1.000000"
|
||||||
|
href="data:image/png;base64,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" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.8 KiB |
BIN
data/icons/zoitechat.ico
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
data/icons/zoitechat.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 12 KiB |
@@ -4,7 +4,7 @@
|
|||||||
<extends>net.zoite.Zoitechat</extends>
|
<extends>net.zoite.Zoitechat</extends>
|
||||||
<name>@NAME@ Plugin</name>
|
<name>@NAME@ Plugin</name>
|
||||||
<summary>@SUMMARY@</summary>
|
<summary>@SUMMARY@</summary>
|
||||||
<url type="homepage">https://zoitechat.zoite.net/</url>
|
<url type="homepage">https://zoitechat.org/</url>
|
||||||
<project_license>@LICENSE@</project_license>
|
<project_license>@LICENSE@</project_license>
|
||||||
<metadata_license>CC0-1.0</metadata_license>
|
<metadata_license>CC0-1.0</metadata_license>
|
||||||
<update_contact>deepend_AT_zoite.net</update_contact>
|
<update_contact>deepend_AT_zoite.net</update_contact>
|
||||||
|
|||||||
@@ -16,12 +16,12 @@
|
|||||||
<p>ZoiteChat is an easy to use yet extensible IRC Client based on Hexchat. It allows you to securely join multiple networks and talk to users privately or in channels using a customizable interface. You can even transfer files.</p>
|
<p>ZoiteChat is an easy to use yet extensible IRC Client based on Hexchat. It allows you to securely join multiple networks and talk to users privately or in channels using a customizable interface. You can even transfer files.</p>
|
||||||
<p>ZoiteChat supports features such as: DCC, SASL, proxies, spellcheck, alerts, logging, custom themes, and Python/Perl scripts.</p>
|
<p>ZoiteChat supports features such as: DCC, SASL, proxies, spellcheck, alerts, logging, custom themes, and Python/Perl scripts.</p>
|
||||||
</description>
|
</description>
|
||||||
<url type="homepage">https://zoitechat.zoite.net</url>
|
<url type="homepage">https://zoitechat.org</url>
|
||||||
<url type="bugtracker">https://github.com/zoitechat/zoitechat</url>
|
<url type="bugtracker">https://github.com/zoitechat/zoitechat</url>
|
||||||
<url type="help">https://docs.zoitechat.zoite.net/en/latest/</url>
|
<url type="help">https://docs.zoitechat.org/en/latest/</url>
|
||||||
<screenshots>
|
<screenshots>
|
||||||
<screenshot type="default">
|
<screenshot type="default">
|
||||||
<image>https://zoitechat.zoite.net/assets/ZoiteChat.png</image>
|
<image>https://zoitechat.org/assets/ZoiteChat.png</image>
|
||||||
<caption>Main Chat Window</caption>
|
<caption>Main Chat Window</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
</screenshots>
|
</screenshots>
|
||||||
@@ -29,6 +29,46 @@
|
|||||||
<id>zoitechat.desktop</id>
|
<id>zoitechat.desktop</id>
|
||||||
</provides>
|
</provides>
|
||||||
<releases>
|
<releases>
|
||||||
|
<release date="2026-03-30" version="2.18.0~pre6">
|
||||||
|
<description>
|
||||||
|
<p>GTK theme and UI:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Applied app theme CSS to the menubar consistently across the app.</li>
|
||||||
|
<li>Restored horizontal separator lines in menus.</li>
|
||||||
|
<li>Fixed duplicate dialog buttons persisting in the UI.</li>
|
||||||
|
<li>Fixed GTK auto-replace cursor snapback.</li>
|
||||||
|
<li>Restored hiding of formatting control bytes so only formatted output is shown.</li>
|
||||||
|
<li>Fixed xtext link hit-testing coordinates.</li>
|
||||||
|
<li>Fixed short-palette fallback clobbering tab colors.</li>
|
||||||
|
<li>Added a None option for resetting the GTK3 theme back to system/default behavior.</li>
|
||||||
|
<li>Wrapped the topic bar in a scroller with bounded height.</li>
|
||||||
|
<li>Fixed fallback GTK menu highlight states.</li>
|
||||||
|
<li>Applied configured font preferences to the topic bar, channel tree, user list, and input box.</li>
|
||||||
|
<li>Removed unused UI icons.</li>
|
||||||
|
<li>Added close buttons to tabs.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Preferences and search:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Lazy-loads Preferences pages on first open for faster dialog startup.</li>
|
||||||
|
<li>Added channel-only mode to Ctrl+F search.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Security and certificates:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added one-click client SSL certificate tools, including generation with P-256 certificates.</li>
|
||||||
|
<li>Added client SSL certificate import support in the network editor.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Windows and packaging:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Improved Windows installer VC++ redistributable handling by failing loudly when missing and using the official Microsoft download endpoint.</li>
|
||||||
|
<li>Fixed Windows locale path resolution in both GTK and text frontends.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Other changes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added 99-color support.</li>
|
||||||
|
<li>Disabled disk info in sysinfo.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
<release date="2026-03-22" version="2.18.0~pre5">
|
<release date="2026-03-22" version="2.18.0~pre5">
|
||||||
<description>
|
<description>
|
||||||
<p>Preferences and config saving:</p>
|
<p>Preferences and config saving:</p>
|
||||||
@@ -60,14 +100,6 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</description>
|
</description>
|
||||||
</release>
|
</release>
|
||||||
<release date="2026-03-22" version="2.18.0~pre5">
|
|
||||||
<description>
|
|
||||||
<p>Version metadata update:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Bumped release version references to <code>2.18.0~pre5</code> across build and packaging files.</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
<release date="2026-03-14" version="2.18.0~pre4">
|
<release date="2026-03-14" version="2.18.0~pre4">
|
||||||
<description>
|
<description>
|
||||||
<p>UI fixes, topic bar improvements, and selection styling updates:</p>
|
<p>UI fixes, topic bar improvements, and selection styling updates:</p>
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<gresources>
|
|
||||||
<gresource prefix="/icons">
|
|
||||||
<file alias="zoitechat.png" preprocess="to-pixdata">@ZOITECHAT_PNG@</file>
|
|
||||||
<file alias="zoitechat.svg">icons/zoitechat.svg</file>
|
|
||||||
<file alias="book.png" preprocess="to-pixdata">icons/book.png</file>
|
|
||||||
|
|
||||||
<file alias="ulist_voice.png" preprocess="to-pixdata">icons/ulist_voice.png</file>
|
|
||||||
<file alias="ulist_halfop.png" preprocess="to-pixdata">icons/ulist_halfop.png</file>
|
|
||||||
<file alias="ulist_op.png" preprocess="to-pixdata">icons/ulist_op.png</file>
|
|
||||||
<file alias="ulist_owner.png" preprocess="to-pixdata">icons/ulist_owner.png</file>
|
|
||||||
<file alias="ulist_founder.png" preprocess="to-pixdata">icons/ulist_founder.png</file>
|
|
||||||
<file alias="ulist_netop.png" preprocess="to-pixdata">icons/ulist_netop.png</file>
|
|
||||||
|
|
||||||
<file alias="tray_normal.png" preprocess="to-pixdata">@ZOITECHAT_PNG@</file>
|
|
||||||
<file alias="tray_fileoffer.png" preprocess="to-pixdata">icons/tray_fileoffer.png</file>
|
|
||||||
<file alias="tray_highlight.png" preprocess="to-pixdata">icons/tray_highlight.png</file>
|
|
||||||
<file alias="tray_message.png" preprocess="to-pixdata">icons/tray_message.png</file>
|
|
||||||
|
|
||||||
<file alias="tree_channel.png" preprocess="to-pixdata">icons/tree_channel.png</file>
|
|
||||||
<file alias="tree_dialog.png" preprocess="to-pixdata">icons/tree_dialog.png</file>
|
|
||||||
<file alias="tree_server.png" preprocess="to-pixdata">icons/tree_server.png</file>
|
|
||||||
<file alias="tree_util.png" preprocess="to-pixdata">icons/tree_util.png</file>
|
|
||||||
|
|
||||||
|
|
||||||
</gresource>
|
|
||||||
</gresources>
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
project('zoitechat', 'c',
|
project('zoitechat', 'c',
|
||||||
version: '2.18.0~pre5',
|
version: '2.18.0~pre6',
|
||||||
meson_version: '>= 0.55.0',
|
meson_version: '>= 0.55.0',
|
||||||
default_options: [
|
default_options: [
|
||||||
'c_std=c17',
|
'c_std=c17',
|
||||||
|
|||||||
@@ -1457,14 +1457,14 @@ perl_load_file (char *filename)
|
|||||||
"You must have a Visual C++ build of Perl "
|
"You must have a Visual C++ build of Perl "
|
||||||
PERL_REQUIRED_VERSION " installed in order to\n"
|
PERL_REQUIRED_VERSION " installed in order to\n"
|
||||||
"run Perl scripts. A reboot may be required.\n\n"
|
"run Perl scripts. A reboot may be required.\n\n"
|
||||||
"http://zoitechat.zoite.net/downloads.html\n\n"
|
"http://zoitechat.org/downloads.html\n\n"
|
||||||
"I have found Perl 5.6, but that is too old.");
|
"I have found Perl 5.6, but that is too old.");
|
||||||
} else {
|
} else {
|
||||||
thread_mbox ("Cannot open " PERL_DLL "!\n\n"
|
thread_mbox ("Cannot open " PERL_DLL "!\n\n"
|
||||||
"You must have a Visual C++ build of Perl "
|
"You must have a Visual C++ build of Perl "
|
||||||
PERL_REQUIRED_VERSION " installed in order to\n"
|
PERL_REQUIRED_VERSION " installed in order to\n"
|
||||||
"run Perl scripts. A reboot may be required.\n\n"
|
"run Perl scripts. A reboot may be required.\n\n"
|
||||||
"http://zoitechat.zoite.net/downloads.html\n\n"
|
"http://zoitechat.org/downloads.html\n\n"
|
||||||
"Make sure Perl's bin directory is in your PATH.");
|
"Make sure Perl's bin directory is in your PATH.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ else:
|
|||||||
if not hasattr(sys, 'argv'):
|
if not hasattr(sys, 'argv'):
|
||||||
sys.argv = ['<zoitechat>']
|
sys.argv = ['<zoitechat>']
|
||||||
|
|
||||||
VERSION = b'2.18.0~pre5'
|
VERSION = b'2.18.0~pre6'
|
||||||
PLUGIN_NAME = ffi.new('char[]', b'Python')
|
PLUGIN_NAME = ffi.new('char[]', b'Python')
|
||||||
PLUGIN_DESC = ffi.new('char[]', b'Python %d.%d scripting interface' % (sys.version_info[0], sys.version_info[1]))
|
PLUGIN_DESC = ffi.new('char[]', b'Python %d.%d scripting interface' % (sys.version_info[0], sys.version_info[1]))
|
||||||
PLUGIN_VERSION = ffi.new('char[]', VERSION)
|
PLUGIN_VERSION = ffi.new('char[]', VERSION)
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ static zoitechat_plugin *ph;
|
|||||||
static char name[] = "Sysinfo";
|
static char name[] = "Sysinfo";
|
||||||
static char desc[] = "Display info about your hardware and OS";
|
static char desc[] = "Display info about your hardware and OS";
|
||||||
static char version[] = "1.0";
|
static char version[] = "1.0";
|
||||||
static char sysinfo_help[] = "SysInfo Usage:\n /SYSINFO [-e|-o] [CLIENT|UI|OS|CPU|RAM|DISK|GPU|CHIPSET|SOUND|ETHERNET|UPTIME], print various details about your system or print a summary without arguments\n /SYSINFO SET <variable>\n";
|
static char sysinfo_help[] = "SysInfo Usage:\n /SYSINFO [-e|-o] [CLIENT|UI|OS|CPU|RAM|STORAGE|GPU|CHIPSET|SOUND|ETHERNET|UPTIME], print various details about your system or print a summary without arguments\n /SYSINFO SET <variable>\n";
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -68,7 +68,7 @@ static hwinfo hwinfos[] = {
|
|||||||
{"os", "OS", sysinfo_backend_get_os},
|
{"os", "OS", sysinfo_backend_get_os},
|
||||||
{"cpu", "CPU", sysinfo_backend_get_cpu},
|
{"cpu", "CPU", sysinfo_backend_get_cpu},
|
||||||
{"memory", "Memory", sysinfo_backend_get_memory},
|
{"memory", "Memory", sysinfo_backend_get_memory},
|
||||||
{"storage", "Storage", sysinfo_backend_get_disk},
|
{"storage", "Storage", sysinfo_backend_get_disk, TRUE},
|
||||||
{"gpu", "GPU", sysinfo_backend_get_gpu},
|
{"gpu", "GPU", sysinfo_backend_get_gpu},
|
||||||
{"chipset", "CHIPSET", sysinfo_backend_get_chipset, TRUE},
|
{"chipset", "CHIPSET", sysinfo_backend_get_chipset, TRUE},
|
||||||
{"sound", "Sound", sysinfo_backend_get_sound, TRUE},
|
{"sound", "Sound", sysinfo_backend_get_sound, TRUE},
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "zoitechat-plugin.h"
|
#include "zoitechat-plugin.h"
|
||||||
|
|
||||||
#define APPCAST_URL "https://zoitechat.zoite.net/appcast.xml"
|
#define APPCAST_URL "https://zoitechat.org/appcast.xml"
|
||||||
|
|
||||||
static zoitechat_plugin *ph;
|
static zoitechat_plugin *ph;
|
||||||
static char name[] = "Update Checker";
|
static char name[] = "Update Checker";
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
[![Version][github-version-img]][github-version-uri] [![Downloads][github-downloads-img]][github-downloads-uri] [![Size][github-size-img]][github-size-img] [![Last Commit][github-commit-img]][github-commit-img] [![Contributors][contribs-all-img]](#contributors-)
|
[![Version][github-version-img]][github-version-uri] [![Downloads][github-downloads-img]][github-downloads-uri] [![Size][github-size-img]][github-size-img] [![Last Commit][github-commit-img]][github-commit-img] [![Contributors][contribs-all-img]](#contributors-)
|
||||||
|
|
||||||
[](https://docs.zoitechat.zoite.net)
|
[](https://docs.zoitechat.org)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -33,8 +33,8 @@
|
|||||||
|
|
||||||
ZoiteChat is an HexChat based IRC client for Windows and UNIX-like operating systems.
|
ZoiteChat is an HexChat based IRC client for Windows and UNIX-like operating systems.
|
||||||
See [IRCHelp.org](http://irchelp.org) for information about IRC in general.
|
See [IRCHelp.org](http://irchelp.org) for information about IRC in general.
|
||||||
For more information on ZoiteChat please read our [documentation](https://docs.zoitechat.zoite.net/):
|
For more information on ZoiteChat please read our [documentation](https://docs.zoitechat.org/):
|
||||||
- [Downloads](https://zoitechat.zoite.net/download)
|
- [Downloads](https://zoitechat.org/download)
|
||||||
|
|
||||||
- [Troubleshooting](troubleshooting.md)
|
- [Troubleshooting](troubleshooting.md)
|
||||||
|
|
||||||
|
|||||||
@@ -445,6 +445,7 @@ const struct prefs vars[] =
|
|||||||
{"gui_dark_mode", P_OFFINT (hex_gui_dark_mode), TYPE_INT},
|
{"gui_dark_mode", P_OFFINT (hex_gui_dark_mode), TYPE_INT},
|
||||||
{"gui_gtk3_variant", P_OFFINT (hex_gui_gtk3_variant), TYPE_INT},
|
{"gui_gtk3_variant", P_OFFINT (hex_gui_gtk3_variant), TYPE_INT},
|
||||||
{"gui_tab_layout", P_OFFINT (hex_gui_tab_layout), TYPE_INT},
|
{"gui_tab_layout", P_OFFINT (hex_gui_tab_layout), TYPE_INT},
|
||||||
|
{"gui_tab_closebuttons", P_OFFINT (hex_gui_tab_closebuttons), TYPE_BOOL},
|
||||||
{"gui_tab_middleclose", P_OFFINT (hex_gui_tab_middleclose), TYPE_BOOL},
|
{"gui_tab_middleclose", P_OFFINT (hex_gui_tab_middleclose), TYPE_BOOL},
|
||||||
{"gui_tab_newtofront", P_OFFINT (hex_gui_tab_newtofront), TYPE_INT},
|
{"gui_tab_newtofront", P_OFFINT (hex_gui_tab_newtofront), TYPE_INT},
|
||||||
{"gui_tab_pos", P_OFFINT (hex_gui_tab_pos), TYPE_INT},
|
{"gui_tab_pos", P_OFFINT (hex_gui_tab_pos), TYPE_INT},
|
||||||
@@ -777,6 +778,7 @@ load_default_config(void)
|
|||||||
prefs.hex_gui_tab_chans = 1;
|
prefs.hex_gui_tab_chans = 1;
|
||||||
prefs.hex_gui_tab_dialogs = 1;
|
prefs.hex_gui_tab_dialogs = 1;
|
||||||
prefs.hex_gui_tab_icons = 1;
|
prefs.hex_gui_tab_icons = 1;
|
||||||
|
prefs.hex_gui_tab_closebuttons = 1;
|
||||||
prefs.hex_gui_tab_middleclose = 1;
|
prefs.hex_gui_tab_middleclose = 1;
|
||||||
prefs.hex_gui_tab_server = 1;
|
prefs.hex_gui_tab_server = 1;
|
||||||
prefs.hex_gui_tab_sort = 1;
|
prefs.hex_gui_tab_sort = 1;
|
||||||
|
|||||||
@@ -4070,7 +4070,7 @@ const struct commands xc_cmds[] = {
|
|||||||
{"ME", cmd_me, 0, 0, 1,
|
{"ME", cmd_me, 0, 0, 1,
|
||||||
N_("ME <action>, sends the action to the current channel (actions are written in the 3rd person, like /me jumps)")},
|
N_("ME <action>, sends the action to the current channel (actions are written in the 3rd person, like /me jumps)")},
|
||||||
{"MENU", cmd_menu, 0, 0, 1, "MENU [-eX] [-i<ICONFILE>] [-k<mod>,<key>] [-m] [-pX] [-r<X,group>] [-tX] {ADD|DEL} <path> [command] [unselect command]\n"
|
{"MENU", cmd_menu, 0, 0, 1, "MENU [-eX] [-i<ICONFILE>] [-k<mod>,<key>] [-m] [-pX] [-r<X,group>] [-tX] {ADD|DEL} <path> [command] [unselect command]\n"
|
||||||
" See https://docs.zoitechat.zoite.net/en/latest/en/latest/plugins.html#controlling-the-gui for more details."},
|
" See https://docs.zoitechat.org/en/latest/en/latest/plugins.html#controlling-the-gui for more details."},
|
||||||
{"MHOP", cmd_mhop, 1, 1, 1,
|
{"MHOP", cmd_mhop, 1, 1, 1,
|
||||||
N_("MHOP, Mass hop's all users in the current channel (needs chanop)")},
|
N_("MHOP, Mass hop's all users in the current channel (needs chanop)")},
|
||||||
{"MKICK", cmd_mkick, 1, 1, 1,
|
{"MKICK", cmd_mkick, 1, 1, 1,
|
||||||
|
|||||||
@@ -265,6 +265,7 @@ struct zoitechatprefs
|
|||||||
int hex_gui_search_pos;
|
int hex_gui_search_pos;
|
||||||
int hex_gui_slist_select;
|
int hex_gui_slist_select;
|
||||||
int hex_gui_tab_layout;
|
int hex_gui_tab_layout;
|
||||||
|
int hex_gui_tab_closebuttons;
|
||||||
int hex_gui_tab_middleclose;
|
int hex_gui_tab_middleclose;
|
||||||
int hex_gui_tab_newtofront;
|
int hex_gui_tab_newtofront;
|
||||||
int hex_gui_tab_pos;
|
int hex_gui_tab_pos;
|
||||||
|
|||||||
@@ -27,8 +27,6 @@ typedef struct
|
|||||||
GtkWidget *b2; /* button2 */
|
GtkWidget *b2; /* button2 */
|
||||||
} tabview;
|
} tabview;
|
||||||
|
|
||||||
#define ICON_CHANVIEW_CLOSE "gtk-close"
|
|
||||||
|
|
||||||
static void chanview_populate (chanview *cv);
|
static void chanview_populate (chanview *cv);
|
||||||
|
|
||||||
/* ignore "toggled" signal? */
|
/* ignore "toggled" signal? */
|
||||||
@@ -334,12 +332,6 @@ tab_scroll_cb (GtkWidget *widget, GdkEventScroll *event, gpointer cv)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
cv_tabs_xclick_cb (GtkWidget *button, chanview *cv)
|
|
||||||
{
|
|
||||||
cv->cb_xbutton (cv, cv->focused, cv->focused->tag, cv->focused->userdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* make a Scroll (arrow) button */
|
/* make a Scroll (arrow) button */
|
||||||
|
|
||||||
static GtkWidget *
|
static GtkWidget *
|
||||||
@@ -384,7 +376,6 @@ cv_tabs_init (chanview *cv)
|
|||||||
GtkWidget *box, *hbox = NULL;
|
GtkWidget *box, *hbox = NULL;
|
||||||
GtkWidget *viewport;
|
GtkWidget *viewport;
|
||||||
GtkWidget *outer;
|
GtkWidget *outer;
|
||||||
GtkWidget *button;
|
|
||||||
|
|
||||||
if (cv->vertical)
|
if (cv->vertical)
|
||||||
{
|
{
|
||||||
@@ -451,11 +442,6 @@ cv_tabs_init (chanview *cv)
|
|||||||
gtk_box_pack_start (GTK_BOX (outer), ((tabview *)cv)->b1, 0, 0, 0);
|
gtk_box_pack_start (GTK_BOX (outer), ((tabview *)cv)->b1, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
button = gtkutil_button (outer, ICON_CHANVIEW_CLOSE, NULL, cv_tabs_xclick_cb,
|
|
||||||
cv, 0);
|
|
||||||
gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
|
|
||||||
gtk_widget_set_can_focus (button, FALSE);
|
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (cv->box), outer);
|
gtk_container_add (GTK_CONTAINER (cv->box), outer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -659,20 +645,129 @@ tab_toggled_cb (GtkToggleButton *tab, chan *ch)
|
|||||||
static gboolean
|
static gboolean
|
||||||
tab_click_cb (GtkWidget *wid, GdkEventButton *event, chan *ch)
|
tab_click_cb (GtkWidget *wid, GdkEventButton *event, chan *ch)
|
||||||
{
|
{
|
||||||
|
GtkWidget *close_button;
|
||||||
|
gint close_x;
|
||||||
|
gint close_y;
|
||||||
|
GtkAllocation close_alloc;
|
||||||
|
|
||||||
|
if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
|
||||||
|
{
|
||||||
|
close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button");
|
||||||
|
if (prefs.hex_gui_tab_closebuttons && close_button &&
|
||||||
|
gtk_widget_translate_coordinates (close_button, wid, 0, 0, &close_x, &close_y))
|
||||||
|
{
|
||||||
|
gtk_widget_get_allocation (close_button, &close_alloc);
|
||||||
|
if (event->x >= close_x && event->x < close_x + close_alloc.width &&
|
||||||
|
event->y >= close_y && event->y < close_y + close_alloc.height)
|
||||||
|
{
|
||||||
|
ch->cv->cb_xbutton (ch->cv, ch, ch->tag, ch->userdata);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ch->cv->cb_contextmenu (ch->cv, ch, ch->tag, ch->userdata, event);
|
return ch->cv->cb_contextmenu (ch->cv, ch, ch->tag, ch->userdata, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
tab_close_motion_cb (GtkWidget *wid, GdkEventMotion *event, chan *ch)
|
||||||
|
{
|
||||||
|
GtkWidget *close_button;
|
||||||
|
gint close_x;
|
||||||
|
gint close_y;
|
||||||
|
GtkAllocation close_alloc;
|
||||||
|
gboolean hover = FALSE;
|
||||||
|
|
||||||
|
close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button");
|
||||||
|
if (prefs.hex_gui_tab_closebuttons && close_button &&
|
||||||
|
gtk_widget_translate_coordinates (close_button, wid, 0, 0, &close_x, &close_y))
|
||||||
|
{
|
||||||
|
gtk_widget_get_allocation (close_button, &close_alloc);
|
||||||
|
hover = event->x >= close_x && event->x < close_x + close_alloc.width &&
|
||||||
|
event->y >= close_y && event->y < close_y + close_alloc.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hover)
|
||||||
|
{
|
||||||
|
GdkCursor *cursor;
|
||||||
|
gtk_widget_set_state_flags (close_button, GTK_STATE_FLAG_PRELIGHT, TRUE);
|
||||||
|
if (gtk_widget_get_window (wid))
|
||||||
|
{
|
||||||
|
cursor = gdk_cursor_new_for_display (gtk_widget_get_display (wid), GDK_HAND2);
|
||||||
|
gdk_window_set_cursor (gtk_widget_get_window (wid), cursor);
|
||||||
|
g_object_unref (cursor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gtk_widget_unset_state_flags (close_button, GTK_STATE_FLAG_PRELIGHT);
|
||||||
|
if (gtk_widget_get_window (wid))
|
||||||
|
gdk_window_set_cursor (gtk_widget_get_window (wid), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
tab_close_leave_cb (GtkWidget *wid, GdkEventCrossing *event, chan *ch)
|
||||||
|
{
|
||||||
|
GtkWidget *close_button;
|
||||||
|
|
||||||
|
close_button = g_object_get_data (G_OBJECT (wid), "tab-close-button");
|
||||||
|
if (prefs.hex_gui_tab_closebuttons && close_button)
|
||||||
|
gtk_widget_unset_state_flags (close_button, GTK_STATE_FLAG_PRELIGHT);
|
||||||
|
if (gtk_widget_get_window (wid))
|
||||||
|
gdk_window_set_cursor (gtk_widget_get_window (wid), NULL);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *
|
||||||
|
tab_get_label (GtkWidget *tab)
|
||||||
|
{
|
||||||
|
GtkWidget *label;
|
||||||
|
|
||||||
|
label = g_object_get_data (G_OBJECT (tab), "tab-label");
|
||||||
|
if (label)
|
||||||
|
return label;
|
||||||
|
|
||||||
|
return gtk_bin_get_child (GTK_BIN (tab));
|
||||||
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
cv_tabs_add (chanview *cv, chan *ch, char *name, GtkTreeIter *parent)
|
cv_tabs_add (chanview *cv, chan *ch, char *name, GtkTreeIter *parent)
|
||||||
{
|
{
|
||||||
GtkWidget *but;
|
GtkWidget *but;
|
||||||
|
GtkWidget *hbox;
|
||||||
|
GtkWidget *label;
|
||||||
|
GtkWidget *close_button;
|
||||||
|
GtkWidget *close_icon;
|
||||||
|
|
||||||
but = gtk_toggle_button_new_with_label (name);
|
but = gtk_toggle_button_new ();
|
||||||
gtk_widget_set_name (but, "zoitechat-tab");
|
gtk_widget_set_name (but, "zoitechat-tab");
|
||||||
|
gtk_widget_set_size_request (but, -1, 18);
|
||||||
|
gtk_widget_add_events (but, GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
|
||||||
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
|
||||||
|
label = gtk_label_new (name);
|
||||||
|
close_button = gtk_button_new ();
|
||||||
|
gtk_style_context_add_class (gtk_widget_get_style_context (close_button), "flat");
|
||||||
|
close_icon = gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_MENU);
|
||||||
|
gtk_image_set_pixel_size (GTK_IMAGE (close_icon), 8);
|
||||||
|
gtk_button_set_always_show_image (GTK_BUTTON (close_button), TRUE);
|
||||||
|
gtk_widget_set_can_focus (close_button, FALSE);
|
||||||
|
gtk_container_add (GTK_CONTAINER (close_button), close_icon);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox), close_button, FALSE, FALSE, 0);
|
||||||
|
gtk_container_add (GTK_CONTAINER (but), hbox);
|
||||||
|
g_object_set_data (G_OBJECT (but), "tab-label", label);
|
||||||
|
g_object_set_data (G_OBJECT (but), "tab-close-button", close_button);
|
||||||
g_object_set_data (G_OBJECT (but), "c", ch);
|
g_object_set_data (G_OBJECT (but), "c", ch);
|
||||||
/* used to trap right-clicks */
|
/* used to trap right-clicks */
|
||||||
g_signal_connect (G_OBJECT (but), "button-press-event",
|
g_signal_connect (G_OBJECT (but), "button-press-event",
|
||||||
G_CALLBACK (tab_click_cb), ch);
|
G_CALLBACK (tab_click_cb), ch);
|
||||||
|
g_signal_connect (G_OBJECT (but), "motion-notify-event",
|
||||||
|
G_CALLBACK (tab_close_motion_cb), ch);
|
||||||
|
g_signal_connect (G_OBJECT (but), "leave-notify-event",
|
||||||
|
G_CALLBACK (tab_close_leave_cb), ch);
|
||||||
/* avoid prelights */
|
/* avoid prelights */
|
||||||
g_signal_connect (G_OBJECT (but), "enter-notify-event",
|
g_signal_connect (G_OBJECT (but), "enter-notify-event",
|
||||||
G_CALLBACK (tab_ignore_cb), NULL);
|
G_CALLBACK (tab_ignore_cb), NULL);
|
||||||
@@ -684,6 +779,9 @@ cv_tabs_add (chanview *cv, chan *ch, char *name, GtkTreeIter *parent)
|
|||||||
g_signal_connect (G_OBJECT (but), "toggled",
|
g_signal_connect (G_OBJECT (but), "toggled",
|
||||||
G_CALLBACK (tab_toggled_cb), ch);
|
G_CALLBACK (tab_toggled_cb), ch);
|
||||||
g_object_set_data (G_OBJECT (but), "u", ch->userdata);
|
g_object_set_data (G_OBJECT (but), "u", ch->userdata);
|
||||||
|
gtk_widget_show_all (hbox);
|
||||||
|
if (!prefs.hex_gui_tab_closebuttons)
|
||||||
|
gtk_widget_hide (close_button);
|
||||||
|
|
||||||
tab_add_real (cv, but, ch);
|
tab_add_real (cv, but, ch);
|
||||||
|
|
||||||
@@ -892,7 +990,7 @@ cv_tabs_cleanup (chanview *cv)
|
|||||||
static void
|
static void
|
||||||
cv_tabs_set_color (chan *ch, PangoAttrList *list)
|
cv_tabs_set_color (chan *ch, PangoAttrList *list)
|
||||||
{
|
{
|
||||||
gtk_label_set_attributes (GTK_LABEL (gtk_bin_get_child (GTK_BIN (ch->impl))), list);
|
gtk_label_set_attributes (GTK_LABEL (tab_get_label (ch->impl)), list);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -901,16 +999,16 @@ cv_tabs_rename (chan *ch, char *name)
|
|||||||
PangoAttrList *attr;
|
PangoAttrList *attr;
|
||||||
GtkWidget *tab = ch->impl;
|
GtkWidget *tab = ch->impl;
|
||||||
|
|
||||||
attr = gtk_label_get_attributes (GTK_LABEL (gtk_bin_get_child (GTK_BIN (tab))));
|
attr = gtk_label_get_attributes (GTK_LABEL (tab_get_label (tab)));
|
||||||
if (attr)
|
if (attr)
|
||||||
pango_attr_list_ref (attr);
|
pango_attr_list_ref (attr);
|
||||||
|
|
||||||
gtk_button_set_label (GTK_BUTTON (tab), name);
|
gtk_label_set_text (GTK_LABEL (tab_get_label (tab)), name);
|
||||||
gtk_widget_queue_resize (gtk_widget_get_parent(gtk_widget_get_parent(gtk_widget_get_parent(tab))));
|
gtk_widget_queue_resize (gtk_widget_get_parent(gtk_widget_get_parent(gtk_widget_get_parent(tab))));
|
||||||
|
|
||||||
if (attr)
|
if (attr)
|
||||||
{
|
{
|
||||||
gtk_label_set_attributes (GTK_LABEL (gtk_bin_get_child (GTK_BIN (tab))), attr);
|
gtk_label_set_attributes (GTK_LABEL (tab_get_label (tab)), attr);
|
||||||
pango_attr_list_unref (attr);
|
pango_attr_list_unref (attr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1308,17 +1308,38 @@ maybe_escape_uri (const char *uri)
|
|||||||
return g_strdup (uri);
|
return g_strdup (uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
|
static gchar **
|
||||||
|
fe_open_url_env_sanitized (void)
|
||||||
|
{
|
||||||
|
gchar **env = g_get_environ ();
|
||||||
|
const char *vars[] = {"LD_LIBRARY_PATH", "LD_PRELOAD", "APPDIR", "APPIMAGE", "ARGV0", NULL};
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; vars[i]; i++)
|
||||||
|
{
|
||||||
|
gchar **tmp_env = env;
|
||||||
|
env = g_environ_unsetenv (tmp_env, vars[i]);
|
||||||
|
if (env != tmp_env)
|
||||||
|
g_strfreev (tmp_env);
|
||||||
|
}
|
||||||
|
|
||||||
|
return env;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fe_open_url_inner (const char *url)
|
fe_open_url_inner (const char *url)
|
||||||
{
|
{
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
char *escaped_url = maybe_escape_uri (url);
|
char *escaped_url = maybe_escape_uri (url);
|
||||||
gboolean opened = g_app_info_launch_default_for_uri (escaped_url, NULL, &error);
|
gboolean opened = FALSE;
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
opened = g_app_info_launch_default_for_uri (escaped_url, NULL, &error);
|
||||||
if (!opened)
|
if (!opened)
|
||||||
{
|
{
|
||||||
g_clear_error (&error);
|
g_clear_error (&error);
|
||||||
#ifdef WIN32
|
|
||||||
gunichar2 *url_utf16 = g_utf8_to_utf16 (escaped_url, -1, NULL, NULL, NULL);
|
gunichar2 *url_utf16 = g_utf8_to_utf16 (escaped_url, -1, NULL, NULL, NULL);
|
||||||
|
|
||||||
if (url_utf16 != NULL)
|
if (url_utf16 != NULL)
|
||||||
@@ -1326,22 +1347,11 @@ fe_open_url_inner (const char *url)
|
|||||||
opened = ((INT_PTR) ShellExecuteW (0, L"open", url_utf16, NULL, NULL, SW_SHOWNORMAL)) > 32;
|
opened = ((INT_PTR) ShellExecuteW (0, L"open", url_utf16, NULL, NULL, SW_SHOWNORMAL)) > 32;
|
||||||
g_free (url_utf16);
|
g_free (url_utf16);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
gchar *xdg_open_argv[] = {(gchar *) "xdg-open", escaped_url, NULL};
|
|
||||||
gchar **spawn_env = NULL;
|
|
||||||
|
|
||||||
spawn_env = g_get_environ ();
|
|
||||||
{
|
|
||||||
gchar **tmp_env = spawn_env;
|
|
||||||
spawn_env = g_environ_unsetenv (tmp_env, "LD_LIBRARY_PATH");
|
|
||||||
if (spawn_env != tmp_env)
|
|
||||||
g_strfreev (tmp_env);
|
|
||||||
|
|
||||||
tmp_env = spawn_env;
|
|
||||||
spawn_env = g_environ_unsetenv (tmp_env, "LD_PRELOAD");
|
|
||||||
if (spawn_env != tmp_env)
|
|
||||||
g_strfreev (tmp_env);
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
gchar *xdg_open_argv[] = {(gchar *) "xdg-open", escaped_url, NULL};
|
||||||
|
gchar **spawn_env = fe_open_url_env_sanitized ();
|
||||||
|
|
||||||
if (g_spawn_async (NULL, xdg_open_argv, spawn_env,
|
if (g_spawn_async (NULL, xdg_open_argv, spawn_env,
|
||||||
G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
|
G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
|
||||||
@@ -1354,6 +1364,16 @@ fe_open_url_inner (const char *url)
|
|||||||
g_clear_error (&error);
|
g_clear_error (&error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_strfreev (spawn_env);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!opened)
|
||||||
|
{
|
||||||
|
opened = g_app_info_launch_default_for_uri (escaped_url, NULL, &error);
|
||||||
|
if (!opened)
|
||||||
|
g_clear_error (&error);
|
||||||
|
}
|
||||||
|
|
||||||
if (!opened && gtk_show_uri_on_window (NULL, escaped_url, GDK_CURRENT_TIME, &error))
|
if (!opened && gtk_show_uri_on_window (NULL, escaped_url, GDK_CURRENT_TIME, &error))
|
||||||
{
|
{
|
||||||
opened = TRUE;
|
opened = TRUE;
|
||||||
@@ -1362,10 +1382,7 @@ fe_open_url_inner (const char *url)
|
|||||||
{
|
{
|
||||||
g_clear_error (&error);
|
g_clear_error (&error);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_strfreev (spawn_env);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
if (!opened)
|
if (!opened)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ SET SOLUTIONDIR=$(SolutionDir)..\
|
|||||||
powershell -File "$(SolutionDir)..\win32\version-template.ps1" "$(SolutionDir)..\src\fe-gtk\zoitechat.rc.tt" "$(ZoiteChatLib)zoitechat.rc.utf8"
|
powershell -File "$(SolutionDir)..\win32\version-template.ps1" "$(SolutionDir)..\src\fe-gtk\zoitechat.rc.tt" "$(ZoiteChatLib)zoitechat.rc.utf8"
|
||||||
REM zoitechat.rc needs to be in UCS-2 or Resource Compiler will complain
|
REM zoitechat.rc needs to be in UCS-2 or Resource Compiler will complain
|
||||||
powershell "Get-Content -Encoding UTF8 '$(ZoiteChatLib)zoitechat.rc.utf8' | Out-File '$(ZoiteChatLib)zoitechat.rc'; Remove-Item '$(ZoiteChatLib)zoitechat.rc.utf8'"
|
powershell "Get-Content -Encoding UTF8 '$(ZoiteChatLib)zoitechat.rc.utf8' | Out-File '$(ZoiteChatLib)zoitechat.rc'; Remove-Item '$(ZoiteChatLib)zoitechat.rc.utf8'"
|
||||||
"$(Python3Path)\python.exe" "$(SolutionDir)..\data\icons\generate_icons.py" "$(DataDir)icons\zoitechat.svg" "$(DataDir)icons\zoitechat.png" --size 256 --ico "$(DataDir)icons\zoitechat.ico"
|
|
||||||
"$(DepsRoot)\bin\glib-compile-resources.exe" --generate-header --manual-register --sourcedir "$(DataDir)" --target "$(ZoiteChatLib)resources.h" "$(DataDir)zoitechat.gresource.xml"
|
"$(DepsRoot)\bin\glib-compile-resources.exe" --generate-header --manual-register --sourcedir "$(DataDir)" --target "$(ZoiteChatLib)resources.h" "$(DataDir)zoitechat.gresource.xml"
|
||||||
"$(DepsRoot)\bin\glib-compile-resources.exe" --generate-source --manual-register --sourcedir "$(DataDir)" --target "$(ZoiteChatLib)resources.c" "$(DataDir)zoitechat.gresource.xml"
|
"$(DepsRoot)\bin\glib-compile-resources.exe" --generate-source --manual-register --sourcedir "$(DataDir)" --target "$(ZoiteChatLib)resources.c" "$(DataDir)zoitechat.gresource.xml"
|
||||||
]]></Command>
|
]]></Command>
|
||||||
|
|||||||
@@ -2968,10 +2968,73 @@ mg_create_dialogbuttons (GtkWidget *box)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mg_configure_topic_scroller (GtkWidget *scroller, GtkWidget *topic)
|
||||||
|
{
|
||||||
|
PangoContext *context;
|
||||||
|
PangoFontMetrics *metrics;
|
||||||
|
int line_height;
|
||||||
|
int min_height;
|
||||||
|
int max_height;
|
||||||
|
|
||||||
|
context = gtk_widget_get_pango_context (topic);
|
||||||
|
metrics = pango_context_get_metrics (context,
|
||||||
|
pango_context_get_font_description (context),
|
||||||
|
pango_context_get_language (context));
|
||||||
|
line_height = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) +
|
||||||
|
pango_font_metrics_get_descent (metrics));
|
||||||
|
pango_font_metrics_unref (metrics);
|
||||||
|
|
||||||
|
if (line_height <= 0)
|
||||||
|
line_height = 16;
|
||||||
|
|
||||||
|
min_height = line_height + 8;
|
||||||
|
max_height = line_height * 4 + 8;
|
||||||
|
|
||||||
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller),
|
||||||
|
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
||||||
|
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroller), GTK_SHADOW_NONE);
|
||||||
|
gtk_scrolled_window_set_propagate_natural_height (GTK_SCROLLED_WINDOW (scroller), TRUE);
|
||||||
|
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (scroller), min_height);
|
||||||
|
gtk_scrolled_window_set_max_content_height (GTK_SCROLLED_WINDOW (scroller), max_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mg_apply_session_font_prefs (session_gui *gui)
|
||||||
|
{
|
||||||
|
const PangoFontDescription *font = NULL;
|
||||||
|
GtkWidget *topic_scroller;
|
||||||
|
|
||||||
|
if (!gui)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (input_style)
|
||||||
|
font = input_style->font_desc;
|
||||||
|
|
||||||
|
if (gui->topic_entry)
|
||||||
|
{
|
||||||
|
theme_manager_apply_entry_palette (gui->topic_entry, font);
|
||||||
|
topic_scroller = gtk_widget_get_parent (gui->topic_entry);
|
||||||
|
if (topic_scroller && GTK_IS_SCROLLED_WINDOW (topic_scroller))
|
||||||
|
mg_configure_topic_scroller (topic_scroller, gui->topic_entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gui->input_box && prefs.hex_gui_input_style)
|
||||||
|
theme_manager_apply_entry_palette (gui->input_box, font);
|
||||||
|
|
||||||
|
if (gui->chanview)
|
||||||
|
chanview_apply_theme (gui->chanview);
|
||||||
|
|
||||||
|
if (gui->user_tree)
|
||||||
|
theme_manager_apply_userlist_style (gui->user_tree,
|
||||||
|
theme_manager_get_userlist_palette_behavior (font));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mg_create_topicbar (session *sess, GtkWidget *box)
|
mg_create_topicbar (session *sess, GtkWidget *box)
|
||||||
{
|
{
|
||||||
GtkWidget *vbox, *hbox, *mode_hbox, *topic, *bbox;
|
GtkWidget *vbox, *hbox, *mode_hbox, *topic, *bbox, *topic_scroller;
|
||||||
session_gui *gui = sess->gui;
|
session_gui *gui = sess->gui;
|
||||||
|
|
||||||
gui->topic_bar = vbox = mg_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
|
gui->topic_bar = vbox = mg_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
|
||||||
@@ -2984,12 +3047,15 @@ mg_create_topicbar (session *sess, GtkWidget *box)
|
|||||||
sess->res->tab = NULL;
|
sess->res->tab = NULL;
|
||||||
|
|
||||||
gui->topic_entry = topic = gtk_text_view_new ();
|
gui->topic_entry = topic = gtk_text_view_new ();
|
||||||
gtk_widget_set_name (topic, "zoitechat-inputbox");
|
gtk_widget_set_name (topic, "zoitechat-topicbox");
|
||||||
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (topic), GTK_WRAP_WORD_CHAR);
|
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (topic), GTK_WRAP_WORD);
|
||||||
gtk_text_view_set_left_margin (GTK_TEXT_VIEW (topic), 4);
|
gtk_text_view_set_left_margin (GTK_TEXT_VIEW (topic), 4);
|
||||||
gtk_text_view_set_right_margin (GTK_TEXT_VIEW (topic), 4);
|
gtk_text_view_set_right_margin (GTK_TEXT_VIEW (topic), 4);
|
||||||
gtk_box_pack_start (GTK_BOX (hbox), topic, TRUE, TRUE, 0);
|
topic_scroller = gtk_scrolled_window_new (NULL, NULL);
|
||||||
mg_apply_emoji_fallback_widget (topic);
|
gtk_container_add (GTK_CONTAINER (topic_scroller), topic);
|
||||||
|
theme_manager_apply_entry_palette (topic, input_style ? input_style->font_desc : NULL);
|
||||||
|
mg_configure_topic_scroller (topic_scroller, topic);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox), topic_scroller, TRUE, TRUE, 0);
|
||||||
gtk_widget_add_events (topic, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
|
gtk_widget_add_events (topic, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
|
||||||
GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
|
GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
|
||||||
g_signal_connect (G_OBJECT (topic), "key-press-event",
|
g_signal_connect (G_OBJECT (topic), "key-press-event",
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ GtkWidget *mg_create_generic_tab (char *name, char *title, int force_toplevel, i
|
|||||||
void mg_set_title (GtkWidget *button, char *title);
|
void mg_set_title (GtkWidget *button, char *title);
|
||||||
void mg_set_access_icon (session_gui *gui, GdkPixbuf *pix, gboolean away);
|
void mg_set_access_icon (session_gui *gui, GdkPixbuf *pix, gboolean away);
|
||||||
void mg_apply_setup (void);
|
void mg_apply_setup (void);
|
||||||
|
void mg_apply_session_font_prefs (session_gui *gui);
|
||||||
void mg_close_sess (session *);
|
void mg_close_sess (session *);
|
||||||
void mg_tab_close (session *sess);
|
void mg_tab_close (session *sess);
|
||||||
void mg_detach (session *sess, int mode);
|
void mg_detach (session *sess, int mode);
|
||||||
|
|||||||
@@ -1717,7 +1717,7 @@ menu_ctcpguiopen (void)
|
|||||||
static void
|
static void
|
||||||
menu_docs (GtkWidget *wid, gpointer none)
|
menu_docs (GtkWidget *wid, gpointer none)
|
||||||
{
|
{
|
||||||
fe_open_url ("https://docs.zoitechat.zoite.net/en/latest/");
|
fe_open_url ("https://docs.zoitechat.org/en/latest/");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*static void
|
/*static void
|
||||||
@@ -1862,7 +1862,7 @@ about_dialog_response (GtkDialog *dialog, int response, gpointer data)
|
|||||||
{
|
{
|
||||||
if (response == GTK_RESPONSE_HELP)
|
if (response == GTK_RESPONSE_HELP)
|
||||||
{
|
{
|
||||||
fe_open_url ("http://zoitechat.zoite.net");
|
fe_open_url ("http://zoitechat.org");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (response == GTK_RESPONSE_APPLY)
|
if (response == GTK_RESPONSE_APPLY)
|
||||||
@@ -1915,17 +1915,7 @@ menu_about (GtkWidget *wid, gpointer sess)
|
|||||||
gtk_about_dialog_set_website_label (dialog, NULL);
|
gtk_about_dialog_set_website_label (dialog, NULL);
|
||||||
gtk_about_dialog_set_license (dialog, NULL);
|
gtk_about_dialog_set_license (dialog, NULL);
|
||||||
gtk_about_dialog_set_wrap_license (dialog, FALSE);
|
gtk_about_dialog_set_wrap_license (dialog, FALSE);
|
||||||
GdkPixbuf *about_logo;
|
gtk_about_dialog_set_logo (dialog, pix_zoitechat);
|
||||||
|
|
||||||
about_logo = gdk_pixbuf_new_from_resource_at_scale ("/icons/zoitechat.svg", 48, 48, TRUE, NULL);
|
|
||||||
if (!about_logo && pix_zoitechat)
|
|
||||||
about_logo = gdk_pixbuf_scale_simple (pix_zoitechat, 48, 48, GDK_INTERP_BILINEAR);
|
|
||||||
if (about_logo || pix_zoitechat)
|
|
||||||
gtk_about_dialog_set_logo (dialog, about_logo ? about_logo : pix_zoitechat);
|
|
||||||
else
|
|
||||||
gtk_about_dialog_set_logo_icon_name (dialog, "zoitechat");
|
|
||||||
if (about_logo)
|
|
||||||
g_object_unref (about_logo);
|
|
||||||
gtk_about_dialog_set_copyright (dialog, "\302\251 1998-2010 Peter \305\275elezn\303\275\n\302\251 2009-2014 Berke Viktor\n\302\251 2015-2025 Patrick Griffis\n\302\251 2026 deepend");
|
gtk_about_dialog_set_copyright (dialog, "\302\251 1998-2010 Peter \305\275elezn\303\275\n\302\251 2009-2014 Berke Viktor\n\302\251 2015-2025 Patrick Griffis\n\302\251 2026 deepend");
|
||||||
gtk_about_dialog_set_comments (dialog, comment);
|
gtk_about_dialog_set_comments (dialog, comment);
|
||||||
actions = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
|
actions = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
|
||||||
|
|||||||
@@ -117,27 +117,9 @@ if get_option('plugin')
|
|||||||
zoitechat_gtk_sources += 'plugingui.c'
|
zoitechat_gtk_sources += 'plugingui.c'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
zoitechat_png_generated = custom_target('zoitechat_resource_png',
|
|
||||||
input: '../../data/icons/zoitechat.svg',
|
|
||||||
output: 'zoitechat.png',
|
|
||||||
command: [find_program('../../data/icons/generate_icons.py'), '@INPUT@', '@OUTPUT@', '--size', '256'],
|
|
||||||
)
|
|
||||||
|
|
||||||
zoitechat_gresource_conf = configuration_data()
|
|
||||||
zoitechat_gresource_conf.set('ZOITECHAT_PNG', 'zoitechat.png')
|
|
||||||
zoitechat_gresource_xml = configure_file(
|
|
||||||
input: '../../data/zoitechat.gresource.xml.in',
|
|
||||||
output: 'zoitechat.gresource.xml',
|
|
||||||
configuration: zoitechat_gresource_conf,
|
|
||||||
)
|
|
||||||
|
|
||||||
resources = gnome.compile_resources('resources',
|
resources = gnome.compile_resources('resources',
|
||||||
zoitechat_gresource_xml,
|
'../../data/zoitechat.gresource.xml',
|
||||||
source_dir: [
|
source_dir: '../../data',
|
||||||
meson.current_build_dir(),
|
|
||||||
'../../data',
|
|
||||||
],
|
|
||||||
dependencies: [zoitechat_png_generated],
|
|
||||||
c_name: 'zoitechat',
|
c_name: 'zoitechat',
|
||||||
extra_args: ['--manual-register']
|
extra_args: ['--manual-register']
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ static GtkWidget *edit_label_real;
|
|||||||
static GtkWidget *edit_label_user;
|
static GtkWidget *edit_label_user;
|
||||||
static GtkWidget *edit_trees[N_TREES];
|
static GtkWidget *edit_trees[N_TREES];
|
||||||
static GtkWidget *edit_button_cert_generate;
|
static GtkWidget *edit_button_cert_generate;
|
||||||
|
static GtkWidget *edit_button_cert_import;
|
||||||
static GtkWidget *edit_button_cert_info;
|
static GtkWidget *edit_button_cert_info;
|
||||||
static GtkWidget *edit_button_cert_delete;
|
static GtkWidget *edit_button_cert_delete;
|
||||||
|
|
||||||
@@ -135,12 +136,98 @@ servlist_update_cert_buttons (ircnet *net)
|
|||||||
|
|
||||||
if (edit_button_cert_generate)
|
if (edit_button_cert_generate)
|
||||||
gtk_widget_set_visible (edit_button_cert_generate, !has_cert);
|
gtk_widget_set_visible (edit_button_cert_generate, !has_cert);
|
||||||
|
if (edit_button_cert_import)
|
||||||
|
gtk_widget_set_visible (edit_button_cert_import, !has_cert);
|
||||||
if (edit_button_cert_info)
|
if (edit_button_cert_info)
|
||||||
gtk_widget_set_visible (edit_button_cert_info, has_cert);
|
gtk_widget_set_visible (edit_button_cert_info, has_cert);
|
||||||
if (edit_button_cert_delete)
|
if (edit_button_cert_delete)
|
||||||
gtk_widget_set_visible (edit_button_cert_delete, has_cert);
|
gtk_widget_set_visible (edit_button_cert_delete, has_cert);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
servlist_import_client_cert_cb (GtkWidget *button, gpointer userdata)
|
||||||
|
{
|
||||||
|
ircnet *net = (ircnet *)userdata;
|
||||||
|
GtkWidget *dialog;
|
||||||
|
GtkWidget *message;
|
||||||
|
GtkFileFilter *filter;
|
||||||
|
char *cert_dir;
|
||||||
|
char *cert_file;
|
||||||
|
char *source_file;
|
||||||
|
char *contents;
|
||||||
|
gsize length;
|
||||||
|
|
||||||
|
if (!net || !net->name || !net->name[0])
|
||||||
|
return;
|
||||||
|
|
||||||
|
dialog = gtk_file_chooser_dialog_new (_("Import Client Certificate"),
|
||||||
|
GTK_WINDOW (edit_win),
|
||||||
|
GTK_FILE_CHOOSER_ACTION_OPEN,
|
||||||
|
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
||||||
|
_("_Open"), GTK_RESPONSE_ACCEPT,
|
||||||
|
NULL);
|
||||||
|
filter = gtk_file_filter_new ();
|
||||||
|
gtk_file_filter_set_name (filter, _("Certificate files"));
|
||||||
|
gtk_file_filter_add_pattern (filter, "*.pem");
|
||||||
|
gtk_file_filter_add_pattern (filter, "*.crt");
|
||||||
|
gtk_file_filter_add_pattern (filter, "*.cer");
|
||||||
|
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
|
||||||
|
filter = gtk_file_filter_new ();
|
||||||
|
gtk_file_filter_set_name (filter, _("All files"));
|
||||||
|
gtk_file_filter_add_pattern (filter, "*");
|
||||||
|
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
|
||||||
|
theme_manager_attach_window (dialog);
|
||||||
|
|
||||||
|
if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_ACCEPT)
|
||||||
|
{
|
||||||
|
gtk_widget_destroy (dialog);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
source_file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
|
||||||
|
gtk_widget_destroy (dialog);
|
||||||
|
if (!source_file)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cert_dir = g_build_filename (get_xdir (), "certs", NULL);
|
||||||
|
cert_file = servlist_get_cert_file (net);
|
||||||
|
contents = NULL;
|
||||||
|
length = 0;
|
||||||
|
|
||||||
|
if (cert_file &&
|
||||||
|
g_mkdir_with_parents (cert_dir, 0700) == 0 &&
|
||||||
|
g_file_get_contents (source_file, &contents, &length, NULL) &&
|
||||||
|
g_file_set_contents (cert_file, contents, length, NULL))
|
||||||
|
{
|
||||||
|
chmod (cert_file, 0600);
|
||||||
|
servlist_update_cert_buttons (net);
|
||||||
|
message = gtk_message_dialog_new (GTK_WINDOW (edit_win),
|
||||||
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
||||||
|
GTK_MESSAGE_INFO,
|
||||||
|
GTK_BUTTONS_CLOSE,
|
||||||
|
_("Client certificate imported for \"%s\"."),
|
||||||
|
net->name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message = gtk_message_dialog_new (GTK_WINDOW (edit_win),
|
||||||
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
||||||
|
GTK_MESSAGE_ERROR,
|
||||||
|
GTK_BUTTONS_CLOSE,
|
||||||
|
_("Failed to import client certificate for \"%s\"."),
|
||||||
|
net->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
theme_manager_attach_window (message);
|
||||||
|
g_signal_connect_swapped (message, "response", G_CALLBACK (gtk_widget_destroy), message);
|
||||||
|
gtk_widget_show (message);
|
||||||
|
|
||||||
|
g_free (contents);
|
||||||
|
g_free (cert_file);
|
||||||
|
g_free (cert_dir);
|
||||||
|
g_free (source_file);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
||||||
{
|
{
|
||||||
@@ -165,6 +252,7 @@ servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
|||||||
gboolean success;
|
gboolean success;
|
||||||
gint status;
|
gint status;
|
||||||
char *argv[20];
|
char *argv[20];
|
||||||
|
char **envp;
|
||||||
|
|
||||||
if (!net || !net->name || !net->name[0])
|
if (!net || !net->name || !net->name[0])
|
||||||
return;
|
return;
|
||||||
@@ -187,6 +275,7 @@ servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
|||||||
crt_len = 0;
|
crt_len = 0;
|
||||||
success = FALSE;
|
success = FALSE;
|
||||||
status = 0;
|
status = 0;
|
||||||
|
envp = g_environ_unsetenv (g_get_environ (), "LD_LIBRARY_PATH");
|
||||||
|
|
||||||
if (g_mkdir_with_parents (cert_dir, 0700) == 0 &&
|
if (g_mkdir_with_parents (cert_dir, 0700) == 0 &&
|
||||||
g_file_set_contents (openssl_conf, conf_data, -1, NULL))
|
g_file_set_contents (openssl_conf, conf_data, -1, NULL))
|
||||||
@@ -212,7 +301,7 @@ servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
|||||||
argv[18] = subject;
|
argv[18] = subject;
|
||||||
argv[19] = NULL;
|
argv[19] = NULL;
|
||||||
|
|
||||||
spawned = g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
|
spawned = g_spawn_sync (NULL, argv, envp, G_SPAWN_SEARCH_PATH, NULL, NULL,
|
||||||
&stdout_data, &stderr_data, &status, NULL);
|
&stdout_data, &stderr_data, &status, NULL);
|
||||||
if (spawned && g_spawn_check_exit_status (status, NULL) &&
|
if (spawned && g_spawn_check_exit_status (status, NULL) &&
|
||||||
g_file_get_contents (key_file, &key_data, &key_len, NULL) &&
|
g_file_get_contents (key_file, &key_data, &key_len, NULL) &&
|
||||||
@@ -267,6 +356,7 @@ servlist_generate_client_cert_cb (GtkWidget *button, gpointer userdata)
|
|||||||
g_free (openssl_conf);
|
g_free (openssl_conf);
|
||||||
g_free (cert_file);
|
g_free (cert_file);
|
||||||
g_free (cert_dir);
|
g_free (cert_dir);
|
||||||
|
g_strfreev (envp);
|
||||||
#else
|
#else
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
@@ -284,6 +374,7 @@ servlist_cert_info_cb (GtkWidget *button, gpointer userdata)
|
|||||||
gboolean spawned;
|
gboolean spawned;
|
||||||
gint status;
|
gint status;
|
||||||
char *argv[12];
|
char *argv[12];
|
||||||
|
char **envp;
|
||||||
|
|
||||||
cert_file = servlist_get_cert_file (net);
|
cert_file = servlist_get_cert_file (net);
|
||||||
if (!cert_file)
|
if (!cert_file)
|
||||||
@@ -292,6 +383,7 @@ servlist_cert_info_cb (GtkWidget *button, gpointer userdata)
|
|||||||
stdout_data = NULL;
|
stdout_data = NULL;
|
||||||
stderr_data = NULL;
|
stderr_data = NULL;
|
||||||
status = 0;
|
status = 0;
|
||||||
|
envp = g_environ_unsetenv (g_get_environ (), "LD_LIBRARY_PATH");
|
||||||
argv[0] = "openssl";
|
argv[0] = "openssl";
|
||||||
argv[1] = "x509";
|
argv[1] = "x509";
|
||||||
argv[2] = "-in";
|
argv[2] = "-in";
|
||||||
@@ -305,7 +397,7 @@ servlist_cert_info_cb (GtkWidget *button, gpointer userdata)
|
|||||||
argv[10] = "-sha256";
|
argv[10] = "-sha256";
|
||||||
argv[11] = NULL;
|
argv[11] = NULL;
|
||||||
|
|
||||||
spawned = g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
|
spawned = g_spawn_sync (NULL, argv, envp, G_SPAWN_SEARCH_PATH, NULL, NULL,
|
||||||
&stdout_data, &stderr_data, &status, NULL);
|
&stdout_data, &stderr_data, &status, NULL);
|
||||||
|
|
||||||
if (spawned && g_spawn_check_exit_status (status, NULL) && stdout_data && stdout_data[0])
|
if (spawned && g_spawn_check_exit_status (status, NULL) && stdout_data && stdout_data[0])
|
||||||
@@ -336,6 +428,7 @@ servlist_cert_info_cb (GtkWidget *button, gpointer userdata)
|
|||||||
g_free (stdout_data);
|
g_free (stdout_data);
|
||||||
g_free (stderr_data);
|
g_free (stderr_data);
|
||||||
g_free (cert_file);
|
g_free (cert_file);
|
||||||
|
g_strfreev (envp);
|
||||||
#else
|
#else
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
@@ -2285,6 +2378,11 @@ servlist_open_edit (GtkWidget *parent, ircnet *net)
|
|||||||
G_CALLBACK (servlist_generate_client_cert_cb), net);
|
G_CALLBACK (servlist_generate_client_cert_cb), net);
|
||||||
gtk_box_pack_start (GTK_BOX (hbox_cert_buttons), edit_button_cert_generate, FALSE, FALSE, 0);
|
gtk_box_pack_start (GTK_BOX (hbox_cert_buttons), edit_button_cert_generate, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
edit_button_cert_import = gtk_button_new_with_mnemonic (_("Import client SSL cert"));
|
||||||
|
g_signal_connect (G_OBJECT (edit_button_cert_import), "clicked",
|
||||||
|
G_CALLBACK (servlist_import_client_cert_cb), net);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox_cert_buttons), edit_button_cert_import, FALSE, FALSE, 0);
|
||||||
|
|
||||||
edit_button_cert_info = gtk_button_new_with_mnemonic (_("Client SSL cert info"));
|
edit_button_cert_info = gtk_button_new_with_mnemonic (_("Client SSL cert info"));
|
||||||
g_signal_connect (G_OBJECT (edit_button_cert_info), "clicked",
|
g_signal_connect (G_OBJECT (edit_button_cert_info), "clicked",
|
||||||
G_CALLBACK (servlist_cert_info_cb), net);
|
G_CALLBACK (servlist_cert_info_cb), net);
|
||||||
|
|||||||
@@ -330,6 +330,7 @@ static const setting tabs_settings[] =
|
|||||||
{ST_TOGGLE, N_("Show icons in the channel tree"), P_OFFINTNL(hex_gui_tab_icons), 0, 0, 0},
|
{ST_TOGGLE, N_("Show icons in the channel tree"), P_OFFINTNL(hex_gui_tab_icons), 0, 0, 0},
|
||||||
{ST_TOGGLE, N_("Show dotted lines in the channel tree"), P_OFFINTNL(hex_gui_tab_dots), 0, 0, 0},
|
{ST_TOGGLE, N_("Show dotted lines in the channel tree"), P_OFFINTNL(hex_gui_tab_dots), 0, 0, 0},
|
||||||
{ST_TOGGLE, N_("Scroll mouse-wheel to change tabs"), P_OFFINTNL (hex_gui_tab_scrollchans), 0, 0, 0},
|
{ST_TOGGLE, N_("Scroll mouse-wheel to change tabs"), P_OFFINTNL (hex_gui_tab_scrollchans), 0, 0, 0},
|
||||||
|
{ST_TOGGLE, N_("Show close button on tabs"), P_OFFINTNL(hex_gui_tab_closebuttons), 0, 0, 0},
|
||||||
{ST_TOGGLE, N_("Middle click to close tab"), P_OFFINTNL(hex_gui_tab_middleclose), 0, 0, 0},
|
{ST_TOGGLE, N_("Middle click to close tab"), P_OFFINTNL(hex_gui_tab_middleclose), 0, 0, 0},
|
||||||
{ST_TOGGLE, N_("Smaller text"), P_OFFINTNL(hex_gui_tab_small), 0, 0, 0},
|
{ST_TOGGLE, N_("Smaller text"), P_OFFINTNL(hex_gui_tab_small), 0, 0, 0},
|
||||||
{ST_MENU, N_("Focus new tabs:"), P_OFFINTNL(hex_gui_tab_newtofront), 0, focusnewtabsmenu, 0},
|
{ST_MENU, N_("Focus new tabs:"), P_OFFINTNL(hex_gui_tab_newtofront), 0, focusnewtabsmenu, 0},
|
||||||
@@ -2066,7 +2067,7 @@ setup_apply_to_sess (session_gui *gui)
|
|||||||
{
|
{
|
||||||
mg_update_xtext (gui->xtext);
|
mg_update_xtext (gui->xtext);
|
||||||
|
|
||||||
theme_preferences_apply_to_session (gui, input_style);
|
mg_apply_session_font_prefs (gui);
|
||||||
|
|
||||||
if (prefs.hex_gui_ulist_buttons)
|
if (prefs.hex_gui_ulist_buttons)
|
||||||
gtk_widget_show (gui->button_box);
|
gtk_widget_show (gui->button_box);
|
||||||
@@ -2186,6 +2187,8 @@ setup_apply (struct zoitechatprefs *pr)
|
|||||||
noapply = TRUE;
|
noapply = TRUE;
|
||||||
if (DIFF (hex_gui_tab_icons))
|
if (DIFF (hex_gui_tab_icons))
|
||||||
noapply = TRUE;
|
noapply = TRUE;
|
||||||
|
if (DIFF (hex_gui_tab_closebuttons))
|
||||||
|
noapply = TRUE;
|
||||||
if (DIFF (hex_gui_tab_server))
|
if (DIFF (hex_gui_tab_server))
|
||||||
noapply = TRUE;
|
noapply = TRUE;
|
||||||
if (DIFF (hex_gui_tab_small))
|
if (DIFF (hex_gui_tab_small))
|
||||||
|
|||||||
@@ -367,6 +367,12 @@ theme_css_build_toplevel_classes (void)
|
|||||||
"color: @theme_fg_color;"
|
"color: @theme_fg_color;"
|
||||||
"border-color: @theme_bg_color;"
|
"border-color: @theme_bg_color;"
|
||||||
"}"
|
"}"
|
||||||
|
"window.%s menuitem:hover, window.%s menuitem:selected {"
|
||||||
|
"background-color: @theme_selected_bg_color;"
|
||||||
|
"background-image: none;"
|
||||||
|
"color: @theme_selected_fg_color;"
|
||||||
|
"border-color: @theme_selected_bg_color;"
|
||||||
|
"}"
|
||||||
"window.%s, window.%s:backdrop, .%s {"
|
"window.%s, window.%s:backdrop, .%s {"
|
||||||
"background-color: #f6f6f6;"
|
"background-color: #f6f6f6;"
|
||||||
"color: #101010;"
|
"color: #101010;"
|
||||||
@@ -377,6 +383,12 @@ theme_css_build_toplevel_classes (void)
|
|||||||
"background-image: none;"
|
"background-image: none;"
|
||||||
"color: @theme_fg_color;"
|
"color: @theme_fg_color;"
|
||||||
"border-color: @theme_bg_color;"
|
"border-color: @theme_bg_color;"
|
||||||
|
"}"
|
||||||
|
"window.%s menuitem:hover, window.%s menuitem:selected {"
|
||||||
|
"background-color: @theme_selected_bg_color;"
|
||||||
|
"background-image: none;"
|
||||||
|
"color: @theme_selected_fg_color;"
|
||||||
|
"border-color: @theme_selected_bg_color;"
|
||||||
"}",
|
"}",
|
||||||
theme_css_selector_dark_class,
|
theme_css_selector_dark_class,
|
||||||
theme_css_selector_dark_class,
|
theme_css_selector_dark_class,
|
||||||
@@ -387,6 +399,10 @@ theme_css_build_toplevel_classes (void)
|
|||||||
theme_css_selector_dark_class,
|
theme_css_selector_dark_class,
|
||||||
theme_css_selector_dark_class,
|
theme_css_selector_dark_class,
|
||||||
theme_css_selector_dark_class,
|
theme_css_selector_dark_class,
|
||||||
|
theme_css_selector_dark_class,
|
||||||
|
theme_css_selector_dark_class,
|
||||||
|
theme_css_selector_light_class,
|
||||||
|
theme_css_selector_light_class,
|
||||||
theme_css_selector_light_class,
|
theme_css_selector_light_class,
|
||||||
theme_css_selector_light_class,
|
theme_css_selector_light_class,
|
||||||
theme_css_selector_light_class,
|
theme_css_selector_light_class,
|
||||||
|
|||||||
@@ -415,6 +415,24 @@ theme_manager_is_kde_wayland (void)
|
|||||||
return is_kde;
|
return is_kde;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gint
|
||||||
|
theme_manager_get_system_headerbar_height (void)
|
||||||
|
{
|
||||||
|
GtkWidget *probe;
|
||||||
|
gint minimum;
|
||||||
|
gint natural;
|
||||||
|
|
||||||
|
probe = gtk_header_bar_new ();
|
||||||
|
gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (probe), TRUE);
|
||||||
|
gtk_header_bar_set_decoration_layout (GTK_HEADER_BAR (probe), "menu:minimize,maximize,close");
|
||||||
|
gtk_widget_show (probe);
|
||||||
|
gtk_widget_get_preferred_height (probe, &minimum, &natural);
|
||||||
|
gtk_widget_destroy (probe);
|
||||||
|
if (natural > 0)
|
||||||
|
return natural;
|
||||||
|
return minimum;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
theme_manager_apply_wayland_kde_csd (GtkWidget *window)
|
theme_manager_apply_wayland_kde_csd (GtkWidget *window)
|
||||||
{
|
{
|
||||||
@@ -442,10 +460,16 @@ theme_manager_apply_wayland_kde_csd (GtkWidget *window)
|
|||||||
headerbar = gtk_header_bar_new ();
|
headerbar = gtk_header_bar_new ();
|
||||||
gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (headerbar), TRUE);
|
gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (headerbar), TRUE);
|
||||||
gtk_header_bar_set_decoration_layout (GTK_HEADER_BAR (headerbar), "menu:minimize,maximize,close");
|
gtk_header_bar_set_decoration_layout (GTK_HEADER_BAR (headerbar), "menu:minimize,maximize,close");
|
||||||
icon_pixbuf = gdk_pixbuf_new_from_resource_at_scale ("/icons/zoitechat.svg", 32, 32, TRUE, NULL);
|
g_object_set (G_OBJECT (headerbar), "spacing", 0, NULL);
|
||||||
|
gtk_widget_set_size_request (headerbar, -1, theme_manager_get_system_headerbar_height ());
|
||||||
|
icon_pixbuf = gdk_pixbuf_new_from_resource_at_scale ("/icons/zoitechat.svg", 24, 24, TRUE, NULL);
|
||||||
if (!icon_pixbuf)
|
if (!icon_pixbuf)
|
||||||
icon_pixbuf = gdk_pixbuf_new_from_resource_at_scale ("/icons/zoitechat.png", 32, 32, TRUE, NULL);
|
icon_pixbuf = gdk_pixbuf_new_from_resource_at_scale ("/icons/zoitechat.png", 24, 24, TRUE, NULL);
|
||||||
icon_image = icon_pixbuf ? gtk_image_new_from_pixbuf (icon_pixbuf) : gtk_image_new_from_resource ("/icons/zoitechat.png");
|
icon_image = icon_pixbuf ? gtk_image_new_from_pixbuf (icon_pixbuf) : gtk_image_new_from_resource ("/icons/zoitechat.png");
|
||||||
|
gtk_widget_set_margin_start (icon_image, 0);
|
||||||
|
gtk_widget_set_margin_end (icon_image, 0);
|
||||||
|
gtk_widget_set_margin_top (icon_image, 0);
|
||||||
|
gtk_widget_set_margin_bottom (icon_image, 0);
|
||||||
if (icon_pixbuf)
|
if (icon_pixbuf)
|
||||||
g_object_unref (icon_pixbuf);
|
g_object_unref (icon_pixbuf);
|
||||||
gtk_header_bar_pack_start (GTK_HEADER_BAR (headerbar), icon_image);
|
gtk_header_bar_pack_start (GTK_HEADER_BAR (headerbar), icon_image);
|
||||||
|
|||||||
@@ -40,7 +40,6 @@
|
|||||||
SET SOLUTIONDIR=$(SolutionDir)..\
|
SET SOLUTIONDIR=$(SolutionDir)..\
|
||||||
if not exist "$(ZoiteChatBin)" mkdir "$(ZoiteChatBin)"
|
if not exist "$(ZoiteChatBin)" mkdir "$(ZoiteChatBin)"
|
||||||
powershell -File "$(SolutionDir)..\win32\version-template.ps1" "$(SolutionDir)..\win32\installer\zoitechat.iss.tt" "$(ZoiteChatBin)zoitechat.iss"
|
powershell -File "$(SolutionDir)..\win32\version-template.ps1" "$(SolutionDir)..\win32\installer\zoitechat.iss.tt" "$(ZoiteChatBin)zoitechat.iss"
|
||||||
"$(Python3Path)\python.exe" "$(SolutionDir)..\data\icons\generate_icons.py" "$(DataDir)icons\zoitechat.svg" "$(DataDir)icons\zoitechat.png" --size 256 --ico "$(DataDir)icons\zoitechat.ico"
|
|
||||||
$(IsccPath) /dPROJECTDIR="$(ProjectDir)" /dAPPARCH="$(Platform)" "$(ZoiteChatBin)zoitechat.iss"
|
$(IsccPath) /dPROJECTDIR="$(ProjectDir)" /dAPPARCH="$(Platform)" "$(ZoiteChatBin)zoitechat.iss"
|
||||||
]]>
|
]]>
|
||||||
</Command>
|
</Command>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 201 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 12 KiB |
@@ -9,10 +9,10 @@ AppName=ZoiteChat
|
|||||||
AppVersion={#APPVER}
|
AppVersion={#APPVER}
|
||||||
AppVerName=ZoiteChat {#APPVER}
|
AppVerName=ZoiteChat {#APPVER}
|
||||||
AppPublisher=ZoiteChat
|
AppPublisher=ZoiteChat
|
||||||
AppPublisherURL=http://zoitechat.zoite.net
|
AppPublisherURL=http://zoitechat.org
|
||||||
AppCopyright=Copyright (C) 1998-2010 Peter Zelezny
|
AppCopyright=Copyright (C) 1998-2010 Peter Zelezny
|
||||||
AppSupportURL=https://github.com/zoitechat/zoitechat/issues
|
AppSupportURL=https://github.com/zoitechat/zoitechat/issues
|
||||||
AppUpdatesURL=http://zoitechat.zoite.net/downloads.html
|
AppUpdatesURL=http://zoitechat.org/downloads.html
|
||||||
LicenseFile=share\doc\zoitechat\COPYING
|
LicenseFile=share\doc\zoitechat\COPYING
|
||||||
UninstallDisplayIcon={app}\zoitechat.exe
|
UninstallDisplayIcon={app}\zoitechat.exe
|
||||||
UninstallDisplayName=ZoiteChat
|
UninstallDisplayName=ZoiteChat
|
||||||
@@ -61,6 +61,9 @@ Name: "langs"; Description: "Language Interfaces"; Types: custom; Flags: disable
|
|||||||
Name: "langs\lua"; Description: "Lua"; Types: normal custom; Flags: disablenouninstallwarning
|
Name: "langs\lua"; Description: "Lua"; Types: normal custom; Flags: disablenouninstallwarning
|
||||||
Name: "langs\perl"; Description: "Perl (requires Perl 5.42)"; Types: custom; Flags: disablenouninstallwarning
|
Name: "langs\perl"; Description: "Perl (requires Perl 5.42)"; Types: custom; Flags: disablenouninstallwarning
|
||||||
Name: "langs\python"; Description: "Python (requires Python 3.14.3)"; Types: custom; Flags: disablenouninstallwarning
|
Name: "langs\python"; Description: "Python (requires Python 3.14.3)"; Types: custom; Flags: disablenouninstallwarning
|
||||||
|
Name: "themes"; Description: "GTK3 Themes"; Types: normal minimal custom; Flags: disablenouninstallwarning
|
||||||
|
Name: "themes\windows10"; Description: "Windows 10"; Types: normal minimal custom; Flags: disablenouninstallwarning
|
||||||
|
Name: "themes\windows10dark"; Description: "Windows 10 Dark"; Types: normal minimal custom; Flags: disablenouninstallwarning
|
||||||
Name: "deps"; Description: "Dependencies"; Types: custom; Flags: disablenouninstallwarning
|
Name: "deps"; Description: "Dependencies"; Types: custom; Flags: disablenouninstallwarning
|
||||||
Name: "deps\vcredist2015"; Description: "Visual C++ Redistributable 2015"; Types: normal minimal custom; Flags: disablenouninstallwarning
|
Name: "deps\vcredist2015"; Description: "Visual C++ Redistributable 2015"; Types: normal minimal custom; Flags: disablenouninstallwarning
|
||||||
|
|
||||||
@@ -88,6 +91,11 @@ Filename: "{tmp}\perl.msi"; StatusMsg: "Installing Perl"; Components: langs\perl
|
|||||||
Filename: "{tmp}\python.msi"; StatusMsg: "Installing Python"; Components: langs\python; 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}\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
|
Filename: "{tmp}\spelling-dicts.exe"; Parameters: "/verysilent"; StatusMsg: "Installing Spelling Dictionaries"; Components: spell; Flags: skipifdoesntexist; Tasks: not portable
|
||||||
|
Filename: "{sys}\WindowsPowerShell\v1.0\powershell.exe"; Parameters: "-NoProfile -ExecutionPolicy Bypass -Command ""Expand-Archive -LiteralPath '{tmp}\Windows-10-3.2.1.zip' -DestinationPath '{userappdata}\ZoiteChat\gtk3-themes' -Force"""; StatusMsg: "Installing GTK3 Theme: Windows 10"; Components: themes\windows10; Flags: runhidden waituntilterminated skipifdoesntexist
|
||||||
|
Filename: "{sys}\WindowsPowerShell\v1.0\powershell.exe"; Parameters: "-NoProfile -ExecutionPolicy Bypass -Command ""Expand-Archive -LiteralPath '{tmp}\Windows-10-Dark-3.2.1-dark.zip' -DestinationPath '{userappdata}\ZoiteChat\gtk3-themes' -Force"""; StatusMsg: "Installing GTK3 Theme: Windows 10 Dark"; Components: themes\windows10dark; Flags: runhidden waituntilterminated skipifdoesntexist
|
||||||
|
|
||||||
|
[Dirs]
|
||||||
|
Name: "{userappdata}\ZoiteChat\gtk3-themes"; Components: themes
|
||||||
|
|
||||||
[Files]
|
[Files]
|
||||||
Source: "portable-mode"; DestDir: "{app}"; Tasks: portable
|
Source: "portable-mode"; DestDir: "{app}"; Tasks: portable
|
||||||
@@ -196,6 +204,10 @@ Name: "{commonappdata}\Microsoft\Internet Explorer\Quick Launch\ZoiteChat"; File
|
|||||||
[Messages]
|
[Messages]
|
||||||
BeveledLabel= {#APPNAM}
|
BeveledLabel= {#APPNAM}
|
||||||
|
|
||||||
|
[UninstallDelete]
|
||||||
|
Type: filesandordirs; Name: "{userappdata}\ZoiteChat\gtk3-themes\Windows-10-3.2.1"; Components: themes\windows10
|
||||||
|
Type: filesandordirs; Name: "{userappdata}\ZoiteChat\gtk3-themes\Windows-10-Dark-3.2.1-dark"; Components: themes\windows10dark
|
||||||
|
|
||||||
[Code]
|
[Code]
|
||||||
#ifndef USE_INNO_DOWNLOAD_PLUGIN
|
#ifndef USE_INNO_DOWNLOAD_PLUGIN
|
||||||
var
|
var
|
||||||
@@ -336,6 +348,12 @@ begin
|
|||||||
begin
|
begin
|
||||||
idpClearFiles;
|
idpClearFiles;
|
||||||
|
|
||||||
|
if IsComponentSelected('themes\windows10') then
|
||||||
|
idpAddFile('https://dl.zoitechat.zoite.net/themes/GTK3Themes/Windows-10-3.2.1.zip', ExpandConstant('{tmp}\Windows-10-3.2.1.zip'));
|
||||||
|
|
||||||
|
if IsComponentSelected('themes\windows10dark') then
|
||||||
|
idpAddFile('https://dl.zoitechat.zoite.net/themes/GTK3Themes/Windows-10-Dark-3.2.1-dark.zip', ExpandConstant('{tmp}\Windows-10-Dark-3.2.1-dark.zip'));
|
||||||
|
|
||||||
if not IsTaskSelected('portable') then
|
if not IsTaskSelected('portable') then
|
||||||
begin
|
begin
|
||||||
|
|
||||||
@@ -389,6 +407,21 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
if CurPageID = wpReady then
|
if CurPageID = wpReady then
|
||||||
|
begin
|
||||||
|
if IsComponentSelected('themes\windows10') and not FileExists(ExpandConstant('{tmp}\Windows-10-3.2.1.zip')) then
|
||||||
|
begin
|
||||||
|
MsgBox('Windows 10 GTK3 theme could not be downloaded. Please retry setup and rerun setup.', mbError, MB_OK);
|
||||||
|
Result := False;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if IsComponentSelected('themes\windows10dark') and not FileExists(ExpandConstant('{tmp}\Windows-10-Dark-3.2.1-dark.zip')) then
|
||||||
|
begin
|
||||||
|
MsgBox('Windows 10 Dark GTK3 theme could not be downloaded. Please retry setup and rerun setup.', mbError, MB_OK);
|
||||||
|
Result := False;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
if IsComponentSelected('deps\vcredist2015') and not CheckVCInstall() and not FileExists(ExpandConstant('{tmp}\vcredist.exe')) then
|
if IsComponentSelected('deps\vcredist2015') and not CheckVCInstall() and not FileExists(ExpandConstant('{tmp}\vcredist.exe')) then
|
||||||
begin
|
begin
|
||||||
MsgBox('Visual C++ Redistributable could not be downloaded. Please retry setup or install it manually and rerun setup.', mbError, MB_OK);
|
MsgBox('Visual C++ Redistributable could not be downloaded. Please retry setup or install it manually and rerun setup.', mbError, MB_OK);
|
||||||
@@ -396,6 +429,7 @@ begin
|
|||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
// these are required for x86->x64 or reverse upgrades
|
// these are required for x86->x64 or reverse upgrades
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2.18.0~pre5
|
2.18.0~pre6
|
||||||
|
|||||||