6 years agolayer modes: add soft light blend mode
Andrew Chadwick [Wed, 31 Oct 2012 19:08:58 +0000 (19:08 +0000)]
layer modes: add soft light blend mode

Add the svg:soft-light operator, specified as being the W3C SVG one(s)
by the OpenRaster specification.

The current SVGCompositing reference has an incorrect derivation for
working in premultiplied alpha, so let's not implement that for now. The
nonpremult math is correct and matches the current FXTF one.

6 years agolayer modes: factor out some fix15 arithmetic
Andrew Chadwick [Wed, 31 Oct 2012 19:01:45 +0000 (19:01 +0000)]
layer modes: factor out some fix15 arithmetic

This sort of code is much easier to understand and write without
bitshifts peppering everything. Use inlineable static functions and try
to standardise types and operator names initially; we can get clever
with macros and/or templates later if we need it.

6 years agoupdate default brush
Martin Renold [Wed, 31 Oct 2012 08:27:47 +0000 (09:27 +0100)]
update default brush

Using a brush/eraser pair good for pencil sketches now.

6 years agobrushes: update Deevad's brushset (set #2)
David Revoy [Wed, 31 Oct 2012 08:07:11 +0000 (09:07 +0100)]
brushes: update Deevad's brushset (set #2)

This is Deevad's brushset version 6 done for Mypaint version 1.1.0
This brush kit is released in public domain, so feel free to create
what you want with it.

6 years agowin32: fix unicode problem
Martin Renold [Tue, 30 Oct 2012 19:18:53 +0000 (20:18 +0100)]
win32: fix unicode problem

Fix exception on some systems when saving/loading with non-ascii username.

6 years agolayer modes: add hard light blend mode
Andrew Chadwick [Sun, 28 Oct 2012 02:55:58 +0000 (02:55 +0000)]
layer modes: add hard light blend mode

Add the svg:hard-light operator, specified as being the W3C SVG one by the
OpenRaster specification.

6 years agolayer modes: add overlay blend mode
Andrew Chadwick [Sun, 28 Oct 2012 01:11:23 +0000 (01:11 +0000)]
layer modes: add overlay blend mode

Add the svg:overlay operator, specified as being the W3C SVG one by the
OpenRaster specification.

6 years agotablet detection: switch to whitelist
Martin Renold [Sun, 28 Oct 2012 08:49:37 +0000 (09:49 +0100)]
tablet detection: switch to whitelist

