* add per-display gdk_x11_display_error_trap_push()
(X11-specific because gdk_error_trap_push() probably
should have been)
* make gdk_error_trap_push() handle only GDK displays
not displays opened without a GDK wrapper
* make gdk_error_trap_pop() and gdk_x11_display_error_trap_pop()
automatically sync only if needed, so manual gdk_flush() is not
required
* add gdk_error_trap_pop_ignored() which just asynchronously
ignores errors, so never needs to sync
* add G_GNUC_WARN_UNUSED_RESULT to plain pop(), because
if you use plain pop() and don't need the return value,
the async gdk_error_trap_pop_ignored() should be used
instead. This results in lots of warnings to clean
up in a later patch.
The main objective here was to avoid the need to sync just
to ignore an error. Now, syncing is automatic, and only
happens when we need to know the error code.
https://bugzilla.gnome.org/show_bug.cgi?id=629608
Mainly fixes to properly differentiate between toplevel and offscreen
windows, since these sometimes need different treatment. Furthermore,
usage of gdk_window_get_effective_foo() instead of gdk_window_get_foo()
where applicable.
While X11 surfaces can be resized, this is not the case for Quartz
surfaces. Instead of resizing we will invalidate the surface instead.
By giving _gdk_windowing_set_cairo_surface_size() a boolean return
value, we can signal back whether or not resizing was possible. If not
possible, we invalidate the surface.
The window move code needs special attention for multiple reasons:
- invalid areas for expose events need to be modified
- self-copy is not supported by Cairo
- in X11, copying from an overlapped Window might cause unexposed areas
to be copied in, spo expose events for those need to be generated.
This was all special cased in various parts of the code. By making it an
explicit vfunc, we can work around it.
Includes fixing all callers to use the cairo region API instead. This is
usually just replacing the function names, the only difference is
gdk_region_get_rectangles() being replaced by
cairo_region_num_rectangles() and cairo_region_get_rectangle() which
required a bit more work.
https://bugzilla.gnome.org/show_bug.cgi?id=613284
This function makes a better replacement for
gdk_display_get_core_pointer(), wherever it might yet be needed, for
XI2 resorts to XIGetClientPointer(), for the others return the only
core pointer.
https://bugzilla.gnome.org/show_bug.cgi?id=621685
It turns out that my attempt at handling Super, Hyper and Meta better
is causing problems, mostly because Alt and Meta are commonly colocated
in the modmap, and apps do a check for the Alt modifier regularly.
See e.g bug 607697.
On X11 we receive enter notify and motion notify events for a window
regardless of its focus state. On Mac OS X this is not the case. This
commit improves the semantics to overcome this difference. It improves
on my earlier patch that sent a motion notify event when a window became
main.
Instead of sending a motion notify when a window becomes main, we now
send one when a window becomes key, which comes closest to a window
getting focus in X11. This motion notify is needed because Mac OS X does
not send motion events when an application is inactive (none of its
windows have focus), these events are sent in X11. This dummy motion
notify event (with current coordinates of the mouse cursor) allows an
application to get its prelight and other state right when it gets focus
and thus user attention.
Another change is to send an enter notify event when updating the
tracking rectangle of a GdkQuartView and the mouse cursor is currently in
this rectangle. This rectangle is at least updated on window creation.
This enter notify event is important for the case where a new window
appears right below the mouse cursor. The window has to receive an enter
notify event for the subsequent events to be processed correctly. Mac
OS X does not send one in this case, so we generate it ourselves.
Both of these synthesized events have to go through
_gdk_windowing_got_event() for updating statekeeping, etc.
append_event() has a boolean flag now to make this convenient.
These have been introduced in Leopard and default to int and unsigned int.
In 64-bit Snow Leopard they are long and unsigned long. This caused issues
with the getRectsBeingDrawn message which needs a pointer to a NSInteger
(long on 64-bit!) but we passed in an integer. Surprisingly this problem
was visible when compiling with -O0 (segfault), but *not* when compiling
with -O1. Other messages were NSInteger is now needed have also been
adapted.
Since NSInteger and NSUInteger are not available on Tiger, a define
has been added to add typedefs for these when they have not been defined
by the system headers.
Either g_type_register_static_simple (used by G_DEFINE_TYPE_EXTENDED)
and G_IMPLEMENT_INTERFACE use automatic variables for GTypeInfo and
GInterfaceInfo structs, while tutorials and source code often use
static variables. This commit consistently adopts the former method.
https://bugzilla.gnome.org/show_bug.cgi?id=600158
We have to do this, especially after the screen containing the menubar
has changed. Such more larger changes in monitor geometry will cause
changes to how monitors are laid out in the root window. The position
coordinates of the windows will have to be updated to reflect their
position in the new layout.
The Quartz port now supports arbitrary multiple monitor layouts instead
of only monitors are were laid out horizontally. This builds on the
reworked coordinate translation done in a previous commit.
The root window contains all the monitors attached to a Mac. The
coordinate transformation now both translates the x and y coordinate,
translating it from the Cocoa monitor coordinate space to the GDK
coordinate space. How monitors are laid out in the root window differs
between Cocoa and GDK, which is why it is important to translate based
on the root window to get multi monitor setups to work properly.
We have replaced the old y coordinate transformation function with
new functions that translate both the x and y coordinate.
When creating new toplevels, we have to determine the Cocoa screen on
which the toplevel should appear and translate the coordinates according
to that screen.
This change also fixes event handling in case there is a monitor left
of the screen containing the menu bar. In such a case all coordinates
on the left monitor are negative. Event handling broke, because of
_gdk_quartz_window_find_child() checking bounds. Now that coordinates
are always properly translated to GDK coordinate space, in which negative
coordinates do never occur, the checks here will work properly.
Using this we can update our internal monitor/screen layout state
and emit the GdkScreen::size-changed signal. Work has not
completely finished on this yet, see bug 596238.
Add dummy for _gdk_input_window_crossing (). Set both input_window_destroy
and input_window_crossing pointers in the Impl struct.
Reported by John Ralls.
This has two advantages:
1) In many backends, this is faster as we can terminate the window
hierarchy traversal earlier
2) When used in gdkdisplay.c::get_current_toplevel() to get the
current toplevel that has the pointer we now correctly return
a toplevel with the pointer in it where the pointer is inside
some foreign subwindow of a toplevel window.
The second advantage fixes some bugs in client side event generation
when the pointer is inside such a foreign child window.
Based on first patches by Christian Hergert. Change
screen_get_monitor_geometry() so that it translates the layout of the screens
from Cocoa layout to GDK layout. In Cocoa, the screen locations
are specified in Cocoa geometry, as well as that GDK uses a different way
to place individual monitors in the root window. For now only monitors
that are laid out horizontally are supported (see the FIXMEs in the source),
in bug 596238 we will track future work to get things fully right.
Modify _gdk_quartz_window_get_inverted_screen_y() to take the differences
in screen layout between Cocoa and GDK into account. Also this function
is subject to future work.
Explicitly handle resizing by leaving all events in the lower right 15x15
corner to Cocoa, if the window shows a resizing indicator. Some
applications may have widgets allocated in this area. Generally, these
widgets are likely larger than 15x15 so they can still be hit. Often
scroll bars are found in this area and these can also be manipulated by
other means. Since this is the only way of resizing windows on Mac OS X,
it is too important to keep it broken.
Make the quartz backend support the new queued translations. We do this
by keeping our own copy of the region that has been set to need display.
Using this region we can intersect by the given area, translate this and also
set needs display for the resulting area.
On startup, the root window got assigned the size of the main screen.
But, the GdkScreen has the width of all screens/monitors connected to the
machine. Change this so that in _gdk_windowing_window_init, we assign
the width/height of all monitors to the root window width, height.
Should fix bug 594738.
The quartz backend simulates the semantics of XGrabPointer, as a part of
this it checks the event mask of the grab. However, implicit grabs on X
do not go through XGrabPointer and thus the quartz backend should not check
the event mask for these. This fixes various "the UI got stuck" cases.
The X11 queue_translation operation uses NextRequest to get the serial
of the XCopyArea operation where the translation should end. However,
if the gc passed to gdk_draw_drawable has a non-flushed clip region
(which it commonly has now for the window clipping) then the next
operation will be the GC flush, not the XCopyArea.
To handle this right we now pass in the GC to be used to
queue_translation and ensure that it is flushed before calling
NextRequest().
This seems to more or less fix the build. On Tiger there are still issues
with libresolv missing on the link line, I will figure out what's up with
that soonish.
Turns out pygtk build broke due to the argument addition to draw_drawable.
So, we now add a new vfunc for the new draw_drawable and are thus
backwards compat.
Use the same code path to get a CGContext for both gdk_draw_* and
gdk_cairo_create and make sure we unlockFocus in both cases. This
fixes the broken rendering in GtkRuler. Also use an average of flush
intervals when checking whether we can flush or not, since otherwise
we get too sensitive and block almost all explicit flushes that are
caused by mouse movements for example.
Get rid of invalidate_maybe_recurse and process_updates. Implement
_gdk_windowing_{before,after}_process_all_updates(), and keep track of
when we're inside process_all_updates in the common code so we know
when to flush windows. Implement
_gdk_windowing_window_process_updates_recurse by means of
setNeedsDisplayInRect: displayIfNeeded. Use the added window argument
in begin_paint_region to get the right window (the paintable is always
the impl window now).
This fixes a mismatch in save/release gstate for the CGContext. If
this function is ever used for pixmaps, we need to add support for
that, probably will have to do so soon.
The one that puts windows outside the screen and moves them in when
showing. It might not be needed anymore and the workaround doesn't
work with the client-side window branch anyway because the window is
already mapped when we get showed for some reason.
The history before this was kind of twisted as several different
approaches were tested, so that was all squashed into this initial
commit to hide the uninteresting changes and files that were later
removed.
2009-01-26 Richard Hult <richard@imendio.com>
Bug 566628 – gdk_display_close always asserts on win32 and quartz
* gdk/quartz/gdkdisplay-quartz.c
(_gdk_windowing_set_default_display): Copy fix for bug #566628
from the win32 backend: Allow also a NULL parameter in the
g_assert().
svn path=/trunk/; revision=22223
2008-11-12 Richard Hult <richard@imendio.com>
Bug 550942 – [patch] Rework of gdkeventloop-quartz.c
* gdk/gdk.c:
* gdk/gdkinternals.h: Add eventloop debug facility.
* gdk/quartz/gdkeventloop-quartz.c: Big rework of the quartz
mainloop integration, patch from Owen Taylor. See bug #550942 for
the details.
svn path=/trunk/; revision=21783
2008-11-12 Richard Hult <richard@imendio.com>
Bug 558586 – handling of keyboard under darwin (quartz)
* gdk/quartz/gdkkeys-quartz.c: Follow up on this bug, only use the
new API when building on 64-bit, since there are still old non-xml
layouts used out there we don't want to break them. (For 64-bit
those layouts doesn't work so we don't have a choice there.)
svn path=/trunk/; revision=21782
2008-11-06 Richard Hult <richard@imendio.com>
Bug 558586 – handling of keyboard under darwin (quartz)
* gdk/quartz/gdkkeys-quartz.c: (maybe_update_keymap): Patch from
Arnaud Charlet to replace use of deprecated keyboard layout API
with the new TIS API available in 10.5. The old code is still used
when building for 10.4.
svn path=/trunk/; revision=21763
2008-11-05 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkevents-quartz.c:
(get_keyboard_modifiers_from_ns_event), (create_key_event): Revert
(at least for now) the alt/cmd switching since it breaks the
"alt-gr" functionality of alt which makes it impossible to input
lots of characters.
svn path=/trunk/; revision=21761
2008-11-05 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkwindow-quartz.c:
(gdk_window_impl_quartz_begin_paint_region): Set the fill color
outside the loop.
svn path=/trunk/; revision=21759
2008-10-27 Richard Hult <richard@imendio.com>
Bug 557894 – Wrong return value for
gdk_pointer_grab_info_libgtk_only()
* gdk/quartz/gdkevents-quartz.c:
(gdk_pointer_grab_info_libgtk_only): Return TRUE when there is a
pointer grab. Patch by Owen Taylor.
svn path=/trunk/; revision=21722
2008-10-09 Richard Hult <richard@imendio.com>
Bug 550342 – Splash screens have a caption
* gdk/quartz/gdkwindow-quartz.c: (_gdk_window_new),
(gdk_window_set_decorations): Patch from Marianne Gagnon to make
splash windows borderless.
svn path=/trunk/; revision=21617
2008-08-15 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkdrawable-quartz.c (gdk_quartz_draw_drawable): Some
aftermath of the fix of bug #543868. Clip and flip to the source,
not the destination. Don't save/restore the gstate, it's already
done when getting/releasing the context.
svn path=/trunk/; revision=21136
2008-07-20 Sven Herzberg <sven@imendio.com>
reviewed by: Richard Hult
Fixes#543868: GdkPixmap is upside down on quartz
* gdk/quartz/gdkdrawable-quartz.c (gdk_quartz_draw_drawable): flip the
coordinate space from GTK+ orientation to CoreGraphics orientation
before calling CoreGraphics code
* gdk/quartz/gdkgc-quartz.c (gdk_quartz_draw_tiled_pattern): drop the
coordinate space flipping (we always get it right, now)
* gdk/quartz/gdkpixmap-quartz.c
(gdk_pixmap_impl_quartz_get_context): flip the coordinate space when
creating the CGContextRef
svn path=/trunk/; revision=20870
2008-07-20 Sven Herzberg <sven@imendio.com>
reviewed by: Richard Hult
Extracted the CGContextRef creation into a virtual function of
GdkDrawableImplQuartz; implement get_context() for GdkPixmap and
GdkWindow
* gdk/quartz/gdkdrawable-quartz.c
(gdk_quartz_drawable_get_context): dropped the different
implementations; forward to the virtual function now
* gdk/quartz/gdkdrawable-quartz.h: added the virtual function
* gdk/quartz/gdkpixmap-quartz.c
(gdk_pixmap_impl_quartz_get_context),
(gdk_pixmap_impl_quartz_class_init): implemented get_context()
* gdk/quartz/gdkwindow-quartz.c
(gdk_window_impl_quartz_get_context),
(gdk_window_impl_quartz_class_init): implemented get_context()
svn path=/trunk/; revision=20869
2008-07-01 Richard Hult <richard@imendio.com>
Some aftermath from the window impl cleanups:
* gdk/quartz/gdkwindow-quartz.c:
(gdk_window_merge_child_input_shapes): Rename and export again.
(gdk_window_quartz_get_offsets): Make static.
svn path=/trunk/; revision=20723
2008-05-26 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkevents-quartz.c: (gdk_screen_get_setting): Try
setting the default font, might need to tweak this.
svn path=/trunk/; revision=20181
2008-05-19 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkwindow-quartz.c: (gdk_window_hide),
(gdk_window_fullscreen), (gdk_window_unfullscreen): Use
SetSystemUIMode instead of hiding and showing the menubar.
svn path=/trunk/; revision=20114
2008-05-17 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkwindow-quartz.c:
(gdk_window_impl_quartz_invalidate_maybe_recurse):
(gdk_window_quartz_update_idle): Use gdk_threads_add_idle instead
of g_idle_add. Add a temporary check if the window is already in
the updates list, since update_area currently doesn't always match
the backend's state, see bug #530801.
svn path=/trunk/; revision=20108
2008-05-12 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkevents-quartz.c:
* gdk/quartz/gdkquartz.h: Remove special casing of menu key events
as it's no longer necessary; instead the added quartz API to get
the nsevent from an event should be used. Also move the global
filter up so it's done before the check for window-less events.
svn path=/trunk/; revision=20100
2008-05-08 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkeventloop-quartz.c (poll_func): Only set the fake
fd's revents, not the first one. Fixes bug #531056, spotted by
Yevgen Muntyan.
svn path=/trunk/; revision=20086
2008-05-06 Richard Hult <richard@imendio.com>
* gdk/gdkevents.c: (gdk_event_copy), (gdk_event_free):
* gdk/gdkinternals.h: Add private backend data to events, and
handle it when copying/freeing events. Currently only needed in
the quartz backend.
* gdk/directfb/gdkevents-directfb.c:
* gdk/quartz/gdkevents-quartz.c:
* gdk/win32/gdkevents-win32.c:
* gdk/x11/gdkevents-x11.c: (_gdk_windowing_event_data_copy)
(_gdk_windowing_event_data_free): Add stubs for X11, win32 and
directfb. Implement for quartz. Part of fixing bug #473822.
svn path=/trunk/; revision=20078
2008-05-05 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkmain-quartz.c (_gdk_windowing_init): Initalize
framework if there is one.
svn path=/trunk/; revision=20075
2008-05-04 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkkeys-quartz.c (maybe_update_keymap): Check if
gdk_unicode_to_keyval() worked before using the result. Makes
function keys work, bug #530156. Also add F16 to the function key
map.
svn path=/trunk/; revision=20071
2008-04-30 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkevents-quartz.c:
(get_keyboard_modifiers_from_ns_event), (create_key_event): Map
Alt to Alt and Cmd to Meta. This is not only more logical but also
makes it easier to have Mac-like behavior.
svn path=/trunk/; revision=20054
2008-03-28 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkevents-quartz.c: (gdk_event_translate),
(_gdk_quartz_events_trigger_crossing_events): Defer the generated
event to the mainloop and don't generate one at all if the
toplevel didn't change. Use the actual window and not the toplevel
as event window. These changes make the generated crossing events
match the X11 behavior and fixes issues with e.g. tooltips,
comboboxes and menus.
* gdk/quartz/GdkQuartzView.c: Don't update the tracking rect if
the view has no window, it will be updated as soon as it's put
inside a window.
* gdk/quartz/gdkwindow-quartz.c:
(_gdk_quartz_window_debug_highlight): Make it possible to track
multiple windows with debug highlighting.
(show_window_internal): Remove workaround for tooltips and popups
that is no longer needed with the above changes.
svn path=/trunk/; revision=19951
2008-03-25 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkevents-quartz.c:
(_gdk_quartz_events_trigger_crossing_events): Bail out early if we
can't find a matching window.
* gdk/quartz/gdkwindow-quartz.c: (show_window_internal): Add a
comment, and only trigger an event for non-temp windows, fixes
problems for tooltips caused by the workarounds for the
problematic tracking rect API.
svn path=/trunk/; revision=19934
2008-03-25 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkwindow-quartz.c:
(gdk_window_quartz_process_all_updates): Plug a leak and add a
check that we have a toplevel before accessing it.
svn path=/trunk/; revision=19933
2008-03-14 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkwindow-quartz.c:
(gdk_window_quartz_process_all_updates): Patch from Paul Davis,
only flush the toplevel once per update.
svn path=/trunk/; revision=19871
2008-02-24 Richard Hult <richard@imendio.com>
* gdk/quartz/GdkQuartzWindow.c: Prevent hidden windows from being
shown without gdk's control when clicking the dock icon.
svn path=/trunk/; revision=19638
2008-02-24 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkprivate-quartz.h:
* gdk/quartz/gdkeventloop-quartz.c: (got_fd_activity), (poll_func):
Use the subtype field for the custom event that is used to wake up
the mainloop so we can have other custom event types.
* gdk/quartz/gdkevents-quartz.c:
(_gdk_quartz_events_trigger_crossing_events):
* gdk/quartz/gdkwindow-quartz.c: (show_window_internal): Create
crossing events after showing a window if necessary, to work
around problems with the tracking rect API.
svn path=/trunk/; revision=19637
2008-02-20 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkwindow-quartz.c: (gdk_window_set_decorations): Set
the right window level and shadow after recreating the window.
* gdk/quartz/GdkQuartzView.c: (drawRect): Invalidate the shadow if
necessary after drawing (bug #517338).
svn path=/trunk/; revision=19622
2008-02-17 Richard Hult <richard@imendio.com>
* gdk/quartz/GdkQuartzWindow.c: (showAndMakeKey): Update the
position after showing the window since the window manager might
not place it where we requested in the first places.
svn path=/trunk/; revision=19605