Compare commits

...

338 Commits

Author SHA1 Message Date
Cédric Valmary aa384b3eb9 Updated Occitan translation 2015-05-29 20:30:22 +00:00
Cédric Valmary 1e82c8e706 Updated Occitan translation 2015-05-15 16:33:44 +00:00
Daniel Korostil 60533aadca Updated Ukrainian translation 2014-03-22 12:20:51 +02:00
Wylmer Wang 1617e7ec2e Updated Chinese (China) translation 2014-03-09 09:57:07 +00:00
Shankar Prasad 7c2f813b8f updated kn.po 2014-02-04 18:01:33 +05:30
Matthias Clasen f62bf3aab7 Bump version 2014-01-27 17:16:03 -05:00
Matthias Clasen aeddd3e48b 3.8.9 2014-01-27 15:18:10 -05:00
Ignacio Casal Quinteiro 4a42503509 win32: handle again gtk-font-name
This code is ugly but it seems to do the work
2014-01-27 09:45:28 +01:00
Ignacio Casal Quinteiro 87eae26934 win32: scale slider with marks was off by 2 pixels 2014-01-27 09:40:21 +01:00
Ignacio Casal Quinteiro 799d1f7adb win32: actually match the separator 2014-01-24 21:59:46 +01:00
Ignacio Casal Quinteiro 9fde11c4c1 win32: set color for scale marks 2014-01-24 21:55:00 +01:00
Ignacio Casal Quinteiro 5c25c0ad9a win32: add margin to scale trough 2014-01-24 21:54:56 +01:00
Ignacio Casal Quinteiro 40b3e69a09 win32: add more width to the slider to not cut it when using marks 2014-01-24 21:54:46 +01:00
Chun-wei Fan dcec13444f gtk.vcxprojin: Fix Missing Semicolon 2013-12-30 12:33:22 +08:00
Benjamin Otte 5ea59fb1dd configure: Bump micro_version
This was apparently forgotten in commit f5fb6db1e
2013-12-13 16:59:09 +01:00
Carlos Garnacho 26fa630c65 x11: Handle XINotifyPassiveGrab/Ungrab in focus events
The focus handling code is shared between core and XI2 implementations,
so just handle the extra XI2 types for passive grabs. Those must be dealt
with in the same way than active grabs. Focus events with this crossing
mode could happen currently through the XIGrabFocusIn passive grab.

https://bugzilla.gnome.org/show_bug.cgi?id=719762
2013-12-04 21:45:34 -05:00
Carlos Garnacho 860d987001 x11: Handle all XI2 crossing mode values in switch
This fixes potential assertions if a GTK+ app gets to receive
a XINotifyPassiveGrab/Ungrab pointer crossing event, currently
triggerable by XIGrabEnter passive grabs.

http://bugzilla.gnome.org/show_bug.cgi?id=719762
2013-12-04 21:45:25 -05:00
Chun-wei Fan 27b5e17404 build/win32/vs*/README.txt: Re-word a bit
Use PATH rather than path to make things clearer
2013-11-29 10:10:34 +08:00
Chun-wei Fan e071a0c117 Visual C++ Projects: Add rules to generate GTK DBus sources
Since commit c66f194d the gtkdbusgenerated.[c|h] are not included in the
dist tarball and thus have to be generated, which broke the Visual C++
builds.

This patch adds custom build rules for the Visual C++ projects so that
gtkdbusgenerated.[c|h] will be generated upon building the GTK+ DLL
sources, so that the build will be fixed.

This also tells people building GTK+ from the projects that they need
to have Python 2/3 installed and the Python interpretor needs to be in
their PATH before building GTK+ from the projects.
2013-11-29 10:10:13 +08:00
Matthias Clasen f5fb6db1e3 Bump version 2013-11-26 21:06:00 -05:00
Matthias Clasen 09ed01e8a7 3.8.8 2013-11-26 20:47:50 -05:00
Marek Kasik 9feda1c92c printing: Fix memory leak when listing Avahi printers
Return values of g_variant_get_child_value() were not unreffed
correctly together with one value returned by g_variant_get().
Use g_variant_get_data() instead of copying each byte separately.

https://bugzilla.gnome.org/show_bug.cgi?id=712799
2013-11-26 14:23:44 +01:00
Carlos Garnacho 0f02cd2bcb x11: Unset GdkX11DeviceXI2 scroll valuators on device change
Scroll valuators were being just appended again and again, leading
to 1) a growing memory issue anytime a device changed 2) the first
scroll valuators to stay permanent on the application lifetime, as
the first stored valuators would always match.

https://bugzilla.gnome.org/show_bug.cgi?id=705203
2013-11-25 17:54:07 +01:00
Carlos Garnacho a20e7634b6 x11: keep track of the screen pixel size by calculating the bounding box of monitors
This is so we always have the latest information given by XRandR (or other), and not
rely on Core protocol information that might not have been updated yet.

This is specially visible when a monitor is connected (less frequent) or disconnected
(much more frequent), callbacks on GdkScreen::monitors-changed that call
gdk_screen_get_width/height() could get the screen size previous to the monitor
rearrangement.

So in order to fix this, keep track of the latest monitors information, and calculate
the bounding box in order to know the screen size.

https://bugzilla.gnome.org/show_bug.cgi?id=715029
2013-11-25 17:44:16 +01:00
Matthias Clasen e8b69526c2 3.8.7 2013-11-20 20:06:16 -05:00
Matthias Clasen c66f194d05 Don't distribute gdbus-generated sources
These are supposed to be regenerated at build time,
to avoid dependencies on the dist-systems glib version.
2013-11-20 20:06:11 -05:00
Matthias Clasen c55784626a treeview: fix dragging of columns in mutter
Don't recurse the mainloop in _gtk_tree_view_column_start_drag().
It doesn't serve any discernible purpose, and recursing the
mainloop from the flush-events phas of the frame clock breaks
frame synchronization with mutter.

https://bugzilla.gnome.org/show_bug.cgi?id=705176
2013-11-20 19:28:18 -05:00
Carlos Garcia Campos 29d6eec09a gtkprintbackendfile: Check the GtkPrintSettings passed to file_printer_get_options is not NULL before using it
https://bugzilla.gnome.org/show_bug.cgi?id=703784
2013-11-20 19:27:48 -05:00
Chenthill Palanisamy a2420a40da Do not reset the waiting_for_printer on status change
* gtk/gtkprintunixdialog.c (printer_status_cb): Do not reset the
waiting_for_printer on status change as the default printer might
get added later.

https://bugzilla.gnome.org/show_bug.cgi?id=577642
2013-11-20 19:27:31 -05:00
Matthias Clasen 7e0434cfcd Make treeview cursor handling a bit more robust
Clearing the model in a GtkTreeSelection::changed handler was
crashing. While it is not a 100% kosher thing to do, lets be
more robust here.
2013-11-20 19:27:17 -05:00
Carlos Garnacho d95b84c0ea combobox: Set GDK_SCROLL_MASK on the eventbox in appears-as-list mode
This is so the scroll wheel works in both modes, and there's no behavioral
change depending on a style property.

https://bugzilla.gnome.org/show_bug.cgi?id=702663
2013-11-20 13:26:06 +01:00
Carlos Garnacho 81b7c4e40b gdk: Ignore crossings generated by passive grabs when resetting scroll axes
Passive grabs may take pointer focus out of the application, even though
the pointer didn't leave the window, but those events still trigger resetting
of the scroll axes. This is most visible with compiz, and possibly other
reparenting WMs, where passive grabs happen on the WM-managed window that
is a parent of the application toplevel.

As it is not possible to have scrolling happening on the timespan a passive
grab takes action, it is entirely safe for GTK+ to assume none happened if
it gets a crossing event of that nature.

https://bugzilla.gnome.org/show_bug.cgi?id=699574#c33
2013-11-19 00:15:29 +01:00
Carlos Garnacho 198ad4df90 gdk: be more selective resetting scroll events
It's been reported in several applications that scrolling feels jerky
since commit cc7b3985b3.

Investigation reported that the combination of passive 4-7 button grabs
on the toplevel and the presence of native subwindows might trigger
too often crossing events from the child window to the toplevel and
back as scroll "buttons" trigger the passive grab. Those crossing events
would reset the scroll valuators rendering scrolling from jerky on
touchpads (where there's intermediate smooth events between the emulated
button ones) to ineffective on regular mouse wheels (where the crossing
event would reset the valuators right before the single smooth scroll
event we get is delivered)

So, only reset scroll valuators when the pointer enters the toplevel
(we only care about this when the pointer is on the window after it's
been possibly scrolling somewhere else), and it doesn't come from an
inferior.

The situations where this happened varied though, the native subwindow
could be one created explicitly by the application, or created indirectly
through gdk_window_ensure_native(). The latter was mainly the case for
evolution (through gtk_selection_set_owner()) and any GtkScrolledWindow
under the oxygen-gtk3 theme (through gdk_window_set_composited())

https://bugzilla.gnome.org/show_bug.cgi?id=699574
2013-11-19 00:15:18 +01:00
Matthias Clasen cf962321e8 GtkAboutDialog: Fix a corner case of link highlighting
GtkAboutDialog highlights emails written as <...> and
urls written as http://... . gnome-terminal manages to
put <http://...> into its license text, which sadly
confuses the parser into running evolution on http://...

Fix things up far enough that <http://...> is now
recognized as url, and only the part inside the <> is
underlined (for email addresses, we include the <> in
the underline).
2013-11-15 17:06:15 -05:00
Sebastien Bacher 4b880d50f1 Clean incorrect "_" use in the french translation
https://bugzilla.gnome.org/show_bug.cgi?id=712213
2013-11-13 16:34:12 +01:00
Lars Uebernickel 37675d8227 GtkModelMenu: don't leak submenus
gtk_container_remove_child() is not enough to break the reference cycle
between the removed menu item and the submenu that is attached to it.
Use gtk_widget_destroy() instead.

https://bugzilla.gnome.org/show_bug.cgi?id=710754
2013-10-25 10:03:00 -04:00
Bastien Nocera d4c049059f GtkScrolledWindow: Disconnect from frame clock properly
The tick callback IDs from GtkWidget aren't timeouts, so
use the correct function to disconnect from them.

Spotted by Benjamin Otte <otte@redhat.com>

https://bugzilla.gnome.org/show_bug.cgi?id=710666
2013-10-23 15:24:37 +02:00
Bastien Nocera 2ca82e6ddf GtkWidget: Avoid lingering clock frame updates
For some widgets, like GtkTreeView, which setup a clock frame
update during realize, it was possible to call
gdk_frame_clock_begin_updating() twice, but only ever disconnecting
from it once. This happens because the realized flag is set at an
unpredictable time by the GtkWidget's realize implementation.

Keep the signal handler ID from us connecting to the "update" signal
to avoid connecting to it twice.

This fixes high wake-up count from any application using GtkTreeView,
even idle ones.

https://bugzilla.gnome.org/show_bug.cgi?id=710666
2013-10-23 15:24:32 +02:00
Matthias Clasen 2898b2bbd8 Bump version 2013-10-16 21:32:05 -04:00
Matthias Clasen a411d6b199 3.8.6 2013-10-16 20:34:12 -04:00
Olivier Brunel 4c691ac8f8 tooltip: Fix possible wrong placement
When showing a tooltip on the edge of a monitor, the tooltip could be wrongly
placed and be shown going from one monitor to the next.

This happened because the current_window wasn't set visible, and when it wasn't
the returned allocated size would be 1, hence wrong calculations.

Signed-off-by: Olivier Brunel <jjk@jjacky.com>

https://bugzilla.gnome.org/show_bug.cgi?id=698730
2013-10-16 19:54:20 -04:00
Yosef Or Boczko 16be72eb13 Fix a warning
The PangoWrapMode enum has identical layout to GtkWrapMode,
but using the two interchangably causes (justified) compiler
warnings.

https://bugzilla.gnome.org/show_bug.cgi?id=709697
2013-10-16 19:54:06 -04:00
Matthias Clasen 4c796df901 Set an error when loading a GtkIconInfo fails
Failure to do so leads to assertion failures.
https://bugzilla.gnome.org/show_bug.cgi?id=710073
2013-10-16 19:53:33 -04:00
Matthias Clasen fc4263535b Fix a crash in icon handling
The load_error was freed in two places.
Fix based on a patch in
https://bugzilla.gnome.org/show_bug.cgi?id=709967
2013-10-16 19:52:41 -04:00
Matthias Clasen 13a56fb3a2 Bump version 2013-10-10 20:16:12 -04:00
Matthias Clasen 5135522de6 3.8.5 2013-10-10 19:55:43 -04:00
Timothy Arceri caadbdf630 Remove unused function
https://bugzilla.gnome.org/show_bug.cgi?id=586107
Signed-off-by: Timothy Arceri <t_arceri@yahoo.com.au>
2013-10-10 17:58:52 -04:00
Timothy Arceri f6f23149a2 Remove a bunch of unused variables.
https://bugzilla.gnome.org/show_bug.cgi?id=586107
Signed-off-by: Timothy Arceri <t_arceri@yahoo.com.au>
2013-10-10 17:58:37 -04:00
Timothy Arceri 0bddd31389 Dont set enum to NULL fixes build issues on Solaris 10
https://bugzilla.gnome.org/show_bug.cgi?id=586107
Signed-off-by: Timothy Arceri <t_arceri@yahoo.com.au>
2013-10-10 17:58:31 -04:00
Timothy Arceri 4de2154368 Reorder message in configure.ac to display result on the same line
https://bugzilla.gnome.org/show_bug.cgi?id=341146

Signed-off-by: Timothy Arceri <t_arceri@yahoo.com.au>
2013-10-10 17:58:18 -04:00
William Jon McCann 84a651caf1 Fix typo in gtk-win32-base.css 2013-10-10 17:57:59 -04:00
Cosimo Cecchi 80aca3be77 entrycompletion: set the GtkWindow as attached to the GtkEntry
This way themes can easily select that window to apply custom styles.

https://bugzilla.gnome.org/show_bug.cgi?id=708414
2013-10-10 17:56:50 -04:00
Cosimo Cecchi ce69a803a7 icontheme: use g_file_load_contents() for symbolic icons
When loading a symbolic icon, g_file_get_contents() is currently used
with the icon pathname, to load its SVG data. This won't work when the
icon is not a local file, for instance when a symbolic icon is loaded
from a GFileIcon with a GResource path.
Fortunately GtkIconInfo already holds a GFile, so we can just use
g_file_load_contents() to load the data instead.

https://bugzilla.gnome.org/show_bug.cgi?id=709056
2013-10-10 17:56:41 -04:00
Ryan Lortie 5e556d778a GtkTreeViewColumn: start padding at 0
If we start with a padding of -1 then it can leak out of the size
allocation request for the column when the treeview is empty.  The
GtkTreeView will then collect these -1 values and add them together,
returning -n where 'n' is the number of columns.

This is usually not a problem because treeviews tend to be used with a
scrollbar and the width of the scrollbar will be added to this number
bringing it into positive territory again.  On Ubuntu, with overlay
scrollbars, this is not the case, however.

https://bugzilla.gnome.org/show_bug.cgi?id=703062
2013-10-10 17:55:28 -04:00
Philip Chimento 5b2e44fd44 Don't activate GtkExpander if mouse dragged away
Previously, when you clicked and held the button down on a
GtkExpander's label or disclosure triangle, then moved the mouse
away and released the button, the expander would still activate.
This brings the behavior in line with the more generally expected
behavior, as exhibited by GtkButton for example.

https://bugzilla.gnome.org/show_bug.cgi?id=706345
2013-10-10 17:53:43 -04:00
Matthias Clasen 124e43d078 Clarify GtkH/VBox documentation
Make it clearer that GtkBox still has uses.

https://bugzilla.gnome.org/show_bug.cgi?id=706269
2013-10-10 17:53:28 -04:00
Murray Cumming 2f66920b54 GtkWidget: Improve drag-leave and drag-data-received docs.
* gtk/gtkwidget.c: drag-leave signal: Document that it is called before
      drag-drop.
      drag-data-received signal: Document that it is up to the application
      to know why the data was requested (e.g. drag motion or drop).
    * demos/gtk-demo/toolpalette.c: interactive_canvas_drag_drop():
      Do not transform the drop_item created in the drag-motion handler.
      Instead caused drag-data-received to be called, remembering why,
      and create a new item there.
      interactive_canvas_drag_leave(): Remove the idle-handler hack,
      now that we do not need to keep the drag-motion drop_item alive until
      the drop.

I noticed that this patch was sitting in bug #605611 from 2009
though it had been approved. I do not remember much about why I
created it.
2013-10-10 17:52:34 -04:00
Carlos Garcia Campos 41ba15bbf2 gdkdisplay-x11: Do not pass a NULL source device to _gdk_display_device_grab_update
Pass the master device instead if the last slave is NULL. This is
unlikely to happen in most of the cases, but can happen when running
unit tests where there's no pointer interaction to update the last
slave.

https://bugzilla.gnome.org/show_bug.cgi?id=696756
2013-10-10 17:52:20 -04:00
Sébastien Wilmet 1e80b89c9c Improve doc of gtk_text_buffer_paste_clipboard()
It didn't explain the behavior when there is a non-empty buffer
selection.

https://bugzilla.gnome.org/show_bug.cgi?id=339539
2013-10-10 17:51:54 -04:00
Sébastien Wilmet 28baa6de5a textbuffer: add unit tests for the clipboard
It tests gtk_text_buffer_paste_clipboard(),
gtk_text_buffer_copy_clipboard() and gtk_text_buffer_cut_clipboard() in
various situations, including when GtkTextTags are applied to the
selection.

The last test didn't pass.

https://bugzilla.gnome.org/show_bug.cgi?id=339539
2013-10-10 17:51:46 -04:00
Sébastien Wilmet a50151e0df textbuffer: fix selection replacement when pasting
It is more logical to first delete the selection and then pasting the
text. When the selection and the text contain tags, the new behavior is
more natural.

A segfault in paste_from_buffer() is also avoided. The segfault occurs when
the text to paste is deleted because it is the selection.

https://bugzilla.gnome.org/show_bug.cgi?id=339539
2013-10-10 17:51:34 -04:00
Alejandro Piñeiro fe45e8c048 a11y: Remove default description from GtkSwitch
https://bugzilla.gnome.org/show_bug.cgi?id=707926
2013-10-10 17:50:23 -04:00
Alejandro Piñeiro bb1d313dfe a11y: not using default name for switch
A proper name or label is required. In the same way, if the
widget is labelled, ATs uses to expose both the label and the
name, making the final output not really user-friendly.

https://bugzilla.gnome.org/show_bug.cgi?id=707872
2013-10-10 17:50:03 -04:00
Behdad Esfahbod f68ad7b45a [gdkcairo] Fix color premultiplication
https://bugzilla.gnome.org/show_bug.cgi?id=513812
2013-10-10 17:45:57 -04:00
Jasper St. Pierre d16b9f99eb gdkframeclockidle: Add explicit fallthrough markers
So people reading the code don't get confused.
2013-10-10 17:44:57 -04:00
Mike Gorse b4e4e211a6 a11y: Check whether a widget is mapped before querying its parent
Call gtk_widget_get_mapped() in a couple of places before looking at the
widget's parent, since it might be set to a widget that has been
finalized, causing an invalid read.
2013-10-10 17:44:27 -04:00
Bastien Nocera 0764f75dee icon-theme: Fix 2 memory leaks in GtkIconInfo
https://bugzilla.gnome.org/show_bug.cgi?id=709264
2013-10-02 17:18:29 +02:00
Bastien Nocera ad29977bf7 icon-theme: Use g_clear_* helpers in finalize
https://bugzilla.gnome.org/show_bug.cgi?id=709264
2013-10-02 17:18:11 +02:00
Piotr Drąg 0f661e1458 Import po-properties/gd.po from master
You can't have po/gd.po without po-properties/gd.po, because it
breaks the build.
2013-09-23 00:38:05 +02:00
GunChleoc 9000fa1f81 Added Scottish Gaelic translation 2013-09-20 12:01:05 -06:00
Matej Urbančič 2553ab21ee Updated Slovenian translation 2013-09-01 20:17:28 +02:00
Matej Urbančič ce9680fab3 Updated Slovenian translation 2013-08-31 09:07:11 +02:00
Matej Urbančič 86f17b3a17 Updated Slovenian translation 2013-08-30 22:10:41 +02:00
Matthias Clasen f09b01dd19 bump version 2013-08-30 10:08:16 -04:00
Matthias Clasen a1b4c09901 Remove unintentional use of GLib 2.37 apis 2013-08-30 09:32:59 -04:00
Matthias Clasen 1351ad0e62 Bump version 2013-08-30 09:01:12 -04:00
Matthias Clasen 125263713b 3.8.3 2013-08-30 08:37:55 -04:00
Matthias Clasen 03058dd76a Fix make check 2013-08-30 08:14:59 -04:00
Carlos Garcia Campos be41057a74 iconview: Respect the fixed item width when adjusting the wrap width
Restore the code the way it was in GTK2.

https://bugzilla.gnome.org/show_bug.cgi?id=680953
2013-08-30 07:10:17 -04:00
Matthias Clasen 876d5f0748 Fix keyboard activation of menu buttons
Keyboard activation relies on the menu not being visible,
so ensure that it isn't when the menu is attached.

Problem tracked down by Vincent Le Garrec,
https://bugzilla.gnome.org/show_bug.cgi?id=688738
2013-08-30 07:10:17 -04:00
Stef Walter 6279b6125a window: Some protection against nested set_focus() calls
Since set_focus() can triger events, have a check to make
sure state is still valid before firing is-focus signal.

https://bugzilla.gnome.org/show_bug.cgi?id=706152
2013-08-30 07:10:17 -04:00
Matthias Clasen ad5889690a Make symbolic icons work with the current rsvg
The rsvg loader now restricts what external files it will
allow to load from an svg. Thus our xinclude trick doesn't work
anymore. To work around that, embed the payload in a  data: uri.
This is somewhat ugly, but the best we could come up with.
2013-08-30 07:10:17 -04:00
Matthias Clasen 785cba1e7b GtkSpinButton: disconnect signals in the accessible
Just as for GtkRangeAccessible, we were not even trying to disconnect
the signal handler from the adjustment. The same fix works here:
override the widget_set and widget_unset vfuncs.

https://bugzilla.gnome.org/show_bug.cgi?id=705692
2013-08-30 07:10:17 -04:00
Matthias Clasen b355a88456 GtkRange: disconnect signals in the accessible
We were only disconnecting the signal in finalize, when
the widget was already unset. Instead, override the widget_set
and widget_unset vfuncs of GtkAccessible, and keep a reference
to the adjustment.

https://bugzilla.gnome.org/show_bug.cgi?id=705692
2013-08-30 07:10:17 -04:00
Matt Barnes 463d12cfcd GtkApplication: Do not assert sm_proxy != NULL in inhibit functions
Applications have no way of finding out if a session manager proxy was
successfully created in gtk_application_startup_session_dbus(), so it's not
appropriate for certain public GtkApplication functions to be asserting the
presence of a session manager proxy as if it were a programmer error.

This affects:

   gtk_application_inhibit()
   gtk_application_is_inhibited()

If sm_proxy is NULL, the function should just return silently.

In the case of gtk_application_uninhibit(), the application should only be
calling this if it obtained a valid cookie, which implies the presence of a
session manager proxy.  I noted that with a comment.

https://bugzilla.gnome.org/show_bug.cgi?id=701365
2013-08-30 07:10:17 -04:00
Matthias Clasen 727182f0f9 Avoid integer overflow
Use g_malloc_n in gdk_cairo_set_source_pixbuf when allocating
a large block of memory, to avoid integer overflow.

Pointed out by Bert Massop in
https://bugzilla.gnome.org/show_bug.cgi?id=703220
2013-08-30 07:10:17 -04:00
Matthias Clasen 3d5e50daa2 GdkScreenX11: Dispose visuals
If we let them hold onto their X resources until finalize,
it is too late.
2013-08-30 07:10:17 -04:00
Matthias Clasen a27d2413aa GdkVisualX11: Add a dispose implementation
We need to be able to drop X resources before finalization.
2013-08-30 07:10:17 -04:00
Matthias Clasen b613e3a1e0 GdkDeviceManagerXI2: chain up in constructed
Dispose does chain up, and the parent class' dispose expects
that the object has been fully constructed.
2013-08-30 07:10:17 -04:00
William Jon McCann 641a0ad8a8 Add missing allow-none annotations 2013-08-30 07:10:16 -04:00
John Lindgren 72b0bcbad5 Optimize gdk_x11_screen_supports_net_wm_hint()
Move the call to gdk_x11_atom_to_xatom_for_display() outside of the
search loop in gdk_x11_screen_supports_net_wm_hint().  In my test case
(running Audacious for about a minute), this reduced the total number of
hash table lookups performed from 370,000 to 230,000.

https://bugzilla.gnome.org/show_bug.cgi?id=702913
2013-08-30 07:10:16 -04:00
Jonh Wendell d7798950ed GtkEntry: ellipsize placeholder text
The placeholder string is truncated when there's no
room for it in entry's width.

So, by ellipsizing it, the user can notice the text
was truncated so that they can workaround that by,
for example, maximizing the window.

https://bugzilla.gnome.org/show_bug.cgi?id=702763
2013-08-30 07:10:16 -04:00
Benjamin Otte 287464a64a cssimage: Add forgotten line
That line was already missing in the initial commit it seems.
2013-08-30 07:10:16 -04:00
Matthias Clasen 1add0e3f2a Fix anonymous assistants
GtkAssistant supports not showing the sidebar with the page
titles (if the page have no titles). Unfortunately, we were
hiding the sidebar in this case, but still rendering the frame
behind it, leading to a broken appearance.
2013-08-30 07:10:16 -04:00
Ek Kato aaf32faedc Fix missing return from quartz_filter_keypress
(cherry picked from commit 0ae728e242)
2013-08-29 14:12:52 -07:00
Ek Kato f2e7bce43a Bug 705750 Quartz input method doesn't work correctly for Chinese characters
Modified from original for Gtk3.

(cherry picked from commit bc35d5d166bcc4ec8ac074b792cc88f4f98c282e)
2013-08-16 11:18:11 -07:00
Cody Russell e6dc6382c7 Fix a crasher that was introduced by 9ca802161e
due to preedit_str being initialized as an empty string rather than NULL.
2013-08-15 15:11:11 -05:00
Michael Hutchison 7e4ce73751 Bug 705182 Reset Cocoa IME state when immodule is reset
Commits the pre-edit string on receipt of focus_out and reset
commands.
Patch refinements by Cody Russell <bratsche@gnome.org> and
Ek Kato <ek.kato@gmail.com>

(cherry picked from commit e8b6b806250c1f958c33920c60ed41ab88016767)
2013-08-15 10:00:46 -07:00
Ek Kato 4ded4549f1 Bug 705181 Annoying beep on arrow keys
Original patch was a bit excessive, just needed to not forward the command.

(cherry picked from commit 40c429c2cb)
2013-08-13 11:35:22 -07:00
John Ralls daee40abef Bug 701571 NSApp doesn't notice NSWindow destruction
Part 1 of the fix; part 2 awaits Glib developer approval (see
https://bugzilla.gnome.org/show_bug.cgi?id=704374) and is more
correctly associated with
https://bugzilla.gnome.org/show_bug.cgi?id=674108

(cherry picked from commit ccc30ea91966d0ec048a20530c892dfcace96b2b)
2013-08-10 14:22:01 -07:00
Daniel Sabo db71def54a Reset cursor when mouse leaves a toplevel window.
Fixes https://bugzilla.gnome.org/show_bug.cgi?id=692548
2013-08-08 09:39:28 -05:00
Ryan Lortie 1e93ed9630 gtkicontheme: check for GdkPixbuf first
We checked for G_IS_LOADABLE_ICON() before GDK_IS_PIXBUF().

Since we made GdkPixbuf implement GLoadableIcon, the special case for
pixbufs is never used, and the much much slower GLoadableIcon path is
taken instead.  Move the GdkPixbuf one to be first to fix that.

https://bugzilla.gnome.org/show_bug.cgi?id=705320
2013-08-02 15:05:06 +02:00
Michael Hutchinson 205c4288a4 Bug 705181: Fix annoying beeping introduced by Mac IME
NSTextInputClient should not chain unhandled commands to super

(cherry picked from commit 91bcca6f39)
2013-07-30 17:28:10 -07:00
Matthias Clasen 3c58485a7f X11: Fix the cut-off for too large windows
We can only handle 2^15-1 pixels, not 2^16-1.
Pointed out by Morten Welinder.

https://bugzilla.gnome.org/show_bug.cgi?id=698758
2013-07-29 20:53:55 -04:00
Ek Kato 8a98feef19 Bug 701332 - Patch for minor glitch in NSTextInput
(cherry picked from commit 43ed68aa33)
2013-07-27 14:28:23 -07:00
Takuro Ashie 4249d6e931 imquartz: Fallback to slave IM context if no NSEvent exists.
When an application translates a key event and drop its native event
before passing to imquartz, it can't recognize the NSEvent. On this
case imquartz doesn't emit any signals such as "commit" signal so
that the application doesn't insert any text. To avoid no response,
at least imquartz should fallback to slave GtkIMContextSimple.

https://bugzilla.gnome.org/show_bug.cgi?id=694273#c27
(cherry picked from commit c064e18894)
2013-07-27 14:28:12 -07:00
Owen W. Taylor e061305d61 Disable frame sync for GtkPlug
Plug windows weren't redrawing properly because the embedded
window was expecting to get messages for each frame from the
compositor, but the compositor doesn't know about embedded
windows. Simply disable frame sync for GtkPlug's GdkWindow -
extending XEMBED to handle frame sync isn't interesting
at this point.

A new API gdk_x11_window_set_frame_sync_enabled() is added
to allow this to be done.

https://bugzilla.gnome.org/show_bug.cgi?id=701613
2013-07-22 18:38:27 -04:00
Jehan 81f06e1749 gtkdialog - more informative warning when ordering unexisting response_id
(cherry picked from commit 0e4d9b7793)
2013-07-21 21:46:01 +09:00
Carlos Garnacho c65c217741 quartz: Fix call to missing symbol
This patch can be considered a leftover of commit 12ffae5,
replace the no longer existing function with the GDK function
meant to replace it.

This was noticeable on regular clipboard operations in quartz
Cherry-picked from 7ffcd85.
2013-07-02 11:38:07 -07:00
Emilio Pozuelo Monfort bd3f7f0619 menushell: don't activate a menu entry when opening a big menu
If a menu is opened and it doesn't fit entirely below or above
the menu bar, gtk+ will place it on top. The button release will
then activate the popup item that happens to appear under the
cursor. Avoid this by ignoring release events if they originated
in the parent menu bar and the duration of the press was too short.

https://bugzilla.gnome.org/show_bug.cgi?id=703069
2013-06-27 20:20:24 +02:00
Federico Mena Quintero 22ca91ffae GtkFileChooserButton: Also emit 'file-set' when changing the selection through the combo box
https://bugzilla.gnome.org/show_bug.cgi?id=696498
2013-06-21 19:17:35 -05:00
Federico Mena Quintero 5aae1eadb7 GtkFileChooserEntry: don't inline-complete if the entry doesn't have the focus
When the file chooser changes directories, it tells the GtkFileChooserEntry to
change its base folder (i.e. the folder from which relative pathnames are resolved).
GtkFileChooserEntry then starts loading a GtkFileSystemModel asynchronously.
In the finished_loading_cb(), however, it would always ask the GtkEntryCompletion
to insert the completion prefix, since that finished_loading_cb() is what is also used
while the user is typing *in the entry*.

But when the entry doesn't have the focus (e.g. the user changed directories by double-clicking
on the file list in the file chooser), there's no reason to insert completions at all.

https://bugzilla.gnome.org/show_bug.cgi?id=672271
Signed-off-by: Federico Mena Quintero <federico@gnome.org>
2013-06-21 19:05:35 -05:00
Michael Natterer f04fe99deb quartz: remove check for keymap changes from update_keymap()
The function is now only called when the keymap has actually
changed. bug #698183.
(cherry picked from commit e5e17cf361)
2013-06-20 17:29:26 +02:00
Michael Natterer 7b08ca94cc quartz: update the keymap only if the input method changed
and not on each keystroke, which for some IMs apparently caused a full
update on each keystroke, not just a check for changes. Patch from
Takuro Ashie, bug #698183.

(cherry picked from commit bbe3554fa9)
2013-06-20 17:10:06 +02:00
Alexander Larsson 4932d44b9e IconTheme: Move changed emission to an idle
By delaying the emission to an idle we avoid a lot of tricky
reentrancy issues. For instance, a normal gtk_icon_theme_choose_icon()
call could in very rare cases (when a user updated an icon theme) emit
a signal which could affect the icon currently being looked up.  This
kind of reentrancy is very hard to test against, especially when it is
so rare, so we're better of avoiding it.

There is no real value to get the change signal directly anyway. All
it can do is affect which icon is rendered the next frame, and we will
handle the queued emission before rendering. Not to mention that icon
theme change detection is polled anyway, so it is already delayed.

https://bugzilla.gnome.org/show_bug.cgi?id=694755
(cherry picked from commit 159cccfe7b)
2013-06-19 11:16:27 +02:00
Alexander Larsson b4244b734e IconTheme: Clear caches when reloading theme
When we're reloading the theme in ensure_valid_themes (due to noticing
that a theme dir has changed) we need to also clear the icon cache
as it will not be valid for the new theme.

We already do this in do_theme_change(), but ensure_valid_themes()
was missing this.

https://bugzilla.gnome.org/show_bug.cgi?id=702598
(cherry picked from commit 1ee36713fe)
2013-06-19 10:15:15 +02:00
Alexander Larsson b489d20ac4 IconCache: Keep a ref on the GtkIconData
The icon data in GttkIconInfo->data is currently owned by the
IconThemeDir->icon_data hashtable. However, on e.g. a theme change
blow_themes() destroys the dirs and thus the data, meaning any
outstanding GtkIconInfo points to stale data.

We solve this by adding a refcount to GtkIconData and reffing it
from GtkIconInfo.

https://bugzilla.gnome.org/show_bug.cgi?id=702598
(cherry picked from commit 280d606cd4)
2013-06-19 10:15:13 +02:00
Michael Natterer 044e34b34f quartz: move dialogs to the same window level as utility windows
window_type_hint_to_level(): applied patch from Paul Davis which moves
dialogs to NSFloatingWindowLevel. This is not quite the perfect
solution, but it's a pragmatic fix that makes apps which have both
window types much more usable, and prevents dialog from disappearing
under an application's main window.
(cherry picked from commit 59d49e1566)
2013-06-06 15:49:55 +02:00
Marek Kasik 8dee19fca8 printing: Show correct status of a job
"job-state" is IPP_TAG_ENUM not IPP_TAG_INTEGER.
2013-06-06 11:10:49 +02:00
YunQiang Su 30782e26a9 fix a typo in zh_CN translation 2013-06-06 11:02:29 +08:00
Scott Moreau f9dd457b25 wayland: Always attach buffer before committing
With recent changes in attach semantics, we always need to attach before
committing. Without this changes to the window contents to not get reflected
in the content of the surface.

