Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package swappy for openSUSE:Factory checked 
in at 2022-12-01 17:21:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/swappy (Old)
 and      /work/SRC/openSUSE:Factory/.swappy.new.1835 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "swappy"

Thu Dec  1 17:21:26 2022 rev:7 rq:1039269 version:1.5.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/swappy/swappy.changes    2022-10-18 
12:45:35.589804779 +0200
+++ /work/SRC/openSUSE:Factory/.swappy.new.1835/swappy.changes  2022-12-01 
17:22:27.546638771 +0100
@@ -1,0 +2,15 @@
+Thu Dec  1 08:46:12 UTC 2022 - Michael Vetter <mvet...@suse.com>
+
+- Update to 1.5.1:
+  * ui: use *-symbolic variant of toolbar icons (5dc44f8), closes #34
+
+-------------------------------------------------------------------
+Thu Dec  1 08:45:41 UTC 2022 - Michael Vetter <mvet...@suse.com>
+
+- Update to 1.5.0:
+  * config: add early_exit option (60da549)
+  * config: allow paint_mode to be configured through config file (2f35f02)
+  * config: try to create save_dir if it does not exist (4fb291a)
+  * ui: allow filling rectangles and ellipsis (8ee55f7), closes #120
+
+-------------------------------------------------------------------

Old:
----
  swappy-1.4.0.tar.gz.sig
  v1.4.0.tar.gz

New:
----
  swappy-1.5.1.tar.gz.sig
  v1.5.1.tar.gz

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

Other differences:
------------------
++++++ swappy.spec ++++++
--- /var/tmp/diff_new_pack.AavoHo/_old  2022-12-01 17:22:28.118641899 +0100
+++ /var/tmp/diff_new_pack.AavoHo/_new  2022-12-01 17:22:28.122641921 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           swappy
-Version:        1.4.0
+Version:        1.5.1
 Release:        0
 Summary:        Wayland compositor screenshot editor
 License:        MIT

++++++ v1.4.0.tar.gz -> v1.5.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/.versionrc new/swappy-1.5.1/.versionrc
--- old/swappy-1.4.0/.versionrc 2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/.versionrc 2022-11-20 22:50:09.000000000 +0100
@@ -3,6 +3,9 @@
     {
       "filename": "meson.build",
       "updater": "script/bump-meson-build.js"
+    },
+    {
+      "filename": "package.json"
     }
   ]
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/CHANGELOG.md 
new/swappy-1.5.1/CHANGELOG.md
--- old/swappy-1.4.0/CHANGELOG.md       2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/CHANGELOG.md       2022-11-20 22:50:09.000000000 +0100
@@ -2,6 +2,23 @@
 
 All notable changes to this project will be documented in this file. See 