Recent Xorg versions seem to report a pressure axis for a lot of
ordinary mice and keyboards now. Setting them to "screen" mode
produces strange bugs (e.g.

This commit adds a whitelist.

6 years agogtk2 pressure detection stuff
Martin Renold [Sat, 27 Oct 2012 18:33:12 +0000 (20:33 +0200)]
gtk2 pressure detection stuff

ignore another mouse type (spacebar panning doesn't work if enabled)

6 years agobrushlib: Update TODO
Jon Nordby [Tue, 9 Oct 2012 09:59:02 +0000 (11:59 +0200)]
brushlib: Update TODO

6 years agobrushlib: Use expf() instead of exp()
Jon Nordby [Mon, 17 Sep 2012 17:13:08 +0000 (19:13 +0200)]
brushlib: Use expf() instead of exp()

We work with floats, so no point using the double function.
Small speedup on my setup, and clearer profiling data (all uses
of exp/expf() function now shown together).

6 years agoFixed color history regression
John Watson [Fri, 5 Oct 2012 00:56:09 +0000 (17:56 -0700)]
Fixed color history regression

bug 20129 Made color history swap between last used colors during stroke

6 years agoAdd unity labels to number entries in edit Frame window
Manuel Quiñones [Mon, 24 Sep 2012 17:14:22 +0000 (14:14 -0300)]
Add unity labels to number entries in edit Frame window

Use the same abbreviation as GIMP, 'px', and mark it translatable.

Signed-off-by: Manuel Quiñones <>
6 years agofix segfault at startup on linux
Martin Renold [Sun, 23 Sep 2012 10:36:05 +0000 (12:36 +0200)]
fix segfault at startup on linux

6 years agofix #include
Martin Renold [Sun, 23 Sep 2012 10:23:29 +0000 (12:23 +0200)]
fix #include

implicit declaration of snprintf

6 years agoBuild: Return mypaintlib (lib/) in SConscript file
Jon Nordby [Sun, 23 Sep 2012 00:39:03 +0000 (02:39 +0200)]
Build: Return mypaintlib (lib/) in SConscript file

Will hopefully fix the explicit dependency between
mypaintlib (lib/) and brushlib/

6 years agoBuild: Add explicit dependency on brushlib for application
Jon Nordby [Sun, 23 Sep 2012 00:29:37 +0000 (02:29 +0200)]
Build: Add explicit dependency on brushlib for application

6 years agoReplace malloc.h with stdlib.h to allow building on osx.
Clayton Walker [Sun, 23 Sep 2012 00:20:49 +0000 (18:20 -0600)]
Replace malloc.h with stdlib.h to allow building on osx.

6 years agoUpdate build files to work on osx.
Clayton Walker [Sat, 22 Sep 2012 23:58:25 +0000 (17:58 -0600)]
Update build files to work on osx.

6 years agobrushlib: Install the (optional) headers that use glib
Jon Nordby [Sat, 22 Sep 2012 23:58:24 +0000 (01:58 +0200)]
brushlib: Install the (optional) headers that use glib

6 years agobrushlib: fix smudge starting transparent
Martin Renold [Thu, 20 Sep 2012 19:36:32 +0000 (21:36 +0200)]
brushlib: fix smudge starting transparent

Fix a problem where a smudging stroke would suddenly start
with transparency, even in the center of a solid layer.

Fixed by reordering of code: update the smudge color before using
it, instead of after. I'm not sure why it wasn't ordered like that
before, I see no advantage to the old order.

After calling reset() on a brush, the smudge color is set to
zero (transparent). Use the LAST_GETCOLOR_RECENTNESS state (which
is also reset to zero) to detect the initial get_color().

Reordering changes the behaviour of all smudge and watercolor brushes
very slightly, in theory. In practice I was unable to notice any
difference at all.

MyPaint still has a tendency to round down the alpha channel and
thus introduce slight transparency when smudging the same spot really
often, but it is a different problem.

6 years agogtk2 pressure detection stuff
Martin Renold [Thu, 20 Sep 2012 18:15:28 +0000 (20:15 +0200)]
gtk2 pressure detection stuff

clean up debug prints a bit, add another device exception

6 years agodocstring update
Martin Renold [Thu, 20 Sep 2012 16:15:40 +0000 (18:15 +0200)]
docstring update

I respectfully disagree with what was written here :-)

For MyPaint "stroke" and "mouse button" are two entirely unrelated
concepts; we have a somewhat confusing mix of those terms here.

It seems that recent xorg/wacom setups don't send a stylus "button
up" event until pressure is zero, so maybe the result is the same
for most setups (e.g. default click force).

But the real stroke certainly starts before callbacks in
input_stroke_started_observers are called, and it is possible
to make very faint strokes that trigger neither callback.

6 years agobutton action to toggle eraser
Martin Renold [Wed, 19 Sep 2012 11:11:40 +0000 (13:11 +0200)]
button action to toggle eraser

6 years agoallow to choose if brushkeys remember color
Martin Renold [Sun, 16 Sep 2012 09:55:32 +0000 (11:55 +0200)]
allow to choose if brushkeys remember color

It seems to be a tradition to change this behaviour every now and
then. Time for a preference (not in the preferences window, just
a toggle item in the menu). Also, update the current code to the
new brushmodifier behaviour.

Should we remember the color together with the brush?
Let's put an end to this insanity :-)

6 years agobrushlib/tests: Add missing charcoal.myb file
Jon Nordby [Sun, 16 Sep 2012 10:10:24 +0000 (12:10 +0200)]
brushlib/tests: Add missing charcoal.myb file

6 years agobrushlib/tests: Add some more test cases
Jon Nordby [Sat, 15 Sep 2012 22:07:18 +0000 (00:07 +0200)]
brushlib/tests: Add some more test cases

Also scale the input events to test more realistic cases (user
painting on 25% or 12.5% zoom).

6 years agobrushlib/tests: Specify test parameters outside test function
Jon Nordby [Fri, 14 Sep 2012 15:36:12 +0000 (17:36 +0200)]
brushlib/tests: Specify test parameters outside test function

6 years agobuild: Add -O3 to CFLAGS when not building in debug mode
Jon Nordby [Fri, 14 Sep 2012 15:16:37 +0000 (17:16 +0200)]
build: Add -O3 to CFLAGS when not building in debug mode

MyPaint brush engine gets a massive speedup with -O3 compared to -O2,
around 3x on a Core 2 Duo 2,2Ghz laptop. So we enable it by default.

6 years agobrushlib/tests: Fix gperftools utility
Jon Nordby [Fri, 14 Sep 2012 14:29:39 +0000 (16:29 +0200)]
brushlib/tests: Fix gperftools utility

Wrong pkg-config file, include path and function name
made this not compile.

6 years agobrushlib/tests: Call begin_atomic / end_atomic around stroke_to calls
Jon Nordby [Fri, 14 Sep 2012 10:36:14 +0000 (12:36 +0200)]
brushlib/tests: Call begin_atomic / end_atomic around stroke_to calls

Can be disabled, which allows to test transactions that are bigger
than individual stroke_to calls. For instance one could (re)play
an entire stroke and only then end the transaction.

6 years agobrushlib: Move begin_atomic / end_atomic vfuncs to MyPaintSurface
Jon Nordby [Fri, 14 Sep 2012 10:31:07 +0000 (12:31 +0200)]
brushlib: Move begin_atomic / end_atomic vfuncs to MyPaintSurface

The transaction concept is generally useful and should be present
on the public interface of surfaces. This will suggest consumers
to make use of it, which allows surfaces to implement deferred
Implementing these vfuncs is optional for a surface.

6 years agobrushlib: Update failing RNG test
Jon Nordby [Fri, 14 Sep 2012 10:10:07 +0000 (12:10 +0200)]
brushlib: Update failing RNG test

The RNG parameters where changed in a previous commit
to optimize its usage a bit, leading to different initial results
for a given seed.

6 years agobrushlib: Remove need for separate binary to run benchmarks
Jon Nordby [Fri, 14 Sep 2012 10:04:04 +0000 (12:04 +0200)]
brushlib: Remove need for separate binary to run benchmarks

Will just use a commandline option or environment variable to
detect the difference.
Right now the benchmark mode is always run for the surface tests
because verification of the output result has not been implemented.

6 years agobrushlib: Remove separate "utils" library
Jon Nordby [Fri, 14 Sep 2012 09:42:23 +0000 (11:42 +0200)]
brushlib: Remove separate "utils" library

The code is only used in tests, and probably only
will be, so build it into that library.

6 years agobrushlib: Rename "libmypaint-brushlib" to "libmypaint"
Jon Nordby [Mon, 10 Sep 2012 20:07:02 +0000 (22:07 +0200)]
brushlib: Rename "libmypaint-brushlib" to "libmypaint"

pkg-config files already had this name in them.
Renaming the source and install directories still todo.

6 years agolayers window: reflect undo stack changes fully
Andrew Chadwick [Sun, 9 Sep 2012 21:11:20 +0000 (22:11 +0100)]
layers window: reflect undo stack changes fully

Fix a minor state-reflection issue.

Changes to the layer visibility and locked state weren't immediately
shown by the layers list when the model state changed due to an undo or
redo user command.

6 years agocommand stack: permit updating the last command
Andrew Chadwick [Sun, 9 Sep 2012 21:04:46 +0000 (22:04 +0100)]
command stack: permit updating the last command

Allow the last command on the undo stack to be updated, to avoid having
to use undo() then do() in circumstances where only the final state of a
user's choice is deemed to matter in their workflow.


6 years agoDisables live update when brush settings not visible
João S. O. Bueno [Mon, 3 Sep 2012 01:32:38 +0000 (22:32 -0300)]
Disables live update when brush settings not visible

The live update of last stroke option would continue active
even with the dialog closed, causing the last stroke to
be modified when changing the drawing color, for example

6 years agobuild: clean .so file left over by old versions
Martin Renold [Wed, 29 Aug 2012 11:55:51 +0000 (13:55 +0200)]
build: clean .so file left over by old versions

This fixes a runtime error if an old version of MyPaint has been
compiled in the same directory (e.g. git update from v1.0.0).

6 years agofastpng: ignore non-RGB embedded ICC profiles
Andrew Chadwick [Mon, 27 Aug 2012 18:29:32 +0000 (19:29 +0100)]
fastpng: ignore non-RGB embedded ICC profiles

Gimp 2.8 happily embeds greyscale color profiles into PNG data with RGB
samples. This seems like a GIMP bug. Neverthless, it's revealed one of
ours: we need to be able to cope with non-RGB color profiles. Just
dropping them on the floor (similar to Gimp 2.6) should suffice while
we're using libpng to perform the limited number of transformations we

6 years agoDrag modes: ignore failed attempts to grab pointer
Andrew Chadwick [Mon, 27 Aug 2012 16:48:48 +0000 (17:48 +0100)]
Drag modes: ignore failed attempts to grab pointer

Workaround for - a GTK2 issue where some
other widget fails to release its pointer grab (an implicit grab?)
before the drag mode's grab is established.

Hopefully this won't screw too much up. For the more common of our drag
modes, the grabs are only there to make handling across multiple docs
and tdws, e.g. the scratchpad's setup, saner: they're not essential in
the single window case.

6 years agokeyboard: fix an exception when pressing Escape
Andrew Chadwick [Sun, 26 Aug 2012 21:57:13 +0000 (22:57 +0100)]
keyboard: fix an exception when pressing Escape

Not every window added to the keyboard manager will have a
It's fine for the KeyboardManager to retain its own reference to the
singleton application instance.

6 years agofix exception in brush settings dialog
Martin Renold [Sun, 26 Aug 2012 17:24:34 +0000 (19:24 +0200)]
fix exception in brush settings dialog

Reported here:

6 years agoframe window: allow frame colour to be changed
Andrew Chadwick [Fri, 24 Aug 2012 13:38:52 +0000 (14:38 +0100)]
frame window: allow frame colour to be changed

Allow the frame colour and opacity to be configured by the user via the
frame editing mode's dialog.

6 years agooptimize brush selection
Martin Renold [Sun, 19 Aug 2012 14:32:59 +0000 (16:32 +0200)]
optimize brush selection

Simple optimizations in
- don't report no-changes to observers
- get rid of 2300 calls to dict.deepcopy()

This reduces CPU time for brush selection by 50% and makes
the "pick context" feature more responsive again.

We still are doing all the work 3 times for our 3 different
documents (gui, scratchpad, brushcreation widget).

6 years agoupdate ru translation
George Shuklin [Sun, 19 Aug 2012 07:21:43 +0000 (09:21 +0200)]
update ru translation

6 years agoframe: make editing the frame a mode
Andrew Chadwick [Thu, 16 Aug 2012 01:17:09 +0000 (02:17 +0100)]
frame: make editing the frame a mode

Frame editing is now hopefully a little more intuitive: added a toolbar
button and a corresponding bindable action for editing the frame. Dialog
and mode are now combined.

Users can now drag the frame edges while the tool/mode is active. The
cursor reflects what will happen on canvas while the mode is active.

The dialog crop buttons now unconditionally enable the frame: users will
always want to see the result of these actions immediately.

Added a horrible icon for frame editing mode. Really we need a better
one (a fancy ormolu picture frame, maybe?)

Minor dialog layout stuff.

FrameToggle is now a real ToggleAction.

lib/ strip out frame moving and delta accumulation: it's now
managed by the top mode.

Gtk3: fixed pointer_ungrab() breakage.

6 years agomarkup string encodings: fix encoding bug
Andrew Chadwick [Mon, 13 Aug 2012 14:12:07 +0000 (15:12 +0100)]
markup string encodings: fix encoding bug

Fix an encoding bug which was causing unescaped content to get into
Pango markup. Fixes the brush list breaking with names which contain
ampersands, and similar potential faults in a couple of other places.

6 years agolayer move mode: don't always automatically cancel
Andrew Chadwick [Sun, 12 Aug 2012 13:57:04 +0000 (14:57 +0100)]
layer move mode: don't always automatically cancel

Make LayerMoveMode only auto-cancel if it's launched with modifiers +
pointer. If it's invoked from the toolbar or menu or a keypress
shortcut, the mode persists until a new mode is selected or escape is

6 years agoHCY mask load dialog: use a bigger preview
Andrew Chadwick [Sun, 12 Aug 2012 13:24:58 +0000 (14:24 +0100)]
HCY mask load dialog: use a bigger preview

Previews in mask loaders need to be fairly big.

6 years agoAdd interaction modes for lines, view manipulation
Andrew Chadwick [Fri, 10 Aug 2012 21:03:29 +0000 (22:03 +0100)]
Add interaction modes for lines, view manipulation

Refactor LineMode to support the new modes interface.

Line modes are now accessible a) from the kitchen sink default freehand
mode with modifiers+drag, b) from the Edit menu and c) from the toolbar.
Other locations are possible too, of course.

