Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package Srain for openSUSE:Factory checked 
in at 2021-10-26 20:14:23
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/Srain (Old)
 and      /work/SRC/openSUSE:Factory/.Srain.new.1890 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "Srain"

Tue Oct 26 20:14:23 2021 rev:9 rq:927567 version:1.3.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/Srain/Srain.changes      2021-04-12 
12:39:48.865540150 +0200
+++ /work/SRC/openSUSE:Factory/.Srain.new.1890/Srain.changes    2021-10-26 
20:15:10.562056787 +0200
@@ -1,0 +2,25 @@
+Tue Oct 26 12:59:09 UTC 2021 - Nicolas FORMICHELLA <[email protected]>
+
+- Update to version 1.3.0
+  - [1.3.0]
+    * Features:
+      + Implement ISUPPORT parsing + the UTF8ONLY IRCv3 specification
+      + Add support for RPL_UMODEIS
+      + Make nick completion case-insensitive
+      + Add button for inserting emoji
+    * Bug fixes:
+      + Fix configuration syntax errors caused by trailing commas
+  - [1.2.4]
+    * Bug fixes
+      + Fix bugs introduced by https://github.com/SrainApp/srain/pull/316
+      + Fix crach when URL preview async task failed
+  - [1.2.3]
+    * Bug fixes:
+      + Eliminate GDK warning
+  - [1.2.2]
+    * Changed:
+      + Add libera.chat IRC network (#311)
+      + Updated Dutch translation (b6830e9)
+
+
+-------------------------------------------------------------------

Old:
----
  Srain-1.2.1.tar.gz

New:
----
  Srain-1.3.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ Srain.spec ++++++
--- /var/tmp/diff_new_pack.eUl1zv/_old  2021-10-26 20:15:11.110057077 +0200
+++ /var/tmp/diff_new_pack.eUl1zv/_new  2021-10-26 20:15:11.114057078 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           Srain
-Version:        1.2.1
+Version:        1.3.0
 Release:        0
 Summary:        An IRC client
 License:        GPL-3.0-or-later AND ISC

++++++ Srain-1.2.1.tar.gz -> Srain-1.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/.github/workflows/build.yml 
new/srain-1.3.0/.github/workflows/build.yml
--- old/srain-1.2.1/.github/workflows/build.yml 2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/.github/workflows/build.yml 2021-09-21 13:13:50.000000000 
+0200
@@ -41,9 +41,8 @@
     - name: Validate
       run: |
         sudo apt-get install appstream-util desktop-file-utils;
-        /bin/sh -c "/usr/local/bin/srain --version";
-        appstream-util validate-relax 
/usr/local/share/metainfo/im.srain.Srain.metainfo.xml
-        desktop-file-validate 
/usr/local/share/applications/im.srain.Srain.desktop
+        appstream-util validate-relax 
/usr/local/share/metainfo/im.srain.Srain.metainfo.xml;
+        desktop-file-validate 
/usr/local/share/applications/im.srain.Srain.desktop;
 
   build-mingw64:
     runs-on: windows-latest
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/.github/workflows/pack-mingw64.sh 
new/srain-1.3.0/.github/workflows/pack-mingw64.sh
--- old/srain-1.2.1/.github/workflows/pack-mingw64.sh   2021-04-10 
07:42:45.000000000 +0200
+++ new/srain-1.3.0/.github/workflows/pack-mingw64.sh   2021-09-21 
13:13:50.000000000 +0200
@@ -19,7 +19,7 @@
 prefix=$MINGW_PREFIX
 
 install_dir=$1
-srain_exe=$install_dir/bin/srain
+srain_exe=$install_dir/bin/srain.exe
 srain_etc=$install_dir/etc/srain
 srain_share=$install_dir/share/*
 
@@ -35,8 +35,8 @@
 gdbus=$prefix/bin/gdbus.exe
 
 # srain
-cp -vf $srain_exe $prefix/bin/srain # make DLLs of mingw64 have the highest 
priority
-get_dll $prefix/bin/srain
+cp -vf $srain_exe $prefix/bin/srain.exe # make DLLs of mingw64 have the 
highest priority
+get_dll $prefix/bin/srain.exe
 mingw64_dlls=$ret
 
 # glib-networking
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/srain-1.2.1/.github/workflows/release-debian-package.sh 
new/srain-1.3.0/.github/workflows/release-debian-package.sh
--- old/srain-1.2.1/.github/workflows/release-debian-package.sh 2021-04-10 
07:42:45.000000000 +0200
+++ new/srain-1.3.0/.github/workflows/release-debian-package.sh 2021-09-21 
13:13:50.000000000 +0200
@@ -15,7 +15,7 @@
 # Make dependencies: gettext, libconfig-dev, libgtk-3-dev, libsecret-1-dev, 
libsoup2.4-dev, libssl-dev, pkg-config
 # Runtime dependencies: glib-networking, libgtk-3-0, libsecret-1-0, 
libconfig9, libsoup2.4
 # Python3 script: python3 python3-requests
-apt-get install -y debhelper dpkg-dev gettext libconfig-dev libgtk-3-dev 
libsecret-1-dev libsoup2.4-dev libssl-dev pkg-config glib-networking libgtk-3-0 
libsecret-1-0 libconfig9 libsoup2.4 python3 python3-requests;
+apt-get install -y debhelper dpkg-dev gettext libconfig-dev libgtk-3-dev 
libsecret-1-dev libsoup2.4-dev libssl-dev pkg-config glib-networking libgtk-3-0 
libsecret-1-0 libconfig9 libsoup2.4 python3 python3-requests meson;
 # Download the debian files.
 git clone https://github.com/SrainApp/srain-contrib.git --depth 1;
 cd srain-contrib;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/.github/workflows/release.yml 
new/srain-1.3.0/.github/workflows/release.yml
--- old/srain-1.2.1/.github/workflows/release.yml       2021-04-10 
07:42:45.000000000 +0200
+++ new/srain-1.3.0/.github/workflows/release.yml       2021-09-21 
13:13:50.000000000 +0200
@@ -29,29 +29,27 @@
       GH_REF: ${{ github.ref }}
     steps:
     - uses: actions/checkout@v2
-    - uses: msys2/setup-msys2@v1
+    - uses: msys2/setup-msys2@v2
       name: Init MSYS2/MINGW64 environment
       with:
         update: true
         msystem: MINGW64
-        install: base-devel git curl zip mingw-w64-x86_64-python-requests 
mingw-w64-x86_64-gcc mingw-w64-x86_64-gtk3 mingw-w64-x86_64-libconfig 
mingw-w64-x86_64-libsoup mingw-w64-x86_64-libsecret mingw-w64-x86_64-pkg-config 
mingw-w64-x86_64-gettext mingw-w64-x86_64-glib-networking
+        install: base-devel git curl zip mingw-w64-x86_64-python-requests 
mingw-w64-x86_64-gcc mingw-w64-x86_64-gtk3 mingw-w64-x86_64-libconfig 
mingw-w64-x86_64-libsoup mingw-w64-x86_64-libsecret mingw-w64-x86_64-pkg-config 
mingw-w64-x86_64-gettext mingw-w64-x86_64-glib-networking 
mingw-w64-x86_64-meson mingw-w64-x86_64-appstream-glib
     - name: Build
       run: |
         SRAIN_TAG=`git describe --tags`;
         INSTALL_DIR=srain-$SRAIN_TAG-mingw64-install;
         PACKAGE_DIR=srain-$SRAIN_TAG-mingw64;
         PACKAGE_NAME=$PACKAGE_DIR.zip;
+        PREFIX=a/_temp/msys/msys64/mingw64; # Hardcoded meson prefix
         mkdir -pv out;
         mkdir -pv $INSTALL_DIR;
-        ./configure \
-          --prefix=$MINGW_PREFIX \
-          --datadir=$MINGW_PREFIX/share \
-          --sysconfdir=$MINGW_PREFIX/etc \
-          --disable-debug && \
-        make && \
-        make DESTDIR=$PWD/$INSTALL_DIR install && \
-        .github/workflows/pack-mingw64.sh $INSTALL_DIR/$MINGW_PREFIX 
$PACKAGE_DIR $PACKAGE_NAME && \
+        meson setup -Ddoc_builders=[] \
+          --buildtype=release \
+          builddir && \
+        ninja -C builddir && \
+        DESTDIR=$PWD/$INSTALL_DIR ninja -C builddir install && \
+        .github/workflows/pack-mingw64.sh $INSTALL_DIR/$PREFIX $PACKAGE_DIR 
$PACKAGE_NAME && \
         mv $PACKAGE_NAME ./out
     - name: Upload
       run: /mingw64/bin/python3 .github/workflows/release-assets-upload.py
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/README.rst new/srain-1.3.0/README.rst
--- old/srain-1.2.1/README.rst  2021-04-10 07:42:45.000000000 +0200
+++ new/srain-1.3.0/README.rst  2021-09-21 13:13:50.000000000 +0200
@@ -11,7 +11,7 @@
     :target: https://doc.srain.im/en/latest/
 
 .. |channel| image:: 
https://img.shields.io/badge/channel-%23srain-brightgreen.svg
-   :target: ircs://chat.freenode.net/#srain
+   :target: ircs://irc.libera.chat/#srain
 
 Modern IRC client written in GTK.
 
@@ -64,7 +64,7 @@
 
 Feel free to contact us if you have any question about Srain.
 
-- IRC Channel: `#srain <ircs://chat.freenode.org:6697/srain>`_ @ freenode
+- IRC Channel: `#srain <ircs://irc.libera.chat/srain>`_ @ Libera Chat
 - Github: file an issue `Here <https://github.com/SrainApp/srain/issues>`_
 
 .. _Frequently Asked Questions: https://doc.srain.im/en/latest/faq.html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/data/builtin.cfg 
new/srain-1.3.0/data/builtin.cfg
--- old/srain-1.2.1/data/builtin.cfg    2021-04-10 07:42:45.000000000 +0200
+++ new/srain-1.3.0/data/builtin.cfg    2021-09-21 13:13:50.000000000 +0200
@@ -104,12 +104,9 @@
     {
         # ``name``, ``addresses`` are necessary for a ``server`` group
         # in ``server-list``, otherwise you can not connect to it.
-        name = "freenode"           # String; The unique name of server
+        name = "Libera Chat"        # String; The unique name of server
         addresses = [
-            "irc.freenode.net:6697",
-            "chat.freenode.net:6697",
-            "irc.freenode.org:6697",
-            "chat.freenode.org:6697"
+            "irc.libera.chat:6697"
         ]                           # String array; Addresses of IRC server,
                                     # each address follows the format of
                                     # <host>[:<port>]. The port can be omitted,
@@ -266,6 +263,17 @@
         encoding = "utf-8"
     },
     {
+        name = "freenode"
+        addresses = [
+            "irc.freenode.net:6697",
+            "chat.freenode.net:6697",
+            "irc.freenode.org:6697",
+            "chat.freenode.org:6697"
+        ]
+        tls = true
+        encoding = "utf-8"
+    },
+    {
         name = "localhost"
         addresses = ["localhost:6667", "127.0.0.1:6667"]
         tls = false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/data/metainfo/meson.build 
new/srain-1.3.0/data/metainfo/meson.build
--- old/srain-1.2.1/data/metainfo/meson.build   2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/data/metainfo/meson.build   2021-09-21 13:13:50.000000000 
+0200
@@ -10,7 +10,7 @@
   type: 'xml',
   input: configure_file(
     input: 'srain.metainfo.xml.in.in',
-    output: 'srian.metainfo.xml.in',
+    output: 'srain.metainfo.xml.in',
     configuration: metainfo_conf,
   ),
   output: '@[email protected]'.format(app_id),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/data/metainfo/srain.metainfo.xml.in.in 
new/srain-1.3.0/data/metainfo/srain.metainfo.xml.in.in
--- old/srain-1.2.1/data/metainfo/srain.metainfo.xml.in.in      2021-04-10 
07:42:45.000000000 +0200
+++ new/srain-1.3.0/data/metainfo/srain.metainfo.xml.in.in      2021-09-21 
13:13:50.000000000 +0200
@@ -68,7 +68,13 @@
   </content_rating>
 
 <releases>
-  <release version="1.2.0" date="2020-02-28">
+  <release version="1.3" date="2021-09-21">
+      <url>https://doc.srain.im/en/latest/changelog.html#version-1-3-0</url>
+  </release>
+  <release version="1.2.4" date="2021-07-18">
+      <url>https://doc.srain.im/en/latest/changelog.html#version-1-2-4</url>
+  </release>
+  <release version="1.2.0" date="2021-02-28">
       <url>https://doc.srain.im/en/latest/changelog.html#version-1-2-0</url>
   </release>
   <release version="1.1.2" date="2020-08-10">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/data/ui/window.glade 
new/srain-1.3.0/data/ui/window.glade
--- old/srain-1.2.1/data/ui/window.glade        2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/data/ui/window.glade        2021-09-21 13:13:50.000000000 
+0200
@@ -1,56 +1,62 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.36.0 -->
+<!-- Generated with glade 3.38.2 -->
 <interface>
-  <requires lib="gtk+" version="3.18"/>
+  <requires lib="gtk+" version="3.20"/>
   <object class="GtkImage" id="connect_image">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="icon_name">network-server-symbolic</property>
-    <property name="use_fallback">True</property>
+    <property name="can-focus">False</property>
+    <property name="icon-name">network-server-symbolic</property>
+    <property name="use-fallback">True</property>
+  </object>
+  <object class="GtkImage" id="insert_emoji_image">
+    <property name="visible">True</property>
+    <property name="can-focus">False</property>
+    <property name="icon-name">face-smile</property>
+    <property name="use-fallback">True</property>
   </object>
   <object class="GtkImage" id="join_image">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="icon_name">contact-new-symbolic</property>
-    <property name="use_fallback">True</property>
+    <property name="can-focus">False</property>
+    <property name="icon-name">contact-new-symbolic</property>
+    <property name="use-fallback">True</property>
   </object>
   <object class="GtkImage" id="plugin_image">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="icon_name">application-x-addon-symbolic</property>
-    <property name="use_fallback">True</property>
+    <property name="can-focus">False</property>
+    <property name="icon-name">application-x-addon-symbolic</property>
+    <property name="use-fallback">True</property>
   </object>
   <object class="GtkImage" id="send_image">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="icon_name">document-send-symbolic</property>
-    <property name="use_fallback">True</property>
+    <property name="can-focus">False</property>
+    <property name="icon-name">document-send-symbolic</property>
+    <property name="use-fallback">True</property>
   </object>
   <template class="SuiWindow" parent="GtkApplicationWindow">
-    <property name="can_focus">False</property>
-    <property name="window_position">center</property>
-    <property name="default_width">1050</property>
-    <property name="default_height">650</property>
-    <property name="icon_name">im.srain.Srain</property>
+    <property name="can-focus">False</property>
+    <property name="window-position">center</property>
+    <property name="default-width">1050</property>
+    <property name="default-height">650</property>
+    <property name="icon-name">im.srain.Srain</property>
     <child>
       <object class="GtkBox" id="window_box">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <property name="orientation">vertical</property>
         <child>
           <object class="GtkBox" id="header_box">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <property name="orientation">vertical</property>
             <child>
               <object class="GtkPaned" id="header_paned">
                 <property name="visible">True</property>
-                <property name="can_focus">True</property>
+                <property name="can-focus">True</property>
                 <child>
                   <object class="GtkBox" id="side_header_box">
-                    <property name="width_request">300</property>
+                    <property name="width-request">300</property>
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <child>
                       <placeholder/>
                     </child>
@@ -72,7 +78,7 @@
                 <child>
                   <object class="GtkBox" id="buffer_header_box">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <child>
                       <placeholder/>
                     </child>
@@ -107,7 +113,7 @@
         </child>
         <child>
           <object class="GtkSeparator" id="header_separator">
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
           </object>
           <packing>
             <property name="expand">False</property>
@@ -118,15 +124,16 @@
         <child>
           <object class="GtkStack" id="window_stack">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <child>
+              <!-- n-columns=3 n-rows=3 -->
               <object class="GtkGrid" id="welcome_grid">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <child>
                   <object class="GtkBox" id="welcome_box">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="halign">center</property>
                     <property name="valign">center</property>
                     <property name="hexpand">True</property>
@@ -136,10 +143,10 @@
                     <child>
                       <object class="GtkImage" id="welcom_image">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="opacity">0.8</property>
-                        <property name="pixel_size">64</property>
-                        <property name="icon_name">srain</property>
+                        <property name="can-focus">False</property>
+                        <property name="opacity">0.80</property>
+                        <property name="pixel-size">64</property>
+                        <property name="icon-name">srain</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -150,11 +157,11 @@
                     <child>
                       <object class="GtkLabel" id="welcome_label">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="opacity">0.8</property>
+                        <property name="can-focus">False</property>
+                        <property name="opacity">0.80</property>
                         <property name="label" 
translatable="yes">&lt;big&gt;Welcome to Srain!&lt;/big&gt;</property>
-                        <property name="use_markup">True</property>
-                        <property name="track_visited_links">False</property>
+                        <property name="use-markup">True</property>
+                        <property name="track-visited-links">False</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -165,7 +172,7 @@
                     <child>
                       <object class="GtkBox" id="welcome_connect_box">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
+                        <property name="can-focus">False</property>
                         <child>
                           <placeholder/>
                         </child>
@@ -178,10 +185,34 @@
                     </child>
                   </object>
                   <packing>
-                    <property name="left_attach">0</property>
-                    <property name="top_attach">0</property>
+                    <property name="left-attach">0</property>
+                    <property name="top-attach">0</property>
                   </packing>
                 </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
               </object>
               <packing>
                 <property name="name">welcome</property>
@@ -190,14 +221,14 @@
             <child>
               <object class="GtkPaned" id="main_paned">
                 <property name="visible">True</property>
-                <property name="can_focus">True</property>
+                <property name="can-focus">True</property>
                 <property name="position">1</property>
-                <property name="position_set">True</property>
+                <property name="position-set">True</property>
                 <child>
                   <object class="GtkBox" id="side_box">
-                    <property name="width_request">300</property>
+                    <property name="width-request">300</property>
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="orientation">vertical</property>
                     <child>
                       <placeholder/>
@@ -211,12 +242,12 @@
                 <child>
                   <object class="GtkBox" id="buffer_box">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="orientation">vertical</property>
                     <child>
                       <object class="GtkStack" id="buffer_stack">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
+                        <property name="can-focus">False</property>
                         <child>
                           <placeholder/>
                         </child>
@@ -233,7 +264,7 @@
                     <child>
                       <object class="GtkSeparator" id="buffer_separator">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
+                        <property name="can-focus">False</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -244,12 +275,12 @@
                     <child>
                       <object class="GtkBox" id="input_box">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
+                        <property name="can-focus">False</property>
                         <child>
                           <object class="GtkButton" id="plugin_button">
-                            <property name="can_focus">False</property>
-                            <property name="focus_on_click">False</property>
-                            <property name="receives_default">True</property>
+                            <property name="can-focus">False</property>
+                            <property name="focus-on-click">False</property>
+                            <property name="receives-default">True</property>
                             <property name="image">plugin_image</property>
                             <property name="relief">none</property>
                           </object>
@@ -262,15 +293,15 @@
                         <child>
                           <object class="GtkTextView" id="input_text_view">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="has_focus">True</property>
-                            <property name="is_focus">True</property>
-                            <property name="wrap_mode">word-char</property>
-                            <property name="left_margin">4</property>
-                            <property name="right_margin">4</property>
-                            <property name="top_margin">7</property>
-                            <property name="bottom_margin">7</property>
-                            <property name="populate_all">True</property>
+                            <property name="can-focus">True</property>
+                            <property name="has-focus">True</property>
+                            <property name="is-focus">True</property>
+                            <property name="wrap-mode">word-char</property>
+                            <property name="left-margin">4</property>
+                            <property name="right-margin">4</property>
+                            <property name="top-margin">7</property>
+                            <property name="bottom-margin">7</property>
+                            <property name="populate-all">True</property>
                           </object>
                           <packing>
                             <property name="expand">True</property>
@@ -279,18 +310,32 @@
                           </packing>
                         </child>
                         <child>
+                          <object class="GtkButton" id="insert_emoji_button">
+                            <property name="can-focus">True</property>
+                            <property name="focus-on-click">False</property>
+                            <property name="receives-default">True</property>
+                            <property 
name="image">insert_emoji_image</property>
+                            <property name="relief">none</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
                           <object class="GtkButton" id="send_button">
                             <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="focus_on_click">False</property>
-                            <property name="receives_default">True</property>
+                            <property name="can-focus">False</property>
+                            <property name="focus-on-click">False</property>
+                            <property name="receives-default">True</property>
                             <property name="image">send_image</property>
                             <property name="relief">none</property>
                           </object>
                           <packing>
                             <property name="expand">False</property>
                             <property name="fill">True</property>
-                            <property name="position">2</property>
+                            <property name="position">3</property>
                           </packing>
                         </child>
                         <style>
@@ -330,29 +375,29 @@
     <child type="titlebar">
       <object class="GtkPaned" id="title_paned">
         <property name="visible">True</property>
-        <property name="can_focus">True</property>
+        <property name="can-focus">True</property>
         <child>
           <object class="GtkHeaderBar" id="side_header_bar">
-            <property name="width_request">300</property>
+            <property name="width-request">300</property>
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="has_subtitle">False</property>
+            <property name="can-focus">False</property>
+            <property name="has-subtitle">False</property>
             <child>
               <object class="GtkBox" id="side_left_header_box">
                 <property name="name">window_header_box</property>
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <child>
                   <object class="GtkMenuButton" id="start_menu_button">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="receives_default">True</property>
+                    <property name="can-focus">False</property>
+                    <property name="receives-default">True</property>
                     <child>
                       <object class="GtkImage" id="start_image">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="icon_name">go-home-symbolic</property>
-                        <property name="use_fallback">True</property>
+                        <property name="can-focus">False</property>
+                        <property name="icon-name">go-home-symbolic</property>
+                        <property name="use-fallback">True</property>
                       </object>
                     </child>
                   </object>
@@ -368,19 +413,19 @@
               <object class="GtkBox" id="side_right_header_box">
                 <property name="name">f</property>
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <child>
                   <object class="GtkButtonBox">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="layout_style">expand</property>
+                    <property name="can-focus">False</property>
+                    <property name="layout-style">expand</property>
                     <child>
                       <object class="GtkButton" id="connect_button">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="focus_on_click">False</property>
-                        <property name="receives_default">True</property>
-                        <property name="tooltip_text" 
translatable="yes">Connect</property>
+                        <property name="can-focus">False</property>
+                        <property name="focus-on-click">False</property>
+                        <property name="receives-default">True</property>
+                        <property name="tooltip-text" 
translatable="yes">Connect</property>
                         <property name="image">connect_image</property>
                       </object>
                       <packing>
@@ -392,10 +437,10 @@
                     <child>
                       <object class="GtkButton" id="join_button">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="focus_on_click">False</property>
-                        <property name="receives_default">True</property>
-                        <property name="tooltip_text" 
translatable="yes">Join</property>
+                        <property name="can-focus">False</property>
+                        <property name="focus-on-click">False</property>
+                        <property name="receives-default">True</property>
+                        <property name="tooltip-text" 
translatable="yes">Join</property>
                         <property name="image">join_image</property>
                       </object>
                       <packing>
@@ -416,7 +461,7 @@
                 </child>
               </object>
               <packing>
-                <property name="pack_type">end</property>
+                <property name="pack-type">end</property>
                 <property name="position">1</property>
               </packing>
             </child>
@@ -429,17 +474,17 @@
         <child>
           <object class="GtkHeaderBar" id="buffer_header_bar">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="show_close_button">True</property>
+            <property name="can-focus">False</property>
+            <property name="show-close-button">True</property>
             <child type="title">
               <object class="GtkBox" id="buffer_title_box">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="spacing">6</property>
                 <child>
                   <object class="GtkLabel" id="buffer_title_label">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="label">&lt;title&gt;</property>
                     <attributes>
                       <attribute name="weight" value="bold"/>
@@ -454,7 +499,7 @@
                 <child>
                   <object class="GtkLabel" id="buffer_subtitle_label">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="label">&lt;subtitle&gt;</property>
                     <style>
                       <class name="dim-label"/>
@@ -471,16 +516,16 @@
             <child>
               <object class="GtkMenuButton" id="buffer_menu_button">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="focus_on_click">False</property>
-                <property name="receives_default">True</property>
+                <property name="can-focus">False</property>
+                <property name="focus-on-click">False</property>
+                <property name="receives-default">True</property>
                 <property name="direction">none</property>
                 <child>
                   <placeholder/>
                 </child>
               </object>
               <packing>
-                <property name="pack_type">end</property>
+                <property name="pack-type">end</property>
                 <property name="position">-1</property>
               </packing>
             </child>
Binary files old/srain-1.2.1/doc/_static/srain-emoji-buttton.png and 
new/srain-1.3.0/doc/_static/srain-emoji-buttton.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/doc/changelog.rst 
new/srain-1.3.0/doc/changelog.rst
--- old/srain-1.2.1/doc/changelog.rst   2021-04-10 07:42:45.000000000 +0200
+++ new/srain-1.3.0/doc/changelog.rst   2021-09-21 13:13:50.000000000 +0200
@@ -30,6 +30,55 @@
 
 .. _version-latest:
 
+.. _version-1.3:
+
+2021-09-23 Version 1.3.0
+========================
+
+- Features:
+
+  - Implement ISUPPORT parsing + the UTF8ONLY IRCv3 specification 
(:pull:`331`), thanks to @progval
+  - Add support for RPL_UMODEIS (:pull:`331`), thanks to @progval
+  - Make nick completion case-insensitive (:pull:`333`), thanks to @progval
+  - Add button for inserting emoji (:issue:`279`)
+
+- Bug fixes:
+
+  - Fix configuration syntax errors caused by trailing commas (:pull:`330`), 
thanks to @progval
+
+.. _version-1.2.4:
+
+2021-07-18 Version 1.2.4
+========================
+
+- Bug fixes:
+
+  - Fix bug casued by :pull:`316` (:issue:`319`)
+  - Fix crach when URL preview async task failed (:issue:`322`)
+
+.. _version-1.2.3:
+
+2021-06-26 Version 1.2.3
+========================
+
+- Bug fixes:
+
+  - Eliminate GDK warning (:pull:`316`)
+
+.. _version-1.2.2:
+
+2021-05-30 Version 1.2.2
+========================
+
+- Changed:
+
+  - Add libera.chat IRC network (:pull:`311`)
+  - Updated Dutch translation (:commit:`b6830e9`)
+
+- Bug fixes:
+
+  -  Fix windows build (:pull:`300`, :pull:`303`)
+
 .. _version-1.2.1:
 
 2021-04-02 Version 1.2.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/doc/conf.py new/srain-1.3.0/doc/conf.py
--- old/srain-1.2.1/doc/conf.py 2021-04-10 07:42:45.000000000 +0200
+++ new/srain-1.3.0/doc/conf.py 2021-09-21 13:13:50.000000000 +0200
@@ -55,9 +55,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = '1.2.0'
+version = '1.3.0'
 # The full version, including alpha/beta/rc tags.
-release = '1.2.0'
+release = '1.3.0'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -111,7 +111,7 @@
     ]
 }
 
-html_logo = '../data/icons/128x128/srain.png'
+html_logo = '../data/icons/hicolor/128x128/apps/im.srain.Srain.png'
 html_favicon = html_logo
 
 # -- Options for HTMLHelp output ------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/doc/install.rst 
new/srain-1.3.0/doc/install.rst
--- old/srain-1.2.1/doc/install.rst     2021-04-10 07:42:45.000000000 +0200
+++ new/srain-1.3.0/doc/install.rst     2021-09-21 13:13:50.000000000 +0200
@@ -20,6 +20,7 @@
 =================== =================================================== 
========
 meson               Only for Building                                   > 
0.45.0
 make                Optional, only for development
+appstream           Only for building, on Debian-based distributions
 coreutils           Only for building
 gcc                 Only for building
 pkg-config          Only for building
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/doc/misc.rst new/srain-1.3.0/doc/misc.rst
--- old/srain-1.2.1/doc/misc.rst        2021-04-10 07:42:45.000000000 +0200
+++ new/srain-1.3.0/doc/misc.rst        2021-09-21 13:13:50.000000000 +0200
@@ -5,8 +5,8 @@
 Hot Keys
 ========
 
-* ``ctrl + j/k``: switch chat panel
-* ``up/down``: scroll message list
+* :kbd:`ctrl + j/k`: switch chat panel
+* :kbd:`up/down`: scroll message list
 
 .. note:: Customized hot keys will be supported in the future.
 
@@ -17,3 +17,14 @@
 
 Chat logs is enabled by default, log files are located at
 ``$XDG_DATA_HOME/srain/logs``, usually it is ``~/.local/share/srain/logs``.
+
+Insert Emojis
+=============
+
+Click the emoji button or use shortcuts :kbd:`Ctrl+.` or :kbd:`Ctrl+;`.
+
+.. figure:: /_static/srain-emoji-buttton.png
+
+   Emoji button
+
+.. versionadded:: 1.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/meson.build new/srain-1.3.0/meson.build
--- old/srain-1.2.1/meson.build 2021-04-10 07:42:45.000000000 +0200
+++ new/srain-1.3.0/meson.build 2021-09-21 13:13:50.000000000 +0200
@@ -4,7 +4,7 @@
 
 project(
   'srain', 'c',
-  version: '1.2.1',
+  version: '1.3.0',
   license: 'GPL3',
   meson_version: '>= 0.45.0'
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/po/nl.po new/srain-1.3.0/po/nl.po
--- old/srain-1.2.1/po/nl.po    2021-04-10 07:42:45.000000000 +0200
+++ new/srain-1.3.0/po/nl.po    2021-09-21 13:13:50.000000000 +0200
@@ -8,14 +8,14 @@
 "Project-Id-Version: Srain 1.0.0\n"
 "Report-Msgid-Bugs-To: [email protected]\n"
 "POT-Creation-Date: 2020-08-02 16:09+0800\n"
-"PO-Revision-Date: 2020-03-07 20:14+0100\n"
-"Last-Translator: \n"
+"PO-Revision-Date: 2021-05-20 13:39+0200\n"
+"Last-Translator: Heimen Stoffels <[email protected]>\n"
 "Language-Team: \n"
 "Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.3\n"
+"X-Generator: Poedit 2.4.2\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: ../src/core/app_ui_event.c:380 ../src/core/chat_command.c:352
@@ -197,7 +197,7 @@
 
 #: ../src/core/app_ui_event.c:178
 msgid "Already reconnecting"
-msgstr "Bezig met opnieuw verbinden"
+msgstr "Bezig met opnieuw verbinden???"
 
 #: ../data/ui/config_panel.glade:122
 msgid "Appearance"
@@ -402,7 +402,8 @@
 #: ../src/core/server.c:149
 #, c-format
 msgid "Failed to chat config \"%1$s\" of server config \"%2$s\": %3$s"
-msgstr "Kan chatinstellingen '%1$s' niet toevegen aan '%2$s': %3$s"
+msgstr ""
+"De chatinstellingen '%1$s' kunnen niet worden toegevoegd aan '%2$s': %3$s"
 
 #: ../src/sui/sui_join_panel.c:378
 #, c-format
@@ -427,7 +428,7 @@
 #: ../src/lib/path.c:301
 #, c-format
 msgid "Failed to create chat logs directory: %1$s"
-msgstr "Kan de chatlogmap niet aanmaken: %1$s"
+msgstr "Kan de logboekmap niet aanmaken: %1$s"
 
 #: ../src/lib/path.c:281
 #, c-format
@@ -558,7 +559,7 @@
 
 #: ../src/sui/sui_message.c:261
 msgid "Forward to..."
-msgstr "Doorsturen naar..."
+msgstr "Doorsturen naar???"
 
 #: ../src/core/server_state.c:92
 msgid ""
@@ -567,7 +568,7 @@
 
 #: ../src/sirc/sirc_config.c:37
 msgid "Invalid IRC config instance"
-msgstr "Onjuiste IRC-configuratie-instantie"
+msgstr "Verkeerd irc-configuratieproces"
 
 #: ../src/sui/sui_config.c:84
 msgid "Invalid SuiBufferConfig instance"
@@ -580,7 +581,7 @@
 #: ../src/sirc/sirc_config.c:52
 #, c-format
 msgid "Invalid encoding in IRC config: %1$s"
-msgstr "Onjuiste opmaak in IRC-configuratie: %1$s"
+msgstr "Onjuiste opmaak in irc-configuratie: %1$s"
 
 #: ../src/lib/ret.c:112
 msgid "Invalid error id, maybe this error is removed because out of date"
@@ -594,7 +595,7 @@
 
 #: ../data/ui/nick_menu.glade:50
 msgid "Invite to..."
-msgstr "Uitnodigen voor..."
+msgstr "Uitnodigen voor???"
 
 #: ../src/core/app_irc_event.c:221
 #, c-format
@@ -602,8 +603,8 @@
 "It seems that you connect to a TLS port(%1$d) without enable TLS connection, "
 "try to enable it and reconnect"
 msgstr ""
-"Het lijkt erop dat u probeert te verbinden met een TLS-poort(%1$d) zonder "
-"TLS-verbinding. Zet deze op en probeer het opnieuw."
+"Het lijkt er op dat u probeert te verbinden met een tls-poort(%1$d) zonder "
+"tls-verbinding. Zet deze op en probeer het opnieuw."
 
 #: ../data/ui/join_panel.glade:416 ../data/ui/window.glade:103
 msgid "Join"
@@ -625,12 +626,12 @@
 #: ../src/core/app_irc_event.c:1226 ../src/core/app_irc_event.c:1252
 #, c-format
 msgid "Logging in with %1$s as %2$s..."
-msgstr "Bezig met inloggen met %1$s als %2$s..."
+msgstr "Bezig met inloggen met %1$s als %2$s???"
 
 #: ../src/core/app_irc_event.c:377
 #, c-format
 msgid "Logging in with %1$s..."
-msgstr "Bezig met inloggen met %1$s..."
+msgstr "Bezig met inloggen met %1$s???"
 
 #: ../data/ui/connect_panel.glade:423
 msgid "Login certificate:"
@@ -728,7 +729,7 @@
 
 #: ../src/sui/sui_connect_panel.c:432
 msgid "No server selected"
-msgstr ""
+msgstr "Geen server gekozen"
 
 #: ../src/core/app_irc_event.c:1484
 msgid "No topic is set"
@@ -748,7 +749,7 @@
 
 #: ../src/sui/sui_app.c:131
 msgid "Open one or more IRC URLs"
-msgstr "Open ????n of meer IRC-url's"
+msgstr "Open ????n of meer irc-url's"
 
 #: ../data/ui/connect_panel.glade:485 ../data/ui/join_panel.glade:103
 msgid "Optional"
@@ -761,7 +762,7 @@
 #: ../src/core/chat_command.c:392 ../src/core/chat_command.c:812
 #, c-format
 msgid "Pattern \"%1$s\" not found"
-msgstr "Patroon '%1$s' niet aangetroffen"
+msgstr "'%1$s' is niet aangetroffen"
 
 #: ../src/core/app_irc_event.c:248
 msgid "Ping time out"
@@ -769,11 +770,14 @@
 
 #: ../src/sui/sui_join_panel.c:315
 msgid "Please connect to a server before joining any channel"
-msgstr "Maak verbinding met een server voordat u een kanaal binnengaat"
+msgstr ""
+"U dient verbinding te maken met een server voordat u een kanaal kunt "
+"binnengaan"
 
 #: ../src/sui/sui_join_panel.c:436
 msgid "Please connect to a server before searching any channel"
-msgstr "Maak verbinding met een server voordat u een kanaal zoekt"
+msgstr ""
+"U dient verbinding te maken met een server voordat u een kanaal kunt zoeken"
 
 #: ../data/ui/connect_panel.glade:106
 msgid "Quick Mode"
@@ -781,7 +785,7 @@
 
 #: ../src/core/server_state.c:172 ../src/core/server_state.c:179
 msgid "Quitting the server"
-msgstr "Bezig met weggaan"
+msgstr "Bezig met weggaan???"
 
 #: ../src/core/app_irc_event.c:952
 #, c-format
@@ -862,9 +866,9 @@
 msgstr "Server"
 
 #: ../src/core/app.c:266
-#, fuzzy, c-format
+#, c-format
 msgid "Server \"%1$s\" already exists"
-msgstr "Reeds verbonden met server"
+msgstr "???%1$s??? is al toegevoegd"
 
 #: ../src/core/app_irc_event.c:1063
 #, c-format
@@ -874,12 +878,12 @@
 #: ../src/core/app_irc_event.c:1167
 #, c-format
 msgid "Server has deleted capabilities: %1$s"
-msgstr "Server heeft functionaliteit verwijderd: %1$s"
+msgstr "De server heeft functionaliteit verwijderd: %1$s"
 
 #: ../src/core/app_irc_event.c:1096
 #, c-format
 msgid "Server has new capabilities: %1$s"
-msgstr "Server heeft nieuwe functionaliteit: %1$s"
+msgstr "De server beschikt over nieuwe functionaliteit: %1$s"
 
 #: ../src/core/server_state.c:121
 msgid "Server is already connected"
@@ -892,7 +896,7 @@
 #: ../src/core/server_state.c:149 ../src/core/server_state.c:152
 #: ../src/core/server_state.c:155 ../src/core/server_state.c:158
 msgid "Server is disconnecting"
-msgstr "Bezig met verbreken van verbinding"
+msgstr "Bezig met verbreken van verbinding???"
 
 #: ../src/config/password.c:126
 msgid "Server password"
@@ -933,7 +937,7 @@
 
 #: ../data/ui/prefs_dialog.glade:9
 msgid "Srain Preferences"
-msgstr "Srain-instellingen"
+msgstr "Srain-voorkeuren"
 
 #: ../src/sirc/sirc_config.c:70
 #, c-format
@@ -981,13 +985,13 @@
 #: ../src/core/app_irc_event.c:1399
 #, c-format
 msgid "Trying nickname: \"%1$s\"..."
-msgstr "Bezig met uitproberen van '%1$s'..."
+msgstr "Bezig met uitproberen van '%1$s'???"
 
 #: ../src/core/app_irc_event.c:203 ../src/core/app_irc_event.c:226
 #: ../src/core/app_irc_event.c:287 ../src/core/app_irc_event.c:302
 #, c-format
 msgid "Trying reconnect to %1$s(%2$s:%3$d) after %4$.1lfs..."
-msgstr "Herverbinden met %1$s(%2$s:%3$d) vindt plaats na %4$.1lfs..."
+msgstr "Opnieuw verbinden met %1$s(%2$s:%3$d) vindt plaats na %4$.1lfs???"
 
 #: ../src/core/app_irc_event.c:1836
 #, c-format
@@ -1146,7 +1150,7 @@
 
 #: ../data/ui/app.glade:13 ../data/ui/app.glade:55
 msgid "_Preferences"
-msgstr "_Instellingen"
+msgstr "_Voorkeuren"
 
 #: ../data/ui/url_previewer.glade:26
 msgid "_Preview"
@@ -1190,4 +1194,4 @@
 #: ../src/core/chat_command.c:374
 #, c-format
 msgid "user \"%1$s\" not found"
-msgstr "gebruiker '%1$s' is niet gevonden"
+msgstr "'%1$s' is niet gevonden"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/script/bump-version.sh 
new/srain-1.3.0/script/bump-version.sh
--- old/srain-1.2.1/script/bump-version.sh      2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/script/bump-version.sh      1970-01-01 01:00:00.000000000 
+0100
@@ -1,33 +0,0 @@
-#!/bin/sh
-
-OLDVER=$1
-NEWVER=$2
-
-if [ ! -e LICENSE ]; then
-    echo "Please run this script in root of project directory" >&2
-    exit 1
-fi
-
-# Version in Makefile.in
-sed -i "s/^PACKAGE_VERSION = ${OLDVER}/PACKAGE_VERSION = ${NEWVER}/" 
"Makefile.in"
-
-# Version in source code preface comment
-# for c in $(find ./src -name '*.c'); do
-#     sed -i "s/^ \* @version ${OLDVER}/ * @version ${NEWVER}/" ${c}
-# done
-# for css in $(find ./data/themes -name '*.css'); do
-#     sed -i "s/^ \* @version ${OLDVER}/ * @version ${NEWVER}/" ${css}
-# done
-
-# Version in configuration file
-sed -i "s/version = \"${OLDVER}\"/version = \"${NEWVER}\"/" "data/builtin.cfg"
-
-# Version in documentations
-sed -i "s/version = '${OLDVER}'/version = '${NEWVER}'/" "doc/conf.py"
-sed -i "s/release = '${OLDVER}'/release = '${NEWVER}'/" "doc/conf.py"
-for rst in $(find ./doc -name '*.rst'); do
-    sed -i "s/${OLDVER}\.tar\.gz/${NEWVER}.tar.gz/" ${rst}
-    sed -i "s/srain-${OLDVER}/srain-${NEWVER}/" ${rst}
-done
-
-echo Please check carefully after bumping version!
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/src/core/app_irc_event.c 
new/srain-1.3.0/src/core/app_irc_event.c
--- old/srain-1.2.1/src/core/app_irc_event.c    2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/src/core/app_irc_event.c    2021-09-21 13:13:50.000000000 
+0200
@@ -1349,6 +1349,31 @@
     g_return_if_fail(chat_user);
 
     switch (event) {
+        case SIRC_RFC_RPL_ISUPPORT:
+            {
+                for (int i = 1; i < count; i++){
+                    char *delim = strchr(params[i], '=');
+                    char *key, *value;
+                    if (delim){
+                        /* ISUPPORT token with value */
+                        key = g_strndup(params[i], delim - params[i]);
+                        value = g_strdup(delim+1);
+                    }
+                    else{
+                        /* ISUPPORT token with no value */
+                        key = g_strdup(params[i]);
+                        value = g_strdup("\0");
+                    }
+                    if (!strcmp(key, "UTF8ONLY")){
+                        /* https://ircv3.net/specs/extensions/utf8-only */
+                        str_assign(&srv->cfg->irc->encoding, "utf-8");
+                    }
+
+                    g_free(key);
+                    g_free(value);
+                }
+                /* Fall through, so ISUPPORT tokens are displayed */
+            }
         case SIRC_RFC_RPL_WELCOME:
         case SIRC_RFC_RPL_YOURHOST:
         case SIRC_RFC_RPL_CREATED:
@@ -1356,7 +1381,6 @@
         case SIRC_RFC_RPL_MOTD:
         case SIRC_RFC_RPL_ENDOFMOTD:
         case SIRC_RFC_RPL_MYINFO:
-        case SIRC_RFC_RPL_BOUNCE:
         case SIRC_RFC_RPL_LUSEROP:
         case SIRC_RFC_RPL_LUSERUNKNOWN:
         case SIRC_RFC_RPL_LUSERCHANNELS:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/src/sirc/sirc_event_hdr.c 
new/srain-1.3.0/src/sirc/sirc_event_hdr.c
--- old/srain-1.2.1/src/sirc/sirc_event_hdr.c   2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/src/sirc/sirc_event_hdr.c   2021-09-21 13:13:50.000000000 
+0200
@@ -69,6 +69,11 @@
     if (num != 0) {
         /* Numeric command */
         switch (num){
+            case SIRC_RFC_RPL_UMODEIS:
+                /* User mode changed */
+                g_return_if_fail(events->umode);
+                events->umode(sirc, imsg->cmd, origin, params, imsg->nparam);
+                return;
             case SIRC_RFC_RPL_WELCOME:
                 g_return_if_fail(events->welcome);
                 events->welcome(sirc, num, origin, params, imsg->nparam);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/src/sui/sui_buffer.c 
new/srain-1.3.0/src/sui/sui_buffer.c
--- old/srain-1.2.1/src/sui/sui_buffer.c        2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/src/sui/sui_buffer.c        2021-09-21 13:13:50.000000000 
+0200
@@ -486,6 +486,7 @@
 static GtkListStore* real_completion_func(SuiBuffer *self, const char 
*context){
     const char *prev;
     const char *prefix;
+    char *normalized_prefix;
     GList *msgs;
     GList *cmds;
     GtkListStore *store;
@@ -527,9 +528,12 @@
         prefix = "";
     }
 
+    normalized_prefix = g_utf8_strdown(prefix, -1);
+
     msgs = sui_message_list_get_recent_messages(self->msg_list, 10);
     for (GList *lst = msgs; lst; lst = g_list_next(lst)){
         const char *user;
+        char *normalized_user;
         GtkTreeIter iter;
         SuiRecvMessage *rmsg;
 
@@ -538,14 +542,21 @@
         }
         rmsg = SUI_RECV_MESSAGE(lst->data);
         user = gtk_label_get_text(rmsg->sender_label);
-        if (g_str_has_prefix(user, prefix)){
+        normalized_user = g_utf8_strdown(user, -1);
+        if (g_str_has_prefix(normalized_user, normalized_prefix)){
             gtk_list_store_append(store, &iter);
+
+            // "Same" prefix, but with the right casing for the user
+            char *corrected_prefix = g_strndup(user, strlen(prefix));
             gtk_list_store_set(store, &iter,
-                    SUI_COMPLETION_COLUMN_PREFIX, prefix,
+                    SUI_COMPLETION_COLUMN_PREFIX, corrected_prefix,
                     SUI_COMPLETION_COLUMN_SUFFIX, user + strlen(prefix),
                     -1);
+            g_free(corrected_prefix);
         }
+        g_free(normalized_user);
     }
+    g_free(normalized_prefix);
     g_list_free(msgs);
 
     return store;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/src/sui/sui_chat_buffer.c 
new/srain-1.3.0/src/sui/sui_chat_buffer.c
--- old/srain-1.2.1/src/sui/sui_chat_buffer.c   2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/src/sui/sui_chat_buffer.c   2021-09-21 13:13:50.000000000 
+0200
@@ -170,17 +170,22 @@
         SuiUser *user;
         GtkTreeIter iter;
         char *suffix;
+        char *corrected_prefix;
 
         user = lst->data;
         suffix = cfg->nick_completion_suffix;
         gchar *nick_with_suffix = g_strconcat(sui_user_get_nickname(user), 
                 suffix, NULL);
         gtk_list_store_append(store, &iter);
+
+        // "Same" prefix, but with the right casing for the user
+        corrected_prefix = g_strndup(nick_with_suffix, strlen(prefix));
         gtk_list_store_set(store, &iter,
-                SUI_COMPLETION_COLUMN_PREFIX, prefix,
+                SUI_COMPLETION_COLUMN_PREFIX, corrected_prefix,
                 SUI_COMPLETION_COLUMN_SUFFIX, nick_with_suffix + 
strlen(prefix),
                 -1);
         g_free(nick_with_suffix);
+        g_free(corrected_prefix);
     }
     g_list_free_full(users, (GDestroyNotify)sui_user_free);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/src/sui/sui_completion.c 
new/srain-1.3.0/src/sui/sui_completion.c
--- old/srain-1.2.1/src/sui/sui_completion.c    2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/src/sui/sui_completion.c    2021-09-21 13:13:50.000000000 
+0200
@@ -189,7 +189,7 @@
 
         ctx = gtk_text_buffer_get_text(buf, &start, &comp, FALSE);
         if (!g_str_has_suffix(ctx, self->last_prefix)){
-            DBG_FR("Last prefix chagned: '%s' -> '%s'",
+            DBG_FR("Last prefix changed: '%s' -> '%s'",
                     ctx, self->last_prefix);
 
             g_free(ctx);
@@ -207,7 +207,7 @@
 
         suffix = gtk_text_buffer_get_text(buf, &comp, &cursor, FALSE);
         if (g_ascii_strcasecmp(suffix, self->last_suffix) != 0){
-            DBG_FR("Last suffix chagned: '%s' -> '%s'",
+            DBG_FR("Last suffix changed: '%s' -> '%s'",
                     suffix, self->last_suffix);
 
             g_free(suffix);
@@ -234,7 +234,15 @@
     DBG_FR("Completion: prefix: '%s', suffix: '%s'",
             self->last_prefix, self->last_suffix);
 
+
+    // Go backward, to remove the prefix
+    g_return_if_fail(gtk_text_iter_backward_chars(&comp, 
g_utf8_strlen(self->last_prefix, -1)));
+
+    // Remove prefix and suffix
     gtk_text_buffer_delete(buf, &comp, &cursor);
+
+    // Add prefix, then suffix
+    gtk_text_buffer_insert(buf, &comp, self->last_prefix, 
strlen(self->last_prefix));
     gtk_text_buffer_insert(buf, &comp, self->last_suffix, 
strlen(self->last_suffix));
 
     if (!gtk_tree_model_iter_next(self->model, &self->iter)){
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/src/sui/sui_url_previewer.c 
new/srain-1.3.0/src/sui/sui_url_previewer.c
--- old/srain-1.2.1/src/sui/sui_url_previewer.c 2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/src/sui/sui_url_previewer.c 2021-09-21 13:13:50.000000000 
+0200
@@ -123,41 +123,41 @@
 
 static void sui_url_previewer_set_property(GObject *object, guint property_id,
         const GValue *value, GParamSpec *pspec){
-  SuiUrlPreviewer *self;
+    SuiUrlPreviewer *self;
 
-  self = SUI_URL_PREVIEWER(object);
+    self = SUI_URL_PREVIEWER(object);
 
-  switch (property_id){
-    case PROP_URL:
-      sui_url_previewer_set_url(self, g_value_get_string(value));
-      break;
-    case PROP_CONTENT_TYPE:
-      sui_url_previewer_set_content_type(self, g_value_get_int(value));
-      break;
-    default:
-      /* We don't have any other property... */
-      G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
-      break;
+    switch (property_id){
+        case PROP_URL:
+            sui_url_previewer_set_url(self, g_value_get_string(value));
+            break;
+        case PROP_CONTENT_TYPE:
+            sui_url_previewer_set_content_type(self, g_value_get_int(value));
+            break;
+        default:
+            /* We don't have any other property... */
+            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+            break;
     }
 }
 
 static void sui_url_previewer_get_property(GObject *object, guint property_id,
         GValue *value, GParamSpec *pspec){
-  SuiUrlPreviewer *self;
+    SuiUrlPreviewer *self;
 
-  self = SUI_URL_PREVIEWER(object);
+    self = SUI_URL_PREVIEWER(object);
 
-  switch (property_id){
-    case PROP_URL:
-      g_value_set_string(value, sui_url_previewer_get_url(self));
-      break;
-    case PROP_CONTENT_TYPE:
-      g_value_set_int(value, sui_url_previewer_get_content_type(self));
-      break;
-    default:
-      /* We don't have any other property... */
-      G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
-      break;
+    switch (property_id){
+        case PROP_URL:
+            g_value_set_string(value, sui_url_previewer_get_url(self));
+            break;
+        case PROP_CONTENT_TYPE:
+            g_value_set_int(value, sui_url_previewer_get_content_type(self));
+            break;
+        default:
+            /* We don't have any other property... */
+            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+            break;
     }
 }
 
@@ -207,6 +207,7 @@
     if (self->uri) {
         soup_uri_free(self->uri);
     }
+    g_cancellable_cancel(self->cancel);
     g_object_unref(self->cancel);
     if (SOUP_IS_MESSAGE(self->msg)){
         g_object_unref(self->msg);
@@ -424,7 +425,7 @@
     sui_common_scale_size(gdk_pixbuf_get_width(pixbuf), 
gdk_pixbuf_get_height(pixbuf),
             THUMBNAIL_SIZE, THUMBNAIL_SIZE, &width, &height);
     scaled_pixbuf = gdk_pixbuf_scale_simple(pixbuf, width, height,
-                        GDK_INTERP_BILINEAR);
+            GDK_INTERP_BILINEAR);
 
     self->pixbuf = g_object_ref(pixbuf);
     gtk_image_set_from_pixbuf(self->image, scaled_pixbuf);
@@ -531,21 +532,20 @@
     SoupMessageHeaders *headers;
     SuiUrlPreviewer *self;
 
-
     session = SOUP_SESSION(object);
-    self = SUI_URL_PREVIEWER(user_data);
-
-    // Freeze notify because PROP_CONTENT_TYPE may be modified here
-    g_object_freeze_notify(G_OBJECT(self));
-
+    self = NULL;
     err = NULL;
     input_stream = soup_session_send_finish(session, result, &err);
     if (err) {
-        preview_error_text(self, err->message);
+        WARN_FR("Async soup session send aborted: %s", err->message);
         g_error_free(err);
         goto ERR;
     }
 
+    self = SUI_URL_PREVIEWER(user_data);
+    // Freeze notify because PROP_CONTENT_TYPE may be modified here
+    g_object_freeze_notify(G_OBJECT(self));
+
     headers = self->msg->response_headers;
     // TODO: chunked encoding support
     len = soup_message_headers_get_content_length(headers);
@@ -590,10 +590,13 @@
     if (G_IS_INPUT_STREAM(input_stream)){
         g_object_unref(input_stream);
     }
-    g_object_unref(self->msg);
-    self->msg = NULL;
 
-    g_object_thaw_notify(G_OBJECT(self));
+    if (self) {
+        g_object_unref(self->msg);
+        self->msg = NULL;
+
+        g_object_thaw_notify(G_OBJECT(self));
+    }
 }
 
 static void buffered_stream_fill_ready(GObject *object, GAsyncResult *result,
@@ -605,15 +608,16 @@
     SuiUrlPreviewer *self;
 
     buffered_stream = G_BUFFERED_INPUT_STREAM(object);
-    self = SUI_URL_PREVIEWER(user_data);
+    self = NULL;
 
     err = NULL;
     g_buffered_input_stream_fill_finish(buffered_stream, result, &err);
     if (err) {
-        preview_error_text(self, err->message);
+        WARN_FR("Async soup session input stream aborted: %s", err->message);
         g_error_free(err);
         goto FIN;
     }
+    self = SUI_URL_PREVIEWER(user_data);
 
     {
         int avail;
@@ -676,6 +680,8 @@
 
 FIN:
     g_object_unref(buffered_stream);
-    g_object_unref(self->msg);
-    self->msg = NULL;
+    if (self) {
+        g_object_unref(self->msg);
+        self->msg = NULL;
+    }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/src/sui/sui_user.c 
new/srain-1.3.0/src/sui/sui_user.c
--- old/srain-1.2.1/src/sui/sui_user.c  2021-04-10 07:42:45.000000000 +0200
+++ new/srain-1.3.0/src/sui/sui_user.c  2021-09-21 13:13:50.000000000 +0200
@@ -135,16 +135,19 @@
         }
     }
     self->type = self->ctx->type;
-
-    cairo_surface_t *icon = new_user_icon_from_type(self->ctx->type,
-            style_context, window);
     gtk_list_store_set(self->list, (GtkTreeIter *)self,
             COL_NAME, self->ctx->srv_user->nick,
-            COL_ICON, icon,
             COL_USER, self->ctx,
             COL_TYPE, self->ctx->type,
             -1);
-    cairo_surface_destroy(icon);
+
+    // Update icon only when GdkWindow available
+    if (window) {
+        cairo_surface_t *icon = new_user_icon_from_type(self->ctx->type,
+                style_context, window);
+        gtk_list_store_set(self->list, (GtkTreeIter *)self, COL_ICON, icon, 
-1);
+        cairo_surface_destroy(icon);
+    }
 }
 
 void sui_user_set_list(SuiUser *self, GtkListStore *list){
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/src/sui/sui_user_list.c 
new/srain-1.3.0/src/sui/sui_user_list.c
--- old/srain-1.2.1/src/sui/sui_user_list.c     2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/src/sui/sui_user_list.c     2021-09-21 13:13:50.000000000 
+0200
@@ -147,22 +147,28 @@
     GList *users;
     GtkTreeModel *model;
     GtkTreeIter iter;
+    char *normalized_prefix;
 
     model = GTK_TREE_MODEL(self->user_list_store);
     if (!gtk_tree_model_get_iter_first(model, &iter)){
         return NULL;
     }
 
+    normalized_prefix = g_utf8_strdown(prefix, -1);
+
     users = NULL;
     do {
         SuiUser *user;
+        char *normalized_nickname;
 
         user = sui_user_new_from_iter(GTK_LIST_STORE(model), &iter);
-        if (g_str_has_prefix(sui_user_get_nickname(user), prefix)){
+        normalized_nickname = g_utf8_strdown(sui_user_get_nickname(user), -1);
+        if (g_str_has_prefix(normalized_nickname, normalized_prefix)){
             users = g_list_append(users, user);
         } else {
             sui_user_free(user);
         }
+        g_free(normalized_nickname);
     } while (gtk_tree_model_iter_next(model, &iter));
 
     return users;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/srain-1.2.1/src/sui/sui_window.c 
new/srain-1.3.0/src/sui/sui_window.c
--- old/srain-1.2.1/src/sui/sui_window.c        2021-04-10 07:42:45.000000000 
+0200
+++ new/srain-1.3.0/src/sui/sui_window.c        2021-09-21 13:13:50.000000000 
+0200
@@ -91,6 +91,7 @@
     GtkTextView *input_text_view;
     GtkButton *send_button;
     int send_timer;
+    GtkButton *insert_emoji_button;
 
     /* Panels */
     SuiConnectPanel *connect_panel;
@@ -130,6 +131,7 @@
         GdkEventKey *event, gpointer user_data);
 static void send_button_on_clicked(GtkWidget *widget, gpointer user_data);
 static gboolean send_message_timeout(gpointer user_data);
+static void insert_emoji_button_on_clicked(GtkWidget *widget, gpointer 
user_data);
 
 /*****************************************************************************
  * GObject functions
@@ -246,6 +248,8 @@
             G_CALLBACK(input_text_view_on_key_press), self);
     g_signal_connect(self->send_button, "clicked",
             G_CALLBACK(send_button_on_clicked), self);
+    g_signal_connect(self->insert_emoji_button, "clicked",
+            G_CALLBACK(insert_emoji_button_on_clicked), self);
 
     /* shortcut <C-j> and <C-k> */
     accel = gtk_accel_group_new();
@@ -265,6 +269,12 @@
     g_closure_unref(closure_j);
     g_closure_unref(closure_k);
 
+#if GTK_CHECK_VERSION(3, 22, 27)
+    // Show insert_emoji_button when it is available
+    //
+    // ref: https://docs.gtk.org/gtk3/signal.TextView.insert-emoji.html
+    gtk_widget_show(GTK_WIDGET(self->insert_emoji_button));
+#endif
 }
 
 static void sui_window_constructed(GObject *object){
@@ -374,6 +384,7 @@
     gtk_widget_class_bind_template_child(widget_class, SuiWindow, 
plugin_button);
     gtk_widget_class_bind_template_child(widget_class, SuiWindow, 
input_text_view);
     gtk_widget_class_bind_template_child(widget_class, SuiWindow, send_button);
+    gtk_widget_class_bind_template_child(widget_class, SuiWindow, 
insert_emoji_button);
 }
 
 /*****************************************************************************
@@ -776,6 +787,13 @@
     return G_SOURCE_CONTINUE;
 }
 
+static void insert_emoji_button_on_clicked(GtkWidget *widget, gpointer 
user_data){
+    SuiWindow *self;
+
+    self = SUI_WINDOW(user_data);
+    g_signal_emit_by_name(G_OBJECT(self->input_text_view), "insert-emoji");
+}
+
 static void window_stack_on_child_changed(GtkWidget *widget, GParamSpec *pspec,
         gpointer user_data){
     SuiWindow *self;

Reply via email to