[standard-version](https://github.com/conventional-changelog/standard-version) 
for commit guidelines.
 
+### [1.5.1](https://github.com/jtheoof/swappy/compare/v1.5.0...v1.5.1) 
(2022-11-20)
+
+
+### Bug Fixes
+
+* **ui:** use *-symbolic variant of toolbar icons 
([5dc44f8](https://github.com/jtheoof/swappy/commit/5dc44f8970b0f6cdf21466bc2689ec2aa93a4385)),
 closes [#34](https://github.com/jtheoof/swappy/issues/34)
+
+## [1.5.0](https://github.com/jtheoof/swappy/compare/v1.4.0...v1.5.0) 
(2022-11-18)
+
+
+### Features
+
+* **config:** add early_exit option 
([60da549](https://github.com/jtheoof/swappy/commit/60da5491e243c9edd85f6225326a68ae5e3edfd5))
+* **config:** allow paint_mode to be configured through config file 
([2f35f02](https://github.com/jtheoof/swappy/commit/2f35f02b4e89bf67b6e9cc461e874331d8ce2a4c))
+* **config:** try to create `save_dir` if it does not exist 
([4fb291a](https://github.com/jtheoof/swappy/commit/4fb291ad4b0b116afeaa7094b040083111b74674))
+* **ui:** allow filling rectangles and ellipsis 
([8ee55f7](https://github.com/jtheoof/swappy/commit/8ee55f7d52ce6ac71752981863f5795fef460049)),
 closes [#120](https://github.com/jtheoof/swappy/issues/120)
+
 ## [1.4.0](https://github.com/jtheoof/swappy/compare/v1.3.1...v1.4.0) 
(2021-09-06)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/README.md new/swappy-1.5.1/README.md
--- old/swappy-1.4.0/README.md  2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/README.md  2022-11-20 22:50:09.000000000 +0100
@@ -48,14 +48,20 @@
 line_size=5
 text_size=20
 text_font=sans-serif
+paint_mode=brush
+early_exit=false
+fill_shape=false
 ```
 
-- `save_dir` is where swappshots will be saved, can contain env variables and 
must exist in your filesystem
+- `save_dir` is where swappshots will be saved, can contain env variables, 
when it does not exist, swappy attempts to create it first, but does not abort 
if directory creation fails
 - `save_filename_format`: is the filename template, if it contains a date 
format, this will be parsed into a timestamp. Format is detailed in 
[strftime(3)](https://man.archlinux.org/man/strftime.3). If this date format is 
missing, filename will have no timestamp
 - `show_panel` is used to toggle the paint panel on or off upon startup
 - `line_size` is the default line size (must be between 1 and 50)
 - `text_size` is the default text size (must be between 10 and 50)
 - `text_font` is the font used to render text, its format is pango friendly
+- `paint_mode` is the mode activated at application start (must be one of: 
brush|text|rectangle|ellipse|arrow|blur, matching is case-insensitive)
+- `early_exit` is used to make the application exit after saving the picture 
or copying it to the clipboard 
+- `fill_shape` is used to toggle shape filling (for the rectangle and ellipsis 
tools) on or off upon startup
 
 ## Keyboard Shortcuts
 
@@ -79,6 +85,7 @@
 - `Minus`: Reduce Stroke Size
 - `Plus`: Increase Stroke Size
 - `Equal`: Reset Stroke Size
+- `f`: Toggle Shape Filling
 - `k`: Clear Paints (cannot be undone)
 
 <hr>
@@ -159,12 +166,11 @@
 
 We rely on 
[standard-version](https://github.com/conventional-changelog/standard-version) 
which is part of the JavaScript ecosystem but works well with any project.
 
+```sh
+./script/github-release
 ```
-npx standard-version --sign
-git push --follow-tags
-# Do the release on Github with manual steps, then:
-./script/sign-post-release
-```
+
+Make sure everything is valid in the Draft release, then publish the draft.
 
 Release tarballs are signed with this PGP key: 
`F44D05A50F6C9EB5C81BCF966A6B35DBE9442683`
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/include/config.h 
new/swappy-1.5.1/include/config.h
--- old/swappy-1.4.0/include/config.h   2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/include/config.h   2022-11-20 22:50:09.000000000 +0100
@@ -5,6 +5,9 @@
 #define CONFIG_TEXT_SIZE_DEFAULT 20
 #define CONFIG_SHOW_PANEL_DEFAULT false
 #define CONFIG_SAVE_FILENAME_FORMAT_DEFAULT "swappy-%Y%m%d_%H%M%S.png"
+#define CONFIG_PAINT_MODE_DEFAULT SWAPPY_PAINT_MODE_BRUSH
+#define CONFIG_EARLY_EXIT_DEFAULT false
+#define CONFIG_FILL_SHAPE_DEFAULT false
 
 void config_load(struct swappy_state *state);
 void config_free(struct swappy_state *state);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/include/swappy.h 
new/swappy-1.5.1/include/swappy.h
--- old/swappy-1.4.0/include/swappy.h   2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/include/swappy.h   2022-11-20 22:50:09.000000000 +0100
@@ -137,16 +137,21 @@
 
   GtkButton *line_size;
   GtkButton *text_size;
+
+  GtkToggleButton *fill_shape;
 };
 
 struct swappy_config {
   char *config_file;
   char *save_dir;
   char *save_filename_format;
+  gint8 paint_mode;
+  gboolean fill_shape;
   gboolean show_panel;
   guint32 line_size;
   guint32 text_size;
   char *text_font;
+  gboolean early_exit;
 };
 
 struct swappy_state {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/meson.build new/swappy-1.5.1/meson.build
--- old/swappy-1.4.0/meson.build        2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/meson.build        2022-11-20 22:50:09.000000000 +0100
@@ -1,7 +1,7 @@
 project(
        'swappy',
        'c',
-       version: '1.4.0',
+       version: '1.5.1',
        license: 'MIT',
        meson_version: '>=0.48.0',
        default_options: [
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/package.json 
new/swappy-1.5.1/package.json
--- old/swappy-1.4.0/package.json       1970-01-01 01:00:00.000000000 +0100
+++ new/swappy-1.5.1/package.json       2022-11-20 22:50:09.000000000 +0100
@@ -0,0 +1,9 @@
+{
+  "name": "swappy",
+  "version": "1.5.1",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/jtheoof/swappy.git";
+  },
+  "author": "Jeremy Attali"
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/res/swappy.glade 
new/swappy-1.5.1/res/swappy.glade
--- old/swappy-1.4.0/res/swappy.glade   2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/res/swappy.glade   2022-11-20 22:50:09.000000000 +0100
@@ -5,57 +5,57 @@
   <object class="GtkImage" id="edit-redo">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="icon_name">edit-redo</property>
+    <property name="icon_name">edit-redo-symbolic</property>
   </object>
   <object class="GtkImage" id="edit-undo">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="icon_name">edit-undo</property>
+    <property name="icon_name">edit-undo-symbolic</property>
   </object>
   <object class="GtkImage" id="img-clear-paints">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="icon_name">edit-delete</property>
+    <property name="icon_name">edit-delete-symbolic</property>
   </object>
   <object class="GtkImage" id="img-copy-surface">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="icon_name">edit-copy</property>
+    <property name="icon_name">edit-copy-symbolic</property>
   </object>
   <object class="GtkImage" id="img-save-surface">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="icon_name">document-save</property>
+    <property name="icon_name">document-save-symbolic</property>
   </object>
   <object class="GtkImage" id="img-toggle-panel">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="icon_name">document-properties</property>
+    <property name="icon_name">document-properties-symbolic</property>
   </object>
   <object class="GtkImage" id="zoom-in">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="icon_name">zoom-in</property>
+    <property name="icon_name">zoom-in-symbolic</property>
   </object>
   <object class="GtkImage" id="zoom-in1">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="icon_name">zoom-in</property>
+    <property name="icon_name">zoom-in-symbolic</property>
   </object>
   <object class="GtkImage" id="zoom-in2">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="icon_name">zoom-in</property>
+    <property name="icon_name">zoom-in-symbolic</property>
   </object>
   <object class="GtkImage" id="zoom-out">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="icon_name">zoom-out</property>
+    <property name="icon_name">zoom-out-symbolic</property>
   </object>
   <object class="GtkImage" id="zoom-out1">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="icon_name">zoom-out</property>
+    <property name="icon_name">zoom-out-symbolic</property>
   </object>
   <object class="GtkApplicationWindow" id="paint-window">
     <property name="visible">True</property>
@@ -582,6 +582,35 @@
                     <property name="position">4</property>
                   </packing>
                 </child>
+                <child>
+                  <object class="GtkBox">
+                    <property name="visible">True</property>
+                    <property name="can-focus">False</property>
+                    <property name="homogeneous">True</property>
+                    <child>
+                      <object class="GtkToggleButton" 
id="fill-shape-toggle-button">
+                        <property name="label" translatable="yes">Fill 
shape</property>
+                        <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">Toggle shape filling</property>
+                        <property name="always-show-image">True</property>
+                        <signal name="toggled" 
handler="fill_shape_toggled_handler" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">5</property>
+                  </packing>
+                </child>
               </object>
               <packing>
                 <property name="resize">False</property>
@@ -788,9 +817,4 @@
       </object>
     </child>
   </object>
-  <object class="GtkImage" id="zoom-out2">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="icon_name">zoom-out</property>
-  </object>
 </interface>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/script/github-release 
new/swappy-1.5.1/script/github-release
--- old/swappy-1.4.0/script/github-release      1970-01-01 01:00:00.000000000 
+0100
+++ new/swappy-1.5.1/script/github-release      2022-11-20 22:50:09.000000000 
+0100
@@ -0,0 +1,104 @@
+#!/bin/bash
+
+set -e
+
+declare -r git_root=$(git rev-parse --show-toplevel)
+declare -r app_name="swappy"
+declare -r release_folder="$git_root/release"
+
+declare version=""
+
+die() {
+  echo "$*" 1>&2
+  exit 1
+}
+
+init() {
+  command -v git >/dev/null 2>&1 || { echo >&2 "git required: pacman -S git"; 
exit 1; }
+  command -v gh >/dev/null 2>&1 || { echo >&2 "github cli tool required to 
publish the release: pacman -S github-cli"; exit 1; }
+  command -v npx >/dev/null 2>&1 || { echo >&2 "npx required for standard 
versionning the release: pacman -S npm"; exit 1; }
+  command -v gpg >/dev/null 2>&1 || { echo >&2 "gpg required to sign the 
archive: pacman -S gnupg"; exit 1; }
+
+  mkdir -p $release_folder
+}
+
+git_get_release_version() {
+  version=$(git describe --tags --abbrev=0 | sed 's/^v//')
+
+  if [ -z "$version" ]
+  then
+    die "version not found, is the git tag valid?"
+  fi
+
+  echo "found latest version: $version"
+}
+
+npx_standard_version() {
+  echo "setting up new standard version with npx..."
+  npx standard-version --sign
+}
+
+git_push_tags() {
+  echo "pushing git tags..."
+  git push --follow-tags
+}
+
+
+git_build_archive() {
+  echo "building source archives..."
+  cd $git_root
+  git archive -o "$release_folder/$app_name-$version.tar.gz" --format tar.gz 
--prefix "$app_name-$version/" "v$version"
+}
+
+download_source_for_release() {
+  echo "downloading source assets..."
+  cd $release_folder
+  curl --location --output github-$app_name-$version.tar.gz 
https://github.com/jtheoof/$app_name/archive/v$version.tar.gz
+}
+
+verify_sha256_checksums() {
+  echo "verifying signatures..."
+  cd $release_folder
+  sha256sum $app_name-$version.tar.gz | awk '{ print $1 }' > 
$app_name-$version.tar.gz.sha256
+
+  # sha256sum --check will exit if the checksums do not match
+  echo "$(cat $app_name-$version.tar.gz.sha256) 
github-$app_name-$version.tar.gz" | sha256sum --check
+}
+
+gpg_sign_archive() {
+  echo "signing source assets..."
+  cd $release_folder
+  gpg --output $app_name-$version.tar.gz.sig --detach-sign 
$app_name-$version.tar.gz
+}
+
+git_generate_changelog() {
+  echo "generating changelog..."
+  git diff "v$version"^ -- CHANGELOG.md | tail -n +9 | head -n -4 | sed 
's/^+//g' > $release_folder/CHANGELOG.md
+}
+
+github_create_release() {
+  echo "creating github release..."
+  gh release create --draft "v$version" \
+    -F "$release_folder/CHANGELOG.md" \
+    "$release_folder/$app_name-$version.tar.gz" \
+    "$release_folder/$app_name-$version.tar.gz.sig" \
+    "$release_folder/CHANGELOG.md"
+}
+
+main() {
+  init
+
+  npx_standard_version
+  git_push_tags
+  git_get_release_version
+  git_build_archive
+  # Turning off manual downloading from github
+  # doing all the steps, including archive, ourselves.
+  #download_source_for_release
+  #verify_sha256_checksums
+  git_generate_changelog
+  gpg_sign_archive
+  github_create_release
+}
+
+main "$@"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/script/sign-post-release 
new/swappy-1.5.1/script/sign-post-release
--- old/swappy-1.4.0/script/sign-post-release   2021-09-06 16:36:15.000000000 
+0200
+++ new/swappy-1.5.1/script/sign-post-release   1970-01-01 01:00:00.000000000 
+0100
@@ -1,78 +0,0 @@
-#!/bin/bash
-
-set -e
-
-declare -r git_root=$(git rev-parse --show-toplevel)
-declare -r app_name="swappy"
-declare -r release_folder="$git_root/release"
-
-declare version=""
-
-die() {
-  echo "$*" 1>&2
-  exit 1
-}
-
-init() {
-  command -v gh >/dev/null 2>&1 || { echo >&2 "github cli tool required: 
pacman -S github-cli"; exit 1; }
-
-  mkdir -p $release_folder
-}
-
-get_release_version() {
-  version=$(git describe | sed 's/^v//')
-  echo "found latest version: $version"
-}
-
-build_archives_from_source() {
-  echo "building source archives..."
-  cd $git_root
-  git archive -o "$release_folder/local-$app_name-$version.tar.gz" --format 
tar.gz --prefix "$app_name-$version/" "v$version"
-}
-
-
-download_source_for_release() {
-  echo "downloading source assets..."
-  cd $release_folder
-  curl --location --output github-$app_name-$version.tar.gz 
https://github.com/jtheoof/$app_name/archive/v$version.tar.gz
-}
-
-verify_sha256_checksums() {
-  echo "verifying signatures..."
-  cd $release_folder
-  sha256sum local-$app_name-$version.tar.gz | awk '{ print $1 }' > 
local-$app_name-$version.tar.gz.sha256
-
-  # sha256sum --check will exit if the checksums do not match
-  echo "$(cat local-$app_name-$version.tar.gz.sha256) 
github-$app_name-$version.tar.gz" | sha256sum --check
-}
-
-sign_release_source() {
-  echo "signing source assets..."
-  cd $release_folder
-  gpg --output $app_name-$version.tar.gz.sig --detach-sign 
github-$app_name-$version.tar.gz
-}
-
-upload_signed_assets_to_release() {
-  echo "uploading signatures to github release..."
-  cd $release_folder
-  gh release upload v$version $app_name-$version.tar.gz.sig  --clobber
-}
-
-
-main() {
-  init
-  get_release_version
-
-  if [ -z "$version" ]
-  then
-    die "version not found, is the git tag valid?"  
-  fi
-
-  build_archives_from_source
-  download_source_for_release
-  verify_sha256_checksums
-  sign_release_source
-  upload_signed_assets_to_release
-}
-
-main "$@"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/src/application.c 
new/swappy-1.5.1/src/application.c
--- old/swappy-1.4.0/src/application.c  2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/src/application.c  2022-11-20 22:50:09.000000000 +0100
@@ -45,6 +45,36 @@
   gtk_widget_set_visible(painting_box, toggled);
 }
 
+static void update_ui_fill_shape_toggle_button(struct swappy_state *state) {
+  GtkToggleButton *button = GTK_TOGGLE_BUTTON(state->ui->fill_shape);
+  gboolean toggled = state->config->fill_shape;
+
+  gtk_toggle_button_set_active(button, toggled);
+}
+
+void application_finish(struct swappy_state *state) {
+  g_debug("application finishing, cleaning up");
+  paint_free_all(state);
+  pixbuf_free(state);
+  cairo_surface_destroy(state->rendering_surface);
+  cairo_surface_destroy(state->original_image_surface);
+  if (state->temp_file_str) {
+    g_info("deleting temporary file: %s", state->temp_file_str);
+    if (g_unlink(state->temp_file_str) != 0) {
+      g_warning("unable to delete temporary file: %s", state->temp_file_str);
+    }
+    g_free(state->temp_file_str);
+  }
+  g_free(state->file_str);
+  g_free(state->geometry);
+  g_free(state->window);
+  g_free(state->ui);
+
+  g_object_unref(state->app);
+
+  config_free(state);
+}
+
 static void action_undo(struct swappy_state *state) {
   GList *first = state->paints;
 
@@ -103,26 +133,32 @@
 
 static void switch_mode_to_brush(struct swappy_state *state) {
   state->mode = SWAPPY_PAINT_MODE_BRUSH;
+  gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), false);
 }
 
 static void switch_mode_to_text(struct swappy_state *state) {
   state->mode = SWAPPY_PAINT_MODE_TEXT;
+  gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), false);
 }
 
 static void switch_mode_to_rectangle(struct swappy_state *state) {
   state->mode = SWAPPY_PAINT_MODE_RECTANGLE;
+  gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), true);
 }
 
 static void switch_mode_to_ellipse(struct swappy_state *state) {
   state->mode = SWAPPY_PAINT_MODE_ELLIPSE;
+  gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), true);
 }
 
 static void switch_mode_to_arrow(struct swappy_state *state) {
   state->mode = SWAPPY_PAINT_MODE_ARROW;
+  gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), false);
 }
 
 static void switch_mode_to_blur(struct swappy_state *state) {
   state->mode = SWAPPY_PAINT_MODE_BLUR;
+  gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), false);
 }
 
 static void action_stroke_size_decrease(struct swappy_state *state) {
@@ -179,6 +215,18 @@
   update_ui_text_size_widget(state);
 }
 
+static void action_fill_shape_toggle(struct swappy_state *state,
+                                     gboolean *toggled) {
+  // Don't allow changing the state via a shortcut if the button can't be
+  // clicked.
+  if (!gtk_widget_get_sensitive(GTK_WIDGET(state->ui->fill_shape))) return;
+
+  gboolean toggle = (toggled == NULL) ? !state->config->fill_shape : *toggled;
+  state->config->fill_shape = toggle;
+
+  update_ui_fill_shape_toggle_button(state);
+}
+
 static void save_state_to_file_or_folder(struct swappy_state *state,
                                          char *file) {
   GdkPixbuf *pixbuf = pixbuf_get_from_state(state);
@@ -191,6 +239,10 @@
   }
 
   g_object_unref(pixbuf);
+
+  if (state->config->early_exit) {
+    gtk_main_quit();
+  }
 }
 
 static void maybe_save_output_file(struct swappy_state *state) {
@@ -254,28 +306,6 @@
   switch_mode_to_blur(state);
 }
 
-void application_finish(struct swappy_state *state) {
-  paint_free_all(state);
-  pixbuf_free(state);
-  cairo_surface_destroy(state->rendering_surface);
-  cairo_surface_destroy(state->original_image_surface);
-  if (state->temp_file_str) {
-    g_info("deleting temporary file: %s", state->temp_file_str);
-    if (g_unlink(state->temp_file_str) != 0) {
-      g_warning("unable to delete temporary file: %s", state->temp_file_str);
-    }
-    g_free(state->temp_file_str);
-  }
-  g_free(state->file_str);
-  g_free(state->geometry);
-  g_free(state->window);
-  g_free(state->ui);
-
-  g_object_unref(state->app);
-
-  config_free(state);
-}
-
 void save_clicked_handler(GtkWidget *widget, struct swappy_state *state) {
   // Commit a potential paint (e.g. text being written)
   commit_state(state);
@@ -404,6 +434,9 @@
       case GDK_KEY_Control_L:
         control_modifier_changed(true, state);
         break;
+      case GDK_KEY_f:
+        action_fill_shape_toggle(state, NULL);
+        break;
       default:
         break;
     }
@@ -608,6 +641,12 @@
   action_text_size_increase(state);
 }
 
+void fill_shape_toggled_handler(GtkWidget *widget, struct swappy_state *state) 
{
+  GtkToggleButton *button = GTK_TOGGLE_BUTTON(widget);
+  gboolean toggled = gtk_toggle_button_get_active(button);
+  action_fill_shape_toggle(state, &toggled);
+}
+
 static void compute_window_size_and_scaling_factor(struct swappy_state *state) 
{
   GdkRectangle workarea = {0};
   GdkDisplay *display = gdk_display_get_default();
@@ -743,6 +782,9 @@
   state->ui->text_size =
       GTK_BUTTON(gtk_builder_get_object(builder, "text-size-button"));
 
+  state->ui->fill_shape = GTK_TOGGLE_BUTTON(
+      gtk_builder_get_object(builder, "fill-shape-toggle-button"));
+
   state->ui->brush = brush;
   state->ui->text = text;
   state->ui->rectangle = rectangle;
@@ -762,6 +804,38 @@
   return true;
 }
 
+static void set_paint_mode(struct swappy_state *state) {
+  switch (state->mode) {
+    case SWAPPY_PAINT_MODE_BRUSH:
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(state->ui->brush), true);
+      gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), false);
+      break;
+    case SWAPPY_PAINT_MODE_TEXT:
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(state->ui->text), true);
+      gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), false);
+      break;
+    case SWAPPY_PAINT_MODE_RECTANGLE:
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(state->ui->rectangle),
+                                   true);
+      gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), true);
+      break;
+    case SWAPPY_PAINT_MODE_ELLIPSE:
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(state->ui->ellipse), 
true);
+      gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), true);
+      break;
+    case SWAPPY_PAINT_MODE_ARROW:
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(state->ui->arrow), true);
+      gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), false);
+      break;
+    case SWAPPY_PAINT_MODE_BLUR:
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(state->ui->blur), true);
+      gtk_widget_set_sensitive(GTK_WIDGET(state->ui->fill_shape), false);
+      break;
+    default:
+      break;
+  }
+}
+
 static bool init_gtk_window(struct swappy_state *state) {
   if (!state->original_image) {
     g_critical("original image not loaded");
@@ -776,10 +850,13 @@
     return false;
   }
 
+  set_paint_mode(state);
+
   update_ui_stroke_size_widget(state);
   update_ui_text_size_widget(state);
   update_ui_undo_redo(state);
   update_ui_panel_toggle_button(state);
+  update_ui_fill_shape_toggle_button(state);
 
   return true;
 }
