docs: Update gtk_window_get_size()

The main corpus of the documentation for gtk_window_get_size() is still
full of X11-isms, so we should port it to something that is more
backend-agnostic. Additionally, having some examples would be nice for
application authors looking at a way to appropriately use this function.
This commit is contained in:
Emmanuele Bassi 2016-09-17 12:47:39 +01:00
parent b40469638b
commit 08e443e0db

View File

@ -5400,63 +5400,82 @@ gtk_window_resize_to_geometry (GtkWindow *window,
/**
* gtk_window_get_size:
* @window: a #GtkWindow
* @width: (out) (allow-none): return location for width, or %NULL
* @height: (out) (allow-none): return location for height, or %NULL
* @width: (out) (nullable): return location for width, or %NULL
* @height: (out) (nullable): return location for height, or %NULL
*
* Obtains the current size of @window. If @window is not onscreen,
* it returns the size GTK+ will suggest to the
* [window manager][gtk-X11-arch]
* for the initial window
* size (but this is not reliably the same as the size the window
* manager will actually select). The size obtained by
* gtk_window_get_size() is the last size received in a
* #GdkEventConfigure, that is, GTK+ uses its locally-stored size,
* rather than querying the X server for the size. As a result, if you
* call gtk_window_resize() then immediately call
* gtk_window_get_size(), the size wont have taken effect yet. After
* the window manager processes the resize request, GTK+ receives
* notification that the size has changed via a configure event, and
* the size of the window gets updated.
* Obtains the current size of @window.
*
* Note 1: Nearly any use of this function creates a race condition,
* because the size of the window may change between the time that you
* get the size and the time that you perform some action assuming
* that size is the current size. To avoid race conditions, connect to
* configure-event on the window and adjust your size-dependent
* state to match the size delivered in the #GdkEventConfigure.
* If @window is not visible on screen, this function return the size GTK+
* will suggest to the [window manager][gtk-X11-arch] for the initial window
* size (but this is not reliably the same as the size the window manager
* will actually select). See: gtk_window_set_default_size().
*
* Note 2: The returned size does not include the
* size of the window manager decorations (aka the window frame or
* border). Those are not drawn by GTK+ and GTK+ has no reliable
* method of determining their size.
* Depending on the windowing system and the window manager constraints,
* the size returned by this function may not match the size set using
* gtk_window_resize(); additionally, since gtk_window_resize() may be
* implemented as an asynchronous operation, GTK+ cannot guarantee in any
* way that this code:
*
* Note 3: If you are getting a window size in order to position
* the window onscreen, there may be a better way. The preferred
* way is to simply set the windows semantic type with
* gtk_window_set_type_hint(), which allows the window manager to
* e.g. center dialogs. Also, if you set the transient parent of
* dialogs with gtk_window_set_transient_for() window managers
* will often center the dialog over its parent window. It's
* much preferred to let the window manager handle these
* things rather than doing it yourself, because all apps will
* behave consistently and according to user prefs if the window
* manager handles it. Also, the window manager can take the size
* of the window decorations/border into account, while your
* application cannot.
* |[<!-- language="C" -->
* // width and height are set elsewhere
* gtk_window_resize (window, width, height);
*
* Note 4: When using client side decorations, GTK+ will do its best to
* adjust the returned values to match the logical size of the window
* excluding the widgets added for client side decorations, but there
* is no garantee that the result will be totally accurate because
* these widgets depend on the theme and may not be realized or
* visible at the time gtk_window_get_size() is invoked.
* int new_width, new_height;
* gtk_window_get_size (window, &new_width, &new_height);
* ]|
*
* In any case, if you insist on application-specified window
* positioning, theres still a better way than
* doing it yourself - gtk_window_set_position() will frequently
* handle the details for you.
*
**/
* will result in `new_width` and `new_height` matching `width` and
* `height`, respectively.
*
* This function will return the logical size of the #GtkWindow,
* excluding the widgets used in client side decorations; there is,
* however, no guarantee that the result will be completely accurate
* because client side decoration may include widgets that depend on
* the user preferences and that may not be visibile at the time you
* call this function.
*
* The dimensions returned by this function are suitable for being
* stored across sessions; use gtk_window_set_default_size() to
* restore them when before showing the window.
*
* To avoid potential race conditions, you should only call this
* function in response to a size change notification, for instance
* inside a handler for the #GtkWidget::size-allocate signal, or
* inside a handler for the #GtkWidget::configure-event signal:
*
* |[<!-- language="C" -->
* static void
* on_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
* {
* int new_width, new_height;
*
* gtk_window_get_size (GTK_WINDOW (widget), &new_width, &new_height);
*
* ...
* }
* ]|
*
* Note that, if you connect to the #GtkWidget::size-allocate signal,
* you should not use the dimensions of the #GtkAllocation passed to
* the signal handler, as the allocation may contain client side
* decorations added by GTK+, depending on the windowing system in
* use.
*
* If you are getting a window size in order to position the window
* on the screen, you should, instead, simply set the windows semantic
* type with gtk_window_set_type_hint(), which allows the window manager
* to e.g. center dialogs. Also, if you set the transient parent of
* dialogs with gtk_window_set_transient_for() window managers will
* often center the dialog over its parent window. It's much preferred
* to let the window manager handle these cases rather than doing it
* yourself, because all apps will behave consistently and according to
* user or system preferences, if the window manager handles it. Also,
* the window manager can take into account the size of the window
* decorations and border that it may add, and of which GTK+ has no
* knowledge. Additionally, positioning windows in global screen coordinates
* may not be allowed by the windowing system. For more information,
* see: gtk_window_set_position().
*/
void
gtk_window_get_size (GtkWindow *window,
gint *width,