I prefer all the sticky modes to be visible together on the toolbar
while they're the only reflection of what mode the app is in, but we're
admittedly getting a bit cluttered up there now. It's probably time for
some judicious culling and replacement.

New icons for rotating and zooming the view in "cursor and view" style,
and a generic Tango-style one for moving stuff.

6 years agocanvasevent: begin associating actions with modes
Andrew Chadwick [Wed, 8 Aug 2012 22:40:16 +0000 (23:40 +0100)]
canvasevent: begin associating actions with modes

Interaction modes can now have an associated GtkAction, looked up by
name via the builder when needed. Set this up for the switchable
freehand mode and the viewport manipulation modes as a quick demo.

Some needed fixes to the mode stack's handling.

Escape now resets the interaction mode stack for the main doc.

Add an Icon for viewport (viewfinder?) panning mode. Need more though.

6 years agoupdated german translation
Daniel Ruf [Sat, 4 Aug 2012 15:18:12 +0000 (17:18 +0200)]
updated german translation

6 years agooptimize new random generator
Martin Renold [Wed, 8 Aug 2012 12:49:04 +0000 (14:49 +0200)]
optimize new random generator

Don't call rng_double_set_seed() any more while painting.
Reduce RNG quality settings.

For the brush "classic/coarse_bulk_1" this reduces the RNG related
functions from taking 9.5% CPU down to 0.5% (of all brushlib activity).