@@ -799,6 +876,7 @@
   state->settings.a = 1;
   state->settings.w = state->config->line_size;
   state->settings.t = state->config->text_size;
+  state->mode = state->config->paint_mode;
 }
 
 static gint command_line_handler(GtkApplication *app,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/src/clipboard.c 
new/swappy-1.5.1/src/clipboard.c
--- old/swappy-1.4.0/src/clipboard.c    2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/src/clipboard.c    2022-11-20 22:50:09.000000000 +0100
@@ -82,5 +82,9 @@
 
   g_object_unref(pixbuf);
 
+  if (state->config->early_exit) {
+    gtk_main_quit();
+  }
+
   return true;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/src/config.c 
new/swappy-1.5.1/src/config.c
--- old/swappy-1.4.0/src/config.c       2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/src/config.c       2022-11-20 22:50:09.000000000 +0100
@@ -19,6 +19,9 @@
   g_info("line_size: %d", config->line_size);
   g_info("text_font: %s", config->text_font);
   g_info("text_size: %d", config->text_size);
+  g_info("paint_mode: %d", config->paint_mode);
+  g_info("early_exit: %d", config->early_exit);
+  g_info("fill_shape: %d", config->fill_shape);
 }
 
 static char *get_default_save_dir() {
@@ -75,6 +78,9 @@
   gchar *save_dir_expanded = NULL;
   guint64 line_size, text_size;
   gchar *text_font = NULL;
+  gchar *paint_mode = NULL;
+  gboolean early_exit;
+  gboolean fill_shape;
   GError *error = NULL;
 
   if (file == NULL) {
@@ -97,7 +103,11 @@
       save_dir_expanded = g_strdup(p.we_wordv[0]);
       wordfree(&p);
       if (!save_dir_expanded || !folder_exists(save_dir_expanded)) {
-        g_warning("save_dir: %s is not a valid directory", save_dir_expanded);
+        g_info("save_dir: attempting to create non-existent directory '%s'",
+               save_dir_expanded);
+        if (g_mkdir_with_parents(save_dir_expanded, 0755)) {
+          g_warning("save_dir: failed to create '%s'", save_dir_expanded);
+        }
       }
 
       g_free(save_dir);
@@ -176,6 +186,52 @@
     error = NULL;
   }
 
+  early_exit = g_key_file_get_boolean(gkf, group, "early_exit", &error);
+
+  if (error == NULL) {
+    config->early_exit = early_exit;
+  } else {
+    g_info("early_exit is missing in %s (%s)", file, error->message);
+    g_error_free(error);
+    error = NULL;
+  }
+
+  paint_mode = g_key_file_get_string(gkf, group, "paint_mode", &error);
+
+  if (error == NULL) {
+    if (g_ascii_strcasecmp(paint_mode, "brush") == 0) {
+      config->paint_mode = SWAPPY_PAINT_MODE_BRUSH;
+    } else if (g_ascii_strcasecmp(paint_mode, "text") == 0) {
+      config->paint_mode = SWAPPY_PAINT_MODE_TEXT;
+    } else if (g_ascii_strcasecmp(paint_mode, "rectangle") == 0) {
+      config->paint_mode = SWAPPY_PAINT_MODE_RECTANGLE;
+    } else if (g_ascii_strcasecmp(paint_mode, "ellipse") == 0) {
+      config->paint_mode = SWAPPY_PAINT_MODE_ELLIPSE;
+    } else if (g_ascii_strcasecmp(paint_mode, "arrow") == 0) {
+      config->paint_mode = SWAPPY_PAINT_MODE_ARROW;
+    } else if (g_ascii_strcasecmp(paint_mode, "blur") == 0) {
+      config->paint_mode = SWAPPY_PAINT_MODE_BLUR;
+    } else {
+      g_warning(
+          "paint_mode is not a valid value: %s - see man page for details",
+          paint_mode);
+    }
+  } else {
+    g_info("paint_mode is missing in %s (%s)", file, error->message);
+    g_error_free(error);
+    error = NULL;
+  }
+
+  fill_shape = g_key_file_get_boolean(gkf, group, "fill_shape", &error);
+
+  if (error == NULL) {
+    config->fill_shape = fill_shape;
+  } else {
+    g_info("fill_shape is missing in %s (%s)", file, error->message);
+    g_error_free(error);
+    error = NULL;
+  }
+
   g_key_file_free(gkf);
 }
 
