...and with them all references their widgets keep (which are a lot).
Take ownership of the widget after creating it, so it can be reliably
unrefed upon exit.
When we are going to open new image windows, unset the transient
window. We don't need it since we will use gdk_window_raise() to
keep the dialog on top. And if we don't do it, then the dialog
will pull the image window it was invoked from on top of all the
new opened image windows, and we don't want that to happen.
Patch heavily inspiried by hack from Massimo Valentini.
Also add a manual test case for the fix. (I don't think there is GTK+
API to automate it).
This is evil: the hash table of "insert_data" is created on demand
when GimpContainerView API is used, using a value_free_func that is
set in the interface_init functions of its implementors. Therefore, no
GimpContainerView API must be called from any init() function, because
the interface_init() function of a subclass that sets the right
value_free_func might not have been called yet, leaving the
insert_data hash table without memory management.
Call GimpContainerView API from GObject::constructed() instead, which
runs after everything is set up correctly.
Make gimp_ui_synthesize_plus_key_event() generic and implement it with
gdk_test_simulate_key(). We can't use gtk_test_widget_send_key()
because its input window logic doesn't seem to work very well.
Don't divide by zero in gimp_session_info_class_apply_position_accuracy()
when klass->position_accuracy is 0, which happens on each exit in a normal
session.
Apparently, $(abs_top_srcdir) and $(abs_top_builddir) aren't set as
shell variables any longer. Instead, use @abs_top_srcdir@ and
@abs_top_builddir@ so they get substituted at configure time.
Introduce a few pixels of error margin in sessionrc, otherwise the
tests are too fragile, widgets have a tendency to change size a bit
and window managers have a tendency to move windows a bit.
Still needs more work, should probably do the same on book positions
too...
It is when we apply session info to the image window we unmaximize, so
don't apply session info to the image window when all we do is
switching tabs in single-window mode.
We don't need to call gimp_dockbook_refresh_tab_layout_lut() in
added() and removed() because we call
gimp_dockbook_update_auto_tab_style() in add() and remove().
instead of never drawing a background. Doesn't make any difference,
but makes GimpOverlayBox a more general container. Also, the offscreen
GdkWindow doesn't need any event but GDK_EXPOSURE_MASK.
which would have been the correct oder all the time, because these
systems are initialized in reverse order. The wrong order didn't
matter until now, but for some reason it now sometimes triggered
warnings about dialog_factories being NULL during controllers
shutdown.
* app/widgets/gimpoverlaychild.c: when creating offscreen windows, try
to set an RGBA colormap on the offscreen window's widget and use the
RGBA colormap to create the window. This has to be done here,
because it's not possible to get to the right screen *inside* the
offscreen widget before it's parented, and we need that screen
before the widget is realized, and the widget can't be parented
before it's realized or it will get the wrong parent window.
Everything clear now?
* app/widgets/gimpoverlayframe.c: draw the round corners only if the
screen has an RGBA colormap.
When merging down a layer, currently the selected layer will be merged with the
first visible layer below it. So, we better inform the user that the merging
operation will not necessarily be with the first layer below it, but with the
first visible layer below it.
Implement GtkWidget::focus() and override GtkContainer's focus()
implementation which would always give focus to the canvas because it
is focussable. Instead, try navigating in the focussed overlay child
first, and use GtkContainer's default implementation only if that
fails (which happens when focus navigation leaves the overlay child).
Remove the dockable drag handle and move the menu button it hosts up
to the GimpDockbook, with the gtk_notebook_set_action_widget() API.
This frees up quite a lot of screen estate which can be used for the
content of dockables instead.
Add support for a new type of Tab Style called 'Automatic'. This tab
style makes the GimpDockbook use the biggest actual tab style it can
for its auto tab style dockables, based on its widget allocation.
The tab style candidates for auto tab style are "Status + Blurb",
"Status + Text" and "Status". A docked widget can also say that it
wants to use "Icon" instead of "Status" for its auto tab style. The
'Tool Options' dockable does this. This is to be as backwards
compatible with the old tab style setup, we make 'automatic' the
default everywhere.
We have quite a bit of dependency to internal layout code in
GtkNotebook, but the current code should be pixel perfect and rather
complete.
Also add a basic regression test.
In order to get accurate measurements of widgets that will be put in a
GimpDock, add gimp_dock_temp_add() and gimp_dock_temp_remove(). That
way we can add a widget temporarliy, measure it with the
GimpDock::font-scale property applied, then remove it when we're
done. We can't apply style properties on widget detached from a
GdkScreen hierarchy :(
Description of undo actions should be marked as action descriptions,
and not as commands. This is required for translation for some
language (like Hebrew) that require a different grammatical tense for
describing actions
Fix totally broken value ranges of integer PDB parameters. Magically,
the bug was affecting only exactly the two cases mentioned in above
bug report.
* tools/pdbgen/pdb.pl (arg_parse): return <, <=, > and >= literally
instead of applying a mapping that was originally meant for
generated C code that would e.g. transform "0 <= int32 < 10" into
"if (value < 0 || value >= 10) fail". This inversion of all
operators is now wrong because PDB parameters have been turned into
GParamSpecs which always need inclusive ranges as min and max
values.
* tools/pdbgen/pdbgen.pl (arrayexpand): generated array length type
specs must be "0 <= int32", not "0 < int32".
* tools/pdbgen/app.pl: when generating integer param specs, check if
the value range is specified in terms of < instead of <=, and
add/subtract 1, resuting in the inclusive range needed for integer
GParamSpecs.
* app/pdb/color-cmds.c: regenerated, fixing the two broken ranges
mentioned in the bug report.
This is supposed to finally replace GimpContainerGridView along with
GtkWrapBox. The code is experimental and currently even crashes
without a modified GTK+, so it's disabled. Keeping it in GIT makes
developing easier though.
Keep a list of GimpCellRendererViewable around and add API to add
them. When items are removed or the store is cleared, set the
renderers' "viewable" property to NULL so they don't keep refing the
viewable.
This is not really "model" code but needs to be done for all container
views that have viewable cell renderers.
GimpContainerComboBox and GimpContainerEntry lacked that clearing, so
this change might fix some cases where objects (even images) were
removed but still stuck in memory until the model changed again.
We need to be able to pass a GimpUIManager to
gimp_dialog_factory_dialog_new(), so make that possible. Also make
sure to set ui_manager in gimp_dialog_factory_dialog_new_internal()
when we create both a dock window and a dock, so tooltips works in
toolboxes created from scratch.
- app/widgets/gimptextstyleeditor.c: don't block all key events so
they can reach the canvas.
- app/display/gimpdisplayshell-callbacks.c: instead, ignore canvas key
events when the canvas has no focus.
This fixes navigating out of the text style editor with TAB, moving
focus to the canvas. I have no clue why navigating *between* the
widgets in the style editor doesn't work.
because it's sealed and deprecated. I don't remember why this code was
there at all (it should never be needed), so I added warnings that go
off if the widget's focus state doesn't match the received event.
and as a "side effect", speed up rendering the image significantly:
- disable double buffering on the canvas widget.
- implement background clearing ourselves (needed after turning off
double buffering).
- remove any fiddling with clipping regions on the tool drawing GCs
and pull the pause/resume code out of the actual image expose
function.
- if there are overlay widgets on the canvas, implement double
buffering manually to aviod flicker, but do it in a way that keeps
pausing/resuming the active tool *outside* the double buffered
drawing.
I had to remove the asserrt in tool preset constructor, because with it
it wasnt possible to initalize an empty model object for the editor.
At init time the gimp object passed to the constructor is not yet available.
currently respects the fact that FG/BG are always global and the
global brush,pattern,... settings from gimprc. This should probably
not change, but rather be overridable on a per-preset basis as
suggested.
Override GimpContext's "tool" property and add an evil function that
makes sure we don't set a tool that doesn't match the options. Needed
because tool options are read from disk and thus unreliable per se,
additional we were stupid and wrote wrong tool options to disk.
The function gimp_dockable_get_tab_widget() and
gimp_dockable_get_drag_widget are not getters, they create new
widgets. Furthermore, gimp_dockable_get_tab_widget() doesn't use the
instance tab style but takes a tab style paramter. Rename the
functions to gimp_dockable_new_tab_widget_for_style() and
gimp_dockable_new_drag_widget() to reflect this.
Don't overwrite the entire context part of all tool options with
values from contextrc, or we will end up with one tool option set to a
non-default values affecting all other tool options that were at their
default value in the next gimp session.
- add "Gimp" property to GimpToolPreset
- implement GimpConfigInterface::deserialize_property() and deserialize
the "tool-options" locally so we can pass the required "gimp" construct
property.