Signed-off-by: Rob Bradford <rob@linux.intel.com>

Cherry picked to fix: https://bugzilla.gnome.org/show_bug.cgi?id=701341
2013-05-31 15:26:16 +01:00
Chun-wei Fan 29f453b975 Update Visual Studio 2010 Property Sheets
Remove quotes that aren't really needed
2013-05-31 13:10:39 +08:00
Benjamin Otte 18190f6dba window: Call size_allocate() to allocate a size
Don't call gtk_container_resize_children().

https://bugzilla.gnome.org/show_bug.cgi?id=700185
2013-05-30 20:05:05 +02:00
Rafael Ferreira eadbb077a5 Updated Braziliana Portuguese translation for Gtk-UI 2013-05-30 05:01:10 -03:00
Xavier Claessens 074585b3e3 GtkMenuItem: Take padding into account to position submenu arrow
Since commit a69619edbc, it not
possible anymore for the style to add space between the border
and the arrow.

https://bugzilla.gnome.org/show_bug.cgi?id=700779
2013-05-29 14:55:27 +02:00
Colin Walters a3864ac49f modules/input: Only build quartz module if we're targeting quartz
Otherwise the build is broken on GNU/Linux and Win32.
2013-05-21 18:44:05 -07:00
Rafael Ferreira e77f16e54c Updated Brazilian Portuguese translation 2013-05-21 02:28:45 -03:00
John Ralls 948767960f Bug 667759 - gtkdnd-quartz.c is missing annotations for introspection
Work around this by introspecting gtkclipboard.c and gtkdnd.c instead
of the quartz alternatives.