@@ -190,6 +246,9 @@
   config->text_font = g_strdup(CONFIG_TEXT_FONT_DEFAULT);
   config->text_size = CONFIG_TEXT_SIZE_DEFAULT;
   config->show_panel = CONFIG_SHOW_PANEL_DEFAULT;
+  config->paint_mode = CONFIG_PAINT_MODE_DEFAULT;
+  config->early_exit = CONFIG_EARLY_EXIT_DEFAULT;
+  config->fill_shape = CONFIG_FILL_SHAPE_DEFAULT;
 }
 
 void config_load(struct swappy_state *state) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/src/paint.c new/swappy-1.5.1/src/paint.c
--- old/swappy-1.4.0/src/paint.c        2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/src/paint.c        2022-11-20 22:50:09.000000000 +0100
@@ -118,7 +118,10 @@
       paint->content.shape.a = a;
       paint->content.shape.w = w;
       paint->content.shape.type = type;
-      paint->content.shape.operation = SWAPPY_PAINT_SHAPE_OPERATION_STROKE;
+      if (state->config->fill_shape)
+        paint->content.shape.operation = SWAPPY_PAINT_SHAPE_OPERATION_FILL;
+      else
+        paint->content.shape.operation = SWAPPY_PAINT_SHAPE_OPERATION_STROKE;
       break;
     case SWAPPY_PAINT_MODE_TEXT:
       paint->can_draw = false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/src/po/de.po 
