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