1
1
mirror of https://gitlab.gnome.org/GNOME/gimp.git synced 2025-10-06 05:22:40 +02:00

Compare commits

...

589 Commits

Author SHA1 Message Date
Alx Sa
2f57e9defb app/actions, menus: Add 'Select Layers' option
This patch adds an option to create a selection covering
just the area of the highlighted layers. This differs from
the Select All option, as it will not expand if you switch
layers.
2025-08-01 11:13:30 -04:00
Michael Natterer
0794087a67 app: move the entire zoom logic from GimpContainerTreeView to
GimpContainerBox so both grid and list views can zoom via scroll and
zoom gestures.
2025-08-01 17:01:53 +02:00
Bruno Lopes
bd6218a12f build/linux: Some cosmetic changes to AppRun vars 2025-08-01 10:55:54 -03:00
Bruno Lopes
bc095d5c83 Issue #13001: build/linux: Sandbox XDG_DATA_DIRS on AppImage
Closes #13001

XDG_DATA_DIRS is a variable used by many deps (e.g. glib) to
find runtime data. So, let's point XDG_DATA_DIRS to the
appimage bundle so prevent unexpected data from the host.
2025-08-01 10:46:07 -03:00
Bruno Lopes
d731a8fc0d build: Make scripts CWD check run on CI too 2025-08-01 09:19:21 -03:00
Michael Natterer
b416994ed0 app: make GimpContainerView behave like a normal widget
The old API to select stuff and its signals was doing unexpected
stuff and was very confusing. Change things to be "normal":

The selection API is now set_selected() and get_selected(), with no
internal data exposed, and set_selected() emitting the expected
signal.