Note that this is temporary: The implementation of GdkSelection
will make the quartz alternatives unnecessary. See bug 571582.
2013-05-20 15:45:27 -07:00
John Ralls 5753f69b68 Bug 691921 - GTK+ built on Leopard references [NSMenu removellItems]
Test it with respondsToSelector, and if it isn't available delete the
items one at a time.
2013-05-20 15:20:29 -07:00
E. K. Kato 5680244e8f Bug 694273 - Patch to support NSTextInputClient in text widgets
Provides an input module for native OSX input methods.
Based on a patch by Hiroyuki Yamamoto
(http://www.sraoss.jp/sylpheed/sylpheed/macosx/gtk+-2.24.0-macosx-textinputclient_ja-test1.patch).
Adjustments for Gtk3 by Matthew Francis <gnomebugs@newsheffield.co.uk>
2013-05-20 11:04:05 -07:00
Bastien Nocera eb899ebbf8 GtkSwitch: Don't handle events from extra mouse buttons
Also use GDK_EVENT_{STOP,PROPAGATE} to make return
values clearer.

https://bugzilla.gnome.org/show_bug.cgi?id=696640
2013-05-18 14:51:07 +02:00
Bastien Nocera 2b91f5de30 GtkButton: Don't suppress unhandled mouse events
Mouse events that we do not handle should bubble up to the parent
widget, so they can be handled there, instead of disappearing inside
the button. Also use GDK_EVENT_{STOP,PROPAGATE} to make return
values clearer.

https://bugzilla.gnome.org/show_bug.cgi?id=696640
2013-05-18 14:51:01 +02:00
Matthias Clasen 828f9eb1e7 Bump version 2013-05-13 08:02:13 -04:00
Matthias Clasen 231d6c209f 3.8.2 2013-05-13 06:24:44 -04:00
Kjartan Maraas 662e718631 Updated Norwegian bokmål translation 2013-05-13 11:16:22 +02:00
Kjartan Maraas 0fee20071c Updated Norwegian bokmål translation 2013-05-13 09:38:51 +02:00
Bastien Nocera 2f1d718e13 Fix accels added after the window was shown not working
GtkApplicationWindow would only update its list of captured accels
when realizing the window. This meant that keyboard shortcuts added
after the window was realised (for example, added by plugins) would
be non-functional.

Solve this by updating our accels every time the accel map changes,
not only when realizing the window.

https://bugzilla.gnome.org/show_bug.cgi?id=700079
2013-05-13 08:57:37 +02:00
Matthias Clasen 650da1e6b0 Improve sensitivity handling in filechooser context menu
Items that act on the selection should not be sensitive if the
selection is empty. This was already the case for the 'Copy file
location' item, but not for the 'Add bookmark' and 'Visit file'
items.
https://bugzilla.gnome.org/show_bug.cgi?id=699104
2013-05-12 23:10:15 -04:00
Carlos Garnacho 8ae3bae9a9 Find tooltip/dnd widget running through container children in inverse order
Usually, educated GtkContainers' forall() implementation returns children
in an order that's safe for the default draw() implementation in GtkContainer.
So for widgets with some stacking notions (eg. GtkOverlay),
_gtk_widget_find_at_coords() needs to recurse within containers in reverse
order so it finds the topmost widget.

As this function is used in both tooltips and DnD code, this improves behavior
of "floating" widgets wrt those two. This could for example be seen in the
"Transparent" GTK+ demo, where dropping text on the entry results on the text
going to the textview.

https://bugzilla.gnome.org/show_bug.cgi?id=699239
2013-05-12 22:55:09 -04:00
Sébastien Wilmet 8368b12b61 Doc: various small fixes
https://bugzilla.gnome.org/show_bug.cgi?id=700007
2013-05-12 22:54:45 -04:00
Sébastien Wilmet fecd632e57 gtktextchild: replace hard-coded values by a macro
The macro already exists, so it's better to use it.

https://bugzilla.gnome.org/show_bug.cgi?id=700007
2013-05-12 22:54:33 -04:00
Tristan Van Berkom 945e5bd859 GtkComboBoxText: Improved GtkBuildable documentation.
Also removed a bogus FIXME comment which might have been true
a long time ago. Clarification: the "domain" attribute specified
in the builder script overrides any domain previously set with
gtk_builder_set_translation_domain(), so the translation of items
here is perfectly correct and does not need to be fixed.
2013-05-12 22:54:21 -04:00
Yuri Myasoedov 16f3b2f5c8 Updated Russian translation 2013-05-12 12:45:51 +04:00
Matthias Clasen c3852404e6 GtkWindow: default size is only for initial map
Bring back need_default_size. We need it to preserve this
documented behavior:

The default size of a window only affects the first time a window is
shown; if a window is hidden and re-shown, it will remember the size
it had prior to hiding, rather than using the default size.

With this patch, all of the window sizing tests in
gtk/tests/window pass again.
2013-05-11 18:45:27 -04:00
Matthias Clasen 6bf7af2a46 Add more window-size related tests 2013-05-10 13:53:31 -04:00
Matthias Clasen 0c1fd574b0 Remove gtk_widget_size_allocate from gtk_menu_popup_for_device
GtkMenu calls gtk_widget_size_allocate on its GtkWindow during
gtk_menu_popup_for_device if the menu has not been realised. This can cause the
allocation of the GtkWindow and the size of the GdkWindow to become out of sync
because a top level GtkWindow does not attempt to re-size the GdkWindow when
its allocation is set.
https://bugzilla.gnome.org/show_bug.cgi?id=695120
2013-05-09 13:03:42 -04:00
Ryan Lortie 6ff37b070b GtkCheckMenuItem: remove an unused boolean field
always_show_toggle was always set to TRUE in _init() and never changed
from anywhere else.  Remove it and remove the if() statements based on
it.

https://bugzilla.gnome.org/show_bug.cgi?id=699929
2013-05-09 13:03:34 -04:00
Matthias Clasen 5f9c83da83 Fix a typo
Pointed out in bug
https://bugzilla.gnome.org/show_bug.cgi?id=698051
2013-05-09 13:03:28 -04:00
Marek Kasik 7e86d69854 printing: Don't crash when printer-state-message not provided
Check whether "printer-state-message" was returned before its
usage.

https://bugzilla.gnome.org/show_bug.cgi?id=699750
2013-05-09 15:15:21 +02:00
Matthias Clasen 52decc32fe Add window sizing tests
These are copied from master
2013-05-08 10:22:15 -04:00
Matthias Clasen bb8254877b Make key themes work again
This was inadvertedly broken in commit
44ba5d253f.
Thanks to Matthew Francis for tracking this down and providing
a fix in https://bugzilla.gnome.org/show_bug.cgi?id=699901
2013-05-08 10:22:15 -04:00
Jiro Matsuzawa 1a3ec8e98d l10n: Update Japanese translation 2013-05-08 21:01:13 +09:00
Jiro Matsuzawa f35fb0c661 l10n: Update Japanese translation
Merge the latest pot.
2013-05-08 20:59:25 +09:00
Hib Eris 4380ce8495 Revert "Don't build gtk-launch when gio-unix is not available"
The gtk-launch tool can be build without gio-unix (although it
will not really do much without an alternative implementation for
g_desktop_app_info).

So there is no need to not build gtk-launch anymore.

This reverts commit 9a1235bf0d.

https://bugzilla.gnome.org/show_bug.cgi?id=682824
2013-05-01 07:44:53 +02:00
Milo Casagrande 5b74700608 [l10n] Updated Italian translation. 2013-04-30 19:22:12 +02:00
Milo Casagrande c00b2ead83 [l10n] Updated Italian translation. 2013-04-29 23:00:27 +02:00
Žygimantas Beručka ca01f7c042 Updated Lithuanian translation 2013-04-28 13:24:23 +03:00
Mario Blättermann cc9928065b Updated German translation 2013-04-27 22:30:55 +02:00
Rafael Ferreira f7ecc91327 Updated Brazilian Portuguese translation 2013-04-23 05:09:46 -03:00
Rafael Ferreira 0ce7854a3c Updated Brazilian translation for UI and PO-Prop. 2013-04-22 04:58:51 -03:00
Tristan Van Berkom fc9c5228d3 Revert "gtkbin: Remove the silliest code on earth"
This reverts commit f4438a1ffc.

The calculation of the delta between parent and child widget
is required in order to automate height-for-width and width-for-height
requests for various GtkBin widgets.

GtkButton, GtkCheckButton, GtkRadioButton, etc, all have different
requests for space around the content which can not be satisfied
with a simple calculation of GtkContainer border-width.
2013-04-22 15:20:33 +09:00
P. F. Chimento 87869d1442 doc: Documented icon-shadow CSS property
The docs say that text-shadow applies a drop shadow to both text
and icons, but icons need to use the icon-shadow property.

https://bugzilla.gnome.org/show_bug.cgi?id=698181
2013-04-19 10:32:45 -04:00
Matthias Clasen f833d84be1 Fix mouse interaction in combo cell renderer
Pass the event on when calling gtk_cell_editable_start_editing.
https://bugzilla.gnome.org/show_bug.cgi?id=504901
2013-04-19 10:32:38 -04:00
Matthias Clasen 0c9946631a 3.8.1 2013-04-15 13:43:16 -04:00
Carlos Garnacho 8e56a80972 xi2: Reset scroll valuators on synthesized crossing events
On crossing events resulting from moving windows (eg. workspace switch),
deviceid equals sourceid, so make those reset scroll valuators on all
slave devices to avoid misleading jumps in scroll events

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=690275
2013-04-15 11:01:43 +02:00
Alban Browaeys c6a4065c5a print: disconnect source_changed_handler on printeroptionwidget finalize
Printing a web page without window.print (which still segfault),
that is Ctrl+P is fixed (does not attempt to execute the
source_changed_handler on a printeroptionwidget that has been
destroyed) by disconnecting this handler in the printeroptionwidget
finalize.

https://bugzilla.gnome.org/show_bug.cgi?id=696622
2013-04-14 20:20:49 -04:00
Volker Sobek 03b60f94c0 gtk-demo: Fix typo
https://bugzilla.gnome.org/show_bug.cgi?id=675649
2013-04-14 09:04:39 -04:00
Carlos Garcia Campos 9de7b8af49 gtkprintjob: release the surface and backend before the output io channel
If the GtkPrintJob is freed too early when the surface has been created
but the job hasn't been sent to the printer, it's possible that the
file print backend tries to write to the io chaneel when it is already
closed. This produces runtime critical warnings:

GLib-CRITICAL **: g_io_channel_write_chars: assertion `channel->is_writeable' failed

https://bugzilla.gnome.org/show_bug.cgi?id=685420
2013-04-14 12:20:43 +02:00
Carlos Garcia Campos b81117479b gtkprintbackendfile: Fix infinite loop in _cairo_write()
It can happen if the io channel has been closed. In that case
g_io_channel_write_chars() returns early because of a g_return macro
that checks if the io channel is writable. When returning from g_return
macros, the bytes written output parameter is not updated and the error
is not filled, so the error is not detected and the written variable is
used uninitialized. We should check the return value of
g_io_channel_write_chars() to break the loop.

https://bugzilla.gnome.org/show_bug.cgi?id=685419
2013-04-14 12:20:36 +02:00
ammonkey fff0358261 fix mem leak in gtk_drag_set_icon_surface, destroy pattern
https://bugzilla.gnome.org/show_bug.cgi?id=681446
2013-04-13 20:07:51 -04:00
Matthias Clasen e08c1f5849 Precache more atoms
Add a few more entries to the list of precached atoms.
2013-04-13 20:07:42 -04:00
Matthias Clasen 7106f426bb Revert "Use natural size to set adjustment ranges"
This reverts commit 666d10ec76.

This change severely broke any treeviews without horizontal
scrollbars. Basically, ellipsization never kicks in, and instead
the treeview content just extends outside the visible area,
rendering it inaccessible. This broke e.g. the control-center
keyboard shortcuts panel, the gnome-disks device list, etc etc.
2013-04-13 16:26:34 -04:00
Dušan Kazik 86392ca3d6 Updated slovak translation 2013-04-12 21:26:29 +02:00
Nik Kalach 0077c2ac5a [l10n] Update Interlingua translation 2013-04-09 16:51:25 +02:00
Benjamin Otte 6fad3b1b0d window: Remember current size
Don't just look at previously remembered sizes, also look at the current
size.
This is useful for cases where the window was resized by the user or WM
and not by the application itself.

https://bugzilla.gnome.org/show_bug.cgi?id=696882
2013-04-09 12:23:36 +02:00
Benjamin Otte d9a6214725 window: Split out a function
We don't want to remember sizes in the not resizable case. Also a
function named "guess_default_size" should not look at previous sizes,
it should guess.
2013-04-09 12:23:31 +02:00
Benjamin Otte b708fc4c14 window: Remove an unused function.
Luckily, we don't need to support an implementation of a minimal WM for
linux-fb anymore (which is what this function was added for).
2013-04-09 12:23:27 +02:00
Benjamin Otte e64e81bcf4 docs: Fix Since tag for frame clock functions 2013-04-09 12:23:21 +02:00
Benjamin Otte 38b62e4660 window: restore size after hide/show properly
Old code assumed the size was stored in widget.allocation. This is no
longer true as the allocation is cleared upon hide. However, we store
the last configure request, and that one tracks the last size, so we can
just use that number.

Sometimes things are so easy - once you figure them out...

https://bugzilla.gnome.org/show_bug.cgi?id=696882
2013-04-09 12:23:15 +02:00
Benjamin Otte d0699235bf plug: Don't unregister windows that were never registered
Fixes warnings when trying to unregister the socket window. The socket
window is foreign, so we shouldn't register it in the first place.

https://bugzilla.gnome.org/show_bug.cgi?id=697427
2013-04-09 12:23:08 +02:00
Bruce Cowan a7dae64d59 Updated British English translation 2013-04-06 17:13:34 +01:00
Aron Xu 8c42e760bf Update Simplified Chinese translation 2013-04-06 22:27:33 +08:00
Wylmer Wang e3c46cd253 Update Simplified Chinese translation 2013-04-06 22:19:15 +08:00
Gheyret Kenji bf28168d42 Updated Uyghur translation
Signed-off-by: Gheyret Kenji <gheyret@gmail.com>
2013-04-06 18:21:55 +09:00
Shankar Prasad 78f02cc5b6 Updated kn translations 2013-04-06 00:24:14 +05:30
Shankar Prasad afadd23d0a Updated kn translations 2013-04-05 21:14:42 +05:30
Shankar Prasad 51a0f35d83 Updated kn translations 2013-04-05 21:14:42 +05:30
Alexander Larsson e9848b7db4 broadway: Unsure we clear the grab on window hide 2013-04-05 17:06:47 +02:00
Alexander Larsson ee4c1ded51 broadway: Fix warning
Don't pass NULL source_device in grab/ungrab events
2013-04-05 17:06:47 +02:00
Shankar Prasad 2e6697b588 Updated kn translations 2013-04-05 19:22:07 +05:30
Shankar Prasad 49c9db74b4 Updated kn translations 2013-04-05 17:51:00 +05:30
Balázs Úr 0ba7d68d50 Updated Hungarian translation 2013-04-04 21:53:17 +02:00
Alexander Larsson 0104f5c1bd Fix gtk_window_set_opacity()
We *do* want to call gdk_window_set_opacity() on toplevels, because
this particular case does work.

https://bugzilla.gnome.org/show_bug.cgi?id=697263
2013-04-04 15:41:02 +02:00
Alexander Larsson db98346844 broadway: Ensure we allocate shm surface space early
This is nicer then getting random sigbus later
2013-04-03 15:58:05 +02:00
Alexander Larsson 2c552820dc Broadway: Fix shm names
We were sometimes getting zero chars in the name, making them
shorter, due to an off-by-zero in the size.
2013-04-03 15:57:58 +02:00
Alexander Larsson 4d24c714c0 broadway: destroy old surface before creating new one
We were not using the old one anyway, and this may in some cases
use less memory (although in most cases the server has a ref to the
surface anyway).
2013-04-03 15:57:52 +02:00
Kjartan Maraas ed548bac49 Updated Norwegian bokmål translation 2013-04-03 11:54:20 +02:00
Cosimo Cecchi 66b0b287f1 window: don't schedule a display of mnemonics if window has no modifier
When the window has no mnemonics modifier set, as in the case of a
GtkMenu, never schedule a display of mnemonics on focus-in.

Previously, for those windows, the GdkModifierType mask fetched from the
device would typically have been zero, leading to the

mnemonic_modifier == (mask & gtk_accelerator_get_default_mod_mask ())

check to succeed, so we would always trigger a display for popup menus.

https://bugzilla.gnome.org/show_bug.cgi?id=697144
2013-04-02 16:52:09 -04:00
Cosimo Cecchi 4a8203abff window: refactor a function
Instead of having maybe_set_mnemonics_visible(), separate the checks
from the actual scheduling of mnemonics display.

https://bugzilla.gnome.org/show_bug.cgi?id=697144
2013-04-02 16:52:09 -04:00
Cosimo Cecchi 1b3f5d39a2 window: rename functions dealing with mnemonic delayed display
Don't mention "auto mnemonics", since those methods are purely about
scheduling a delayed display, and that makes understanding the code a
bit harder.

https://bugzilla.gnome.org/show_bug.cgi?id=697144
2013-04-02 16:52:09 -04:00
Cosimo Cecchi a101e85931 window: reset timeout source id before setting property
gtk_window_set_mnemonics_visible() will try to g_source_remove() it
otherwise, which seems harmless, but conceptually wrong.

https://bugzilla.gnome.org/show_bug.cgi?id=697144
2013-04-02 16:52:08 -04:00
Wojciech Szczęsny f08c27542b Updated Polish translation 2013-04-02 16:05:11 +02:00
Alexander Larsson cdc93acb25 broadway: Use wss: on https: uris 2013-04-01 17:29:43 +02:00
Ville-Pekka Vainio 255511a44b Finnish translation update by Jiri Grönroos 2013-03-31 20:17:23 +03:00
Carles Ferrando d150a9f887 [l10n] Updated Catalan (Valencian) translation 2013-03-31 17:03:50 +02:00
Carles Ferrando c0e374dbbd [l10n] Updated Catalan (Valencian) translation 2013-03-30 16:23:25 +01:00
Pau Iranzo 6238ed3c97 [l10n] Update Catalan translation 2013-03-30 16:22:56 +01:00
Matej Urbančič 7caa7aa6aa Updated Slovenian translation 2013-03-30 11:33:21 +01:00
Matej Urbančič 05137833af Updated Slovenian translation 2013-03-30 11:17:13 +01:00
Matej Urbančič 5240cc79db Updated Slovenian translation 2013-03-30 11:12:18 +01:00
Matej Urbančič e292243e9a Updated Slovenian translation 2013-03-30 11:06:20 +01:00
Matej Urbančič 72abb9ea1e Updated Slovenian translation 2013-03-30 10:57:41 +01:00
Matej Urbančič 9244c8e74a Updated Slovenian translation 2013-03-30 10:55:18 +01:00
Matej Urbančič f93f666446 Updated Slovenian translation 2013-03-30 09:42:45 +01:00
Andika Triwidada f7bbbd51bf Updated Indonesian translation; minor fixes on source references 2013-03-30 13:03:41 +07:00
Alexander Larsson 03bb44ae2f broadway: Reuse surfaces passed to server
This way we don't have to reopen all the time for pure updates,
and we can immediately unlink the shm file to avoid "leaking" them
on improper shutdown.
2013-03-29 14:10:27 +01:00
Alexander Larsson 468daefa21 broadway: Move surface open to server
This way we can cache the last opened surface
2013-03-29 14:10:27 +01:00
Alexander Larsson 4e997cda73 broadway: Make chrome work again 2013-03-29 14:10:27 +01:00
Alexander Larsson 1045dca148 broadway: Add support for password authentication 2013-03-29 14:10:27 +01:00
Alexander Larsson f713111232 broadway: Limit window resize based on window geometry 2013-03-29 14:10:26 +01:00
Alexander Larsson f741a4b64f broadway: Sync surface updates with paint clock
We now only update surface data after we have painted. Before we painted
in an idle, which meant we might send black data some times if we e.g.
resized the window and had not painted yet. Also, it means we're updating
less often to the daemon, saving resources.

We still have to queue a flush in the idle for non-draw operations,
otherwise e.g. resize of a toplevel will never be flushed if the clock
is frozen (e.g. during toplevel resize).
2013-03-29 14:10:26 +01:00
Alexander Larsson 859d502095 broadway: Ensure window sizes are synched right
We don't want to update the window size on configure event, only
the position, as the size is client side controlled. We were
updating to an old size during resizes which causes us to send
surfaces of the wrong size to the daemon.
2013-03-29 14:10:26 +01:00
Alexander Larsson 4400c21523 broadway: Clean up moveresize code 2013-03-29 14:10:26 +01:00
Alexander Larsson 83c9d0df8b broadway: Remove leftover cruft that caused resize to fail
getTransientToplevel() doesn't exist anymore so this broke.
2013-03-29 14:10:26 +01:00
Alexander Larsson 365612cfda broadway: Fix mouse position typo 2013-03-29 14:10:26 +01:00
Benjamin Otte ff4c3bc5a8 reftests: Add a reftest for color resolving errors
This checks the fixes in the last two commits.
2013-03-29 00:30:36 +01:00
Benjamin Otte 818c590671 cssvalue: At cycle detection to color resolving
The following CSS would infloop:

@define-color self @self

as it would infinitely lookup the color named "self" and try to resolve
it. This patch adds detection of such cycles to the resolve function by
keeping a list of currently resolving colors in the cycle_list variable.
2013-03-29 00:30:36 +01:00
Benjamin Otte 450f9c6d1d cssvalue: Handle named colors not resolving
If a named color references a nonexistant named color, we didn't catch
that error and ended up crashing on a NULL-dereference.
This crashed Boxes, because its CSS referenced values from the theme
that didn't exist in any theme.
2013-03-29 00:30:36 +01:00
Andika Triwidada 5ddc5e6b62 Updated Indonesian translation of po-properties 2013-03-28 21:07:30 +07:00
Kristian Rietveld 12ffae5b1b quartz: move atom/pasteboard type conversions functions to GDK
(cherry picked from commit 6f607fc8b4)
2013-03-28 13:43:38 +01:00
Alexander Larsson e495d318cb GtkOverlay: Respect overlay child min size
Never allocate an overlayed child less than its minimum request.
If the minimum doesn't fit we will gracefully clip via the
widget window.

https://bugzilla.gnome.org/show_bug.cgi?id=696623
2013-03-28 13:25:54 +01:00
Alexander Larsson b54f277a9b GtkOverlay: Don't allocate child except in size_allocate
We were calling gtk_overlay_child_allocate() both in realize
and in add as we wanted to create and position the child windows
for the widgets. However, this call also actually called
gtk_widget_size_allocate() on the child, which it shouldn't. In some
cases the overlay is realized before being allocated, and thus it
will allocate the child at 0x0 which is an invalid size for it to be in.
In particular, if the child has margins set this will result in negative
allocations and warnings.

This fix splits out the allocation computation so that
gtk_overlay_create_child_window can use it without callers
having to call gtk_overlay_child_allocate() to move the windows.

https://bugzilla.gnome.org/show_bug.cgi?id=696623
2013-03-28 13:05:15 +01:00
Alexander Larsson 8c02e290c4 gdkwindow: Apply layered areas to the shape for native windows
If a window is overlapped by a layered (i.e. partially transparent)
window then that region will not disappear from the native window clip
region. This lets us handle compositing multiple layers of windows.

For native subwindows this doesn't really work. For them we apply the
clip region as a shape to the native window which lets us have client
side windows overlapping the native window. However, with the addition
of the layered stuff the "overlapped-by-alpha-csw" part got broken, as
this area is not removed from the clip region of the native window.

We fix this by also removing the layered area when applying the shape.
This means alpha and alpha backgrounds don't work over native windows,
but there is not much to do about that.

https://bugzilla.gnome.org/show_bug.cgi?id=696370
2013-03-27 11:53:40 +01:00
Alexander Larsson 6ca15267c9 gdkwindow: Add alpha_bg to window debug print 2013-03-27 11:42:44 +01:00
Marek Černocký 496e2a486e Updated Czech translatio 2013-03-26 23:05:34 +01:00
Matej Urbančič 2636a091c8 Updated Slovenian translation 2013-03-26 22:27:41 +01:00
Inaki Larranaga Murgoitio 3342732846 Updated Basque language 2013-03-26 11:20:35 +01:00
Inaki Larranaga Murgoitio 2335d11356 Updated Basque language 2013-03-26 11:09:12 +01:00
Chun-wei Fan 9c94e48420 Bug 695895: Fix gtk3-demo on Windows
In commit 4e41577b, we are using g_content_type_is_a() to determine how
to display the demo resources in the right pane of the gtk3-demo program.

Use g_content_type_get_mime_type(), so that we can obtain the mime
type of the demo resources on all platforms, as g_content_type_guess()
returns a platform-specific string, as
https://developer.gnome.org/gio/2.35/gio-GContentType.html states.

As .ui files and .css files are normally registered with a different mime
type string on Windows, check for those strings as well.

This will ensure the demo resources can be properly displayed on Windows
as well.
2013-03-26 17:00:11 +08:00
Ani Peter 95f3fcadb9 Completed for Malayalam 2013-03-26 10:50:13 +05:30
Chun-wei Fan 97c7586fdb Fix Visual Studio property sheets
The creation of the folder for the "installation" of a11y headers is wrong,
so fix that.
2013-03-26 11:56:32 +08:00
Matthias Clasen ec823e4c93 Bump version 2013-03-25 18:32:00 -04:00
Matthias Clasen c8bac063a2 3.8.0 2013-03-25 16:58:53 -04:00
Daniel Korostil 0fac7578ce Added uk translation 2013-03-25 22:43:15 +02:00
Matej Urbančič 1da101c202 Updated Slovenian translation 2013-03-25 20:51:53 +01:00
Mario Blättermann 6d08a67297 [l10n] Updated German translation 2013-03-25 19:28:35 +01:00
A S Alam fff0ed307d Punjabi: Translation updated (aalam) 2013-03-25 22:58:45 +05:30
Carlos Garcia Campos 73c6f82f5d gtkprintbackendcups: Fix a crash in avahi_create_browsers()
In avahi_request_printer_list() a new connection to the DBus system bus
is started asynchronously, but it's not cancellable and it's not taking
any reference of the GtkPrintBackendCups. This means that when the
callback is called, the object might have been destroyed already. We can
just pass the cancellable created and check for the cancelled error in
the callback before trying to use the GtkPrintBackendCups. The code to
cancel avahi operations and to unsibscribe from the DBus signals has
been moved from finalize to dispose to make sure it happens as soon as
possible.

https://bugzilla.gnome.org/show_bug.cgi?id=696553
2013-03-25 14:59:06 +01:00
Krishnababu Krothapalli 2f555ca155 Updated Telugu Translations 2013-03-25 19:22:17 +05:30
Carlos Garcia Campos 42650a2a3f gtkprintbackendcups: Fix a crash in gtk_print_backend_cups_finalize()
If GtkPrintBackendCups is finalized and cups_get_printer_list hasn't
been called, g_object_unref is called for the GDBusConnection pointer
that is NULL. Use g_clear_object() instead.

https://bugzilla.gnome.org/show_bug.cgi?id=696546
2013-03-25 14:42:21 +01:00
Alexandre Franke 5442023b80 Update French translation 2013-03-25 12:00:26 +01:00
Shantha kumar ac31a0c29d Tamil Translations Updated 2013-03-25 15:27:34 +05:30
Shantha kumar 7353b052b0 Tamil Translations Updated 2013-03-25 15:26:41 +05:30
Sweta Kothari b7456e253d Updated gujarati file 2013-03-25 14:08:14 +05:30
Rajesh Ranjan a74fc2fdf1 hindi translation by chandan kumar 2013-03-25 12:59:10 +05:30
Rajesh Ranjan 94ffe17f74 hindi translation by chandan kumar 2013-03-25 12:25:41 +05:30
Matthias Clasen 6297fc28f3 broadway: Don't use deprecated gdk_cursor_ref 2013-03-24 20:27:14 -04:00
Sébastien Wilmet 8301f4258f GtkLabel: fix underlining of mnemonics
The underscore was shown in front of the mnemonic instead of underlining
it (e.g., _Save).

Thanks to Lars Uebernickel.

https://bugzilla.gnome.org/show_bug.cgi?id=674759
2013-03-24 20:26:42 -04:00
Tarnyko 58889736f6 win32: Bring back spinner animation
Define the spinner animation in css.
https://bugzilla.gnome.org/show_bug.cgi?id=696202
2013-03-24 20:26:29 -04:00
Marc-André Lureau e3e8783c98 win32: do not crash on invalid utf8 conversion
g_utf8_to_utf16() is not guaranteed to succeed. Check the error
and return if it failed.

https://bugzilla.gnome.org/show_bug.cgi?id=696232
2013-03-24 20:26:17 -04:00
Tarnyko dc6cb1d2f1 win32: Improve GtkAssistant theming
The highlighted color chosen for GtkAssistant header font
(deep blue) makes it hardly readable is most cases. Switch
to light gray.
https://bugzilla.gnome.org/show_bug.cgi?id=696171
2013-03-24 20:26:01 -04:00
Vadim Godunko 71250a7b74 Fix drawing of grid lines in RTL
The vertical grid lines were not properly positions in
RTL locales.
https://bugzilla.gnome.org/show_bug.cgi?id=696051
2013-03-24 20:25:50 -04:00
Tristan Van Berkom 4a57841c74 GtkBuilder: Fixed documentation
The documentation was referring to an <external-object> tag
which we never implemented
2013-03-24 20:25:36 -04:00
Matthias Clasen e2648b8794 GtkColorChooserDialog: make alternative button order work
The alternative button order that we set did not actually
work, since the ok button did not have a response id.
Partial fix for
https://bugzilla.gnome.org/show_bug.cgi?id=695493
2013-03-24 20:24:48 -04:00
Luca Ferretti d2a32d3309 [l10n] updated Italian translation 2013-03-24 21:00:19 +01:00
Petr Kovar 13f29d1666 Update Czech translation 2013-03-24 19:19:07 +01:00
Fran Diéguez 4ff5920876 Updated Galician translations 2013-03-24 18:56:12 +01:00
Mario Blättermann 7e006543ba [l10n] Updated German translation 2013-03-24 12:52:43 +01:00
Jorge Pérez Pérez 4a9fae23b3 Updated Aragonese translation 2013-03-23 22:20:15 +01:00
John Lindgren 9a7affbd69 Use natural size to set adjustment ranges
This is an (unintentional) side effect of my changes to GtkTreeView's
get_preferred_size() implementation.  It seems odd to me that
GtkTreeView directly determines its own size when inside a
GtkScrolledWindow, but since it does, it should be using its natural
size, not its minimum size.
2013-03-23 19:41:09 +01:00
Yuri Myasoedov a2179cd9af Updated Russia translation 2013-03-23 20:03:18 +04:00
Cosimo Cecchi bbd6669ce5 appchooserbutton: filter out applications not supposed to be visible
Ensure NoDisplay=true applications don't end up in the list populated by
GtkAppChooserButton.

https://bugzilla.gnome.org/show_bug.cgi?id=696405
2013-03-22 15:28:27 -04:00
Chao-Hsiung Liao 93d503d5d9 Updated Traditional Chinese translation(Hong Kong and Taiwan) 2013-03-22 21:16:15 +08:00
Kalev Lember 5ca69b319a win32: link with -lwinmm
... to resolve the timeBeginPeriod() / timeEndPeriod() symbols after
commit 5dbf814f0c.
2013-03-21 22:58:50 +01:00
Baurzhan Muftakhidinov cfa20539f7 Updated Kazakh translation. 2013-03-22 00:22:37 +06:00
Fran Diéguez 75c8fe77fe Updated Galician translations 2013-03-21 19:17:35 +01:00
Gabor Kelemen 8bcd4c4ed5 Updated Hungarian translation 2013-03-21 00:31:21 +01:00
Balázs Úr d3752c4c2f Updated Hungarian translation 2013-03-20 22:14:41 +01:00
ManojKumar Giri 15fc151bd7 Updated Odia Translation. 2013-03-20 19:35:42 +05:30
ManojKumar Giri 9fa2406687 Updated Odia Translation. 2013-03-20 19:29:45 +05:30
Alexander Larsson 2743e96721 GtkWidget: Handle style updates before realize
If the style changes before we're realized we will delay the
style-updated signal until realize. However, we then lose
the changes bitmap. This means that gtk_widget_real_style_updated()
must treat a NULL change as "everything changed" and queue a resize.
(cherry picked from commit 76e466197a)
2013-03-20 14:05:30 +01:00
Chun-wei Fan 4d95403144 Update Visual Studio Proprerty Sheets
Stop installing the gtk3-demo data files as they are now built into the
gtk3-demo program using GResources.
2013-03-20 19:09:55 +08:00
Chao-Hsiung Liao 97cd5809ef Updated Traditional Chinese translation(Hong Kong and Taiwan) 2013-03-20 19:07:34 +08:00
Chun-wei Fan cd1cab2a9f Fix introspection building for Visual Studio builds
Apparently time_t is used in gtkrecentmanager.h, which is a special type
that could not be recognized when Gtk-3.0.gir is built.  Judging from the
ast.py from the gobject-introspection package, we can define time_t as
long, and this will allow pygobject to load the Gtk module from
gi.repository.
2013-03-20 17:43:40 +08:00
Arash Mousavi 3aa42a83b1 L10N: Updated Persian Translation 2013-03-20 10:14:30 +03:30
Sandeep Sheshrao Shedmake 5da225b425 Updated Marathi Translations 2013-03-20 09:48:03 +05:30
Gil Forcada adf6875d54 [l10n] Updated Catalan translation 2013-03-19 23:15:40 +01:00
Matthias Clasen 2764eb8518 Post-release version bump 2013-03-18 22:30:36 -04:00
Matthias Clasen 22b4ac28a1 3.7.14 2013-03-18 22:20:22 -04:00
Мирослав Николић e7b83db34c Updated Serbian translation 2013-03-18 20:50:56 +01:00
Мирослав Николић 3ca01303c0 Updated Serbian translation 2013-03-18 20:50:05 +01:00
Мирослав Николић ff8005a73b Updated Serbian translation 2013-03-18 20:33:22 +01:00
Alexander Larsson 824a7c35f1 broadway: Fix assert failure
Requests are not limited in size by BroadwayRequest, as
BroadwayRequestTranslation can be of variable size. No need
to copy the request anymore though, because requests are aligned
now.
2013-03-18 16:39:22 +01:00
Alexander Larsson 248854d1ac broadway: Ensure broadway request members are 32bit aligned 2013-03-18 16:39:21 +01:00
Christian Persch e314029326 gtk: gtk_init_with_args allows NULL for parameter_string 2013-03-18 14:13:53 +01:00
Daniel Mustieles addb269740 Updated Spanish translation 2013-03-18 13:08:31 +01:00
Rūdolfs Mazurs 814da3da2b Updated Latvian translation 2013-03-18 13:45:51 +02:00
Fran Diéguez 2126796de1 Updated Galician translations 2013-03-17 23:26:13 +01:00
Matthias Clasen 980968c65a GtkFontButton: default show-preview-entry to TRUE
This is what the property declaration says, after all.
https://bugzilla.gnome.org/show_bug.cgi?id=695948
2013-03-17 17:12:15 -04:00
Alban Browaeys c8b3d2318a GtkEntryAccessible: also handle entry icon tooltip NULL in notify_gtk.
To clear the tooltip one is to set the tooltip to NULL. Though
the GtkEntryAccessible expect this tooltip to not be NULL in
gtk_entry_accessible_notify_gtk (already handling this case
 in its _init).

Fixes:
** (epiphany:23914): CRITICAL **: atk_object_set_description: assertion
`description != NULL' failed
when epiphany g_object_set the entry icon tooltip to NULL (clear the
tooltip) in its find bar.

https://bugzilla.gnome.org/show_bug.cgi?id=695375
2013-03-17 16:13:23 -04:00
Sébastien Wilmet cf09b40961 GtkLabel: fix mnemonic-keyval when use-markup is true
To extract the mnemonic key value, the string must contain the
underscore. But when the "gtk-auto-mnemonics" setting is true and when
the Alt key is not pressed, the underscore must not be displayed. The
problem was that the 'new_str' variable was used for both purposes:
extract the text to display, and extract the accelerator character.

When the underscore must not be visible, the underscores were removed
from the 'new_str' variable before extracting the accelerator character.

Now there are two strings, one for each purpose.

https://bugzilla.gnome.org/show_bug.cgi?id=674759
2013-03-17 16:11:03 -04:00
Ihar Hrachyshka 2f84f2d0b3 Updated Belarusian translation. 2013-03-17 15:52:46 +03:00
Ask H. Larsen 646efb936e Updated Danish translation of the properties 2013-03-17 08:39:45 +01:00
Ask H. Larsen 50082cd220 Updated Danish translation 2013-03-17 08:15:38 +01:00
Martin Srebotnjak 94500e03e2 Updated Slovenian translation 2013-03-16 09:54:06 +01:00
Martin Srebotnjak 547df506f2 Updated Slovenian translation 2013-03-16 09:47:25 +01:00
Benjamin Otte 79f527b223 stylecontext: Do invalidation on first resize container
... instead of taking the last one we find. This is necessary as
attached widgets (mostly menus) can be attached to an invisible widget,
but we still want to invalidate styles for them.

https://bugzilla.gnome.org/show_bug.cgi?id=695772
2013-03-16 00:09:50 +01:00
Claude Paroz ac06a672b0 Updated po-properties French translation 2013-03-15 23:29:26 +01:00
Duarte Loreto f48255f484 Updated Portuguese translation 2013-03-15 21:22:15 +00:00
Duarte Loreto 628a794ade Updated Portuguese translation 2013-03-15 21:17:12 +00:00
Duarte Loreto 44f05f6546 Updated Portuguese translation 2013-03-15 21:10:42 +00:00
Aurimas Černius 2b9ee49e73 Updated Lithuanian properties translation 2013-03-15 23:03:59 +02:00
Aurimas Černius 488da31fe2 Updated Lithuanian translation 2013-03-15 22:52:51 +02:00
Benjamin Otte 74e8ed196b reftests: Add reftest for separator fixes
Reftest for 549893c7d1.

Includes a workaround for a grid bug which should be removed once
GtkGrid is fixed.
2013-03-15 19:11:41 +01:00
Benjamin Otte 549893c7d1 separator: Don't use padding and borders wrongly
Borders for size requests and padding for drawing? Really?

Removed them, as that is the least invasive fix shortly before a
release.
2013-03-15 19:11:23 +01:00
Daniel Mustieles f15021b7d0 Updated Spanish translation 2013-03-15 13:32:38 +01:00
Martin Srebotnjak 2dfeb3b7ac Updated Slovenian translation 2013-03-15 11:49:39 +01:00
Martin Srebotnjak f83b794ce8 Updated Slovenian translation 2013-03-15 11:47:18 +01:00
Nilamdyuti Goswami f545a2b2c6 Assamese translation updated for gnome 3.8 2013-03-15 15:10:10 +05:30
Nilamdyuti Goswami e0deb74845 Assamese translation updated for gnome 3.8 2013-03-15 14:50:13 +05:30
Matthias Clasen 2e9567afb7 Minor doc cleanup
Remove widget references from interface docs.

https://bugzilla.gnome.org/show_bug.cgi?id=695874
2013-03-14 20:38:10 -04:00
John Lindgren 53d5eef846 treeview: Don't emit cursor-changed in destruction
This is a workaround until we have a good idea on how we want to handle
signal disconnection before/during/after dispose and destroy vfunc
calls.

https://bugzilla.gnome.org/show_bug.cgi?id=671939
2013-03-14 20:36:58 -04:00
Benjamin Otte e299469e18 a11y: Emit text-changed signals directly
When setting new text on the label, the text-changed::delete signal
needs to be emitted before deleting the text (so that atk-bridge can
query the old text) while the text-changed::insert event needs to happen
afterwards (for the same reason). The old code using the notify signal
was only emitted after changing the text.
2013-03-15 01:02:26 +01:00
Martin Srebotnjak db496ca88d Updated Slovenian translation 2013-03-14 23:21:36 +01:00
Nilamdyuti Goswami 3e510cbd1b Assamese translation updated for gnome 3.8 2013-03-14 22:32:56 +05:30
Bastien Nocera fcc6f9adff GtkApplication: Allow passing windows on non-X11 targets
It's not the application's fault that we don't do anything
with the passed GtkWindow on non-X11, so don't try to get an XID
on non-X11.

https://bugzilla.gnome.org/show_bug.cgi?id=695783
2013-03-14 17:44:37 +01:00
Andika Triwidada e565ef5055 Updated Indonesian translation 2013-03-14 17:55:03 +07:00
Daniel Mustieles 5b5608c1e3 Updated Spanish translation 2013-03-13 17:13:28 +01:00
Changwoo Ryu d79db12faa Updated Korean translation 2013-03-13 23:55:02 +09:00
Marek Kasik 67c08d7c1d printing: Use DBus calls instead of Avahi API
Converts usage of Avahi API to DBus calls. This change allows
us to remove dependency on avahi-gobject and avoids of possible
circular dependency.
Lists printers if Gtk+ is compiled with CUPS 1.6 or newer.

https://bugzilla.gnome.org/show_bug.cgi?id=695715
2013-03-13 15:35:35 +01:00
Marek Kasik f7676ba9ed printing: Remove usage of GError in connection test
Really remove usage of error in previous commit.

Related to
https://bugzilla.gnome.org/show_bug.cgi?id=695714
2013-03-13 15:26:37 +01:00
Marek Kasik ddd6471d14 printing: Don't hang when getting info for Avahi printer
Asynchronously create testing connection to address returned
by GaServiceResolver. Don't request info for such printer if
the connection fails.

https://bugzilla.gnome.org/show_bug.cgi?id=695714
2013-03-13 14:59:56 +01:00
Dimitris Spingos 857c01028a Updated Greek translation 2013-03-13 15:19:19 +02:00
Gheyret Kenji 6b45f3e1c4 Updated Uyghur translation
Signed-off-by: Gheyret Kenji <gheyret@gmail.com>
2013-03-13 20:52:17 +09:00
Marek Kasik 16c9f37b18 printing: Show Avahi printers on IPv6 network
Create correct URIs for printers on IPv6 networks.
2013-03-13 10:56:24 +01:00
Fran Diéguez be65eb8850 Updated Galician translations 2013-03-13 10:26:18 +01:00
Chun-wei Fan 75a19fdf18 gdk/gdkwindow.c, gtk/gtkwidget.c: Include fallback-c89.c
Both of them started to make use of round(), a C99 function.  So, include
fallback-c89.c to provide a fallback implementation for round() for
compilers that don't have round()

https://bugzilla.gnome.org/show_bug.cgi?id=694339
2013-03-13 13:14:05 +08:00
Chun-wei Fan 46e7d8530c gdk/fallback-c89.c: Add fallback for round()
This is essentially done by simply copying from gtk/fallback-c89.c

https://bugzilla.gnome.org/show_bug.cgi?id=694339
2013-03-13 13:13:54 +08:00
243 changed files with 86170 additions and 57503 deletions
+268
View File
@@ -1,3 +1,271 @@
Overview of Changes in GTK+ 3.8.9
=================================
* Bugs fixed:
719762 translate_crossing_mode() assertion error sinc...
win32: add more width to the slider to not cut...
win32: add margin to scale trough
win32: set color for scale marks
win32: actually match the separator
win32: scale slider with marks was off by 2 pixels
win32: handle again gtk-font-name
Overview of Changes in GTK+ 3.8.8
=================================
* Bugs fixed:
705203 Natural scroll doesn't work immediately
712799 Memory leak when listing Avahi printers
715029 Ensure GdkScreen::monitors-changed gets emitted...
Overview of Changes in GTK+ 3.8.7
=================================
* Bugs fixed:
577642 Selected Printer Does Not Stick Between Sessions
699574 gtk_selection_owner_set() breaks mouse wheel scrolling
702663 GtkComboBox::appears-as-list does not respect scrolling
703784 Epiphany crash during displaying printing dialog
705176 Reordering columns in GtkTreeView freezes mutter
710666 Frame clock related bug fixes
710754 GtkModelMenu: don't leak submenus
712213 Nautilus "connect to server" dialog has an incorrect "_"...
Overview of Changes in GTK+ 3.8.6
=================================
* Bugs fixed:
698730 tooltip: Fix possible wrong placement
709697 Fix a warning in builg gtk+ with clang
709967 Double free in gtkicontheme.c
710073 Assertion failure because _gtk_icon_info_load...
Overview of Changes in GTK+ 3.8.5
=================================
* Bugs fixed:
339539 Ctrl-C, Ctrl-V changes tags
341146 reorder lines in configure.in for a better display
513812 Optimize gdk_cairo_set_source_pixbuf() alpha multipli...
586107 gtkprintbackendpapi.c does not compile on Solaris 10
696756 x11: gdk_device_get_source : assertion `GDK_IS_DEVICE...
703062 GtkTreeViewColumn returns negative size request on em...
706269 Clarify GtkBox, GtkHBox, and GtkVBox documentation
706345 GtkExpander's click-and-drag behavior should match th...
707872 GtkSwitch shouldn't have a default name
707926 GtkSwitch shouldn't have a default accessible description
708414 entrycompletion: set the GtkWindow as attached to the...
709056 icontheme: use g_file_load_contents() for symbolic icons
709264 Fix memory leaks in icons handling
* Translation updates:
Scottish Gaelic
Slovenian
Overview of Changes in GTK+ 3.8.3
=================================
* Bugs fixed:
667759 gtkdnd-quartz.c is missing annotations for introspection
672271 File chooser seems over-enthusiastic about using subdir...
674108 Hard crash due to wrong NSAutoreleasePool stacking
680953 set_item_width / text wrapping doesn't work in iconview...
688738 GtkMenuButton problem with mnemonics / accelerators
691921 GTK+ (quartz) built on Mac OS X 10.5 references [NSMenu...
692548 Quartz: Cursor doesn't reset when the mouse leaves a to...
694273 Patch to support NSTextInputClient in text widgets
694755 When clicking Activities, sometimes gnome-shell crashes.
696498 can't set download folder
696640 GtkButton: Don't suppress unhandled mouse events
698183 Text input is too slow and some keys are broken after c...
698758 Wrong limit for "Native Windows wider or taller than 65...
700185 GtkWindow: problem with child widget visibility
700779 gtk_menu_item_draw puts the arrow too close to the border
701332 Patch for minor glitch in NSTextInput
701341 Windows only paint once in Weston 1.1
701365 Do not assert sm_proxy != NULL in GtkApplication inhibi...
701613 XEmbed doesn't work with frame-synced GTK/Mutter
702598 Invalid read of size 4 in gtk_icon_info_get_embedded_rect
702763 ellipsize placeholder text
702913 Reduce hash table lookups in gdk_x11_screen_supports_ne...
703069 Opening a big menu activates some menu entry
703220 Memory allocation integer overflow in gdk_cairo_set_sou...
705181 Annoying beep on arrow keys when using IME on MacOS
705182 Reset Cocoa IME state when immodule is reset
705320 gtkicontheme: check for GdkPixbuf first
705692 Segmentation fault on horizontal slider
705750 Quartz input method doesn't work correctly for Chinese...
706152 g_object_notify called with NULL priv->focus_widget
* Translation updates:
Brazilian Portuguese
Traditional Chinese
Overview of Changes in GTK+ 3.8.2
=================================
* Bugs fixed:
504901 GtkCellRendererCombo requires click-and-hold
695120 GtkMenu and GdkWindow sizes can get out of sync
698051 Typo in documentation comment
698181 Document icon-shadow CSS property
699104 when nothing is selected, Add to Bookmarks is enabled...
699239 Choose DnD/tooltip widget better on GtkOverlay and ot...
699750 Print dialog crashes when printer does not provide pr...
699901 GTK CSS keybinding broken
699929 GtkCheckMenuItem: remove an unused boolean field
700007 Various small improvements
700079 Fix accels added after the window was shown not working
Translation updates:
Brazilian Portuguese
German
Italian
Japanese
Lithuanian
Norwegian bokmål
Russian
Overview of Changes in GTK+ 3.8.1
=================================
* Broadway backend improvements:
- Ensure window sizes are synched right
- Sync surface updates with paint clock
- Add support for password authentication
- Reuse surfaces passed to server
* CSS improvements:
- Add cycle detection to color resolving
* Bug fixes
675649 gtk-demo: Fix typo
681446 gtkdnd memory leak
685419 gtkprintbackendfile: Infinite loop in _cairo_write()
685420 Critical warnings when GtkPrintJob is released too early
690275 scrolling on other windows is applied when coming back...
696370 GtkOverlay doesn't work on top of GtkClutterEmbed
696622 gtk option printer widget segfault in epiphany
696623 GtkOverlay with a revealer produces warnings setting a...
696882 GtkWindow changes size after hide/show cycle
697144 Popup menu mnemonics fixes
697263 Impossible to set window transparency on 3.8
697427 Unreferencing GtkStatusIcon object causes abort
* Translation updates
Basque
British English
Catalan (Valencian)
Czech
Finnish
Hungarian
Indonesian
Interlingua
Kannada
Malayalam
Norwegian bokmål
Polish
Simplified Chinese
Slovak
Slovenian
Overview of Changes in GTK+ 3.8.0
=================================
* Bug fixes
674759 GtkLabel: wrong value of "mnemonic-keyval" when...
695493 testgtk: issues with the color selection example
696051 vertical grid lines in rtl mode
696171 GtkAssistant highlighted font unreadable
696202 Add GtkSpinner animation back to Win32 theme
696232 win32: do not crash on invalid utf8 conversion
696405 appchooserbutton: filter out applications not...
696546 Fix a crash in gtk_print_backend_cups_finalize()
696553 Fix a crash in avahi_create_browsers()
Use natural size to set treeview adjustments
* Translation updates
Aragonese
Czech
French
Galician
German
Gujarati
Hindi
Hungarian
Italian
Kazakh
Marathi
Odia
Persian
Punjabi
Russian
Slovenian
Tamil
Traditional Chinese
Ukrainian
Overview of Changes in GTK+ 3.7.14
==================================
* A lot of filechooser button fixes
* Bugs fixed:
586367 In local_only mode, file chooser should return native...
671939 crash on exit
674759 GtkLabel: wrong value of "mnemonic-keyval" when "use-...
691040 selection is reported incorrectly in file chooser button
694339 Fix build of GTK+ on Windows
695200 Switching apps while a combobox open makes the parent...
695278 Avoid passing a NULL title to setTitle
695304 GtkTextView: don't popdown a bubble if we don't have one
695312 Initial 'text' set in the non-numeric-only GtkSpinBut...
695375 GtkEntryAccessible: also handle entry icon tooltip NU...
695391 wayland documentation section id is "gtk-osx"
695473 treeview: fix a critical warning
695482 Universal Access panel appears jumbled and horrible a...
695682 Cannot build docs for wayland-only build
695714 Getting of printer info can hang
695715 Use DBus calls instead of Avahi API
695772 Different appearance of menus within Audacious
695783 GtkApplication: Allow passing windows on non-X11 targets
695874 GtkFontChooser docs
695948 GtkFontButton sets wrong show-preview-entry
* Translation updates:
Arabic
Assamese
Belarusian
Brazilian Portuguese
Catalan
Danish
Finnish
French
Galician
German
Greek
Indonesian
Kazakh
Lithuanian
Korean
Polish
Portuguese
Punjabi
Serbian
Slovenian
Spanish
Uyghur
Overview of Changes in GTK+ 3.7.12
==================================
+1
View File
@@ -111,6 +111,7 @@ echo --no-libtool --library=gtk-3-vs%VSVER% ^^>> gtk_gir.bat
echo --reparse-validate --add-include-path=%BASEDIR%\share\gir-1.0 --add-include-path=. ^^>> gtk_gir.bat
echo --pkg-export gtk+-3.0 --warn-all --c-include="gtk/gtkx.h" ^^>> gtk_gir.bat
echo -I..\.. -DG_LOG_DOMAIN=\"Gtk\" -DGTK_LIBDIR=\"/dummy/lib\" ^^>> gtk_gir.bat
echo -Dtime_t=long ^^>> gtk_gir.bat
echo -DGTK_DATADIR=\"/dummy/share\" -DGTK_DATA_PREFIX=\"/dummy\" ^^>> gtk_gir.bat
echo -DGTK_SYSCONFDIR=\"/dummy/etc\" -DGTK_VERSION=\"3.6.2\" ^^>> gtk_gir.bat
echo -DGTK_BINARY_VERSION=\"3.0.0\" -DGTK_HOST=\"i686-pc-vs%VSVER%\" ^^>> gtk_gir.bat
+5
View File
@@ -20,6 +20,11 @@ ATK and GLib. External dependencies are at least Cairo
gettext-runtime, fontconfig*, freetype*, expat*. See the
build/win32/vs10/README.txt file in glib for details where to unpack them.
You will also need a Python 2.x/3.x interpretor installed on your system,
which can be obtained from the official installers available from
http://www.python.org. Please note that the Python interpretor (python.exe)
needs to be in your PATH before attempting the build of GTK+.
It is recommended that one builds the dependencies with VS10 as far as
possible, especially those from and using the GTK+ stack (i.e. GLib,
Cairo, ATK, Pango, GDK-Pixbuf), so that crashes caused by mixing calls
+15 -22
View File
@@ -2,17 +2,17 @@
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="UserMacros">
<VSVer>10</VSVer>
<GlibEtcInstallRoot>..\..\..\..\vs$(VSVer)\$(Platform)</GlibEtcInstallRoot>
<GlibEtcInstallRoot>$(SolutionDir)\..\..\..\..\vs$(VSVer)\$(Platform)</GlibEtcInstallRoot>
<GlibEtcInstallRootFromBuildWin32>..\..\..\vs$(VSVer)\$(Platform)</GlibEtcInstallRootFromBuildWin32>
<CopyDir>$(GlibEtcInstallRoot)</CopyDir>
<CopyDir>..\..\..\..\vs$(VSVer)\$(Platform)</CopyDir>
<DefDir>$(SolutionDir)$(Configuration)\$(Platform)\obj\$(ProjectName)</DefDir>
<ApiVersion>3.0</ApiVersion>
<GtkBinaryVersion>3.0.0</GtkBinaryVersion>
<GtkDummyPrefix>\"/dummy\"</GtkDummyPrefix>
<GtkPrefixDefine>GTK_PREFIX="\"$(GtkDummyPrefix)\""</GtkPrefixDefine>
<GdkDefines>GDK_COMPILATION;G_LOG_DOMAIN="\"Gdk\""</GdkDefines>
<GdkDefines>GDK_COMPILATION;G_LOG_DOMAIN="Gdk"</GdkDefines>
<GtkIncludedImmodulesDefines>INCLUDE_IM_am_et;INCLUDE_IM_cedilla;INCLUDE_IM_cyrillic_translit;INCLUDE_IM_ime;INCLUDE_IM_inuktitut;INCLUDE_IM_ipa;INCLUDE_IM_multipress;INCLUDE_IM_thai;INCLUDE_IM_ti_er;INCLUDE_IM_ti_et;INCLUDE_IM_viqr</GtkIncludedImmodulesDefines>
<GtkDefines>GTK_COMPILATION;G_LOG_DOMAIN="\"Gtk\"";GTK_HOST="\"i686-pc-vs$(VSVer)\"";GTK_PRINT_BACKENDS="\"file\"";GTK_PRINT_PREVIEW_COMMAND="\"undefined-gtk-print-preview-command\"";$(GtkIncludedImmodulesDefines);GTK_LIBDIR="\"$(GtkDummyPrefix)/lib\"";GTK_DATADIR="\"$(GtkDummyPrefix)/share\"";GTK_DATA_PREFIX="\"$(GtkDummyPrefix)\"";GTK_SYSCONFDIR="\"$(GtkDummyPrefix)/etc\"";MULTIPRESS_CONFDIR="\"$(GtkDummyPrefix)/etc/gtk-$(ApiVersion)\"";MULTIPRESS_LOCALEDIR="\"$(GtkDummyPrefix)/share/locale\"";GTK_VERSION="\"$(GtkVersion)/etc\"";GTK_BINARY_VERSION="\"$(GtkBinaryVersion)/etc\"";GDK_DISABLE_DEPRECATED</GtkDefines>
<GtkDefines>GTK_COMPILATION;G_LOG_DOMAIN="Gtk";GTK_HOST="i686-pc-vs$(VSVer)";GTK_PRINT_BACKENDS="file";GTK_PRINT_PREVIEW_COMMAND="undefined-gtk-print-preview-command";$(GtkIncludedImmodulesDefines);GTK_LIBDIR="$(GtkDummyPrefix)/lib";GTK_DATADIR="$(GtkDummyPrefix)/share";GTK_DATA_PREFIX="$(GtkDummyPrefix)";GTK_SYSCONFDIR="$(GtkDummyPrefix)/etc";MULTIPRESS_CONFDIR="$(GtkDummyPrefix)/etc/gtk-$(ApiVersion)";MULTIPRESS_LOCALEDIR="$(GtkDummyPrefix)/share/locale";GTK_VERSION="$(GtkVersion)/etc";GTK_BINARY_VERSION="$(GtkBinaryVersion)/etc";GDK_DISABLE_DEPRECATED</GtkDefines>
<GtkDoInstall>
echo on
@@ -23,23 +23,6 @@ copy $(Configuration)\$(Platform)\bin\*.dll $(CopyDir)\bin
copy $(Configuration)\$(Platform)\bin\*.exe $(CopyDir)\bin
mkdir $(CopyDir)\share\gtk-$(ApiVersion)\demo
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\share\gtk-$(ApiVersion)\demo
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\share\gtk-$(ApiVersion)\demo
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\share\gtk-$(ApiVersion)\demo
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\share\gtk-$(ApiVersion)\demo
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\share\gtk-$(ApiVersion)\demo
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\share\gtk-$(ApiVersion)\demo
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\share\gtk-$(ApiVersion)\demo
mkdir $(CopyDir)\lib
copy $(Configuration)\$(Platform)\bin\*-$(ApiVersion).lib $(CopyDir)\lib
@@ -593,7 +576,7 @@ copy ..\..\..\gtk\deprecated\gtkvseparator.h $(CopyDir)\include\gtk-$(ApiVersion
copy ..\..\..\gtk\deprecated\gtkvpaned.h $(CopyDir)\include\gtk-$(ApiVersion)\gtk\deprecated
mkdir $(CopyDir)\include\gtk-$(ApiVersion)\a11y
mkdir $(CopyDir)\include\gtk-$(ApiVersion)\gtk\a11y
copy ..\..\..\gtk\a11y\gtkarrowaccessible.h $(CopyDir)\include\gtk-$(ApiVersion)\gtk\a11y
@@ -727,6 +710,13 @@ cd vs$(VSVer)
</DoGenGir>
<GtkGenerateGdkDef>echo EXPORTS &gt;"$(DefDir)\gdk.def" &amp;&amp; cl /EP -DGDK_WINDOWING_WIN32 -DALL_FILES -DG_GNUC_CONST= ..\..\..\gdk\gdk.symbols &gt;&gt;"$(DefDir)\gdk.def"</GtkGenerateGdkDef>
<GtkGenerateGtkDef>echo EXPORTS &gt;"$(DefDir)\gtk.def" &amp;&amp; cl /EP -DGDK_WINDOWING_WIN32 -DINCLUDE_VARIABLES -DG_OS_WIN32 -DALL_FILES -DG_GNUC_MALLOC= -DG_GNUC_CONST= -DG_GNUC_NULL_TERMINATED= -DG_GNUC_PRINTF=;G_GNUC_PRINTF ..\..\..\gtk\gtk.symbols &gt;&gt;"$(DefDir)\gtk.def"</GtkGenerateGtkDef>
<GenerateGtkDbusBuiltSources>
cd ..\..\..\gtk
python $(GlibEtcInstallRoot)\bin\gdbus-codegen --interface-prefix org.Gtk. --c-namespace _Gtk --generate-c-code gtkdbusgenerated ./gtkdbusinterfaces.xml
cd $(SolutionDir)
</GenerateGtkDbusBuiltSources>
<GtkLibtoolCompatibleDllPrefix>lib</GtkLibtoolCompatibleDllPrefix>
<GtkLibtoolCompatibleDllSuffix>-$(ApiVersion)-0</GtkLibtoolCompatibleDllSuffix>
<GtkSeparateVSDllPrefix />
@@ -812,6 +802,9 @@ copy ..\..\..\gdk\gdkconfig.h.win32 ..\..\..\gdk\gdkconfig.h
<BuildMacro Include="GtkGenerateGtkDef">
<Value>$(GtkGenerateGtkDef)</Value>
</BuildMacro>
<BuildMacro Include="GenerateGtkDbusBuiltSources">
<Value>$(GenerateGtkDbusBuiltSources)</Value>
</BuildMacro>
<BuildMacro Include="GtkLibtoolCompatibleDllPrefix">
<Value>$(GtkLibtoolCompatibleDllPrefix)</Value>
</BuildMacro>
+2 -3
View File
@@ -36,8 +36,7 @@
<ClCompile Include="..\..\..\modules\input\thai-charprop.c"><Filter>Source Files</Filter></ClCompile>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="..\..\..\gdk\gtk.symbols">
<Filter>Resource Files</Filter>
</CustomBuild>
<CustomBuild Include="..\..\..\gdk\gtk.symbols"><Filter>Resource Files</Filter></CustomBuild>
<CustomBuild Include="..\..\..\gtk\gtkdbusinterfaces.xml"><Filter>Resource Files</Filter></CustomBuild>
</ItemGroup>
</Project>
+15 -1
View File
@@ -177,6 +177,20 @@
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(GtkGenerateGtkDef)</Command>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)gtk.def;%(Outputs)</Outputs>
</CustomBuild>
<CustomBuild Include="..\..\..\gtk\gtkdbusinterfaces.xml">
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating GTK+ DBus Sources...</Message>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(GenerateGtkDbusBuiltSources)</Command>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h;%(Outputs)</Outputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Generating GTK+ DBus Sources...</Message>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(GenerateGtkDbusBuiltSources)</Command>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h;%(Outputs)</Outputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Generating GTK+ DBus Sources...</Message>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(GenerateGtkDbusBuiltSources)</Command>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h;%(Outputs)</Outputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Generating GTK+ DBus Sources...</Message>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(GenerateGtkDbusBuiltSources)</Command>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h;%(Outputs)</Outputs>
</CustomBuild>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\..\gtk\gtk-win32.rc" />
@@ -212,4 +226,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>
+5
View File
@@ -19,6 +19,11 @@ ATK and GLib. External dependencies are at least Cairo
gettext-runtime, fontconfig*, freetype*, expat*. See the
build/win32/vs9/README.txt file in glib for details where to unpack them.
You will also need a Python 2.x/3.x interpretor installed on your system,
which can be obtained from the official installers available from
http://www.python.org. Please note that the Python interpretor (python.exe)
needs to be in your PATH before attempting the build of GTK+.
It is recommended that one builds the dependencies with VS9 as far as
possible, especially those from and using the GTK+ stack (i.e. GLib,
Cairo, ATK, Pango, GDK-Pixbuf), so that crashes caused by mixing calls
+11 -13
View File
@@ -33,7 +33,7 @@ copy ..\..\..\gdk\gdkconfig.h.win32 ..\..\..\gdk\gdkconfig.h&#x0D;&#x0A;
/>
<UserMacro
Name="GlibEtcInstallRoot"
Value="..\..\..\..\vs$(VSVer)\$(PlatformName)"
Value="$(SolutionDir)\..\..\..\..\vs$(VSVer)\$(PlatformName)"
/>
<UserMacro
Name="GlibEtcInstallRootFromBuildWin32"
@@ -41,7 +41,7 @@ copy ..\..\..\gdk\gdkconfig.h.win32 ..\..\..\gdk\gdkconfig.h&#x0D;&#x0A;
/>
<UserMacro
Name="CopyDir"
Value="$(GlibEtcInstallRoot)"
Value="..\..\..\..\vs$(VSVer)\$(PlatformName)"
/>
<UserMacro
Name="ApiVersion"
@@ -79,16 +79,6 @@ mkdir $(CopyDir)\bin&#x0D;&#x0A;
copy $(ConfigurationName)\$(PlatformName)\bin\*.dll $(CopyDir)\bin&#x0D;&#x0A;
copy $(ConfigurationName)\$(PlatformName)\bin\*.exe $(CopyDir)\bin&#x0D;&#x0A;
mkdir $(CopyDir)\share\gtk-$(ApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\share\gtk-$(ApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\share\gtk-$(ApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\share\gtk-$(ApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\share\gtk-$(ApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\share\gtk-$(ApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\share\gtk-$(ApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\share\gtk-$(ApiVersion)\demo&#x0D;&#x0A;
mkdir $(CopyDir)\lib&#x0D;&#x0A;
copy $(ConfigurationName)\$(PlatformName)\bin\*-$(ApiVersion).lib $(CopyDir)\lib&#x0D;&#x0A;
@@ -369,7 +359,7 @@ copy ..\..\..\gtk\deprecated\gtkvscrollbar.h $(CopyDir)\include\gtk-$(ApiVersion
copy ..\..\..\gtk\deprecated\gtkvseparator.h $(CopyDir)\include\gtk-$(ApiVersion)\gtk\deprecated&#x0D;&#x0A;
copy ..\..\..\gtk\deprecated\gtkvpaned.h $(CopyDir)\include\gtk-$(ApiVersion)\gtk\deprecated&#x0D;&#x0A;
mkdir $(CopyDir)\include\gtk-$(ApiVersion)\a11y&#x0D;&#x0A;
mkdir $(CopyDir)\include\gtk-$(ApiVersion)\gtk\a11y&#x0D;&#x0A;
copy ..\..\..\gtk\a11y\gtkarrowaccessible.h $(CopyDir)\include\gtk-$(ApiVersion)\gtk\a11y&#x0D;&#x0A;
copy ..\..\..\gtk\a11y\gtkbooleancellaccessible.h $(CopyDir)\include\gtk-$(ApiVersion)\gtk\a11y&#x0D;&#x0A;
@@ -455,6 +445,14 @@ cd vs$(VSVer)&#x0D;&#x0A;
Name="GtkGenerateGtkDef"
Value="echo EXPORTS &gt;&quot;$(IntDir)\gtk.def&quot; &amp;&amp; cl /EP -DGDK_WINDOWING_WIN32 -DINCLUDE_VARIABLES -DG_OS_WIN32 -DALL_FILES -DG_GNUC_MALLOC= -DG_GNUC_CONST= -DG_GNUC_NULL_TERMINATED= -DG_GNUC_PRINTF=;G_GNUC_PRINTF ..\..\..\gtk\gtk.symbols &gt;&gt;&quot;$(IntDir)\gtk.def&quot;"
/>
<UserMacro
Name="GenerateGtkDbusBuiltSources"
Value="
cd ..\..\..\gtk&#x0D;&#x0A;
python $(GlibEtcInstallRoot)\bin\gdbus-codegen --interface-prefix org.Gtk. --c-namespace _Gtk --generate-c-code gtkdbusgenerated ./gtkdbusinterfaces.xml&#x0D;&#x0A;
cd $(SolutionDir)&#x0D;&#x0A;
"
/>
<UserMacro
Name="GtkLibtoolCompatibleDllPrefix"
Value="lib"
+30
View File
@@ -210,6 +210,36 @@
/>
</FileConfiguration>
</File>
<File RelativePath="..\..\..\gtk\gtkdbusinterfaces.xml">
<FileConfiguration Name="Debug|Win32">
<Tool Name="VCCustomBuildTool"
Description="Generating GTK+ DBus Sources..."
CommandLine="$(GenerateGtkDbusBuiltSources)"
Outputs="..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h"
/>
</FileConfiguration>
<FileConfiguration Name="Release|Win32">
<Tool Name="VCCustomBuildTool"
Description="Generating GTK+ DBus Sources..."
CommandLine="$(GenerateGtkDbusBuiltSources)"
Outputs="..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h"
/>
</FileConfiguration>
<FileConfiguration Name="Debug|x64">
<Tool Name="VCCustomBuildTool"
Description="Generating GTK+ DBus Sources..."
CommandLine="$(GenerateGtkDbusBuiltSources)"
Outputs="..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h"
/>
</FileConfiguration>
<FileConfiguration Name="Release|x64">
<Tool Name="VCCustomBuildTool"
Description="Generating GTK+ DBus Sources..."
CommandLine="$(GenerateGtkDbusBuiltSources)"
Outputs="..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h"
/>
</FileConfiguration>
</File>
<File RelativePath="..\..\..\gtk\gtk-win32.rc" />
</Filter>
<Filter
+8 -46
View File
@@ -9,9 +9,9 @@
# set GTK_BINARY_AGE and GTK_INTERFACE_AGE to 0.
m4_define([gtk_major_version], [3])
m4_define([gtk_minor_version], [7])
m4_define([gtk_micro_version], [13])
m4_define([gtk_interface_age], [0])
m4_define([gtk_minor_version], [8])
m4_define([gtk_micro_version], [10])
m4_define([gtk_interface_age], [10])
m4_define([gtk_binary_age],
[m4_eval(100 * gtk_minor_version + gtk_micro_version)])
m4_define([gtk_version],
@@ -350,7 +350,7 @@ if test "$enable_win32_backend" = "yes"; then
backend_immodules="$backend_immodules,ime"
GDK_WINDOWING="$GDK_WINDOWING
#define GDK_WINDOWING_WIN32"
GDK_EXTRA_LIBS="$GDK_EXTRA_LIBS -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid"
GDK_EXTRA_LIBS="$GDK_EXTRA_LIBS -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lwinmm"
AM_CONDITIONAL(USE_WIN32, true)
PANGO_PACKAGES="pangowin32 pangocairo"
else
@@ -361,6 +361,7 @@ DISABLE_ON_QUARTZ=''
if test "x$enable_quartz_backend" = xyes; then
cairo_backends="$cairo_backends cairo-quartz"
GDK_BACKENDS="$GDK_BACKENDS quartz"
backend_immodules="$backend_immodules,quartz"
GDK_WINDOWING="$GDK_WINDOWING
#define GDK_WINDOWING_QUARTZ"
GDK_EXTRA_LIBS="$GDK_EXTRA_LIBS -framework Cocoa"
@@ -875,6 +876,7 @@ AM_CONDITIONAL(INCLUDE_IM_IME, [test x"$INCLUDE_ime" = xyes])
AM_CONDITIONAL(INCLUDE_IM_INUKTITUT, [test x"$INCLUDE_inuktitut" = xyes])
AM_CONDITIONAL(INCLUDE_IM_IPA, [test x"$INCLUDE_ipa" = xyes])
AM_CONDITIONAL(INCLUDE_IM_MULTIPRESS, [test x"$INCLUDE_multipress" = xyes])
AM_CONDITIONAL(INCLUDE_IM_QUARTZ, [test x"$INCLUDE_quartz" = xyes])
AM_CONDITIONAL(INCLUDE_IM_THAI, [test x"$INCLUDE_thai" = xyes])
AM_CONDITIONAL(INCLUDE_IM_TI_ER, [test x"$INCLUDE_ti_er" = xyes])
AM_CONDITIONAL(INCLUDE_IM_TI_ET, [test x"$INCLUDE_ti_et" = xyes])
@@ -1085,7 +1087,6 @@ if test "x$enable_x11_backend" = xyes; then
case "$host" in
*-*-solaris*)
# Check for solaris
AC_MSG_CHECKING(for Xinerama support on Solaris)
have_solaris_xinerama=false
AC_CHECK_FUNC(XineramaGetInfo,
@@ -1093,6 +1094,8 @@ if test "x$enable_x11_backend" = xyes; then
[have_solaris_xinerama=true], :,
[#include <X11/Xlib.h>])])
AC_MSG_CHECKING(for Xinerama support on Solaris)
if $have_solaris_xinerama ; then
X_EXTENSIONS="$X_EXTENSIONS Xinerama"
AC_DEFINE(HAVE_SOLARIS_XINERAMA, 1,
@@ -1242,7 +1245,6 @@ if test "$have_gio_unix" = "yes"; then
else
GDK_GIO_PACKAGE=gio-2.0
fi
AM_CONDITIONAL(HAVE_GIO_UNIX, test "$have_gio_unix" = "yes")
# Check for Pango flags
@@ -1455,45 +1457,6 @@ else
fi
fi
# Check for Avahi flags
AC_ARG_ENABLE(avahi-browsing,
[AS_HELP_STRING([--disable-avahi-browsing],
[disable avahi browsing of printers])],,
[enable_avahi_browsing=auto])
have_avahi_browsing=no
if test "x$enable_avahi_browsing" != "xno" -a \
"x$have_cups_api_1_6" = "xyes"; then
AC_MSG_CHECKING([avahi-gobject])
if $PKG_CONFIG --exists avahi-gobject ; then
AVAHI_CFLAGS=`$PKG_CONFIG --cflags avahi-gobject`
AC_SUBST(AVAHI_CFLAGS)
AVAHI_LIBS=`$PKG_CONFIG --libs avahi-gobject`
AC_SUBST(AVAHI_LIBS)
have_avahi_gobject=yes
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
if test "x$have_avahi_gobject" = "xyes" ; then
AC_DEFINE([HAVE_AVAHI_BROWSING], [1], [Define to 1 if avahi-gobject available])
have_avahi_browsing=yes
else
AC_MSG_ERROR([
*** avahi-gobject not found. avahi-gobject is required to build GTK+ with support
*** for avahi browsed printers when using CUPS 1.6.
])
fi
else
if test "x$enable_avahi_browsing" = "xyes"; then
AC_MSG_ERROR([
*** Avahi browsing support requested but CUPS 1.6 not found.
])
fi
fi
# Checks to see if we should compile with PAPI backend for GTK+
#
@@ -1870,7 +1833,6 @@ echo " Dynamic modules: $build_dynamic_modules"
echo " Included immodules: $included_immodules"
echo " PackageKit support: $build_packagekit"
echo " colord support: $have_colord"
echo " Avahi browsing: $have_avahi_browsing"
echo " Introspection: $found_introspection"
echo " Debugging: $enable_debug"
echo " Documentation: $enable_gtk_doc"
+11 -6
View File
@@ -403,7 +403,7 @@ static GtkWidget *create_text (GtkWidget **text_view, gboolean is_source);
static void
add_data_tab (const gchar *demoname)
{
gchar *resource_dir, *resource_name, *content_type;
gchar *resource_dir, *resource_name, *content_type, *content_mime;
gchar **resources;
GBytes *bytes;
GtkWidget *widget, *label;
@@ -427,17 +427,20 @@ add_data_tab (const gchar *demoname)
g_bytes_get_data (bytes, NULL),
g_bytes_get_size (bytes),
NULL);
content_mime = g_content_type_get_mime_type (content_type);
/* In theory we should look at all the mime types gdk-pixbuf supports
* and go from there, but we know what file types we've added.
*/
if (g_content_type_is_a (content_type, "image/png") ||
g_content_type_is_a (content_type, "image/gif") ||
g_content_type_is_a (content_type, "image/jpeg"))
if (g_content_type_is_a (content_mime, "image/png") ||
g_content_type_is_a (content_mime, "image/gif") ||
g_content_type_is_a (content_mime, "image/jpeg"))
{
widget = gtk_image_new_from_resource (resource_name);
}
else if (g_content_type_is_a (content_type, "text/plain"))
else if (g_content_type_is_a (content_mime, "text/plain") ||
g_content_type_is_a (content_mime, "application/x-ext-ui") ||
g_content_type_is_a (content_mime, "text/css"))
{
GtkTextBuffer *buffer;
GtkWidget *textview;
@@ -449,7 +452,8 @@ add_data_tab (const gchar *demoname)
}
else
{
g_warning ("Don't know how to display resource '%s' of type '%s'\n", resource_name, content_type);
g_warning ("Don't know how to display resource '%s' of type '%s'\n", resource_name, content_mime);
widget = NULL;
}
@@ -458,6 +462,7 @@ add_data_tab (const gchar *demoname)
gtk_widget_show (label);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), widget, label);
g_free (content_mime);
g_free (content_type);
g_free (resource_name);
g_bytes_unref (bytes);
+1 -1
View File
@@ -85,7 +85,7 @@ scroll_to_bottom (GtkTextView *textview)
gtk_text_iter_set_line_offset (&iter, 0);
/* and place the mark at iter. the mark will stay there after we
* insert some text at the end because it has right gravity.
* insert some text at the end because it has left gravity.
*/
mark = gtk_text_buffer_get_mark (buffer, "scroll");
gtk_text_buffer_move_mark (buffer, mark, &iter);
+37 -36
View File
@@ -22,6 +22,7 @@ struct _CanvasItem
gdouble x, y;
};
static gboolean drag_data_requested_for_drop = FALSE;
static CanvasItem *drop_item = NULL;
static GList *canvas_items = NULL;
@@ -266,6 +267,7 @@ interactive_canvas_drag_motion (GtkWidget *widget,
if (!target)
return FALSE;
drag_data_requested_for_drop = FALSE;
gtk_drag_get_data (widget, context, target, time);
}
@@ -295,16 +297,36 @@ interactive_canvas_drag_data_received (GtkWidget *widget,
tool_item = gtk_tool_palette_get_drag_item (GTK_TOOL_PALETTE (palette),
selection);
/* create a drop indicator when a tool button was found */
/* create a canvas item when a tool button was found */
g_assert (NULL == drop_item);
if (GTK_IS_TOOL_ITEM (tool_item))
if (!GTK_IS_TOOL_ITEM (tool_item))
return;
if (drop_item)
{
drop_item = canvas_item_new (widget, GTK_TOOL_BUTTON (tool_item), x, y);
gdk_drag_status (context, GDK_ACTION_COPY, time);
gtk_widget_queue_draw (widget);
canvas_item_free (drop_item);
drop_item = NULL;
}
CanvasItem *item = canvas_item_new (widget, GTK_TOOL_BUTTON (tool_item), x, y);
/* Either create a new item or just create a preview item,
depending on why the drag data was requested. */
if(drag_data_requested_for_drop)
{
canvas_items = g_list_append (canvas_items, item);
drop_item = NULL;
gtk_drag_finish (context, TRUE, FALSE, time);
} else
{
drop_item = item;
gdk_drag_status (context, GDK_ACTION_COPY, time);
}
gtk_widget_queue_draw (widget);
}
static gboolean
@@ -315,29 +337,19 @@ interactive_canvas_drag_drop (GtkWidget *widget,
guint time,
gpointer data)
{
if (drop_item)
{
/* turn the drop indicator into a real canvas item */
GdkAtom target = gtk_drag_dest_find_target (widget, context, NULL);
drop_item->x = x;
drop_item->y = y;
if (!target)
return FALSE;
canvas_items = g_list_append (canvas_items, drop_item);
drop_item = NULL;
/* signal the item was accepted and redraw */
gtk_drag_finish (context, TRUE, FALSE, time);
gtk_widget_queue_draw (widget);
return TRUE;
}
drag_data_requested_for_drop = TRUE;
gtk_drag_get_data (widget, context, target, time);
return FALSE;
}
static gboolean
interactive_canvas_real_drag_leave (gpointer data)
static void
interactive_canvas_drag_leave (gpointer data)
{
if (drop_item)
{
@@ -346,20 +358,9 @@ interactive_canvas_real_drag_leave (gpointer data)
canvas_item_free (drop_item);
drop_item = NULL;
gtk_widget_queue_draw (widget);
if (widget)
gtk_widget_queue_draw (widget);
}
return G_SOURCE_REMOVE;
}
static void
interactive_canvas_drag_leave (GtkWidget *widget,
GdkDragContext *context,
guint time,
gpointer data)
{
/* defer cleanup until a potential "drag-drop" signal was received */
g_idle_add (interactive_canvas_real_drag_leave, widget);
}
static void
@@ -591,7 +592,7 @@ do_toolpalette (GtkWidget *do_widget)
"signal::draw", canvas_draw, NULL,
"signal::drag-motion", interactive_canvas_drag_motion, NULL,
"signal::drag-data-received", interactive_canvas_drag_data_received, NULL,
"signal::drag-leave", interactive_canvas_drag_leave, NULL,
"signal::drag-leave", interactive_canvas_drag_leave, contents,
"signal::drag-drop", interactive_canvas_drag_drop, NULL,
NULL);
+9
View File
@@ -54,6 +54,15 @@ Start your applications like this:
BROADWAY_DISPLAY=:5 gtk3-demo
</programlisting>
You can add password protection for your session by creating a file in
<filename>$XDG_CONFIG_HOME/broadway.passwd</filename> or <filename>$HOME/.config/broadway.passwd</filename>
with a crypt(3) style password hash.
A simple way to generate it is with openssl:
<programlisting>
openssl passwd -1 > ~/.config/broadway.passwd
</programlisting>
</para>
</refsect1>
+1 -1
View File
@@ -83,7 +83,7 @@ broadwayd_SOURCES = \
broadway-output.h \
broadway-output.c
broadwayd_LDADD = $(GDK_DEP_LIBS) -lrt
broadwayd_LDADD = $(GDK_DEP_LIBS) -lrt -lcrypt
MAINTAINERCLEANFILES = $(broadway_built_sources)
EXTRA_DIST += $(broadway_built_sources)
+25
View File
@@ -317,6 +317,13 @@ broadway_output_get_next_serial (BroadwayOutput *output)
return output->serial;
}
void
broadway_output_set_next_serial (BroadwayOutput *output,
guint32 serial)
{
output->serial = serial;
}
/************************************************************************
* Core rendering operations *
@@ -471,6 +478,24 @@ broadway_output_new_surface(BroadwayOutput *output,
append_bool (output, is_temp);
}
void
broadway_output_request_auth (BroadwayOutput *output)
{
write_header (output, BROADWAY_OP_REQUEST_AUTH);
}
void
broadway_output_auth_ok (BroadwayOutput *output)
{
write_header (output, BROADWAY_OP_AUTH_OK);
}
void
broadway_output_disconnected (BroadwayOutput *output)
{
write_header (output, BROADWAY_OP_DISCONNECTED);
}
void
broadway_output_show_surface(BroadwayOutput *output, int id)
{
+5
View File
@@ -23,6 +23,8 @@ BroadwayOutput *broadway_output_new (GOutputStream *out,
void broadway_output_free (BroadwayOutput *output);
int broadway_output_flush (BroadwayOutput *output);
int broadway_output_has_error (BroadwayOutput *output);
void broadway_output_set_next_serial (BroadwayOutput *output,
guint32 serial);
guint32 broadway_output_get_next_serial (BroadwayOutput *output);
void broadway_output_new_surface (BroadwayOutput *output,
int id,
@@ -31,6 +33,9 @@ void broadway_output_new_surface (BroadwayOutput *output,
int w,
int h,
gboolean is_temp);
void broadway_output_request_auth (BroadwayOutput *output);
void broadway_output_auth_ok (BroadwayOutput *output);
void broadway_output_disconnected (BroadwayOutput *output);
void broadway_output_show_surface (BroadwayOutput *output,
int id);
void broadway_output_hide_surface (BroadwayOutput *output,
+4 -1
View File
@@ -36,6 +36,9 @@ typedef enum {
BROADWAY_OP_SET_TRANSIENT_FOR = 'p',
BROADWAY_OP_PUT_RGB = 'i',
BROADWAY_OP_FLUSH = 'f',
BROADWAY_OP_REQUEST_AUTH = 'l',
BROADWAY_OP_AUTH_OK = 'L',
BROADWAY_OP_DISCONNECTED = 'D',
} BroadwayOpType;
typedef struct {
@@ -160,7 +163,7 @@ typedef struct {
typedef struct {
BroadwayRequestBase base;
guint32 id;
char name[34];
char name[36];
guint32 width;
guint32 height;
} BroadwayRequestUpdate;
+198 -37
View File
@@ -2,6 +2,8 @@
#include "broadway-output.h"
#define _XOPEN_SOURCE /* for crypt */
#include <glib.h>
#include <glib/gprintf.h>
#include "gdktypes.h"
@@ -9,6 +11,10 @@
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <crypt.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
@@ -19,6 +25,7 @@ typedef struct BroadwayWindow BroadwayWindow;
struct _BroadwayServer {
GObject parent_instance;
char *password;
char *address;
int port;
GSocketService *service;
@@ -69,6 +76,7 @@ typedef struct HttpRequest {
struct BroadwayInput {
BroadwayServer *server;
BroadwayOutput *output;
GSocketConnection *connection;
GByteArray *buffer;
GSource *source;
@@ -76,6 +84,7 @@ struct BroadwayInput {
gint64 time_base;
gboolean proto_v7_plus;
gboolean binary;
gboolean active;
};
struct BroadwayWindow {
@@ -90,6 +99,9 @@ struct BroadwayWindow {
gint32 transient_for;
cairo_surface_t *last_surface;
char *cached_surface_name;
cairo_surface_t *cached_surface;
};
static void broadway_server_resync_windows (BroadwayServer *server);
@@ -100,6 +112,8 @@ static void
broadway_server_init (BroadwayServer *server)
{
BroadwayWindow *root;
char *passwd_file;
char *password, *p;
server->service = g_socket_service_new ();
server->pointer_grab_window_id = -1;
@@ -108,6 +122,22 @@ broadway_server_init (BroadwayServer *server)
server->id_ht = g_hash_table_new (NULL, NULL);
server->id_counter = 0;
passwd_file = g_build_filename (g_get_user_config_dir (),
"broadway.passwd", NULL);
if (g_file_get_contents (passwd_file,
&password, NULL, NULL))
{
p = strchr (password, '\n');
if (p)
*p = 0;
g_strstrip (password);
if (strlen (password) > 3)
server->password = password;
else
g_free (password);
}
root = g_new0 (BroadwayWindow, 1);
root->id = server->id_counter++;
root->width = 1024;
@@ -139,7 +169,7 @@ broadway_server_class_init (BroadwayServerClass * class)
object_class->finalize = broadway_server_finalize;
}
static void start_output (HttpRequest *request, gboolean proto_v7_plus, gboolean binary);
static void start (BroadwayInput *input);
static void
http_request_free (HttpRequest *request)
@@ -349,6 +379,14 @@ update_future_pointer_info (BroadwayServer *server, BroadwayInputPointerMsg *dat
server->future_mouse_in_toplevel = data->mouse_window_id;
}
static gboolean
verify_password (BroadwayServer *server, const char *password)
{
char *hash;
hash = crypt (password, server->password);
return strcmp (hash, server->password) == 0;
}
static void
parse_input_message (BroadwayInput *input, const char *message)
{
@@ -357,6 +395,22 @@ parse_input_message (BroadwayInput *input, const char *message)
char *p;
gint64 time_;
if (!input->active)
{
/* The input has not been activated yet, handle auth/start */
if (message[0] != 'l' ||
!verify_password (server, message+1))
{
broadway_output_request_auth (input->output);
broadway_output_flush (input->output);
}
else
start (input);
return;
}
memset (&msg, 0, sizeof (msg));
p = (char *)message;
@@ -570,7 +624,7 @@ parse_input (BroadwayInput *input)
}
break;
case BROADWAY_WS_CNX_PING:
broadway_output_pong (server->output);
broadway_output_pong (input->output);
break;
case BROADWAY_WS_CNX_PONG:
break; /* we never send pings, but tolerate pongs */
@@ -596,7 +650,8 @@ parse_input (BroadwayInput *input)
if (buf[0] != 0)
{
server->input = NULL;
if (server->input == input)
server->input = NULL;
broadway_input_free (input);
return;
}
@@ -613,7 +668,8 @@ parse_input (BroadwayInput *input)
if (len > 0 && buf[0] != 0)
{
server->input = NULL;
if (server->input == input)
server->input = NULL;
broadway_input_free (input);
break;
}
@@ -640,19 +696,16 @@ queue_process_input_at_idle (BroadwayServer *server)
}
static void
broadway_server_read_all_input_nonblocking (BroadwayServer *server)
broadway_server_read_all_input_nonblocking (BroadwayInput *input)
{
GInputStream *in;
gssize res;
guint8 buffer[1024];
GError *error;
BroadwayInput *input;
if (server->input == NULL)
if (input == NULL)
return;
input = server->input;
in = g_io_stream_get_input_stream (G_IO_STREAM (input->connection));
error = NULL;
@@ -668,7 +721,8 @@ broadway_server_read_all_input_nonblocking (BroadwayServer *server)
return;
}
server->input = NULL;
if (input->server->input == input)
input->server->input = NULL;
broadway_input_free (input);
if (res < 0)
{
@@ -686,7 +740,7 @@ broadway_server_read_all_input_nonblocking (BroadwayServer *server)
static void
broadway_server_consume_all_input (BroadwayServer *server)
{
broadway_server_read_all_input_nonblocking (server);
broadway_server_read_all_input_nonblocking (server->input);
/* Since we're parsing input but not processing the resulting messages
we might not get a readable callback on the stream, so queue an idle to
@@ -701,9 +755,10 @@ input_data_cb (GObject *stream,
{
BroadwayServer *server = input->server;
broadway_server_read_all_input_nonblocking (server);
broadway_server_read_all_input_nonblocking (input);
process_input_messages (server);
if (input->active)
process_input_messages (server);
return TRUE;
}
@@ -878,15 +933,14 @@ start_input (HttpRequest *request, gboolean binary)
gsize len;
GChecksum *checksum;
char *origin, *host;
BroadwayServer *server;
BroadwayInput *input;
const void *data_buffer;
gsize data_buffer_size;
GInputStream *in;
char *key_v7;
gboolean proto_v7_plus;
server = request->server;
GSocket *socket;
int flag = 1;
#ifdef DEBUG_WEBSOCKETS
g_print ("incoming request:\n%s\n", request->request->str);
@@ -1033,15 +1087,11 @@ start_input (HttpRequest *request, gboolean binary)
proto_v7_plus = FALSE;
}
if (server->input != NULL)
{
broadway_input_free (server->input);
server->input = NULL;
}
socket = g_socket_connection_get_socket (request->connection);
setsockopt (g_socket_get_fd (socket), IPPROTO_TCP,
TCP_NODELAY, (char *) &flag, sizeof(int));
input = g_new0 (BroadwayInput, 1);
input->server = request->server;
input->connection = g_object_ref (request->connection);
input->proto_v7_plus = proto_v7_plus;
@@ -1051,9 +1101,9 @@ start_input (HttpRequest *request, gboolean binary)
input->buffer = g_byte_array_sized_new (data_buffer_size);
g_byte_array_append (input->buffer, data_buffer, data_buffer_size);
server->input = input;
start_output (request, proto_v7_plus, binary);
input->output =
broadway_output_new (g_io_stream_get_output_stream (G_IO_STREAM (request->connection)),
0, proto_v7_plus, binary);
/* This will free and close the data input stream, but we got all the buffered content already */
http_request_free (request);
@@ -1063,35 +1113,53 @@ start_input (HttpRequest *request, gboolean binary)
g_source_set_callback (input->source, (GSourceFunc)input_data_cb, input, NULL);
g_source_attach (input->source, NULL);
if (input->server->password)
{
broadway_output_request_auth (input->output);
broadway_output_flush (input->output);
}
else
start (input);
/* Process any data in the pipe already */
parse_input (input);
process_input_messages (server);
g_strfreev (lines);
}
static void
start_output (HttpRequest *request, gboolean proto_v7_plus, gboolean binary)
start (BroadwayInput *input)
{
GSocket *socket;
BroadwayServer *server;
int flag = 1;
socket = g_socket_connection_get_socket (request->connection);
setsockopt(g_socket_get_fd (socket), IPPROTO_TCP,
TCP_NODELAY, (char *) &flag, sizeof(int));
input->active = TRUE;
server = BROADWAY_SERVER (request->server);
server = BROADWAY_SERVER (input->server);
if (server->output)
{
broadway_output_disconnected (server->output);
broadway_output_flush (server->output);
}
if (server->input != NULL)
{
broadway_input_free (server->input);
server->input = NULL;
}
server->input = input;
if (server->output)
{
server->saved_serial = broadway_output_get_next_serial (server->output);
broadway_output_free (server->output);
}
server->output = input->output;
server->output =
broadway_output_new (g_io_stream_get_output_stream (G_IO_STREAM (request->connection)),
server->saved_serial, proto_v7_plus, binary);
broadway_output_set_next_serial (server->output, server->saved_serial);
broadway_output_auth_ok (server->output);
broadway_output_flush (server->output);
broadway_server_resync_windows (server);
@@ -1099,6 +1167,8 @@ start_output (HttpRequest *request, gboolean proto_v7_plus, gboolean binary)
broadway_output_grab_pointer (server->output,
server->pointer_grab_window_id,
server->pointer_grab_owner_events);
process_input_messages (server);
}
static void
@@ -1349,6 +1419,12 @@ broadway_server_destroy_window (BroadwayServer *server,
server->toplevels = g_list_remove (server->toplevels, window);
g_hash_table_remove (server->id_ht,
GINT_TO_POINTER (id));
if (window->cached_surface_name != NULL)
g_free (window->cached_surface_name);
if (window->cached_surface != NULL)
cairo_surface_destroy (window->cached_surface);
g_free (window);
}
}
@@ -1583,6 +1659,11 @@ broadway_server_window_update (BroadwayServer *server,
window->width,
window->height);
g_assert (window->width == cairo_image_surface_get_width (window->last_surface));
g_assert (window->width == cairo_image_surface_get_width (surface));
g_assert (window->height == cairo_image_surface_get_height (window->last_surface));
g_assert (window->height == cairo_image_surface_get_height (surface));
if (server->output != NULL)
{
if (window->last_synced)
@@ -1739,6 +1820,86 @@ broadway_server_ungrab_pointer (BroadwayServer *server,
return serial;
}
static const cairo_user_data_key_t shm_cairo_key;
typedef struct {
void *data;
gsize data_size;
} ShmSurfaceData;
static void
shm_data_unmap (void *_data)
{
ShmSurfaceData *data = _data;
munmap (data->data, data->data_size);
g_free (data);
}
cairo_surface_t *
broadway_server_open_surface (BroadwayServer *server,
guint32 id,
char *name,
int width,
int height)
{
BroadwayWindow *window;
ShmSurfaceData *data;
cairo_surface_t *surface;
gsize size;
void *ptr;
int fd;
window = g_hash_table_lookup (server->id_ht,
GINT_TO_POINTER (id));
if (window == NULL)
return NULL;
if (window->cached_surface_name != NULL &&
strcmp (name, window->cached_surface_name) == 0)
return cairo_surface_reference (window->cached_surface);
size = width * height * sizeof (guint32);
fd = shm_open(name, O_RDONLY, 0600);
if (fd == -1)
{
perror ("Failed to shm_open");
return NULL;
}
ptr = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
(void) close(fd);
shm_unlink (name);
if (ptr == NULL)
return NULL;
data = g_new0 (ShmSurfaceData, 1);
data->data = ptr;
data->data_size = size;
surface = cairo_image_surface_create_for_data ((guchar *)data->data,
CAIRO_FORMAT_RGB24,
width, height,
width * sizeof (guint32));
g_assert (surface != NULL);
cairo_surface_set_user_data (surface, &shm_cairo_key,
data, shm_data_unmap);
if (window->cached_surface_name != NULL)
g_free (window->cached_surface_name);
window->cached_surface_name = g_strdup (name);
if (window->cached_surface != NULL)
cairo_surface_destroy (window->cached_surface);
window->cached_surface = cairo_surface_reference (surface);
return surface;
}
guint32
broadway_server_new_window (BroadwayServer *server,
int x,
+5
View File
@@ -78,5 +78,10 @@ gboolean broadway_server_window_move_resize (BroadwayServer *
int y,
int width,
int height);
cairo_surface_t * broadway_server_open_surface (BroadwayServer *server,
guint32 id,
char *name,
int width,
int height);
#endif /* __BROADWAY_SERVER__ */
+71 -45
View File
@@ -225,34 +225,16 @@ function flushSurface(surface)
context.save();
context.beginPath();
var minx;
var miny;
var maxx;
var maxy;
for (var j = 0; j < cmd.rects.length; j++) {
var rect = cmd.rects[j];
context.rect(rect.x, rect.y, rect.w, rect.h);
if (j == 0) {
minx = rect.x;
miny = rect.y;
maxx = rect.x + rect.w;
maxy = rect.y + rect.h;
} else {
if (rect.x < minx)
minx = rect.x;
if (rect.y < miny)
miny = rect.y;
if (rect.x + rect.w > maxx)
maxx = rect.x + rect.w;
if (rect.y + rect.h > maxy)
maxy = rect.y + rect.h;
}
}
context.clip();
context.globalCompositeOperation = "copy";
context.drawImage(context.canvas,
minx - cmd.dx, miny - cmd.dy, maxx - minx, maxy - miny,
minx, miny, maxx - minx, maxy - miny);
// This seems to break chrome when src overlaps dest
// But source-over should be fine for rgb surfaces anyway
//context.globalCompositeOperation = "copy";
context.drawImage(surface.canvas,
cmd.dx, cmd.dy);
context.restore();
break;
@@ -496,12 +478,6 @@ function cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h)
var xOffset = surface.x;
var yOffset = surface.y;
var transientToplevel = getTransientToplevel(surface);
if (transientToplevel) {
xOffset = surface.x - transientToplevel.x;
yOffset = surface.y - transientToplevel.y;
}
var element = surface.canvas;
if (surface.frame) {
element = surface.frame;
@@ -543,6 +519,21 @@ function handleCommands(cmd)
var command = cmd.get_char();
lastSerial = cmd.get_32();
switch (command) {
case 'l':
login ();
break;
case 'L':
if (loginDiv != null)
loginDiv.parentNode.removeChild(loginDiv);
start ();
break;
case 'D':
alert ("disconnected");
inputSocket = null;
break;
case 's': // create new surface
id = cmd.get_16();
x = cmd.get_16s();
@@ -742,8 +733,12 @@ BinCommands.prototype.get_32 = function() {
};
BinCommands.prototype.get_image_url = function() {
var size = this.get_32();
var png_blob = new Blob ([this.arraybuffer.slice (this.pos, this.pos + size)], {type:"image/png"});
var url = URL.createObjectURL(png_blob, {oneTimeOnly: true});
var png_blob = new Blob ([new Uint8Array (this.arraybuffer, this.pos, size)], {type:"image/png"});
var url;
if (window.webkitURL)
url = window.webkitURL.createObjectURL(png_blob);
else
url = window.URL.createObjectURL(png_blob, {oneTimeOnly: true});
this.pos = this.pos + size;
return url;
};
@@ -2590,7 +2585,7 @@ function onMouseWheel(ev)
var id = getSurfaceId(ev);
var pos = getPositionsFromEvent(ev, id);
var offset = ev.detail ? ev.detail : ev.wheelDelta;
var offset = ev.detail ? ev.detail : -ev.wheelDelta;
var dir = 0;
if (offset > 0)
dir = 1;
@@ -2631,6 +2626,47 @@ function newWS(loc) {
return ws;
}
function start()
{
setupDocument(document);
var w, h;
w = window.innerWidth;
h = window.innerHeight;
window.onresize = function(ev) {
var w, h;
w = window.innerWidth;
h = window.innerHeight;
sendInput ("d", [w, h]);
};
sendInput ("d", [w, h]);
}
var loginDiv = null;
function login()
{
if (loginDiv == null) {
var div = document.createElement('div');
document.body.appendChild(div);
div.innerHTML = "Please enter password<br>";
div.style.marginTop = "40px";
div.style.textAlign = "center";
var input = document.createElement("input");
input.setAttribute("type", "password");
div.appendChild(input);
input.focus ();
input.onkeyup = function(e) {
if (e.keyCode === 13 && input.value != "") {
inputSocket.send ("l" + input.value);
}
}
loginDiv = div;
} else {
alert ("Wrong password");
}
}
function connect()
{
var url = window.location.toString();
@@ -2639,7 +2675,7 @@ function connect()
var params = query_string[1].split("&");
}
var loc = window.location.toString().replace("http:", "ws:");
var loc = window.location.toString().replace("http:", "ws:").replace("https:", "wss:");
loc = loc.substr(0, loc.lastIndexOf('/')) + "/socket";
var supports_binary = newWS (loc + "-test").binaryType == "blob";
@@ -2652,23 +2688,13 @@ function connect()
ws.onopen = function() {
inputSocket = ws;
var w, h;
w = window.innerWidth;
h = window.innerHeight;
window.onresize = function(ev) {
var w, h;
w = window.innerWidth;
h = window.innerHeight;
sendInput ("d", [w, h]);
};
sendInput ("d", [w, h]);
};
ws.onclose = function() {
if (inputSocket != null)
alert ("disconnected");
inputSocket = null;
};
ws.onmessage = function(event) {
handleMessage(event.data);
};
setupDocument(document);
}
+7 -66
View File
@@ -140,62 +140,6 @@ region_from_rects (BroadwayRect *rects, int n_rects)
return region;
}
static const cairo_user_data_key_t shm_cairo_key;
typedef struct {
void *data;
gsize data_size;
} ShmSurfaceData;
static void
shm_data_unmap (void *_data)
{
ShmSurfaceData *data = _data;
munmap (data->data, data->data_size);
g_free (data);
}
cairo_surface_t *
open_surface (char *name, int width, int height)
{
ShmSurfaceData *data;
cairo_surface_t *surface;
gsize size;
void *ptr;
int fd;
size = width * height * sizeof (guint32);
fd = shm_open(name, O_RDONLY, 0600);
if (fd == -1)
{
perror ("Failed to shm_open");
return NULL;
}
ptr = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
(void) close(fd);
if (ptr == NULL)
return NULL;
data = g_new0 (ShmSurfaceData, 1);
data->data = ptr;
data->data_size = size;
surface = cairo_image_surface_create_for_data ((guchar *)data->data,
CAIRO_FORMAT_RGB24,
width, height,
width * sizeof (guint32));
g_assert (surface != NULL);
cairo_surface_set_user_data (surface, &shm_cairo_key,
data, shm_data_unmap);
return surface;
}
void
add_client_serial_mapping (BroadwayClient *client,
guint32 client_serial,
@@ -337,9 +281,11 @@ client_handle_request (BroadwayClient *client,
cairo_region_destroy (area);
break;
case BROADWAY_REQUEST_UPDATE:
surface = open_surface (request->update.name,
request->update.width,
request->update.height);
surface = broadway_server_open_surface (server,
request->update.id,
request->update.name,
request->update.width,
request->update.height);
if (surface != NULL)
{
broadway_server_window_update (server,
@@ -409,7 +355,6 @@ client_fill_cb (GObject *source_object,
guint32 size;
gsize count, remaining;
guint8 *buffer;
BroadwayRequest request;
buffer = (guint8 *)g_buffered_input_stream_peek_buffer (client->in, &count);
@@ -417,14 +362,10 @@ client_fill_cb (GObject *source_object,
while (remaining >= sizeof (guint32))
{
memcpy (&size, buffer, sizeof (guint32));
if (size <= remaining)
{
g_assert (size >= sizeof (BroadwayRequestBase));
g_assert (size <= sizeof (BroadwayRequest));
memcpy (&request, buffer, size);
client_handle_request (client, &request);
client_handle_request (client, (BroadwayRequest *)buffer);
remaining -= size;
buffer += size;
+10 -3
View File
@@ -506,7 +506,7 @@ make_valid_fs_char (char c)
{
char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890";
return chars[c % sizeof (chars)];
return chars[c % (sizeof (chars) - 1)];
}
/* name must have at least space for 34 bytes */
@@ -550,7 +550,7 @@ create_random_shm (char *name)
static const cairo_user_data_key_t gdk_broadway_shm_cairo_key;
typedef struct {
char name[34];
char name[36];
void *data;
gsize data_size;
} BroadwayShmSurfaceData;
@@ -582,6 +582,13 @@ _gdk_broadway_server_create_surface (int width,
res = ftruncate (fd, data->data_size);
g_assert (res != -1);
res = posix_fallocate (fd, 0, data->data_size);
if (res != 0)
{
shm_unlink (data->name);
g_error ("Not enough shared memory for window surface");
}
data->data = mmap(0, data->data_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
(void) close(fd);
@@ -610,7 +617,7 @@ _gdk_broadway_server_window_update (GdkBroadwayServer *server,
g_assert (data != NULL);
msg.id = id;
memcpy (msg.name, data->name, 34);
memcpy (msg.name, data->name, 36);
msg.width = cairo_image_surface_get_width (surface);
msg.height = cairo_image_surface_get_height (surface);
+24 -1
View File
@@ -188,7 +188,7 @@ gdk_broadway_device_query_state (GdkDevice *device,
if (root_y)
*root_y = device_root_y;
if (win_x)
*win_x = device_root_y - toplevel->x;
*win_x = device_root_x - toplevel->x;
if (win_y)
*win_y = device_root_y - toplevel->y;
if (mask)
@@ -211,6 +211,29 @@ gdk_broadway_device_query_state (GdkDevice *device,
return;
}
void
_gdk_broadway_window_grab_check_unmap (GdkWindow *window,
gulong serial)
{
GdkDisplay *display = gdk_window_get_display (window);
GdkDeviceManager *device_manager;
GList *devices, *d;
device_manager = gdk_display_get_device_manager (display);
/* Get all devices */
devices = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER);
devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_SLAVE));
devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_FLOATING));
/* End all grabs on the newly hidden window */
for (d = devices; d; d = d->next)
_gdk_display_end_device_grab (display, d->data, serial, window, TRUE);
g_list_free (devices);
}
void
_gdk_broadway_window_grab_check_destroy (GdkWindow *window)
{
+2
View File
@@ -66,6 +66,8 @@ struct _GdkBroadwayDisplay
GdkWindow *active_offscreen_window;
GdkBroadwayServer *server;
gpointer move_resize_data;
};
struct _GdkBroadwayDisplayClass
+1 -5
View File
@@ -247,7 +247,7 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
break;
case BROADWAY_EVENT_GRAB_NOTIFY:
case BROADWAY_EVENT_UNGRAB_NOTIFY:
_gdk_display_device_grab_update (display, display->core_pointer, NULL, message->base.serial);
_gdk_display_device_grab_update (display, display->core_pointer, display->core_pointer, message->base.serial);
break;
case BROADWAY_EVENT_CONFIGURE_NOTIFY:
@@ -256,10 +256,6 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
{
window->x = message->configure_notify.x;
window->y = message->configure_notify.y;
window->width = message->configure_notify.width;
window->height = message->configure_notify.height;
_gdk_window_update_size (window);
_gdk_broadway_window_resize_surface (window);
event = gdk_event_new (GDK_CONFIGURE);
event->configure.window = g_object_ref (window);
+2
View File
@@ -92,6 +92,8 @@ gboolean _gdk_broadway_moveresize_configure_done (GdkDisplay *display,
void _gdk_broadway_selection_window_destroyed (GdkWindow *window);
void _gdk_broadway_window_grab_check_destroy (GdkWindow *window);
void _gdk_broadway_window_grab_check_unmap (GdkWindow *window,
gulong serial);
void _gdk_keymap_keys_changed (GdkDisplay *display);
gint _gdk_broadway_get_group_for_state (GdkDisplay *display,
+150 -30
View File
@@ -83,18 +83,16 @@ G_DEFINE_TYPE (GdkWindowImplBroadway,
gdk_window_impl_broadway,
GDK_TYPE_WINDOW_IMPL)
static guint dirty_flush_id = 0;
static gboolean
dirty_flush_idle (gpointer data)
static void
update_dirty_windows_and_sync (void)
{
GList *l;
GdkBroadwayDisplay *display;
dirty_flush_id = 0;
gboolean updated_surface;
display = GDK_BROADWAY_DISPLAY (gdk_display_get_default ());
updated_surface = FALSE;
for (l = display->toplevels; l != NULL; l = l->next)
{
GdkWindowImplBroadway *impl = l->data;
@@ -102,6 +100,7 @@ dirty_flush_idle (gpointer data)
if (impl->dirty)
{
impl->dirty = FALSE;
updated_surface = TRUE;
_gdk_broadway_server_window_update (display->server,
impl->id,
impl->surface);
@@ -110,16 +109,32 @@ dirty_flush_idle (gpointer data)
/* We sync here to ensure all references to the impl->surface memory
is done, as we may later paint new data in them. */
gdk_display_sync (GDK_DISPLAY (display));
if (updated_surface)
gdk_display_sync (GDK_DISPLAY (display));
else
gdk_display_flush (GDK_DISPLAY (display));
}
static guint flush_id = 0;
static gboolean
flush_idle (gpointer data)
{
flush_id = 0;
gdk_display_flush (gdk_display_get_default ());
return FALSE;
}
/* We need to flush in an idle rather than AFTER_PAINT, as the clock
is frozen during e.g. window resizes so the paint will not happen
and the window resize request is never flushed. */
static void
queue_dirty_flush (GdkBroadwayDisplay *display)
queue_flush (GdkWindow *window)
{
if (dirty_flush_id == 0)
dirty_flush_id = gdk_threads_add_idle (dirty_flush_idle, NULL);
if (flush_id == 0)
flush_id = gdk_threads_add_idle (flush_idle, NULL);
}
static void
@@ -197,6 +212,25 @@ _gdk_broadway_screen_init_root_window (GdkScreen * screen)
_gdk_window_update_size (broadway_screen->root_window);
}
static void
on_frame_clock_after_paint (GdkFrameClock *clock,
GdkWindow *window)
{
update_dirty_windows_and_sync ();
}
static void
connect_frame_clock (GdkWindow *window)
{
if (WINDOW_IS_TOPLEVEL (window))
{
GdkFrameClock *frame_clock = gdk_window_get_frame_clock (window);
g_signal_connect (frame_clock, "after-paint",
G_CALLBACK (on_frame_clock_after_paint), window);
}
}
void
_gdk_broadway_display_create_window_impl (GdkDisplay *display,
GdkWindow *window,
@@ -229,22 +263,21 @@ _gdk_broadway_display_create_window_impl (GdkDisplay *display,
g_assert (GDK_WINDOW_TYPE (window->parent) == GDK_WINDOW_ROOT);
broadway_display->toplevels = g_list_prepend (broadway_display->toplevels, impl);
connect_frame_clock (window);
}
void
_gdk_broadway_window_resize_surface (GdkWindow *window)
{
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
cairo_surface_t *old;
if (impl->surface)
{
old = impl->surface;
cairo_surface_destroy (impl->surface);
impl->surface = _gdk_broadway_server_create_surface (gdk_window_get_width (impl->wrapper),
gdk_window_get_height (impl->wrapper));
cairo_surface_destroy (old);
}
if (impl->ref_surface)
@@ -384,7 +417,7 @@ gdk_window_broadway_show (GdkWindow *window, gboolean already_mapped)
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
if (_gdk_broadway_server_window_show (broadway_display->server, impl->id))
queue_dirty_flush (broadway_display);
queue_flush (window);
}
@@ -404,8 +437,12 @@ gdk_window_broadway_hide (GdkWindow *window)
_gdk_make_event (GDK_WINDOW (window), GDK_UNMAP, NULL, FALSE);
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
_gdk_broadway_window_grab_check_unmap (window,
_gdk_broadway_server_get_next_serial (broadway_display->server));
if (_gdk_broadway_server_window_hide (broadway_display->server, impl->id))
queue_dirty_flush (broadway_display);
queue_flush (window);
_gdk_window_clear_update_area (window);
}
@@ -460,7 +497,7 @@ gdk_window_broadway_move_resize (GdkWindow *window,
with_move,
x, y,
window->width, window->height);
queue_dirty_flush (broadway_display);
queue_flush (window);
if (size_changed)
window->resize_count++;
}
@@ -545,6 +582,12 @@ gdk_broadway_window_set_geometry_hints (GdkWindow *window,
const GdkGeometry *geometry,
GdkWindowHints geom_mask)
{
GdkWindowImplBroadway *impl;
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
impl->geometry_hints = *geometry;
impl->geometry_hints_mask = geom_mask;
}
static void
@@ -610,7 +653,7 @@ gdk_window_broadway_set_device_cursor (GdkWindow *window,
{
_gdk_broadway_cursor_update_theme (cursor);
g_hash_table_replace (impl->device_cursor,
device, gdk_cursor_ref (cursor));
device, g_object_ref (cursor));
}
if (!GDK_WINDOW_DESTROYED (window))
@@ -992,6 +1035,8 @@ struct _MoveResizeData
gint moveresize_orig_width;
gint moveresize_orig_height;
long moveresize_process_time;
GdkWindowHints moveresize_geom_mask;
GdkGeometry moveresize_geometry;
BroadwayInputMsg *moveresize_pending_event;
};
@@ -999,20 +1044,19 @@ static MoveResizeData *
get_move_resize_data (GdkDisplay *display,
gboolean create)
{
GdkBroadwayDisplay *broadway_display;
MoveResizeData *mv_resize;
static GQuark move_resize_quark = 0;
if (!move_resize_quark)
move_resize_quark = g_quark_from_static_string ("gdk-window-moveresize");
broadway_display = GDK_BROADWAY_DISPLAY (display);
mv_resize = g_object_get_qdata (G_OBJECT (display), move_resize_quark);
mv_resize = broadway_display->move_resize_data;
if (!mv_resize && create)
{
mv_resize = g_new0 (MoveResizeData, 1);
mv_resize->display = display;
g_object_set_qdata (G_OBJECT (display), move_resize_quark, mv_resize);
broadway_display->move_resize_data = mv_resize;
}
return mv_resize;
@@ -1081,6 +1125,13 @@ update_pos (MoveResizeData *mv_resize,
w = MAX (w, 1);
h = MAX (h, 1);
if (mv_resize->moveresize_geom_mask)
{
gdk_window_constrain_size (&mv_resize->moveresize_geometry,
mv_resize->moveresize_geom_mask,
w, h, &w, &h);
}
gdk_window_move_resize (mv_resize->moveresize_window, x, y, w, h);
}
else
@@ -1135,7 +1186,7 @@ _gdk_broadway_moveresize_handle_event (GdkDisplay *display,
switch (event->base.type)
{
case 'm':
case BROADWAY_EVENT_POINTER_MOVE:
if (mv_resize->moveresize_window->resize_count > 0)
{
if (mv_resize->moveresize_pending_event)
@@ -1163,7 +1214,7 @@ _gdk_broadway_moveresize_handle_event (GdkDisplay *display,
finish_drag (mv_resize);
break;
case 'B':
case BROADWAY_EVENT_BUTTON_RELEASE:
update_pos (mv_resize,
event->pointer.root_x,
event->pointer.root_y);
@@ -1243,6 +1294,71 @@ create_moveresize_window (MoveResizeData *mv_resize,
mv_resize->moveresize_process_time = 0;
}
static void
calculate_unmoving_origin (MoveResizeData *mv_resize)
{
GdkRectangle rect;
gint width, height;
if (mv_resize->moveresize_geom_mask & GDK_HINT_WIN_GRAVITY &&
mv_resize->moveresize_geometry.win_gravity == GDK_GRAVITY_STATIC)
{
gdk_window_get_origin (mv_resize->moveresize_window,
&mv_resize->moveresize_orig_x,
&mv_resize->moveresize_orig_y);
}
else
{
gdk_window_get_frame_extents (mv_resize->moveresize_window, &rect);
gdk_window_get_geometry (mv_resize->moveresize_window,
NULL, NULL, &width, &height);
switch (mv_resize->moveresize_geometry.win_gravity)
{
case GDK_GRAVITY_NORTH_WEST:
mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = rect.y;
break;
case GDK_GRAVITY_NORTH:
mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
mv_resize->moveresize_orig_y = rect.y;
break;
case GDK_GRAVITY_NORTH_EAST:
mv_resize->moveresize_orig_x = rect.x + rect.width - width;
mv_resize->moveresize_orig_y = rect.y;
break;
case GDK_GRAVITY_WEST:
mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
break;
case GDK_GRAVITY_CENTER:
mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
break;
case GDK_GRAVITY_EAST:
mv_resize->moveresize_orig_x = rect.x + rect.width - width;
mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
break;
case GDK_GRAVITY_SOUTH_WEST:
mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = rect.y + rect.height - height;
break;
case GDK_GRAVITY_SOUTH:
mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
mv_resize->moveresize_orig_y = rect.y + rect.height - height;
break;
case GDK_GRAVITY_SOUTH_EAST:
mv_resize->moveresize_orig_x = rect.x + rect.width - width;
mv_resize->moveresize_orig_y = rect.y + rect.height - height;
break;
default:
mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = rect.y;
break;
}
}
}
static void
gdk_broadway_window_begin_resize_drag (GdkWindow *window,
GdkWindowEdge edge,
@@ -1253,6 +1369,9 @@ gdk_broadway_window_begin_resize_drag (GdkWindow *window,
guint32 timestamp)
{
MoveResizeData *mv_resize;
GdkWindowImplBroadway *impl;
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
@@ -1267,12 +1386,14 @@ gdk_broadway_window_begin_resize_drag (GdkWindow *window,
mv_resize->moveresize_y = root_y;
mv_resize->moveresize_window = g_object_ref (window);
gdk_window_get_origin (mv_resize->moveresize_window,
&mv_resize->moveresize_orig_x,
&mv_resize->moveresize_orig_y);
mv_resize->moveresize_orig_width = gdk_window_get_width (window);
mv_resize->moveresize_orig_height = gdk_window_get_height (window);
mv_resize->moveresize_geom_mask = impl->geometry_hints_mask;
mv_resize->moveresize_geometry = impl->geometry_hints;
calculate_unmoving_origin (mv_resize);
create_moveresize_window (mv_resize, timestamp);
}
@@ -1328,7 +1449,6 @@ gdk_broadway_window_process_updates_recurse (GdkWindow *window,
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
impl->dirty = TRUE;
queue_dirty_flush (GDK_BROADWAY_DISPLAY (gdk_window_get_display (window)));
}
void
@@ -1394,7 +1514,7 @@ _gdk_broadway_window_translate (GdkWindow *window,
if (_gdk_broadway_server_window_translate (broadway_display->server,
impl->id,
area, dx, dy))
queue_dirty_flush (broadway_display);
queue_flush (window);
}
}
+3
View File
@@ -64,6 +64,9 @@ struct _GdkWindowImplBroadway
gint8 toplevel_window_type;
gboolean dirty;
gboolean last_synced;
GdkGeometry geometry_hints;
GdkWindowHints geometry_hints_mask;
};
struct _GdkWindowImplBroadwayClass
+12
View File
@@ -42,3 +42,15 @@ isinf (double x)
return (!_finite (x) && !_isnan (x));
}
#endif
/* Workaround for round() for non-GCC/non-C99 compilers */
#ifndef HAVE_ROUND
static inline double
round (double x)
{
if (x >= 0)
return floor (x + 0.5);
else
return ceil (x - 0.5);
}
#endif
+1
View File
@@ -610,6 +610,7 @@ gdk_x11_window_set_theme_variant
gdk_x11_window_set_hide_titlebar_when_maximized
gdk_x11_window_set_user_time
gdk_x11_window_set_utf8_property
gdk_x11_window_set_frame_sync_enabled
gdk_x11_xatom_to_atom
gdk_x11_xatom_to_atom_for_display
#endif
+2 -2
View File
@@ -213,7 +213,7 @@ gdk_cairo_set_source_pixbuf (cairo_t *cr,
format = CAIRO_FORMAT_ARGB32;
cairo_stride = cairo_format_stride_for_width (format, width);
cairo_pixels = g_malloc (height * cairo_stride);
cairo_pixels = g_malloc_n (height, cairo_stride);
surface = cairo_image_surface_create_for_data ((unsigned char *)cairo_pixels,
format,
width, height, cairo_stride);
@@ -250,7 +250,7 @@ gdk_cairo_set_source_pixbuf (cairo_t *cr,
guchar *end = p + 4 * width;
guint t1,t2,t3;
#define MULT(d,c,a,t) G_STMT_START { t = c * a + 0x7f; d = ((t >> 8) + t) >> 8; } G_STMT_END
#define MULT(d,c,a,t) G_STMT_START { t = c * a + 0x80; d = ((t >> 8) + t) >> 8; } G_STMT_END
while (p < end)
{
+1 -1
View File
@@ -330,7 +330,7 @@ gdk_device_manager_list_devices (GdkDeviceManager *device_manager,
* for this application. In X11, window managers may change this depending on the interaction
* pattern under the presence of several pointers.
*
* You should use this function sheldomly, only in code that isn't triggered by a #GdkEvent
* You should use this function seldomly, only in code that isn't triggered by a #GdkEvent
* and there aren't other means to get a meaningful #GdkDevice to operate on.
*
* Returns: (transfer none): The client pointer. This memory is
+5
View File
@@ -371,6 +371,7 @@ gdk_frame_clock_paint_idle (void *data)
g_signal_emit_by_name (G_OBJECT (clock), "before-paint");
priv->phase = GDK_FRAME_CLOCK_PHASE_UPDATE;
}
/* fallthrough */
case GDK_FRAME_CLOCK_PHASE_UPDATE:
if (priv->freeze_count == 0)
{
@@ -381,6 +382,7 @@ gdk_frame_clock_paint_idle (void *data)
g_signal_emit_by_name (G_OBJECT (clock), "update");
}
}
/* fallthrough */
case GDK_FRAME_CLOCK_PHASE_LAYOUT:
if (priv->freeze_count == 0)
{
@@ -400,6 +402,7 @@ gdk_frame_clock_paint_idle (void *data)
g_signal_emit_by_name (G_OBJECT (clock), "layout");
}
}
/* fallthrough */
case GDK_FRAME_CLOCK_PHASE_PAINT:
if (priv->freeze_count == 0)
{
@@ -419,6 +422,7 @@ gdk_frame_clock_paint_idle (void *data)
g_signal_emit_by_name (G_OBJECT (clock), "paint");
}
}
/* fallthrough */
case GDK_FRAME_CLOCK_PHASE_AFTER_PAINT:
if (priv->freeze_count == 0)
{
@@ -433,6 +437,7 @@ gdk_frame_clock_paint_idle (void *data)
timings->frame_end_time = g_get_monotonic_time ();
#endif /* G_ENABLE_DEBUG */
}
/* fallthrough */
case GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS:
;
}
+15 -2
View File
@@ -42,6 +42,9 @@
#include <math.h>
/* for the use of round() */
#include "fallback-c89.c"
#undef DEBUG_WINDOW_PRINTING
@@ -937,19 +940,26 @@ static void
apply_clip_as_shape (GdkWindow *window)
{
GdkRectangle r;
cairo_region_t *region;
r.x = r.y = 0;
r.width = window->width;
r.height = window->height;
region = cairo_region_copy (window->clip_region);
if (window->layered_region)
cairo_region_subtract (region, window->layered_region);
/* We only apply the clip region if would differ
from the actual clip region implied by the size
of the window. This is to avoid unneccessarily
adding meaningless shapes to all native subwindows */
if (!region_rect_equal (window->clip_region, &r))
apply_shape (window, window->clip_region);
if (!region_rect_equal (region, &r))
apply_shape (window, region);
else
apply_shape (window, NULL);
cairo_region_destroy (region);
}
static void
@@ -9996,6 +10006,9 @@ gdk_window_print (GdkWindow *window,
g_print (" alpha[%d]",
window->alpha);
if (window->has_alpha_background)
g_print (" alpha_bg");
s = print_region (window->clip_region);
g_print (" clipbox[%s]", s);
+544 -19
View File
@@ -1,6 +1,7 @@
/* GdkQuartzView.m
*
* Copyright (C) 2005-2007 Imendio AB
* Copyright (C) 2011 Hiroyuki Yamamoto
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,18 +24,541 @@
@implementation GdkQuartzView
-(id)initWithFrame: (NSRect)frameRect
{
if ((self = [super initWithFrame: frameRect]))
{
markedRange = NSMakeRange (NSNotFound, 0);
selectedRange = NSMakeRange (NSNotFound, 0);
}
return self;
}
-(BOOL)acceptsFirstResponder
{
GDK_NOTE (EVENTS, g_print ("acceptsFirstResponder\n"));
return YES;
}
-(BOOL)becomeFirstResponder
{
GDK_NOTE (EVENTS, g_print ("becomeFirstResponder\n"));
return YES;
}
-(BOOL)resignFirstResponder
{
GDK_NOTE (EVENTS, g_print ("resignFirstResponder\n"));
return YES;
}
-(void) keyDown: (NSEvent *) theEvent
{
GDK_NOTE (EVENTS, g_print ("keyDown\n"));
[self interpretKeyEvents: [NSArray arrayWithObject: theEvent]];
}
-(void)flagsChanged: (NSEvent *) theEvent
{
}
-(NSUInteger)characterIndexForPoint: (NSPoint)aPoint
{
GDK_NOTE (EVENTS, g_print ("characterIndexForPoint\n"));
return 0;
}
-(NSRect)firstRectForCharacterRange: (NSRange)aRange actualRange: (NSRangePointer)actualRange
{
GDK_NOTE (EVENTS, g_print ("firstRectForCharacterRange\n"));
gint ns_x, ns_y;
GdkRectangle *rect;
rect = g_object_get_data (G_OBJECT (gdk_window), GIC_CURSOR_RECT);
if (rect)
{
_gdk_quartz_window_gdk_xy_to_xy (rect->x, rect->y + rect->height,
&ns_x, &ns_y);
return NSMakeRect (ns_x, ns_y, rect->width, rect->height);
}
else
{
return NSMakeRect (0, 0, 0, 0);
}
}
-(NSArray *)validAttributesForMarkedText
{
GDK_NOTE (EVENTS, g_print ("validAttributesForMarkedText\n"));
return [NSArray arrayWithObjects: NSUnderlineStyleAttributeName, nil];
}
-(NSAttributedString *)attributedSubstringForProposedRange: (NSRange)aRange actualRange: (NSRangePointer)actualRange
{
GDK_NOTE (EVENTS, g_print ("attributedSubstringForProposedRange\n"));
return nil;
}
-(BOOL)hasMarkedText
{
GDK_NOTE (EVENTS, g_print ("hasMarkedText\n"));
return markedRange.location != NSNotFound && markedRange.length != 0;
}
-(NSRange)markedRange
{
GDK_NOTE (EVENTS, g_print ("markedRange\n"));
return markedRange;
}
-(NSRange)selectedRange
{
GDK_NOTE (EVENTS, g_print ("selectedRange\n"));
return selectedRange;
}
-(void)unmarkText
{
GDK_NOTE (EVENTS, g_print ("unmarkText\n"));
gchar *prev_str;
markedRange = selectedRange = NSMakeRange (NSNotFound, 0);
prev_str = g_object_get_data (G_OBJECT (gdk_window), TIC_MARKED_TEXT);
if (prev_str)
g_free (prev_str);
g_object_set_data (G_OBJECT (gdk_window), TIC_MARKED_TEXT, NULL);
}
-(void)setMarkedText: (id)aString selectedRange: (NSRange)newSelection replacementRange: (NSRange)replacementRange
{
GDK_NOTE (EVENTS, g_print ("setMarkedText\n"));
const char *str;
gchar *prev_str;
if (replacementRange.location == NSNotFound)
{
markedRange = NSMakeRange (newSelection.location, [aString length]);
selectedRange = NSMakeRange (newSelection.location, newSelection.length);
}
else {
markedRange = NSMakeRange (replacementRange.location, [aString length]);
selectedRange = NSMakeRange (replacementRange.location + newSelection.location, newSelection.length);
}
if ([aString isKindOfClass: [NSAttributedString class]])
{
str = [[aString string] UTF8String];
}
else {
str = [aString UTF8String];
}
prev_str = g_object_get_data (G_OBJECT (gdk_window), TIC_MARKED_TEXT);
if (prev_str)
g_free (prev_str);
g_object_set_data (G_OBJECT (gdk_window), TIC_MARKED_TEXT, g_strdup (str));
g_object_set_data (G_OBJECT (gdk_window), TIC_SELECTED_POS,
GUINT_TO_POINTER (selectedRange.location));
g_object_set_data (G_OBJECT (gdk_window), TIC_SELECTED_LEN,
GUINT_TO_POINTER (selectedRange.length));
GDK_NOTE (EVENTS, g_print ("setMarkedText: set %s (%p, nsview %p): %s\n",
TIC_MARKED_TEXT, gdk_window, self,
str ? str : "(empty)"));
/* handle text input changes by mouse events */
if (!GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (gdk_window),
TIC_IN_KEY_DOWN)))
{
_gdk_quartz_synthesize_null_key_event(gdk_window);
}
}
-(void)doCommandBySelector: (SEL)aSelector
{
GDK_NOTE (EVENTS, g_print ("doCommandBySelector\n"));
if ([self respondsToSelector: aSelector])
[self performSelector: aSelector];
}
-(void)insertText: (id)aString replacementRange: (NSRange)replacementRange
{
GDK_NOTE (EVENTS, g_print ("insertText\n"));
const char *str;
NSString *string;
gchar *prev_str;
if ([self hasMarkedText])
[self unmarkText];
if ([aString isKindOfClass: [NSAttributedString class]])
string = [aString string];
else
string = aString;
NSCharacterSet *ctrlChars = [NSCharacterSet controlCharacterSet];
NSCharacterSet *wsnlChars = [NSCharacterSet whitespaceAndNewlineCharacterSet];
if ([string rangeOfCharacterFromSet:ctrlChars].length &&
[string rangeOfCharacterFromSet:wsnlChars].length == 0)
{
/* discard invalid text input with Chinese input methods */
str = "";
[self unmarkText];
NSInputManager *currentInputManager = [NSInputManager currentInputManager];
[currentInputManager markedTextAbandoned:self];
}
else
{
str = [string UTF8String];
}
prev_str = g_object_get_data (G_OBJECT (gdk_window), TIC_INSERT_TEXT);
if (prev_str)
g_free (prev_str);
g_object_set_data (G_OBJECT (gdk_window), TIC_INSERT_TEXT, g_strdup (str));
GDK_NOTE (EVENTS, g_print ("insertText: set %s (%p, nsview %p): %s\n",
TIC_INSERT_TEXT, gdk_window, self,
str ? str : "(empty)"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_FILTERED));
/* handle text input changes by mouse events */
if (!GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (gdk_window),
TIC_IN_KEY_DOWN)))
{
_gdk_quartz_synthesize_null_key_event(gdk_window);
}
}
-(void)deleteBackward: (id)sender
{
GDK_NOTE (EVENTS, g_print ("deleteBackward\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)deleteForward: (id)sender
{
GDK_NOTE (EVENTS, g_print ("deleteForward\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)deleteToBeginningOfLine: (id)sender
{
GDK_NOTE (EVENTS, g_print ("deleteToBeginningOfLine\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)deleteToEndOfLine: (id)sender
{
GDK_NOTE (EVENTS, g_print ("deleteToEndOfLine\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)deleteWordBackward: (id)sender
{
GDK_NOTE (EVENTS, g_print ("deleteWordBackward\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)deleteWordForward: (id)sender
{
GDK_NOTE (EVENTS, g_print ("deleteWordForward\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)insertBacktab: (id)sender
{
GDK_NOTE (EVENTS, g_print ("insertBacktab\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)insertNewline: (id)sender
{
GDK_NOTE (EVENTS, g_print ("insertNewline\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY, GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)insertTab: (id)sender
{
GDK_NOTE (EVENTS, g_print ("insertTab\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveBackward: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveBackward\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveBackwardAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveBackwardAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveDown: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveDown\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveDownAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveDownAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveForward: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveForward\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveForwardAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveForwardAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveLeft: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveLeft\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveLeftAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveLeftAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveRight: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveRight\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveRightAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveRightAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveToBeginningOfDocument: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveToBeginningOfDocument\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveToBeginningOfDocumentAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveToBeginningOfDocumentAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveToBeginningOfLine: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveToBeginningOfLine\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveToBeginningOfLineAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveToBeginningOfLineAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveToEndOfDocument: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveToEndOfDocument\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveToEndOfDocumentAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveToEndOfDocumentAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveToEndOfLine: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveToEndOfLine\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveToEndOfLineAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveToEndOfLineAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveUp: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveUp\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveUpAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveUpAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveWordBackward: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveWordBackward\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveWordBackwardAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveWordBackwardAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveWordForward: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveWordForward\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveWordForwardAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveWordForwardAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveWordLeft: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveWordLeft\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveWordLeftAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveWordLeftAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveWordRight: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveWordRight\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)moveWordRightAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("moveWordRightAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)pageDown: (id)sender
{
GDK_NOTE (EVENTS, g_print ("pageDown\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)pageDownAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("pageDownAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)pageUp: (id)sender
{
GDK_NOTE (EVENTS, g_print ("pageUp\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)pageUpAndModifySelection: (id)sender
{
GDK_NOTE (EVENTS, g_print ("pageUpAndModifySelection\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)selectAll: (id)sender
{
GDK_NOTE (EVENTS, g_print ("selectAll\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)selectLine: (id)sender
{
GDK_NOTE (EVENTS, g_print ("selectLine\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)selectWord: (id)sender
{
GDK_NOTE (EVENTS, g_print ("selectWord\n"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void)noop: (id)sender
{
GDK_NOTE (EVENTS, g_print ("noop\n"));
}
/* --------------------------------------------------------------- */
-(void)dealloc
{
if (trackingRect)
{
[self removeTrackingRect:trackingRect];
[self removeTrackingRect: trackingRect];
trackingRect = 0;
}
[super dealloc];
}
-(void)setGdkWindow:(GdkWindow *)window
-(void)setGdkWindow: (GdkWindow *)window
{
gdk_window = window;
}
@@ -60,10 +584,11 @@
return YES;
/* A view is opaque if its GdkWindow doesn't have the RGBA visual */
return gdk_window_get_visual (gdk_window) != gdk_screen_get_rgba_visual (_gdk_screen);
return gdk_window_get_visual (gdk_window) !=
gdk_screen_get_rgba_visual (_gdk_screen);
}
-(void)drawRect:(NSRect)rect
-(void)drawRect: (NSRect)rect
{
GdkRectangle gdk_rect;
GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (gdk_window->impl);
@@ -75,7 +600,7 @@
if (GDK_WINDOW_DESTROYED (gdk_window))
return;
if (!(gdk_window->event_mask & GDK_EXPOSURE_MASK))
if (! (gdk_window->event_mask & GDK_EXPOSURE_MASK))
return;
if (NSEqualRects (rect, NSZeroRect))
@@ -93,7 +618,7 @@
[NSGraphicsContext saveGraphicsState];
[[NSColor windowBackgroundColor] setFill];
[NSBezierPath fillRect:rect];
[NSBezierPath fillRect: rect];
[NSGraphicsContext restoreGraphicsState];
@@ -107,9 +632,9 @@
impl->needs_display_region = NULL;
}
[self getRectsBeingDrawn:&drawn_rects count:&count];
[self getRectsBeingDrawn: &drawn_rects count: &count];
region = cairo_region_create ();
for (i = 0; i < count; i++)
{
gdk_rect.x = drawn_rects[i].origin.x;
@@ -133,7 +658,7 @@
}
}
-(void)setNeedsInvalidateShadow:(BOOL)invalidate
-(void)setNeedsInvalidateShadow: (BOOL)invalidate
{
needsInvalidateShadow = invalidate;
}
@@ -151,7 +676,7 @@
if (trackingRect)
{
[self removeTrackingRect:trackingRect];
[self removeTrackingRect: trackingRect];
trackingRect = 0;
}
@@ -163,32 +688,32 @@
*/
rect = [self bounds];
trackingRect = [self addTrackingRect:rect
owner:self
userData:nil
assumeInside:NO];
trackingRect = [self addTrackingRect: rect
owner: self
userData: nil
assumeInside: NO];
}
-(void)viewDidMoveToWindow
{
if (![self window]) /* We are destroyed already */
return;
return;
[self updateTrackingRect];
}
-(void)viewWillMoveToWindow:(NSWindow *)newWindow
-(void)viewWillMoveToWindow: (NSWindow *)newWindow
{
if (newWindow == nil && trackingRect)
{
[self removeTrackingRect:trackingRect];
[self removeTrackingRect: trackingRect];
trackingRect = 0;
}
}
-(void)setFrame:(NSRect)frame
-(void)setFrame: (NSRect)frame
{
[super setFrame:frame];
[super setFrame: frame];
if ([self window])
[self updateTrackingRect];
+22 -6
View File
@@ -17,17 +17,33 @@
*/
#import <AppKit/AppKit.h>
#include "gdkwindow.h"
#include "gdk/gdk.h"
@interface GdkQuartzView : NSView {
/* Text Input Client */
#define TIC_MARKED_TEXT "tic-marked-text"
#define TIC_SELECTED_POS "tic-selected-pos"
#define TIC_SELECTED_LEN "tic-selected-len"
#define TIC_INSERT_TEXT "tic-insert-text"
#define TIC_IN_KEY_DOWN "tic-in-key-down"
/* GtkIMContext */
#define GIC_CURSOR_RECT "gic-cursor-rect"
#define GIC_FILTER_KEY "gic-filter-key"
#define GIC_FILTER_PASSTHRU 0
#define GIC_FILTER_FILTERED 1
@interface GdkQuartzView : NSView <NSTextInputClient>
{
GdkWindow *gdk_window;
NSTrackingRectTag trackingRect;
BOOL needsInvalidateShadow;
NSRange markedRange;
NSRange selectedRange;
}
-(void)setGdkWindow:(GdkWindow *)window;
-(GdkWindow *)gdkWindow;
-(NSTrackingRectTag)trackingRect;
-(void)setNeedsInvalidateShadow:(BOOL)invalidate;
- (void)setGdkWindow: (GdkWindow *)window;
- (GdkWindow *)gdkWindow;
- (NSTrackingRectTag)trackingRect;
- (void)setNeedsInvalidateShadow: (BOOL)invalidate;
@end
+26 -16
View File
@@ -618,7 +618,32 @@ gdk_event_prepare (GSource *source,
gboolean retval;
gdk_threads_enter ();
/* The prepare stage is the stage before the main loop starts polling
* and dispatching events. The autorelease poll is drained here for
* the preceding main loop iteration or, in case of the first iteration,
* for the operations carried out between event loop initialization and
* this first iteration.
*
* The autorelease poll must only be drained when the following conditions
* apply:
* - We are at the base CFRunLoop level (indicated by current_loop_level),
* - We are at the base g_main_loop level (indicated by
* g_main_depth())
* - We are at the base poll_func level (indicated by getting events).
*
* Messing with the autorelease pool at any level of nesting can cause access
* to deallocated memory because autorelease_pool is static and releasing a
* pool will cause all pools allocated inside of it to be released as well.
*/
if (current_loop_level == 0 && g_main_depth() == 0 && getting_events == 0)
{
if (autorelease_pool)
[autorelease_pool drain];
autorelease_pool = [[NSAutoreleasePool alloc] init];
}
*timeout = -1;
if (_gdk_display->event_pause_count > 0)
@@ -659,21 +684,6 @@ gdk_event_dispatch (GSource *source,
gdk_threads_enter ();
/* Refresh the autorelease pool if we're at the base CFRunLoop level
* (indicated by current_loop_level) and the base g_main_loop level
* (indicated by g_main_depth()). Messing with the autorelease pool at
* any level of nesting can cause access to deallocated memory because
* autorelease_pool is static and releasing a pool will cause all pools
* allocated inside of it to be released as well.
*/
if (current_loop_level == 0 && g_main_depth() == 0)
{
if (autorelease_pool)
[autorelease_pool drain];
autorelease_pool = [[NSAutoreleasePool alloc] init];
}
_gdk_quartz_display_queue_events (_gdk_display);
event = _gdk_event_unqueue (_gdk_display);
+22 -1
View File
@@ -1156,6 +1156,24 @@ synthesize_crossing_event (GdkWindow *window,
return FALSE;
}
void
_gdk_quartz_synthesize_null_key_event (GdkWindow *window)
{
GdkEvent *event;
GdkQuartzDeviceManagerCore *device_manager;
event = gdk_event_new (GDK_KEY_PRESS);
event->any.type = GDK_KEY_PRESS;
event->key.window = window;
event->key.state = 0;
event->key.hardware_keycode = 0;
event->key.group = 0;
event->key.keyval = GDK_KEY_VoidSymbol;
device_manager = GDK_QUARTZ_DEVICE_MANAGER_CORE (_gdk_display->device_manager);
gdk_event_set_device (event, device_manager->core_keyboard);
append_event(event, FALSE);
}
GdkModifierType
_gdk_quartz_events_get_current_keyboard_modifiers (void)
{
@@ -1494,8 +1512,11 @@ gdk_event_translate (GdkEvent *event,
}
break;
case NSMouseEntered:
case NSMouseExited:
if (WINDOW_IS_TOPLEVEL (window))
[[NSCursor arrowCursor] set];
/* fall through */
case NSMouseEntered:
return_val = synthesize_crossing_event (window, event, nsevent, x, y, x_root, y_root);
break;
+240 -235
View File
@@ -82,17 +82,6 @@ _gdk_quartz_display_get_keymap (GdkDisplay *display)
return default_keymap;
}
/* Note: we could check only if building against the 10.5 SDK instead, but
* that would make non-xml layouts not work in 32-bit which would be a quite
* bad regression. This way, old unsupported layouts will just not work in
* 64-bit.
*/
#ifdef __LP64__
static TISInputSourceRef current_layout = NULL;
#else
static KeyboardLayoutRef current_layout = NULL;
#endif
/* This is a table of all keyvals. Each keycode gets KEYVALS_PER_KEYCODE entries.
* TThere is 1 keyval per modifier (Nothing, Shift, Alt, Shift+Alt);
*/
@@ -267,10 +256,17 @@ const static struct {
};
static void
maybe_update_keymap (void)
update_keymap (void)
{
const void *chr_data = NULL;
guint *p;
int i;
/* Note: we could check only if building against the 10.5 SDK instead, but
* that would make non-xml layouts not work in 32-bit which would be a quite
* bad regression. This way, old unsupported layouts will just not work in
* 64-bit.
*/
#ifdef __LP64__
TISInputSourceRef new_layout = TISCopyCurrentKeyboardLayoutInputSource ();
CFDataRef layout_data_ref;
@@ -282,228 +278,221 @@ maybe_update_keymap (void)
KLGetCurrentKeyboardLayout (&new_layout);
#endif
if (new_layout != current_layout)
{
guint *p;
int i;
g_free (keyval_array);
keyval_array = g_new0 (guint, NUM_KEYCODES * KEYVALS_PER_KEYCODE);
g_free (keyval_array);
keyval_array = g_new0 (guint, NUM_KEYCODES * KEYVALS_PER_KEYCODE);
#ifdef __LP64__
layout_data_ref = (CFDataRef) TISGetInputSourceProperty
(new_layout, kTISPropertyUnicodeKeyLayoutData);
layout_data_ref = (CFDataRef) TISGetInputSourceProperty
(new_layout, kTISPropertyUnicodeKeyLayoutData);
if (layout_data_ref)
chr_data = CFDataGetBytePtr (layout_data_ref);
if (layout_data_ref)
chr_data = CFDataGetBytePtr (layout_data_ref);
if (chr_data == NULL)
{
g_error ("cannot get keyboard layout data");
return;
}
#else
/* Get the layout kind */
KLGetKeyboardLayoutProperty (new_layout, kKLKind, (const void **)&layout_kind);
/* 8-bit-only keyabord layout */
if (layout_kind == kKLKCHRKind)
{
/* Get chr data */
KLGetKeyboardLayoutProperty (new_layout, kKLKCHRData, (const void **)&chr_data);
for (i = 0; i < NUM_KEYCODES; i++)
{
int j;
UInt32 modifiers[] = {0, shiftKey, optionKey, shiftKey | optionKey};
p = keyval_array + i * KEYVALS_PER_KEYCODE;
for (j = 0; j < KEYVALS_PER_KEYCODE; j++)
{
UInt32 c, state = 0;
UInt16 key_code;
UniChar uc;
key_code = modifiers[j] | i;
c = KeyTranslate (chr_data, key_code, &state);
if (state != 0)
{
UInt32 state2 = 0;
c = KeyTranslate (chr_data, key_code | 128, &state2);
}
if (c != 0 && c != 0x10)
{
int k;
gboolean found = FALSE;
/* FIXME: some keyboard layouts (e.g. Russian) use
* a different 8-bit character set. We should
* check for this. Not a serious problem, because
* most (all?) of these layouts also have a
* uchr version.
*/
uc = macroman2ucs (c);
for (k = 0; k < G_N_ELEMENTS (special_ucs_table); k++)
{
if (special_ucs_table[k].ucs_value == uc)
{
p[j] = special_ucs_table[k].keyval;
found = TRUE;
break;
}
}
/* Special-case shift-tab since GTK+ expects
* GDK_KEY_ISO_Left_Tab for that.
*/
if (found && p[j] == GDK_KEY_Tab && modifiers[j] == shiftKey)
p[j] = GDK_KEY_ISO_Left_Tab;
if (!found)
p[j] = gdk_unicode_to_keyval (uc);
}
}
if (p[3] == p[2])
p[3] = 0;
if (p[2] == p[1])
p[2] = 0;
if (p[1] == p[0])
p[1] = 0;
if (p[0] == p[2] &&
p[1] == p[3])
p[2] = p[3] = 0;
}
}
/* unicode keyboard layout */
else if (layout_kind == kKLKCHRuchrKind || layout_kind == kKLuchrKind)
{
/* Get chr data */
KLGetKeyboardLayoutProperty (new_layout, kKLuchrData, (const void **)&chr_data);
#endif
for (i = 0; i < NUM_KEYCODES; i++)
{
int j;
UInt32 modifiers[] = {0, shiftKey, optionKey, shiftKey | optionKey};
UniChar chars[4];
UniCharCount nChars;
p = keyval_array + i * KEYVALS_PER_KEYCODE;
for (j = 0; j < KEYVALS_PER_KEYCODE; j++)
{
UInt32 state = 0;
OSStatus err;
UInt16 key_code;
UniChar uc;
key_code = modifiers[j] | i;
err = UCKeyTranslate (chr_data, i, kUCKeyActionDisplay,
(modifiers[j] >> 8) & 0xFF,
LMGetKbdType(),
0,
&state, 4, &nChars, chars);
/* FIXME: Theoretically, we can get multiple UTF-16 values;
* we should convert them to proper unicode and figure
* out whether there are really keyboard layouts that
* give us more than one character for one keypress. */
if (err == noErr && nChars == 1)
{
int k;
gboolean found = FALSE;
/* A few <Shift><Option>keys return two
* characters, the first of which is U+00a0,
* which isn't interesting; so we return the
* second. More sophisticated handling is the
* job of a GtkIMContext.
*
* If state isn't zero, it means that it's a
* dead key of some sort. Some of those are
* enumerated in the special_ucs_table with the
* high nibble set to f to push it into the
* private use range. Here we do the same.
*/
if (state != 0)
chars[nChars - 1] |= 0xf000;
uc = chars[nChars - 1];
for (k = 0; k < G_N_ELEMENTS (special_ucs_table); k++)
{
if (special_ucs_table[k].ucs_value == uc)
{
p[j] = special_ucs_table[k].keyval;
found = TRUE;
break;
}
}
/* Special-case shift-tab since GTK+ expects
* GDK_KEY_ISO_Left_Tab for that.
*/
if (found && p[j] == GDK_KEY_Tab && modifiers[j] == shiftKey)
p[j] = GDK_KEY_ISO_Left_Tab;
if (!found)
p[j] = gdk_unicode_to_keyval (uc);
}
}
if (p[3] == p[2])
p[3] = 0;
if (p[2] == p[1])
p[2] = 0;
if (p[1] == p[0])
p[1] = 0;
if (p[0] == p[2] &&
p[1] == p[3])
p[2] = p[3] = 0;
}
#ifndef __LP64__
}
else
{
g_error ("unknown type of keyboard layout (neither KCHR nor uchr)"
" - not supported right now");
}
#endif
for (i = 0; i < G_N_ELEMENTS (modifier_keys); i++)
{
p = keyval_array + modifier_keys[i].keycode * KEYVALS_PER_KEYCODE;
if (p[0] == 0 && p[1] == 0 &&
p[2] == 0 && p[3] == 0)
p[0] = modifier_keys[i].keyval;
}
for (i = 0; i < G_N_ELEMENTS (function_keys); i++)
{
p = keyval_array + function_keys[i].keycode * KEYVALS_PER_KEYCODE;
p[0] = function_keys[i].keyval;
p[1] = p[2] = p[3] = 0;
}
for (i = 0; i < G_N_ELEMENTS (known_numeric_keys); i++)
{
p = keyval_array + known_numeric_keys[i].keycode * KEYVALS_PER_KEYCODE;
if (p[0] == known_numeric_keys[i].normal_keyval)
p[0] = known_numeric_keys[i].keypad_keyval;
}
if (current_layout)
g_signal_emit_by_name (default_keymap, "keys_changed");
current_layout = new_layout;
if (chr_data == NULL)
{
g_error ("cannot get keyboard layout data");
return;
}
#else
/* Get the layout kind */
KLGetKeyboardLayoutProperty (new_layout, kKLKind, (const void **)&layout_kind);
/* 8-bit-only keyabord layout */
if (layout_kind == kKLKCHRKind)
{
/* Get chr data */
KLGetKeyboardLayoutProperty (new_layout, kKLKCHRData, (const void **)&chr_data);
for (i = 0; i < NUM_KEYCODES; i++)
{
int j;
UInt32 modifiers[] = {0, shiftKey, optionKey, shiftKey | optionKey};
p = keyval_array + i * KEYVALS_PER_KEYCODE;
for (j = 0; j < KEYVALS_PER_KEYCODE; j++)
{
UInt32 c, state = 0;
UInt16 key_code;
UniChar uc;
key_code = modifiers[j] | i;
c = KeyTranslate (chr_data, key_code, &state);
if (state != 0)
{
UInt32 state2 = 0;
c = KeyTranslate (chr_data, key_code | 128, &state2);
}
if (c != 0 && c != 0x10)
{
int k;
gboolean found = FALSE;
/* FIXME: some keyboard layouts (e.g. Russian) use a
* different 8-bit character set. We should check
* for this. Not a serious problem, because most
* (all?) of these layouts also have a uchr version.
*/
uc = macroman2ucs (c);
for (k = 0; k < G_N_ELEMENTS (special_ucs_table); k++)
{
if (special_ucs_table[k].ucs_value == uc)
{
p[j] = special_ucs_table[k].keyval;
found = TRUE;
break;
}
}
/* Special-case shift-tab since GTK+ expects
* GDK_KEY_ISO_Left_Tab for that.
*/
if (found && p[j] == GDK_KEY_Tab && modifiers[j] == shiftKey)
p[j] = GDK_KEY_ISO_Left_Tab;
if (!found)
p[j] = gdk_unicode_to_keyval (uc);
}
}
if (p[3] == p[2])
p[3] = 0;
if (p[2] == p[1])
p[2] = 0;
if (p[1] == p[0])
p[1] = 0;
if (p[0] == p[2] &&
p[1] == p[3])
p[2] = p[3] = 0;
}
}
/* unicode keyboard layout */
else if (layout_kind == kKLKCHRuchrKind || layout_kind == kKLuchrKind)
{
/* Get chr data */
KLGetKeyboardLayoutProperty (new_layout, kKLuchrData, (const void **)&chr_data);
#endif
for (i = 0; i < NUM_KEYCODES; i++)
{
int j;
UInt32 modifiers[] = {0, shiftKey, optionKey, shiftKey | optionKey};
UniChar chars[4];
UniCharCount nChars;
p = keyval_array + i * KEYVALS_PER_KEYCODE;
for (j = 0; j < KEYVALS_PER_KEYCODE; j++)
{
UInt32 state = 0;
OSStatus err;
UInt16 key_code;
UniChar uc;
key_code = modifiers[j] | i;
err = UCKeyTranslate (chr_data, i, kUCKeyActionDisplay,
(modifiers[j] >> 8) & 0xFF,
LMGetKbdType(),
0,
&state, 4, &nChars, chars);
/* FIXME: Theoretically, we can get multiple UTF-16
* values; we should convert them to proper unicode and
* figure out whether there are really keyboard layouts
* that give us more than one character for one
* keypress.
*/
if (err == noErr && nChars == 1)
{
int k;
gboolean found = FALSE;
/* A few <Shift><Option>keys return two characters,
* the first of which is U+00a0, which isn't
* interesting; so we return the second. More
* sophisticated handling is the job of a
* GtkIMContext.
*
* If state isn't zero, it means that it's a dead
* key of some sort. Some of those are enumerated in
* the special_ucs_table with the high nibble set to
* f to push it into the private use range. Here we
* do the same.
*/
if (state != 0)
chars[nChars - 1] |= 0xf000;
uc = chars[nChars - 1];
for (k = 0; k < G_N_ELEMENTS (special_ucs_table); k++)
{
if (special_ucs_table[k].ucs_value == uc)
{
p[j] = special_ucs_table[k].keyval;
found = TRUE;
break;
}
}
/* Special-case shift-tab since GTK+ expects
* GDK_KEY_ISO_Left_Tab for that.
*/
if (found && p[j] == GDK_KEY_Tab && modifiers[j] == shiftKey)
p[j] = GDK_KEY_ISO_Left_Tab;
if (!found)
p[j] = gdk_unicode_to_keyval (uc);
}
}
if (p[3] == p[2])
p[3] = 0;
if (p[2] == p[1])
p[2] = 0;
if (p[1] == p[0])
p[1] = 0;
if (p[0] == p[2] &&
p[1] == p[3])
p[2] = p[3] = 0;
}
#ifndef __LP64__
}
else
{
g_error ("unknown type of keyboard layout (neither KCHR nor uchr)"
" - not supported right now");
}
#endif
for (i = 0; i < G_N_ELEMENTS (modifier_keys); i++)
{
p = keyval_array + modifier_keys[i].keycode * KEYVALS_PER_KEYCODE;
if (p[0] == 0 && p[1] == 0 &&
p[2] == 0 && p[3] == 0)
p[0] = modifier_keys[i].keyval;
}
for (i = 0; i < G_N_ELEMENTS (function_keys); i++)
{
p = keyval_array + function_keys[i].keycode * KEYVALS_PER_KEYCODE;
p[0] = function_keys[i].keyval;
p[1] = p[2] = p[3] = 0;
}
for (i = 0; i < G_N_ELEMENTS (known_numeric_keys); i++)
{
p = keyval_array + known_numeric_keys[i].keycode * KEYVALS_PER_KEYCODE;
if (p[0] == known_numeric_keys[i].normal_keyval)
p[0] = known_numeric_keys[i].keypad_keyval;
}
g_signal_emit_by_name (default_keymap, "keys-changed");
}
static PangoDirection
@@ -542,8 +531,6 @@ gdk_quartz_keymap_get_entries_for_keyval (GdkKeymap *keymap,
GArray *keys_array;
int i;
maybe_update_keymap ();
*n_keys = 0;
keys_array = g_array_new (FALSE, FALSE, sizeof (GdkKeymapKey));
@@ -579,8 +566,6 @@ gdk_quartz_keymap_get_entries_for_keycode (GdkKeymap *keymap,
int i;
guint *p;
maybe_update_keymap ();
*n_entries = 0;
if (hardware_keycode > NUM_KEYCODES)
@@ -689,8 +674,6 @@ gdk_quartz_keymap_translate_keyboard_state (GdkKeymap *keymap,
GdkModifierType bit;
guint tmp_modifiers = 0;
maybe_update_keymap ();
if (keyval)
*keyval = 0;
if (effective_group)
@@ -835,14 +818,36 @@ _gdk_quartz_keys_is_modifier (guint keycode)
return FALSE;
}
static void
input_sources_changed_notification (CFNotificationCenterRef center,
void *observer,
CFStringRef name,
const void *object,
CFDictionaryRef userInfo)
{
update_keymap ();
}
static void
gdk_quartz_keymap_init (GdkQuartzKeymap *keymap)
{
update_keymap ();
CFNotificationCenterAddObserver (CFNotificationCenterGetDistributedCenter (),
keymap,
input_sources_changed_notification,
CFSTR ("AppleSelectedInputSourcesChangedNotification"),
NULL,
CFNotificationSuspensionBehaviorDeliverImmediately);
}
static void
gdk_quartz_keymap_finalize (GObject *object)
{
CFNotificationCenterRemoveObserver (CFNotificationCenterGetDistributedCenter (),
object,
CFSTR ("AppleSelectedInputSourcesChangedNotification"),
NULL);
G_OBJECT_CLASS (gdk_quartz_keymap_parent_class)->finalize (object);
}
+1
View File
@@ -74,6 +74,7 @@ void _gdk_quartz_event_loop_release_event (NSEvent *event);
/* Keys */
GdkEventType _gdk_quartz_keys_event_type (NSEvent *event);
gboolean _gdk_quartz_keys_is_modifier (guint keycode);
void _gdk_quartz_synthesize_null_key_event (GdkWindow *window);
/* Drag and Drop */
void _gdk_quartz_window_register_dnd (GdkWindow *window);
+4
View File
@@ -55,6 +55,10 @@ typedef enum
GdkOSXVersion gdk_quartz_osx_version (void);
GdkAtom gdk_quartz_pasteboard_type_to_atom_libgtk_only (NSString *type);
NSString *gdk_quartz_target_to_pasteboard_type_libgtk_only (const gchar *target);
NSString *gdk_quartz_atom_to_pasteboard_type_libgtk_only (GdkAtom atom);
G_END_DECLS
#define __GDKQUARTZ_H_INSIDE__
+40
View File
@@ -22,6 +22,7 @@
#include "gdkselection.h"
#include "gdkproperty.h"
#include "gdkquartz.h"
gboolean
_gdk_quartz_display_set_selection_owner (GdkDisplay *display,
@@ -171,3 +172,42 @@ _gdk_quartz_display_text_property_to_utf8_list (GdkDisplay *display,
}
}
GdkAtom
gdk_quartz_pasteboard_type_to_atom_libgtk_only (NSString *type)
{
if ([type isEqualToString:NSStringPboardType])
return gdk_atom_intern_static_string ("UTF8_STRING");
else if ([type isEqualToString:NSTIFFPboardType])
return gdk_atom_intern_static_string ("image/tiff");
else if ([type isEqualToString:NSColorPboardType])
return gdk_atom_intern_static_string ("application/x-color");
else if ([type isEqualToString:NSURLPboardType])
return gdk_atom_intern_static_string ("text/uri-list");
else
return gdk_atom_intern ([type UTF8String], FALSE);
}
NSString *
gdk_quartz_target_to_pasteboard_type_libgtk_only (const char *target)
{
if (strcmp (target, "UTF8_STRING") == 0)
return NSStringPboardType;
else if (strcmp (target, "image/tiff") == 0)
return NSTIFFPboardType;
else if (strcmp (target, "application/x-color") == 0)
return NSColorPboardType;
else if (strcmp (target, "text/uri-list") == 0)
return NSURLPboardType;
else
return [NSString stringWithUTF8String:target];
}
NSString *
gdk_quartz_atom_to_pasteboard_type_libgtk_only (GdkAtom atom)
{
gchar *target = gdk_atom_name (atom);
NSString *ret = gdk_quartz_target_to_pasteboard_type_libgtk_only (target);
g_free (target);
return ret;
}
+7 -3
View File
@@ -2338,14 +2338,18 @@ window_type_hint_to_level (GdkWindowTypeHint hint)
return NSTornOffMenuWindowLevel;
case GDK_WINDOW_TYPE_HINT_DOCK:
return NSFloatingWindowLevel; /* NSDockWindowLevel is deprecated, and not replaced */
case GDK_WINDOW_TYPE_HINT_UTILITY:
case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
return NSFloatingWindowLevel;
case GDK_WINDOW_TYPE_HINT_NORMAL: /* Normal toplevel window */
case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
case GDK_WINDOW_TYPE_HINT_DESKTOP: /* N/A */
break;
return NSNormalWindowLevel;
case GDK_WINDOW_TYPE_HINT_DESKTOP:
return kCGDesktopWindowLevelKey; /* doesn't map to any real Cocoa model */
default:
break;
-7
View File
@@ -324,13 +324,6 @@ gdk_wayland_window_attach_image (GdkWindow *window)
if (GDK_WINDOW_DESTROYED (window))
return;
/* The "drawn to" Cairo surface is the same as the Cairo surface from which
* we are driving the buffer for the Wayland surface. Therefore we don't
* need to do anything here
*/
if (impl->server_surface == impl->cairo_surface)
return;
/* The wayland surface is attached to a buffer that is from the old "drawn
* to" surface. Unref the surface and restore the state.
*/
+10 -5
View File
@@ -150,6 +150,7 @@ _gdk_win32_window_change_property (GdkWindow *window,
guchar *ucptr;
wchar_t *wcptr, *p;
glong wclen;
GError *err = NULL;
g_return_if_fail (window != NULL);
g_return_if_fail (GDK_IS_WINDOW (window));
@@ -193,7 +194,13 @@ _gdk_win32_window_change_property (GdkWindow *window,
return;
}
wcptr = g_utf8_to_utf16 ((char *) data, nelements, NULL, &wclen, NULL);
wcptr = g_utf8_to_utf16 ((char *) data, nelements, NULL, &wclen, &err);
if (err != NULL)
{
g_warning ("Failed to convert utf8: %s", err->message);
g_clear_error (&err);
return;
}
wclen++; /* Terminating 0 */
size = wclen * 2;
@@ -399,7 +406,6 @@ _gdk_win32_screen_get_setting (GdkScreen *screen,
g_value_set_boolean (value, TRUE);
return TRUE;
}
#if 0
/*
* With 'MS Sans Serif' as windows menu font (default on win98se) you'll get a
* bunch of :
@@ -416,7 +422,7 @@ _gdk_win32_screen_get_setting (GdkScreen *screen,
/* Pango finally uses GetDeviceCaps to scale, we use simple
* approximation here.
*/
int nHeight = (0 > ncm.lfMenuFont.lfHeight ? -3*ncm.lfMenuFont.lfHeight/4 : 10);
int nHeight = (0 > ncm.lfMenuFont.lfHeight ? - 3 * ncm.lfMenuFont.lfHeight / 4 : 10);
if (OUT_STRING_PRECIS == ncm.lfMenuFont.lfOutPrecision)
GDK_NOTE(MISC, g_print("gdk_screen_get_setting(%s) : ignoring bitmap font '%s'\n",
name, ncm.lfMenuFont.lfFaceName));
@@ -424,7 +430,7 @@ _gdk_win32_screen_get_setting (GdkScreen *screen,
/* Avoid issues like those described in bug #135098 */
g_utf8_validate (ncm.lfMenuFont.lfFaceName, -1, NULL))
{
char* s = g_strdup_printf ("%s %d", ncm.lfMenuFont.lfFaceName, nHeight);
char *s = g_strdup_printf ("%s %d", ncm.lfMenuFont.lfFaceName, nHeight);
GDK_NOTE(MISC, g_print("gdk_screen_get_setting(%s) : %s\n", name, s));
g_value_set_string (value, s);
@@ -433,7 +439,6 @@ _gdk_win32_screen_get_setting (GdkScreen *screen,
}
}
}
#endif
return FALSE;
}
+8
View File
@@ -859,6 +859,14 @@ _gdk_device_xi2_reset_scroll_valuators (GdkX11DeviceXI2 *device)
}
}
void
_gdk_device_xi2_unset_scroll_valuators (GdkX11DeviceXI2 *device)
{
if (device->scroll_valuators->len > 0)
g_array_remove_range (device->scroll_valuators, 0,
device->scroll_valuators->len);
}
gint
_gdk_x11_device_xi2_get_id (GdkX11DeviceXI2 *device)
{
+12
View File
@@ -838,6 +838,10 @@ _gdk_device_manager_core_handle_focus (GdkWindow *window,
*/
if (toplevel->has_pointer &&
mode != NotifyGrab &&
#ifdef XINPUT_2
mode != XINotifyPassiveGrab &&
mode != XINotifyPassiveUngrab &&
#endif /* XINPUT_2 */
mode != NotifyUngrab)
toplevel->has_pointer_focus = (focus_in) ? FALSE : TRUE;
@@ -845,6 +849,10 @@ _gdk_device_manager_core_handle_focus (GdkWindow *window,
case NotifyNonlinear:
case NotifyNonlinearVirtual:
if (mode != NotifyGrab &&
#ifdef XINPUT_2
mode != XINotifyPassiveGrab &&
mode != XINotifyPassiveUngrab &&
#endif /* XINPUT_2 */
mode != NotifyUngrab)
toplevel->has_focus_window = (focus_in) ? TRUE : FALSE;
/* We pretend that the focus moves to the grab
@@ -860,6 +868,10 @@ _gdk_device_manager_core_handle_focus (GdkWindow *window,
* grab is in effect
*/
if (mode != NotifyGrab &&
#ifdef XINPUT_2
mode != XINotifyPassiveGrab &&
mode != XINotifyPassiveUngrab &&
#endif /* XINPUT_2 */
mode != NotifyUngrab)
toplevel->has_pointer_focus = (focus_in) ? TRUE : FALSE;
break;
+29 -4
View File
@@ -491,6 +491,8 @@ gdk_x11_device_manager_xi2_constructed (GObject *object)
XIEventMask event_mask;
unsigned char mask[2] = { 0 };
G_OBJECT_CLASS (gdk_x11_device_manager_xi2_parent_class)->constructed (object);
device_manager = GDK_X11_DEVICE_MANAGER_XI2 (object);
display = gdk_device_manager_get_display (GDK_DEVICE_MANAGER (object));
xdisplay = GDK_DISPLAY_XDISPLAY (display);
@@ -763,6 +765,7 @@ handle_device_changed (GdkX11DeviceManagerXI2 *device_manager,
if (device)
{
_gdk_device_reset_axes (device);
_gdk_device_xi2_unset_scroll_valuators ((GdkX11DeviceXI2 *) device);
translate_device_classes (display, device, ev->classes, ev->num_classes);
g_signal_emit_by_name (G_OBJECT (device), "changed");
@@ -777,12 +780,16 @@ translate_crossing_mode (gint mode)
{
switch (mode)
{
case NotifyNormal:
case XINotifyNormal:
return GDK_CROSSING_NORMAL;
case NotifyGrab:
case XINotifyGrab:
case XINotifyPassiveGrab:
return GDK_CROSSING_GRAB;
case NotifyUngrab:
case XINotifyUngrab:
case XINotifyPassiveUngrab:
return GDK_CROSSING_UNGRAB;
case XINotifyWhileGrabbed:
/* Fall through, unexpected in pointer crossing events */
default:
g_assert_not_reached ();
}
@@ -1555,7 +1562,25 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
source_device = g_hash_table_lookup (device_manager->id_table,
GUINT_TO_POINTER (xev->sourceid));
gdk_event_set_source_device (event, source_device);
_gdk_device_xi2_reset_scroll_valuators (GDK_X11_DEVICE_XI2 (source_device));
if (ev->evtype == XI_Enter &&
xev->detail != XINotifyInferior && xev->mode != XINotifyPassiveUngrab &&
gdk_window_get_window_type (window) == GDK_WINDOW_TOPLEVEL)
{
if (gdk_device_get_device_type (source_device) != GDK_DEVICE_TYPE_MASTER)
_gdk_device_xi2_reset_scroll_valuators (GDK_X11_DEVICE_XI2 (source_device));
else
{
GList *slaves, *l;
slaves = gdk_device_list_slave_devices (source_device);
for (l = slaves; l; l = l->next)
_gdk_device_xi2_reset_scroll_valuators (GDK_X11_DEVICE_XI2 (l->data));
g_list_free (slaves);
}
}
event->crossing.mode = translate_crossing_mode (xev->mode);
event->crossing.detail = translate_notify_type (xev->detail);
+12 -1
View File
@@ -140,6 +140,7 @@ static const char *const precache_atoms[] = {
"_NET_WM_STATE_ABOVE",
"_NET_WM_STATE_BELOW",
"_NET_WM_STATE_FULLSCREEN",
"_NET_WM_STATE_HIDDEN",
"_NET_WM_STATE_MODAL",
"_NET_WM_STATE_MAXIMIZED_VERT",
"_NET_WM_STATE_MAXIMIZED_HORZ",
@@ -149,8 +150,17 @@ static const char *const precache_atoms[] = {
"_NET_WM_SYNC_REQUEST",
"_NET_WM_SYNC_REQUEST_COUNTER",
"_NET_WM_WINDOW_TYPE",
"_NET_WM_WINDOW_TYPE_COMBO",
"_NET_WM_WINDOW_TYPE_DIALOG",
"_NET_WM_WINDOW_TYPE_DND",
"_NET_WM_WINDOW_TYPE_DROPDOWN_MENU",
"_NET_WM_WINDOW_TYPE_MENU",
"_NET_WM_WINDOW_TYPE_NORMAL",
"_NET_WM_WINDOW_TYPE_POPUP_MENU",
"_NET_WM_WINDOW_TYPE_TOOLTIP",
"_NET_WM_WINDOW_TYPE_UTILITY",
"_NET_WM_USER_TIME",
"_NET_WM_USER_TIME_WINDOW",
"_NET_VIRTUAL_ROOTS",
"GDK_SELECTION",
"_NET_WM_STATE_FOCUSED"
@@ -1731,7 +1741,8 @@ device_grab_update_callback (GdkDisplay *display,
pointer_info = _gdk_display_get_pointer_info (display, device);
_gdk_display_device_grab_update (display, device,
pointer_info->last_slave, serial);
pointer_info->last_slave ? pointer_info->last_slave : device,
serial);
}
#define XSERVER_TIME_IS_LATER(time1, time2) \
+2
View File
@@ -230,6 +230,8 @@ guint _gdk_x11_device_xi2_translate_state (XIModifierState *mods_state,
XIButtonState *buttons_state,
XIGroupState *group_state);
gint _gdk_x11_device_xi2_get_id (GdkX11DeviceXI2 *device);
void _gdk_device_xi2_unset_scroll_valuators (GdkX11DeviceXI2 *device);
GdkDevice * _gdk_x11_device_manager_xi2_lookup (GdkX11DeviceManagerXI2 *device_manager_xi2,
gint device_id);
+43 -13
View File
@@ -96,13 +96,13 @@ gdk_x11_screen_get_display (GdkScreen *screen)
static gint
gdk_x11_screen_get_width (GdkScreen *screen)
{
return WidthOfScreen (GDK_X11_SCREEN (screen)->xscreen);
return GDK_X11_SCREEN (screen)->width;
}
static gint
gdk_x11_screen_get_height (GdkScreen *screen)
{
return HeightOfScreen (GDK_X11_SCREEN (screen)->xscreen);
return GDK_X11_SCREEN (screen)->height;
}
static gint
@@ -149,6 +149,9 @@ gdk_x11_screen_dispose (GObject *object)
if (x11_screen->root_window)
_gdk_window_destroy (x11_screen->root_window, TRUE);
for (i = 0; i < x11_screen->nvisuals; i++)
g_object_run_dispose (G_OBJECT (x11_screen->visuals[i]));
G_OBJECT_CLASS (gdk_x11_screen_parent_class)->dispose (object);
x11_screen->xdisplay = NULL;
@@ -892,8 +895,8 @@ _gdk_x11_screen_get_edge_monitors (GdkScreen *screen,
gint *right)
{
GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
gint top_most_pos = HeightOfScreen (GDK_X11_SCREEN (screen)->xscreen);
gint left_most_pos = WidthOfScreen (GDK_X11_SCREEN (screen)->xscreen);
gint top_most_pos = x11_screen->height;
gint left_most_pos = x11_screen->width;
gint bottom_most_pos = 0;
gint right_most_pos = 0;
gint monitor_num;
@@ -1022,6 +1025,30 @@ init_multihead (GdkScreen *screen)
HeightOfScreen (x11_screen->xscreen));
}
static void
update_bounding_box (GdkScreen *screen)
{
GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
gint i, x1, y1, x2, y2;
x1 = y1 = G_MAXINT;
x2 = y2 = G_MININT;
for (i = 0; i < x11_screen->n_monitors; i++)
{
GdkX11Monitor *monitor;
monitor = &x11_screen->monitors[i];
x1 = MIN (x1, monitor->geometry.x);
y1 = MIN (y1, monitor->geometry.y);
x2 = MAX (x2, monitor->geometry.x + monitor->geometry.width);
y2 = MAX (y2, monitor->geometry.y + monitor->geometry.height);
}
x11_screen->width = x2 - x1;
x11_screen->height = y2 - y1;
}
GdkScreen *
_gdk_x11_screen_new (GdkDisplay *display,
gint screen_number)
@@ -1047,7 +1074,8 @@ _gdk_x11_screen_new (GdkDisplay *display,
_gdk_x11_screen_init_visuals (screen);
_gdk_x11_screen_init_root_window (screen);
update_bounding_box (screen);
return screen;
}
@@ -1119,11 +1147,13 @@ process_monitors_change (GdkScreen *screen)
x11_screen->monitors, x11_screen->n_monitors) ||
x11_screen->primary_monitor != primary_monitor;
free_monitors (monitors, n_monitors);
if (changed)
g_signal_emit_by_name (screen, "monitors-changed");
{
update_bounding_box (screen);
g_signal_emit_by_name (screen, "monitors-changed");
}
}
void
@@ -1470,6 +1500,7 @@ gdk_x11_screen_supports_net_wm_hint (GdkScreen *screen,
GdkX11Screen *x11_screen;
NetWmSupportedAtoms *supported_atoms;
GdkDisplay *display;
Atom atom;
g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
@@ -1521,13 +1552,12 @@ gdk_x11_screen_supports_net_wm_hint (GdkScreen *screen,
if (supported_atoms->atoms == NULL)
return FALSE;
i = 0;
while (i < supported_atoms->n_atoms)
{
if (supported_atoms->atoms[i] == gdk_x11_atom_to_xatom_for_display (display, property))
return TRUE;
atom = gdk_x11_atom_to_xatom_for_display (display, property);
++i;
for (i = 0; i < supported_atoms->n_atoms; i++)
{
if (supported_atoms->atoms[i] == atom)
return TRUE;
}
return FALSE;
+3
View File
@@ -47,6 +47,9 @@ struct _GdkX11Screen
GdkX11Monitor *monitors;
gint primary_monitor;
gint width;
gint height;
/* Xft resources for the display, used for default values for
* the Xft/ XSETTINGS
*/
+16
View File
@@ -87,12 +87,28 @@ gdk_x11_visual_finalize (GObject *object)
G_OBJECT_CLASS (gdk_x11_visual_parent_class)->finalize (object);
}
static void
gdk_x11_visual_dispose (GObject *object)
{
GdkVisual *visual = (GdkVisual *)object;
GdkX11Visual *x11_visual = (GdkX11Visual *)object;
if (x11_visual->colormap != None)
{
XFreeColormap (GDK_SCREEN_XDISPLAY (visual->screen), x11_visual->colormap);
x11_visual->colormap = None;
}
G_OBJECT_CLASS (gdk_x11_visual_parent_class)->dispose (object);
}
static void
gdk_x11_visual_class_init (GdkX11VisualClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
object_class->finalize = gdk_x11_visual_finalize;
object_class->dispose = gdk_x11_visual_dispose;
}
void
+41 -8
View File
@@ -157,6 +157,7 @@ gdk_window_impl_x11_init (GdkWindowImplX11 *impl)
impl->toplevel_window_type = -1;
impl->device_cursor = g_hash_table_new_full (NULL, NULL,
NULL, g_object_unref);
impl->frame_sync_enabled = TRUE;
}
GdkToplevelX11 *
@@ -403,7 +404,8 @@ gdk_x11_window_end_frame (GdkWindow *window)
impl->toplevel->extended_update_counter,
impl->toplevel->current_counter_value);
if (gdk_x11_screen_supports_net_wm_hint (gdk_window_get_screen (window),
if (impl->frame_sync_enabled &&
gdk_x11_screen_supports_net_wm_hint (gdk_window_get_screen (window),
gdk_atom_intern_static_string ("_NET_WM_FRAME_DRAWN")))
{
impl->toplevel->frame_pending = TRUE;
@@ -1077,15 +1079,15 @@ _gdk_x11_display_create_window_impl (GdkDisplay *display,
class = InputOnly;
}
if (window->width > 65535 ||
window->height > 65535)
if (window->width > 32767 ||
window->height > 32767)
{
g_warning ("Native Windows wider or taller than 65535 pixels are not supported");
g_warning ("Native Windows wider or taller than 32767 pixels are not supported");
if (window->width > 65535)
window->width = 65535;
if (window->height > 65535)
window->height = 65535;
if (window->width > 32767)
window->width = 32767;
if (window->height > 32767)
window->height = 32767;
}
impl->xid = XCreateWindow (xdisplay, xparent,
@@ -5306,6 +5308,37 @@ gdk_x11_window_get_xid (GdkWindow *window)
return GDK_WINDOW_IMPL_X11 (window->impl)->xid;
}
/**
* gdk_x11_window_set_frame_sync_enabled:
* @window: (type GdkX11Window): a native #GdkWindow
* @frame_sync_enabled: whether frame-synchronization should be enabled
*
* This function can be used to disable frame synchronization for a window.
* Normally frame synchronziation will be enabled or disabled based on whether
* the system has a compositor that supports frame synchronization, but if
* the window is not directly managed by the window manager, then frame
* synchronziation may need to be disabled. This is the case for a window
* embedded via the XEMBED protocol.
*
* Since: 3.8
*/
void
gdk_x11_window_set_frame_sync_enabled (GdkWindow *window,
gboolean frame_sync_enabled)
{
/* Try to ensure the window has a native window */
if (!_gdk_window_has_impl (window))
gdk_window_ensure_native (window);
if (!GDK_WINDOW_IS_X11 (window))
{
g_warning (G_STRLOC " drawable is not a native X11 window");
return;
}
GDK_WINDOW_IMPL_X11 (window->impl)->frame_sync_enabled = FALSE;
}
static void
gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass)
{
+3
View File
@@ -73,6 +73,7 @@ struct _GdkWindowImplX11
* unset during resizing and scaling */
guint override_redirect : 1;
guint frame_clock_connected : 1;
guint frame_sync_enabled : 1;
cairo_surface_t *cairo_surface;
@@ -172,6 +173,8 @@ GType gdk_window_impl_x11_get_type (void);
void gdk_x11_window_set_user_time (GdkWindow *window,
guint32 timestamp);
void gdk_x11_window_set_frame_sync_enabled (GdkWindow *window,
gboolean frame_sync_enabled);
GdkToplevelX11 *_gdk_x11_window_get_toplevel (GdkWindow *window);
void _gdk_x11_window_tmp_unset_bg (GdkWindow *window,
+4
View File
@@ -67,6 +67,10 @@ void gdk_x11_window_set_hide_titlebar_when_maximized (GdkWindow *window,
gboolean hide_titlebar_when_maximized);
void gdk_x11_window_move_to_current_desktop (GdkWindow *window);
GDK_AVAILABLE_IN_3_8
void gdk_x11_window_set_frame_sync_enabled (GdkWindow *window,
gboolean frame_sync_enabled);
/**
* GDK_WINDOW_XDISPLAY:
* @win: a #GdkWindow.
+26 -12
View File
@@ -884,6 +884,7 @@ gtk_base_c_sources = \
$(gtk_clipboard_dnd_c_sources) \
$(gtk_appchooser_impl_c_sources)
nodist_gtk_c_sources =
gtk_c_sources = $(gtk_base_c_sources)
gtk_all_c_sources = $(gtk_base_c_sources)
@@ -896,6 +897,9 @@ $(gtk_dbus_built_sources) : Makefile.am gtkdbusinterfaces.xml
--generate-c-code gtkdbusgenerated \
$(srcdir)/gtkdbusinterfaces.xml
nodist_gtk_c_sources += $(gtk_dbus_built_sources)
gtk_all_c_sources += $(gtk_dbus_built_sources)
gtk_os_unix_c_sources = \
gtkcustompaperunixdialog.c \
gtkpagesetupunixdialog.c \
@@ -907,8 +911,7 @@ gtk_os_unix_c_sources = \
gtkprintoperation-unix.c \
gtkprintunixdialog.c \
gtkprintbackend.c \
gtksearchenginetracker.c \
$(gtk_dbus_built_sources)
gtksearchenginetracker.c
gtk_all_c_sources += $(gtk_os_unix_c_sources)
if OS_UNIX
gtk_private_h_sources += \
@@ -920,8 +923,6 @@ gtk_private_h_sources += \
gtkprinteroptionwidget.h \
gtksearchenginetracker.h
gtk_c_sources += $(gtk_os_unix_c_sources)
else
gtk_c_sources += $(gtk_dbus_built_sources)
endif
gtk_os_win32_c_sources = \
@@ -1025,14 +1026,12 @@ gtk_built_public_sources = \
# built headers that don't get installed
gtk_built_private_headers = \
gtkdbusgenerated.h \
gtkresources.h \
gtkmarshalers.h \
gtkbuiltincache.h \
gtkprivatetypebuiltins.h
gtk_built_sources = \
gtkdbusgenerated.c \
gtkresources.c \
gtktypebuiltins.c \
gtktypefuncs.c \
@@ -1069,6 +1068,7 @@ gtk_extra_sources = \
#
MAINTAINERCLEANFILES = \
$(gtk_built_sources) \
$(gtk_dbus_built_sources) \
$(stamp_files) \
$(GENERATED_ICONS) \
stock-icons/icon-theme.cache
@@ -1098,7 +1098,10 @@ DND_CURSORS = \
gen_sources = xgen-gdef xgen-gtbh xgen-gtic xgen-gmh xgen-gmc xgen-gmlh xgen-gmlc xgen-gtfsrc.c xgen-gtf
CLEANFILES = $(gen_sources)
BUILT_SOURCES = $(gtk_built_sources) stamp-icons
BUILT_SOURCES = \
$(gtk_built_sources) \
$(gtk_dbus_built_sources) \
stamp-icons
# all autogenerated files need to be generated in the srcdir,
# so old versions get remade and are not confused with newer
@@ -1175,6 +1178,7 @@ deprecatedinclude_HEADERS= $(deprecated_h_sources)
gtkunixprintincludedir = $(includedir)/gtk-3.0/unix-print/gtk
gtkunixprintinclude_HEADERS = $(gtk_unix_print_public_h_sources)
nodist_libgtk_3_la_SOURCES = $(nodist_gtk_c_sources)
libgtk_3_la_SOURCES = $(gtk_c_sources)
libgtk_3_la_LDFLAGS = $(libtool_opts)
libgtk_3_la_LIBADD = $(libadd)
@@ -1265,13 +1269,24 @@ LDADDS = \
$(GTK_DEP_LIBS)
if HAVE_INTROSPECTION
# The Quartz clipboard and dnd files aren't annotated for
# introspection. Rather than copy the annotations over from the
# regular files, exclude the quartz ones:
introspection_files = \
$(filter-out %private.h gtktextdisplay.h gtktextlayout.h, $(gtkinclude_HEADERS) $(deprecatedinclude_HEADERS)) \
$(gtk_base_c_sources) \
$(filter-out gtkclipboard-quartz.c gtkdnd-quartz.c, \
$(gtk_base_c_sources)) \
gtkprintoperation-unix.c \
gtktypebuiltins.h \
gtktypebuiltins.c
# And include the regular ones:
if USE_QUARTZ
introspection_files += \
gtkclipboard.c \
gtkdnd.c
endif
if USE_X11
introspection_files += \
gtksocket.c \
@@ -1308,7 +1323,9 @@ endif
#
# Installed tools
#
bin_PROGRAMS = gtk-query-immodules-3.0
bin_PROGRAMS = \
gtk-query-immodules-3.0 \
gtk-launch
if BUILD_ICON_CACHE
bin_PROGRAMS += gtk-update-icon-cache
@@ -1355,11 +1372,8 @@ gtk_update_icon_cache_LDADD = $(GDK_PIXBUF_LIBS)
gtk_update_icon_cache_SOURCES = updateiconcache.c
endif
if HAVE_GIO_UNIX
bin_PROGRAMS += gtk-launch
gtk_launch_LDADD = $(LDADDS)
gtk_launch_SOURCES = gtk-launch.c
endif
.PHONY: files test test-debug
+1
View File
@@ -106,6 +106,7 @@ gtka11y_private_h_sources = \
gtkcellaccessibleprivate.h \
gtkcolorswatchaccessibleprivate.h \
gtkiconviewaccessibleprivate.h \
gtklabelaccessibleprivate.h \
gtklockbuttonaccessibleprivate.h \
gtktextviewaccessibleprivate.h \
gtktreeviewaccessibleprivate.h \
+20 -4
View File
@@ -572,9 +572,17 @@ gtk_entry_accessible_notify_gtk (GObject *obj,
gchar *text;
text = gtk_entry_get_icon_tooltip_text (gtk_entry,
GTK_ENTRY_ICON_PRIMARY);
atk_object_set_description (priv->icons[GTK_ENTRY_ICON_PRIMARY],
if (text)
{
atk_object_set_description (priv->icons[GTK_ENTRY_ICON_PRIMARY],
text);
g_free (text);
g_free (text);
}
else
{
atk_object_set_description (priv->icons[GTK_ENTRY_ICON_PRIMARY],
"");
}
}
}
else if (g_strcmp0 (pspec->name, "secondary-icon-tooltip-text") == 0)
@@ -584,9 +592,17 @@ gtk_entry_accessible_notify_gtk (GObject *obj,
gchar *text;
text = gtk_entry_get_icon_tooltip_text (gtk_entry,
GTK_ENTRY_ICON_SECONDARY);
atk_object_set_description (priv->icons[GTK_ENTRY_ICON_SECONDARY],
if (text)
{
atk_object_set_description (priv->icons[GTK_ENTRY_ICON_SECONDARY],
text);
g_free (text);
g_free (text);
}
else
{
atk_object_set_description (priv->icons[GTK_ENTRY_ICON_PRIMARY],
"");
}
}
}
else if (g_strcmp0 (pspec->name, "primary-icon-activatable") == 0)
+42 -49
View File
@@ -19,11 +19,11 @@
#include <gtk/gtk.h>
#include <gtk/gtkpango.h>
#include "gtkwidgetprivate.h"
#include "gtklabelaccessible.h"
struct _GtkLabelAccessiblePrivate
{
gchar *text;
gint cursor_position;
gint selection_bound;
};
@@ -46,16 +46,11 @@ gtk_label_accessible_initialize (AtkObject *obj,
gpointer data)
{
GtkWidget *widget;
GtkLabelAccessible *accessible;
ATK_OBJECT_CLASS (gtk_label_accessible_parent_class)->initialize (obj, data);
accessible = GTK_LABEL_ACCESSIBLE (obj);
widget = GTK_WIDGET (data);
accessible->priv->text = g_strdup (gtk_label_get_text (GTK_LABEL (widget)));
/*
* Check whether ancestor of GtkLabel is a GtkButton and if so
* set accessible parent for GtkLabelAccessible
@@ -97,6 +92,45 @@ check_for_selection_change (GtkLabelAccessible *accessible,
return ret_val;
}
void
_gtk_label_accessible_text_deleted (GtkLabel *label)
{
AtkObject *obj;
const char *text;
guint length;
obj = _gtk_widget_peek_accessible (GTK_WIDGET (label));
if (obj == NULL)
return;
text = gtk_label_get_text (label);
length = g_utf8_strlen (text, -1);
if (length > 0)
g_signal_emit_by_name (obj, "text-changed::delete", 0, length);
}
void
_gtk_label_accessible_text_inserted (GtkLabel *label)
{
AtkObject *obj;
const char *text;
guint length;
obj = _gtk_widget_peek_accessible (GTK_WIDGET (label));
if (obj == NULL)
return;
text = gtk_label_get_text (label);
length = g_utf8_strlen (text, -1);
if (length > 0)
g_signal_emit_by_name (obj, "text-changed::insert", 0, length);
if (obj->name == NULL)
/* The label has changed so notify a change in accessible-name */
g_object_notify (G_OBJECT (obj), "accessible-name");
g_signal_emit_by_name (obj, "visible-data-changed");
}
static void
gtk_label_accessible_notify_gtk (GObject *obj,
@@ -105,37 +139,10 @@ gtk_label_accessible_notify_gtk (GObject *obj,
GtkWidget *widget = GTK_WIDGET (obj);
AtkObject* atk_obj = gtk_widget_get_accessible (widget);
GtkLabelAccessible *accessible;
gint length;
accessible = GTK_LABEL_ACCESSIBLE (atk_obj);
if (g_strcmp0 (pspec->name, "label") == 0)
{
const gchar *text;
text = gtk_label_get_text (GTK_LABEL (widget));
if (g_strcmp0 (accessible->priv->text, text) == 0)
return;
/* Create a delete text and an insert text signal */
length = g_utf8_strlen (accessible->priv->text, -1);
if (length > 0)
g_signal_emit_by_name (atk_obj, "text-changed::delete", 0, length);
g_free (accessible->priv->text);
accessible->priv->text = g_strdup (text);
length = g_utf8_strlen (accessible->priv->text, -1);
if (length > 0)
g_signal_emit_by_name (atk_obj, "text-changed::insert", 0, length);
if (atk_obj->name == NULL)
/* The label has changed so notify a change in accessible-name */
g_object_notify (G_OBJECT (atk_obj), "accessible-name");
g_signal_emit_by_name (atk_obj, "visible-data-changed");
}
else if (g_strcmp0 (pspec->name, "cursor-position") == 0)
if (g_strcmp0 (pspec->name, "cursor-position") == 0)
{
g_signal_emit_by_name (atk_obj, "text-caret-moved",
_gtk_label_get_cursor_position (GTK_LABEL (widget)));
@@ -151,17 +158,6 @@ gtk_label_accessible_notify_gtk (GObject *obj,
GTK_WIDGET_ACCESSIBLE_CLASS (gtk_label_accessible_parent_class)->notify_gtk (obj, pspec);
}
static void
gtk_label_accessible_finalize (GObject *object)
{
GtkLabelAccessible *accessible = GTK_LABEL_ACCESSIBLE (object);
g_free (accessible->priv->text);
G_OBJECT_CLASS (gtk_label_accessible_parent_class)->finalize (object);
}
/* atkobject.h */
static AtkStateSet *
@@ -274,11 +270,8 @@ gtk_label_accessible_get_name (AtkObject *accessible)
static void
gtk_label_accessible_class_init (GtkLabelAccessibleClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
gobject_class->finalize = gtk_label_accessible_finalize;
GtkWidgetAccessibleClass *widget_class = GTK_WIDGET_ACCESSIBLE_CLASS (klass);
widget_class->notify_gtk = gtk_label_accessible_notify_gtk;
+30
View File
@@ -0,0 +1,30 @@
/* GTK+ - accessibility implementations
* Copyright (C) 2002, 2004 Anders Carlsson <andersca@gnu.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __GTK_LABEL_ACCESSIBLE_PRIVATE_H__
#define __GTK_LABEL_ACCESSIBLE_PRIVATE_H__
#include <gtk/a11y/gtklabelaccessible.h>
G_BEGIN_DECLS
void _gtk_label_accessible_text_deleted (GtkLabel *label);
void _gtk_label_accessible_text_inserted (GtkLabel *label);
G_END_DECLS
#endif /* __GTK_LABEL_ACCESSIBLE_PRIVATE_H__ */
+43 -38
View File
@@ -21,6 +21,10 @@
#include <gtk/gtk.h>
#include "gtkrangeaccessible.h"
struct _GtkRangeAccessiblePrivate
{
GtkAdjustment *adjustment;
};
static void atk_value_interface_init (AtkValueIface *iface);
@@ -35,47 +39,45 @@ gtk_range_accessible_value_changed (GtkAdjustment *adjustment,
}
static void
gtk_range_accessible_initialize (AtkObject *obj,
gpointer data)
gtk_range_accessible_widget_set (GtkAccessible *accessible)
{
GtkRangeAccessible *range = GTK_RANGE_ACCESSIBLE (obj);
GtkRangeAccessiblePrivate *priv = GTK_RANGE_ACCESSIBLE (accessible)->priv;
GtkWidget *range;
GtkAdjustment *adj;
GtkRange *gtk_range;
ATK_OBJECT_CLASS (gtk_range_accessible_parent_class)->initialize (obj, data);
gtk_range = GTK_RANGE (data);
/*
* If a GtkAdjustment already exists for the GtkRange,
* create the GailAdjustment
*/
adj = gtk_range_get_adjustment (gtk_range);
range = gtk_accessible_get_widget (accessible);
adj = gtk_range_get_adjustment (GTK_RANGE (range));
if (adj)
g_signal_connect (adj, "value-changed",
G_CALLBACK (gtk_range_accessible_value_changed),
range);
obj->role = ATK_ROLE_SLIDER;
{
priv->adjustment = adj;
g_object_ref (priv->adjustment);
g_signal_connect (priv->adjustment, "value-changed",
G_CALLBACK (gtk_range_accessible_value_changed),
accessible);
}
}
static void
gtk_range_accessible_finalize (GObject *object)
gtk_range_accessible_widget_unset (GtkAccessible *accessible)
{
GtkRangeAccessible *range = GTK_RANGE_ACCESSIBLE (object);
GtkWidget *widget;
GtkAdjustment *adj;
GtkRangeAccessiblePrivate *priv = GTK_RANGE_ACCESSIBLE (accessible)->priv;
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (object));
if (widget)
if (priv->adjustment)
{
adj = gtk_range_get_adjustment (GTK_RANGE (widget));
if (adj)
g_signal_handlers_disconnect_by_func (adj,
gtk_range_accessible_value_changed,
range);
g_signal_handlers_disconnect_by_func (priv->adjustment,
G_CALLBACK (gtk_range_accessible_value_changed),
accessible);
g_object_unref (priv->adjustment);
priv->adjustment = NULL;
}
}
G_OBJECT_CLASS (gtk_range_accessible_parent_class)->finalize (object);
static void
gtk_range_accessible_initialize (AtkObject *obj,
gpointer data)
{
ATK_OBJECT_CLASS (gtk_range_accessible_parent_class)->initialize (obj, data);
obj->role = ATK_ROLE_SLIDER;
}
static void
@@ -83,16 +85,13 @@ gtk_range_accessible_notify_gtk (GObject *obj,
GParamSpec *pspec)
{
GtkWidget *widget = GTK_WIDGET (obj);
GtkAdjustment *adj;
AtkObject *range;
if (strcmp (pspec->name, "adjustment") == 0)
{
range = gtk_widget_get_accessible (widget);
adj = gtk_range_get_adjustment (GTK_RANGE (widget));
g_signal_connect (adj, "value-changed",
G_CALLBACK (gtk_range_accessible_value_changed),
range);
gtk_range_accessible_widget_unset (GTK_ACCESSIBLE (range));
gtk_range_accessible_widget_set (GTK_ACCESSIBLE (range));
}
else
GTK_WIDGET_ACCESSIBLE_CLASS (gtk_range_accessible_parent_class)->notify_gtk (obj, pspec);
@@ -102,20 +101,26 @@ gtk_range_accessible_notify_gtk (GObject *obj,
static void
gtk_range_accessible_class_init (GtkRangeAccessibleClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
GtkAccessibleClass *accessible_class = (GtkAccessibleClass*)klass;
GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
widget_class->notify_gtk = gtk_range_accessible_notify_gtk;
class->initialize = gtk_range_accessible_initialize;
gobject_class->finalize = gtk_range_accessible_finalize;
accessible_class->widget_set = gtk_range_accessible_widget_set;
accessible_class->widget_unset = gtk_range_accessible_widget_unset;
widget_class->notify_gtk = gtk_range_accessible_notify_gtk;
g_type_class_add_private (klass, sizeof (GtkRangeAccessiblePrivate));
}
static void
gtk_range_accessible_init (GtkRangeAccessible *range)
{
range->priv = G_TYPE_INSTANCE_GET_PRIVATE (range,
GTK_TYPE_RANGE_ACCESSIBLE,
GtkRangeAccessiblePrivate);
}
static void
+51 -24
View File
@@ -21,6 +21,10 @@
#include <gtk/gtk.h>
#include "gtkspinbuttonaccessible.h"
struct _GtkSpinButtonAccessiblePrivate
{
GtkAdjustment *adjustment;
};
static void atk_value_interface_init (AtkValueIface *iface);
@@ -31,31 +35,48 @@ static void
gtk_spin_button_accessible_value_changed (GtkAdjustment *adjustment,
gpointer data)
{
GtkSpinButtonAccessible *spin_button;
g_object_notify (G_OBJECT (data), "accessible-value");
}
if (adjustment == NULL || data == NULL)
return;
static void
gtk_spin_button_accessible_widget_set (GtkAccessible *accessible)
{
GtkSpinButtonAccessiblePrivate *priv = GTK_SPIN_BUTTON_ACCESSIBLE (accessible)->priv;
GtkWidget *spin;
GtkAdjustment *adj;
spin_button = GTK_SPIN_BUTTON_ACCESSIBLE (data);
spin = gtk_accessible_get_widget (accessible);
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
if (adj)
{
priv->adjustment = adj;
g_object_ref (priv->adjustment);
g_signal_connect (priv->adjustment, "value-changed",
G_CALLBACK (gtk_spin_button_accessible_value_changed),
accessible);
}
}
g_object_notify (G_OBJECT (spin_button), "accessible-value");
static void
gtk_spin_button_accessible_widget_unset (GtkAccessible *accessible)
{
GtkSpinButtonAccessiblePrivate *priv = GTK_SPIN_BUTTON_ACCESSIBLE (accessible)->priv;
if (priv->adjustment)
{
g_signal_handlers_disconnect_by_func (priv->adjustment,
G_CALLBACK (gtk_spin_button_accessible_value_changed),
accessible);
g_object_unref (priv->adjustment);
priv->adjustment = NULL;
}
}
static void
gtk_spin_button_accessible_initialize (AtkObject *obj,
gpointer data)
{
GtkAdjustment *adjustment;
ATK_OBJECT_CLASS (gtk_spin_button_accessible_parent_class)->initialize (obj, data);
adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (data));
if (adjustment)
g_signal_connect_object (adjustment,
"value-changed",
G_CALLBACK (gtk_spin_button_accessible_value_changed),
obj, 0);
obj->role = ATK_ROLE_SPIN_BUTTON;
}
@@ -64,37 +85,43 @@ gtk_spin_button_accessible_notify_gtk (GObject *obj,
GParamSpec *pspec)
{
GtkWidget *widget = GTK_WIDGET (obj);
GtkSpinButtonAccessible *spin_button = GTK_SPIN_BUTTON_ACCESSIBLE (gtk_widget_get_accessible (widget));
AtkObject *spin;
if (strcmp (pspec->name, "adjustment") == 0)
{
GtkAdjustment* adjustment;
spin = gtk_widget_get_accessible (widget);
gtk_spin_button_accessible_widget_unset (GTK_ACCESSIBLE (spin));
gtk_spin_button_accessible_widget_set (GTK_ACCESSIBLE (spin));
adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
g_signal_connect_object (adjustment, "value-changed",
G_CALLBACK (gtk_spin_button_accessible_value_changed),
spin_button, 0);
}
else
GTK_WIDGET_ACCESSIBLE_CLASS (gtk_spin_button_accessible_parent_class)->notify_gtk (obj, pspec);
}
static void
gtk_spin_button_accessible_class_init (GtkSpinButtonAccessibleClass *klass)
{
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
GtkAccessibleClass *accessible_class = (GtkAccessibleClass*)klass;
GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
class->initialize = gtk_spin_button_accessible_initialize;
accessible_class->widget_set = gtk_spin_button_accessible_widget_set;
accessible_class->widget_unset = gtk_spin_button_accessible_widget_unset;
widget_class->notify_gtk = gtk_spin_button_accessible_notify_gtk;
class->initialize = gtk_spin_button_accessible_initialize;
g_type_class_add_private (klass, sizeof (GtkSpinButtonAccessiblePrivate));
}
static void
gtk_spin_button_accessible_init (GtkSpinButtonAccessible *button)
{
button->priv = G_TYPE_INSTANCE_GET_PRIVATE (button,
GTK_TYPE_SPIN_BUTTON_ACCESSIBLE,
GtkSpinButtonAccessiblePrivate);
}
static void
-12
View File
@@ -53,23 +53,11 @@ gtk_switch_accessible_ref_state_set (AtkObject *accessible)
return state_set;
}
static void
gtk_switch_accessible_initialize (AtkObject *accessible,
gpointer widget)
{
ATK_OBJECT_CLASS (gtk_switch_accessible_parent_class)->initialize (accessible, widget);
atk_object_set_role (accessible, ATK_ROLE_TOGGLE_BUTTON);
atk_object_set_name (accessible, C_("light switch widget", "Switch"));
atk_object_set_description (accessible, _("Switches between on and off states"));
}
static void
gtk_switch_accessible_class_init (GtkSwitchAccessibleClass *klass)
{
AtkObjectClass *atk_class = ATK_OBJECT_CLASS (klass);
atk_class->initialize = gtk_switch_accessible_initialize;
atk_class->ref_state_set = gtk_switch_accessible_ref_state_set;
}
+4 -1
View File
@@ -270,7 +270,7 @@ gtk_widget_accessible_ref_relation_set (AtkObject *obj)
label = find_label (widget);
if (label == NULL)
{
if (GTK_IS_BUTTON (widget))
if (GTK_IS_BUTTON (widget) && gtk_widget_get_mapped (widget))
/*
* Handle the case where GnomeIconEntry is the mnemonic widget.
* The GtkButton which is a grandchild of the GnomeIconEntry
@@ -784,6 +784,9 @@ gtk_widget_accessible_on_screen (GtkWidget *widget)
gtk_widget_get_allocation (widget, &allocation);
if (!gtk_widget_get_mapped (widget))
return FALSE;
viewport = gtk_widget_get_ancestor (widget, GTK_TYPE_VIEWPORT);
if (viewport)
{
+2 -1
View File
@@ -342,7 +342,8 @@ _gtk_gradient_resolve_full (GtkGradient *gradient,
provider,
_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
GTK_CSS_DEPENDS_ON_COLOR,
&stop_deps);
&stop_deps,
NULL);
if (val)
{
rgba = *_gtk_css_rgba_value_get_rgba (val);
+4 -4
View File
@@ -49,10 +49,10 @@
* from #GtkBox. No further changes are needed, since the default
* value of the #GtkOrientable:orientation property is
* %GTK_ORIENTATION_HORIZONTAL.
* If you want your code to be future-proof, the recommendation is to
* switch to #GtkGrid, since #GtkBox is going to be deprecated in favor
* of the more flexible grid widget eventually. For more information
* about migrating to #GtkGrid, see <xref linkend="gtk-migrating-GtkGrid"/>
* If you don't need first-child or last-child styling, and want your code
* to be future-proof, the recommendation is to switch to #GtkGrid instead
* of nested boxes. For more information about migrating to #GtkGrid,
* see <xref linkend="gtk-migrating-GtkGrid"/>
*/
+1
View File
@@ -307,6 +307,7 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color,
GTK_STYLE_PROVIDER_PRIVATE (props),
current,
0,
NULL,
NULL);
_gtk_css_value_unref (current);
if (v == NULL)
+4 -4
View File
@@ -54,10 +54,10 @@
* gtk_orientable_set_orientation (GTK_ORIENTABLE (object),
* GTK_ORIENTATION_VERTICAL);
* ]|
* If you want your code to be future-proof, the recommendation is to
* switch to #GtkGrid, since #GtkBox is going to be deprecated in favor
* of the more flexible grid widget eventually. For more information
* about migrating to #GtkGrid, see <xref linkend="gtk-migrating-GtkGrid"/>.
* If you don't need first-child or last-child styling and want your code
* to be future-proof, the recommendation is to switch to #GtkGrid instead
* of nested boxes. For more information about migrating to #GtkGrid,
* see <xref linkend="gtk-migrating-GtkGrid"/>.
*/
G_DEFINE_TYPE (GtkVBox, gtk_vbox, GTK_TYPE_BOX)
+383 -25
View File
@@ -129,7 +129,7 @@ GtkAssistant .sidebar .highlight {
border-width: 0;
-GtkWidget-focus-line-width: 1;
-GtkWidget-focus-padding: 3;
-GtkButton-interior-focuse: true;
-GtkButton-interior-focus: true;
padding: 3px;
}
@@ -432,19 +432,26 @@ GtkButton.check:active:prelight {
.scale {
background-color: transparent;
-GtkScale-value-spacing: 0;
-GtkScale-slider-length: 9;
-GtkScale-slider-length: 12;
-GtkRange-slider-width: 20;
-GtkRange-trough-border: 0;
}
.scale.trough {
margin: 8px 0;
border-style: none;
border-width: 0;
background-image: -gtk-win32-theme-part(trackbar, 1 1, margins (2 0 2 0));
background-image: -gtk-win32-theme-part(trackbar, 1 1);
}
.scale.trough.vertical {
background-image: -gtk-win32-theme-part(trackbar, 1 1, margins (0 2 0 2));
margin: 0 8px;
background-image: -gtk-win32-theme-part(trackbar, 1 1);
}
.scale.mark.separator {
/* defines the color of the actuall marks on the scale */
color: shade(@bg_color, 0.6);
}
.scale.slider {
@@ -493,89 +500,89 @@ GtkButton.check:active:prelight {
}
.scale.slider.scale-has-marks-below {
background-image: -gtk-win32-theme-part(trackbar, 4 1);
background-image: -gtk-win32-theme-part(trackbar, 4 1, margins(0 -2 0 0));
}
.scale.slider.scale-has-marks-below:prelight {
background-image: -gtk-win32-theme-part(trackbar, 4 2);
background-image: -gtk-win32-theme-part(trackbar, 4 2, margins(0 -2 0 0));
}
.scale.slider.scale-has-marks-below:active,
.scale.slider.scale-has-marks-below:prelight:active {
background-image: -gtk-win32-theme-part(trackbar, 4 3);
background-image: -gtk-win32-theme-part(trackbar, 4 3, margins(0 -2 0 0));
}
.scale.slider.scale-has-marks-below:focus {
background-image: -gtk-win32-theme-part(trackbar, 4 4);
background-image: -gtk-win32-theme-part(trackbar, 4 4, margins(0 -2 0 0));
}
.scale.slider.scale-has-marks-below:insensitive {
background-image: -gtk-win32-theme-part(trackbar, 4 5);
background-image: -gtk-win32-theme-part(trackbar, 4 5, margins(0 -2 0 0));
}
.scale.slider.scale-has-marks-below.vertical {
background-image: -gtk-win32-theme-part(trackbar, 8 1);
background-image: -gtk-win32-theme-part(trackbar, 8 1, margins(0 0 -2 0));
}
.scale.slider.scale-has-marks-below.vertical:prelight {
background-image: -gtk-win32-theme-part(trackbar, 8 2);
background-image: -gtk-win32-theme-part(trackbar, 8 2, margins(0 0 -2 0));
}
.scale.slider.scale-has-marks-below.vertical:active,
.scale.slider.scale-has-marks-below.vertical:prelight:active {
background-image: -gtk-win32-theme-part(trackbar, 8 3);
background-image: -gtk-win32-theme-part(trackbar, 8 3, margins(0 0 -2 0));
}
.scale.slider.scale-has-marks-below.vertical:focus {
background-image: -gtk-win32-theme-part(trackbar, 8 4);
background-image: -gtk-win32-theme-part(trackbar, 8 4, margins(0 0 -2 0));
}
.scale.slider.scale-has-marks-below.vertical:insensitive {
background-image: -gtk-win32-theme-part(trackbar, 8 5);
background-image: -gtk-win32-theme-part(trackbar, 8 5, margins(0 0 -2 0));
}
.scale.slider.scale-has-marks-above {
background-image: -gtk-win32-theme-part(trackbar, 5 1);
background-image: -gtk-win32-theme-part(trackbar, 5 1, margins(0 -2 0 0));
}
.scale.slider.scale-has-marks-above:prelight {
background-image: -gtk-win32-theme-part(trackbar, 5 2);
background-image: -gtk-win32-theme-part(trackbar, 5 2, margins(0 -2 0 0));
}
.scale.slider.scale-has-marks-above:active,
.scale.slider.scale-has-marks-above:prelight:active {
background-image: -gtk-win32-theme-part(trackbar, 5 3);
background-image: -gtk-win32-theme-part(trackbar, 5 3, margins(0 -2 0 0));
}
.scale.slider.scale-has-marks-above:focus {
background-image: -gtk-win32-theme-part(trackbar, 5 4);
background-image: -gtk-win32-theme-part(trackbar, 5 4, margins(0 -2 0 0));
}
.scale.slider.scale-has-marks-above:insensitive {
background-image: -gtk-win32-theme-part(trackbar, 5 5);
background-image: -gtk-win32-theme-part(trackbar, 5 5, margins(0 -2 0 0));
}
.scale.slider.scale-has-marks-above.vertical {
background-image: -gtk-win32-theme-part(trackbar, 7 1);
background-image: -gtk-win32-theme-part(trackbar, 7 1, margins(0 0 -2 0));
}
.scale.slider.scale-has-marks-above.vertical:prelight {
background-image: -gtk-win32-theme-part(trackbar, 7 2);
background-image: -gtk-win32-theme-part(trackbar, 7 2, margins(0 0 -2 0));
}
.scale.slider.scale-has-marks-above.vertical:active,
.scale.slider.scale-has-marks-above.vertical:prelight:active {
background-image: -gtk-win32-theme-part(trackbar, 7 3);
background-image: -gtk-win32-theme-part(trackbar, 7 3, margins(0 0 -2 0));
}
.scale.slider.scale-has-marks-above.vertical:focus {
background-image: -gtk-win32-theme-part(trackbar, 7 4);
background-image: -gtk-win32-theme-part(trackbar, 7 4, margins(0 0 -2 0));
}
.scale.slider.scale-has-marks-above.vertical:insensitive {
background-image: -gtk-win32-theme-part(trackbar, 7 5);
background-image: -gtk-win32-theme-part(trackbar, 7 5, margins(0 0 -2 0));
}
/* Progress bars */
@@ -791,7 +798,7 @@ GtkSwitch.trough:active {
/* Assistant */
GtkAssistant .sidebar .highlight {
background-color: blue;
background-color: gray;
font: bold;
}
@@ -834,3 +841,354 @@ GtkStatusbar > GtkFrame {
background-image: -gtk-win32-theme-part(status, 3 1);
}
*/
@keyframes spinner {
0% { background-image: none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)); }
0% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)); }
8% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
none; }
8% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)); }
16% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)); }
16% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)); }
25% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)); }
25% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)); }
33% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)); }
33% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)); }
41% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)); }
41% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)); }
50% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)); }
50% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)); }
58% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)); }
58% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)); }
66% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)); }
66% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)); }
75% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)); }
75% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)); }
83% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)); }
83% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)); }
91% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)); }
91% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)); }
100% { background-image: none,
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)); }
100% { background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)); }
}
.spinner {
background-color: transparent;
background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent));
background-position: 25.00% 6.70%, 6.70% 25.00%, 0.00% 50.00%, 6.70% 75.00%, 25.00% 93.30%, 50.00% 100.00%, 75.00% 93.30%, 93.30% 75.00%, 100.00% 50.00%, 93.30% 25.00%, 75.00% 6.70%, 50.00% 0.00%;
background-size: 20% 20%;
background-repeat: no-repeat;
transition: background-image 500ms ease-out;
}
.spinner:active {
background-image: -gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.916667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.75)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.666667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.583333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.5)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.416667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.333333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.25)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.166667)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(alpha(currentColor, 0.0833333)), to(transparent)),
-gtk-gradient(radial, center center, 0, center center, 0.5, to(currentColor), to(transparent));
animation: spinner 1s infinite linear;
}
+2 -2
View File
@@ -2160,14 +2160,14 @@ text_view_new (GtkAboutDialog *about,
r1 = strstr (q0, "http://");
if (r1)
{
r2 = strpbrk (r1, " \n\t");
r2 = strpbrk (r1, " \n\t>");
if (!r2)
r2 = strchr (r1, '\0');
}
else
r2 = NULL;
if (r1 && r2 && (!q1 || !q2 || (r1 < q1)))
if (r1 && r2 && (!q1 || !q2 || (r1 <= q1 + 1)))
{
q1 = r1;
q2 = r2;
+3
View File
@@ -348,6 +348,9 @@ gtk_app_chooser_button_populate (GtkAppChooserButton *self)
{
app = l->data;
if (!g_app_info_should_show (app))
continue;
if (default_app != NULL && g_app_info_equal (app, default_app))
continue;
+13 -3
View File
@@ -1422,7 +1422,9 @@ gtk_application_inhibit (GtkApplication *application,
g_return_val_if_fail (GTK_IS_APPLICATION (application), 0);
g_return_val_if_fail (!g_application_get_is_remote (G_APPLICATION (application)), 0);
g_return_val_if_fail (application->priv->sm_proxy != NULL, 0);
if (application->priv->sm_proxy == NULL)
return 0;
if (window != NULL)
{
@@ -1431,8 +1433,10 @@ gtk_application_inhibit (GtkApplication *application,
gdkwindow = gtk_widget_get_window (GTK_WIDGET (window));
if (gdkwindow == NULL)
g_warning ("Inhibit called with an unrealized window");
else
#ifdef GDK_WINDOWING_X11
else if (GDK_IS_X11_WINDOW (gdkwindow))
xid = GDK_WINDOW_XID (gdkwindow);
#endif
}
res = g_dbus_proxy_call_sync (application->priv->sm_proxy,
@@ -1475,6 +1479,10 @@ gtk_application_uninhibit (GtkApplication *application,
{
g_return_if_fail (GTK_IS_APPLICATION (application));
g_return_if_fail (!g_application_get_is_remote (G_APPLICATION (application)));
g_return_if_fail (cookie > 0);
/* Application could only obtain a cookie through a session
* manager proxy, so it's valid to assert its presence here. */
g_return_if_fail (application->priv->sm_proxy != NULL);
g_dbus_proxy_call (application->priv->sm_proxy,
@@ -1507,7 +1515,9 @@ gtk_application_is_inhibited (GtkApplication *application,
g_return_val_if_fail (GTK_IS_APPLICATION (application), FALSE);
g_return_val_if_fail (!g_application_get_is_remote (G_APPLICATION (application)), FALSE);
g_return_val_if_fail (application->priv->sm_proxy != NULL, FALSE);
if (application->priv->sm_proxy == NULL)
return FALSE;
res = g_dbus_proxy_call_sync (application->priv->sm_proxy,
"IsInhibited",
+9
View File
@@ -216,6 +216,7 @@ struct _GtkApplicationWindowPrivate
GtkWidget *menubar;
GtkAccelGroup *accels;
GSList *accel_closures;
guint accel_map_changed_id;
GMenu *app_menu_section;
GMenu *menubar_section;
@@ -752,7 +753,12 @@ gtk_application_window_real_realize (GtkWidget *widget)
gtk_application_window_update_shell_shows_app_menu (window, settings);
gtk_application_window_update_shell_shows_menubar (window, settings);
gtk_application_window_update_menubar (window);
/* Update the accelerators, and ensure we do again
* if the accel map changes */
gtk_application_window_update_accels (window);
window->priv->accel_map_changed_id = g_signal_connect_swapped (gtk_accel_map_get (), "changed",
G_CALLBACK (gtk_application_window_update_accels), window);
GTK_WIDGET_CLASS (gtk_application_window_parent_class)
->realize (widget);
@@ -790,6 +796,7 @@ gtk_application_window_real_realize (GtkWidget *widget)
static void
gtk_application_window_real_unrealize (GtkWidget *widget)
{
GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget);
GtkSettings *settings;
settings = gtk_widget_get_settings (widget);
@@ -797,6 +804,8 @@ gtk_application_window_real_unrealize (GtkWidget *widget)
g_signal_handlers_disconnect_by_func (settings, gtk_application_window_shell_shows_app_menu_changed, widget);
g_signal_handlers_disconnect_by_func (settings, gtk_application_window_shell_shows_menubar_changed, widget);
g_signal_handler_disconnect (gtk_accel_map_get (), window->priv->accel_map_changed_id);
GTK_WIDGET_CLASS (gtk_application_window_parent_class)
->unrealize (widget);
}
+7 -7
View File
@@ -107,6 +107,7 @@ struct _GtkAssistantPrivate
GtkWidget *last;
GtkWidget *sidebar;
GtkWidget *sidebar_frame;
GtkWidget *content;
GtkWidget *action_area;
@@ -707,7 +708,7 @@ update_title_state (GtkAssistant *assistant)
show_titles = TRUE;
}
gtk_widget_set_visible (priv->sidebar, show_titles);
gtk_widget_set_visible (priv->sidebar_frame, show_titles);
}
static void
@@ -956,7 +957,6 @@ gtk_assistant_init (GtkAssistant *assistant)
GtkStyleContext *context;
GtkWidget *main_box;
GtkWidget *content_box;
GtkWidget *sidebar_frame;
assistant->priv = G_TYPE_INSTANCE_GET_PRIVATE (assistant,
GTK_TYPE_ASSISTANT,
@@ -974,11 +974,11 @@ gtk_assistant_init (GtkAssistant *assistant)
/* use a frame for the sidebar, and manually render a background
* in it. GtkFrame also gives us padding support for free.
*/
sidebar_frame = gtk_frame_new (NULL);
context = gtk_widget_get_style_context (sidebar_frame);
priv->sidebar_frame = gtk_frame_new (NULL);
context = gtk_widget_get_style_context (priv->sidebar_frame);
gtk_style_context_add_class (context, GTK_STYLE_CLASS_SIDEBAR);
g_signal_connect (sidebar_frame, "draw",
g_signal_connect (priv->sidebar_frame, "draw",
G_CALLBACK (assistant_sidebar_draw_cb), assistant);
content_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
@@ -991,8 +991,8 @@ gtk_assistant_init (GtkAssistant *assistant)
g_signal_connect (priv->content, "remove",
G_CALLBACK (assistant_remove_page_cb), assistant);
gtk_container_add (GTK_CONTAINER (sidebar_frame), priv->sidebar);
gtk_box_pack_start (GTK_BOX (main_box), sidebar_frame, FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER (priv->sidebar_frame), priv->sidebar);
gtk_box_pack_start (GTK_BOX (main_box), priv->sidebar_frame, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (main_box), content_box, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (content_box), priv->content, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (content_box), priv->action_area, FALSE, TRUE, 0);
+58 -20
View File
@@ -189,6 +189,44 @@ gtk_bin_get_effective_border_width (GtkBin *bin)
return gtk_container_get_border_width (GTK_CONTAINER (bin));
}
/* GtkBin widgets define the padding and borders independantly so
* we cannot provide a generic get_size() for the same reason
* we never implemented size_request() here.
*
* But for cases where the GtkBin class's padding is constant and
* does not vary based on allocation (most cases), we can at least
* deduce a common code path for the get_width_for_height()/get_height_for_width()
* cases by using the delta of the base size requsts.
*/
static void
get_child_padding_delta (GtkBin *bin,
gint *delta_h,
gint *delta_v)
{
GtkBinPrivate *priv = bin->priv;
gint hmin, vmin, hnat, vnat, child_hmin, child_vmin;
/* we can't use gtk_widget_get_preferred_width() wrapper
* because we want our "original" request, not any external
* adjustments from set_size_request() or whatever. we have
* to ask for natural also because NULL isn't allowed for the
* direct vfuncs
*/
GTK_WIDGET_GET_CLASS (bin)->get_preferred_width (GTK_WIDGET (bin), &hmin, &hnat);
GTK_WIDGET_GET_CLASS (bin)->adjust_size_request (GTK_WIDGET (bin),
GTK_ORIENTATION_HORIZONTAL, &hmin, &hnat);
GTK_WIDGET_GET_CLASS (bin)->get_preferred_height (GTK_WIDGET (bin), &vmin, &vnat);
GTK_WIDGET_GET_CLASS (bin)->adjust_size_request (GTK_WIDGET (bin),
GTK_ORIENTATION_VERTICAL, &vmin, &vnat);
gtk_widget_get_preferred_width (priv->child, &child_hmin, NULL);
gtk_widget_get_preferred_height (priv->child, &child_vmin, NULL);
*delta_h = hmin - child_hmin;
*delta_v = vmin - child_vmin;
}
static void
gtk_bin_get_preferred_width (GtkWidget *widget,
gint *minimum_width,
@@ -249,25 +287,25 @@ gtk_bin_get_preferred_width_for_height (GtkWidget *widget,
{
GtkBin *bin = GTK_BIN (widget);
GtkBinPrivate *priv = bin->priv;
gint border_width;
gint hdelta, vdelta, child_min, child_nat;
*minimum_width = 0;
*natural_width = 0;
border_width = gtk_bin_get_effective_border_width (bin);
if (priv->child && gtk_widget_get_visible (priv->child))
{
gint child_min, child_nat;
gtk_widget_get_preferred_width_for_height (priv->child, height - 2 * border_width,
get_child_padding_delta (bin, &hdelta, &vdelta);
gtk_widget_get_preferred_width_for_height (priv->child,
height - vdelta,
&child_min, &child_nat);
*minimum_width = child_min;
*natural_width = child_nat;
if (minimum_width)
*minimum_width = child_min + hdelta;
if (natural_width)
*natural_width = child_nat + hdelta;
}
*minimum_width += 2 * border_width;
*natural_width += 2 * border_width;
}
static void
@@ -278,25 +316,25 @@ gtk_bin_get_preferred_height_for_width (GtkWidget *widget,
{
GtkBin *bin = GTK_BIN (widget);
GtkBinPrivate *priv = bin->priv;
gint border_width;
gint hdelta, vdelta, child_min, child_nat;
*minimum_height = 0;
*natural_height = 0;
border_width = gtk_bin_get_effective_border_width (bin);
if (priv->child && gtk_widget_get_visible (priv->child))
{
gint child_min, child_nat;
gtk_widget_get_preferred_height_for_width (priv->child, width - 2 * border_width,
get_child_padding_delta (bin, &hdelta, &vdelta);
gtk_widget_get_preferred_height_for_width (priv->child,
width - hdelta,
&child_min, &child_nat);
*minimum_height = child_min;
*natural_height = child_nat;
if (minimum_height)
*minimum_height = child_min + vdelta;
if (natural_height)
*natural_height = child_nat + vdelta;
}
*minimum_height += 2 * border_width;
*natural_height += 2 * border_width;
}
static void
-6
View File
@@ -1355,12 +1355,6 @@ gtk_builder_get_translation_domain (GtkBuilder *builder)
*
* Add @object to the @builder object pool so it can be referenced just like any
* other object built by builder.
*
* To make this function even more useful a new special entry point element
* &lt;external-object&gt; is defined. It is similar to &lt;object&gt; but has
* to reference an external object exposed with this function.
* This way you can change properties and even add children to an
* external object using builder, not just reference it.
*
* Since: 3.8
**/
+10 -4
View File
@@ -1784,10 +1784,13 @@ gtk_button_button_press (GtkWidget *widget,
gtk_widget_grab_focus (widget);
if (event->button == GDK_BUTTON_PRIMARY)
g_signal_emit (button, button_signals[PRESSED], 0);
{
g_signal_emit (button, button_signals[PRESSED], 0);
return GDK_EVENT_STOP;
}
}
return TRUE;
return GDK_EVENT_PROPAGATE;
}
static gboolean
@@ -1800,9 +1803,10 @@ gtk_button_button_release (GtkWidget *widget,
{
button = GTK_BUTTON (widget);
g_signal_emit (button, button_signals[RELEASED], 0);
return GDK_EVENT_STOP;
}
return TRUE;
return GDK_EVENT_PROPAGATE;
}
static gboolean
@@ -1818,13 +1822,15 @@ gtk_button_touch (GtkWidget *widget,
gtk_widget_grab_focus (widget);
g_signal_emit (button, button_signals[PRESSED], 0);
return GDK_EVENT_STOP;
}
else if (event->type == GDK_TOUCH_END)
{
g_signal_emit (button, button_signals[RELEASED], 0);
return GDK_EVENT_STOP;
}
return TRUE;
return GDK_EVENT_PROPAGATE;
}
static gboolean
+1 -1
View File
@@ -3440,7 +3440,7 @@ gtk_cell_area_activate_cell (GtkCellArea *area,
/* If the signal was successfully handled start the editing */
if (gtk_widget_get_parent (GTK_WIDGET (editable_widget)))
{
gtk_cell_editable_start_editing (editable_widget, NULL);
gtk_cell_editable_start_editing (editable_widget, event);
gtk_widget_grab_focus (GTK_WIDGET (editable_widget));
}
else
+21 -28
View File
@@ -53,7 +53,6 @@
struct _GtkCheckMenuItemPrivate
{
guint active : 1;
guint always_show_toggle : 1;
guint draw_as_radio : 1;
guint inconsistent : 1;
};
@@ -467,7 +466,6 @@ gtk_check_menu_item_init (GtkCheckMenuItem *check_menu_item)
priv = check_menu_item->priv;
priv->active = FALSE;
priv->always_show_toggle = TRUE;
}
static gint
@@ -556,34 +554,29 @@ gtk_real_check_menu_item_draw_indicator (GtkCheckMenuItem *check_menu_item,
y = (allocation.height - indicator_size) / 2;
if (priv->active ||
priv->always_show_toggle ||
(state & GTK_STATE_FLAG_PRELIGHT))
gtk_style_context_save (context);
if (priv->inconsistent)
state |= GTK_STATE_FLAG_INCONSISTENT;
else if (priv->active)
state |= GTK_STATE_FLAG_ACTIVE;
gtk_style_context_set_state (context, state);
if (priv->draw_as_radio)
{
gtk_style_context_save (context);
if (priv->inconsistent)
state |= GTK_STATE_FLAG_INCONSISTENT;
else if (priv->active)
state |= GTK_STATE_FLAG_ACTIVE;
gtk_style_context_set_state (context, state);
if (priv->draw_as_radio)
{
gtk_style_context_add_class (context, GTK_STYLE_CLASS_RADIO);
gtk_render_option (context, cr, x, y,
indicator_size, indicator_size);
}
else
{
gtk_style_context_add_class (context, GTK_STYLE_CLASS_CHECK);
gtk_render_check (context, cr, x, y,
indicator_size, indicator_size);
}
gtk_style_context_restore (context);
gtk_style_context_add_class (context, GTK_STYLE_CLASS_RADIO);
gtk_render_option (context, cr, x, y,
indicator_size, indicator_size);
}
else
{
gtk_style_context_add_class (context, GTK_STYLE_CLASS_CHECK);
gtk_render_check (context, cr, x, y,
indicator_size, indicator_size);
}
gtk_style_context_restore (context);
}
}
+1 -1
View File
@@ -108,7 +108,7 @@ static GtkClipboard *clipboard_peek (GdkDisplay *display,
memset (&selection_data, 0, sizeof (GtkSelectionData));
selection_data.selection = clipboard->selection;
selection_data.target = _gtk_quartz_pasteboard_type_to_atom (type);
selection_data.target = gdk_quartz_pasteboard_type_to_atom_libgtk_only (type);
selection_data.display = gdk_display_get_default ();
selection_data.length = -1;
+1 -3
View File
@@ -96,7 +96,6 @@ selected_cb (GtkButton *button,
GtkDialog *dialog)
{
save_color (GTK_COLOR_CHOOSER_DIALOG (dialog));
gtk_dialog_response (dialog, GTK_RESPONSE_OK);
}
static void
@@ -152,8 +151,7 @@ gtk_color_chooser_dialog_init (GtkColorChooserDialog *cc)
G_CALLBACK (selected_cb), dialog);
gtk_widget_set_can_default (priv->select_button, TRUE);
gtk_widget_show (priv->select_button);
gtk_box_pack_end (GTK_BOX (gtk_dialog_get_action_area (dialog)),
priv->select_button, FALSE, TRUE, 0);
gtk_dialog_add_action_widget (dialog, priv->select_button, GTK_RESPONSE_OK);
gtk_widget_grab_default (priv->select_button);
gtk_dialog_set_alternative_button_order (dialog,
+1
View File
@@ -3474,6 +3474,7 @@ gtk_combo_box_list_setup (GtkComboBox *combo_box)
gtk_cell_view_set_background_rgba (GTK_CELL_VIEW (priv->cell_view), &color);
priv->box = gtk_event_box_new ();
gtk_widget_add_events (priv->box, GDK_SCROLL_MASK);
gtk_event_box_set_visible_window (GTK_EVENT_BOX (priv->box),
FALSE);
+5 -8
View File
@@ -58,7 +58,8 @@
* The GtkComboBoxText implementation of the GtkBuildable interface
* supports adding items directly using the &lt;items&gt; element
* and specifying &lt;item&gt; elements for each item. Each &lt;item&gt;
* element supports the regular translation attributes "translatable",
* element can specify the "id" corresponding to the appended text and
* also supports the regular translation attributes "translatable",
* "context" and "comments".
*
* <example>
@@ -66,9 +67,9 @@
* <programlisting><![CDATA[
* <object class="GtkComboBoxText">
* <items>
* <item translatable="yes">Factory</item>
* <item translatable="yes">Home</item>
* <item translatable="yes">Subway</item>
* <item translatable="yes" id="factory">Factory</item>
* <item translatable="yes" id="home">Home</item>
* <item translatable="yes" id="subway">Subway</item>
* </items>
* </object>
* ]]></programlisting>
@@ -236,10 +237,6 @@ item_end_element (GMarkupParseContext *context,
{
gchar *translated;
/* FIXME: This will not use the domain set in the .ui file,
* since the parser is not telling the builder about the domain.
* However, it will work for gtk_builder_set_translation_domain() calls.
*/
translated = _gtk_builder_parser_translate (data->domain,
data->context,
data->string->str);
+17 -7
View File
@@ -140,7 +140,8 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
GtkStyleProviderPrivate *provider,
GtkCssValue *current,
GtkCssDependencies current_deps,
GtkCssDependencies *dependencies)
GtkCssDependencies *dependencies,
GSList *cycle_list)
{
GtkCssDependencies unused;
GtkCssValue *value;
@@ -160,12 +161,20 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
case COLOR_TYPE_NAME:
{
GtkCssValue *named;
GSList cycle = { color, cycle_list };
/* If color exists in cycle_list, we're currently resolving it.
* So we've detected a cycle. */
if (g_slist_find (cycle_list, color))
return NULL;
named = _gtk_style_provider_private_get_color (provider, color->sym_col.name);
if (named == NULL)
return NULL;
value = _gtk_css_color_value_resolve (named, provider, current, current_deps, dependencies);
value = _gtk_css_color_value_resolve (named, provider, current, current_deps, dependencies, &cycle);
if (value == NULL)
return NULL;
}
break;
@@ -175,7 +184,7 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
GtkHSLA hsla;
GdkRGBA shade;
val = _gtk_css_color_value_resolve (color->sym_col.shade.color, provider, current, current_deps, dependencies);
val = _gtk_css_color_value_resolve (color->sym_col.shade.color, provider, current, current_deps, dependencies, cycle_list);
if (val == NULL)
return NULL;
@@ -197,7 +206,7 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
GtkCssValue *val;
GdkRGBA alpha;
val = _gtk_css_color_value_resolve (color->sym_col.alpha.color, provider, current, current_deps, dependencies);
val = _gtk_css_color_value_resolve (color->sym_col.alpha.color, provider, current, current_deps, dependencies, cycle_list);
if (val == NULL)
return NULL;
@@ -217,13 +226,13 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
GdkRGBA color1, color2, res;
GtkCssDependencies dep1, dep2;
val = _gtk_css_color_value_resolve (color->sym_col.mix.color1, provider, current, current_deps, &dep1);
val = _gtk_css_color_value_resolve (color->sym_col.mix.color1, provider, current, current_deps, &dep1, cycle_list);
if (val == NULL)
return NULL;
color1 = *_gtk_css_rgba_value_get_rgba (val);
_gtk_css_value_unref (val);
val = _gtk_css_color_value_resolve (color->sym_col.mix.color2, provider, current, current_deps, &dep2);
val = _gtk_css_color_value_resolve (color->sym_col.mix.color2, provider, current, current_deps, &dep2, cycle_list);
if (val == NULL)
return NULL;
color2 = *_gtk_css_rgba_value_get_rgba (val);
@@ -322,7 +331,8 @@ gtk_css_value_color_compute (GtkCssValue *value,
provider,
current,
current_deps,
dependencies);
dependencies,
NULL);
if (resolved == NULL)
return gtk_css_value_color_get_fallback (property_id, provider, values, parent_values);
+2 -1
View File
@@ -47,7 +47,8 @@ GtkCssValue * _gtk_css_color_value_resolve (GtkCssValue
GtkStyleProviderPrivate *provider,
GtkCssValue *current,
GtkCssDependencies current_deps,
GtkCssDependencies *dependencies);
GtkCssDependencies *dependencies,
GSList *cycle_list);
G_END_DECLS
+1
View File
@@ -471,6 +471,7 @@ gtk_css_image_linear_transition (GtkCssImage *start_image,
start = GTK_CSS_IMAGE_LINEAR (start_image);
if (end_image == NULL)
return GTK_CSS_IMAGE_CLASS (_gtk_css_image_linear_parent_class)->transition (start_image, end_image, property_id, progress);
if (!GTK_IS_CSS_IMAGE_LINEAR (end_image))
return GTK_CSS_IMAGE_CLASS (_gtk_css_image_linear_parent_class)->transition (start_image, end_image, property_id, progress);
+8 -4
View File
@@ -533,11 +533,15 @@
* the GTK+ theming engine.
* </para>
* <para>
* To set a shadow on an icon, use the icon-shadow property instead,
* with the same syntax.
* </para>
* <para>
* To set multiple shadows on an element, you can specify a comma-separated list
* of shadow elements in the text-shadow property. Shadows are always rendered
* front-back, i.e. the first shadow specified is on top of the others. Shadows
* can thus overlay each other, but they can never overlay the text itself,
* which is always rendered on top of the shadow layer.
* of shadow elements in the text-shadow or icon-shadow property. Shadows are
* always rendered front-back, i.e. the first shadow specified is on top of the
* others. Shadows can thus overlay each other, but they can never overlay the
* text or icon itself, which is always rendered on top of the shadow layer.
* </para>
* </refsect2>
* <refsect2>
+4 -2
View File
@@ -234,7 +234,8 @@ rgba_value_compute (GtkStyleProviderPrivate *provider,
provider,
_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
GTK_CSS_DEPENDS_ON_COLOR,
dependencies);
dependencies,
NULL);
if (val != NULL)
{
rgba = *_gtk_css_rgba_value_get_rgba (val);
@@ -323,7 +324,8 @@ color_value_compute (GtkStyleProviderPrivate *provider,
provider,
_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
GTK_CSS_DEPENDS_ON_COLOR,
dependencies);
dependencies,
NULL);
if (val != NULL)
{
const GdkRGBA *rgba = _gtk_css_rgba_value_get_rgba (val);
+1 -1
View File
@@ -476,7 +476,7 @@ bindings_value_parse_one (GtkCssParser *parser)
return NULL;
}
if (g_ascii_strcasecmp (name, "none"))
if (g_ascii_strcasecmp (name, "none") == 0)
{
name = NULL;
}
+10 -2
View File
@@ -1254,7 +1254,11 @@ gtk_dialog_set_alternative_button_order_valist (GtkDialog *dialog,
{
/* reorder child with response_id to position */
child = dialog_find_button (dialog, response_id);
gtk_box_reorder_child (GTK_BOX (priv->action_area), child, position);
if (child != NULL)
gtk_box_reorder_child (GTK_BOX (priv->action_area), child, position);
else
g_warning ("%s : no child button with response id %d.", G_STRFUNC,
response_id);
response_id = va_arg (args, gint);
position++;
@@ -1365,7 +1369,11 @@ gtk_dialog_set_alternative_button_order_from_array (GtkDialog *dialog,
{
/* reorder child with response_id to position */
child = dialog_find_button (dialog, new_order[position]);
gtk_box_reorder_child (GTK_BOX (priv->action_area), child, position);
if (child != NULL)
gtk_box_reorder_child (GTK_BOX (priv->action_area), child, position);
else
g_warning ("%s : no child button with response id %d.", G_STRFUNC,
new_order[position]);
}
}
+1 -1
View File
@@ -144,7 +144,7 @@ struct _GtkDragFindData
selection_data.selection = GDK_NONE;
selection_data.data = NULL;
selection_data.length = -1;
selection_data.target = _gtk_quartz_pasteboard_type_to_atom (type);
selection_data.target = gdk_quartz_pasteboard_type_to_atom_libgtk_only (type);
selection_data.display = gdk_display_get_default ();
if (gtk_target_list_find (info->target_list,
+1
View File
@@ -3449,6 +3449,7 @@ gtk_drag_set_icon_surface (GdkDragContext *context,
}
gdk_window_set_background_pattern (gtk_widget_get_window (window), pattern);
cairo_pattern_destroy (pattern);
gtk_drag_set_icon_window (context, window, extents.x, extents.y, TRUE);
}
+8 -3
View File
@@ -1425,9 +1425,10 @@ gtk_entry_class_init (GtkEntryClass *class)
PANGO_TYPE_ATTR_LIST,
GTK_PARAM_READWRITE));
/** GtkEntry:populate-all:
/**
* GtkEntry:populate-all:
*
* If ::populate-all is %TRUE, the #GtkEntry::populate-popup
* If :populate-all is %TRUE, the #GtkEntry::populate-popup
* signal is also emitted for touch popups.
*
* Since: 3.8
@@ -1507,7 +1508,7 @@ gtk_entry_class_init (GtkEntryClass *class)
* to this signal and append your items to the @widget, which
* will be a #GtkMenu in this case.
*
* If #GtkEntry::populate-all is %TRUE, this signal will
* If #GtkEntry:populate-all is %TRUE, this signal will
* also be emitted to populate touch popups. In this case,
* @widget will be a different container, e.g. a #GtkToolbar.
* The signal handler should not make assumptions about the
@@ -5933,6 +5934,7 @@ gtk_entry_create_layout (GtkEntry *entry,
attr->start_index = 0;
attr->end_index = G_MAXINT;
pango_attr_list_insert (tmp_attrs, attr);
pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END);
}
if (preedit_length)
@@ -6073,6 +6075,9 @@ draw_text_with_color (GtkEntry *entry,
get_layout_position (entry, &x, &y);
if (show_placeholder_text (entry))
pango_layout_set_width (layout, PANGO_SCALE * gdk_window_get_width (entry->priv->text_area));
cairo_move_to (cr, x, y);
gdk_cairo_set_source_rgba (cr, default_color);
pango_cairo_show_layout (cr, layout);
+4
View File
@@ -2686,6 +2686,8 @@ _gtk_entry_completion_disconnect (GtkEntryCompletion *completion)
unset_accessible_relation (completion->priv->popup_window,
completion->priv->entry);
gtk_window_set_attached_to (GTK_WINDOW (completion->priv->popup_window),
NULL);
completion->priv->entry = NULL;
}
@@ -2698,6 +2700,8 @@ _gtk_entry_completion_connect (GtkEntryCompletion *completion,
set_accessible_relation (completion->priv->popup_window,
completion->priv->entry);
gtk_window_set_attached_to (GTK_WINDOW (completion->priv->popup_window),
completion->priv->entry);
connect_completion_signals (completion);
}
+2 -1
View File
@@ -1043,7 +1043,8 @@ gtk_expander_button_release (GtkWidget *widget,
if (event->button == GDK_BUTTON_PRIMARY && expander->priv->button_down)
{
gtk_widget_activate (widget);
if (expander->priv->prelight)
gtk_widget_activate (widget);
expander->priv->button_down = FALSE;
return TRUE;
}
+13 -3
View File
@@ -2764,12 +2764,15 @@ static void
combo_box_changed_cb (GtkComboBox *combo_box,
gpointer user_data)
{
GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data);
GtkFileChooserButtonPrivate *priv = button->priv;
GtkTreeIter iter;
gboolean file_was_set;
file_was_set = FALSE;
if (gtk_combo_box_get_active_iter (combo_box, &iter))
{
GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data);
GtkFileChooserButtonPrivate *priv = button->priv;
gchar type;
gpointer data;
@@ -2788,7 +2791,10 @@ combo_box_changed_cb (GtkComboBox *combo_box,
case ROW_TYPE_BOOKMARK:
case ROW_TYPE_CURRENT_FOLDER:
if (data)
gtk_file_chooser_button_select_file (GTK_FILE_CHOOSER (button), data, NULL);
{
gtk_file_chooser_button_select_file (GTK_FILE_CHOOSER (button), data, NULL);
file_was_set = TRUE;
}
break;
case ROW_TYPE_VOLUME:
{
@@ -2798,6 +2804,7 @@ combo_box_changed_cb (GtkComboBox *combo_box,
if (base_file)
{
gtk_file_chooser_button_select_file (GTK_FILE_CHOOSER (button), base_file, NULL);
file_was_set = TRUE;
g_object_unref (base_file);
}
}
@@ -2809,6 +2816,9 @@ combo_box_changed_cb (GtkComboBox *combo_box,
break;
}
}
if (file_was_set)
g_signal_emit (button, file_chooser_button_signals[FILE_SET], 0);
}
/* Calback for the "notify::popup-shown" signal on the combo box.
+8 -4
View File
@@ -4112,11 +4112,11 @@ file_list_drag_motion_cb (GtkWidget *widget,
return TRUE;
}
/* Sensitizes the "Copy files location" context menu item if there is actually
/* Sensitizes the "Copy files location" and other context menu items if there is actually
* a selection active.
*/
static void
check_copy_file_location_sensitivity (GtkFileChooserDefault *impl)
check_file_list_menu_sensitivity (GtkFileChooserDefault *impl)
{
GtkTreeSelection *selection;
gboolean active;
@@ -4129,6 +4129,10 @@ check_copy_file_location_sensitivity (GtkFileChooserDefault *impl)
if (impl->browse_files_popup_menu_copy_file_location_item)
gtk_widget_set_sensitive (impl->browse_files_popup_menu_copy_file_location_item, active);
if (impl->browse_files_popup_menu_add_shortcut_item)
gtk_widget_set_sensitive (impl->browse_files_popup_menu_add_shortcut_item, active);
if (impl->browse_files_popup_menu_visit_file_item)
gtk_widget_set_sensitive (impl->browse_files_popup_menu_visit_file_item, active);
}
static GtkWidget *
@@ -4198,7 +4202,7 @@ file_list_build_popup_menu (GtkFileChooserDefault *impl)
G_CALLBACK (show_size_column_toggled_cb));
bookmarks_check_add_sensitivity (impl);
check_copy_file_location_sensitivity (impl);
check_file_list_menu_sensitivity (impl);
}
/* Updates the popup menu for the file list, creating it if necessary */
@@ -10066,7 +10070,7 @@ list_selection_changed (GtkTreeSelection *selection,
check_preview_change (impl);
bookmarks_check_add_sensitivity (impl);
check_copy_file_location_sensitivity (impl);
check_file_list_menu_sensitivity (impl);
g_signal_emit_by_name (impl, "selection-changed", 0);
}
+6 -2
View File
@@ -548,8 +548,12 @@ finished_loading_cb (GtkFileSystemModel *model,
completion = gtk_entry_get_completion (GTK_ENTRY (chooser_entry));
update_inline_completion (chooser_entry);
gtk_entry_completion_complete (completion);
gtk_entry_completion_insert_prefix (completion);
if (gtk_widget_has_focus (GTK_WIDGET (chooser_entry)))
{
gtk_entry_completion_complete (completion);
gtk_entry_completion_insert_prefix (completion);
}
}
static void

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