new/swappy-1.5.1/src/po/de.po
--- old/swappy-1.4.0/src/po/de.po       2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/src/po/de.po       2022-11-20 22:50:09.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: swappy\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-06-21 21:57-0400\n"
+"POT-Creation-Date: 2022-11-18 16:07-0500\n"
 "PO-Revision-Date: 2020-11-19 18:03+0300\n"
 "Last-Translator: Brodi <m...@brodi.ml>\n"
 "Language-Team: none\n"
@@ -17,34 +17,42 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: res/swappy.glade:455
+#: res/swappy.glade:456
 msgid "Line Width"
 msgstr "Linienstärke"
 
-#: res/swappy.glade:525
+#: res/swappy.glade:526
 msgid "Text Size"
 msgstr "Textgröße"
 
-#: res/swappy.glade:641
+#: res/swappy.glade:592
+msgid "Fill shape"
+msgstr ""
+
+#: res/swappy.glade:597
+msgid "Toggle shape filling"
+msgstr ""
+
+#: res/swappy.glade:671
 msgid "Toggle Paint Panel"
 msgstr "Farbtafel umschalten"
 
-#: res/swappy.glade:667
+#: res/swappy.glade:697
 msgid "Undo Last Paint"
 msgstr "Letzte Bemalung rückgängig machen"
 