The signals are now "selection-changed" and "item-activated".
"selection-changed" is always emitted in response to changing the
selection, be it via the API, or by changes in the model (the internal
callbacks in from e.g. GimpContext or GimpImage simply call set_selected()
and don't do any unxpected magic).
2025-08-01 10:02:37 +02:00
Bruno Lopes
a7be8ec6cd build/linux: Correct typo in APP_ID 2025-07-31 20:43:23 -03:00
Bruno Lopes
c5427bec21 build/linux: Take flatpak app ID and branch dybamically from the manifest
This is more future proof.
2025-07-31 20:42:12 -03:00
Bruno Lopes
8a2dd28082 build/linux: Add CLI message explaining how to test .flatpak artifact
We can't guarantee that every DE or package manager have
support to install .flatpak files by double click.
2025-07-31 20:37:56 -03:00
Bruno Lopes
4faa5a6153 build/linux: Delete empty line on env block of Snap script 2025-07-31 20:18:38 -03:00
Bruno Lopes
70eb95bff8 build: Reorder shasums output on AppImage and Installer scripts
The output being before the release-only file generation is more logical
2025-07-31 19:24:40 -03:00
Bruno Lopes
e0b2bcba27 build/linux: Some cosmetic changes and comments to AppImage script 2025-07-31 18:40:13 -03:00
Alx Sa
901d1cd9d9 plug-ins: Add initial import support for PAA textures
This patch adds support for loading
compressed PAA textures.
This includes RGBA 4444, 5551, 8888, and
Grayscale with Alpha channel.
It does not yet cover DXT1 - 5 texture
import support.
2025-07-31 15:49:21 +00:00
Alx Sa
f7ef01f44a tools: Update Seamless Clone paste check
The experimental Seamless Clone tool assumes
that all pasted objects are GimpBuffers. With multi-select,
it's now likely that the pasted object is an image containing
layers instead. Thus, the tool would report there was no pasted
data to work with, even though there was.
This patch updates the check so that it retrieves the first selected
layer from the pasted image if it's not a GimpBuffer, allowing the
tool to function again.

Note that this patch does not improve the speed of the Seamless Clone
GEGL operation, just enables the tool to work again in GIMP.
2025-07-31 14:49:35 +00:00
Bruno Lopes
79374e0bc1 build/linux: Update openexr and suitesparse Flatpak modules 2025-07-30 20:51:01 -03:00
Bruno Lopes
75aa40f3cb build/linux: Add (nightly) Snap package distribution 2025-07-30 20:44:11 -03:00
Yuri Chornoivan
ed896b069d Update Ukrainian translation 2025-07-30 18:48:14 +00:00
Michael Natterer
fc68405c45 app: remove the gimplayertreeview.h include from GimpDrawableTreeView 2025-07-30 18:25:40 +02:00
Alexander Alexandrov Shopov
74e0f1d87e Update Bulgarian translation 2025-07-30 10:26:05 +00:00
Alexander Alexandrov Shopov
f78475b594 Update Bulgarian translation 2025-07-30 10:18:26 +00:00
Alx Sa
ea61460c6f actions: Use layer for lock check when mask is active
Resolves #9287
In GIMP 2.10, before checking if the drawable was locked,
we checked if it was a layer mask and switched to its
layer if so. This is because the lock status is saved in the
layer.
In GIMP 3.0, we accidentally moved that check to the bottom
during the conversion to multi-select. As a result, when
switching to a layer mask, the lock content and lock position
would always be turned off since we checked the wrong
drawable.
This patch restores the 2.10 order of checks so that
we compare the lock status with the layer and not the mask.
2025-07-30 03:36:38 +00:00
Luming Zh
80f9caf418 Update Chinese (China) translation 2025-07-29 23:02:38 +00:00
Luming Zh
cc76f4d459 Update Chinese (China) translation 2025-07-29 22:56:47 +00:00
Martin
96c78dcf9c Update Slovenian translation 2025-07-29 19:25:53 +00:00
Martin
9bb39b7cf4 Update Slovenian translation 2025-07-29 19:16:35 +00:00
Bruno Lopes
d7687ee7e6 build/linux: Complete 2aee80b7 2025-07-27 21:43:15 -03:00
Bruno Lopes
9e1c1e314a build/linux: Rename suffix of flatpak scripts to flatpakbuilder
Since the praxis in all other scripts is to
name the suffix with the toolkit name
2025-07-27 19:33:42 -03:00
Bruno Lopes
2aee80b77f build/linux: Drop support to unreproducible builds on Flatpak
We had a way of building gimp without calling flatpak-builder but
"thanks" to Glycin sandboxing in pixbuf we can't anymore...
2025-07-27 19:06:58 -03:00
Bruno Lopes
215fcc9652 gitlab-ci: Rename 'gimp' stage to 'build'
This is how we call in other gimp repos, where there is no 'gimp' building.
2025-07-27 15:30:48 -03:00
Yuri Chornoivan
df0edc982a Update Ukrainian translation 2025-07-27 18:14:04 +00:00
Alx Sa
7c949960a4 widgets: Don't freeze progress box on image load
To prevent people from making changes to setting while
in the middle of loading images, we turn off sensitivity to all
widgets in GimpFileDialog (except for the cancel button).
However, the progress box no longer shows the load percentage
when it is not sensitive. Therefore, this patch conditionally leaves
it enabled so we can see progress while loading large images.
2025-07-27 12:48:33 +00:00
Alx Sa
df8063c861 tools: Make transform boundary multi-select aware
Resolves #13589
When selecting multiple layers to transform, the boundaries
would only consider the first layer selected - leaving the other
items invisible.
This patch reuses code from gimp_edit_paste_get_viewport_offset ()
to loop through all selected layers and update the transform
boundaries to consider the total offset and dimensions of the selected
layers.
2025-07-27 04:01:27 +00:00
Alx Sa
f99415c281 plug-ins: Give unique IDs to file-svg choice parameter
Resolves #14557
Per Kamil Burda, all three choices for the "paths" parameter
in file-svg had an ID of 0. This patch makes them unique.
2025-07-26 16:08:03 +00:00
Bruno Lopes
db8ead54f8 Issue #1620: plug-ins: Clarify file size string of JPEG plug-in
Closes #1620 by using the suggested string by Jacob.
2025-07-25 19:38:51 -03:00
Gabriele Barbero
0551b4be1d app: implement system color scheme detection on MacOS
Following Linux and Windows implementations, this commit add the
system color scheme detection on MacOS, enabling the "System Colors"
setting also on this OS.
2025-07-25 19:03:24 -03:00
Alx Sa
a066a27f86 po-python: Make OpenRaster text translatable 2025-07-25 20:44:17 +00:00
Gabriele Barbero
83dcd00794 dialogs: respect time/date system format on Windows
Fetch date and time via GetDateFormatEx/GetTimeFormatEx to respect
the user's custom formats from Windows Region settings instead of
falling back to C locale defaults.
2025-07-25 15:13:08 -04:00
Gabriele Barbero
180736f772 dialogs: respect time/date system format on macOS
When the time or date format is changed from macOS system settings,
these changes do not affect the locale but the user preferences.
This commit ensures that the date and time are retrieved directly from
those settings, respecting the selected format.
2025-07-25 15:13:08 -04:00
Jacob Boerema
3c7dd6db3b plug-ins: fix #10893 file-gif-load: segmentation fault on opening huge gif
When using huge-dimensions (e.g. 60000 x 60000) using a 32-bit int is
not enough to compute the offset, which causes a crash when loading
such a huge image.

We fix this by casting the first variable to gsize. We also do this
for the case where `alpha-frame` is TRUE since it is clear that the
same could also happen there.
2025-07-25 10:45:56 -04:00
Luming Zh
94aa995711 Update Chinese (China) translation 2025-07-25 12:00:15 +00:00
Jehan
f4bdd69f73 meson, build, INSTALL: we now use mypaint-brushes-2.0 for all Windows platform.
Thanks to lazka and the whole MSYS2 project for adding this package to
their repository so that we don't need ugly special-casing anymore.

See: e515fe48bc
2025-07-25 01:19:12 +02:00
Bruno Lopes
7b03ca6fd1 gitlab-ci, build: Remove old Xorg-testing deps and GEGL optional deps 2025-07-24 19:30:56 -03:00
Bruno Lopes
b3d7d9b8df build/linux: Update gexiv2 and graphviz modules 2025-07-24 15:39:07 -03:00
Jehan
2a55604e6f meson: bump libmypaint minimum dependency to version 1.5.
The MyPaintSurface2 interface got added with libmypaint 1.5.0.

Also mypaint-brushes 2.0.2 release notes explicitly say:

> The v2.0.x brushes (in general) require libmypaint >= 1.5 to work correctly / not crash.

(cf. https://github.com/mypaint/mypaint-brushes/releases/tag/v2.0.2)

Since Debian bookworm ships with libmypaint 1.5.1, this is fine to bump
this requirement.

Note: there is still some discrepancy lying around with Windows x86
(32-bit) still using mypaint-brushes-1.0 but apparently these older
brushes still work fine with the new API, and Alx will ask the MSYS2
project if we can have a mypaint-brushes-2.0 package for x86 too.
2025-07-23 19:25:27 +02:00
Jehan
619b321141 INSTALL: remove mentions of needing to install mypaint-brushes v1. 2025-07-23 19:18:34 +02:00
Jehan
5af0758994 NEWS: update. 2025-07-23 18:42:30 +02:00
Jehan
ae076dd584 Issue #14530: Debug Dialog on Unstable tells to downgrade to Stable version.
This may happen upon upgrading, before the next update check kicked in
and the existing last-known-release was imported by the config migration
from an older version of GIMP.

Let's just make sure GimpCoreConfig will silently discard these old
values when they are older than the currently running version.
2025-07-23 18:09:37 +02:00
Martin
b4efde182d Update Slovenian translation 2025-07-23 11:46:23 +00:00
Alx Sa
4c76ea387a plug-ins: Redesign of animation-playback
Reju developed a redesign of the Animation Playback
plug-in that more closely resembles standard playback
UIs (such as VLC Player).
The redesign also changes the progress bar to a GtkScale,
so users can move to different frames on the timeline
instead of always having to step through them one by one.
2025-07-23 00:34:53 +00:00
Alx Sa
963dde2b08 themes: Define minimum height of progress bar
On some system themes, the progress bar on the
status bar was less visible due to the minimum height
being set too low. This patch defines a CSS rule to make
sure the progress bar is at least 10px tall.
2025-07-22 19:18:25 +00:00
Bruno Lopes
fe4cbb6512 Issue #14515: Fix stiff GIMP Debug Dialog
Closes: #14515

Also, make the dialog centered since it isn't modal to
the, for example, crashed GIMP, it is independent.
2025-07-22 10:57:39 -03:00
Alx Sa
40e147af11 build/windows: Fix mypaint-brushes build on clang
This patch separates the conditional logic
for loading perl and mypaint-brushes2 from
ea8b9dc1 to be two separate calls to MSYS2
pacman. This should resolve an issue with
line break differences between platforms.
2025-07-21 17:11:22 +00:00
Alx Sa
0f79d3e850 widgets: Fix crosshair hotspot on Windows
On Windows, the crosshair cursor for brushes is
offset from the brush outline if you have a display
scale of 200% or more. This is because
gdk_cursor_new_from_surface () does not contain code
to scale the hotspot X/Y coordinates to match the surface
on Windows - so it expects you pass those values in
already scaled to the surface.
This patch adds conditional code to scale the hotspots on
Windows the same way we currently do on macOS (though
for opposite reasons).
2025-07-21 01:28:39 +00:00
Alx Sa
daea3c2298 operations: Guard against missing config in...
...GimpCageCoefficientCalculation.
Resolves #8297
The custom filter "gimp:cage-coef-calc" is used
in the Cage Transform tool, which always sends in
a GimpCageConfig parameter. However, it's possible
to call this filter from GEGL Graph without the config.
This causes GIMP to crash, as it tries to access
members of a non-existent config in
gimp_cage_config_get_n_points ().
This patch adds safeguard checks to make sure there's
a config object before trying to use it. The resulting
filter's output in these cases is blank, which is not ideal
but better than a crash.
2025-07-20 06:30:41 +00:00
Alx Sa
1376d25453 plug-ins: Fix bug with RGB FITS export
Resolves #13842
fits_write_img () was incorrectly used, since we
were writing one channel of RRR...GGG...BBB... data
at a time. This patch switches to fits_write_pix (), and
increments the first pixel's 3rd index after writing
each channel so that the next channel is written from
the correct starting point.
2025-07-19 23:36:20 +00:00
Jehan
65949e731c plug-ins: get rid of useless code.
Fixes build warning:

> plug-ins/map-object/map-object-ui.c:309:18: warning: variable ‘combo’ set but not used [-Wunused-but-set-variable]
2025-07-20 01:19:17 +02:00
Michael Natterer
3a2ca2b6ff app: split up GimpContainerView so the code to manually connect to the
GimpContainer is in a separate file, and called conditionally. We
don't need any of this when using GListModel-based views soon.
2025-07-19 13:50:54 +02:00
Martin
ab6569168a Update Slovenian translation 2025-07-19 09:28:41 +00:00
Martin
8e85e98b1c Update Slovenian translation 2025-07-19 09:26:17 +00:00
Yuri Chornoivan
d40b2552c7 Update Ukrainian translation 2025-07-19 05:50:50 +00:00
Yuri Chornoivan
8cb4c382eb Update Ukrainian translation 2025-07-19 05:38:25 +00:00
Ekaterine Papava
99ce27af43 Update Georgian translation 2025-07-19 03:13:40 +00:00
Ekaterine Papava
d7ec15ce75 Update Georgian translation 2025-07-19 03:11:10 +00:00
Luming Zh
0de80db0d0 Update Chinese (China) translation 2025-07-18 23:30:52 +00:00
Luming Zh
373dab8ee1 Update Chinese (China) translation 2025-07-18 23:24:02 +00:00
Michael Natterer
6eae69d2a4 app, pdb: rename gimp_container_get_children_type() to get_child_type() 2025-07-18 08:19:13 +02:00
Michael Natterer
d4e8ab0234 app: rename GimpContainer's "children-type" property to "child-type" 2025-07-18 08:19:13 +02:00
Michael Natterer
77bb857046 app: rename all "children_type" members and variables to "child_type" 2025-07-18 08:19:13 +02:00
Michael Natterer
e00afd9d54 app: rename gimp_data_factory_view_get_children_type() to _get_child_type() 2025-07-18 08:19:13 +02:00
Alx Sa
83dc066b3c plug-ins: Port legacy Grid to GimpProcedureDialog
Note that the horizontal and vertical color buttons are
still chained and laid out manually, as we do not have
a chained color widget in GimpProcedureDialog.
2025-07-18 01:57:54 +00:00
Alx Sa
bb9d36d8ae dialogs, widgets: Check if animations are enabled...
...when setting animations for GtkStack.

Adds a check if gimp_widget_animation_enabled ()
is TRUE before setting an animation type in
gtk_stack_set_transition_type (). If it's FALSE,
then we turn off animations with
GTK_STACK_TRANSITION_TYPE_NONE.
This affects the Input Controller dialogue,
Preferences dialogue, and the Welcome
dialogue.
2025-07-17 20:56:16 +00:00
Alx Sa
1b72774969 themes: Reduce scope of 2bbe1958 changes
2bbe1958 also added outlines to labels in
the color selector, which was not intended. This patch
reduces the scope of the style change to prevent this.
2025-07-17 20:07:40 +00:00
Bruno Lopes
ae482fff97 .gitlab: Add one more rule to bug reports: "only one bug per report created" 2025-07-17 16:41:48 -03:00
Bruno Lopes
0a54dd48a0 .gitlab: Make issue templates consistent 2025-07-17 16:13:08 -03:00
Bruno Lopes
739633fb0c .gitlab: Add template for Security Report
This should help us to have minimally useful reports about security.
2025-07-17 15:49:32 -03:00
Anders Jonsson
f99610cc85 po: update POTFILES.in 2025-07-17 16:41:32 +02:00
Marco Ciampa
b839f66b48 Update Italian translation 2025-07-17 14:28:32 +00:00
Martin
b06da4ba24 Update Slovenian translation 2025-07-17 13:42:37 +00:00
Martin
2d877525e0 Update Slovenian translation 2025-07-17 13:42:26 +00:00
Michael Natterer
f1373373e6 app: in GimpRow, say e.g. "Rename Brush" instead of a generic
"Rename Item", using GimpViewableClass::default_name
2025-07-16 17:27:40 +02:00
Michael Natterer
df497b5ca6 app: move "default_name" from GimpItemClass to GimpViewableClass and
set default names for a lot of stuff. To be used by GimpRow soon.
2025-07-16 17:22:11 +02:00
Michael Natterer
b32ab62822 app: use G_DECLARE_DERIVABLE_TYPE() in GimpResource 2025-07-16 17:11:15 +02:00
Alx Sa
c31b2a31cf plug-ins: Fix various warnings in Map Object
Resolves #12873
This patch fixes a few warnings and bugs in Map Object.
* Since GimpChoice parameters with only a few options
become RadioFrames rather than ComboBoxes, the
"value-changed" signal no longer worked for Light Type.
This was replaced with a "notify::light-type" signal.

* After the GimpProcedureDialog port, xadj, yadj, and zadj
were no longer created. Calls to block signals on these were
removed, and replaced with updating the GimpProcedureConfig
object directly.

* The step increment for adjusting the Light position was lowered
to match how they work in GIMP 2.10 (and because the current step
size sends the light off-screen in one click).
2025-07-16 03:45:19 +00:00
Alx Sa
d51cdee779 paint: Use PROP_VIEW_ZOOM and PROP_VIEW_ROTATION
In ea8b9dc1, PROP_RADIUS was incorrectly used for the
view-zoom and view-rotation property IDs. This patch
removes the duplication and makes the IDs distinct.
2025-07-16 03:35:16 +00:00
Michael Natterer
03b9292d59 app: use g_set_object() in more set_property() implementations 2025-07-15 15:49:45 +02:00
Michael Natterer
bfaf6c5ce0 app: fix typo in GimpViewable: it's "pending" not "prending" 2025-07-15 15:34:24 +02:00
Michael Natterer
0682a19213 app: implement object renaming in GimpRow, using either F2 or long press 2025-07-15 12:27:44 +02:00
Michael Natterer
a91cfe07ac app: set GimpViewableClass::name-editable to TRUE in GimpControllerInfo 2025-07-15 12:12:35 +02:00
Michael Natterer
39228512ad app: use G_DECLARE_DERIVABLE_TYPE() in GimpGroupLayer 2025-07-15 12:10:51 +02:00
Alx Sa
6be5c0d794 plug-ins: Support more Sketchbook TIFF features
Adds support for the following features, based on
unofficial documentation and user-provided sample
files.

* Sets the selected layer based on the image-level metadata
* Sets the visibility of the background layer based on the image
   level metadata.
* Sets the blend mode and color tag of each layer, based on extended
   layer-level metadata. Legacy blend modes are used, based on
   user feedback and comparison with Sketchbook.
* Creates group layers and stores layers in them. Layers are read from
   top to bottom, and layer groups are added and filled based on layer
   level metadata.

Additionally, fixes a bug where "R~G~B~A" was used instead of
"R~aG~aB~aA" to transfer the color, as Sketchbook TIFF layers use
associated alpha.
2025-07-13 18:36:41 +00:00
Ondřej Míchal
dabe921ba1 app: Change container pop-up view size predictably
Instead of a blind multiplication/division use known and well defined
increments that also have no chance of overflowing the minimum/maximum
allowed sizes.

Closes https://gitlab.gnome.org/Teams/GIMP/Design/gimp-ux/-/issues/509
2025-07-13 11:44:57 -04:00
Ondřej Míchal
3dd6272a1d app: Use correct maximum size for button viewables
Pop-up widgets tied to button viewables can have their previews go over
the original max value which officially is 192 ("gigantic"). When they
do and update their property with the number, a critical gets fired
regarding the maximum value being crossed over.

Closes #14337
2025-07-13 11:44:57 -04:00
Michael Natterer
57f21db59e app: use G_DECLARE_DERIVABLE_TYPE for GimpObject 2025-07-13 13:18:42 +02:00
Michael Natterer
572b160ff9 tools, modules: #pragma once 2025-07-13 12:54:21 +02:00
Michael Natterer
06cd254954 libgimpbase: #pragma once 2025-07-13 12:46:11 +02:00
Michael Natterer
47a8ab5a66 libgimpconfig: #pragma once, and some formatting 2025-07-13 12:36:30 +02:00
Michael Natterer
74bf171611 libgimpmath: #pragma once 2025-07-13 12:27:58 +02:00
Michael Natterer
c71661bf24 libgimpwidgets: #pragma once, and formatting and ordering 2025-07-13 12:23:24 +02:00
Emin Tufan Çetin
0a804cb06a Update Turkish translation 2025-07-13 10:00:38 +00:00
Michael Natterer
be3597e3c7 pdb, libgimp: more #pragma once, and formatting cleanup 2025-07-13 11:05:20 +02:00
Michael Natterer
14fb14effc app: #pragma once in app/tools 2025-07-13 09:26:04 +02:00
Michael Natterer
246f9d284f app, pdb, libgimp: use "#pragma once" instead of:
#ifndef __FOO_H__
 #define __FOO_H__

 /* declarations  */

 #endif /* __FOO_H__ */

And some cleanups while I saw the headers.
This is far from finished...
2025-07-13 03:21:37 +02:00
Alexander Alexandrov Shopov
17363c56e6 Update Bulgarian translation 2025-07-12 21:26:50 +00:00
Alexander Alexandrov Shopov
6ce1fd0595 Update Bulgarian translation 2025-07-12 21:16:04 +00:00
Alexander Alexandrov Shopov
181672aa75 Update Bulgarian translation 2025-07-12 21:13:32 +00:00
Jehan
46143342b4 plug-ins: fix "no previous declaration" warnings. 2025-07-12 20:34:22 +02:00
Michael Natterer
5a66ceda13 app: port GimpCircle and its subclasses to G_DECLARE_DERIVABLE_TYPE() 2025-07-12 20:03:34 +02:00
Michael Natterer
d2ca61d5e2 app: G_DECLARE_DERIVABLE_TYPE() in GimpFilter, GimpItem, GimpViewable,
plus somewhat related cleanup in the .c files
2025-07-12 19:08:30 +02:00
Michael Natterer
9359839e84 app, pdb: get rid of const object pointer in generated PDB code, and
adapt some core functions accordingly. Const object pointer make no
sense at all.
2025-07-12 18:54:20 +02:00
Michael Natterer
453e3a1004 app: remove GimpAdd,RemoveItemFunc from GimpItemTreeView and use
gimp_image_add,remove_item() instead
2025-07-12 17:45:05 +02:00
Michael Natterer
7e43c448ae app: add gimp_image_add,remove_item() which dispatches to the correct
layer, channel, path functions
2025-07-12 17:43:44 +02:00
Michael Natterer
a7881b6708 app: remove GimpGetContainerFunc from GimpItemTreeView and use
gimp_image_get_items() instead
2025-07-12 17:17:39 +02:00
Michael Natterer
42e070521c app: add gimp_image_get_items() which returns a GimpContainer based on
an item GType
2025-07-12 17:16:36 +02:00
Michael Natterer
4220657930 app: reorder functions in GimpImage so the item sets API is in the
middle of an unrelated function group
2025-07-12 17:04:36 +02:00
Michael Natterer
4e1c6e918b app: remove GimpGet,SetItemsFunc from GimpItemTreeView and use the
newly added gimp_image_set,get_items()
2025-07-12 16:37:18 +02:00
Michael Natterer
7887862b29 app: port GimpEditor to G_DECLARE_DERIVABLE_TYPE() and some other
cleanups
2025-07-12 16:01:50 +02:00
Alx Sa
bd6cf4a58e plug-in: Fix image-map map format type change
Resolves #14456
Similar to bbbf6df5, GTK3 uses GTK_STATE_FLAG_ACTIVE to
indicate a radio button is selected, rather than GTK2's
GTK_STATE_FLAG_SELECTED. This patch fixes the check to use
it when updating _map_format after toggling the format.

While investigating this bug, the code format was also fixed to match
current standards.
2025-07-12 13:26:10 +00:00
Michael Natterer
c880e5ac17 app: listen to icon-name changes in GimpRow 2025-07-12 15:03:34 +02:00
Michael Natterer
529db388c2 app: add GimpRow, a GtkListBoxRow subclass, that is going to be the
parent of all our future row widgets, Use it in GimpControllerList.
2025-07-12 14:03:14 +02:00
Michael Natterer
c5c503cd59 app: derive GimpControllerManager from GimpList and remove its own
GListModel implementation.
2025-07-12 12:43:09 +02:00
Michael Natterer
af20371f6b app: implement GListModel in GimpContainer, and add
G_DEFINE_AUTOPTR_CLEANUP_FUNC to GimpContainer and GimpList
2025-07-12 12:40:38 +02:00
Niels De Graef
b690e59dca app: Fix adding devices in gimpcontrollerlist 2025-07-12 12:00:30 +02:00
Michael Natterer
71bb54cb9a app: forgot an #include /o\ 2025-07-12 11:53:24 +02:00
Michael Natterer
e85d696cd9 app: forgot to commit the changes in app/display 2025-07-12 11:49:21 +02:00
Michael Natterer
af95e96963 app: move GimpControllerManager to its own files 2025-07-12 11:43:28 +02:00
Michael Natterer
905ccf2ea9 app: move GimpControllerCategory to its own files 2025-07-12 11:09:28 +02:00
Ekaterine Papava
e39650d47c Update Georgian translation 2025-07-12 02:24:01 +00:00
Ekaterine Papava
dd87749d21 Update Georgian translation 2025-07-12 02:19:39 +00:00
Niels De Graef
af3007afbf plug-ins: Use GtkListBox in metadata viewer
This commit changes the metadata viewer to use `GtkListBox`es instead of
`GtkTreeView`s for displaying the tags and their values. The main
advantages is that the latter isn't available in GTK4 (making the
eventual port to it smaller), that they have a11y problems, and that
list boxes allow more advanced UIs than just showing a simple string.
One thing for example that this commit introduces, is to make the labels
selectable, so they can be easily copy-pasted for lookup.

Since we wanted to use `GListModel`, this commit also introduces a
helper object `GimpMetadataTagObject` which holds both a tag's name and
its value. In the future, we could use this to move the string
formatting logic to that helper object, which we could then in turn use
for more advanced UIs.
2025-07-11 21:44:09 +00:00
Niels De Graef
3eb129c73a plug-ins: Use G_DECLARE_FINAL_TYPE in metadata plugin
Use the opportunity also to rename the plug-in to a more
self-explanatory `GimpMetadataViewer` (rather than a `Metadata` struct
which can be easily confused with `GimpMetadata`).
2025-07-11 21:44:09 +00:00
Jacob Boerema
8c86b2ba58 plug-ins, psp: fix #14182 Invalid UTF-8 in PSP comment
PSP creator comments are supposed to be ASCII according to the psp8
specs.
Since we expect utf-8, text with characters that have their high bit
set (e.g. Copyright character) fail to be read as utf-8.

We fix this by first converting the creator keywords to utf-8, and as
extra security also test if the result is valid utf-8.
2025-07-11 16:51:43 -04:00
Jacob Boerema
03427c4600 plug-ins, psp: fix warnings: result of comparison of unsigned...
enum expression >= 0 is always true
2025-07-11 16:42:30 -04:00
Alx Sa
24e6aaea30 widgets: Reconnect style_updated() in DrawableTreeView
Resolves #14447
In addition to defining a style_updated () function, we also need
to attach it to signals whenever the theme or icon size changes.
2025-07-11 15:48:57 +00:00
Alx Sa
270a834598 core: Stop error in gimp_image_set_selected_items ()
Unlike gimp_image_get_selected_items (), we don't return
anything after calling the appropriate function inside
gimp_image_set_selected_items (). Thus, even if we match
the GType for the item, the g_return_if_reached () will always
run at the end of the function and throw an error.
This patch puts that statement in an else {} condition so it
only runs if the GType doesn't match a layer, channel, or path.
2025-07-11 03:50:44 +00:00
Luming Zh
a402d98f3c Update Chinese (China) translation 2025-07-10 23:24:12 +00:00
Luming Zh
43784d6d68 Update Chinese (China) translation 2025-07-10 23:19:59 +00:00
Michael Natterer
5060cc06dd app: move the g_set_str() hack to config-types.h 2025-07-10 23:58:43 +02:00
Jehan
a4a5b2e300 app: (temporarily) redefine g_set_str() to avoid bumping GLib requirement. 2025-07-10 23:51:37 +02:00
Michael Natterer
b61b3362ff app: fix wrong propery identifier of GimpFillEditor::use-custom-style
and fix some coding style issues
2025-07-10 23:31:08 +02:00
Michael Natterer
50ce759eca libgimp*: revert using g_set_str() outside app/ 2025-07-10 23:27:54 +02:00
Yuri Chornoivan
734610c8f6 Update Ukrainian translation 2025-07-10 18:29:40 +00:00
Yuri Chornoivan
b44d267986 Update Ukrainian translation 2025-07-10 18:26:54 +00:00
Niels De Graef
b144929476 app: Don't use g_type_class_get() yet
It's not available yet in Debian.
2025-07-10 09:54:17 +02:00
Niels De Graef
8013d1c013 app: Port controllers dialog to GtkListBox
This shouldn't be a real change in design, just moving away from
`GtkTreeView`.

Since we stopped relying on the underlying `GimpContainer` API, we can
now stop exposing it in the `GimpControllerManager` too.
2025-07-10 07:28:36 +02:00
Niels De Graef
b410dcdc03 app: Extend GimpControllerManager API
... and fix a bug related connecting to the wrong signal.
2025-07-10 07:23:48 +02:00
Alx Sa
2449d2f3ad paint, tools: Minor fixes to MyPaint Brushes code
* Anders Jonsson noticed a typo where the
'r' in "pressure" was left off in the Gain
parameter description
* Since 0.0 is an invalid value for the viewzoom
parameter in MyPaint, the cut off is adjusted
to be greater than 0, not greater than or
equal to 0.
* The default viewzoom value is set to 1.0f,
100%, rather than 0.0001, very zoomed out.
2025-07-10 01:39:36 +00:00
Anders Jonsson
3e781dde6b plug-ins: add name label for brush pipe selection modes
Previously selection mode variables were shown as-is with
their name in a drop-down in the brush pipe export dialog.
Add a label so we can have nicer strings for the GUI and
also make them translatable.
2025-07-10 01:30:00 +00:00
Niels De Graef
fcca547dd6 app: Expose Controller types as GListModel 2025-07-10 00:57:08 +02:00
Alx Sa
ea8b9dc13c core, paint, tools: Port to MyPaint Brushes2
This patch ports our MyPaint code to use the
MyPaintSurface2 API, allowing us to support
version 2 MyPaint Brushes correctly.
The API update lets us take into account
the zoom factor and rotation of the canvas
when drawing. It also adds a "Gain" option
to the GUI in order to control the strength
of the input's pressure (tablet or mouse).
As a caveat, this patch does not yet
implement spectral/pigment blending.
2025-07-09 22:14:42 +00:00
Jacob Boerema
4dd729ba42 plug-ins, tiff: fix crash with clang when querying TIFFTAG_SUBIFD
The TIFFTAG_SUBIFD has a 16-bit length parameter, but we were using a
32-bit int that was not initialized to 0.
Apparently on clang when returning this value the high bits are not
set to 0.
This caused an incorrect high value which caused a stack overflow.
To fix this we change the type to gint16.

See issue #14432.
2025-07-09 17:26:51 -04:00
Aefgh Threenine
0dbc19d303 Update Thai translation 2025-07-09 09:43:26 +00:00
Aefgh Threenine
ca3706cadf Update Thai translation 2025-07-09 08:21:34 +00:00
Aefgh Threenine
39b28cd98c Update Thai translation 2025-07-09 07:28:11 +00:00
Jehan
f0357800bc NEWS: update. 2025-07-08 17:18:58 +02:00
Alx Sa
5f65133e20 pdb: Set image file when using gimp-file-save
gimp_file_save () lets you save an image to
any supported file format, but it did not
update the GimpImage's file or exported
file accordingly. This patch adds code to
do just that, patterned after /app/file/file-save.c's
file_save ().
2025-07-08 14:06:00 +00:00
Niels De Graef
53750e2699 app: Make sure GimpControllerManager emits changes 2025-07-08 15:41:28 +02:00
Niels De Graef
441590ade1 app: Implement GListModel in GimpControllerManager
This'll help us later on to migrate `GimpControllerList` to more modern
widgetry.
2025-07-08 12:52:07 +02:00
Niels De Graef
fcdbd74071 app: Split off GimpControllerManager
Transform the `GimpControllerManager` so it encapsulates all the logic
related to managing all `GimpControllerInfo` objects, so we can pass
that object around, rather than dealing with the `Gimp` struct
everywhere and pretty hackishly retrieving the manager struct using
`g_object_get_data()`. By also making it a proper `GObject`, we can
later put even more logic onto it.
2025-07-08 12:52:04 +02:00
Luming Zh
977a02b702 Update Chinese (China) translation 2025-07-07 23:51:43 +00:00
Michael Natterer
5559a1d487 meson.build: remove stuff about G_DISABLE_DEPRECATED, it's gone 2025-07-08 01:22:12 +02:00
Michael Natterer
89ea91df96 app, libgimp*: more g_set_str() and some other stuff in the same
spirit
2025-07-08 00:37:26 +02:00
Jehan
38a00aca7c app: migrate toolrc from 2.10 or 3.0.
It seems we were never migrating toolrc since GIMP 2.4 (commit
152af52bfe) but that means that people were losing their toolbox
configuration at every minor release.

Let's migrate recent toolrc, and rename the path tool. I went back to
2.10 because apparently if tools are missing, the toolrc parsing would
fail. Anyway we have no new tools in 3.0 or 3.2. We'll see how to
properly migrate this file when we'll also add new tools but there is no
reason to lose this configuration at each software update.
2025-07-07 23:57:32 +02:00
Michael Natterer
199eecfb66 app: use g_set_str() in some places, it's hell yeah! 2025-07-07 22:55:44 +02:00
Alx Sa
2bbe19589d themes: Prevent system theme leak in dialogue frames
Resolves #14421
This patch provides a CSS rule for GtkFrame borders inside of
a dialogue (see Filmstrip plug-in GUI for an example) to prevent
a system theme leak from altering the color.
2025-07-07 19:24:02 +00:00
Michael Natterer
74271cd834 app: quote the font name in the previous commit, and some cleanup 2025-07-07 20:13:42 +02:00
Jehan
a0ca190ca9 app, etc: fix sessionrc from GIMP 3.0 to 3.2. 2025-07-07 20:10:56 +02:00
Michael Natterer
082a88d02d app: fix warnings about deprecated gtk_widget_override_font() by using
a GtkCssProvider. Thanks Carlos!
2025-07-07 20:01:33 +02:00
Yuri Chornoivan
aaa659c011 Update Ukrainian translation 2025-07-07 17:28:49 +00:00
Jehan
421995ae35 app: fix migration of updated action names. 2025-07-07 19:14:53 +02:00
Martin
906a07fc12 Update Slovenian translation 2025-07-07 16:51:38 +00:00
Martin
5eec8c1c72 Update Slovenian translation 2025-07-07 16:51:21 +00:00
Michael Natterer
62384ac915 app: make sure shortcutsrc gets updated with vector -> path when going
from 3.0 to 3.2.
2025-07-07 18:47:22 +02:00
Michael Natterer
1e5792449c app: use gimp_image_set_selected_items() in gimpitemtreeview-search.c
so it's prepared for all kinds of items.
2025-07-07 18:28:08 +02:00
Michael Natterer
5378402d69 app: add gimp_image_set,get_selected_items() which take a GType 2025-07-07 18:19:03 +02:00
Niels De Graef
337c2bbde0 extensions: Ignore all C warnings in Vala
Vala is being silly again and emitting code that is generating a ton of
C warnings that we can't really do anything about. Just ignore all C
warnings (while keeping the Vala warnings of course).
2025-07-07 18:10:47 +02:00
Michael Natterer
76caac9481 libgimp, libgimpwidgets: fix (closure) annotations. 2025-07-07 17:59:32 +02:00
Michael Natterer
1e502371d8 app: vectors -> path in test-xcf.c 2025-07-07 17:23:25 +02:00
Michael Natterer
6a3256ad69 app, menus: rename the vector-toolpath menu stuff to tool-path 2025-07-07 16:32:20 +02:00
Michael Natterer
4ce5181cc5 app, menus: vectors -> path in dialog and action identifiers 2025-07-07 16:16:48 +02:00
Jehan
8a55eec2a9 app: remove a bunch of useless, disabled tests.
We just agreed that there is no point in keeping these forever if they
have not been fixed for years. They only produce warnings and also they
likely won't work in Wayland anyway so they probably *can't* be fixed
without heavy updates.
2025-07-07 16:09:53 +02:00
Jehan
a79d58989e app: fix shortcutsrc from 3.0 to 3.2.
tools-vector becomes tools-path.
2025-07-07 16:09:53 +02:00
Michael Natterer
e6d11e350e app: remove all "vectors" variables to "path" in app/xcf/ 2025-07-07 16:05:07 +02:00
Michael Natterer
69f84942fa app: rename app/vectors/ to app/path/ 2025-07-07 15:44:15 +02:00
Jehan
e3a940ffae app: handle Overwrite layer mode in switch.
This mode should never be used as layer mode anyway but it must still be
listed.

Fixes:

> app/core/gimpimage.c:2837:7: warning: enumeration value ‘GIMP_LAYER_MODE_OVERWRITE’ not handled in switch [-Wswitch]
2025-07-07 15:33:31 +02:00
Yuri Chornoivan
97dfa4ea65 Update Ukrainian translation 2025-07-07 13:20:39 +00:00
Michael Natterer
73352992e3 app: rename vectors-type,enums.h to path-type,enums.h 2025-07-07 15:16:37 +02:00
Michael Natterer
d88a3b9345 app: rename enum GimpVectorExtendMode to GimpStrokeExtendMode
and give namespace to its values.
2025-07-07 15:05:59 +02:00
Michael Natterer
bf405d3d93 app: vector -> path in gimppathtool.[ch] and some config files 2025-07-07 14:56:41 +02:00
Michael Natterer
775c7ef825 app: vector -> path in GimpPathOptions 2025-07-07 14:33:12 +02:00
Michael Natterer
a15fa05d4c app: remove gimpvectortool,options.[ch] to gimppathtool,options.[ch]
Don't change any code just yet, just the files removed.
2025-07-07 14:24:51 +02:00
Michael Natterer
f5900020d3 app: more vectors -> path, mostly in GimpToolPath 2025-07-07 14:16:50 +02:00
Michael Natterer
6d2c71591d app: GimpToolPath: rename "path" to "tool_path" and private->path to
private->canvas_path
2025-07-07 13:37:27 +02:00
Michael Natterer
bee7b8713b app, pdb: a lot of vectors -> path renaming 2025-07-07 13:18:02 +02:00
Alx Sa
aff70406c0 plug-ins: Initialize UI for too-large SVG imports
Resolves #14417
As a security measure, if the user tries to load an SVG
that's larger than the specified limit, we show a warning dialog
that informs them of the possible security risk and lets them
decide if they actually want to open it. However, we did not call
gimp_ui_init () before trying to show this dialogue - resulting in
a crash. This patch adds a call to initialize the UI before creating
gimp_dialog_new ().
2025-07-07 11:05:53 +00:00
Michael Natterer
12716a9377 app: make sure the search popup is never shown without and image,
and don't update it when there is no image
2025-07-07 11:29:03 +02:00
Michael Natterer
5360264ca8 app: never create a new linked group when the search popup is closed
with "Escape".
2025-07-07 11:19:15 +02:00
Ekaterine Papava
6074587094 Update Georgian translation 2025-07-07 08:14:17 +00:00
Luming Zh
72ea198032 Update Chinese (China) translation 2025-07-07 00:01:35 +00:00
Michael Natterer
1e9979349a po: update POTFILES.in 2025-07-07 00:26:35 +02:00
Alx Sa
96fb97d3fa libgimp: Make comment text sensitive based on...
...if Save Comment option is enabled.
Currently, it's possible to unknowingly export an image
without a comment, even if it exists, if the "Save Comment"
option is left unchecked. This patch adds a signal whenever
the "Save Comment" checkbox is clicked (and when the dialogue
is first opened) that uses its active status to set the sensitive
status of the comment text area. If unchecked, the text area will
be marked as insensitive so it can't be edited.
2025-07-06 18:45:58 +00:00
Michael Natterer
853b0ece14 app: move the layer search and link code to its own file 2025-07-06 20:16:37 +02:00
Marco Ciampa
bc25103e89 Small fix in Italian translation 2025-07-06 18:47:40 +02:00
Yuri Chornoivan
8a08fd1c12 Update Ukrainian translation 2025-07-06 16:29:10 +00:00
Jehan
8a6e9a4a3b app: get rid of build warning.
Fixes:

> app/main.c:1094:3: warning: format not a string literal and no format arguments [-Wformat-security]
2025-07-06 14:47:41 +02:00
Bruno Lopes
7f527d8c72 build/linux: Update poppler, libheif and graphviz modules
poppler: Update poppler-25.06.0.tar.xz to 25.07.0
libheif: Update libheif-1.19.8.tar.gz to 1.20.1
graphviz: Update graphviz-13.0.1.tar.gz to 13.1.0
2025-07-06 14:14:11 +02:00
Alx Sa
06915ec881 libgimpbase: Add mnemonics to Convert Indexed options 2025-07-06 01:44:11 +00:00
Michael Natterer
f016b61ebc app: use an enum for the label indices in GimpHistogramEditor 2025-07-05 17:32:34 +02:00
Michael Natterer
8db521d059 app: repack "Compute unique colors" in GimpHistogramEditor so the
entire widget doesn't require an insane width.
2025-07-05 16:30:06 +02:00
Michael Natterer
fd3852af31 pdb: remove -private suffixes
from gimp-drawable-append-filter and -merge-filters. They are not
needed any longer, and it's not an API change because they are
private.
2025-07-05 14:15:17 +02:00
Michael Natterer
6221bdb503 app, libgimp: minor whitespace and formatting cleanup 2025-07-05 12:58:03 +02:00
Michael Natterer
7eac33fba3 app: add gimp_set,get_last_template() and use is from gimpimage-new.c
instead of using gimp->image_new_last_template directly.
The first call to gimp_get_last_template() will create
gimp->image_new_last_template on demand and thus make sure the first
new image is always matching what is set in preferences. All later
images will still default to the last image created in this
session. Fixes #14378.
2025-07-05 12:42:14 +02:00
Kolbjørn Stuestøl
2c767fdb51 Update Norwegian Nynorsk translation 2025-07-04 17:25:08 +00:00
Kolbjørn Stuestøl
b6fee8dc1b Update Norwegian Nynorsk translation 2025-07-04 17:20:31 +00:00
Alx Sa
47f94bc6a3 plug-ins: Show frames in Playback progress bar
In GTK3, GtkProgressBar does not show the frame numbers
by default. This is a regression from GIMP 2.10, so we need
to call gtk_progress_bar_set_show_text () after creating it
to restore the text display.
2025-07-03 17:07:11 +00:00
Alx Sa
dbe5bc7d5d core: Fix Alpha to Selection on single no-alpha layer
Resolves #14392
When using Alpha to Selection on a single layer with no
transparency, we were not cropping the selection channel
from the image size to the the layer size. As a result, we were
essentially performing Select All instead of only selecting the
area of the layer itself.
This patch refactors gimp_channel_combine_items () in its
single layer check, to create a mask for single layers with no
alpha that is the size of the layer. It's then used to crop the
image channel the same way the alpha channel does for layers
that have transparency.
2025-07-03 13:55:11 +00:00
Ekaterine Papava
d54e2749eb Update Georgian translation 2025-07-03 03:45:15 +00:00
Alx Sa
1ec2641941 gui, widgets: Use system colors on Windows title bar...
...when System colors theme is set.
Previously, we just checked if the theme
was set to Light or not and used that to
decide the title bar colors. With the
System colors theme, this was no longer
valid logic.
This patch renames
themes_win32_is_darkmode_active () to
gimp_is_win32_system_theme_dark (), and
moves it to gimpwidgets-utils.c so that
it can be accessed by functions that
need to determine Windows mode
settings. We then use it to determine
dark mode if the System colors theme
is set, and use the original logic otherwise.
2025-07-01 16:49:55 +00:00
Bruno Lopes
a989cec59c build/windows: Make deps installation command work on PowerShell 7
See: #14376
2025-07-01 07:30:33 -03:00
Jacob Boerema
d4581baf25 ci: increase timeout for file-plug-in-tests
The file-plug-in-tests sometimes fail due to timeout on slower runners.
Let's see if increasing it from the default 20 to 30 minutes helps.
2025-06-30 12:07:11 -04:00
Marco Ciampa
7d8ff8eb48 Small fix in Italian translation 2025-06-29 23:03:36 +02:00
Jacob Boerema
6f36667ab8 app: silence warning about unused install_flatpak_gimpdir
This function is only used on Unix, so encapsulate it in a define.
2025-06-29 12:25:33 -04:00
Jacob Boerema
204ddaae56 app: fix #14312 on first run copies settings from 2.10 instead of 3.0
I noticed when running 3.1.2 for the first time it copied settings
from 2.10 instead of 3.0 as I would expect.

Investigation shows that the major version number is hardcoded to 2,
so let's change that to major.
In addition to that, the outer loop continues running even when we
found a migration path if there is a lower major version number
available. Let's change this so we stop when migrate is TRUE.

Also fix some issues that could hit us in the future:
- Change the value of `major` in the for loop from a hardcoded value
to using `GIMP_MAJOR_VERSION`.
- The flatpak specific testing is for version 2.10 but only tested
the minor version. Change that to make sure major is 2.
2025-06-29 12:20:17 -04:00
Bruno Lopes
4b549c61f2 build/linux: Restrict Gexiv2 module version to the API we support
See the explanation in: #14361
2025-06-29 10:48:26 -03:00
Martin
428d76962b Update Slovenian translation 2025-06-29 10:40:30 +00:00
Luming Zh
488a3180a4 Update Chinese (China) translation 2025-06-29 01:36:08 +00:00
Bruno Lopes
1de46ae757 gitlab-ci, INSTALL: Install flex and bison for .map support on AppImage
See: #14145
2025-06-28 12:54:16 -03:00
Yuri Chornoivan
adc9e7cfd3 Update Ukrainian translation 2025-06-28 11:20:17 +00:00
Gabriele Barbero
0ebbfaa3c1 dialogs: indicate when GIMP is up to date in About dialog
To make more clear to users that GIMP is up to date, the About dialog now
shows "Up to date" along with the timestamp of the last update check.
If there's a new update available, it will show only the timestamp
of the last update check.
2025-06-28 09:15:46 +00:00
Yuri Chornoivan
2a00ccf018 Update Ukrainian translation 2025-06-28 08:30:14 +00:00
Luming Zh
d5e3aca09e Update Chinese (China) translation 2025-06-27 23:55:40 +00:00
Jehan
83dca4d9be tools: fix my flatpak install script for Nightly.
The AppId for our nightly flatpak is now different.
2025-06-27 20:55:37 +02:00
Bruno Lopes
d055c0fbd1 app: Do not create separate local data dir on macOS
Closes #13079

We don't know if ~/Library/Caches (NSCachesDirectory) is
the practical equivalent of $XDG_CACHE_HOME on Linux or
%LocalAppData% on Windows so let's just drop 3.00 for now.
2025-06-27 12:36:39 -03:00
Alx Sa
51547d427a core: Consistent naming pattern for symmetry options
Per Reju, the checkbox options for Symmetry should only have
the first word capitalized to match our style guide.
2025-06-27 14:26:34 +00:00
Alx Sa
718487ee5d widgets: Prevent icons shifting with layer selection
Showing and hiding the "%d selected items" text in the
ItemTreeView header causes the height of the header to
shift slightly. This is most noticeable on the layer dockable,
as it has a search icon which moves up and down.
To prevent this, we can switch to using gtk_widget_set_opacity ()
to hide and show the text, as the height stays consistent.
2025-06-26 15:20:18 +00:00
Bruno Lopes
f8d54fe65a app: Set LIBTHAI_DICTDIR on macOS bundle
In preparation for Infrastructure/gimp-macos-build!333

Also, explain why we are setting env vars since
setting env vars is usually runtime-pervasive.
2025-06-26 12:09:52 -03:00
Alexander Shopov
c0892fd7a5 Update Bulgarian translation 2025-06-26 06:36:20 +00:00
Luming Zh
283b6954e4 Update Chinese (China) translation 2025-06-25 11:12:22 +00:00
Ekaterine Papava
e896e15144 Update Georgian translation 2025-06-25 10:20:18 +00:00
Marco Ciampa
013135505e Update Italian translation 2025-06-25 08:34:41 +00:00
Marco Ciampa
ca38e4f7f8 Update Italian translation 2025-06-25 08:30:26 +00:00
Marco Ciampa
54811fea34 Update Italian translation 2025-06-25 08:27:02 +00:00
Marco Ciampa
6e262db1c4 Update Italian translation 2025-06-25 08:26:51 +00:00
Marco Ciampa
e8e845e6fa Update Italian translation 2025-06-25 08:26:37 +00:00
Yuri Chornoivan
1746f4e352 Update Ukrainian translation 2025-06-25 07:46:55 +00:00
Martin
b4020be31c Update Slovenian translation 2025-06-24 18:52:00 +00:00
Ondřej Míchal
47f2a591f8 plug-ins/sphere-designer: Port GimpSpinEntry to GimpSpinScale
GimpSpinEntry is problematic to use when there's little horizontal space
because the slider becomes too small. GimpSpinScale does not suffer from
this because it uses the available space more efficiently. These days it
is also used more over GimpSpinEntry.

Related: https://gitlab.gnome.org/Teams/GIMP/Design/gimp-ux/-/issues/503
2025-06-24 17:37:48 +00:00
Jacob Boerema
a8339021f8 app: fix #14311 Incorrect loading of Photoshop pattern with alpha channel
We did not load the alpha channel when loading Photoshop patterns.
The Photoshop pattern format doesn't tell you whether a pattern has
an alpha channel. You can only find out by reading the color channels
first and then checking if there is enough room for another channel.
In addition to that there is also an 88-byte empty space before the
alpha channel.

To fix this, we now always add an alpha channel to the pattern and
then check if there is enough room. We separated the code inside the
channel reading loop into a separate function, which is now also
called if an alpha channel is detected. If none is detected, we
initialize that channel to 255 (fully opaque).

Besides this a few minor error checking improvements were made:
- Only show the unsupported color mode text once per pattern file.
- Only accept 8-bit color channels, other values will print a console
warning.
2025-06-24 13:12:38 -04:00
Alx Sa
1c71e30cd0 widgets: Confirm image is indexed before setting entry
It is possible to have an indexed image open
in one tab, and RGB/grayscale images open
in others. If you have the color editor open
and swap between them, you'll receive a
CRITICAL because the ColorMapEditor will
always try to update a color entry even if
the active image is not indexed.

This patch adds checks to ensure you have
the indexed image open before trying to update
its color entry.
2025-06-24 14:38:20 +00:00
Anders Jonsson
5baabdb4b2 plug-ins: Mark TIM name as per-process translatable 2025-06-23 23:45:48 +00:00
Bruno Lopes
b2ae719c41 build/windows: Update gimp-data commit 2025-06-23 11:51:03 -03:00
Jehan
f1c781936c app: allow GIMP_DEV_VERSIONS_JSON to be empty for disabling it.
It makes it easier to have it set all the time and when I want to
disable it, I just prepend my command with GIMP_DEV_VERSIONS_JSON=.
2025-06-23 14:25:26 +02:00
Jehan
e38ea2d866 desktop: fix last release date.
I forgot to update the date after the last small delay.
2025-06-23 14:25:26 +02:00
Bruno Lopes
fc06a435fa build/linux: Fix OpenBLAS comment position 2025-06-23 07:06:06 -03:00
Alx Sa
f3b676f9cf core: Free drawables after use
In gimp_edit_copy (), there is a code path where
we iterate through drawables *after* we had freed it.
This patch moves the code that frees "drawables" until
after its final usage.
2025-06-23 02:21:49 +00:00
Jehan
d5e07db771 meson: post-release version bump to 3.1.3. 2025-06-23 00:57:10 +02:00
Kolbjørn Stuestøl
14e44cf961 Update Norwegian Nynorsk translation 2025-06-22 21:38:21 +00:00
Jehan
b4e2570461 Release GIMP 3.1.2. 2025-06-22 16:20:52 +02:00
Kolbjørn Stuestøl
88aba102a7 Update Norwegian Nynorsk translation 2025-06-22 12:39:42 +00:00
Jehan
9666d28ed5 build, gimp-data: compute splash ratio for Windows installer. 2025-06-22 12:00:29 +00:00
Ekaterine Papava
dc26f99521 Update Georgian translation 2025-06-22 02:49:42 +00:00
Luming Zh
1656fdeaf6 Update Chinese (China) translation 2025-06-22 02:27:49 +00:00
Luming Zh
ecfceffe6c Update Chinese (China) translation 2025-06-22 02:24:32 +00:00
Jehan
2a05ee6a44 gimp-data: bump the submodule again.
Make sure the splash file is not oversized when the original XCF is
high-bit depth.
2025-06-22 00:16:49 +02:00
Bruno Lopes
464b1fb32f build: Only bundle the strictly needed .typelib files
Otherwise plug-in developers would rely on .typelib available only on
Linux OR macOS OR Windows so create unportable/broken .py plug-ins.
2025-06-21 18:40:22 -03:00
Jehan
1632e24dbd gimp-data: bump to fix Windows installer's images. 2025-06-21 23:12:22 +02:00
Jehan
2f5b2b5bca NEWS: update. 2025-06-21 22:37:11 +02:00
Jehan
7b14c5b9fa desktop: update AppStream and add demo scripts. 2025-06-21 22:36:44 +02:00
Jehan
c5b52a5ad3 app, modules: add some identifiers for demo scripts. 2025-06-21 22:36:44 +02:00
Jehan
48934e4eb4 app: make color selector modules' names their identifier for demo scripts. 2025-06-21 22:36:44 +02:00
Jehan
1b012548c9 app: add ability to click any button in our Release Notes demo scripts. 2025-06-21 22:36:44 +02:00
Yuri Chornoivan
9c49e276e0 Update Ukrainian translation 2025-06-21 17:49:53 +00:00
Yuri Chornoivan
afc904c5cc Update Ukrainian translation 2025-06-21 17:14:39 +00:00
Jehan
b35b0cad0a gimp-data: bump to latest.
- Some Legacy icons copied from Default icon theme.
- New splash screen for GIMP 3.1.2.
2025-06-21 16:40:29 +02:00
Martin
0b47045bb1 Update Slovenian translation 2025-06-21 13:46:31 +00:00
Martin
365c4d4c6a Update Slovenian translation 2025-06-21 13:46:13 +00:00
Jehan
97b8ddbdff NEWS: update per Bruno's comment. 2025-06-21 15:26:00 +02:00
Bruno Lopes
c1422a9008 build/linux: Update graphviz module 2025-06-21 08:59:25 -03:00
Jehan
fc5c59a643 NEWS: update. 2025-06-21 13:03:35 +02:00
Jehan
23f9d8748c desktop: going for release today. 2025-06-21 12:30:22 +02:00
Bruno Lopes
ccf592d28b plug-ins: Mark LNK and ICNS descriptions as per-process translatable 2025-06-21 10:05:17 +00:00
Bruno Lopes
d495994082 plug-ins: Mark FF, AVIF, LNK, QOI and ICNS names as per-process translatable 2025-06-21 10:05:17 +00:00
Ekaterine Papava
b462371b2e Update Georgian translation 2025-06-21 04:42:25 +00:00
Ekaterine Papava
0e35ebf282 Update Georgian translation 2025-06-21 04:39:11 +00:00
cheesequake
afecf9f6c6 Issue #14074: Resize image to layers irrespective to selections
By moving the block of code to resize the image to layer size outside
the has_selection condition, we ensure that a smaller layer without
selection also gets resized properly.
2025-06-21 00:08:11 +00:00
Jehan
fbf58140eb app: include mask_value as part of the target alpha value.
The existing usage of the mask value was as interpolation variable,
which is a different usage. If we werent doing this, trying to paint
with tool opacity to 100 and a paint dynamics changing opacity, we'd
still have 100% opaque pixels instead of lowered opacity.
2025-06-20 23:24:10 +00:00
Jehan
8dbedcf723 app: review and improve over MR !151 for an "Overwrite" paint mode.
I get why Woynert wanted to still interpolate both alpha and RGB
channels here, avoiding some too harsh transition when using the brush
tool. But the algorithm felt overly complicated (unless I misunderstood
the reason). I think what we want is simply to use the mask value to
interpolate, which allows the alpha and color to smoothly transition in
parts where the brush designer was expecting transitionning, when used
in a paintbrush-type tool.
In particular the proposed algorithm was never using the layer[ALPHA]
value which felt quite weird.

Additionally to the algorithm update, this commit:

* Makes the composite mode/space and blend space explicitly immutable.
* Removes code from other composite modes, which was anyway just
  copy-paste remnants from gimp:normal operation and add some
  g_return_val_if_reached() call to protect these code paths.
* Fix a code path where the out array was never filled (i.e. it was
  filled with random data).
* Fix another code path where we could make a division by zero (in my
  case, it didn't crash, but I got nan values).
2025-06-20 23:24:10 +00:00
woynert
a188a8db93 app,libgimp: paint blend mode 'overwrite' 2025-06-20 23:24:10 +00:00
Luming Zh
63e3a2436d Update Chinese (China) translation 2025-06-20 23:12:23 +00:00
Bruno Lopes
35b3cdf31c gitlab: Update coding style URL pointing to gimp-web-devel 2025-06-20 18:50:16 -03:00
Bruno Lopes
c854ca5f45 gitlab: Don't allow clang-format to fail silently
It is not useful for code style debugging this way.
2025-06-20 18:49:27 -03:00
Martin
59fd0d02ee Update Slovenian translation 2025-06-20 19:54:10 +00:00
Bruno Lopes
ff1bd20577 data: Fix obscure environ files on Windows
Following 36b660e2b2

- PATH was being set due to the Installer and MSIX but
  on my tests on both relocatable and Unix-style builds it
  was bogus. C and Py plug-ins worked without problems
- Same aplies to GI_TYPELIB_PATH, it is obscure and useless
2025-06-20 16:30:34 -03:00
Sam James
36b660e2b2 meson: fix typo on GIMP_TESTING_ENVIRON_DIRS
This fixes some "illegal variable" noise in the build. There can't
be any dynamically created environment files in the *source* directory,
but there may be in the *build* directory we're modifying.
2025-06-20 13:23:21 -03:00
Yuri Chornoivan
9039e35b01 Update Ukrainian translation 2025-06-20 15:44:02 +00:00
Jacob Boerema
c17b324910 plug-ins/dds: fix #12790 for 32-bit
On 32-bit systems the computed linear size can overflow, causing a
crash.
Use a function that checks for overflow when multiplying and return
an error if that fails.
As extra security also update the loop to compute the base offset after
each line of data, and convert to gsize first when computing the
size for g_malloc and memset.
2025-06-20 10:29:43 -04:00
Martin
693a6c5938 Update Slovenian translation 2025-06-20 07:06:49 +00:00
Alx Sa
56c83101e9 plug-ins: Import legacy PSD Inner Shadow
This patch adds support for loading and
applying active legacy Inner Shadow
layer styles in PSD images. It uses
gegl:inner-glow with certain preset values
to replicate the Photoshop filter.
2025-06-19 23:32:42 +00:00
Jehan
7262faed16 app, pdb: allow rendering font previews with theme colors.
This also depends on the same settings to render brushes with theme
colors, because this is data, not user interface. Therefore following
theme colors is not necessarily what creators would expect.
2025-06-20 00:11:08 +02:00
Jehan
e41776ef39 app: clean out unused functions. 2025-06-20 00:11:08 +02:00
Kolbjørn Stuestøl
40845e1961 Update Norwegian Nynorsk translation 2025-06-19 20:01:29 +00:00
Kolbjørn Stuestøl
cf817b96a3 Update Norwegian Nynorsk translation 2025-06-19 19:57:13 +00:00
Kolbjørn Stuestøl
aac4e49a47 Update Norwegian Nynorsk translation 2025-06-19 19:49:23 +00:00
Bruno Lopes
6c5401b9da build/linux: Explain the purpose of $APPENDED_LIST 2025-06-19 16:25:16 -03:00
Bruno Lopes
f59b83ed6c build/linux: Reorganize a bit the files section of AppImage script
This makes it a bit more similar to the Windows bundling script so
easier to read and maintain in the future.
2025-06-19 16:20:00 -03:00
Alx Sa
a39355ca4d actions: Select next palette entry after deletion
Unlike other dockables such as brush and patterns,
deleting a palette color does not automatically select
the next one. This makes it difficult to delete multiple
colors in a row. This patch gets the current index before
deleting the color, and then uses it to select the next entry
afterwards.
2025-06-19 18:57:08 +00:00
Bruno Lopes
2defc3d07b build/linux: Delete some whitespaces on Flatpak deps script 2025-06-19 14:45:08 -03:00
Bruno Lopes
aa10583576 gitlab: Add soft check against bashisms
Even .sh (Unix) scripts being "forbidden" by us on Meson to
allowing GIMP being 100% natively built on Windows, it is a
good pratice anyway .sh being portable even outside Meson.
2025-06-19 11:31:43 -03:00
Ondřej Míchal
073a7a208f app: Unref GtkFileFilter only when a file loader has extensions set
gimp_file_proc_view_process_procedure() can return NULL in case a file
loading procedure does not have any extensions set.
2025-06-19 14:13:40 +00:00
Alx Sa
58a0c1d31e tools: Don't alter merge filter status unexpectedly
Currently, some GEGL filters must always be merged because
we don't yet have a way to store GimpDrawables with filters.
When creating these filters as part of the Filter Tool, we were
changing the "merge-filter" property directly. This mean that
if you had previously set the Filter Tool to be non-destructive,
it would be destructive the next time you added a filter (even if
the filter supported NDE).

This patch creates a separate boolean variable (initialized to the
current state of "merge-filter") and uses that instead in the
gimp_filter_tool_create_filter () function. This allows us to still
force filters with aux pads to always merge, while not affecting
the user's preferences for other NDE filters.
2025-06-18 23:14:36 +00:00
Yago Raña
fe19572cd1 Update Galician translation 2025-06-18 18:12:11 +00:00
Bruno Lopes
f4b2c99a5d gitlab: Refine meson-health failure catching
- Add backslash to avoid dots being treated as wildcards by grep
- Do not allow search-common-ancestor to fail silently anymore
2025-06-17 21:13:32 -03:00
Alx Sa
c6655c2eac plug-ins: Correct Legacy PSD layer style loading format
Per Wormnest, the 4 bytes allocated to
PSD Legacy Dropshadow properties are
meant to be used for fixed floating point
values rather than integers. This patch
corrects the PSD layer resource struct and
how the data is loaded, based on prior
work by Wormnest.
2025-06-17 16:25:48 +00:00
Yuri Chornoivan
879aa8e89f Update Ukrainian translation 2025-06-17 13:51:36 +00:00
Bruno Lopes
078abb5f93 gitlab-ci: Use printf to fix Docker RUN of GL Collapsible Sections
This fixes some problems of output in the deps script and
makes everything more consistent.
2025-06-17 08:51:43 -03:00
Martin
877e500d0f Update Slovenian translation 2025-06-17 11:40:52 +00:00
Luming Zh
09720123d3 Update Chinese (China) translation 2025-06-17 01:48:58 +00:00
Bruno Lopes
fd47161215 gitlab, build, tools: Port bashisms to POSIX-compliant code
Although these scripts are not called by Meson, portability outside the
build system is always welcome (specially on macOS or non-GNU OSes).
2025-06-16 22:06:06 -03:00
Ekaterine Papava
b9d30cb3a2 Update Georgian translation 2025-06-16 20:46:10 +00:00
Alexander Shopov
1352857579 Update Bulgarian translation 2025-06-16 20:45:52 +00:00
Alx Sa
f94b43ecbf plug-ins: Add export support for PSB images
Photoshop's PSB format is nearly the same
as PSD. The main differences are that it
allows you to save images up to
300,000 by 300,000 pixels, and it doubles
the size of pointers related to pixel data
(such as layers and channels).
2025-06-16 18:57:22 +00:00
Jehan
1b9c78dc12 app: move the follow-theme toggle to GimpDataFactoryView.
By being in GimpContainerIconView, the toggle was only being shown in
grid view, even though it also affected the list view. So we move it up
to the container, next to the query tag entry.

Also I am adding a function to make this toggle visible only when
requested. And so far, we only request it for the Brushes dockable,
because it doesn't do anything on other data dockables (we added some
code to follow theme, for instance in Palettes dockable, but it doesn't
depend on this setting, because it doesn't touch data render, only GUI
render where it's normal to follow theme).

The latter function fixes issue #14260.
2025-06-16 12:13:15 +02:00
Jehan
8628ad77c1 app: make sure we invalidate brush renderers when "viewables-follow-theme" changes. 2025-06-16 11:55:34 +02:00
Alx Sa
bd79df9858 themes: Fix system theme leak on notebook header
Some system themes add a box shadow and change borders
for GtkNotebook headers. This patch adds rules defining these,
along with defining the outline for header buttons when hovered
over.
2025-06-15 17:08:14 +00:00
Jehan
55bad480b8 README: this is a development branch now. 2025-06-15 17:46:41 +02:00
Jehan
c6c00ddccc INSTALL: update.
This text should also be a bit more robust to future (more frequent now)
minor version bumps.
2025-06-15 17:43:59 +02:00
Jehan
423b1d027f NEWS: update. 2025-06-15 17:29:40 +02:00
Jehan
cc21e6d70b app: fixup commit be1496a91e implementing unique color count.
- Improve the hash: doing the value computation in guint64, we'd
  wrap-around the max guint64, which mostly means that we'd drop all
  high bits! Therefore the hash doesn't depend at all on the most
  significant bits. Instead let's do our computation in double and
  convert to guint in the end. I am not 100% sure if it is that much
  better, to be fair (thinking in term of color: the old hash function
  depended on the least significant color channels; I do wonder if it
  could not make collisions more frequent but I'm not sure). The
  wrap-around hash function should be fairly distributed too, but then
  maybe we should just use guint directly in this case.
- The computation of unique colors was leaking all the GBytes but the
  last! First we must use g_hash_table_new_full() to set a free function
  for inserted keys, then we must free every non-inserted key ourselves.
- The "n/a" string should be localized (it's English acronym).
- Also display this "n/a" in italic to make it clearly different from
  computed numbers.
2025-06-15 17:23:06 +02:00
Jehan
22a14d6248 app: fix a few build warnings.
- gimp_pattern_load_photoshop_pattern() should be a static function.
  Fixes:

> app/core/gimppattern-load.c:39:1: warning: no previous declaration for ‘gimp_pattern_load_photoshop_pattern’ [-Wmissing-declarations]

- Fix wrong format for goffset values:

> app/core/gimppattern-load.c:137:16: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 6 has type ‘goffset’ {aka ‘long int’} [-Wformat=]
2025-06-15 15:53:55 +02:00
Bruno Lopes
16cbcb828c build/windows: More metainfo cleanup
Following 088dd8aa9f
2025-06-14 17:35:56 -03:00
Alexander Shopov
05aeba9740 Update Bulgarian translation 2025-06-14 20:26:49 +00:00
Yuri Chornoivan
0acc8ffba3 Update Ukrainian translation 2025-06-14 17:44:52 +00:00
Bruno Lopes
26c2fe9e3d build/linux: Add comment about why libbacktrace is custom built 2025-06-14 12:46:41 -03:00
Bruno Lopes
c10d5c1138 build/windows: Add comment about glib schemas bundling
Otherwise, I and the future packagers will forget the reasoning behind
why glib schemas on Windows diverges from Linux bundling (e.g. AppImage).
2025-06-14 12:31:40 -03:00
Bruno Lopes
088dd8aa9f build/windows: Complete share/metainfo cleanup
Completes 47212318

I missed the .iss script so it would fail. Removing from it, then.
2025-06-14 11:38:11 -03:00
Bruno Lopes
c3bf6ae3ba build/windows: Add explanation about .pdb Symbol Server 2025-06-14 10:14:54 -03:00
Anders Jonsson
e44a6db7a5 Update Swedish translation 2025-06-14 11:03:55 +00:00
Anders Jonsson
681e92ee7a Update Swedish translation 2025-06-14 11:00:58 +00:00
Martin
ea69356e52 Update Slovenian translation 2025-06-14 05:43:37 +00:00
Luming Zh
c0bc06f7ea Update Chinese (China) translation 2025-06-14 01:15:00 +00:00
Bruno Lopes
d178d741b0 build/linux: Sync Flatpak nightly modules with Flathub branches 2025-06-13 21:52:11 -03:00
Bruno Lopes
ac320fb6a6 build/linux: Enable dependency check on Nightly flatpak
Inspired by https://github.com/flathub/org.gimp.GIMP/pull/437

Now, in the weekly builds the job will fail if some module is old.
It is reasonable to make the job fail since nightly builds are
supposed to be blending edge so they should have the latest deps.

This makes way easier to spot when some module needs to be updated,
reducing a bit the continuous burden of syncing the 3 manifests.
2025-06-13 21:52:06 -03:00
Gabriele Barbero
be1496a91e widgets: implement unique color count
This patch reintroduce the unique color counting in an image,
an old feature from old color-cube-analyze plug-in.
See #13026
2025-06-13 19:22:46 +00:00
Ekaterine Papava
d028b96654 Update Georgian translation 2025-06-13 17:57:54 +00:00
Yuri Chornoivan
427904a636 Update Ukrainian translation 2025-06-13 17:44:01 +00:00
Jehan
3799d66ecf Revert "plug-ins: Convert screenshot dropdowns to radios"
This reverts commit 7af987d31b.

This commit is not needed anymore since the automatically generated
widget will now be radio buttons for small lists of choices.
2025-06-13 16:50:12 +00:00
Jehan
bcb736db61 libgimp: different widget default for GimpChoice in GimpProcedureDialog…
… depending on the number of choices.

Enforcing a UX decision into code from GIMP/Design/gimp-ux#323.
Note that this is not a perfect automatization, since the right default
widget may still be a combo box even for limited choices arguments, when
the dialog is crowded.
It still improves the defaults, and it is still possible to override the
widget on case by case (just as of now).
2025-06-13 16:50:12 +00:00
Bruno Lopes
d56676a2fa meson, desktop, plug-ins: Generate MIMEtypes var dynamically
This way, we avoid divergence with MIMEs declared on the
plug-ins .c and .py files and we eliminate duplicate work.

See also: 2ce3c604
2025-06-13 13:47:19 -03:00
Jacob Boerema
a2bd03a471 app: use GIMP_BRUSH_MAX_SIZE instead of a fixed number...
to check for the maximum allowed size of a Photoshop brush.
2025-06-13 12:15:06 -04:00
Jacob Boerema
67f505009a app: add support for loading Photoshop patterns
For now only RGB and grayscale are supported.
2025-06-13 11:44:32 -04:00
Jacob Boerema
934c4a90cd app: refactor Photoshop stream loading functions
Since these functions used in gimpbrush-load will also be used in
Photoshop pattern loading, move them to gimp-utils.

At the same time, change the signature to return a boolean which
indicates TRUE on success and make the returned value a parameter.
This makes it easier to check multiple read calls for success.
2025-06-13 11:19:35 -04:00
Bruno Lopes
35fbb10d43 desktop: Use GIMP_DESKTOP_NAME on appdata too 2025-06-13 10:17:09 -03:00
Bruno Lopes
b57744ceba build/linux: Fix AppImage StartupWMClass
This completes aede2709b0
2025-06-13 10:09:22 -03:00
Martin
745bf31cd7 Update Slovenian translation 2025-06-13 05:42:12 +00:00
Martin
fa8a12a29e Update Slovenian translation 2025-06-13 05:39:30 +00:00
Bruno Lopes
472123181d build/windows: Do not bundle unneeded share/metainfo on Windows
Seems it was used at runtime in the past but that is
not the case anymore. Indeed, it started to be bundled in
af79bbe028 due to an
error: before the Windows bundling unification the
crossbuilds "script" on .yml bundled all the 'share' dir.
2025-06-12 18:59:48 -03:00
Alx Sa
c2b9c21b5b core: Add alpha on merge if filter requires it
Some filters such as Color to Alpha require
an alpha channel. Now that we have NDE,
filters can exist separately from layers
until they're merged down. This means
the layer itself may not have an alpha
channel, causing distortions on merge.
This patch adds a method to check if
the filter requires an alpha channel, and
adds it to the layer on merge or export if
it has such a filter.
2025-06-12 18:04:09 +00:00
Yuri Chornoivan
50df422969 Update Ukrainian translation 2025-06-12 15:24:25 +00:00
Alx Sa
9a349e812b app/tools: Use NDE filter's drawable for on-canvas widgets
Resolves #14240
This patch extends a9056419 to use the existing filter's
drawable (if it exists) on all other on-canvas widgets instead
of always using the selected layer.
2025-06-12 15:11:31 +00:00
Alx Sa
03bf117110 plug-ins: Remove unnecessary file size check...
...for file-tim-load, as we use other methods to check
if the data we load exceeds the size of the file.
2025-06-12 11:53:06 +00:00
Jehan
e98fc3dbf6 plug-ins: closing a NULL File.
This is a code path where we already verified that the returned FILE was
NULL. The compiler complained too:

> plug-ins/common/file-tim.c:280:7: warning: argument 1 null where non-null expected [-Wnonnull]
2025-06-12 13:31:27 +02:00
Jehan
80fe32dfc6 pdb: also allow none_ok on PDB type 'guide'.
This would be theoretically useful for gimp-image-find-next-guide except
that this function was already using the int type, and allowing 0. I'm
not changing to 'guide' type with none_ok because it would break the
libgimp API (the signature would change, with the type changing from
gint to guint).

Since it already works like this, I just leave a TODO for further
update.

With this and previous commit, we now fully replaced commit 69894d8bbf
attempts for allowing 0 to some types. There was in fact also some
change on 'tattoo' type, but I went through all the PDB functions we
had, one by one, and I don't think we currently have a single case where
we need to allow 0 as a tattoo value. If this need ever arises then we
can always add none_ok support easily in the future.
2025-06-12 13:21:52 +02:00
Jehan
bf14d3db20 Issue #14205: gimp-image-find-next-sample-point returns error when…
… passed "0" as argument.

Adding support of none_ok for arguments of type sample_point, allowing
to pass 0 as a special value and use it on this function.
2025-06-12 12:59:10 +02:00
Jehan
2d2f1d048d Revert "PDB: fix #14205 image-find-next-sample-point error"
This reverts commit 69894d8bbf.

Let's not randomly make our API less strict on types as a workaround for
a bug. If there are specific cases where it's needed to accept 0, then
these are the cases we have to handle.

Also unlike what the commit message was saying, it's not true that this
was only affecting Script-Fu. Any change to the PDB affects by
definition the whole PDB, as well as libgimp and all bindings (over PDB
or libgimp alike). And yes, this change **was** of "real consequence".

I'll do further commits for the proper fixes to #14205.
2025-06-12 12:59:10 +02:00
Luming Zh
d86b26dc4b Update Chinese (China) translation 2025-06-12 00:53:23 +00:00
Jehan
2244d70a94 Issue #13183: use the renamed desktop filename in Flatpak.
Since MR !2158, we set the desktop name as prgname, because that's what
is expected for Wayland. But this doesn't work on Flatpak where the
desktop file is renamed (and even to different names for the stable/beta
vs. nightly flatpaks). This commit adds some special-casing when we
detect we are inside a flatpak environment.

Note that on X11 (whether or not we are in flatpak), we just always use
the original desktop name, because then it will be set as windows'
WM_CLASS which will also match the StartupWMClass key we set in the
desktop file (cf. previous commit).
2025-06-12 02:31:36 +02:00
Jehan
aede2709b0 Issue #14233: incorrect StartupWMClass in gimp.desktop.
The WM_CLASS X property is apparently set to windows throughout the
program by the g_set_prgname() call which we changed in commit
95e32ebb34 from being the executable name (being the fully qualified
program name with the version) to the desktop name.
2025-06-12 02:31:36 +02:00
Alx Sa
0370aed02d tools: Don't run Foreground Selection without strokes
The Foreground Selection algorithm was being run when
users switched to a different tool, even if no strokes had been
painted. This caused an unnecessary delay, since no selection
will be generated.
This patch adds a check to verify we have at least one foreground
stroke made by the user before trying to create the selection.
2025-06-11 19:49:52 +00:00
Bruno Lopes
1f8f17cd9a gimp-data: Bump to fix #14236 2025-06-11 16:00:00 -03:00
Alx Sa
54c95577df widgets, tools: Allow NDE filters on channels
This patch removes restrictions on applying
NDE filters to channels in the GUI. Note
that layer masks are still restricted, not for
technical reasons but because UX/UI needs
to be considered further.
2025-06-11 16:49:12 +00:00
Ekaterine Papava
7ba36e83a3 Update Georgian translation 2025-06-11 06:25:18 +00:00
Anders Jonsson
82c9a80de3 plug-ins: remove unmatched parenthesis 2025-06-11 06:50:19 +02:00
Jehan
427cc49074 desktop: new release tag for upcoming GIMP 3.1.2. 2025-06-11 03:04:45 +02:00
Jehan
a349db4c72 NEWS: update. 2025-06-11 03:04:45 +02:00
Luming Zh
679d9a8952 Update Chinese (China) translation 2025-06-11 00:55:35 +00:00
Luming Zh
78915f28f0 Update Chinese (China) translation 2025-06-11 00:53:43 +00:00
Jehan
fca4fd1bcc Revert "ScriptFu: scripts: remove obsolete script unsharp-mask"
This reverts commit fbee943213.

We must not remove any PDB function because we promise API stability
(not only in libgimp, but also in the PDB). Even if this was not used
anywhere in our own scripts/plug-ins, it may be used by third-party
scripts. At best, we can deprecate them so that people are properly warn
that we plan on removing a function. Then we'll remove it for GIMP 4.

Also I believe that various people were not perfectly happy with GEGL's
unsharp-mask operation, compared to the old one. And that was a reason
for keeping the legacy Script-fu version around. See gegl#122 or other
reports which mention such concerns.
At the very least, this should be discussed first with more specialized
developers to determine whether we consider GEGL's replacement operation
to be adequately replacing the historical script by now, so that we can
plan the removal for GIMP 4.
2025-06-11 02:26:16 +02:00
Daniel Novomeský
933a12335c plug-ins: AVCI import, HEJ2 export
AVCI images can be opened now, saving is not available in libheif yet.
Opening AVCI needs libheif 1.19.6 with OpenH264 decoder enabled.

HEJ2 images can be saved, when at least
libheif 1.19.8 with enabled support for OpenJPEG is detected.
2025-06-10 23:27:59 +02:00
Danial Behzadi
82eb34503f Update Persian translation 2025-06-10 21:26:17 +00:00
Alx Sa
963830fd91 libgimp, libgimpwidgets: Add GimpCoordinates widget...
...to GimpProcedureDialog.
This patch allows plugin developers to create a
GimpCoordinates widget (two GimpSizeEntries linked
together with a chain and with a units combo) in the
GimpProcedureDialog.

It is largely a wrapper for gimp_prop_coordinates_new ().
This patch also makes that function more responsive
to the unit property, now that GimpUnit has a proper
GParamSpec implementation. The default unit and
whether we show pixels, percents, or the resolution
spinners can now be determined via the unit
parameter (if set) rather than relying on
hardcoded values.

As a demonstration, the Tile plug-in's width/height
entries were restored to what they were before the
GimpProcedureDialog port, with units and a chain
link between values.
2025-06-10 19:37:35 +00:00
Ekaterine Papava
c1a56ff0b3 Update Georgian translation 2025-06-10 04:13:26 +00:00
Ekaterine Papava
dd5379662b Update Georgian translation 2025-06-10 04:10:51 +00:00
Anders Jonsson
51a64babca po, po-plug-ins: update POTFILES.in 2025-06-09 22:59:02 +02:00
lloyd konneker
fbee943213 ScriptFu: scripts: remove obsolete script unsharp-mask
Was replaced by a GEGL filter, long ago.

See 18 year old commit 31282ecc by Sven that says this exists for backward compatibility.
Which means we should have removed it befoe GIMP 3.0 major release.

Provides nothing more than the GEGL filter, so just delete it,
and NOT move to gimp-data-extras repo.

Fix #13824 (or at least makes it moot.)

The obsolete script was not used by any code in the repo,
except for test scripts, which were changed to not use it.
2025-06-09 14:27:54 -04:00
lloyd konneker
ea238e4e5a ScriptFu: fix #12837 i18n for independent scripts
See /scripts/test/test-i18n.scm,
which has tests and documents use cases.

Some incidental refactoring and editing of comments.
2025-06-09 13:50:12 +00:00
Bruno Lopes
6dfd27b271 gimp-data: Bump commit 2025-06-09 10:18:04 -03:00
Alexander Shopov
2d1ab85214 Update Bulgarian translation 2025-06-08 19:44:49 +00:00
Alexander Shopov
529914250e Update Bulgarian translation 2025-06-08 19:42:34 +00:00
Alexander Shopov
6386cfe561 Update Bulgarian translation 2025-06-08 19:37:18 +00:00
Alexander Shopov
ffc5836e48 Update Bulgarian translation 2025-06-08 19:32:48 +00:00
Martin
32404df8f6 Update Slovenian translation 2025-06-08 07:05:55 +00:00
Alx Sa
6e58d05a56 widgets: Prevent filter container duplication
Resolves #14206
If the user clicks the Fx icon in the DrawableTreeView
repeatedly (and quickly enough), the "closed" signal
function that cleans up the Filter popover does not
run before the next creation code is started. This can
results in the previous view being left in editor->vbox,
leading to duplication.
This patch checks if the editor and view already exist when
the popover opens, and if so, it runs the clean-up code first.
2025-06-08 01:42:24 +00:00
Martin
9464e571ed Update Slovenian translation 2025-06-07 22:58:20 +00:00
Martin
050a2094bc Update Slovenian translation 2025-06-07 22:55:48 +00:00
lloyd konneker
69894d8bbf PDB: fix #14205 image-find-next-sample-point error
Three types declared in pdbgen perl code,
for sample-point, guides, and tatto objects,
declare too restrictive a range of permissible values.
They should allow the value 0, which the API uses as a sentinel value,
to represent "invalid object ID".
The types are for object ID's, which are unsigned.

GObject checks the declared range when you chunk into a GValueArray,
to call the PDB.

Declaring the attribute in the perl .pdb "no-validate"
is not sufficient since GObject doesn't understand
GIMP_PARAM_NO_VALIDATE, that flag is distinct from G_PARAM_NO_VALIDATE.

Only affects the ScriptFu binding to PDB.
The GI binding to libgimp is not affected.

The declared range is no more restrictive than the underlying type
"unsigned int 32."
So of no real consequence.

The API could be changed to return a list which the caller
would iterate on.
2025-06-07 19:58:24 +00:00
Bruno Lopes
7fd2489985 build/linux: Run gimp process without LD interpreter on AppImage
Closes: #12929

This normalizes argv0, making the AppImage debuggable by gdb etc.

From now, the AppImage can't be run in pre-Bookworm (glibc < 2.36)
distros, but that use case was never officialy supported anyway.
2025-06-07 16:47:30 -03:00
Bruno Lopes
f2bd9fcd7f build/linux: Do not bundle daemons on AppImage
We weren't launching then (and not sure if
we should at all). Also, the proper fix to
some errors encountered is 330ebe90.
2025-06-07 13:44:40 -03:00
Yuri Chornoivan
0286ff4149 Update Ukrainian translation 2025-06-07 15:19:34 +00:00
Jehan
3e46549880 app: small ordering cleanup.
No functional change, just some include cleanup, as well as reordering
with a private function made public.

Also adding a comment saying why we have somewhat unrelated code (about
color-scheme) in gui-unique.c. Maybe eventually we should generalize
this message-handling invible window code into a separate file, if it
becomes further used for more message handling.
2025-06-07 16:39:23 +02:00
Luming Zh
38f8aec0df Update Chinese (China) translation 2025-06-07 08:44:52 +00:00
Alx Sa
1f1404dc93 script-fu: Respect no-validate flag in Script-fu
GIMP 3.0 enforces stricter parameter range checks
compared to GIMP 2.10. As a result, scripts that are the
right datatype but go outside the parameter range will
fail. In GimpProcedure, we have checks if a no-validate
flag is set to bypass these constraints.
This patch adds those checks to Script-fu so it also knows
to not check ranges if no-validate is set.
2025-06-07 05:22:48 +00:00
Alx Sa
12f643329a modules: Display Total Ink Coverage on CMYK selector
Total Ink Coverage shows the total percentage of ink
that would be needed to print a particular color. It is the
simple addition of all CMYK channels.
This patch adds a Total Ink Coverage label to the
CMYK color selector, as a reference when selecting a
color for print.
2025-06-07 01:36:06 +00:00
Bruno Lopes
330ebe90b6 build/linux: Prevent loading host's GIO_EXTRA_MODULES on AppImage
We can't guarantee that the .so modules pointed by GIO_EXTRA_MODULES will
link properly to the bundled libc and other bundled deps in the AppImage.

So, by making our AppImage ignore that var we avoid errors on terminal due
to linking mismatch (e.g. on NixOS which sets that var by default).
2025-06-06 21:22:44 -03:00
Luming Zh
1bfd5ebf20 Update Chinese (China) translation 2025-06-06 23:47:34 +00:00
Bruno Lopes
c49d7ab36f gitlab-ci: Make meson-health job less pervasive on merge requests
It fails silently sometimes, which shouldn't happen but
I don't have time right now to investigate and fix.
For now, allowing it to fail will free auto merge again.
2025-06-06 19:00:26 -03:00
lloyd konneker
eb5fe2325e Tests: ScriptFu: test PDB API for gimp-image-sample-point
No changes except to tests
2025-06-06 17:43:27 -04:00
Alx Sa
9ab17bf034 python: Add import/export support for ORA extensions
The OpenRaster specification has two official extensions
for layers - storing if they are pixel locked, and if they are
selected. Krita and MyPaint already support these extensions
on import and export. This patch adds that support to GIMP
as well.
2025-06-06 20:25:04 +00:00
Yuri Chornoivan
ede910abce Update Ukrainian translation 2025-06-06 19:10:20 +00:00
Alx Sa
592a17a1b0 plug-ins: Add zlib as JIF dependency
After 6395c374, file-gif-export now requires
zlib to handle importing JIF images.
2025-06-06 17:36:09 +00:00
Alx Sa
6395c37425 plug-ins: Add import support for Jeff's Image Format
JIF is a variation of the GIF format that compresses
indexed images using zlib rather than LZW. This patch
add import support for JIF images.
2025-06-06 14:15:06 +00:00
Yuri Chornoivan
992b7c40c6 Update Ukrainian translation 2025-06-06 12:52:06 +00:00
Yuri Chornoivan
be9ad294bc Update Ukrainian translation 2025-06-06 12:47:51 +00:00
Ondřej Míchal
c55f4b104c build/linux: Sync dependencies with Flathub flatpak
Poppler - 25.05.0 -> 25.06.0
2025-06-06 08:09:08 -03:00
Philip Zander
9873ea97de App: Implement/Fix system dark/light theme auto-detection 2025-06-06 10:25:05 +00:00
Jehan
be2d71607a app: implement system color scheme detection on Windows.
This commit is based off code suggested by Isopod on !2180:

https://gitlab.gnome.org/GNOME/gimp/-/merge_requests/2180#note_2399185
2025-06-06 10:25:05 +00:00
Luming Zh
b633658ccb Update Chinese (China) translation 2025-06-06 06:57:33 +00:00
Alx Sa
bb9c43102f plug-ins: Initial APNG load support
Uses plain libpng rather than modified libapng library.
Since libpng only reads one image (and reports other frames
as "extra compressed data"), we read the PNG chunks in separately,
then restart and pass them into libpng for processing.
Since APNG and PNG share the same magic number, we add a check
in the regular PNG loading sequence to see if it contains APNG
frames, and if so, we load them afterwards.
2025-06-06 03:36:25 +00:00
Alx Sa
4e1967bf70 core: Add alpha channel for certain transforms
In 756fed0c, we removed code that automatically added an
alpha channel for transformed layers, as it relied on the user
setting interpolation to anything other than NONE.

This patch attempts to restore this behavior with a different
check. If gimp_matrix_is_simple () returns FALSE, it means that
the transformation requires some form of interpolation, and thus
requires an alpha channel. Flipping and translating do not trigger
a change in the alpha channel, but rotation, shearing, and perspective
transforms do (even if the tool's interpolation is set to NONE).
2025-06-06 02:53:55 +00:00
Luming Zh
4ba74177ea Update Chinese (China) translation 2025-06-05 00:03:57 +00:00
Jehan
08c93a5478 app: make dark scheme the default when system scheme request fails.
If the DBus portal is not available or if any failure occurs when
querying the system scheme, let's default to dark theme (since it's
GIMP's default).
2025-06-05 01:15:17 +02:00
Jehan
d0abb78db3 app: only show the "System" color variant on supported platforms. 2025-06-05 00:48:33 +02:00
Jehan
2056fb1dd3 app: fix a build warning.
Fixes:

> app/core/gimp-user-install.c:762:1: warning: no previous declaration for ‘user_update_post_process_menurc_over20’ [-Wmissing-declarations]
2025-06-05 00:45:02 +02:00
Hari Rana
5556a6708e Add support for respecting the system's color scheme
Now that the XDG Settings portal has started exposing a "color-scheme"
property in the latest versions, we can follow this property and switch
from dark to light theme (or vice versa) with the rest of the system.

This implementation was heavily based on @nielsdg's
merge request: https://gitlab.gnome.org/GNOME/gimp/-/merge_requests/612.

Related: https://gitlab.gnome.org/GNOME/gimp/-/issues/8675

Co-authored-by: Niels De Graef <nielsdegraef@gmail.com>
Co-authored-by: Ondřej Míchal <harrymichal@seznam.cz>
Co-authored-by: Jehan <jehan@girinstud.io>
2025-06-04 22:12:43 +00:00
Jehan
d45ff5b5cd app: remove GIMP_HELP_PREFS_VIEWABLES_FOLLOW_THEME help ID.
It is unused and setting it on the new toggle button doesn't seem to
work anyway as the dockable's help ID is called. Improving the help page
for this dockable, rather than adding a specific help page, seems a
better fit anyway.
2025-06-04 23:57:38 +02:00
Jehan
2f19042feb app: localize some strings now that we are out of string freeze. 2025-06-04 23:46:39 +02:00
Jehan
0f900d2946 app: draw the palette grids with the theme's background color.
Commit 80fca449a4 had a few issues:

- It was using the theme's foreground or background colors as non-entry
  color, depending on whether we draw a grid or not. It should just be
  the background's color.
- It was still defaulting color to white/black in some places, instead
  of fg/bg colors (though I just removed these defaults because the code
  just always properly set these colors later on).
- It was using the foreground colors for vertical grid lines, instead of
  background color.
- It was coloring horizontal grid lines as black, instead of background
  color.
2025-06-04 23:46:39 +02:00
Nathan Follens
7f0815a67a Update Dutch translation 2025-06-04 21:01:21 +00:00
Nathan Follens
ab9e63ebeb Update Dutch translation 2025-06-04 21:01:12 +00:00
Nathan Follens
f579324696 Update Dutch translation 2025-06-04 21:00:55 +00:00
Nathan Follens
b16d427d75 Update Dutch translation 2025-06-04 21:00:45 +00:00
Alx Sa
6192b79d89 actions: Fix missing argument length check
Resolves #14192
In procedure_commands_get_display_args (), one
section missed a check for the argument array length
before trying to access the index. This caused a crash
if there were not enough arguments sent in for a Script-fu
plug-in. This patch adds that array length check to prevent
the crash.
2025-06-04 13:52:55 +00:00
Ekaterine Papava
20fb40f7d7 Update Georgian translation 2025-06-04 02:34:24 +00:00
Luming Zh
1724e3cd9d Update Chinese (China) translation 2025-06-04 01:53:35 +00:00
Martin
a05b4a1d60 Update Slovenian translation 2025-06-03 21:15:41 +00:00
Alx Sa
e8c29f818e core: Add Lock Content to undo history
In 2.10, we did not add a Undo History item for "Lock Content"
in the History dockable. In 3.0, we add the item, but Ctrl+Z
doesn't work because we don't actually push the undo item to
the stack.
Comments in fb1a6725 indicate this was intentionally left off
in 2.10. However, it's more consistent in 3.0 to have all locks
behave the same when it comes to undo history.
2025-06-03 19:20:10 +00:00
Yuri Chornoivan
979e0bfd0f Update Ukrainian translation 2025-06-03 17:46:45 +00:00
Kolbjørn Stuestøl
d1f002464a Update Norwegian Nynorsk translation 2025-06-03 14:17:57 +00:00
Kolbjørn Stuestøl
80fe0e541a Update Norwegian Nynorsk translation 2025-06-03 14:11:31 +00:00
Kolbjørn Stuestøl
adbed2c9e9 Update Norwegian Nynorsk translation 2025-06-03 13:43:03 +00:00
Advance Software
19c57a9765 plug-ins: Add support for JPEG 2000 export 2025-06-03 09:22:14 -04:00
Bruno Lopes
d6a961c2af plug-ins: Fix file associations generated from .py plug-ins
Following 2ce3c604
2025-06-02 07:47:51 -03:00
Alx Sa
348b86e2f7 plug-ins: Check libtiff version for TIFF layers
The Photoshop and Sketchbook TIFF enums
were added in later versions of libtiff. Since we
do not enforce that version when compiling, we
add macros to verify TIFFTAG_IMAGESOURCEDATA
and TIFFTAG_ALIAS_LAYER_METADATA are defined
before trying to build with them.
2025-06-01 22:39:41 +00:00
Michael Natterer
d896d60a5c app: in gimp_drawable_merge_filters(), iterate the list of filters
with a while() loop and get list->next before removing the filter,
because removing deleted "list" under our feet.
2025-06-01 11:44:58 +02:00
Alx Sa
b98fe0c3d0 plug-ins: Export single-page PDFs without layers
Resolves #10133
We always set GIMP_EXPORT_CAN_HANDLE_LAYER in
the export options, even if the user set the "layers-as-pages"
parameter to FALSE. As a result, single-page PDFs did not
render the same way they appeared in GIMP, since
gimp_export_options_get_image () did not process them
as a single layer image.
This patch makes GIMP_EXPORT_CAN_HANDLE_LAYER be
conditionally set based on the value of "layers-as-pages".
2025-06-01 02:29:07 +00:00
Michael Natterer
6151deaff9 app: gimp_view_render_temp_buf_to_surface(): fix component extraction
The code was still assuming that GimpTempBuf is always 8 bit. Fixed
that, and optimized it to call babl_process() once per line instead of
per pixel. Fixes #13253.
2025-06-01 03:01:03 +02:00
Michael Natterer
7121109655 app: remove usless include in GimpLayerTreeView 2025-05-31 17:27:56 +02:00
Michael Natterer
f21aaf3416 app: make GimpItemList fully work on all item types 2025-05-31 17:22:55 +02:00
Michael Natterer
76e82d5572 libgimp: there was an "else" missing in the commit below 2025-05-31 17:00:33 +02:00
Alx Sa
0d08a3c532 libgimp: Create widgets for unsigned integer parameters
gimp_procedure_add_uint_argument () creates an unsigned integer
parameter. It's functionally equivalent for creating dialogue widgets,
but since we only checked for G_TYPE_PARAM_INT, these parameters
did not generate widgets in GimpProcedureDialog.
This patch adds a check for G_TYPE_PARAM_UINT in relevant sections
to resolve the issue.
2025-05-31 14:20:28 +00:00
Michael Natterer
03366ae77c app: the filters popover now seems smart enough to be shown when there
is a floating selection.
2025-05-31 16:08:23 +02:00
Michael Natterer
9e64535c22 app: gimp_drawable_update(): optimize a call to
gimp_drawable_get_bounding_box() away.
2025-05-31 16:07:07 +02:00
Michael Natterer
40ace1016d app: GimpItemTreeView: show/hide the lock and search popovers
smoothly.
2025-05-31 16:01:26 +02:00
Michael Natterer
8119591049 app: hide/destroy the filters popover properly when the view is
unmapped or the image is changed, don't run into hide/popdown
recursions, show/hide the popover smoothly.
2025-05-31 15:51:25 +02:00
Michael Natterer
fc0c089208 app: fix my own confusion about gimp_drawable_update()
vs. gimp_drawable_update_bounding_box().
2025-05-31 15:22:54 +02:00
Alx Sa
ae02db90a3 core: Don't merge floating selection as filter
Floating selections are added to the same stack as
non-destructive filters. While the GUI prevents merging
filters when there is a floating selection, 
gimp_drawable_merge_filters () did not explicitly prevent
this. This patch replaces the while loop to merge filters with
a for loop, and explicitly checks if the item in the stack is a
drawable filter (and not a temporary one).
2025-05-31 12:38:47 +00:00
Michael Natterer
2baab5aa74 app: add accessors for GimpDrawableFilter::temporary and use them
instead of using the property dirtectly.  Also make sure temporary
filters don't go to the undo stack or to the XCF.
2025-05-31 14:14:02 +02:00
Michael Natterer
ac01289824 app: GimpDrawableFilter: move setters and getters together 2025-05-31 13:21:58 +02:00
Jordi Mas
4e2e1adce6 Update Catalan translation 2025-05-31 08:58:51 +02:00
Martin
56083f3928 Update Slovenian translation 2025-05-31 06:06:29 +00:00
Martin
9210cf0be3 Update Slovenian translation 2025-05-31 06:03:08 +00:00
Ekaterine Papava
ea5cd6a5f7 Update Georgian translation 2025-05-31 00:43:59 +00:00
Luming Zh
d60d9757a9 Update Chinese (China) translation 2025-05-31 00:11:51 +00:00
Bruno Lopes
2ce3c604e2 build, plug-ins: Generate *associations.list automatically at build-time
This is way easier to maintain and creates a bigger list of
associations by following the libraries that GIMP links
(but does not work with more complex code like file-gegl).

Also helps with
https://gitlab.gnome.org/Infrastructure/gimp-macos-build/-/issues/3
2025-05-30 19:23:41 -03:00
Alx Sa
3693f90aca Issue #4379: Add support for loading multi-layer OpenEXR images 2025-05-30 15:46:23 -03:00
Yuri Chornoivan
9e072b2ea0 Update Ukrainian translation 2025-05-30 18:19:32 +00:00
Yuri Chornoivan
c560c952b3 Update Ukrainian translation 2025-05-30 18:15:57 +00:00
Michael Natterer
90db039270 app: always show the filters popover if there are any potentially
editable filters, regardless of whether they are currently editable.
Also an ugly hack to make sure the popover resizes corrently with the
number of filters.
2025-05-30 18:07:39 +02:00
Michael Natterer
27b09025be app: refactoring in filters and their UI
- move the filter popover to its own file
- centralize popover sensitivity settings
- get rid of gimp_item_refresh_filters()
- lots of minor filter fixes/changes
2025-05-30 15:54:48 +02:00
Bruno Lopes
6b4e346c24 plug-ins: Build 'file-desktop-link' only on Linux 2025-05-30 09:01:18 -03:00
Luming Zh
f72b3f0a4d Update Chinese (China) translation 2025-05-29 23:08:25 +00:00
Bruno Lopes
edb55421fb build/windows: Add observation about GIMP files on Installer script 2025-05-29 18:21:29 -03:00
Michael Natterer
18a9d267a0 app: GimpDrawableTreeView: rename functions to be consistent
and s/effects/filters/
2025-05-29 20:11:55 +02:00
Michael Natterer
9b2fc547ef app: GimpDrawableTreeView: rename "effect" to "filter" 2025-05-29 19:35:42 +02:00
Alx Sa
371620b0af plug-ins: Add support for ART as RAW loader
Since ART is a fork of RawTherapee, the
code is fairly similar to our existing loader
for that software.
2025-05-29 16:40:26 +00:00
Michael Natterer
2b82907967 app: minor cleanups in GimpDrawableTreeView 2025-05-29 17:09:49 +02:00
Michael Natterer
624a62d489 app: some random cleanups in widgets 2025-05-29 17:01:08 +02:00
Michael Natterer
3b60a1e01d app: move the entire filter code from GimpItemTreeView to
GimpDrawableTreeView, because it's filters on drawables not items.
2025-05-29 16:38:42 +02:00
Bruno Lopes
c49f5e3e2b build/windows: Fix XCF association name
Closes: #14149
2025-05-29 10:51:18 -03:00
Michael Natterer
a790dc3253 app: add gimp_drawable_raise,lower_filter()
and move code there from gimpitemtreeview.c
2025-05-29 13:18:40 +02:00
Michael Natterer
fb199fba34 app: micro cleanup in the filter undo code 2025-05-29 00:45:01 +02:00
Michael Natterer
679c7a35c5 app: move gimp_drawable_has_filter() around in its file 2025-05-28 22:29:35 +02:00
Michael Natterer
2bf2f0e34f app: sanitize callback names of GimpItemTreeView drawable filter
callbacks, and remove unused variables.
2025-05-28 22:15:41 +02:00
Estecka
a60c1097ab core,widgets: Fix filter manipulations on invisible layers
Many actions done on layers require refreshing its filters, by toggling
the layer off and on again. When done on an invisible layer, this would
turn it visible, which could not be undone.
Now, the layer remains invisible.
2025-05-28 19:42:33 +00:00
Alx Sa
3b775abc90 plug-ins: Import Legacy PSD Dropshadow
This patch adds support for loading and
applying active Legacy Dropshadow
layer styles in PSD images.
2025-05-28 17:50:35 +00:00
Bruno Lopes
65feecd32d app: Remove not-working GIMP_ICONS_LIKE_A_BOSS
'gtk-menu-images' simply does not
work on GTK3 (tested on AppImage, Flatpak
and Windows) and it is not present on GTK4.
2025-05-28 14:07:05 -03:00
Michael Natterer
5805b96095 app: move filter stack init/finalize to gimpdrawable-filters.c so we
can connect to signals and do other things right here for the entire
lifecycle of the drawable.
2025-05-28 17:54:00 +02:00
Michael Natterer
bf877a8aa3 app, pdb: move filter duplication to one place in
GimpItem::duplicate().
2025-05-28 17:28:01 +02:00
Michael Natterer
4bb4811e77 app: call gimp_drawable_filter_refresh_crop() in a
GimpItem::size_changed() implementation in GimpDrawable,
instead of having the same code multiple times.
2025-05-28 16:55:13 +02:00
Michael Natterer
81a3c729d5 app: fix gimp_channel_is_full() to not lie:
- add channel->full the same way we have channel->empty
- never actually iterate the pixels to determine "full",
  only set it on simple stuff like "select all"
- optimize some code to take a fast path when the channel
  is full

Fixes #14081.
2025-05-28 00:48:58 +02:00
Bruno Lopes
c9f77c7228 build/windows: Alternative approach to Inno reading of config*.h
Closes: #14101

Partially reverts: f69dd75a17
2025-05-27 15:34:13 -03:00
Michael Natterer
868d566c7f app: make gimp_image_new_add_creation_metadata() static 2025-05-27 20:24:41 +02:00
Jehan
2bb6b6b970 NEWS: starting 3.2 NEWS. 2025-05-27 19:28:04 +02:00
Michael Natterer
c460450b4a app: fix menu states/callbacks for "Show Layer Masks" and "Disable
Layer Masks", Fixes #14055.

- change the logic to show the toggles in "on" state ONLY when ANY
  selected layer has the property enabled.
- adjust the action callbacks accordingly, and fix them to only push
  undo groups when multiple layers are changed.
- completely remove gimp_layer_tree_view_update_menu(), which did the
  same as the action update code, only more broken, was causing
  redundant undo steps beibng pushed, and was probably obsolete for 20
  years.
2025-05-27 19:23:44 +02:00
Alx Sa
1f37f92667 plug-ins: Fixes to JPEG 2000 import
This patch fixes the following:
- The magic number for J2K codestreams was left off
when porting from GIMP 2.10, preventing GIMP from
recognizing those files automatically
- The "colorspace" parameter was added to JP2 loading
procedure as an aux argument, so that if a color space was
not defined, the pop-up dialogue will work correctly.
- Fixed a crash in sycc444_to_rgb (), similar to 127cd671,
when freeing parts of the OpenJPEG object that were still in
use.
- Minor spacing issues fixed.
2025-05-27 17:23:31 +00:00
Bruno Lopes
2c0e7fdb76 build/windows: Organize expired certificate detection code on MSIX script
This commit make things more linear.
2025-05-27 12:40:47 -03:00
Bruno Lopes
6ca8945d49 build/windows: Fix .exe installer having the same mutex as gimp*.exe process 2025-05-27 11:36:13 -03:00
Bruno Lopes
b1eba99e46 build/windows: No need to double-define GIMP_MUTEX_VERSION on bundling script
We already take it from config.h
2025-05-27 11:34:12 -03:00
Sam James
db6e72e6a2 meson: use boolean false, not string false 2025-05-27 07:45:26 -03:00
Michael Natterer
d63c4deb68 app: when creating a layer mask from the layer's alpha, but the layer
has no alpha, simply fill the mask with complete opacity instead of
leaving the user with a completely empty mask (and thus a completely
transparent layer).
2025-05-27 11:16:09 +02:00
Michael Natterer
1697e4575f app: make order of undo_group_end() and image_flush() consistent
in layers-commands.c, and some spacing cleanup.
2025-05-27 10:49:24 +02:00
Natanael Copa
4cccc52622 Issue #13657: fix build dependencies
We need the gir and plugins to be able to generate the splash image(s).
Add those as dependencies to gimp executable to ensure they are there
when needed.

Fixes: https://gitlab.gnome.org/GNOME/gimp/-/issues/13657
2025-05-27 05:47:08 -03:00
Danial Behzadi
04e3bdc790 Update Persian translation 2025-05-27 08:18:36 +00:00
Martin
60cb583a52 Update Slovenian translation 2025-05-26 09:59:30 +00:00
Martin
ef142caec8 Update Slovenian translation 2025-05-26 09:57:04 +00:00
Luming Zh
b383b86364 Update Chinese (China) translation 2025-05-26 09:06:20 +00:00
Luming Zh
7298e2b9d0 Update Chinese (China) translation 2025-05-26 08:45:09 +00:00
Ekaterine Papava
0fed482ae7 Update Georgian translation 2025-05-26 01:44:21 +00:00
Ekaterine Papava
528b9b4d69 Update Georgian translation 2025-05-26 01:39:04 +00:00
Ekaterine Papava
6e82489225 Update Georgian translation 2025-05-26 01:34:45 +00:00
Yuri Chornoivan
2f4b8782fa Update Ukrainian translation 2025-05-25 18:10:42 +00:00
Yuri Chornoivan
d5fb67f827 Update Ukrainian translation 2025-05-25 18:02:44 +00:00
Yuri Chornoivan
cd2a7b360d Update Ukrainian translation 2025-05-25 17:59:40 +00:00
Alx Sa
2aff687e18 plug-ins: Add import support for Over The Air Bitmap
This is a Nokia mobile image format,
similar in structure to WBMP.
2025-05-25 15:50:12 +00:00
Alx Sa
befacfd0d4 python: Add export support for Krita .kpl palette
Resolves #13889
Adds support for exporting palettes in
Krita's .kpl format (zipped .xml data).
Colors are currently saved as 32-bit
floating point RGB values.
Future work includes supporting other
color spaces like CMYK, other precisions,
and including color profiles for colors.
2025-05-25 15:50:12 +00:00
Alx Sa
d5cdeb96e8 plug-ins: Add import/export support for Playstation TIM images
These images are primarily used as textures
for Sony Playstation video games.
Port and update of GIMP 2 plug-in by
Andrew Kieschnick.
2025-05-25 15:50:12 +00:00
Ekaterine Papava
7d802efa27 Update Georgian translation 2025-05-25 01:52:21 +00:00
Luming Zh
0790d1340d Update Chinese (China) translation 2025-05-25 00:44:39 +00:00
Martin
0108b6b415 Update Slovenian translation 2025-05-24 19:35:07 +00:00
Emin Tufan Çetin
2da8c80997 Update Turkish translation 2025-05-24 18:35:56 +00:00
Bruno Lopes
e019f1cce3 build/windows: Fix Start Menu and alias clashes with "GIMP (Insider)" MSIX 2025-05-24 15:18:22 -03:00
Alx Sa
5918e2b4d3 widgets: Prevent crash when changing indexed color
Similar logic to 4d8073a3 - the selection signal was not
being properly disconnected when the dialogue closed after
the color entry's color was changed via the HTML field.
This patch switches to using g_signal_connect_object ()
to automatically disconnect when the object is destroyed.
2025-05-24 17:47:34 +00:00
Alx Sa
3edafcc7bc text: Add additional outline options
This creates a new "outline direction" property, that determines whether
the text outline grows outward, inward, or centered from the text.
2025-05-24 16:12:39 +00:00
Bruno Lopes
073adebd0a build/windows: Fix bezel being shown on Installer's Preparing page 2025-05-24 11:22:24 -03:00
Alx Sa
8168142c0c plug-ins: Let Jigsaw draw on transparent layers
Currently, the Jigsaw plug-in only draws on RGB
channels. If the alpha channel is 0, then the Jigsaw
pattern will not show because it does not change the
alpha channel.
This patch adds a check if the format has an alpha
channel, and conditionally sets the alpha byte to 255
when drawing to ensure the pattern is always visible.

This patch also does some formatting clean-up, and
adds a check on the final progress update when previewing
to prevent it from showing 100% as soon as the GUI appears.
2025-05-23 12:38:00 +00:00
Luming Zh
42e804f5f3 Update Chinese (China) translation 2025-05-23 11:10:37 +00:00
Yuri Chornoivan
c1d14710e3 Update Ukrainian translation 2025-05-23 11:01:06 +00:00
Martin
0f1145253d Update Slovenian translation 2025-05-23 06:59:45 +00:00
Jehan
b45cb600fe app: add a toggle button in Brushes dockable for brush previews to…
… follow theme colors or not.

This is an update to MR !1370, as a result of testing and usability
meetings with Aryeom. While we understand that some people may want the
brush dockable to not display as some huge white "stain" in the middle
of an otherwise dark GUI (or other colors, depending on the chosen theme
and color scheme), brushes are not part of the GUI. When you look at
brush previews, you don't expect these to follow theme. And for sure,
painters more often paint over a white canvas than a gray or dark canvas
(or other colors), even though this is not an "always true" either. But
it's probably a better bet than following theme (which is closer to
"always false"!).

Therefore, what this additional commit does:

* By default, the brush previews still show as black on white;
* Nevertheless there is now a button (using the Preferences' theme icon)
  in the Brushes dockable which allow to switch to theme colors
  following brush previews.
* This setting is a GimpGuiConfig property, which means it will stick
  across sessions.
2025-05-22 21:14:20 +00:00
Jehan
e8ffb8ff0e libgimpwidgets: new gimp_prop_toggle_new() property widget function. 2025-05-22 21:14:20 +00:00
Jehan
3038c751bc app, pdb: use the real theme background color for brushes with GIMP_VIEW_BG_USE_STYLE.
Previous code was using the correct background color from the theme, but
the foreground color was always either white or black (depending on GUI
config color scheme). Instead, just use the foreground color from theme.

Since core/ doesn't have access to GTK, hence the theme, we had to
update GimpViewable's get_preview() and get_pixbuf() abstract methods to
have a color argument for recoloring previews (when relevant, which for
most types of viewables is not).
2025-05-22 21:14:20 +00:00
Jehan
55658facb4 app: invalidate and redraw the icons when the color scheme changes. 2025-05-22 21:14:20 +00:00
Alx Sa
9bef3b2edd widgets, themes: Fix bug with selection...
background color. Resolves #9983.

We now check the parent widget's color
first to prevent issues with the selection
altering the background color of the
icon until the view is refreshed.
As a result, we can now define the
selected color of an icon, fixing a
regression from 2.10.
2025-05-22 21:14:20 +00:00
Alx Sa
80fca449a4 widgets: Use theme colors of palette...
..background rendering. As with the
previous commit, this patch tries to
retrieve the background color and color
properties of the widget, then use them
to draw the background and grid of the
Palette and Colormap dockables.
2025-05-22 21:14:20 +00:00
Alx Sa
59685ce621 widgets: Adapt brush previews to theme
We now check the current theme and 
draw the brush preview color and
background to match.
2025-05-22 21:14:20 +00:00
Jacob Boerema
7add94f868 libgimpwidgets: gtk-fallback-icon-theme is deprecated...
since GTK 3.10 and according to the GTK3 documentation the setting
is ignored.

Remove the reference to it and thus setting a fallback. According to
the GTK docs `hicolor` is the fallback icon theme.
Since `gimp_icons_notify_system_icon_theme` was only used to add
the fallback, remove the function and setting it with
`g_signal_connect`.
2025-05-22 16:18:44 -04:00
Alx Sa
3879520cc2 tools, operation: Add support for loading PS Levels presets
Photoshop stores their Levels filter presets in an
.alv file. This patch adds support for loading these
and converting them to GIMP's Level format.

The .alv file is binary, and consists of a 2 byte version
followed by 29 groups of 2 byte values for input,
output, and gamma. We only read the first four for
now, since GIMP only supports composite and then
R, G, and B individual channels.
2025-05-22 18:52:30 +00:00
Alx Sa
f3afd91a95 tools, operation: Add support for loading PS Curve presets
Photoshop stores their Curve filter presets in an
.acv file. This patch adds support for loading these
and converting them to GIMP's Curves format.

The .acv file is binary, and consists of a 2 byte version
and 2 byte curve count. Then, you read in 2 bytes for
the number of curve points, followed by 2 bytes for
the Y value and 2 bytes for the X value. You repeat that
for the curve count defined in the header. PS Curves range from 2 to 19 points total.
2025-05-22 18:52:30 +00:00
Jehan
f17c6262f2 Move on to GIMP 3.1.1.
This opens the merge window for upcoming GIMP 3.2.0.
2025-05-22 19:28:07 +02:00
Alx Sa
abfd6cd6dc themes: Define menubar menuitem padding
Since we did not define the padding between menu items
in the menubar, some system themes caused them to
scrunch together. This patch sets the padding to match the
"default" GTK CSS to ensure there's distance between each
item in the menubar.
2025-05-22 13:54:24 +00:00
Alx Sa
06a0bafe79 plug-ins, operations: Fix warnings on Windows
This patch reduces three sets of warnings
when compiling on Windows:

* In gimp-layer-modes.c, we move the
g_return_val_if_reached () in
gimp_layer_mode_get_format () to the
default case in the last switch statement
to prevent a warning about an unhandled
switch case

* In spline.c, we initialize V[] to prevent
a warning about uninitialized values

* In flame.c, we unconditionally call
g_bytes_unref () to prevent a warning
about dangling pointers.
2025-05-22 02:10:08 +00:00
Emin Tufan Çetin
d74943b69e Update Turkish translation 2025-05-21 20:48:19 +00:00
Jehan
181b18f843 app: make transient factory dialogs follow the active display.
Right now, when you were setting your hints as KEEP_ABOVE, the dock
window would only keep above the image window from which you called it.
If you create a new image window, it could hide your toolbox and dock
windows.

Now we will reparent the dock windows when switching active display.

Note that this also applies to other types of dialogs we have, such as
the New Image dialog or the Search Actions, etc. But looking at all
these factory dialogs we have, it doesn't look like there is a single
case where the parenting pertains to a specific image. So it makes sense
that we always reparent when focusing a different image window.
2025-05-20 20:24:39 +00:00
Jehan
756700a02a Issue #13436: dock windows follow main window with all but NORMAL hint.
Per testing by Gabriele and discussions on IRC, it doesn't make sense
that UTILITY windows also keep all dockables above. Otherwise what's the
difference with KEEP_ABOVE?

Also it turns out that on macOS, setting a parent makes the transient
window follow the parent window (so it's close to the modal window
concept of GNOME). So that makes it even more important that our utility
windows don't have a parent.
2025-05-20 20:24:39 +00:00
Jehan
b8a39a4911 app: make sure KEEP_ABOVE windows are also set with UTILITY hint. 2025-05-20 20:24:39 +00:00
Alx Sa
3f9b05fb61 widgets: Only change text color when user confirms
Previously, we set text color to change when the "color-changed"
signal was sent out from GimpColorPanel. When all of the text is
the same color, this works fine. However, if we select text with
different colors on the canvas editor, the color defaults to black
since we can only hold a single color. If the user cancels, the
"color-changed" signal is still sent out, so we change all colors
to black.

This patch changes the code to use the "response" signal instead.
Then, we check if the user chose "OK" before calling the color
change function.
2025-05-20 16:11:26 +00:00
Alx Sa
bc887fbbb2 widgets: Prevent CRITICAL when toolbox has no child areas
To balance the child areas in the toolbox horizontally,
we dynamically set the maximum number of children in
the GtkFlowBox depending on the number of visible ones.
It is possible to hide all of them, giving us a max count of 0.
However, gtk_flow_box_set_max_children_per_line () requires
the max count to be at least 1 - this causes a CRITICAL.
This patch adds a check to make sure the count is at least 1
before calling that function.
2025-05-20 15:39:10 +00:00
Bruno Lopes
96d09108d5 build/windows: Distribute .pdb symbols on .msix too (not only on the .appxsym)
Despite what it looks like, the .pdb on .appxsym are
not stored on https://msdl.microsoft.com/download/symbols
I confirmed that on WinDBG and Visual Studio Debugger.
2025-05-20 07:39:06 -03:00
Alx Sa
b065425ee6 plug-ins: Don't draw PDF mask if turned off
In GIMP, if a layer mask is marked as disabled, it
does not show on the screen. However, we always
rendered the mask on PDF export. Since other image
formats like PNG don't render the mask, and since the
user likely does not expect an invisible mask to be drawn
on export, we add a check for gimp_layer_get_apply_mask ()
to be TRUE before rendering the mask image on PDF export.
2025-05-20 02:23:35 +00:00
Alx Sa
1685c86af5 widgets: Don't show palette name with no palette
Resolves #14047
The Color Dialog that appears when you select a
text outline color does not load a palette from context.
Since we then try to get the name from a NULL palette,
this causes a crash.
This patch resolves the issue by adding a check for the
palette's existence before trying to get its name.
2025-05-19 19:34:47 +00:00
Bruno Lopes
b25e489f6b build/windows: Only MSYS_ROOT env is needed for fix_msg.py
Fix regression introduced by c346731e, avoiding CYGWIN bins on PATH.
2025-05-19 14:07:34 -03:00
Jacob Boerema
6268eb5ed4 tests: Update location of eps loading tests from Pillow 2025-05-19 12:53:38 -04:00
Ekaterine Papava
a0b08da0b4 Update Georgian translation 2025-05-18 23:18:45 +00:00
Jehan
fc2e395d72 meson: Post-release version bump to 3.0.5. 2025-05-18 20:45:12 +02:00
Bruno Lopes
abcc0b1f07 build/windows: Fix dangling console being kept opened by CMD
By calling 'powershell' to run the gimp command, we can
keep only GIMP console opened.
2025-05-18 14:41:47 -03:00
Christoph Reiter
b78cd8d59d meson: fix install scripts not taking DESTDIR into account
Regression from 455dc1faa6

The new install scripts installed the files into MESON_INSTALL_PREFIX
instead of MESON_INSTALL_DESTDIR_PREFIX.
2025-05-18 10:36:56 -03:00
Bruno Lopes
6809c2ade7 build/windows: Test fix for failing .appxsym making
The previous code worked locally but,
for some obscure reason, not on CI.
2025-05-18 08:37:35 -03:00
Yuri Chornoivan
b341fe6102 Update Ukrainian translation 2025-05-18 09:34:35 +00:00
Martin
e5b305c66a Update Slovenian translation 2025-05-18 08:52:27 +00:00
Luming Zh
9e5c582fb4 Update Chinese (China) translation 2025-05-18 01:49:10 +00:00
Jehan
c1901c5be6 Release GIMP 3.0.4. 2025-05-18 00:51:03 +02:00
Jehan
81c0c7a98b desktop: fix release notes.
I realized that without a listing of changes, the "Release Notes" tab is
missing from the Welcome dialog. I can change this in the code, but
having just a single small sentence filling a big tab is not really nice
either. So instead, let's add some more details even if these are not as
major changes as on a minor point release.

After all, these are still nice changes anyway.

Several of these even take good advantage of the demo feature in our
AppStream parsing.
2025-05-18 00:51:03 +02:00
Jehan
f5d02dfb03 NEWS: update. 2025-05-17 23:38:37 +02:00
Jehan
148746c6a6 Issue #13414: convert "edit-paste-as-new-layer*" to "edit-paste-merged*".
Converting to "edit-paste*" was counter-productive because you could end
up overriding the default (and very well known) ctrl-v just because one
you touched this "edit-as-new-layer" action at some point in the past
and didn't even remember it.

Also since "edit-paste" existed in 2.10, you could even have shortcut
conflicts by having 2 shortcuts merged.

Instead "edit-paste-merged*" actions seem a bit better, are kinda
similar (though not exactly) and since they didn't exist in 2.10, you
are at least not creating conflicts.
2025-05-17 23:26:18 +02:00
Jehan
ddb6dbcc0d app: fix build warning.
Fixes:

> app/signals.c:56:12: warning: unused variable ‘codeview_path’ [-Wunused-variable]
2025-05-17 23:10:10 +02:00
Jehan
568afe809d app: do not store the filter tool's filter object.
Just swap the values in the stored GeglNode each time you undo or redo.
When undoing, the GeglNode contains the values from before this undo
step. When redoing, it stores the values to after the step.

Also fix a few leaks (GValue-s and list of properties).
2025-05-17 19:55:08 +00:00
Alx Sa
7a8a147ce3 core, tools: Editing effects stored in undo history
A new GIMP_UNDO_FILTER_MODIFIED
enum is now used to store filter properties
when an edited NDE filter is committed.
A new undo entry will be added to the
history each time the filter is edited and
committed.
2025-05-17 19:55:08 +00:00
aruius
a4fba54c1b color_frame: Fix #13887 Pixel display not updating on Image encoding change
A GimpColorFrame's GeglColor's Babl format's precision is set to the image's precision
when picked. On an Image encoding change to a different precision the colors are
perceptually identical, but for Sample Points set to 'Pixel' we need to run
gimp_color_frame_update after updating the frame's color to the higher precision one.
2025-05-17 19:03:19 +00:00
Gabriele Barbero
ebd5e1966e actions: hide windows-display-* actions from the Shortcuts dialog
windows‑display* actions are used to switch open displays and are not
meant to be remapped. They are implemented so they can be reassigned
each time a display is opened, closed, or moved, in order to keep them
aligned with the order of displays. This commit hides them from the
Shortcuts dialog to prevent remapping and avoidinconsistent behavior.
To avoid hiding these actions completely and making them harder to discover,
this commit removes them only from the shortcuts dialog while still showing
them in the action search.
(see #11685)
2025-05-17 20:22:31 +02:00
Integral
95e32ebb34 app: set a specific desktop filename to fix wayland window icon
Set a specific desktop filename to fix window icon under Wayland.

Closes: #13183
2025-05-17 13:24:20 +00:00
Jehan
672703eb60 devel-docs: Windows Aarch64 is not considered experimental anymore. 2025-05-17 15:00:49 +02:00
Jehan
286b80ac36 desktop: set GIMP 3.0.4 release date. 2025-05-17 11:24:00 +02:00
Jehan
caa03fd2e4 NEWS: update. 2025-05-17 11:15:15 +02:00
Alx Sa
b31e08012f widgets: Show palette name in Palette Color Selector 2025-05-16 22:44:19 -03:00
Bruno Lopes
c346731e1b build/windows: Fixes to make the installer script work locally again 2025-05-16 21:52:37 -03:00
Jehan
a1621427d6 build: clone the InnoSetup repository once instead of downloading individual files.
It turns out that commit bd6745ab40 is not a good solution either,
because now it is the "Making sure you're not a bot!" page from Anubis
which is blocking us.
I am hoping that a git clone should encounter neither the HTTP 429 error
(though we clone through HTTP, but maybe/hopefully the rate limitation
is set up only for actual web page requests) nor the bot protection.
2025-05-17 01:05:21 +02:00
Jehan
4b9e96f703 build: add the ability to add patches when using tagged babl/GEGL releases. 2025-05-16 16:56:35 +00:00
Bruno Lopes
f8d87fc293 meson: Do not generate CodeView symbols with GCC
Since GCC 15.1 CodeView generation is broken
2025-05-16 16:56:35 +00:00
Jehan
27f6d25677 libgimp: fix incompatible type for exported function address in gimp-win-x86 job.
This fixes:

> ../libgimp/gimp.c:280:27: error: assignment to 't_SetProcessDEPPolicy' {aka 'int (__attribute__((stdcall)) *)(long unsigned int)'} from incompatible pointer type 'FARPROC' {aka 'int (__attribute__((stdcall)) *)(void)'} [-Wincompatible-pointer-types]
>   280 |     p_SetProcessDEPPolicy = GetProcAddress (GetModuleHandleW (L"kernel32.dll"),
2025-05-16 16:56:35 +00:00
Jehan
a826e35a3e build: add option to select a dependency branch.
We'll make use of this now, and as a general rule, it may be useful when
we need to easily point to feature branches for testing.
2025-05-16 16:56:35 +00:00
Jehan
bd6745ab40 Issue #13957: Unnofficial Inno langs can't be downloaded (due to…
… GitHub rate limiting).

Let's just work with our own remote which will update manually (at least
before a release).
2025-05-16 16:55:01 +00:00
Jehan
be4b8a3ae3 gitlab-ci: use include:project to avoid making HTTP instance on same Gitlab.
This should fix this pipeline error:

> Remote file `https://gitlab.gnome.org/GNOME/citemplates/-/raw/master/flatpak/flatpak_ci_initiative.yml` could not be fetched because of HTTP code `429` error!

See: https://docs.gitlab.com/ci/yaml/#includeproject
2025-05-16 07:17:56 -03:00
Bruno Lopes
840519cb91 gitlab-ci: Go back to flatpak_ci_initiative.yml from GitLab 2025-05-15 21:41:49 -03:00
Bruno Lopes
1aef6f2c37 gitlab-ci: Add CYGWIN perl for 32-bit jobs only
There is no mingw32 perl.
2025-05-15 21:39:26 -03:00
Alx Sa
4eb462a7a4 display: Fix copy/paste typo for UNSCALEY
In 9fe8e849, we accidentally used UNSCALEX
rather than UNSCALEY for offset_y. This patch
corrects that typo.
2025-05-15 13:06:36 +00:00
Alx Sa
6475f0a6dc widgets: Change multi-window title bar based on theme
Applies ad8b47bf to title bars of GimpDockWindows so that
they adapt to the Windows system theme colors.
2025-05-14 23:48:51 -04:00
Jehan
51d69fa44b plug-ins: do not warn for invalid font names at startup.
While all other resources are supposed to be already loaded, this is not
the case of fonts which are loaded in a thread, and whose loading may
end after plug-ins are initialized. So ignore unknown font name as an
exception (because we can't know if it is really unknown or just not
loaded yet).

This fixes such WARNINGs:

> (script-fu:33006): scriptfu-WARNING **: 14:35:28.259: script_fu_add_resource_arg declared resource name is invalid Serif
2025-05-15 02:16:10 +02:00
Jehan
02fd84394c app: fix build warnings.
This fixes 2 such warnings:

> app/text/gimpfontfactory.c: In function ‘gimp_font_factory_load_names’:
> /usr/include/glib-2.0/glib/gstring.h:74:5: warning: ignoring return value of ‘g_string_free_and_steal’ declared with attribute ‘warn_unused_result’ [-Wunused-result]

The (void) ! trick was also possible but this is so ugly so I went for
actual usage of the return value as we should.

Also clean up some trailing whitespaces.
2025-05-15 01:02:53 +02:00
Idriss Fekir
8328dfb25b GimpFontFactory: Move font loading to another thread
This is to make sure than regardless of how many fonts there are, font loading
won't delay startup.

FontConfig if compiled against libxml2 might fail to parse huge xml configs.
So instead of passing it a huge xml, pass the xml every MAX_NUM_FONTS_PER_CONFIG (currently 1000) fonts.

Also made GimpFontFactory custom config strings private because there is no reason for them to be public.
2025-05-14 22:42:22 +00:00
Idriss Fekir
f63e8afe60 GimpFontFactory:Speed up font loading
Profiling showed that a significant amount of time was spent created the hb_blob, and calling FcParseAndLoadFromMemory.

To allow only fonts that pango/harfbuzz recognize, an hb_blob was created from
every font to test if harfbuzz recognizes it, which is obviously a lot of overhead.
FontConfig allows to check if the Font is SNFT and wether it's a WOFF[2] font.
2025-05-14 22:42:22 +00:00
Jehan
2702a47c9e NEWS: update. 2025-05-14 22:53:51 +02:00
1787 changed files with 136782 additions and 113226 deletions

View File

@@ -3,8 +3,9 @@ spec:
distribution_pipeline:
description: 'Pipelines that creates installable GIMP'
options:
- GIMP_CI_APPIMAGE #trigger the appimage making.
- GIMP_CI_APPIMAGE #trigger the appimage making (base & fast).
- GIMP_CI_FLATPAK #trigger the flatpak build and publishing (base but slow)
- GIMP_CI_SNAP #trigger the snap build (base but slow)
- GIMP_CI_WIN_INSTALLER #trigger all native MSYS2 builds then creates Inno Windows installer (base but slow)
- GIMP_CI_MS_STORE #trigger arm64 and x64 native MSYS2 builds then creates a .msixbundle (base but slow)
- none
@@ -93,7 +94,7 @@ workflow:
stages:
- dependencies
- gimp
- build
- analysis
- distribution
@@ -121,7 +122,7 @@ stages:
timeout: 20m
.debian_environ: &ENVIRON
- echo -e "\e[0Ksection_start:`date +%s`:environ[collapsed=true]\r\e[0KPreparing build environment"
- printf "\e[0Ksection_start:`date +%s`:environ[collapsed=true]\r\e[0KPreparing build environment\n"
- gcc -print-multi-os-directory 2>/dev/null | grep ./ && export LIB_DIR=$(gcc -print-multi-os-directory | sed 's/\.\.\///g') || export LIB_DIR="lib"
- gcc -print-multiarch 2>/dev/null | grep . && export LIB_SUBDIR=$(echo $(gcc -print-multiarch)'/')
## Build-time vars
@@ -131,7 +132,7 @@ stages:
- export PATH="${GIMP_PREFIX}/bin:$PATH"
- export LD_LIBRARY_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
- export GI_TYPELIB_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}girepository-1.0${GI_TYPELIB_PATH:+:$GI_TYPELIB_PATH}"
- echo -e "\e[0Ksection_end:`date +%s`:environ\r\e[0K"
- printf "\e[0Ksection_end:`date +%s`:environ\r\e[0K\n"
deps-debian:
extends: .debian
@@ -149,16 +150,18 @@ deps-debian:
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
# Install deps
- echo "FROM debian:${DEB_VERSION}" > Dockerfile
- echo "RUN echo -e \"\e[0Ksection_start:0000000001:deps_install[collapsed=true]\r\e[0KInstalling dependencies provided by Debian $DEB_VERSION\"" >> Dockerfile
- echo "RUN printf \"\e[0Ksection_start:0000000001:deps_install[collapsed=true]\r\e[0KInstalling dependencies provided by Debian $DEB_VERSION\n\"" >> Dockerfile
- echo "RUN apt-get update -qq" >> Dockerfile
## 'ca-certificates' is NOT a gimp dep, it is installed only to our Docker image work
- echo "RUN apt-get install -qq -y --no-install-recommends ca-certificates" >> Dockerfile
## Build-time only dependencies
- echo "RUN apt-get install -qq -y --no-install-recommends \\" >> Dockerfile
- echo "appstream
bison
ccache
clang
desktop-file-utils
flex
gi-docgen
git
gobject-introspection
@@ -166,9 +169,7 @@ deps-debian:
lld
meson
valac
xauth
xsltproc
xvfb" >> Dockerfile
xsltproc" >> Dockerfile
## Runtime dependencies
- echo "RUN apt-get install -qq -y --no-install-recommends \\" >> Dockerfile
- echo "at-spi2-core
@@ -203,9 +204,7 @@ deps-debian:
libopenjp2-7-dev
libpoppler-glib-dev
libqoi-dev
libraw-dev
librsvg2-dev
libspiro-dev
libsuitesparse-dev
libtiff-dev
$UMFPACK
@@ -219,10 +218,10 @@ deps-debian:
python3
python3-gi
python3-gi-cairo" >> Dockerfile
- echo "RUN echo -e \"\e[0Ksection_end:0000000002:deps_install\r\e[0K\"" >> Dockerfile
- echo "RUN printf \"\e[0Ksection_end:0000000002:deps_install\r\e[0K\n\"" >> Dockerfile
# Prepare environ
- echo "FROM $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER}" > Dockerfile2;
- echo "RUN echo -e \"\e[0Ksection_start:`date +%s`:environ[collapsed=true]\r\e[0KPreparing build environment\"" >> Dockerfile2;
- echo "RUN printf \"\e[0Ksection_start:`date +%s`:environ[collapsed=true]\r\e[0KPreparing build environment\n\"" >> Dockerfile2;
- export LIB_DIR="lib";
- export LIB_SUBDIR=$([ "$(uname -m)" = 'aarch64' ] && echo "aarch64-linux-gnu/" || echo "x86_64-linux-gnu/");
- echo "ENV PKG_CONFIG_PATH=\"${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}\"" >> Dockerfile2;
@@ -232,22 +231,22 @@ deps-debian:
- echo "ENV CC_LD=\"$CC_LD\"" >> Dockerfile2;
- echo "ENV CXX_LD=\"$CXX_LD\"" >> Dockerfile2;
- echo "ENV CLICOLOR_FORCE=\"1\"" >> Dockerfile2;
- echo "RUN echo -e \"\e[0Ksection_end:`date +%s`:environ\r\e[0K\"" >> Dockerfile2;
- echo "RUN printf \"\e[0Ksection_end:`date +%s`:environ\r\e[0K\n\"" >> Dockerfile2;
# Build some dependencies
## Build babl
- echo "RUN echo -e \"\e[0Ksection_start:`date +%s`:babl_build[collapsed=true]\r\e[0KBuilding babl\"" >> Dockerfile2;
- echo "RUN printf \"\e[0Ksection_start:`date +%s`:babl_build[collapsed=true]\r\e[0KBuilding babl\n\"" >> Dockerfile2;
- echo "RUN git clone --branch \"\$([ \"$CI_COMMIT_TAG\" ] && echo \"\$(git ls-remote --tags --exit-code --refs https://gitlab.gnome.org/GNOME/babl.git | grep -oi \"BABL_[0-9]*_[0-9]*_[0-9]*\" | sort --version-sort | tail -1)\" || echo \"master\")\" --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/babl.git" $CI_PROJECT_DIR/babl >> Dockerfile2;
- echo "RUN meson setup $CI_PROJECT_DIR/babl/_build-${RUNNER} $CI_PROJECT_DIR/babl -Dprefix=\"${GIMP_PREFIX}\" $PKGCONF_RELOCATABLE_OPTION" >> Dockerfile2;
- echo "RUN ninja -C $CI_PROJECT_DIR/babl/_build-${RUNNER}" >> Dockerfile2;
- echo "RUN ninja -C $CI_PROJECT_DIR/babl/_build-${RUNNER} install" >> Dockerfile2;
- echo "RUN echo -e \"\e[0Ksection_end:`date +%s`:babl_build\r\e[0K\"" >> Dockerfile2;
- echo "RUN printf \"\e[0Ksection_end:`date +%s`:babl_build\r\e[0K\n\"" >> Dockerfile2;
## Build GEGL
- echo "RUN echo -e \"\e[0Ksection_start:`date +%s`:gegl_build[collapsed=true]\r\e[0KBuilding gegl\"" >> Dockerfile2;
- echo "RUN printf \"\e[0Ksection_start:`date +%s`:gegl_build[collapsed=true]\r\e[0KBuilding gegl\n\"" >> Dockerfile2;
- echo "RUN git clone --branch \"\$([ \"$CI_COMMIT_TAG\" ] && echo \"\$(git ls-remote --tags --exit-code --refs https://gitlab.gnome.org/GNOME/gegl.git | grep -oi \"GEGL_[0-9]*_[0-9]*_[0-9]*\" | sort --version-sort | tail -1)\" || echo \"master\")\" --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/gegl.git" $CI_PROJECT_DIR/gegl >> Dockerfile2;
- echo "RUN meson setup $CI_PROJECT_DIR/gegl/_build-${RUNNER} $CI_PROJECT_DIR/gegl -Dprefix=\"${GIMP_PREFIX}\" $PKGCONF_RELOCATABLE_OPTION $WORKSHOP_OPTION" >> Dockerfile2;
- echo "RUN ninja -C $CI_PROJECT_DIR/gegl/_build-${RUNNER}" >> Dockerfile2;
- echo "RUN ninja -C $CI_PROJECT_DIR/gegl/_build-${RUNNER} install" >> Dockerfile2;
- echo "RUN echo -e \"\e[0Ksection_end:`date +%s`:gegl_build\r\e[0K\"" >> Dockerfile2;
- echo "RUN printf \"\e[0Ksection_end:`date +%s`:gegl_build\r\e[0K\n\"" >> Dockerfile2;
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER} --cache=true --cache-ttl=120h --image-fs-extract-retry 1 --verbosity=warn
- if [ -f 'Dockerfile2' ]; then /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile2 --destination build-debian-${DEB_VERSION}-${RUNNER}-temp --cache=false --no-push --verbosity=warn; fi
artifacts:
@@ -262,13 +261,13 @@ deps-debian:
gimp-debian:
extends: .debian
needs: ["deps-debian"]
stage: gimp
stage: build
variables:
GIT_SUBMODULE_STRATEGY: recursive
script:
- *ENVIRON
# Build GIMP
- echo -e "\e[0Ksection_start:`date +%s`:gimp_build[collapsed=true]\r\e[0KBuilding GIMP"
- printf "\e[0Ksection_start:`date +%s`:gimp_build[collapsed=true]\r\e[0KBuilding GIMP\n"
- meson setup _build-${RUNNER} -Dprefix="${GIMP_PREFIX}"
-Dpkgconfig.relocatable=true
-Drelocatable-bundle=yes
@@ -276,13 +275,13 @@ gimp-debian:
-Dbuild-id=org.gimp.GIMP_official.AppImage.$(uname -m)
- cd _build-${RUNNER}
- ninja
- echo -e "\e[0Ksection_end:`date +%s`:gimp_build\r\e[0K"
- printf "\e[0Ksection_end:`date +%s`:gimp_build\r\e[0K\n"
# Create bundle
- echo -e "\e[0Ksection_start:`date +%s`:gimp_bundle[collapsed=true]\r\e[0KCreating bundle"
- ninja install &> ninja_install.log || cat ninja_install.log
- printf "\e[0Ksection_start:`date +%s`:gimp_bundle[collapsed=true]\r\e[0KCreating bundle\n"
- ninja install > ninja_install.log 2>&1 || { cat ninja_install.log; exit 1; }
- cd ..
- bash build/linux/appimage/3_dist-gimp-goappimage.sh --bundle-only &> goappimage.log || cat goappimage.log
- echo -e "\e[0Ksection_end:`date +%s`:gimp_bundle\r\e[0K"
- sh build/linux/appimage/3_dist-gimp-goappimage.sh --bundle-only > goappimage.log 2>&1 || { cat goappimage.log; exit 1; }
- printf "\e[0Ksection_end:`date +%s`:gimp_bundle\r\e[0K\n"
artifacts:
paths:
- AppDir*/
@@ -337,32 +336,32 @@ gimp-debian-x64:
script:
- *ENVIRON
# Check building
- echo -e "\e[0Ksection_start:`date +%s`:gimp_build[collapsed=true]\r\e[0KBuilding GIMP"
- printf "\e[0Ksection_start:`date +%s`:gimp_build[collapsed=true]\r\e[0KBuilding GIMP\n"
- meson setup _build-${RUNNER} -Dprefix="${GIMP_PREFIX}"
-Dfile-plug-ins-test=true
$MESON_OPTIONS
- cd _build-${RUNNER}
- ninja
- echo -e "\e[0Ksection_end:`date +%s`:gimp_build\r\e[0K"
- printf "\e[0Ksection_end:`date +%s`:gimp_build\r\e[0K\n"
# Check execution
- echo -e "\e[0Ksection_start:`date +%s`:gimp_test[collapsed=true]\r\e[0KTesting GIMP execution"
- printf "\e[0Ksection_start:`date +%s`:gimp_test[collapsed=true]\r\e[0KTesting GIMP execution\n"
- ninja test
- echo -e "\e[0Ksection_end:`date +%s`:gimp_test\r\e[0K"
- printf "\e[0Ksection_end:`date +%s`:gimp_test\r\e[0K\n"
# Check source
- echo -e "\e[0Ksection_start:`date +%s`:gimp_tar[collapsed=true]\r\e[0KChecking GIMP source"
- printf "\e[0Ksection_start:`date +%s`:gimp_tar[collapsed=true]\r\e[0KChecking GIMP source\n"
- if [ $(git diff |wc -l) -ne 0 ]; then
echo "ERROR. A generated file was updated without the source:";
printf "ERROR. A generated file was updated without the source:\n";
git diff;
exit 1;
fi
- if [ "$VARIANT" != "-gcc" ] && [ "$VARIANT" != "-raster" ] && [ "$CI_PIPELINE_SOURCE" != "merge_request_event" ]; then
ninja dist &> ninja_dist.txt || cat ninja_dist.txt;
ninja dist > ninja_dist.log 2>&1 || { cat ninja_dist.log; exit 1; };
fi
- echo -e "\e[0Ksection_end:`date +%s`:gimp_tar\r\e[0K"
- printf "\e[0Ksection_end:`date +%s`:gimp_tar\r\e[0K\n"
# Check install
- echo -e "\e[0Ksection_start:`date +%s`:gimp_install[collapsed=true]\r\e[0KChecking GIMP installation"
- ninja install &> ninja_install.txt || cat ninja_install.txt;
- echo -e "\e[0Ksection_end:`date +%s`:gimp_install\r\e[0K"
- printf "\e[0Ksection_start:`date +%s`:gimp_install[collapsed=true]\r\e[0KChecking GIMP installation\n"
- ninja install > ninja_install.log 2>&1 || { cat ninja_install.log; exit 1; };
- printf "\e[0Ksection_end:`date +%s`:gimp_install\r\e[0K\n"
artifacts:
paths:
- _install-${RUNNER}/
@@ -397,7 +396,7 @@ deps-flatpak-x64:
#paths:
#- .flatpak-builder/
script:
- bash build/linux/flatpak/1_build-deps-flatpak.sh
- sh build/linux/flatpak/1_build-deps-flatpakbuilder.sh
artifacts:
paths:
- .flatpak-builder.tar
@@ -409,11 +408,11 @@ deps-flatpak-x64:
gimp-flatpak-x64:
extends: .flatpak-x64
needs: ["deps-flatpak-x64"]
stage: gimp
stage: build
variables:
GIT_SUBMODULE_STRATEGY: recursive
script:
- bash build/linux/flatpak/2_build-gimp-flatpak.sh
- sh build/linux/flatpak/2_build-gimp-flatpakbuilder.sh
artifacts:
paths:
- repo.tar
@@ -421,6 +420,53 @@ gimp-flatpak-x64:
expire_in: 2 days
## Snap CI (Ubuntu) ##
.snap:
extends: .default
rules:
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Snap.*/'
interruptible: true
- if: '$GIMP_CI_SNAP != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_SNAP.*/'
parallel:
matrix:
- DPKG_ARCH: [arm64, amd64]
image:
name: $CI_REGISTRY_IMAGE:build-snap-${SNAPCRAFT_CORE_VERSION}
entrypoint: [""]
variables:
SNAPCRAFT_CORE_VERSION: "8_core24"
#@brunvonlope private credentials. We are using these for now
#until we don't get acess to 'gimp' entry on Snap Store: https://github.com/snapcrafters/gimp/issues/447
LAUNCHPAD_CREDENTIALS_ACCESS_TOKEN: pPs367Km5glpfXXK9BQl
LAUNCHPAD_CREDENTIALS_ACCESS_SECRET: PQ0r1JGdHQRWQCS255jNZdglCcK4KDmsGRSZxl4CZwWvMF00GLRFbz1185L08cjh5zWqhQddsvmgLg7l
timeout: 120m
deps-snap:
extends: .snap
stage: dependencies
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- sh build/linux/snap/1_build-deps-snapcraft.sh
gimp-snap:
extends: .snap
needs: ["deps-snap"]
stage: build
variables:
#Snapcraft/launchpad does not allow shallow clones
GIT_DEPTH: 0
GIT_SUBMODULE_STRATEGY: recursive
script:
- sh build/linux/snap/2_build-gimp-snapcraft.sh
artifacts:
paths:
- temp*.snap
- snapcraft*.txt
expire_in: 2 days
## WINDOWS pipelines (native MSYS2) ##
.win:
extends: .default
@@ -496,7 +542,7 @@ deps-win:
gimp-win:
extends: .win
needs: ["deps-win"]
stage: gimp
stage: build
variables:
GIT_SUBMODULE_STRATEGY: recursive
script:
@@ -508,6 +554,7 @@ gimp-win:
- _build-$MSYSTEM_PREFIX/done-dll.list
# Needed by dist-installer-weekly and dist-store-weekly
- _build-$MSYSTEM_PREFIX/config.h
- _build-$MSYSTEM_PREFIX/plug-ins/file_associations.list
- _build-$MSYSTEM_PREFIX/build/windows/installer/
- _build-$MSYSTEM_PREFIX/build/windows/store/
expire_in: 2 days
@@ -542,6 +589,7 @@ gimp-win-x86:
variables:
GIT_SUBMODULE_STRATEGY: recursive
script:
- $env:PATH = "C:/msys64/usr/bin;" + $env:PATH
- !reference [gimp-win, script]
artifacts: !reference [gimp-win, artifacts]
@@ -580,7 +628,7 @@ file-plug-in-tests:
- cd ..
- cat ${PLUG_IN_DIR}test-file-plug-ins/batch-import-tests.py | gimp-console-${APP_VER} -idf --batch-interpreter python-fu-eval -b - --quit
- if [ $(grep -c "${REGRESSION_STRING}" "${GIMP_TESTS_LOG_FILE}") -ne 1 ]; then
echo "There are file import regressions. Check the log at ${GIMP_TESTS_LOG_FILE}!";
printf "There are file import regressions. Check the log at ${GIMP_TESTS_LOG_FILE}!\n";
exit 1;
fi
# FIXME No export testing for now until it's more developed. A limited test
@@ -591,6 +639,7 @@ file-plug-in-tests:
reports:
junit: "_log/import-tests.xml"
expire_in: 2 days
timeout: 30m
meson-health:
extends: .default
@@ -599,9 +648,10 @@ meson-health:
- <<: *CI_COMMIT
stage: analysis
script:
- apt-get update
- apt-get install -y git
- bash .gitlab/run_meson_health_diff.sh
- apt-get update -qq
- apt-get install -qq -y --no-install-recommends git shellcheck devscripts
- sh .gitlab/run_meson_health_diff.sh
allow_failure: true
clang-format:
extends: .default
@@ -612,7 +662,7 @@ clang-format:
- apt-get update
- apt-get install -y clang-format
git
- .gitlab/run_style_check_diff.sh
- sh .gitlab/run_style_check_diff.sh
allow_failure: true
artifacts:
when: on_failure
@@ -727,14 +777,17 @@ dist-appimage-weekly:
needs: ["gimp-debian"]
stage: distribution
script:
- bash build/linux/appimage/3_dist-gimp-goappimage.sh
- sh build/linux/appimage/3_dist-gimp-goappimage.sh
artifacts:
expose_as: 'Linux appimage'
paths:
- build/linux/appimage/_Output/
expire_in: 8 days
include: 'https://raw.githubusercontent.com/GNOME/citemplates/master/flatpak/flatpak_ci_initiative.yml'
include:
project: 'GNOME/citemplates'
file: 'flatpak/flatpak_ci_initiative.yml'
dist-flatpak-weekly:
extends:
- .default
@@ -746,13 +799,29 @@ dist-flatpak-weekly:
needs: ["gimp-flatpak-x64"]
stage: distribution
script:
- bash build/linux/flatpak/3_dist-gimp-flatpak.sh
- sh build/linux/flatpak/3_dist-gimp-flatpakbuilder.sh
artifacts:
expose_as: 'Linux flatpak'
paths:
- build/linux/flatpak/_Output/
expire_in: 8 days
dist-snap-weekly:
extends: .default
rules:
- !reference [.snap, rules]
needs: ["gimp-snap"]
stage: distribution
image: !reference [.snap, image]
variables: !reference [.snap, variables]
script:
- sh build/linux/snap/3_dist-gimp-snapcraft.sh
artifacts:
expose_as: 'Linux snap'
paths:
- build/linux/snap/_Output/
expire_in: 8 days
dist-installer-weekly:
extends: .default
rules:

View File

@@ -1,16 +1,8 @@
<!-- ⚠️ IMPORTANT: READ ME! ⚠️
This is the default template for bug reports.
For feature requests or performance issues, please switch instead to the appropriate template in the "Choose a template" list.
For feature requests, performance issues and security reports, please switch instead to the appropriate template in the "Choose a template" list.
It is important that you fill all the fields of the template.
There are a few issues we get reports about quite frequently. If you want to check if what you have encountered is among these, please see:
https://gitlab.gnome.org/GNOME/gimp/-/issues/?sort=updated_desc&state=all&label_name%5B%5D=Duplication%20target&first_page_size=100
**Code of Conduct**: "Be considerate and respectful" is our main rule.
E.g. avoid negative emotional writing which only generates more upsetting
interactions. Thanks!
-->
It is important that you fill all the fields of the template. -->
### Environment/Versions
@@ -19,14 +11,21 @@ interactions. Thanks!
- Operating System: <!--[Windows? macOS? Linux? All? Add OS versions too] (write it after the > symbol) -->
- (if Linux) Display system: <!--[X11? Wayland? Which compositor and version?] (write it after the > symbol) -->
<!--Note: bug reporters are expected to have verified the bug still exists
<!-- Note: you are expected to have verified the bug still exists
either in the last stable version of GIMP or on updated development code
(master branch).-->
(master branch).
There are a few issues we get reports about quite frequently. If you want to check if what you have encountered is among these, please see:
https://gitlab.gnome.org/GNOME/gimp/-/issues/?sort=updated_desc&state=all&label_name%5B%5D=Duplication%20target&first_page_size=100 -->
### Description of the bug
<!--Please describe your issue with details.
Add full (not cropped) screenshots or other files if needed.(write it after the > symbol)-->
<!-- Please describe your issue with details. By "details" we mean:
- "Be considerate and respectful". This is our main rule.
E.g. avoid negative emotional writing which only generates more upsetting
interactions.
- Stay on topic by writting only one bug per report created.
- Add full (not cropped) screenshots or other files using the clip button on GitLab. -->
### Reproduction

View File

@@ -1,4 +1,8 @@
**Operating System:** <!--[Windows? macOS? Linux? All?] (write it after the > symbol) -->
<!-- ⚠️ IMPORTANT: READ ME! ⚠️
This is the template for feature requests.
For bug reports, performance issues and security reports, please switch instead to the appropriate template in the "Choose a template" list.
It is important that you fill all the fields of the template. -->
### Description of the feature
@@ -15,3 +19,5 @@
<!-- Explain the use cases or problems to solve.
If you are unsure, you should first discuss with the community in the forums
or talk with the developers on IRC: https://www.gimp.org/discuss.html -->
/label ~"1. Feature"

View File

@@ -1,14 +1,21 @@
<!-- ⚠️ IMPORTANT: READ ME! ⚠️
This is the template for performance issues.
For bug reports, feature requests and security reports, please switch instead to the appropriate template in the "Choose a template" list.
It is important that you fill all the fields of the template. -->
### Environment/Versions
- GIMP Version:
- GIMP version number:
- Package: <!--[flatpak? Installer from gimp.org? If another installer, tell us where from] (write it after the > symbol)-->
- Operating System: <!--[Windows? macOS? Linux? All?] (write it after the > symbol) -->
- Operating System: <!--[Windows? macOS? Linux? All? Add OS versions too] (write it after the > symbol) -->
- (if Linux) Display system: <!--[X11? Wayland? Which compositor and version?] (write it after the > symbol) -->
<!-- Note: bug reporters are expected to have verified the bug still exists
<!-- Note: you are expected to have verified the performance issue still exists
either in the last stable version of GIMP or on updated development code
(master branch). -->
### Issue Description
### Description of the performance issue
<!-- Please provide a general description of the issue. -->
@@ -25,9 +32,9 @@ For more information, see
<!-- Please describe in detail the actions performed in the performance log.
If you added empty event markers to the log, please provide a description for them here.
If you recorded a screencast while recording the log, please attach it here. -->
If you recorded a screencast while recording the log, please attach it here. -->
### Additional Information
### Additional information
<!-- If there is any additional information, please provide it here. -->

View File

@@ -0,0 +1,31 @@
<!-- ⚠️ IMPORTANT: READ ME! ⚠️
This is the template for security reports.
For bug reports, feature requests and performance issues, please switch instead to the appropriate template in the "Choose a template" list.
It is important that you fill all the fields of the template. -->
### Environment/Versions
- GIMP version number:
- Package: <!--[flatpak? Installer from gimp.org? If another installer, tell us where from] (write it after the > symbol)-->
- Operating System: <!--[Windows? macOS? Linux? All? Add OS versions too] (write it after the > symbol) -->
- (if Linux) Display system: <!--[X11? Wayland? Which compositor and version?] (write it after the > symbol) -->
<!-- Note: you are expected to have verified the security issue still exists
either in the last stable version of GIMP or on updated development code
(master branch). -->
### Description of the security report
<!-- Please provide a general description of the security issue (with CVE code if possible). -->
### Antivirus Log
<!-- Please attach a antivirus log or other file detailing the issue, and attach it to the report.
If you have none, at least report GIMP as false positive to the antivirus before continuing. -->
### Additional information
<!-- If there you know the culprit code, please link it here. -->
/label ~"1. Security"

View File

@@ -1,167 +1,196 @@
#!/bin/bash
#!/bin/sh
source .gitlab/search-common-ancestor.sh
. .gitlab/search-common-ancestor.sh
# CHECK SCRIPTS RUNNED BY MESON (ALL OSes)
printf "\e[0Ksection_start:`date +%s`:nonunix_test[collapsed=false]\r\e[0KChecking for non-Unix compatibility\n"
diff=$(git diff -U0 --no-color "${newest_common_ancestor_sha}" -- '*.build' '*.py' | grep -E '^\+[^+]' | sed 's/^+//')
#List of commonly used utilities on Unix world
#See the context: https://gitlab.gnome.org/GNOME/gimp/-/issues/11385
coreutils_array=(
".sh"
"'sh'"
"'bash'"
"'\['"
"'arch'"
"'awk'"
"'b2sum'"
"'base32'"
"'base64'"
"'basename'"
"'basenc'"
"'cat'"
"'chcon'"
"'chgrp'"
"'chmod'"
"'chown'"
"'chroot'"
"'cksum'"
"'cmp'"
"'comm'"
"'cp'"
"'csplit'"
"'cut'"
"'date'"
"'dd'"
"'df'"
"'diff'"
"'dir'"
"'dircolors'"
"'dirname'"
"'du'"
"'echo'"
"'env'"
"'expand'"
"'expr'"
"'factor'"
"'false'"
"'find'"
"'fmt'"
"'fold'"
"'gkill'"
"'grep'"
"'groups'"
"'head'"
"'hostid'"
"'hostname'"
"'id'"
"'install'"
"'join'"
"'link'"
"'ln'"
"'logname'"
"'ls'"
"'md5sum'"
"'mkdir'"
"'mkfifo'"
"'mknod'"
"'mktemp'"
"'mv'"
"'nice'"
"'nl'"
"'nohup'"
"'nproc'"
"'numfmt'"
"'od'"
"'paste'"
"'pathchk'"
"'pinky'"
"'pr'"
"'printenv'"
"'printf'"
"'ptx'"
"'pwd'"
"'readlink'"
"'realpath'"
"'rm'"
"'rmdir'"
"'runcon'"
"'sed'"
"'seq'"
"'sha1sum'"
"'sha224sum'"
"'sha256sum'"
"'sha384sum'"
"'sha512sum'"
"'shred'"
"'shuf'"
"'sleep'"
"'sort'"
"'split'"
"'stat'"
"'stdbuf'"
"'stty'"
"'sum'"
"'sync'"
"'tac'"
"'tail'"
"'tee'"
"'test'"
"'timeout'"
"'touch'"
"'tr'"
"'true'"
"'truncate'"
"'tsort'"
"'tty'"
"'uname'"
"'unexpand'"
"'uniq'"
"'unlink'"
"'users'"
"'vdir'"
"'wc'"
"'who'"
"'whoami'"
"'yes'"
)
for coreutil in "${coreutils_array[@]}"; do
## List of commonly used utilities on Unix world
## See the context: https://gitlab.gnome.org/GNOME/gimp/-/issues/11385
coreutils_list="
\.sh \
'sh' \
'bash' \
'\[' \
'arch' \
'awk' \
'b2sum' \
'base32' \
'base64' \
'basename' \
'basenc' \
'cat' \
'chcon' \
'chgrp' \
'chmod' \
'chown' \
'chroot' \
'cksum' \
'cmp' \
'comm' \
'cp' \
'csplit' \
'cut' \
'date' \
'dd' \
'df' \
'diff' \
'dir' \
'dircolors' \
'dirname' \
'du' \
'echo' \
'env' \
'expand' \
'expr' \
'factor' \
'false' \
'find' \
'fmt' \
'fold' \
'gkill' \
'grep' \
'groups' \
'head' \
'hostid' \
'hostname' \
'id' \
'install' \
'join' \
'link' \
'ln' \
'logname' \
'ls' \
'md5sum' \
'mkdir' \
'mkfifo' \
'mknod' \
'mktemp' \
'mv' \
'nice' \
'nl' \
'nohup' \
'nproc' \
'numfmt' \
'od' \
'paste' \
'pathchk' \
'pinky' \
'pr' \
'printenv' \
'printf' \
'ptx' \
'pwd' \
'readlink' \
'realpath' \
'rm' \
'rmdir' \
'runcon' \
'sed' \
'seq' \
'sha1sum' \
'sha224sum' \
'sha256sum' \
'sha384sum' \
'sha512sum' \
'shred' \
'shuf' \
'sleep' \
'sort' \
'split' \
'stat' \
'stdbuf' \
'stty' \
'sum' \
'sync' \
'tac' \
'tail' \
'tee' \
'test' \
'timeout' \
'touch' \
'tr' \
'true' \
'truncate' \
'tsort' \
'tty' \
'uname' \
'unexpand' \
'uniq' \
'unlink' \
'users' \
'vdir' \
'wc' \
'who' \
'whoami' \
'yes'
"
for coreutil in $coreutils_list; do
if echo "$diff" | grep -q "$coreutil"; then
found_coreutils+=" $coreutil"
found_coreutils="$(echo "$found_coreutils $coreutil" | sed 's|\\||g')"
fi
done
if [ "$found_coreutils" ]; then
echo -e '\033[31m(ERROR)\033[0m: Seems that you are trying to add an Unix-specific dependency to be called by Meson.'
echo " Please, port to Python (which is crossplatform), your use of:${found_coreutils}."
printf "$diff\n"
printf '\033[31m(ERROR)\033[0m: Seems that you are trying to add an Unix-specific dependency to be called by Meson.\n'
printf " Please, port to Python (which is crossplatform), your use of:${found_coreutils}.\n"
fi
#Limited list of commonly used utilities on Windows world
ntutils_array=(
".bat"
".cmd"
".ps1"
"'cmd'"
"'powershell'"
)
for ntutil in "${ntutils_array[@]}"; do
## Limited list of commonly used utilities on Windows world
ntutils_list="
\.bat \
\.cmd \
\.ps1 \
'cmd' \
'powershell'
"
for ntutil in $ntutils_list; do
if echo "$diff" | grep -q "$ntutil"; then
found_ntutils+=" $ntutil"
found_ntutils="$(echo "$found_ntutils $ntutil" | sed 's|\\||g')"
fi
done
if [ "$found_ntutils" ]; then
echo -e '\033[31m(ERROR)\033[0m: Seems that you are trying to add a NT-specific dependency to be called by Meson.'
echo " Please, port to Python (which is crossplatform), your use of:${found_ntutils}."
printf "$diff\n"
printf '\033[31m(ERROR)\033[0m: Seems that you are trying to add a NT-specific dependency to be called by Meson.\n'
printf " Please, port to Python (which is crossplatform), your use of:${found_ntutils}.\n"
fi
if [ -z "$found_coreutils" ] && [ -z "$found_ntutils" ]; then
printf '(INFO): Meson .build and .py files are alright regarding being crossplatform.\n'
fi
printf "\e[0Ksection_end:`date +%s`:nonunix_test\r\e[0K\n"
if [ "$found_coreutils" ] || [ "$found_ntutils" ]; then
# CHECK SCRIPTS NOT RUN BY MESON (UNIX ONLY)
# Shell scripts have potential portability issues if:
# 1) contain bash shebang or are called by bash;
# 2) contain bashisms.
printf "\e[0Ksection_start:`date +%s`:unix_test[collapsed=false]\r\e[0KChecking for Unix portability (optional)\n"
diff=$(git diff -U0 --no-color "${newest_common_ancestor_sha}" | grep -E '^\+[^+]' | sed 's/^+//')
## Check shebang and external call (1)
echo "$diff" | grep -E '^#!\s*/usr/bin/env\s+bash|^#!\s*/(usr/bin|bin)/bash(\s|$)' && found_bashism='extrinsic_bashism'
echo "$diff" | grep -E "bash\s+.*\.sh" && found_bashism='extrinsic_bashism'
## Check content with shellcheck and checkbashisms (2)
for sh_script in $(find "$CI_PROJECT_DIR" -type d -name .git -prune -o -type f \( ! -name '*.ps1' ! -name '*.c' -exec grep -lE '^#!\s*/usr/bin/env\s+(sh|bash)|^#!\s*/(usr/bin|bin)/(sh|bash)(\s|$)' {} \; -o -name '*.sh' ! -exec grep -q '^#!' {} \; -print \)); do
shellcheck --severity=warning --shell=sh -x "$sh_script" | grep -v 'set option posix is' | grep -vE '.*http.*SC[0-9]+.*POSIX' | grep --color=always -B 2 -E 'SC[0-9]+.*POSIX' && found_bashism='intrinsic_bashism'
checkbashisms -f $sh_script || found_bashism='intrinsic_bashism'
done
if [ "$found_bashism" ]; then
printf '\033[33m(WARNING)\033[0m: Seems that you added a Bash-specific code (aka "bashism").\n'
printf " It is recommended to make it POSIX-compliant (which is portable).\n"
else
printf '(INFO): Shell .sh files are alright regarding being portable.\n'
fi
printf "\e[0Ksection_end:`date +%s`:unix_test\r\e[0K\n"
if [ "$found_coreutils" ] || [ "$found_ntutils" ] || [ "$found_bashism" ]; then
exit 1
fi
echo 'Meson .build files are alright regarding crossplatform.'
exit 0

View File

@@ -1,27 +1,25 @@
#!/bin/bash
set -e
#!/bin/sh
ancestor_horizon=28 # days (4 weeks)
echo ""
echo "This script may be wrong. You may disregard it if it conflicts with"
echo "https://gitlab.gnome.org/GNOME/gimp/-/blob/master/CODING_STYLE.md"
echo "https://developer.gimp.org/core/coding_style/"
clang-format --version
# Wrap everything in a subshell so we can propagate the exit status.
(
source .gitlab/search-common-ancestor.sh
. .gitlab/search-common-ancestor.sh
git diff -U0 --no-color "${newest_common_ancestor_sha}" | clang-format-diff -p1 > format-diff.log
)
exit_status=$?
[ ${exit_status} == 0 ] || exit ${exit_status}
[ ${exit_status} = 0 ] || exit ${exit_status}
format_diff="$(<format-diff.log)"
format_diff="$(cat format-diff.log)"
if [ -n "${format_diff}" ]; then
cat format-diff.log

View File

@@ -1,6 +1,4 @@
#!/bin/bash
set -e
#!/bin/sh
ancestor_horizon=28 # days (4 weeks)
@@ -14,7 +12,7 @@ ancestor_horizon=28 # days (4 weeks)
if ! git ls-remote --exit-code upstream >/dev/null 2>&1 ; then
git remote add upstream https://gitlab.gnome.org/GNOME/gimp.git
fi
git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" upstream &> ./fetch_upstream.log
git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" upstream > ./fetch_upstream.log 2>&1
# Work out the newest common ancestor between the detached HEAD that this CI job
# has checked out, and the upstream target branch (which will typically be
@@ -28,10 +26,12 @@ git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%
git remote add patch-origin ${CI_MERGE_REQUEST_SOURCE_PROJECT_URL:-${CI_PROJECT_URL}}
source_branch="${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:-${CI_COMMIT_BRANCH}}"
git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" patch-origin "${source_branch}" &> ./fetch_origin.log
git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" patch-origin "${source_branch}" > ./fetch_origin.log 2>&1
newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "upstream/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent "patch-origin/${source_branch}") | head -1)
if [ -z "${newest_common_ancestor_sha}" ]; then
git rev-list --first-parent "upstream/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}" > "temp_upstream" 2>&1
git rev-list --first-parent "patch-origin/${source_branch}" > "temp_patch-origin" 2>&1
newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' "temp_upstream" "temp_patch-origin" | head -n 1)
if [ -z "${newest_common_ancestor_sha}" ] || [ "${newest_common_ancestor_sha}" = '' ]; then
echo "Couldnt find common ancestor with upstream main branch. This typically"
echo "happens if you branched from main a long time ago. Please update"
echo "your clone, rebase, and re-push your branch."

View File

@@ -4,14 +4,15 @@ Installation instructions for GIMP @GIMP_APP_VERSION@
There are some basic steps to building and installing GIMP.
GIMP @GIMP_APP_VERSION@ replaces earlier GIMP 2.10.x versions. It is advised to
uninstall them before installing GIMP @GIMP_APP_VERSION@. Since libgimp* libraries
and data are all versioned anyway, it is possible to keep your older
GIMP 2.x installation in parallel to GIMP @GIMP_APP_VERSION@ on a same prefix.
GIMP @GIMP_APP_VERSION@ replaces earlier GIMP versions. It is advised to uninstall
them before installing GIMP @GIMP_APP_VERSION@. Since libgimp* libraries and data
are all versioned anyway, it is possible to keep your older GIMP 2.x
or 3.x installations in parallel to GIMP @GIMP_APP_VERSION@ on a same prefix.
GIMP @GIMP_APP_VERSION@ is not backward compatible with GIMP 2.10 and earlier
versions. Plug-ins and scripts written for GIMP 2.10, 2.8, 2.6 or
earlier GIMP 2.x versions will not work because the API changed.
earlier GIMP 2.x versions will not work because the API changed in
GIMP 3.0.
The most important part is to make sure the requirements for a build
are fulfilled. We depend on a number of tools and libraries which are
@@ -146,18 +147,11 @@ help in that regard:
incompatible with the version 2 (which is still experimental anyway
and has no stable release at time of writing).
11. We also need the mypaint-brushes data package:
11. We also need the mypaint-brushes v2 data package:
https://github.com/mypaint/mypaint-brushes
If installing from repository, install from branch "v1.3.x" or the
last tag "v1.y.z" (e.g. "v1.3.1" at time of writing).
In particular do NOT install from `master` branch which installs
brushes incompatible with GIMP (the `master` branch and v2 brushes
are targeted to software using recent libmypaint which GIMP wasn't
ported to yet).
Also this is a data packages and therefore it will install the
Note that this is a data packages and therefore it will install the
pkg-config file inside `$PREFIX/share/pkgconfig/`. If you install
mypaint-brushes from repository in a non-standard prefix, you will
have to make sure your $PKG_CONFIG_PATH environment variable also
@@ -270,7 +264,7 @@ help in that regard:
librsvg @RSVG_REQUIRED_VERSION@
libtiff @LIBTIFF_REQUIRED_VERSION@
Little CMS @LCMS_REQUIRED_VERSION@
mypaint-brushes-1.0
mypaint-brushes-2.0
pangocairo @PANGO_REQUIRED_VERSION@
poppler-data @POPPLER_DATA_REQUIRED_VERSION@
PyGObject
@@ -281,10 +275,12 @@ help in that regard:
Package Name Version Feature
bison - Image Map plug-in
cairo-pdf @CAIRO_PDF_REQUIRED_VERSION@ PDF export
cfitsio - FITS
iso-codes - Language selection
ExcHndl - Crash logs on Windows with Dr. MinGW
flex - Image Map plug-in
gs - ghostscript
libaa - ASCII art
libheif @LIBHEIF_REQUIRED_VERSION@ HEIF (HEIC, AVIF)

183
NEWS
View File

@@ -6,6 +6,163 @@
This is the development branch of GIMP.
Overview of Changes from GIMP 3.1.2 to GIMP 3.1.4
=================================================
Core:
- About dialog now shows "Up to date as of <date>" text for more
clarity.
- Fixed config migration when updating to GIMP 3.1/2.
- Reorganizing layer search code into generic item tree view search
code for further reusing into other use cases.
- Internal classes, config items and actions renamed from "vectors" to
"path".
- Some cleanup of outdated disabled unit tests and other warnings.
- Restructuration of internal GimpControllerManager API.
- Various code have been moving away from GtkTreeView and some new
internal classes were added as a preparation for GTK4 port.
Tools:
- MyPaint brush tool was ported to the newer MyPaintSurface2 API. A
consequence is that we now depend on mypaint-brushes-2.0 instead of
mypaint-brushes-1.0.
Graphical User Interface:
- More consistent capitalization across text in UI.
- Use system colors on Windows title bar when System colors theme is
set.
- Make the comment text area sensitive in Export procedure dialogs
depending on whether "Save Comment" checkbox is checked or not.
- In various GUI using a GtkStack (Input Controller dialogue,
Preferences dialogue, and Welcome dialogue), we now turn off
animations when it is set OFF system-wide.
Plug-Ins:
- TIFF - Add support for the following features, based on unofficial
documentation and user-provided sample files:
* Sets the selected layer based on the image-level metadata.
* Sets the visibility of the background layer based on the image
level metadata.
* Sets the blend mode and color tag of each layer, based on extended
layer-level metadata. Legacy blend modes are used, based on
user feedback and comparison with Sketchbook.
* Creates group layers and stores layers in them. Layers are read from
top to bottom, and layer groups are added and filled based on layer
level metadata.
- Animation Playback was redesigned to more closely resemble standard
playback UIs. The redesign also changes the progress bar to a
GtkScale, so users can more easily move to different frames on the
timeline.
PDB:
- gimp-file-save properly sets associated save or exported files.
Overview of Changes from GIMP 3.0.4 to GIMP 3.1.2
=================================================
Core:
- Layer mask created from layer's alpha when there is no alpha
channel is now a fully opaque mask.
- Major non-destructive filter code refactoring.
- Lock Content now generates undo steps.
- NDE filters are now allowed on channels.
- Merging filter will now add an alpha channel to a layer if required.
- Refactoring Photoshop stream loading functions.
- Loading Photoshop RGB and grayscale patterns (.pat, unfortunately
the same extension as our own pattern format) now supported.
- The histogram editor now shows a "Compute unique colors:" checkbox
which will display the unique color count in the image.
- Deleting current palette entry now selects the next entry in the
palette.
- New paint mode: Overwrite. Note that this mode is only available for
paint tools right now (in particular not for layers, neither in
filters).
Graphical User Interface:
- Brushes and Fonts dockables: new "Use theme colors for preview"
toggle button.
- The Palettes and Palette Editor dockables, and the Palette tab in
FB/BG Color dockable, also follow theme colors for grid display.
- New "System" color scheme which will follow the system's color
scheme setting (on Unix-like systems when XDG Settings portal is
installed and on Windows).
Tools:
- Curves tool: Photoshop curves file format (.acv) can now be loaded.
- Levels tool: Photoshop levels file format (.alv) can now be loaded.
- Text tool: new "Outline Direction" settings.
Plug-Ins:
- Jigsaw: the plug-in now draws on transparent layers too.
- Playstation TIM images now supported (import/export).
- Palettes can now be exported as Krita .kpl palette.
- Over The Air Bitmap (Nokia mobile image format) now supported for
import.
- PSD:
* legacy Drop Shadow layer style is now imported on loading.
* legacy Inner Shadow layer style is now imported on loading.
- file-raw: new support for ART (Another RawTherapee, fork of the
latter) as a RAW loader.
- OpenEXR: support for importing multi-layer OpenEXR images.
- JPEG 2000: export support added.
- APNG: initial import support.
- JIF: new import support for Jeff's Image Format.
- ORA: support the extensions storing layer's "pixel locked" and
"selected" status on import and export.
- Script-Fu: new function (script-fu-register-i18n) for setting up
localization of Script-Fu plug-ins.
- HEIF:
* new AVCI import support (requires libheif 1.19.6 with OpenH264
decoder enabled);
* new HEJ2 export support (requires libheif 1.19.8 with OpenJPEG
support).
- New export support for PSB.
Modules:
- CMYK selector: Total Ink Coverage (total percentage of ink that
would be needed to print a particular color) information is now
shown.
API:
- Changes in libgimpwidgets:
* New functions:
+ gimp_prop_toggle_new()
- Changes in libgimpui:
* New functions:
+ gimp_procedure_dialog_get_coordinates()
* gimp_procedure_dialog_get_widget() will now generate a radio frame
widget for GimpChoice arguments of 2 choices only (and will still
default to a combo box for larger choices list).
PDB:
- none_ok tag now allowed on sample_point and guide PDB types.
Build:
- File format associations list now generated by the build system for
Windows and OSes using the Desktop file.
- Flatpak: verify nightly flatpak dependencies with the
flatpak-external-data-checker (like we do for stable and beta
flatpaks).
- Various non-portable scripts were ported to be properly
POSIX-compliant and to allow native builds on all OS (e.g. Windows).
- Some soft checks were also added to the build system to prevent
re-introduction of non-portable code.
Overview of Changes from GIMP 3.0.2 to GIMP 3.0.4
=================================================
@@ -17,6 +174,17 @@ Core:
- Module loading improved to be better cross-platform (in particular
on macOS both .so and .dylib modules are supported).
- Code compliant with GCC 15 (C23).
- Filter size updated when its drawable is rotated.
- Font loading (at startup) optimized.
- Set the proper program name for KDE/Wayland to map the process to
the correct desktop file.
- "windows-display-*" are hidden from the Shortcuts dialog (they are
not meant to be remapped).
- Editing non-destructive effects now triggers undo steps.
- When migrating from GIMP 2.x to GIMP 3, shortcuts for actions
"edit-paste-as-new-layer*" are now converted to "edit-paste-merged*"
(and not "edit-paste*" anymore which was confusing and
counter-productive).
Graphical User Interface:
@@ -37,11 +205,17 @@ Graphical User Interface:
- Removed size restrictions on Display Filters.
- Don't show hidden tools on toolbox tooltips.
- Fix "Keep above" Window Manager hint.
- Multi-Window mode on Windows: dock windows' title bars now adapt to
the Windows system theme colors too.
- Show palette name in Palette Color Selector.
Tools:
- MyPaint Brush: have consistent options layout compared to other
paint tools.
- Scissors Select Tool: close the curve on Enter, similar to the Path
tool.
- Path Tool: connect path on click in design mode.
Plug-ins:
@@ -74,6 +248,7 @@ Build:
* Downgrading is only possible by uninstalling first.
* Development warning is shown in dev build of stable series too.
* Add fractional scaling support to Installer welcome image.
* Restore points now have a timeout to prevent stuckness.
- Our AppImage won't ship debug symbols anymore. Better debugging can
be set with: export DEBUGINFOD_URLS="https://debuginfod.debian.net"
- Windows builds:
@@ -81,11 +256,17 @@ Build:
files for plug-in developers.
* Dedicated file icon for XCF files.
* Generate native .pdb CodeView symbols on Windows (smaller debug
data files, usable by MSIX and better debugging ability).
data files, usable by MSIX and better debugging ability), except
on x86 (32-bit).
- Crossbuilds are dropped from CI.
- Shell scripts used in the meson build are ported to Python (more
portable and much faster on some platforms, in particular Windows).
- Some build scripts were moved around for reorganization.
- Depency requirement bumped:
* babl 0.1.114
* GEGL 0.4.62
- New "Inputs" feature for simpler Gitlab pipelines running.
- Some in-repository documentation was cleaned up.
Overview of Changes from GIMP 3.0.0 to GIMP 3.0.2

4
README
View File

@@ -1,9 +1,9 @@
------------------------------
GNU Image Manipulation Program
3.0 Stable Branch
3.1 Development Branch
------------------------------
This is a stable release in the GIMP 3.0 series.
This is an unstable development release in the GIMP 3.1 series.
If you think you found a bug in this version, please make sure that it
hasn't been reported earlier and that it is not just new stuff that is

View File

@@ -32,9 +32,9 @@ if enable_default_bin
pointing_to: fs.name(gimp_debug_tool.full_path()),
install_dir: gimp_debug_tool_dir)
else
meson.add_install_script(python, '-c', 'from shutil import copy2; from pathlib import Path; from sys import argv; copy2(argv[1], str(Path(argv[2]) / "bin" / argv[3]))',
gimp_debug_tool.full_path(), get_option('prefix'), fs.name(gimp_debug_tool.name()).replace(exec_ver, '.exe'))
meson.add_install_script(python, '-c', 'from shutil import copy2; from pathlib import Path; from sys import argv; copy2(argv[1], str(Path(argv[2]) / "bin" / argv[3].replace("@0@", argv[4])))',
gimp_debug_tool.full_path(), get_option('prefix'), fs.name(gimp_debug_tool.name()).replace(exec_ver, '-@0@.exe'), api_version_major.to_string())
meson.add_install_script(python, '-c', 'from shutil import copy2; from pathlib import Path; from sys import argv; import os; copy2(argv[1], str(Path(os.environ.get("MESON_INSTALL_DESTDIR_PREFIX")) / "bin" / argv[2]))',
gimp_debug_tool.full_path(), fs.name(gimp_debug_tool.name()).replace(exec_ver, '.exe'))
meson.add_install_script(python, '-c', 'from shutil import copy2; from pathlib import Path; from sys import argv; import os; copy2(argv[1], str(Path(os.environ.get("MESON_INSTALL_DESTDIR_PREFIX")) / "bin" / argv[2].replace("@0@", argv[3])))',
gimp_debug_tool.full_path(), fs.name(gimp_debug_tool.name()).replace(exec_ver, '-@0@.exe'), api_version_major.to_string())
endif
endif

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __ABOUT_H__
#define __ABOUT_H__
#pragma once
#define GIMP_ACRONYM \
@@ -48,6 +47,3 @@
"\n\n" \
"You should have received a copy of the GNU General Public License " \
"along with GIMP. If not, see: https://www.gnu.org/licenses/")
#endif /* __ABOUT_H__ */