This breaks a feature where brushlib can re-render a previous stroke
exactly by restoring the initial state. (And removes the reason for
not using the system's RNG in the first place... uhm...)

Appart from the slightly nicer "live stroke preview" on the canvas
when editing the brush settings, this feature was unused for quite
some time now. It was used for undo/redo in early days. Actually it
was already broken before this commit (since the new RNG, I assume)
for some reason that I was unable to figure out.

6 years agofix rand_gauss() offset
Martin Renold [Wed, 8 Aug 2012 10:26:54 +0000 (12:26 +0200)]
fix rand_gauss() offset

The previous random_gauss() had a very prominent bias since
the introduction of the new integer RNG. Fixed by converting
the algorithm to float and removing the integer RNG completely.
rand_gauss() was the only consumer of integer random numbers.

6 years agocanvasevent: fix exception with bad devices
Martin Renold [Wed, 8 Aug 2012 09:11:47 +0000 (11:11 +0200)]
canvasevent: fix exception with bad devices

6 years agokeyboard and pointer input: big refactor
Andrew Chadwick [Wed, 1 Aug 2012 01:12:23 +0000 (02:12 +0100)]
keyboard and pointer input: big refactor

Move even more stuff out of the TDW, moving the input processing stuff
to a stack of interaction mode objects owned by each gui Document, only
the top mode of which is active. gui.document.Document ("doc") objects
are evolving into something more like classical MVC controllers.

The new InteractionMode objects know which doc and which tdw was active
at the time of the event, which may allow us to add additional views of
a model controlled by a single doc.

Active interaction modes' handlers can freely push new sub-modes to the
mode stack, and pop the stack when they're finished: this is how
switching modes using modifiers now works. There's an enter/leave
protocol at work for ensuring grabs are released appropriately.

* Replaces older button-press abstractions.

* Modes replace dragfuncs: certain modes are specialised for dragging between
  pen-down and pen-up events, and for keypresses involving space.

* Bye bye tdw's DragHandler, hello new super-grabby DragMode base class.

Differences between space drags and button-down drags are abstracted
away by the DragMode interface.

* Can now space-drag and zoom etc. on the scratchpad.

* Input stroke observers now belong to the gui-doc only.

* Global pressure mapping is now an Application attribute.

The controller classes track last event position and time on their TDWs
so that all modes can use the information, and so that it updates for
all modes.

* There's a minimal canvas controller for testing and the
  brush icon editor: it uses a freehand-only mode which cannot be switched
  using modifier keys.

TODO: need Actions for changing the active mode. Kinda what we're aiming
at here.

TODO: merge "" modes into the new structure. This already
uses its own similar scheme.

6 years agotdw: split cursor stuff to a mixin
Andrew Chadwick [Tue, 31 Jul 2012 13:42:07 +0000 (14:42 +0100)]
tdw: split cursor stuff to a mixin

Cursor stuff belongs on the renderer, but it's highly reusable and
doesn't really carry much of its own state. Therefore make it a mixin.

Generate fewer cursor updates (ISTR MS Windows cursors being reported as
a little flickery), and move cursor sizing to the new mixin to make what
the new conditional brush_modified_cb() does easier to understand.

Various minor cleanups.

6 years agoscratchpad: don't autosave unless changed
Martin Renold [Mon, 6 Aug 2012 14:28:59 +0000 (16:28 +0200)]
scratchpad: don't autosave unless changed

Especially after editing the preferences, the scratchpad ORA was
always saved no matter what, resulting in a notable delay.

6 years agofix global pressure mapping
Martin Renold [Mon, 6 Aug 2012 13:47:09 +0000 (15:47 +0200)]
fix global pressure mapping

6 years agowheel adjusters: notches
Andrew Chadwick [Mon, 30 Jul 2012 22:25:15 +0000 (23:25 +0100)]
wheel adjusters: notches

Add small notches to the edges of larger hue/saturation wheels denoting
the angular positions of the pure hues. These can be somewhat difficult
to find with these adjusters otherwise.

6 years agoGamut mask editor: behavioural fixes
Andrew Chadwick [Mon, 30 Jul 2012 21:49:46 +0000 (22:49 +0100)]
Gamut mask editor: behavioural fixes

Raise voids to the top when hovering over them for ease of editing.

Improve hightlighting a bit.

Voids can now be deleted by dragging them entirely within other voids.

Can now add up to 6 voids.

6 years agocolor adjusters: modifiers should do 1 thing only
Andrew Chadwick [Mon, 30 Jul 2012 21:41:03 +0000 (22:41 +0100)]
color adjusters: modifiers should do 1 thing only

Behavioural fixes for the colour bending implementation (microadjusting
the selected colour by selecting with button2 or button3 then dragging).
Modifiers should just toggle between three operations and not combine
them: it's easier to explain and much easier to figure out.

 * Unmodified + button2/3 drag: select, then adjust luma.
 * Shift + button2/3 drag: select, then adjust chroma.
 * Control + button2/3 drag: select, then adjust hue.

Bugfix: base hue bending on initial hue, not intial chroma. Oops.

6 years agocolor sels: minor cosmetic stuff
Andrew Chadwick [Mon, 30 Jul 2012 21:37:00 +0000 (22:37 +0100)]
color sels: minor cosmetic stuff

Reduce mask previews from 100 to 64 pixels to better support small screens.

Minor internal comment and annotation clarifications.

6 years agoluminosity/luma: use the same coeffs everywhere
Andrew Chadwick [Fri, 27 Jul 2012 16:50:29 +0000 (17:50 +0100)]
luminosity/luma: use the same coeffs everywhere

Use the coefficients from the forthcoming Compositing and Blending 1.0
specification from FXTF everywhere we compute luma: it'll help to avoid
inconsistencies like being seemingly able to brush-colourize a Color
layer visually brighter or darker with with a colour of the same exact
shade and 100% opacity.

6 years agopixops: add color and luminosity layer blend modes
Andrew Chadwick [Thu, 26 Jul 2012 19:20:33 +0000 (20:20 +0100)]
pixops: add color and luminosity layer blend modes

Artists can now use layer-based colourization and lightness setting, as
described at

This implementation uses the algorithm described in the PDF Reference,
the Cairo documentation, and most recently in a W3C (FXTF, i.e. SVG and
CSS) Editor's Draft specification. Let's refer to it in OpenRaster files
as svg:color and svg:luminosity and hope the SVG names don't change.

6 years agoLayer stack actions: update, make more keybindable
Andrew Chadwick [Wed, 25 Jul 2012 18:22:42 +0000 (19:22 +0100)]
Layer stack actions: update, make more keybindable

New keybindable commands in the menu:

  * Raising and lowering a layer in the layers stack
  * Duplicating the current layer
  * Renaming the current layer
  * Setting the current layer's visibility
  * Setting the current layer's locked status

Renaming a layer is now undoable, for consistency with the other layer
metadata commands.

Internal changes

A more sensible implementation for labelling unnamed layers. It's not a
fix for yet, but that really isn't going to
be fixed until we decide not to allow unnamed layers at all, or save our
bodged-in reference numbers.

lib.command.RemoveLayer can now remove the final layer. If it does so,
it replaces it with a new unnamed layer. Required by the cleaner
nameless layer labelling code, which uses the layer to store its own
ref number, and it's better for identity and semantics. It was always
silly that "removing" the final layer would keep its name.

6 years agoapp/doc/layer: minor cleanups and documentation
Andrew Chadwick [Wed, 25 Jul 2012 18:06:18 +0000 (19:06 +0100)]
app/doc/layer: minor cleanups and documentation

No significant code changes.

6 years agoREADME: update build deps for Debian systems
Andrew Chadwick [Tue, 24 Jul 2012 01:16:46 +0000 (02:16 +0100)]
README: update build deps for Debian systems

python-gtk2-dev is necessary, and also pulls in the required
libgtk2.0-dev and the runtime stuff.

6 years agoactions: move core actions to GtkBuilder XML
Andrew Chadwick [Mon, 23 Jul 2012 19:54:28 +0000 (20:54 +0100)]
actions: move core actions to GtkBuilder XML

Gather all the scattered lists of document- and view-level actions
together in one place. Keeps the code tidy, and hopefully it's easier to

Review action labels and tooltips for capitalization and uniqueness.
Also fix a few minor bugs here and there (visualize_rendering_cb(),
initialization of _show_subwindows).

6 years agogtk3: various fixups
Andrew Chadwick [Fri, 20 Jul 2012 20:53:41 +0000 (21:53 +0100)]
gtk3: various fixups

Final few fixups for GTK3 mode before merging back into master:

- reenable window position saving for the main window

- fix a line modes crash

6 years agopixbuf-wrapper related fixups for GTK3
Andrew Chadwick [Fri, 20 Jul 2012 18:04:38 +0000 (19:04 +0100)]
pixbuf-wrapper related fixups for GTK3

Fixes colour selection in the background window, and some corner cases
in the brush edit window.

6 years agovarious GTK3 fixes
Andrew Chadwick [Fri, 20 Jul 2012 17:02:16 +0000 (18:02 +0100)]
various GTK3 fixes

Fix history and colour popups so they run without showing exceptions.
General fixup to drawwindow so that the preferences window can be

REGRESSION: no fancy shaped window support upstream in this PyGI+GTK3,
see comment.

6 years agocolor picker: refactor/update for GTK3-pygtkcompat
Andrew Chadwick [Thu, 19 Jul 2012 17:12:14 +0000 (18:12 +0100)]
color picker: refactor/update for GTK3-pygtkcompat

Refactor and reimplement the colour picker functions and buttons in
terms of pixbufs and the appropriate screen getter function for both
PyGTK and PyGI+GTK2.

6 years agotoolbar+panels: initial fixes for pygtkcompat-gtk3
Andrew Chadwick [Wed, 18 Jul 2012 23:06:36 +0000 (00:06 +0100)]
toolbar+panels: initial fixes for pygtkcompat-gtk3

Fix up toolbars and dropdown panels so that they initialize without any
exceptions under pygtkcompat+PyGI+GTK3.


* gtk.Action.connect_proxy(w) -> Gtk.Activatable.set_related_action(a).
  - old form deprecated since 2.16

* The gtk.Action.set_tool_item_type() classmethod is better handled by
  overriding create_tool_item() when making toolbars via UIManager.
  - supposedly since 2.4

The usual mess:

* Fix menu button bold to use markup - nicer for the more restrictive
  PyGI-era Pango wrappings.

* .allocation -> .get_allocation();

* .window -> .get_window();

* .parent -> .get_parent();

* gdk.pointer_ungrab() requires a timestamp;

* Popup menu positioners have args in a different order.

6 years agogui.layout: various fixes/workarounds for gtk3
Andrew Chadwick [Tue, 17 Jul 2012 16:22:04 +0000 (17:22 +0100)]
gui.layout: various fixes/workarounds for gtk3

Fixes docked window tear-off behaviour, albeit using an ugly workaround.
Really we need shaped windows for the drag preview.

Fix an exception with the roll-up button.

6 years agolayers window: fix occasional gtk3 exception
Andrew Chadwick [Tue, 17 Jul 2012 16:21:17 +0000 (17:21 +0100)]
layers window: fix occasional gtk3 exception

6 years agolayers window: fix up for pygtkcompat/GTK3
Andrew Chadwick [Tue, 17 Jul 2012 15:33:03 +0000 (16:33 +0100)]
layers window: fix up for pygtkcompat/GTK3

Resolve most exceptions, allowing the window to be brought up and used
for layer selection, renaming, reordering, layer blend mode setting,
merging, and deleting.

6 years agobrush list: make broadly functional under GTK3
Andrew Chadwick [Tue, 17 Jul 2012 01:57:32 +0000 (02:57 +0100)]
brush list: make broadly functional under GTK3

Group names list and pixbuflist drawing and size requesting for GTK3.

REGRESSION: DnD is broken, but shouldn't throw exceptions now.

6 years agolayout: partial support for GTK3
Andrew Chadwick [Mon, 16 Jul 2012 18:26:58 +0000 (19:26 +0100)]
layout: partial support for GTK3

Work around and fix some of the immediate exceptions under GTK3.
Floating windows can now be shown and docked, but dragging and
repositioning is still a work in progress.

6 years agotool widgets: revert title finding to the old way
Andrew Chadwick [Mon, 16 Jul 2012 17:08:29 +0000 (18:08 +0100)]
tool widgets: revert title finding to the old way

No longer look up tool widget titles via stock: it's not possible with
stock mappings created by GtkBuilder. Revert to the old way, which was
always more modular.

6 years agostock: partly replace with GtkBuilder XML
Andrew Chadwick [Mon, 16 Jul 2012 03:49:40 +0000 (04:49 +0100)]
stock: partly replace with GtkBuilder XML

PyGI+GTK3 cannot construct stock items in the old way, so use a snippet
of GtkBuilder XML to define the stock name/icon mapping, and move the
default accelerator and label stuff back into Python code for now. All
the scattered core ActionGroups should probably go in the builder XML at
some point.

6 years agogtk3: get save & export working
Andrew Chadwick [Sun, 15 Jul 2012 19:58:26 +0000 (20:58 +0100)]
gtk3: get save & export working

Working file export to JPG and saving to ORA now works from GTK3.
Thumbnail generation does the right thing (verifed with pnginfo), and
the thumbs look correct in Thunar. MyPaint-gtk3 can finally exit
successfully on Ctrl+Q: the scratchpad saves without error.

REGRESSION: cannot store recent file info properly under GTK3. Recent
save files are not associaled with an application. This one awaits new
GObject introspection data for GTK3, or an API change, or both.

6 years agopygtkcompat: get keybindings working right in gtk3
Andrew Chadwick [Sun, 15 Jul 2012 19:07:19 +0000 (20:07 +0100)]
pygtkcompat: get keybindings working right in gtk3

Make activating existing keybindings work under GTK3.

GTK3's Gtk.AccelMap.lookup_entry() has different return values to
PyGTK's gtk.accel_map_lookup_entry(). Work around the difference by
emulating the old one.

6 years agogtk3: keyboard mods fix, menu postioning fix
Andrew Chadwick [Sun, 15 Jul 2012 02:16:45 +0000 (03:16 +0100)]
gtk3: keyboard mods fix, menu postioning fix

Various GTK3 fixups.

6 years agofile handling: various loader fixes for gtk3
Andrew Chadwick [Sat, 14 Jul 2012 23:54:09 +0000 (00:54 +0100)]
file handling: various loader fixes for gtk3

6 years agoapp: very basic pressure input device mode setting
Andrew Chadwick [Sat, 14 Jul 2012 23:52:09 +0000 (00:52 +0100)]
app: very basic pressure input device mode setting

Probably needs a ton of exception cases, like the GTK2 code. But this
will at least run.

6 years agocursor: gtk3 drawing code
Andrew Chadwick [Sat, 14 Jul 2012 22:05:34 +0000 (23:05 +0100)]
cursor: gtk3 drawing code

Add GTK3 drawing code and a standalone test case. Cursors are a little
bit fatter than before for better visibility.

For now, let's assume RGBA cursors.

6 years agooverlays: font fixups for GTK3
Andrew Chadwick [Sat, 14 Jul 2012 20:47:35 +0000 (21:47 +0100)]
overlays: font fixups for GTK3

6 years agocolors: get broadly working with pygtkcompat-gtk3
Andrew Chadwick [Wed, 11 Jul 2012 19:09:30 +0000 (20:09 +0100)]
colors: get broadly working with pygtkcompat-gtk3

Drag/drop receive is broken, but it runs without exceptions and
everything else seems OK.

6 years agoREADME.gtk3 correction
Andrew Chadwick [Wed, 11 Jul 2012 15:07:41 +0000 (16:07 +0100)]
README.gtk3 correction

6 years agogtk3: add README
Andrew Chadwick [Wed, 11 Jul 2012 14:35:47 +0000 (15:35 +0100)]
gtk3: add README

6 years agotdw: fix size_allocate_cb for gtk3
Andrew Chadwick [Mon, 9 Jul 2012 22:37:18 +0000 (23:37 +0100)]
tdw: fix size_allocate_cb for gtk3

Fixes Gtk assertion in stroke_to() after resizing the window.

GdkRectangles have changed and we can't keep references to them around
indefnitely any more, without generating strange results if we try to
perform arithmetic with their attrs. Assign the info we need to real
python ints instead.

6 years agotdw/pixbufsurface: more gtk3 compat
Andrew Chadwick [Sun, 8 Jul 2012 21:51:29 +0000 (22:51 +0100)]
tdw/pixbufsurface: more gtk3 compat

Fix up subpixbuf and sparse updates stuff so that tdw sort-of works
under gtk3... until you try to resize it, sigh.

Have to use our own copy of gdk_pixbuf_get_pixels_array() in mypaintlib
since it was a pygtk thing and is no longer supported. It's Gdk-version-
independent code.

This adds mypaintlib deps on pygobject and gtk+. Add a hopefully
temporary build flag for form's sake, mostly. Use "scons enable_gtk3=1"
at build time, and set the environment variable MYPAINT_ENABLE_GTK3=1 at

6 years agobrush groups list: fix pygtkcompat@gtk2 exception
Andrew Chadwick [Sat, 7 Jul 2012 17:47:17 +0000 (18:47 +0100)]
brush groups list: fix pygtkcompat@gtk2 exception

Fix an exception with child BrushList removal during update. Some minor
API change for foreach() by the looks of it. We don't need to do it that
way, and it hides the line numbers given how it processes.

6 years agotdw: fix import order
Andrew Chadwick [Sat, 7 Jul 2012 16:43:55 +0000 (17:43 +0100)]
tdw: fix import order

6 years agogtkexcepthook: fixup for gtk2 & compat-gtk3
Andrew Chadwick [Sat, 7 Jul 2012 16:39:13 +0000 (17:39 +0100)]
gtkexcepthook: fixup for gtk2 & compat-gtk3

GUI module test case, and little tweaks to make it go again under
pygtkcompat for gtk3 and gtk2.

6 years agotdw: get working again for pygtkcompat gtk2
Andrew Chadwick [Sat, 7 Jul 2012 15:59:29 +0000 (16:59 +0100)]
tdw: get working again for pygtkcompat gtk2

lib.pixbufsurface.Surface will need fixing first for it to wwork in gtk3

6 years agocurve: gtk3 compatibility (via gi.pygtkcompat)
Andrew Chadwick [Sat, 7 Jul 2012 15:15:03 +0000 (16:15 +0100)]
curve: gtk3 compatibility (via gi.pygtkcompat)