-#: res/swappy.glade:686
+#: res/swappy.glade:716
 msgid "Redo Previous Paint"
 msgstr "Vorherige Bemalung wiederherstellen"
 
-#: res/swappy.glade:705
+#: res/swappy.glade:735
 msgid "Clear Paints"
 msgstr "Bemalung löschen"
 
-#: res/swappy.glade:733
+#: res/swappy.glade:763
 msgid "Copy Surface"
 msgstr "Fläche kopieren"
 
-#: res/swappy.glade:749
+#: res/swappy.glade:779
 msgid "Save Surface"
 msgstr "Fläche speichern"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/src/po/en.po 
new/swappy-1.5.1/src/po/en.po
--- old/swappy-1.4.0/src/po/en.po       2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/src/po/en.po       2022-11-20 22:50:09.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: swappy\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-06-21 21:57-0400\n"
+"POT-Creation-Date: 2022-11-18 16:07-0500\n"
 "PO-Revision-Date: 2020-06-21 21:57-0400\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -17,34 +17,42 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: res/swappy.glade:455
+#: res/swappy.glade:456
 msgid "Line Width"
 msgstr "Line Width"
 
-#: res/swappy.glade:525
+#: res/swappy.glade:526
 msgid "Text Size"
 msgstr "Text Size"
 