View File

@@ -15,9 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __ACTIONS_TYPES_H__
#define __ACTIONS_TYPES_H__
#pragma once
#include "dialogs/dialogs-types.h"
#include "tools/tools-types.h"
@@ -51,6 +49,3 @@ typedef enum
GIMP_SAVE_MODE_EXPORT_AS,
GIMP_SAVE_MODE_OVERWRITE
} GimpSaveMode;
#endif /* __ACTIONS_TYPES_H__ */

View File

@@ -91,10 +91,10 @@
#include "text-editor-actions.h"
#include "text-tool-actions.h"
#include "tool-options-actions.h"
#include "tool-path-actions.h"
#include "tool-presets-actions.h"
#include "tool-preset-editor-actions.h"
#include "tools-actions.h"
#include "vector-toolpath-actions.h"
#include "view-actions.h"
#include "windows-actions.h"
@@ -233,12 +233,12 @@ static const GimpActionFactoryEntry action_groups[] =
{ "tool-options", N_("Tool Options"), GIMP_ICON_DIALOG_TOOL_OPTIONS,
tool_options_actions_setup,
tool_options_actions_update },
{ "tool-path", N_("Tool Path"), GIMP_ICON_PATH,
tool_path_actions_setup,
tool_path_actions_update },
{ "tools", N_("Tools"), GIMP_ICON_DIALOG_TOOLS,
tools_actions_setup,
tools_actions_update },
{ "vector-toolpath", N_("Path Toolpath"), GIMP_ICON_PATH,
vector_toolpath_actions_setup,
vector_toolpath_actions_update },
{ "paths", N_("Paths"), GIMP_ICON_PATH,
paths_actions_setup,
paths_actions_update },
@@ -490,10 +490,9 @@ action_data_sel_count (gpointer data)
{
if (GIMP_IS_CONTAINER_EDITOR (data))
{
GimpContainerEditor *editor;
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (data);
editor = GIMP_CONTAINER_EDITOR (data);
return gimp_container_view_get_selected (editor->view, NULL, NULL);
return gimp_container_view_get_selected (editor->view, NULL);
}
else
{

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __ACTIONS_H__
#define __ACTIONS_H__
#pragma once
extern GimpActionFactory *global_action_factory;
@@ -114,6 +113,3 @@ void action_message (GimpDisplay *display,
paths = gimp_image_get_selected_paths (image); \
if (! paths) \
return
#endif /* __ACTIONS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __BRUSH_EDITOR_ACTIONS_H__
#define __BRUSH_EDITOR_ACTIONS_H__
#pragma once
void brush_editor_actions_setup (GimpActionGroup *group);
void brush_editor_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __BRUSH_EDITOR_ACTIONS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __BRUSHES_ACTIONS_H__
#define __BRUSHES_ACTIONS_H__
#pragma once
void brushes_actions_setup (GimpActionGroup *group);
void brushes_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __BRUSHES_ACTIONS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __BUFFERS_ACTIONS_H__
#define __BUFFERS_ACTIONS_H__
#pragma once
void buffers_actions_setup (GimpActionGroup *group);
void buffers_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __BUFFERS_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __BUFFERS_COMMANDS_H__
#define __BUFFERS_COMMANDS_H__
#pragma once
void buffers_paste_cmd_callback (GimpAction *action,
@@ -28,6 +27,3 @@ void buffers_paste_as_new_image_cmd_callback (GimpAction *action,
void buffers_delete_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __BUFFERS_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __CHANNELS_ACTIONS_H__
#define __CHANNELS_ACTIONS_H__
#pragma once
void channels_actions_setup (GimpActionGroup *group);
void channels_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __CHANNELS_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __CHANNELS_COMMANDS_H__
#define __CHANNELS_COMMANDS_H__
#pragma once
void channels_edit_attributes_cmd_callback (GimpAction *action,
@@ -69,6 +68,3 @@ void channels_color_tag_cmd_callback (GimpAction *action,
void channels_select_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __CHANNELS_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __COLORMAP_ACTIONS_H__
#define __COLORMAP_ACTIONS_H__
#pragma once
void colormap_actions_setup (GimpActionGroup *group);
void colormap_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __COLORMAP_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __COLORMAP_COMMANDS_H__
#define __COLORMAP_COMMANDS_H__
#pragma once
void colormap_edit_color_cmd_callback (GimpAction *action,
@@ -31,6 +30,3 @@ void colormap_add_color_cmd_callback (GimpAction *action,
void colormap_to_selection_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __COLORMAP_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __CONTEXT_ACTIONS_H__
#define __CONTEXT_ACTIONS_H__
#pragma once
void context_actions_setup (GimpActionGroup *group);
void context_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __CONTEXT_ACTIONS_H__ */

View File

@@ -895,17 +895,16 @@ context_select_object (GimpActionSelectType select_type,
GimpContainer *container)
{
GimpObject *current;
GType child_type;
current =
gimp_context_get_by_type (context,
gimp_container_get_children_type (container));
child_type = gimp_container_get_child_type (container);
current = gimp_context_get_by_type (context, child_type);
current = action_select_object (select_type, container, current);
if (current)
gimp_context_set_by_type (context,
gimp_container_get_children_type (container),
current);
gimp_context_set_by_type (context, child_type, current);
}
static gint

View File

@@ -15,9 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __CONTEXT_COMMANDS_H__
#define __CONTEXT_COMMANDS_H__
#pragma once
void context_colors_default_cmd_callback (GimpAction *action,
@@ -139,6 +137,3 @@ void context_brush_angle_cmd_callback (GimpAction *action,
void context_toggle_dynamics_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __CONTEXT_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __CURSOR_INFO_ACIONS_H__
#define __CURSOR_INFO_ACIONS_H__
#pragma once
void cursor_info_actions_setup (GimpActionGroup *group);
void cursor_info_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __CURSOR_INFO_ACTIONS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __CURSOR_INFO_COMMANDS_H__
#define __CURSOR_INFO_COMMANDS_H__
#pragma once
void cursor_info_sample_merged_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __CURSOR_INFO_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DASHBOARD_ACTIONS_H__
#define __DASHBOARD_ACTIONS_H__
#pragma once
void dashboard_actions_setup (GimpActionGroup *group);
void dashboard_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __DASHBOARD_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DASHBOARD_COMMANDS_H__
#define __DASHBOARD_COMMANDS_H__
#pragma once
void dashboard_update_interval_cmd_callback (GimpAction *action,
@@ -43,6 +42,3 @@ void dashboard_reset_cmd_callback (GimpAction *action,
void dashboard_low_swap_space_warning_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __DASHBOARD_COMMANDS_H__ */

View File

@@ -68,7 +68,7 @@ data_open_as_image_cmd_callback (GimpAction *action,
data = (GimpData *)
gimp_context_get_by_type (context,
gimp_data_factory_view_get_children_type (view));
gimp_data_factory_view_get_child_type (view));
if (data && gimp_data_get_file (data))
{
@@ -119,7 +119,7 @@ data_new_cmd_callback (GimpAction *action,
GtkWidget *edit_button;
gimp_context_set_by_type (context,
gimp_data_factory_view_get_children_type (view),
gimp_data_factory_view_get_child_type (view),
GIMP_OBJECT (data));
edit_button = gimp_data_factory_view_get_edit_button (view);
@@ -142,7 +142,7 @@ data_duplicate_cmd_callback (GimpAction *action,
data = (GimpData *)
gimp_context_get_by_type (context,
gimp_data_factory_view_get_children_type (view));
gimp_data_factory_view_get_child_type (view));
if (data && gimp_data_factory_view_have (view, GIMP_OBJECT (data)))
{
@@ -155,7 +155,7 @@ data_duplicate_cmd_callback (GimpAction *action,
GtkWidget *edit_button;
gimp_context_set_by_type (context,
gimp_data_factory_view_get_children_type (view),
gimp_data_factory_view_get_child_type (view),
GIMP_OBJECT (new_data));
edit_button = gimp_data_factory_view_get_edit_button (view);
@@ -178,7 +178,7 @@ data_copy_location_cmd_callback (GimpAction *action,
data = (GimpData *)
gimp_context_get_by_type (context,
gimp_data_factory_view_get_children_type (view));
gimp_data_factory_view_get_child_type (view));
if (data)
{
@@ -207,7 +207,7 @@ data_show_in_file_manager_cmd_callback (GimpAction *action,
data = (GimpData *)
gimp_context_get_by_type (context,
gimp_data_factory_view_get_children_type (view));
gimp_data_factory_view_get_child_type (view));
if (data)
{
@@ -243,7 +243,7 @@ data_delete_cmd_callback (GimpAction *action,
data = (GimpData *)
gimp_context_get_by_type (context,
gimp_data_factory_view_get_children_type (view));
gimp_data_factory_view_get_child_type (view));
if (data &&
gimp_data_is_deletable (data) &&
@@ -288,7 +288,7 @@ data_edit_cmd_callback (GimpAction *action,
data = (GimpData *)
gimp_context_get_by_type (context,
gimp_data_factory_view_get_children_type (view));
gimp_data_factory_view_get_child_type (view));
if (data && gimp_data_factory_view_have (view, GIMP_OBJECT (data)))
{

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DATA_COMMANDS_H__
#define __DATA_COMMANDS_H__
#pragma once
void data_open_as_image_cmd_callback (GimpAction *action,
@@ -43,6 +42,3 @@ void data_refresh_cmd_callback (GimpAction *action,
void data_edit_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __DATA_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DATA_EDITOR_COMMANDS_H__
#define __DATA_EDITOR_COMMANDS_H__
#pragma once
void data_editor_edit_active_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __DATA_EDITOR_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DEBUG_ACTIONS_H__
#define __DEBUG_ACTIONS_H__
#pragma once
void debug_actions_setup (GimpActionGroup *group);
void debug_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __DEBUG_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DEBUG_COMMANDS_H__
#define __DEBUG_COMMANDS_H__
#pragma once
void debug_gtk_inspector_cmd_callback (GimpAction *action,
@@ -40,6 +39,3 @@ void debug_dump_keyboard_shortcuts_cmd_callback (GimpAction *action,
void debug_dump_attached_data_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __DEBUG_COMMANDS_H__ */

View File

@@ -89,12 +89,12 @@ const GimpStringActionEntry dialogs_dockable_actions[] =
"gimp-channel-list",
GIMP_HELP_CHANNEL_DIALOG },
{ "dialogs-vectors", GIMP_ICON_DIALOG_PATHS,
{ "dialogs-paths", GIMP_ICON_DIALOG_PATHS,
NC_("dialogs-action", "_Paths Dialog"),
NC_("dialogs-action", "_Paths"),
{ NULL },
NC_("dialogs-action", "Open the paths dialog"),
"gimp-vectors-list",
"gimp-path-list",
GIMP_HELP_PATH_DIALOG },
{ "dialogs-indexed-palette", GIMP_ICON_COLORMAP,

View File

@@ -15,9 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DIALOGS_ACTIONS_H__
#define __DIALOGS_ACTIONS_H__
#pragma once
/* this check is needed for the extern declaration below to be correct */
#ifndef __GIMP_ACTION_GROUP_H__
@@ -33,6 +31,3 @@ void dialogs_actions_update (GimpActionGroup *group,
gpointer data);
gboolean dialogs_actions_toolbox_exists (Gimp *gimp);
#endif /* __DIALOGS_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DIALOGS_COMMANDS_H__
#define __DIALOGS_COMMANDS_H__
#pragma once
void dialogs_create_toplevel_cmd_callback (GimpAction *action,
@@ -25,6 +24,3 @@ void dialogs_create_toplevel_cmd_callback (GimpAction *action,
void dialogs_create_dockable_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __DIALOGS_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DOCK_ACTIONS_H__
#define __DOCK_ACTIONS_H__
#pragma once
void dock_actions_setup (GimpActionGroup *group);
void dock_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __DOCK_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DOCK_COMMANDS_H__
#define __DOCK_COMMANDS_H__
#pragma once
void dock_toggle_image_menu_cmd_callback (GimpAction *action,
@@ -25,6 +24,3 @@ void dock_toggle_image_menu_cmd_callback (GimpAction *action,
void dock_toggle_auto_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __DOCK_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DOCKABLE_ACTIONS_H__
#define __DOCKABLE_ACTIONS_H__
#pragma once
void dockable_actions_setup (GimpActionGroup *group);
void dockable_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __DOCKABLE_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DOCKABLE_COMMANDS_H__
#define __DOCKABLE_COMMANDS_H__
#pragma once
void dockable_add_tab_cmd_callback (GimpAction *action,
@@ -44,6 +43,3 @@ void dockable_tab_style_cmd_callback (GimpAction *action,
void dockable_show_button_bar_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __DOCKABLE_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DOCUMENTS_ACTIONS_H__
#define __DOCUMENTS_ACTIONS_H__
#pragma once
void documents_actions_setup (GimpActionGroup *group);
void documents_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __DOCUMENTS_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DOCUMENTS_COMMANDS_H__
#define __DOCUMENTS_COMMANDS_H__
#pragma once
void documents_open_cmd_callback (GimpAction *action,
@@ -49,6 +48,3 @@ void documents_reload_previews_cmd_callback (GimpAction *action,
void documents_remove_dangling_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __DOCUMENTS_COMMANDS_H__ */

View File

@@ -174,34 +174,34 @@ drawable_actions_update (GimpActionGroup *group,
{
GimpItem *item;
if (gimp_item_get_visible (iter->data))
has_visible = TRUE;
if (gimp_item_can_lock_content (iter->data))
{
if (! gimp_item_get_lock_content (iter->data))
locked = FALSE;
can_lock = TRUE;
}
if (gimp_item_can_lock_position (iter->data))
{
if (! gimp_item_get_lock_position (iter->data))
locked_pos = FALSE;
can_lock_pos = TRUE;
}
if (gimp_viewable_get_children (GIMP_VIEWABLE (iter->data)))
none_children = FALSE;
if (! gimp_drawable_is_rgb (iter->data))
all_rgb = FALSE;
if (GIMP_IS_LAYER_MASK (iter->data))
item = GIMP_ITEM (gimp_layer_mask_get_layer (GIMP_LAYER_MASK (iter->data)));
else
item = GIMP_ITEM (iter->data);
if (gimp_item_get_visible (item))
has_visible = TRUE;
if (gimp_item_can_lock_content (item))
{
if (! gimp_item_get_lock_content (item))
locked = FALSE;
can_lock = TRUE;
}
if (gimp_item_can_lock_position (item))
{
if (! gimp_item_get_lock_position (item))
locked_pos = FALSE;
can_lock_pos = TRUE;
}
if (gimp_viewable_get_children (GIMP_VIEWABLE (item)))
none_children = FALSE;
if (! gimp_drawable_is_rgb (iter->data))
all_rgb = FALSE;
if (gimp_item_is_content_locked (item, NULL))
all_writable = FALSE;

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DRAWABLE_ACTIONS_H__
#define __DRAWABLE_ACTIONS_H__
#pragma once
void drawable_actions_setup (GimpActionGroup *group);
void drawable_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __DRAWABLE_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DRAWABLE_COMMANDS_H__
#define __DRAWABLE_COMMANDS_H__
#pragma once
void drawable_equalize_cmd_callback (GimpAction *action,
@@ -42,6 +41,3 @@ void drawable_flip_cmd_callback (GimpAction *action,
void drawable_rotate_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __DRAWABLE_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DYNAMICS_ACTIONS_H__
#define __DYNAMICS_ACTIONS_H__
#pragma once
void dynamics_actions_setup (GimpActionGroup *group);
void dynamics_actions_update (GimpActionGroup *group,
gpointer user_data);
#endif /* __DYNAMICS_ACTIONS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __DYNAMICS_EDITOR_ACTIONS_H__
#define __DYNAMICS_EDITOR_ACTIONS_H__
#pragma once
void dynamics_editor_actions_setup (GimpActionGroup *group);
void dynamics_editor_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __DYNAMICS_EDITOR_ACTIONS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __EDIT_ACTIONS_H__
#define __EDIT_ACTIONS_H__
#pragma once
void edit_actions_setup (GimpActionGroup *group);
void edit_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __EDIT_ACTIONS_H__ */

View File

@@ -41,7 +41,7 @@
#include "core/gimpimage.h"
#include "core/gimpimage-undo.h"
#include "vectors/gimppath-import.h"
#include "path/gimppath-import.h"
#include "widgets/gimpclipboard.h"
#include "widgets/gimphelp-ids.h"

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __EDIT_COMMANDS_H__
#define __EDIT_COMMANDS_H__
#pragma once
void edit_undo_cmd_callback (GimpAction *action,
@@ -71,6 +70,3 @@ void edit_clear_cmd_callback (GimpAction *action,
void edit_fill_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __EDIT_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __ERROR_CONSOLE_ACIONS_H__
#define __ERROR_CONSOLE_ACIONS_H__
#pragma once
void error_console_actions_setup (GimpActionGroup *group);
void error_console_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __ERROR_CONSOLE_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __ERROR_CONSOLE_COMMANDS_H__
#define __ERROR_CONSOLE_COMMANDS_H__
#pragma once
void error_console_clear_cmd_callback (GimpAction *action,
@@ -38,6 +37,3 @@ void error_console_highlight_warning_cmd_callback (GimpAction *action,
void error_console_highlight_info_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __ERROR_CONSOLE_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __FILE_ACTIONS_H__
#define __FILE_ACTIONS_H__
#pragma once
void file_actions_setup (GimpActionGroup *group);
void file_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __FILE_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __FILE_COMMANDS_H__
#define __FILE_COMMANDS_H__
#pragma once
void file_open_cmd_callback (GimpAction *action,
@@ -58,6 +57,3 @@ void file_quit_cmd_callback (GimpAction *action,
void file_file_open_dialog (Gimp *gimp,
GFile *file,
GtkWidget *parent);
#endif /* __FILE_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __FILTERS_ACTIONS_H__
#define __FILTERS_ACTIONS_H__
#pragma once
void filters_actions_setup (GimpActionGroup *group);
void filters_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __FILTERS_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __FILTERS_COMMANDS_H__
#define __FILTERS_COMMANDS_H__
#pragma once
void filters_apply_cmd_callback (GimpAction *action,
@@ -37,6 +36,3 @@ void filters_run_procedure (Gimp *gimp,
GimpDisplay *display,
GimpProcedure *procedure,
GimpRunMode run_mode);
#endif /* __FILTERS_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __FONTS_ACTIONS_H__
#define __FONTS_ACTIONS_H__
#pragma once
void fonts_actions_setup (GimpActionGroup *group);
void fonts_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __FONTS_ACTIONS_H__ */

View File

@@ -18,9 +18,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __GIMP_GEGL_PROCEDURE_H__
#define __GIMP_GEGL_PROCEDURE_H__
#pragma once
#include "pdb/gimpprocedure.h"
@@ -68,5 +66,3 @@ GimpProcedure * gimp_gegl_procedure_new (Gimp *gimp,
const gchar *icon_name,
const gchar *help_id);
gboolean gimp_gegl_procedure_is_editing_filter (GimpGeglProcedure *procedure);
#endif /* __GIMP_GEGL_PROCEDURE_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __GRADIENT_EDITOR_ACTIONS_H__
#define __GRADIENT_EDITOR_ACTIONS_H__
#pragma once
void gradient_editor_actions_setup (GimpActionGroup *group);
void gradient_editor_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __GRADIENT_EDITOR_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __GRADIENT_EDITOR_COMMANDS_H__
#define __GRADIENT_EDITOR_COMMANDS_H__
#pragma once
enum
@@ -94,6 +93,3 @@ void gradient_editor_blend_opacity_cmd_callback (GimpAction *action,
void gradient_editor_zoom_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __GRADIENT_EDITOR_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __GRADIENTS_ACTIONS_H__
#define __GRADIENTS_ACTIONS_H__
#pragma once
void gradients_actions_setup (GimpActionGroup *group);
void gradients_actions_update (GimpActionGroup *group,
gpointer user_data);
#endif /* __GRADIENT_ACTIONS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __GRADIENTS_COMMANDS_H__
#define __GRADIENTS_COMMANDS_H__
#pragma once
void gradients_save_as_pov_ray_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __GRADIENTS_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __HELP_ACTIONS_H__
#define __HELP_ACTIONS_H__
#pragma once
void help_actions_setup (GimpActionGroup *group);
void help_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __HELP_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __HELP_COMMANDS_H__
#define __HELP_COMMANDS_H__
#pragma once
void help_help_cmd_callback (GimpAction *action,
@@ -25,6 +24,3 @@ void help_help_cmd_callback (GimpAction *action,
void help_context_help_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __HELP_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __IMAGE_ACTIONS_H__
#define __IMAGE_ACTIONS_H__
#pragma once
void image_actions_setup (GimpActionGroup *group);
void image_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __IMAGE_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __IMAGE_COMMANDS_H__
#define __IMAGE_COMMANDS_H__
#pragma once
void image_new_cmd_callback (GimpAction *action,
@@ -106,5 +105,3 @@ void image_softproof_intent_cmd_callback (GimpAction *action,
void image_softproof_bpc_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __IMAGE_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __IMAGES_ACTIONS_H__
#define __IMAGES_ACTIONS_H__
#pragma once
void images_actions_setup (GimpActionGroup *group);
void images_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __IMAGES_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __IMAGES_COMMANDS_H__
#define __IMAGES_COMMANDS_H__
#pragma once
void images_raise_views_cmd_callback (GimpAction *action,
@@ -28,6 +27,3 @@ void images_new_view_cmd_callback (GimpAction *action,
void images_delete_image_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __IMAGES_COMMANDS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __ITEMS_ACTIONS_H__
#define __ITEMS_ACTIONS_H__
#pragma once
void items_actions_setup (GimpActionGroup *group,
@@ -24,6 +23,3 @@ void items_actions_setup (GimpActionGroup *group,
void items_actions_update (GimpActionGroup *group,
const gchar *prefix,
GList *items);
#endif /* __ITEMS_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __ITEMS_COMMANDS_H__
#define __ITEMS_COMMANDS_H__
#pragma once
void items_visible_cmd_callback (GimpAction *action,
@@ -60,7 +59,3 @@ void items_stroke_last_vals_cmd_callback (GimpAction *action,
GimpImage *image,
GList *items,
gpointer data);
#endif /* __ITEMS_COMMANDS_H__ */

View File

@@ -179,16 +179,16 @@ static const GimpActionEntry layers_actions[] =
layers_text_discard_cmd_callback,
GIMP_HELP_LAYER_TEXT_DISCARD },
{ "layers-text-to-vectors", GIMP_ICON_TOOL_TEXT,
{ "layers-text-to-path", GIMP_ICON_TOOL_TEXT,
NC_("layers-action", "Text to _Path"), NULL, { NULL },
NC_("layers-action", "Create paths from text layers"),
layers_text_to_vectors_cmd_callback,
layers_text_to_path_cmd_callback,
GIMP_HELP_LAYER_TEXT_TO_PATH },
{ "layers-text-along-vectors", GIMP_ICON_TOOL_TEXT,
{ "layers-text-along-path", GIMP_ICON_TOOL_TEXT,
NC_("layers-action", "Text alon_g Path"), NULL, { NULL },
NC_("layers-action", "Warp this layer's text along the current path"),
layers_text_along_vectors_cmd_callback,
layers_text_along_path_cmd_callback,
GIMP_HELP_LAYER_TEXT_ALONG_PATH },
{ "layers-resize", GIMP_ICON_OBJECT_RESIZE,
@@ -780,8 +780,8 @@ layers_actions_update (GimpActionGroup *group,
gboolean all_visible = TRUE;
gboolean all_next_visible = TRUE;
gboolean all_masks_shown = TRUE;
gboolean all_masks_disabled = TRUE;
gboolean any_mask_shown = FALSE;
gboolean any_mask_disabled = FALSE;
gboolean all_writable = TRUE;
gboolean all_movable = TRUE;
@@ -816,10 +816,11 @@ layers_actions_update (GimpActionGroup *group,
if (gimp_layer_get_mask (iter->data))
{
have_masks = TRUE;
if (! gimp_layer_get_show_mask (iter->data))
all_masks_shown = FALSE;
if (gimp_layer_get_apply_mask (iter->data))
all_masks_disabled = FALSE;
if (gimp_layer_get_show_mask (iter->data))
any_mask_shown = TRUE;
if (! gimp_layer_get_apply_mask (iter->data))
any_mask_disabled = TRUE;
}
else
{
@@ -1037,9 +1038,9 @@ layers_actions_update (GimpActionGroup *group,
SET_SENSITIVE ("layers-merge-layers", n_selected_layers > 0 && !fs && !ac);
SET_SENSITIVE ("layers-flatten-image", !fs && !ac);
SET_VISIBLE ("layers-text-discard", n_text_layers > 0 && !ac);
SET_VISIBLE ("layers-text-to-vectors", n_text_layers > 0 && !ac);
SET_VISIBLE ("layers-text-along-vectors", text_layer && !ac);
SET_VISIBLE ("layers-text-discard", n_text_layers > 0 && !ac);
SET_VISIBLE ("layers-text-to-path", n_text_layers > 0 && !ac);
SET_VISIBLE ("layers-text-along-path", text_layer && !ac);
SET_SENSITIVE ("layers-resize", n_selected_layers == 1 && all_writable && all_movable && !ac);
SET_SENSITIVE ("layers-resize-to-image", all_writable && all_movable && !ac);
@@ -1082,8 +1083,8 @@ layers_actions_update (GimpActionGroup *group,
SET_SENSITIVE ("layers-mask-disable", n_selected_layers > 0 && !fs && !ac && have_masks);
SET_ACTIVE ("layers-mask-edit", n_selected_layers == 1 && have_masks && gimp_layer_get_edit_mask (layers->data));
SET_ACTIVE ("layers-mask-show", all_masks_shown);
SET_ACTIVE ("layers-mask-disable", all_masks_disabled);
SET_ACTIVE ("layers-mask-show", any_mask_shown);
SET_ACTIVE ("layers-mask-disable", any_mask_disabled);
SET_SENSITIVE ("layers-mask-selection-replace", n_selected_layers && !fs && !ac && have_masks);
SET_SENSITIVE ("layers-mask-selection-add", n_selected_layers && !fs && !ac && have_masks);

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __LAYERS_ACTIONS_H__
#define __LAYERS_ACTIONS_H__
#pragma once
void layers_actions_setup (GimpActionGroup *group);
void layers_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __LAYERS_ACTIONS_H__ */

View File

@@ -39,8 +39,6 @@
#include "core/gimpcontainer.h"
#include "core/gimpcontext.h"
#include "core/gimpdrawable-fill.h"
#include "core/gimpdrawable-filters.h"
#include "core/gimpdrawablefilter.h"
#include "core/gimpgrouplayer.h"
#include "core/gimpimage.h"
#include "core/gimpimage-merge.h"
@@ -57,14 +55,14 @@
#include "core/gimpundostack.h"
#include "core/gimpprogress.h"
#include "path/gimppath.h"
#include "path/gimppath-warp.h"
#include "path/gimpstroke.h"
#include "text/gimptext.h"
#include "text/gimptext-path.h"
#include "text/gimptextlayer.h"
#include "vectors/gimppath.h"
#include "vectors/gimppath-warp.h"
#include "vectors/gimpstroke.h"
#include "widgets/gimpaction.h"
#include "widgets/gimpdock.h"
#include "widgets/gimphelp-ids.h"
@@ -447,6 +445,7 @@ layers_new_last_vals_cmd_callback (GimpAction *action,
ngettext ("New layer",
"New layers",
n_layers > 0 ? n_layers : 1));
for (iter = layers; iter || run_once ; iter = iter ? iter->next : NULL)
{
GimpLayer *parent;
@@ -492,11 +491,13 @@ layers_new_last_vals_cmd_callback (GimpAction *action,
gimp_image_add_layer (image, layer, parent, position, TRUE);
new_layers = g_list_prepend (new_layers, layer);
}
gimp_image_set_selected_layers (image, new_layers);
gimp_image_undo_group_end (image);
g_list_free (layers);
g_list_free (new_layers);
gimp_image_undo_group_end (image);
gimp_image_flush (image);
}
@@ -550,6 +551,7 @@ layers_new_group_cmd_callback (GimpAction *action,
layers = g_list_copy (layers);
n_layers = g_list_length (layers);
run_once = (n_layers == 0);
gimp_image_undo_group_start (image,
GIMP_UNDO_GROUP_LAYER_ADD,
ngettext ("New layer group",
@@ -588,11 +590,13 @@ layers_new_group_cmd_callback (GimpAction *action,
}
gimp_image_set_selected_layers (image, new_layers);
gimp_image_undo_group_end (image);
gimp_image_flush (image);
g_list_free (layers);
g_list_free (new_layers);
gimp_image_undo_group_end (image);
gimp_image_flush (image);
}
void
@@ -665,7 +669,6 @@ layers_raise_cmd_callback (GimpAction *action,
}
else
{
gimp_image_flush (image);
g_list_free (raised_layers);
return;
}
@@ -680,11 +683,10 @@ layers_raise_cmd_callback (GimpAction *action,
raised_layers = g_list_reverse (raised_layers);
for (iter = raised_layers; iter; iter = iter->next)
gimp_image_raise_item (image, iter->data, NULL);
gimp_image_flush (image);
gimp_image_undo_group_end (image);
g_list_free (raised_layers);
gimp_image_undo_group_end (image);
gimp_image_flush (image);
}
void
@@ -716,10 +718,10 @@ layers_raise_to_top_cmd_callback (GimpAction *action,
for (iter = raised_layers; iter; iter = iter->next)
gimp_image_raise_item_to_top (image, iter->data);
gimp_image_flush (image);
gimp_image_undo_group_end (image);
g_list_free (raised_layers);
gimp_image_undo_group_end (image);
gimp_image_flush (image);
}
void
@@ -746,7 +748,6 @@ layers_lower_cmd_callback (GimpAction *action,
}
else
{
gimp_image_flush (image);
g_list_free (lowered_layers);
return;
}
@@ -761,10 +762,10 @@ layers_lower_cmd_callback (GimpAction *action,
for (iter = lowered_layers; iter; iter = iter->next)
gimp_image_lower_item (image, iter->data, NULL);
gimp_image_flush (image);
gimp_image_undo_group_end (image);
g_list_free (lowered_layers);
gimp_image_undo_group_end (image);
gimp_image_flush (image);
}
void
@@ -798,10 +799,10 @@ layers_lower_to_bottom_cmd_callback (GimpAction *action,
for (iter = lowered_layers; iter; iter = iter->next)
gimp_image_lower_item_to_bottom (image, iter->data);
gimp_image_flush (image);
gimp_image_undo_group_end (image);
g_list_free (lowered_layers);
gimp_image_undo_group_end (image);
gimp_image_flush (image);
}
void
@@ -821,8 +822,7 @@ layers_duplicate_cmd_callback (GimpAction *action,
_("Duplicate layers"));
for (iter = layers; iter; iter = iter->next)
{
GimpLayer *new_layer;
GimpContainer *filters;
GimpLayer *new_layer;
new_layer = GIMP_LAYER (gimp_item_duplicate (GIMP_ITEM (iter->data),
G_TYPE_FROM_INSTANCE (iter->data)));
@@ -837,39 +837,6 @@ layers_duplicate_cmd_callback (GimpAction *action,
TRUE);
gimp_drawable_enable_resize_undo (GIMP_DRAWABLE (new_layer));
new_layers = g_list_prepend (new_layers, new_layer);
/* Import any attached layer effects */
filters = gimp_drawable_get_filters (GIMP_DRAWABLE (iter->data));
if (gimp_container_get_n_children (filters) > 0)
{
GList *filter_list;
GimpContainer *filters;
filters = gimp_drawable_get_filters (GIMP_DRAWABLE (iter->data));
for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list;
filter_list = g_list_previous (filter_list))
{
if (GIMP_IS_DRAWABLE_FILTER (filter_list->data))
{
GimpDrawableFilter *old_filter = filter_list->data;
GimpDrawableFilter *filter;
filter =
gimp_drawable_filter_duplicate (GIMP_DRAWABLE (new_layer),
old_filter);
if (filter != NULL)
{
gimp_drawable_filter_apply (filter, NULL);
gimp_drawable_filter_commit (filter, TRUE, NULL, FALSE);
gimp_drawable_filter_layer_mask_freeze (filter);
g_object_unref (filter);
}
}
}
}
}
gimp_image_set_selected_layers (image, new_layers);
@@ -922,6 +889,7 @@ layers_merge_down_cmd_callback (GimpAction *action,
g_clear_error (&error);
return;
}
gimp_image_set_selected_layers (image, layers);
g_list_free (layers);
@@ -1013,6 +981,7 @@ layers_merge_group_cmd_callback (GimpAction *action,
gimp_image_undo_group_end (image);
g_list_free (merge_layers);
gimp_image_flush (image);
}
@@ -1072,6 +1041,7 @@ layers_delete_cmd_callback (GimpAction *action,
gimp_image_undo_group_end (image);
g_list_free (removed_layers);
gimp_image_flush (image);
}
@@ -1094,18 +1064,20 @@ layers_text_discard_cmd_callback (GimpAction *action,
}
void
layers_text_to_vectors_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data)
layers_text_to_path_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data)
{
GimpImage *image;
GList *layers;
GList *iter;
gboolean path_added = FALSE;
return_if_no_layers (image, layers, data);
/* TODO: have the proper undo group. */
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_PATHS_IMPORT,
_("Add Paths"));
for (iter = layers; iter; iter = iter->next)
{
GimpLayer *layer = iter->data;
@@ -1122,16 +1094,20 @@ layers_text_to_vectors_cmd_callback (GimpAction *action,
gimp_image_add_path (image, path,
GIMP_IMAGE_ACTIVE_PARENT, -1, TRUE);
gimp_image_flush (image);
path_added = TRUE;
}
}
gimp_image_undo_group_end (image);
if (path_added)
gimp_image_flush (image);
}
void
layers_text_along_vectors_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data)
layers_text_along_path_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data)
{
GimpImage *image;
GList *layers;
@@ -1260,6 +1236,7 @@ layers_resize_to_image_cmd_callback (GimpAction *action,
if (g_list_length (layers) > 1)
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_ITEM_RESIZE,
_("Layers to Image Size"));
for (iter = layers; iter; iter = iter->next)
gimp_layer_resize_to_image (iter->data,
action_data_get_context (data),
@@ -1445,8 +1422,9 @@ layers_crop_to_content_cmd_callback (GimpAction *action,
break;
}
}
gimp_image_flush (image);
gimp_image_undo_group_end (image);
gimp_image_flush (image);
}
void
@@ -1574,7 +1552,6 @@ layers_mask_add_last_vals_cmd_callback (GimpAction *action,
}
gimp_image_undo_group_end (image);
gimp_image_flush (image);
}
@@ -1601,6 +1578,7 @@ layers_mask_apply_cmd_callback (GimpAction *action,
! gimp_item_is_content_locked (GIMP_ITEM (iter->data), NULL))))
break;
}
if (iter == NULL)
/* No layers or none have applicable masks. */
return;
@@ -1675,43 +1653,47 @@ layers_mask_show_cmd_callback (GimpAction *action,
GimpImage *image;
GList *layers;
GList *iter;
gboolean active = g_variant_get_boolean (value);
gboolean have_masks = FALSE;
gboolean active = g_variant_get_boolean (value);
gint n_masks = 0;
return_if_no_layers (image, layers, data);
for (iter = layers; iter; iter = iter->next)
{
if (gimp_layer_get_mask (iter->data))
{
have_masks = TRUE;
/* A bit of tricky to handle multiple and diverse layers with
* a toggle action (with only binary state).
* In non-active state, we will consider sets of both shown
* and hidden masks as ok and exits. This allows us to switch
* the action "active" state without actually changing
* individual masks state without explicit user request.
*/
if (! active && ! gimp_layer_get_show_mask (iter->data))
return;
if (active && gimp_layer_get_show_mask (iter->data))
{
/* if switching "show mask" on, and any selected layer's
* mask is already visible, bail out because that's
* exactly the logic we use in the ui for multile
* visible layer masks.
*/
return;
}
if (gimp_layer_get_show_mask (iter->data) != active)
n_masks++;
}
}
if (! have_masks)
if (n_masks == 0)
return;
gimp_image_undo_group_start (image,
GIMP_UNDO_GROUP_LAYER_ADD,
_("Show Layer Masks"));
if (n_masks > 1)
gimp_image_undo_group_start (image,
GIMP_UNDO_GROUP_LAYER_ADD,
_("Show Layer Masks"));
for (iter = layers; iter; iter = iter->next)
{
if (gimp_layer_get_mask (iter->data))
{
gimp_layer_set_show_mask (iter->data, active, TRUE);
}
gimp_layer_set_show_mask (iter->data, active, TRUE);
}
if (n_masks > 1)
gimp_image_undo_group_end (image);
gimp_image_flush (image);
gimp_image_undo_group_end (image);
}
void
@@ -1722,43 +1704,47 @@ layers_mask_disable_cmd_callback (GimpAction *action,
GimpImage *image;
GList *layers;
GList *iter;
gboolean active = g_variant_get_boolean (value);
gboolean have_masks = FALSE;
gboolean active = g_variant_get_boolean (value);
gint n_masks = 0;
return_if_no_layers (image, layers, data);
for (iter = layers; iter; iter = iter->next)
{
if (gimp_layer_get_mask (iter->data))
{
have_masks = TRUE;
/* A bit of tricky to handle multiple and diverse layers with
* a toggle action (with only binary state).
* In non-active state, we will consider sets of both enabled
* and disabled masks as ok and exits. This allows us to
* switch the action "active" state without actually changing
* individual masks state without explicit user request.
*/
if (! active && gimp_layer_get_apply_mask (iter->data))
return;
if (active && ! gimp_layer_get_apply_mask (iter->data))
{
/* if switching "disable mask" on, and any selected
* layer's mask is already disabled, bail out because
* that's exactly the logic we use in the ui for multile
* disabled layer masks.
*/
return;
}
if ((! gimp_layer_get_apply_mask (iter->data)) != active)
n_masks++;
}
}
if (! have_masks)
if (n_masks == 0)
return;
gimp_image_undo_group_start (image,
GIMP_UNDO_GROUP_LAYER_ADD,
_("Disable Layer Masks"));
if (n_masks > 1)
gimp_image_undo_group_start (image,
GIMP_UNDO_GROUP_LAYER_ADD,
_("Disable Layer Masks"));
for (iter = layers; iter; iter = iter->next)
{
if (gimp_layer_get_mask (iter->data))
{
gimp_layer_set_apply_mask (iter->data, ! active, TRUE);
}
gimp_layer_set_apply_mask (iter->data, ! active, TRUE);
}
if (n_masks > 1)
gimp_image_undo_group_end (image);
gimp_image_flush (image);
gimp_image_undo_group_end (image);
}
void
@@ -1801,10 +1787,12 @@ layers_mask_to_selection_cmd_callback (GimpAction *action,
C_("undo-type", "Intersect Masks with Selection"));
break;
}
gimp_channel_combine_items (gimp_image_get_mask (image),
masks, operation);
gimp_image_flush (image);
g_list_free (masks);
gimp_image_flush (image);
}
}
@@ -1883,8 +1871,10 @@ layers_alpha_to_selection_cmd_callback (GimpAction *action,
C_("undo-type", "Intersect Alpha with Selection"));
break;
}
gimp_channel_combine_items (gimp_image_get_mask (image),
layers, operation);
gimp_image_flush (image);
if (gimp_channel_is_empty (gimp_image_get_mask (image)))
@@ -2044,6 +2034,7 @@ layers_blend_space_cmd_callback (GimpAction *action,
gimp_image_undo_group_end (image);
g_list_free (update_layers);
gimp_image_flush (image);
}
}
@@ -2097,6 +2088,7 @@ layers_composite_space_cmd_callback (GimpAction *action,
gimp_image_undo_group_end (image);
g_list_free (update_layers);
gimp_image_flush (image);
}
}
@@ -2150,6 +2142,7 @@ layers_composite_mode_cmd_callback (GimpAction *action,
gimp_image_undo_group_end (image);
g_list_free (update_layers);
gimp_image_flush (image);
}
}
@@ -2226,6 +2219,7 @@ layers_lock_alpha_cmd_callback (GimpAction *action,
gimp_image_undo_group_start (image,
GIMP_UNDO_GROUP_LAYER_LOCK_ALPHA,
lock_alpha ? _("Lock alpha channels") : _("Unlock alpha channels"));
for (iter = layers; iter; iter = iter->next)
{
if (gimp_layer_can_lock_alpha (iter->data))
@@ -2234,6 +2228,7 @@ layers_lock_alpha_cmd_callback (GimpAction *action,
gimp_layer_set_lock_alpha (iter->data, lock_alpha, TRUE);
}
}
gimp_image_undo_group_end (image);
gimp_image_flush (image);
}
@@ -2474,7 +2469,6 @@ layers_edit_attributes_callback (GtkWidget *dialog,
gimp_layer_set_lock_alpha (layer, layer_lock_alpha, TRUE);
gimp_image_undo_group_end (image);
gimp_image_flush (image);
}
@@ -2510,6 +2504,7 @@ layers_add_mask_callback (GtkWidget *dialog,
gimp_image_undo_group_start (image,
GIMP_UNDO_GROUP_LAYER_ADD,
_("Add Layer Masks"));
for (iter = layers; iter; iter = iter->next)
{
mask = gimp_layer_create_mask (iter->data,
@@ -2532,6 +2527,7 @@ layers_add_mask_callback (GtkWidget *dialog,
gimp_image_undo_group_end (image);
gimp_image_flush (image);
gtk_widget_destroy (dialog);
}

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __LAYERS_COMMANDS_H__
#define __LAYERS_COMMANDS_H__
#pragma once
void layers_edit_cmd_callback (GimpAction *action,
@@ -78,10 +77,10 @@ void layers_delete_cmd_callback (GimpAction *action,
void layers_text_discard_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
void layers_text_to_vectors_cmd_callback (GimpAction *action,
void layers_text_to_path_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
void layers_text_along_vectors_cmd_callback (GimpAction *action,
void layers_text_along_path_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
@@ -165,6 +164,3 @@ void layers_lock_alpha_cmd_callback (GimpAction *action,
void layers_color_tag_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __LAYERS_COMMANDS_H__ */

View File

@@ -79,14 +79,14 @@ libappactions_sources = [
'text-tool-commands.c',
'tool-options-actions.c',
'tool-options-commands.c',
'tool-path-actions.c',
'tool-path-commands.c',
'tool-preset-editor-actions.c',
'tool-preset-editor-commands.c',
'tool-presets-actions.c',
'tool-presets-commands.c',
'tools-actions.c',
'tools-commands.c',
'vector-toolpath-actions.c',
'vector-toolpath-commands.c',
'view-actions.c',
'view-commands.c',
'window-actions.c',

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __MYPAINT_BRUSHES_ACTIONS_H__
#define __MYPAINT_BRUSHES_ACTIONS_H__
#pragma once
void mypaint_brushes_actions_setup (GimpActionGroup *group);
void mypaint_brushes_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __MYPAINT_BRUSHES_ACTIONS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __PALETTE_EDITOR_ACTIONS_H__
#define __PALETTE_EDITOR_ACTIONS_H__
#pragma once
void palette_editor_actions_setup (GimpActionGroup *group);
void palette_editor_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __PALETTE_EDITOR_ACTIONS_H__ */

View File

@@ -79,8 +79,17 @@ palette_editor_delete_color_cmd_callback (GimpAction *action,
if (data_editor->data_editable && editor->color)
{
GimpPalette *palette = GIMP_PALETTE (data_editor->data);
gint index;
index = gimp_palette_get_entry_position (palette, editor->color);
gimp_palette_delete_entry (palette, editor->color);
if (index >= gimp_palette_get_n_colors (palette))
index = gimp_palette_get_n_colors (palette) - 1;
gimp_palette_view_select_entry (GIMP_PALETTE_VIEW (editor->view),
gimp_palette_get_entry (palette, index));
}
}

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __PALETTE_EDITOR_COMMANDS_H__
#define __PALETTE_EDITOR_COMMANDS_H__
#pragma once
void palette_editor_edit_color_cmd_callback (GimpAction *action,
@@ -32,6 +31,3 @@ void palette_editor_delete_color_cmd_callback (GimpAction *action,
void palette_editor_zoom_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __PALETTE_EDITOR_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __PALETTES_ACTIONS_H__
#define __PALETTES_ACTIONS_H__
#pragma once
void palettes_actions_setup (GimpActionGroup *group);
void palettes_actions_update (GimpActionGroup *group,
gpointer user_data);
#endif /* __PALETTES_ACTIONS_H__ */

View File

@@ -117,9 +117,7 @@ palettes_merge_callback (GtkWidget *widget,
context = gimp_container_view_get_context (editor->view);
factory = gimp_data_factory_view_get_data_factory (view);
gimp_container_view_get_selected (editor->view, &selected, NULL);
if (g_list_length (selected) < 2)
if (gimp_container_view_get_selected (editor->view, &selected) < 2)
{
gimp_message_literal (context->gimp,
G_OBJECT (editor), GIMP_MESSAGE_WARNING,

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __PALETTES_COMMANDS_H__
#define __PALETTES_COMMANDS_H__
#pragma once
void palettes_import_cmd_callback (GimpAction *action,
@@ -25,6 +24,3 @@ void palettes_import_cmd_callback (GimpAction *action,
void palettes_merge_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __PALETTES_COMMANDS_H__ */

View File

@@ -46,7 +46,7 @@ static const GimpActionEntry paths_actions[] =
NC_("paths-action", "Edit Pa_th"), NULL, { NULL },
NC_("paths-action", "Edit the active path"),
paths_edit_cmd_callback,
GIMP_HELP_TOOL_VECTORS },
GIMP_HELP_TOOL_PATH },
{ "paths-edit-attributes", GIMP_ICON_EDIT,
NC_("paths-action", "_Edit Path Attributes..."), NULL, { NULL },

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __PATHS_ACTIONS_H__
#define __PATHS_ACTIONS_H__
#pragma once
void paths_actions_setup (GimpActionGroup *group);
void paths_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __PATHS_ACTIONS_H__ */

View File

@@ -44,9 +44,9 @@
#include "pdb/gimppdb.h"
#include "pdb/gimpprocedure.h"
#include "vectors/gimppath.h"
#include "vectors/gimppath-export.h"
#include "vectors/gimppath-import.h"
#include "path/gimppath.h"
#include "path/gimppath-export.h"
#include "path/gimppath-import.h"
#include "widgets/gimpaction.h"
#include "widgets/gimpclipboard.h"
@@ -54,7 +54,7 @@
#include "display/gimpdisplay.h"
#include "tools/gimpvectortool.h"
#include "tools/gimppathtool.h"
#include "tools/tool_manager.h"
#include "dialogs/dialogs.h"
@@ -125,10 +125,10 @@ paths_edit_cmd_callback (GimpAction *action,
active_tool = tool_manager_get_active (image->gimp);
if (! GIMP_IS_VECTOR_TOOL (active_tool))
if (! GIMP_IS_PATH_TOOL (active_tool))
{
GimpToolInfo *tool_info = gimp_get_tool_info (image->gimp,
"gimp-vector-tool");
GimpToolInfo *tool_info = gimp_get_tool_info (image->gimp,
"gimp-path-tool");
if (GIMP_IS_TOOL_INFO (tool_info))
{
@@ -137,8 +137,8 @@ paths_edit_cmd_callback (GimpAction *action,
}
}
if (GIMP_IS_VECTOR_TOOL (active_tool))
gimp_vector_tool_set_vectors (GIMP_VECTOR_TOOL (active_tool), paths->data);
if (GIMP_IS_PATH_TOOL (active_tool))
gimp_path_tool_set_path (GIMP_PATH_TOOL (active_tool), paths->data);
}
void
@@ -924,8 +924,8 @@ paths_import_callback (GtkWidget *dialog,
GimpImage *image,
GFile *file,
GFile *import_folder,
gboolean merge_vectors,
gboolean scale_vectors,
gboolean merge_paths,
gboolean scale_paths,
gpointer user_data)
{
GimpDialogConfig *config = GIMP_DIALOG_CONFIG (image->gimp->config);
@@ -937,8 +937,8 @@ paths_import_callback (GtkWidget *dialog,
g_object_set (config,
"path-import-path", path,
"path-import-merge", merge_vectors,
"path-import-scale", scale_vectors,
"path-import-merge", merge_paths,
"path-import-scale", scale_paths,
NULL);
if (path)

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __PATHS_COMMANDS_H__
#define __PATHS_COMMANDS_H__
#pragma once
void paths_edit_cmd_callback (GimpAction *action,
@@ -57,9 +56,9 @@ void paths_merge_visible_cmd_callback (GimpAction *action,
void paths_to_selection_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
void paths_selection_to_paths_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
void paths_selection_to_paths_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
void paths_fill_cmd_callback (GimpAction *action,
GVariant *value,
@@ -104,6 +103,3 @@ void paths_color_tag_cmd_callback (GimpAction *action,
void paths_select_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __PATHS_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __PATTERNS_ACTIONS_H__
#define __PATTERNS_ACTIONS_H__
#pragma once
void patterns_actions_setup (GimpActionGroup *group);
void patterns_actions_update (GimpActionGroup *group,
gpointer user_data);
#endif /* __PATTERNS_ACTIONS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __PLUG_IN_ACTIONS_H__
#define __PLUG_IN_ACTIONS_H__
#pragma once
void plug_in_actions_setup (GimpActionGroup *group);
void plug_in_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __PLUG_IN_ACTIONS_H__ */

View File

@@ -102,7 +102,7 @@ plug_in_run_cmd_callback (GimpAction *action,
context = gimp_container_view_get_context (editor->view);
object = gimp_context_get_by_type (context,
gimp_container_get_children_type (container));
gimp_container_get_child_type (container));
args = procedure_commands_get_data_args (procedure, object);
}
@@ -119,14 +119,16 @@ plug_in_run_cmd_callback (GimpAction *action,
{
GimpItemTreeView *view = GIMP_ITEM_TREE_VIEW (data);
GimpImage *image;
GList *items;
GList *items = NULL;
image = gimp_item_tree_view_get_image (view);
if (image)
items = GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_selected_items (image);
else
items = NULL;
{
GType item_type = GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->item_type;
items = gimp_image_get_selected_items (image, item_type);
}
args = procedure_commands_get_items_args (procedure, image, items);
}

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __PLUG_IN_COMMANDS_H__
#define __PLUG_IN_COMMANDS_H__
#pragma once
void plug_in_run_cmd_callback (GimpAction *action,
@@ -26,6 +25,3 @@ void plug_in_run_cmd_callback (GimpAction *action,
void plug_in_reset_all_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __PLUG_IN_COMMANDS_H__ */

View File

@@ -289,14 +289,14 @@ procedure_commands_get_display_args (GimpProcedure *procedure,
return NULL;
}
}
else if (GIMP_IS_PARAM_SPEC_CORE_OBJECT_ARRAY (procedure->args[n_args]))
else if (gimp_value_array_length (args) > n_args &&
GIMP_IS_PARAM_SPEC_CORE_OBJECT_ARRAY (procedure->args[n_args]))
{
GimpDrawable **drawables = NULL;
gint n_drawables;
GList *iter;
gint i;
n_drawables = g_list_length (drawables_list);
drawables = g_new0 (GimpDrawable *, n_drawables + 1);

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __PROCEDURE_COMMANDS_H__
#define __PROCEDURE_COMMANDS_H__
#pragma once
GimpValueArray * procedure_commands_get_run_mode_arg (GimpProcedure *procedure);
@@ -41,6 +40,3 @@ gboolean procedure_commands_run_procedure_async (GimpProcedure *procedure,
GimpRunMode run_mode,
GimpValueArray *args,
GimpDisplay *display);
#endif /* __PROCEDURE_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __QUICK_MASK_ACTIONS_H__
#define __QUICK_MASK_ACTIONS_H__
#pragma once
void quick_mask_actions_setup (GimpActionGroup *group);
void quick_mask_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __QUICK_MASK_ACTIONS_H__ */

View File

@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __QUICK_MASK_COMMANDS_H__
#define __QUICK_MASK_COMMANDS_H__
#pragma once
void quick_mask_toggle_cmd_callback (GimpAction *action,
@@ -28,6 +27,3 @@ void quick_mask_invert_cmd_callback (GimpAction *action,
void quick_mask_configure_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __QUICK_MASK_COMMANDS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __SAMPLE_POINTS_ACIONS_H__
#define __SAMPLE_POINTS_ACIONS_H__
#pragma once
void sample_points_actions_setup (GimpActionGroup *group);
void sample_points_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __SAMPLE_POINTS_ACTIONS_H__ */

View File

@@ -15,13 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __SAMPLE_POINTS_COMMANDS_H__
#define __SAMPLE_POINTS_COMMANDS_H__
#pragma once
void sample_points_sample_merged_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data);
#endif /* __SAMPLE_POINTS_COMMANDS_H__ */

View File

@@ -46,6 +46,12 @@ static const GimpActionEntry select_actions[] =
select_all_cmd_callback,
GIMP_HELP_SELECTION_ALL },
{ "select-layers", NULL,
NC_("select-action", "_Layers"), NULL, { "<shift>A", NULL },
NC_("select-action", "Select all highlighted layers"),
select_layer_cmd_callback,
GIMP_HELP_SELECTION_LAYERS },
{ "select-none", GIMP_ICON_SELECTION_NONE,
NC_("select-action", "_None"), NULL, { "<primary><shift>A", NULL },
NC_("select-action", "Dismiss the selection"),
@@ -186,6 +192,7 @@ select_actions_update (GimpActionGroup *group,
gimp_action_group_set_action_sensitive (group, action, (condition) != 0, NULL)
SET_SENSITIVE ("select-all", image && ! sel_all);
SET_SENSITIVE ("select-layers", image && ! sel_all);
SET_SENSITIVE ("select-none", image && sel);
SET_SENSITIVE ("select-invert", image);

Some files were not shown because too many files have changed in this diff Show More