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"><big>Welcome to Srain!</big></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"><title></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"><subtitle></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;