-#: res/swappy.glade:641
+#: res/swappy.glade:592
+msgid "Fill shape"
+msgstr "Fill shape"
+
+#: res/swappy.glade:597
+msgid "Toggle shape filling"
+msgstr "Toggle shape filling"
+
+#: res/swappy.glade:671
 msgid "Toggle Paint Panel"
 msgstr "Toggle Paint Panel"
 
-#: res/swappy.glade:667
+#: res/swappy.glade:697
 msgid "Undo Last Paint"
 msgstr "Undo Last Paint"
 
-#: res/swappy.glade:686
+#: res/swappy.glade:716
 msgid "Redo Previous Paint"
 msgstr "Redo Previous Paint"
 
-#: res/swappy.glade:705
+#: res/swappy.glade:735
 msgid "Clear Paints"
 msgstr "Clear Paints"
 
-#: res/swappy.glade:733
+#: res/swappy.glade:763
 msgid "Copy Surface"
 msgstr "Copy Surface"
 
-#: res/swappy.glade:749
+#: res/swappy.glade:779
 msgid "Save Surface"
 msgstr "Save Surface"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/src/po/fr.po 
new/swappy-1.5.1/src/po/fr.po
--- old/swappy-1.4.0/src/po/fr.po       2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/src/po/fr.po       2022-11-20 22:50:09.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: swappy\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-20 21:17-0500\n"
+"POT-Creation-Date: 2022-11-18 16:07-0500\n"
 "PO-Revision-Date: 2021-02-20 21:00-0500\n"
 "Last-Translator: Jeremy Attali <cont...@jtheoof.me>\n"
 "Language-Team: none\n"
@@ -17,34 +17,42 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: res/swappy.glade:455
+#: res/swappy.glade:456
 msgid "Line Width"
 msgstr "Epaisseur de ligne"
 
-#: res/swappy.glade:525
+#: res/swappy.glade:526
 msgid "Text Size"
 msgstr "Taille du texte"
 
-#: res/swappy.glade:641
+#: res/swappy.glade:592
+msgid "Fill shape"
+msgstr "Remplir la forme"
+
+#: res/swappy.glade:597
+msgid "Toggle shape filling"
+msgstr "Activer/Désactiver le remplissage de forme"
+
+#: res/swappy.glade:671
 msgid "Toggle Paint Panel"
 msgstr "Afficher/Cacher le panneau de peinture"
 
-#: res/swappy.glade:667
+#: res/swappy.glade:697
 msgid "Undo Last Paint"
 msgstr "Annuler la dernière peinture"
 
-#: res/swappy.glade:686
+#: res/swappy.glade:716
 msgid "Redo Previous Paint"
 msgstr "Rétablir la dernière peinture"
 
-#: res/swappy.glade:705
+#: res/swappy.glade:735
 msgid "Clear Paints"
 msgstr "Supprimer les peintures"
 
-#: res/swappy.glade:733
+#: res/swappy.glade:763
 msgid "Copy Surface"
 msgstr "Copier la surface"
 
-#: res/swappy.glade:749
+#: res/swappy.glade:779
 msgid "Save Surface"
 msgstr "Sauvegarder la surface"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/src/po/pt_BR.po 
new/swappy-1.5.1/src/po/pt_BR.po
--- old/swappy-1.4.0/src/po/pt_BR.po    2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/src/po/pt_BR.po    2022-11-20 22:50:09.000000000 +0100
@@ -7,45 +7,53 @@
 msgstr ""
 "Project-Id-Version: swappy\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-06-21 21:57-0400\n"
+"POT-Creation-Date: 2022-11-18 16:07-0500\n"
 "PO-Revision-Date: 2021-02-14 20:38-0300\n"
+"Last-Translator: Gustavo Costa <xfgu...@gmail.com>\n"
 "Language-Team: \n"
+"Language: pt_BR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 2.4.2\n"
-"Last-Translator: Gustavo Costa <xfgu...@gmail.com>\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"Language: pt_BR\n"
 
-#: res/swappy.glade:455
+#: res/swappy.glade:456
 msgid "Line Width"
 msgstr "Espessura da linha"
 
-#: res/swappy.glade:525
+#: res/swappy.glade:526
 msgid "Text Size"
 msgstr "Tamanho do texto"
 
-#: res/swappy.glade:641
+#: res/swappy.glade:592
+msgid "Fill shape"
+msgstr ""
+
+#: res/swappy.glade:597
+msgid "Toggle shape filling"
+msgstr ""
+
+#: res/swappy.glade:671
 msgid "Toggle Paint Panel"
 msgstr "Alternar painel de pintura"
 
-#: res/swappy.glade:667
+#: res/swappy.glade:697
 msgid "Undo Last Paint"
 msgstr "Desfazer última pintura"
 
-#: res/swappy.glade:686
+#: res/swappy.glade:716
 msgid "Redo Previous Paint"
 msgstr "Refazer pintura anterior"
 
-#: res/swappy.glade:705
+#: res/swappy.glade:735
 msgid "Clear Paints"
 msgstr "Limpar pinturas"
 
-#: res/swappy.glade:733
+#: res/swappy.glade:763
 msgid "Copy Surface"
 msgstr "Copiar superfície"
 
-#: res/swappy.glade:749
+#: res/swappy.glade:779
 msgid "Save Surface"
 msgstr "Salvar superfície"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/src/po/swappy.pot 
new/swappy-1.5.1/src/po/swappy.pot
--- old/swappy-1.4.0/src/po/swappy.pot  2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/src/po/swappy.pot  2022-11-20 22:50:09.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: swappy\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-06-21 21:57-0400\n"
+"POT-Creation-Date: 2022-11-18 16:07-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <l...@li.org>\n"
@@ -17,34 +17,42 @@
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: res/swappy.glade:455
+#: res/swappy.glade:456
 msgid "Line Width"
 msgstr ""
 
-#: res/swappy.glade:525
+#: res/swappy.glade:526
 msgid "Text Size"
 msgstr ""
 
