Change public text tool API to gimp_text_tool_delete_selection() and
move delete and backspace code to their own handlers in preparation of
handling all text deletion types.
* app/widgets/gimpwindow.c: treat GimpCanvas as a text widget and
dispatch all key events to it before invoking menu shortcuts.
* app/display/gimpdisplayshell-callbacks.c: treat all events on the
empty display as unhandled, not handled.
* app/tools/gimptexttool.c: use the right API for invoking the proxy
text view's bindings. Handle some more cursor navigation request and
swallow text deletion requests we don't handle instead of always
doing what the delete key does.
(gimp_text_tool_move_cursor): for GTK_MOVEMENT_DISPLAY_LINE_ENDS,
check if we are an the end of a line, or the cursor will end up on the
end of the next line.
* app/core/gimpmarshal.list: add marshallers needed for the binding
singnals.
* app/tools/gimptexttool.[ch]: add binding signals "move-cursor",
"delete-from-cursor" and "backspace" and hijack GtkTextView's
binding set to invoke them. Move code from the key_press() handler
to the signals' default handlers. This is how it should work. In
fact that code is #ifdef'ed away and we need an evil proxy
GtkTextView to invoke the bindings on because of reasons stated in
comments in the code. Ugly but works just fine.
(gimp_projection_validate_tile): fix stupid braino that made the
recently added optimization loop infinitely on images with a width
that is a multiple of TILE_WIDTH.
* app/tools/tools-enums.[ch]: add enum GimpClipboardAction which can be
{ CUT, COPY, PASTE }
* app/tools/gimptool.[ch]
* app/tools/tool_manager.[ch]: add GimpTool::clipboard_action() which
returns a boolean indicating whether the tool handled the action.
* app/tools/gimptexttool.c: implement clipboard_action().
* app/actions/edit-commands.c: try the active tool first in the cut,
copy and paste callbacks.
(gimp_text_tool_motion): always keep the "insert" mark at the mouse
location and the "selection_bound" one at the other end of the
selection.
(gimp_text_tool_key_press): make cursor navigation always move the
"insert" mark, and move "selection_bound" along with it unless shift
is pressed. It was exactly the other way around.
* app/tools/tools-enums.[ch]: add enum GimpButtonPressType which can
be { NORMAL, DOUBLE, TRIPLE }
* app/tools/gimptool.[ch]: add press_type paramater to GimpTool::button_press()
* app/tools/gimp*tool.c
* app/tools/tool_manager.[ch]: changed accordingly.
* app/tools/gimptoolcontrol.[ch]: add members and API so tools can choose
to receive double and triple clicks.
* app/display/gimpdisplayshell-callbacks.c (gimp_display_shell_tool_events):
dispatch double and triple clicks to tools if they want them, and if they
became active by the preceding normal button press.
* app/text/gimptextlayout-render.c: remove private function which
creates the transform matrix.
* app/text/gimptextlayout.[ch]: add it here as public API. Also add
function which transform and untransform PangoRectangles, points and
distances using the transform matrix.
* app/tools/gimptexttool.c: convert coordinates using above new
transform functions when drawing selection and cursor, and when
processing mouse events.
(gimp_drawable_transform_affine)
(gimp_drawable_transform_flip)
(gimp_drawable_transform_rotate): also transform the layer mask if we
are transforming a layer and there is no selection (which causes the
entire layer to be transformed).
(gimp_paint_core_get_orig_image)
(gimp_paint_core_get_orig_proj): changed parameters to x,y,width,height.
Update callers accordingly and use x,y,width,height there too except
in gimpperspectiveclone.c which does better with a bounding box.
Use 0666 as permissions instead of 0644 and let the user's umask care
about restricting, so creating a file with open() behaves the same way
as with fopen().
Add gimp_display_shell_sync_config() which copies the prefs settings
to the display shell and call it from gimp_display_shell_new() and
gimp_display_shell_fill().
Check that the cache itself is idle. Previously it would start during
transforms and long pyramid rendering ops and toss writes and large
seeks into the tile cache while it was potentially under heavy pressure.
Also increase its flush rate more to be more in line with modern system
and editing needs.
Although the clean-first strategy gives fast light-load performance,
it also degrades catastrophically under moderate cache pressure. LRU is
not as efficient under light load, but degrades more gracefully under
moderate and heavy load.
Add more profiling In order to analyze efficiency and behavior of the
tile cache. Profiling includes run-time indication of idle swapper
activity.
Also, fixes to original tile profiling code that appears to have
bitrotted some; it was no longer tracking changes made to tile memory
outside of tile.c.
Minor change to TILE_DATA_POINTER that restricts TILE_WIDTH and
TILE_HEIGHT to powers of two, but eliminates two integer divisions
(or, in reality, eliminates the over-complicated assembly resulting
from optimizing out two integer divisions in a C compliant fashion).
The questionable while loops to get GimpCoords.direction into a proper
range were used in two places. This commit fixes the actual problematic
place where, under some rare circumstances, the code used to go into a
loop for a very long time.
Pass the current coords to the function instead of setting them
on the paint core before calling it. Doesn't exactly make the code
in the paint tool simpler, but that needs further refactoring anyway.
Check for SHIFT, CONTROL and MOD1 explicitely so the code doesn't prevent
item activation for esoteric modifiers that are set by whatever X
component (like XKB).