diff --git a/.markdownlint.json b/.markdownlint.json
new file mode 100644
index 0000000..8d91412
--- /dev/null
+++ b/.markdownlint.json
@@ -0,0 +1,6 @@
+{
+ "default": true,
+ "no-duplicate-heading": false,
+ "no-inline-html": false,
+ "no-emphasis-as-heading": false
+}
diff --git a/data/icons/diffuse.icns b/data/icons/diffuse.icns
new file mode 100644
index 0000000..03b345c
Binary files /dev/null and b/data/icons/diffuse.icns differ
diff --git a/data/icons/meson.build b/data/icons/meson.build
index 2e3a308..ae47ea8 100644
--- a/data/icons/meson.build
+++ b/data/icons/meson.build
@@ -11,3 +11,7 @@ install_data(
join_paths(symbolic_dir, ('@0@-symbolic.svg').format(application_id)),
install_dir: join_paths(get_option('datadir'), 'icons', symbolic_dir)
)
+
+if build_machine.system() == 'darwin'
+ install_data('diffuse.icns', install_dir: '/Applications/Diffuse.app/Contents/Resources')
+endif
diff --git a/data/meson.build b/data/meson.build
index f704ec1..52ed78a 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -1,34 +1,36 @@
pkgdatadir = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name())
-desktop_file = i18n.merge_file(
- input: 'io.github.mightycreak.Diffuse.desktop.in',
- output: 'io.github.mightycreak.Diffuse.desktop',
- type: 'desktop',
- po_dir: '../po',
- install: true,
- install_dir: join_paths(get_option('datadir'), 'applications')
-)
-
-desktop_utils = find_program('desktop-file-validate', required: false)
-if desktop_utils.found()
- test('Validate desktop file', desktop_utils,
- args: [desktop_file]
+if build_machine.system() == 'linux'
+ desktop_file = i18n.merge_file(
+ input: 'io.github.mightycreak.Diffuse.desktop.in',
+ output: 'io.github.mightycreak.Diffuse.desktop',
+ type: 'desktop',
+ po_dir: '../po',
+ install: true,
+ install_dir: join_paths(get_option('datadir'), 'applications')
)
-endif
-appstream_file = i18n.merge_file(
- input: 'io.github.mightycreak.Diffuse.appdata.xml.in',
- output: 'io.github.mightycreak.Diffuse.appdata.xml',
- po_dir: '../po',
- install: true,
- install_dir: join_paths(get_option('datadir'), 'appdata')
-)
+ desktop_utils = find_program('desktop-file-validate', required: false)
+ if desktop_utils.found()
+ test('Validate desktop file', desktop_utils,
+ args: [desktop_file]
+ )
+ endif
-appstream_util = find_program('appstream-util', required: false)
-if appstream_util.found()
- test('Validate appstream file', appstream_util,
- args: ['validate', appstream_file]
+ appstream_file = i18n.merge_file(
+ input: 'io.github.mightycreak.Diffuse.appdata.xml.in',
+ output: 'io.github.mightycreak.Diffuse.appdata.xml',
+ po_dir: '../po',
+ install: true,
+ install_dir: join_paths(get_option('datadir'), 'appdata')
)
+
+ appstream_util = find_program('appstream-util', required: false)
+ if appstream_util.found()
+ test('Validate appstream file', appstream_util,
+ args: ['validate', appstream_file]
+ )
+ endif
endif
# Diffuse config file
diff --git a/docs/developers/developers-setup.md b/docs/developers/developers-setup.md
index ad4ea7f..104a59d 100644
--- a/docs/developers/developers-setup.md
+++ b/docs/developers/developers-setup.md
@@ -8,13 +8,14 @@ Diffuse depends on these projects:
* PyPi
* Cairo and GObject Introspection development headers
* Meson
-* Flatpak and Flatpak builder
+* Flatpak and Flatpak builder (Linux only)
-### Install the distribution dependencies
+## Install the dependencies
-It's a bit difficult to get the command lines for all the distributions and
-their releases, but it should be enough to find the packages on other
-distributions.
+### Install the system dependencies
+
+It's a bit difficult to get the command lines for all the systems, but these
+examples should be enough to find the packages on most systems.
Debian/Ubuntu
@@ -32,7 +33,19 @@ _Note: Tested on Debian 11 (Buster) and Ubuntu 20.04 (Focal)_
sudo dnf install python-pip cairo-devel cairo-gobject-devel meson flatpak flatpak-builder
```
-_Note: Tested on Fedora 34_
+_Note: Tested on Fedora 36_
+
+
+
+ Mac OS
+
+On Mac, all dependencies can be installed using [Homebrew](https://docs.brew.sh/):
+
+```sh
+brew install meson python3 py3cairo pygobject3 gtk+3 librsvg
+```
+
+_Note: Tested on macOS 12.5 (Monterey)_
### Install the project dependencies
@@ -49,34 +62,42 @@ For developer tools, run this one instead (it includes requirements.txt):
pip install -r requirements.dev.txt
```
-## Setup on Linux
+## Setup
-### Build, test and install using Flatpak
+### Setup on Linux using Flatpak
-To install Diffuse locally:
+#### Build, test and install
+
+To build, test and install Diffuse locally:
```sh
flatpak install runtime/org.gnome.Sdk/$(uname -p)/42
flatpak-builder --user --install build-flatpak io.github.mightycreak.Diffuse.yml
```
+#### Run
+
To run Diffuse through Flatpak:
```sh
flatpak run io.github.mightycreak.Diffuse
```
+#### Uninstall
+
To uninstall Diffuse:
```sh
flatpak remove io.github.mightycreak.Diffuse
```
-### Build, test and install using Meson
+### Setup on Linux using Meson
-Diffuse build system is meson.
+#### Build and test
-To compile and test Diffuse:
+Diffuse is using Meson as its build system.
+
+To build and test Diffuse:
```sh
meson setup build
@@ -85,36 +106,81 @@ meson compile
meson test
```
+#### Install on system and run
+
To install Diffuse on your system (e.g. `/usr/local/`):
```sh
meson install # requires admin privileges
+```
-# Run Diffuse
+To run Diffuse:
+
+```sh
diffuse
```
-To install Diffuse on a custom directory (e.g. `~/bin/diffuse`):
+#### Install in a custom directory and run
+
+Meson allows to change the default installation directories, see
+[command-line documentation](https://mesonbuild.com/Commands.html#configure).
+
+To install Diffuse in a custom directory (e.g. `~/bin/diffuse`):
```sh
meson install --destdir ~/bin/diffuse
-
-# Run Diffuse
-cd ~/bin/diffuse/usr/local/bin
-PYTHONPATH=$HOME/bin/diffuse/usr/local/share/diffuse ./diffuse
```
-To uninstall diffuse afterwards:
+To run Diffuse:
+
+```sh
+export PYTHONPATH=$HOME/bin/diffuse/usr/local/share/diffuse
+cd ~/bin/diffuse/usr/local/bin
+./diffuse
+```
+
+#### Uninstall
+
+To uninstall Diffuse afterwards:
```sh
sudo ninja uninstall -C build
sudo rm -v /usr/local/share/locale/*/LC_MESSAGES/diffuse.mo
```
-Meson allows to change the default installation directories, see
-[command-line documentation](https://mesonbuild.com/Commands.html#configure).
+### Setup on Mac OS
-## Setup on Windows
+#### Build and test
+
+Diffuse is using Meson as its build system.
+
+To build and test Diffuse:
+
+```sh
+meson setup build
+cd build
+meson compile
+meson test
+```
+
+#### Install on system and run
+
+To install Diffuse on your system (e.g. `/usr/local/`):
+
+```sh
+meson install # requires admin privileges
+```
+
+To run Diffuse:
+
+```sh
+diffuse
+```
+
+_Note: The `diffuse` command can be used to launch Diffuse as a native Mac app_
+_that is installed into `/Applications/Diffuse.app`._
+
+### Setup on Windows (deprecated)
_Note:_ The Windows port is not maintained and would need some love.
Contributions are very welcome! 😉
diff --git a/docs/developers/release-process.md b/docs/developers/release-process.md
index b9a01f0..79ed8fc 100644
--- a/docs/developers/release-process.md
+++ b/docs/developers/release-process.md
@@ -19,16 +19,16 @@ few manual steps.
- data/usr/share/gnome/help/diffuse/*/diffuse.xml
- data/usr/share/omf/diffuse/diffuse-*.omf
- utils/book2manual.xsl
-3. Update CHANGELOG.md
+4. Update CHANGELOG.md
- Add new line under `## Unreleased` following this syntax: `## x.y.z - YYYY-MM-DD`
- Copy the content of the changes for this release
-4. Update AppData release notes in data/io.github.mightycreak.Diffuse.appdata.xml.in:
+5. Update AppData release notes in data/io.github.mightycreak.Diffuse.appdata.xml.in:
- Create a new `` tag under ``, fill the `version` and
`date` attributes
- Create a new `` tag under the new `` tag
- Add one paragraph to sum the release in one sentence (e.g. highlights, ...)
- Paste the changes from the changelog and adapt it to HTML
-5. Create new branch and PR
+6. Create new branch and PR
## Create new release on GitHub
diff --git a/docs/translators.md b/docs/translators.md
index ff986fa..ec3e222 100644
--- a/docs/translators.md
+++ b/docs/translators.md
@@ -70,6 +70,7 @@ Use `update-translations.py` to validate one or more PO files.
Here is an example with `ja.po` and `ko.po`:
Command-line:
+
```sh
./update-translations.py --check-only ja.po ko.po
```
@@ -99,8 +100,10 @@ POSIX platforms. The conversion tools insert some English text that gets
localized using search and replace. Manually add new search and replace rules
to these files:
- ../windows-installer/translations.txt
- ../utils/translations.txt
+```text
+../windows-installer/translations.txt
+../utils/translations.txt
+```
The format of each line is: \:\:\
diff --git a/docs/users.md b/docs/users.md
index 1c3fbe8..f858cc2 100644
--- a/docs/users.md
+++ b/docs/users.md
@@ -22,3 +22,12 @@ The Diffuse package statuses for every distributions can been seen on
Huge thanks to [@bongochong](https://github.com/bongochong) for maintaining the
Diffuse package on Fedora.
+
+## Integrate with Git
+
+Diffuse is compatible with `git difftool` command-line. To use Diffuse as Git
+diff tool, run:
+
+```sh
+git config --global diff.tool diffuse
+```
diff --git a/meson.build b/meson.build
index 05a2205..3d3d279 100644
--- a/meson.build
+++ b/meson.build
@@ -10,4 +10,6 @@ subdir('data')
subdir('src')
subdir('po')
-meson.add_install_script('build-aux/meson/postinstall.py')
+if build_machine.system() == 'linux'
+ meson.add_install_script('build-aux/meson/postinstall.py')
+endif
diff --git a/src/diffuse/mac-os-app/Info.plist.in b/src/diffuse/mac-os-app/Info.plist.in
new file mode 100755
index 0000000..7e29659
--- /dev/null
+++ b/src/diffuse/mac-os-app/Info.plist.in
@@ -0,0 +1,22 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ mac_launcher.sh
+ CFBundleIconFile
+ diffuse.icns
+ CFBundleIdentifier
+ io.github.mightycreak.Diffuse
+ CFBundleName
+ Diffuse
+ CFBundleShortVersionString
+ @VERSION@
+ CFBundlePackageType
+ APPL
+ NSAppleScriptEnabled
+ NO
+
+
diff --git a/src/diffuse/mac-os-app/diffuse-mac.in b/src/diffuse/mac-os-app/diffuse-mac.in
new file mode 100755
index 0000000..e4bb412
--- /dev/null
+++ b/src/diffuse/mac-os-app/diffuse-mac.in
@@ -0,0 +1,14 @@
+#!/bin/bash
+#
+# This is the command-line entry point on Mac.
+#
+# We want to use Mac's `open` command for mainly two reasons;
+# a) open lets us choose our own icon.
+# b) open puts the app on top of the other windows, including the terminal we ran this from.
+#
+# --new lets us open multiple windows.
+# --wait-apps lets Diffuse be a "git difftool", letting Diffuse run before git deletes its tmp files.
+#
+# We pass "pwd" because Mac's `open` command launches processes at '/'.
+# "printf %q" escapes spaces and other characters so the complete dir is passed as one.
+open /Applications/Diffuse.app --new --wait-apps --args $(printf %q "$(pwd)") $@
diff --git a/src/diffuse/mac-os-app/mac_launcher.sh.in b/src/diffuse/mac-os-app/mac_launcher.sh.in
new file mode 100755
index 0000000..857811f
--- /dev/null
+++ b/src/diffuse/mac-os-app/mac_launcher.sh.in
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+# Mac's `open` command resets working dir. This extra script only
+# does `cd` back to the dir from which `diffuse` was launched to
+# allow Python to pick up any relative paths given by `git difftool`.
+cd $1
+@BINDIR@/diffuse_impl ${@:2}
diff --git a/src/diffuse/meson.build b/src/diffuse/meson.build
index 6b27994..7ed885e 100644
--- a/src/diffuse/meson.build
+++ b/src/diffuse/meson.build
@@ -9,15 +9,40 @@ conf.set('VERSION', meson.project_version())
conf.set('PKGDATADIR', pkgdatadir)
conf.set('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir')))
conf.set('SYSCONFIGDIR', join_paths(get_option('prefix'), get_option('sysconfdir')))
+conf.set('BINDIR', join_paths(get_option('prefix'), get_option('bindir')))
configure_file(
input: 'diffuse.in',
- output: 'diffuse',
+ output: build_machine.system() == 'darwin' ? 'diffuse_impl' : 'diffuse',
configuration: conf,
install: true,
install_dir: get_option('bindir')
)
+if build_machine.system() == 'darwin'
+ configure_file(
+ input: 'mac-os-app/diffuse-mac.in',
+ output: 'diffuse',
+ configuration: conf,
+ install: true,
+ install_dir: get_option('bindir')
+ )
+ configure_file(
+ input: 'mac-os-app/mac_launcher.sh.in',
+ output: 'mac_launcher.sh',
+ configuration: conf,
+ install: true,
+ install_dir: '/Applications/Diffuse.app/Contents/MacOS'
+ )
+ configure_file(
+ input: 'mac-os-app/Info.plist.in',
+ output: 'Info.plist',
+ configuration: conf,
+ install: true,
+ install_dir: '/Applications/Diffuse.app/Contents'
+ )
+endif
+
diffuse_sources = [
'__init__.py',
'constants.py',
diff --git a/src/diffuse/resources.py b/src/diffuse/resources.py
index 302c385..a73761c 100644
--- a/src/diffuse/resources.py
+++ b/src/diffuse/resources.py
@@ -26,6 +26,7 @@
import glob
import os
+import platform
import re
import shlex
@@ -43,36 +44,37 @@ from gi.repository import Gdk # type: ignore # noqa: E402
class Resources:
def __init__(self):
# default keybindings
+ defaultModKey = 'Cmd+' if platform.system() == 'Darwin' else 'Ctrl+'
self.keybindings = {}
self.keybindings_lookup = {}
- self.setKeyBinding('menu', 'open_file', 'Ctrl+o')
- self.setKeyBinding('menu', 'open_file_in_new_tab', 'Ctrl+t')
+ self.setKeyBinding('menu', 'open_file', defaultModKey + 'o')
+ self.setKeyBinding('menu', 'open_file_in_new_tab', defaultModKey + 't')
self.setKeyBinding('menu', 'open_modified_files', 'Shift+Ctrl+O')
self.setKeyBinding('menu', 'open_commit', 'Shift+Ctrl+T')
self.setKeyBinding('menu', 'reload_file', 'Shift+Ctrl+R')
- self.setKeyBinding('menu', 'save_file', 'Ctrl+s')
- self.setKeyBinding('menu', 'save_file_as', 'Shift+Ctrl+A')
- self.setKeyBinding('menu', 'save_all', 'Shift+Ctrl+S')
+ self.setKeyBinding('menu', 'save_file', defaultModKey + 's')
+ self.setKeyBinding('menu', 'save_file_as', defaultModKey + 'Shift+A')
+ self.setKeyBinding('menu', 'save_all', defaultModKey + 'Shift+S')
self.setKeyBinding('menu', 'new_2_way_file_merge', 'Ctrl+2')
self.setKeyBinding('menu', 'new_3_way_file_merge', 'Ctrl+3')
self.setKeyBinding('menu', 'new_n_way_file_merge', 'Ctrl+4')
- self.setKeyBinding('menu', 'close_tab', 'Ctrl+w')
- self.setKeyBinding('menu', 'undo_close_tab', 'Shift+Ctrl+W')
- self.setKeyBinding('menu', 'quit', 'Ctrl+q')
- self.setKeyBinding('menu', 'undo', 'Ctrl+z')
- self.setKeyBinding('menu', 'redo', 'Shift+Ctrl+Z')
- self.setKeyBinding('menu', 'cut', 'Ctrl+x')
- self.setKeyBinding('menu', 'copy', 'Ctrl+c')
- self.setKeyBinding('menu', 'paste', 'Ctrl+v')
- self.setKeyBinding('menu', 'select_all', 'Ctrl+a')
- self.setKeyBinding('menu', 'clear_edits', 'Ctrl+r')
- self.setKeyBinding('menu', 'dismiss_all_edits', 'Ctrl+d')
- self.setKeyBinding('menu', 'find', 'Ctrl+f')
- self.setKeyBinding('menu', 'find_next', 'Ctrl+g')
- self.setKeyBinding('menu', 'find_previous', 'Shift+Ctrl+G')
- self.setKeyBinding('menu', 'go_to_line', 'Shift+Ctrl+L')
- self.setKeyBinding('menu', 'realign_all', 'Ctrl+l')
- self.setKeyBinding('menu', 'isolate', 'Ctrl+i')
+ self.setKeyBinding('menu', 'close_tab', defaultModKey + 'w')
+ self.setKeyBinding('menu', 'undo_close_tab', defaultModKey + 'Shift+W')
+ self.setKeyBinding('menu', 'quit', defaultModKey + 'q')
+ self.setKeyBinding('menu', 'undo', defaultModKey + 'z')
+ self.setKeyBinding('menu', 'redo', defaultModKey + 'Shift+Z')
+ self.setKeyBinding('menu', 'cut', defaultModKey + 'x')
+ self.setKeyBinding('menu', 'copy', defaultModKey + 'c')
+ self.setKeyBinding('menu', 'paste', defaultModKey + 'v')
+ self.setKeyBinding('menu', 'select_all', defaultModKey + 'a')
+ self.setKeyBinding('menu', 'clear_edits', defaultModKey + 'r')
+ self.setKeyBinding('menu', 'dismiss_all_edits', defaultModKey + 'd')
+ self.setKeyBinding('menu', 'find', defaultModKey + 'f')
+ self.setKeyBinding('menu', 'find_next', defaultModKey + 'g')
+ self.setKeyBinding('menu', 'find_previous', defaultModKey + 'Shift+G')
+ self.setKeyBinding('menu', 'go_to_line', defaultModKey + 'Shift+l')
+ self.setKeyBinding('menu', 'realign_all', defaultModKey + 'l')
+ self.setKeyBinding('menu', 'isolate', defaultModKey + 'i')
self.setKeyBinding('menu', 'first_difference', 'Shift+Ctrl+Up')
self.setKeyBinding('menu', 'previous_difference', 'Ctrl+Up')
self.setKeyBinding('menu', 'next_difference', 'Ctrl+Down')
@@ -83,24 +85,24 @@ class Resources:
self.setKeyBinding('menu', 'last_tab', 'Shift+Ctrl+Page_Down')
self.setKeyBinding('menu', 'shift_pane_right', 'Shift+Ctrl+parenright')
self.setKeyBinding('menu', 'shift_pane_left', 'Shift+Ctrl+parenleft')
- self.setKeyBinding('menu', 'convert_to_upper_case', 'Ctrl+u')
- self.setKeyBinding('menu', 'convert_to_lower_case', 'Shift+Ctrl+U')
- self.setKeyBinding('menu', 'sort_lines_in_ascending_order', 'Ctrl+y')
- self.setKeyBinding('menu', 'sort_lines_in_descending_order', 'Shift+Ctrl+Y')
- self.setKeyBinding('menu', 'remove_trailing_white_space', 'Ctrl+k')
- self.setKeyBinding('menu', 'convert_tabs_to_spaces', 'Ctrl+b')
+ self.setKeyBinding('menu', 'convert_to_upper_case', defaultModKey + 'u')
+ self.setKeyBinding('menu', 'convert_to_lower_case', defaultModKey + 'Shift+U')
+ self.setKeyBinding('menu', 'sort_lines_in_ascending_order', defaultModKey + 'y')
+ self.setKeyBinding('menu', 'sort_lines_in_descending_order', defaultModKey + 'Shift+Y')
+ self.setKeyBinding('menu', 'remove_trailing_white_space', defaultModKey + 'k')
+ self.setKeyBinding('menu', 'convert_tabs_to_spaces', defaultModKey + 'b')
self.setKeyBinding('menu', 'convert_leading_spaces_to_tabs', 'Shift+Ctrl+B')
- self.setKeyBinding('menu', 'increase_indenting', 'Shift+Ctrl+greater')
- self.setKeyBinding('menu', 'decrease_indenting', 'Shift+Ctrl+less')
- self.setKeyBinding('menu', 'convert_to_dos', 'Shift+Ctrl+E')
- self.setKeyBinding('menu', 'convert_to_mac', 'Shift+Ctrl+C')
- self.setKeyBinding('menu', 'convert_to_unix', 'Ctrl+e')
- self.setKeyBinding('menu', 'copy_selection_right', 'Shift+Ctrl+Right')
- self.setKeyBinding('menu', 'copy_selection_left', 'Shift+Ctrl+Left')
- self.setKeyBinding('menu', 'copy_left_into_selection', 'Ctrl+Right')
- self.setKeyBinding('menu', 'copy_right_into_selection', 'Ctrl+Left')
- self.setKeyBinding('menu', 'merge_from_left_then_right', 'Ctrl+m')
- self.setKeyBinding('menu', 'merge_from_right_then_left', 'Shift+Ctrl+M')
+ self.setKeyBinding('menu', 'increase_indenting', defaultModKey + 'Shift+greater')
+ self.setKeyBinding('menu', 'decrease_indenting', defaultModKey + 'Shift+less')
+ self.setKeyBinding('menu', 'convert_to_dos', defaultModKey + 'Shift+E')
+ self.setKeyBinding('menu', 'convert_to_mac', defaultModKey + 'Shift+C')
+ self.setKeyBinding('menu', 'convert_to_unix', defaultModKey + 'e')
+ self.setKeyBinding('menu', 'copy_selection_right', defaultModKey + 'Shift+Right')
+ self.setKeyBinding('menu', 'copy_selection_left', defaultModKey + 'Shift+Left')
+ self.setKeyBinding('menu', 'copy_left_into_selection', defaultModKey + 'Right')
+ self.setKeyBinding('menu', 'copy_right_into_selection', defaultModKey + 'Left')
+ self.setKeyBinding('menu', 'merge_from_left_then_right', defaultModKey + 'm')
+ self.setKeyBinding('menu', 'merge_from_right_then_left', defaultModKey + 'Shift+M')
self.setKeyBinding('menu', 'help_contents', 'F1')
self.setKeyBinding('line_mode', 'enter_align_mode', 'space')
self.setKeyBinding('line_mode', 'enter_character_mode', 'Return')
@@ -126,13 +128,13 @@ class Resources:
self.setKeyBinding('line_mode', 'right', 'l')
self.setKeyBinding('line_mode', 'extend_right', 'Shift+Right')
self.setKeyBinding('line_mode', 'page_up', 'Page_Up')
- self.setKeyBinding('line_mode', 'page_up', 'Ctrl+u')
+ self.setKeyBinding('line_mode', 'page_up', defaultModKey + 'u')
self.setKeyBinding('line_mode', 'extend_page_up', 'Shift+Page_Up')
- self.setKeyBinding('line_mode', 'extend_page_up', 'Shift+Ctrl+U')
+ self.setKeyBinding('line_mode', 'extend_page_up', defaultModKey + 'Shift+U')
self.setKeyBinding('line_mode', 'page_down', 'Page_Down')
- self.setKeyBinding('line_mode', 'page_down', 'Ctrl+d')
+ self.setKeyBinding('line_mode', 'page_down', defaultModKey + 'd')
self.setKeyBinding('line_mode', 'extend_page_down', 'Shift+Page_Down')
- self.setKeyBinding('line_mode', 'extend_page_down', 'Shift+Ctrl+D')
+ self.setKeyBinding('line_mode', 'extend_page_down', defaultModKey + 'Shift+D')
self.setKeyBinding('line_mode', 'delete_text', 'BackSpace')
self.setKeyBinding('line_mode', 'delete_text', 'Delete')
self.setKeyBinding('line_mode', 'delete_text', 'x')
@@ -165,9 +167,9 @@ class Resources:
self.setKeyBinding('align_mode', 'right', 'Right')
self.setKeyBinding('align_mode', 'right', 'l')
self.setKeyBinding('align_mode', 'page_up', 'Page_Up')
- self.setKeyBinding('align_mode', 'page_up', 'Ctrl+u')
+ self.setKeyBinding('align_mode', 'page_up', defaultModKey + 'u')
self.setKeyBinding('align_mode', 'page_down', 'Page_Down')
- self.setKeyBinding('align_mode', 'page_down', 'Ctrl+d')
+ self.setKeyBinding('align_mode', 'page_down', defaultModKey + 'd')
self.setKeyBinding('character_mode', 'enter_line_mode', 'Escape')
# default colours
@@ -232,6 +234,8 @@ class Resources:
modifiers |= Gdk.ModifierType.SHIFT_MASK
elif token == 'Ctrl':
modifiers |= Gdk.ModifierType.CONTROL_MASK
+ elif token == 'Cmd':
+ modifiers |= Gdk.ModifierType.META_MASK
elif token == 'Alt':
modifiers |= Gdk.ModifierType.MOD1_MASK
elif len(token) == 0 or token[0] == '_':
diff --git a/utils/makemacicon.sh b/utils/makemacicon.sh
new file mode 100755
index 0000000..35c5ac4
--- /dev/null
+++ b/utils/makemacicon.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+
+# Use this tool if you need to re-create
+# Diffuse.app/Contents/Resources/diffuse.icns
+# in case the icon changes (unlikely).
+
+sizes=(16 32 64 128 256 512)
+for s in "${sizes[@]}"; do
+ echo $s
+ rsvg-convert -h $s "$1" > "icon_${s}x$s.png"
+done
+
+cp 'icon_32x32.png' 'icon_16x16@2x.png'
+cp 'icon_64x64.png' 'icon_32x32@2x.png'
+cp 'icon_256x256.png' 'icon_128x128@2x.png'
+cp 'icon_512x512.png' 'icon_256x256@2x.png'
+
+mkdir icon.iconset
+mv icon_*x*.png icon.iconset
+iconutil -c icns icon.iconset