-#: res/swappy.glade:641
+#: res/swappy.glade:592
+msgid "Fill shape"
+msgstr ""
+
+#: res/swappy.glade:597
+msgid "Toggle shape filling"
+msgstr ""
+
+#: res/swappy.glade:671
 msgid "Toggle Paint Panel"
 msgstr ""
 
-#: res/swappy.glade:667
+#: res/swappy.glade:697
 msgid "Undo Last Paint"
 msgstr ""
 
-#: res/swappy.glade:686
+#: res/swappy.glade:716
 msgid "Redo Previous Paint"
 msgstr ""
 
-#: res/swappy.glade:705
+#: res/swappy.glade:735
 msgid "Clear Paints"
 msgstr ""
 
-#: res/swappy.glade:733
+#: res/swappy.glade:763
 msgid "Copy Surface"
 msgstr ""
 
-#: res/swappy.glade:749
+#: res/swappy.glade:779
 msgid "Save Surface"
 msgstr ""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/src/po/tr.po 
new/swappy-1.5.1/src/po/tr.po
--- old/swappy-1.4.0/src/po/tr.po       2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/src/po/tr.po       2022-11-20 22:50:09.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: swappy\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-06-21 21:57-0400\n"
+"POT-Creation-Date: 2022-11-18 16:07-0500\n"
 "PO-Revision-Date: 2020-10-16 22:00+0300\n"
 "Last-Translator: Oğuz Ersen <oguzer...@protonmail.com>\n"
 "Language-Team: none\n"
@@ -17,34 +17,42 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: res/swappy.glade:455
+#: res/swappy.glade:456
 msgid "Line Width"
 msgstr "Çizgi Genişliği"
 
-#: res/swappy.glade:525
+#: res/swappy.glade:526
 msgid "Text Size"
 msgstr "Metin Boyutu"
 
-#: res/swappy.glade:641
+#: res/swappy.glade:592
+msgid "Fill shape"
+msgstr ""
+
+#: res/swappy.glade:597
+msgid "Toggle shape filling"
+msgstr ""
+
+#: res/swappy.glade:671
 msgid "Toggle Paint Panel"
 msgstr "Boyama Panelini Aç/Kapat"
 
-#: res/swappy.glade:667
+#: res/swappy.glade:697
 msgid "Undo Last Paint"
 msgstr "Son Boyamayı Geri Al"
 
-#: res/swappy.glade:686
+#: res/swappy.glade:716
 msgid "Redo Previous Paint"
 msgstr "Önceki Boyamayı Tekrarla"
 
-#: res/swappy.glade:705
+#: res/swappy.glade:735
 msgid "Clear Paints"
 msgstr "Boyamaları Temizle"
 
-#: res/swappy.glade:733
+#: res/swappy.glade:763
 msgid "Copy Surface"
 msgstr "Yüzeyi Kopyala"
 
-#: res/swappy.glade:749
+#: res/swappy.glade:779
 msgid "Save Surface"
 msgstr "Yüzeyi Kaydet"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/src/render.c 
new/swappy-1.5.1/src/render.c
--- old/swappy-1.4.0/src/render.c       2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/src/render.c       2022-11-20 22:50:09.000000000 +0100
@@ -310,7 +310,19 @@
   cairo_scale(cr, x / n, y / n);
   cairo_arc(cr, 0, 0, r, 0, 2 * G_PI);
   cairo_set_matrix(cr, &save_matrix);
-  cairo_stroke(cr);
+
+  switch (shape.operation) {
+    case SWAPPY_PAINT_SHAPE_OPERATION_STROKE:
+      cairo_stroke(cr);
+      break;
+    case SWAPPY_PAINT_SHAPE_OPERATION_FILL:
+      cairo_fill(cr);
+      break;
+    default:
+      cairo_stroke(cr);
+      break;
+  }
+
   cairo_close_path(cr);
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/swappy-1.4.0/swappy.1.scd 
new/swappy-1.5.1/swappy.1.scd
--- old/swappy-1.4.0/swappy.1.scd       2021-09-06 16:36:15.000000000 +0200
+++ new/swappy-1.5.1/swappy.1.scd       2022-11-20 22:50:09.000000000 +0100
@@ -63,14 +63,21 @@
        line_size=5
        text_size=20
        text_font=sans-serif
+       paint_mode=brush
+       early_exit=false
+       fill_shape=false
 ```
 
-- *save_dir* is where swappshots will be saved, can contain env variables and 
must exist in your filesystem
+- *save_dir* is where swappshots will be saved, can contain env variables, 
when it does not exist, swappy attempts to create it first, but does not abort 
if directory creation fails
 - *save_filename_format* is the filename template, if it contains a date 
format, this will be parsed into a timestamp. Format is detailed in 
strftime(3). If this date format is missing, filename will have no timestamp
 - *show_panel* is used to toggle the paint panel on or off upon startup
 - *line_size* is the default line size (must be between 1 and 50)
 - *text_size* is the default text size (must be between 10 and 50)
 - *text_font* is the font used to render text, its format is pango friendly
+- *paint_mode* is the mode activated at application start (must be one of: 
brush|text|rectangle|ellipse|arrow|blur, matching is case-insensitive)
+- *early_exit* is used to make the application exit after saving the picture 
or copying it to the clipboard
+- *fill_shape* is used to toggle shape filling (for the rectangle and ellipsis 
tools) on or off upon startup
+
 
 # KEY BINDINGS
 
@@ -94,6 +101,7 @@
 - *Minus*: Reduce Stroke Size
 - *Plus*: Increase Stroke Size
 - *Equal*: Reset Stroke Size
+- *f*: Toggle Shape Filling
 - *k*: Clear Paints (cannot be undone)
 
 ## MODIFIERS

Reply via email to