Compare commits
16 Commits
vulkan-lea
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f05eac610a | ||
|
|
4e8eeba5bb | ||
|
|
6da8fcf5d9 | ||
|
|
a34e95bc39 | ||
|
|
ed2716f9ce | ||
|
|
841bd9c5c2 | ||
|
|
b0344e1fd8 | ||
|
|
77e340f23d | ||
|
|
1d1ef311e3 | ||
|
|
1ce19d3c77 | ||
|
|
3e6e8e6dd5 | ||
|
|
78738fac3b | ||
|
|
549f537445 | ||
|
|
e37d15f75c | ||
|
|
ae180f85ca | ||
|
|
58036ece96 |
@@ -438,11 +438,10 @@ gdk_display_dispose (GObject *object)
|
||||
g_clear_pointer (&display->egl_dmabuf_formats, gdk_dmabuf_formats_unref);
|
||||
g_clear_pointer (&display->egl_internal_formats, gdk_dmabuf_formats_unref);
|
||||
#ifdef GDK_RENDERING_VULKAN
|
||||
if (display->vk_dmabuf_formats)
|
||||
{
|
||||
gdk_display_unref_vulkan (display);
|
||||
g_assert (display->vk_dmabuf_formats == NULL);
|
||||
}
|
||||
if (display->vk_instance)
|
||||
gdk_display_destroy_vulkan_instance (display);
|
||||
g_assert (display->vk_dmabuf_formats == NULL);
|
||||
g_clear_error (&display->vulkan_error);
|
||||
#endif
|
||||
|
||||
g_clear_object (&priv->gl_context);
|
||||
@@ -1286,6 +1285,53 @@ gdk_display_get_keymap (GdkDisplay *display)
|
||||
return GDK_DISPLAY_GET_CLASS (display)->get_keymap (display);
|
||||
}
|
||||
|
||||
/*< private >
|
||||
* gdk_display_prepare_vulkan:
|
||||
* @self: a `GdkDisplay`
|
||||
* @error: return location for a `GError`
|
||||
*
|
||||
* Checks that Vulkan is available for @self and ensures that it is
|
||||
* properly initialized.
|
||||
*
|
||||
* When this fails, an @error will be set describing the error and this
|
||||
* function returns %FALSE.
|
||||
*
|
||||
* Note that even if this function succeeds, creating a `GdkVulkanContext`
|
||||
* may still fail.
|
||||
*
|
||||
* This function is idempotent. Calling it multiple times will just
|
||||
* return the same value or error.
|
||||
*
|
||||
* You never need to call this function, GDK will call it automatically
|
||||
* as needed.
|
||||
*
|
||||
* Returns: %TRUE if the display supports Vulkan
|
||||
*/
|
||||
gboolean
|
||||
gdk_display_prepare_vulkan (GdkDisplay *self,
|
||||
GError **error)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (self), FALSE);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||
|
||||
#ifdef GDK_RENDERING_VULKAN
|
||||
if (!self->vk_instance && !self->vulkan_error)
|
||||
gdk_display_create_vulkan_instance (self, &self->vulkan_error);
|
||||
|
||||
if (self->vk_instance == NULL)
|
||||
{
|
||||
if (error)
|
||||
*error = g_error_copy (self->vulkan_error);
|
||||
}
|
||||
|
||||
return self->vk_instance != NULL;
|
||||
#else
|
||||
g_set_error (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_UNSUPPORTED,
|
||||
"GTK was built without Vulkan support");
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*<private>
|
||||
* gdk_display_create_vulkan_context:
|
||||
* @self: a `GdkDisplay`
|
||||
|
||||
@@ -126,7 +126,7 @@ struct _GdkDisplay
|
||||
GdkDmabufFormats *vk_dmabuf_formats;
|
||||
GdkVulkanFeatures vulkan_features;
|
||||
|
||||
guint vulkan_refcount;
|
||||
GError *vulkan_error;
|
||||
#endif /* GDK_RENDERING_VULKAN */
|
||||
|
||||
/* egl info */
|
||||
@@ -239,6 +239,8 @@ void _gdk_display_unpause_events (GdkDisplay *display
|
||||
|
||||
void gdk_display_init_dmabuf (GdkDisplay *self);
|
||||
|
||||
gboolean gdk_display_prepare_vulkan (GdkDisplay *self,
|
||||
GError **error);
|
||||
gboolean gdk_display_has_vulkan_feature (GdkDisplay *self,
|
||||
GdkVulkanFeatures feature);
|
||||
GdkVulkanContext * gdk_display_create_vulkan_context (GdkDisplay *self,
|
||||
|
||||
@@ -367,7 +367,6 @@ gdk_vulkan_context_dispose (GObject *gobject)
|
||||
{
|
||||
GdkVulkanContext *context = GDK_VULKAN_CONTEXT (gobject);
|
||||
GdkVulkanContextPrivate *priv = gdk_vulkan_context_get_instance_private (context);
|
||||
GdkDisplay *display;
|
||||
VkDevice device;
|
||||
guint i;
|
||||
|
||||
@@ -397,11 +396,6 @@ gdk_vulkan_context_dispose (GObject *gobject)
|
||||
priv->surface = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
/* display will be unset in gdk_draw_context_dispose() */
|
||||
display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (context));
|
||||
if (display && priv->vulkan_ref)
|
||||
gdk_display_unref_vulkan (display);
|
||||
|
||||
G_OBJECT_CLASS (gdk_vulkan_context_parent_class)->dispose (gobject);
|
||||
}
|
||||
|
||||
@@ -887,8 +881,7 @@ gdk_vulkan_context_real_init (GInitable *initable,
|
||||
VkBool32 supported;
|
||||
uint32_t i;
|
||||
|
||||
priv->vulkan_ref = gdk_display_init_vulkan (display, error);
|
||||
if (!priv->vulkan_ref)
|
||||
if (!gdk_display_prepare_vulkan (display, error))
|
||||
return FALSE;
|
||||
|
||||
if (surface == NULL)
|
||||
@@ -1668,7 +1661,7 @@ gdk_vulkan_debug_report (VkDebugReportFlagsEXT flags,
|
||||
return VK_FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gboolean
|
||||
gdk_display_create_vulkan_instance (GdkDisplay *display,
|
||||
GError **error)
|
||||
{
|
||||
@@ -1678,6 +1671,8 @@ gdk_display_create_vulkan_instance (GdkDisplay *display,
|
||||
gboolean have_debug_report = FALSE;
|
||||
VkResult res;
|
||||
|
||||
g_assert (display->vk_instance == NULL);
|
||||
|
||||
if (!gdk_has_feature (GDK_FEATURE_VULKAN))
|
||||
{
|
||||
g_set_error_literal (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_NOT_AVAILABLE,
|
||||
@@ -1804,66 +1799,16 @@ gdk_display_create_vulkan_instance (GdkDisplay *display,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* gdk_display_init_vulkan:
|
||||
* @display: a display
|
||||
* @error: A potential error message
|
||||
*
|
||||
* Initializes Vulkan and returns an error on failure.
|
||||
*
|
||||
* If Vulkan is already initialized, this function returns
|
||||
* %TRUE and increases the refcount of the existing instance.
|
||||
*
|
||||
* You need to gdk_display_unref_vulkan() to close it again.
|
||||
*
|
||||
* Returns: %TRUE if Vulkan is initialized.
|
||||
**/
|
||||
gboolean
|
||||
gdk_display_init_vulkan (GdkDisplay *display,
|
||||
GError **error)
|
||||
{
|
||||
if (display->vulkan_refcount == 0)
|
||||
{
|
||||
if (!gdk_display_create_vulkan_instance (display, error))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
display->vulkan_refcount++;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* gdk_display_ref_vulkan:
|
||||
* @display: a GdkDisplay
|
||||
*
|
||||
* Increases the refcount of an existing Vulkan instance.
|
||||
*
|
||||
* This function must not be called if Vulkan may not be initialized
|
||||
* yet, call gdk_display_init_vulkan() in that case.
|
||||
**/
|
||||
void
|
||||
gdk_display_ref_vulkan (GdkDisplay *display)
|
||||
{
|
||||
g_assert (display->vulkan_refcount > 0);
|
||||
|
||||
display->vulkan_refcount++;
|
||||
}
|
||||
|
||||
void
|
||||
gdk_display_unref_vulkan (GdkDisplay *display)
|
||||
gdk_display_destroy_vulkan_instance (GdkDisplay *display)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gpointer key, value;
|
||||
|
||||
g_return_if_fail (GDK_IS_DISPLAY (display));
|
||||
g_return_if_fail (display->vulkan_refcount > 0);
|
||||
g_assert (GDK_IS_DISPLAY (display));
|
||||
g_assert (display->vk_instance != NULL);
|
||||
|
||||
display->vulkan_refcount--;
|
||||
if (display->vulkan_refcount > 0)
|
||||
return;
|
||||
|
||||
GDK_DEBUG (VULKAN, "Closing Vulkan instance");
|
||||
GDK_DEBUG (VULKAN, "Destroy Vulkan instance");
|
||||
display->vulkan_features = 0;
|
||||
g_clear_pointer (&display->vk_dmabuf_formats, gdk_dmabuf_formats_unref);
|
||||
g_hash_table_iter_init (&iter, display->vk_shader_modules);
|
||||
@@ -1940,18 +1885,11 @@ gdk_vulkan_init_dmabuf (GdkDisplay *display)
|
||||
if (display->vk_dmabuf_formats != NULL)
|
||||
return;
|
||||
|
||||
if (!gdk_has_feature (GDK_FEATURE_DMABUF))
|
||||
if (!gdk_has_feature (GDK_FEATURE_DMABUF) ||
|
||||
!gdk_display_prepare_vulkan (display, NULL) ||
|
||||
(display->vulkan_features & GDK_VULKAN_FEATURE_DMABUF) == 0)
|
||||
return;
|
||||
|
||||
if (!gdk_display_init_vulkan (display, NULL))
|
||||
return;
|
||||
|
||||
if ((display->vulkan_features & GDK_VULKAN_FEATURE_DMABUF) == 0)
|
||||
{
|
||||
gdk_display_unref_vulkan (display);
|
||||
return;
|
||||
}
|
||||
|
||||
vulkan_builder = gdk_dmabuf_formats_builder_new ();
|
||||
|
||||
for (i = 0; gdk_dmabuf_vk_get_nth (i, &fourcc, &vk_format); i++)
|
||||
|
||||
@@ -73,10 +73,9 @@ gdk_vulkan_handle_result (VkResult res,
|
||||
|
||||
#define GDK_VK_CHECK(func, ...) gdk_vulkan_handle_result (func (__VA_ARGS__), G_STRINGIFY (func))
|
||||
|
||||
gboolean gdk_display_init_vulkan (GdkDisplay *display,
|
||||
gboolean gdk_display_create_vulkan_instance (GdkDisplay *display,
|
||||
GError **error);
|
||||
void gdk_display_ref_vulkan (GdkDisplay *display);
|
||||
void gdk_display_unref_vulkan (GdkDisplay *display);
|
||||
void gdk_display_destroy_vulkan_instance (GdkDisplay *display);
|
||||
|
||||
void gdk_vulkan_init_dmabuf (GdkDisplay *display);
|
||||
|
||||
|
||||
@@ -928,6 +928,10 @@ preferred_changed (GdkWaylandColorSurface *color,
|
||||
{
|
||||
GdkWaylandSurface *self = GDK_WAYLAND_SURFACE (data);
|
||||
|
||||
GDK_DISPLAY_DEBUG (gdk_surface_get_display (GDK_SURFACE (self)), EVENTS,
|
||||
"preferred color state, surface %p color state %s",
|
||||
self, gdk_color_state_get_name (color_state));
|
||||
|
||||
gdk_surface_set_color_state (GDK_SURFACE (self), color_state);
|
||||
|
||||
self->color_state_changed = TRUE;
|
||||
|
||||
@@ -343,8 +343,6 @@ gsk_vulkan_device_finalize (GObject *object)
|
||||
g_clear_pointer (&self->allocators[i], gsk_vulkan_allocator_unref);
|
||||
g_clear_pointer (&self->external_allocator, gsk_vulkan_allocator_unref);
|
||||
|
||||
gdk_display_unref_vulkan (display);
|
||||
|
||||
G_OBJECT_CLASS (gsk_vulkan_device_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
@@ -422,7 +420,7 @@ gsk_vulkan_device_get_for_display (GdkDisplay *display,
|
||||
if (self)
|
||||
return GSK_GPU_DEVICE (g_object_ref (self));
|
||||
|
||||
if (!gdk_display_init_vulkan (display, error))
|
||||
if (!gdk_display_prepare_vulkan (display, error))
|
||||
return NULL;
|
||||
|
||||
self = g_object_new (GSK_TYPE_VULKAN_DEVICE, NULL);
|
||||
|
||||
@@ -653,7 +653,16 @@ vulkan_supported_platform (GdkSurface *surface,
|
||||
VkPhysicalDeviceProperties props;
|
||||
GError *error = NULL;
|
||||
|
||||
if (!gdk_display_init_vulkan (display, &error))
|
||||
#ifdef GDK_WINDOWING_WAYLAND
|
||||
if (!GDK_IS_WAYLAND_DISPLAY (gdk_surface_get_display (surface)) && !as_fallback)
|
||||
{
|
||||
GSK_DEBUG (RENDERER, "Not using '%s': platform is not Wayland",
|
||||
g_type_name (renderer_type));
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!gdk_display_prepare_vulkan (display, &error))
|
||||
{
|
||||
GSK_DEBUG (RENDERER, "Not using Vulkan%s: %s",
|
||||
as_fallback ? " as fallback" : "",
|
||||
@@ -666,11 +675,11 @@ vulkan_supported_platform (GdkSurface *surface,
|
||||
return TRUE;
|
||||
|
||||
vkGetPhysicalDeviceProperties (display->vk_physical_device, &props);
|
||||
|
||||
if (props.deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU)
|
||||
{
|
||||
GSK_DEBUG (RENDERER, "Not using '%s': device is CPU",
|
||||
g_type_name (renderer_type));
|
||||
gdk_display_unref_vulkan (display);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -681,21 +690,11 @@ vulkan_supported_platform (GdkSurface *surface,
|
||||
{
|
||||
GSK_DEBUG (RENDERER, "Not using '%s': no dmabuf support",
|
||||
g_type_name (renderer_type));
|
||||
gdk_display_unref_vulkan (display);
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef GDK_WINDOWING_WAYLAND
|
||||
if (GDK_IS_WAYLAND_DISPLAY (gdk_surface_get_display (surface)))
|
||||
return TRUE;
|
||||
#endif
|
||||
|
||||
GSK_DEBUG (RENDERER, "Not using '%s': platform is not Wayland",
|
||||
g_type_name (renderer_type));
|
||||
|
||||
gdk_display_unref_vulkan (display);
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static GType
|
||||
@@ -715,14 +714,6 @@ get_renderer_for_vulkan_fallback (GdkSurface *surface)
|
||||
|
||||
return GSK_TYPE_VULKAN_RENDERER;
|
||||
}
|
||||
|
||||
static void
|
||||
vulkan_cleanup (GdkSurface *surface)
|
||||
{
|
||||
GdkDisplay *display = gdk_surface_get_display (surface);
|
||||
|
||||
gdk_display_unref_vulkan (display);
|
||||
}
|
||||
#endif
|
||||
|
||||
static GType
|
||||
@@ -733,20 +724,19 @@ get_renderer_fallback (GdkSurface *surface)
|
||||
|
||||
static struct {
|
||||
GType (* get_renderer) (GdkSurface *surface);
|
||||
void (* cleanup) (GdkSurface *surface);
|
||||
} renderer_possibilities[] = {
|
||||
{ get_renderer_for_display, NULL },
|
||||
{ get_renderer_for_env_var, NULL },
|
||||
{ get_renderer_for_backend, NULL },
|
||||
{ get_renderer_for_display },
|
||||
{ get_renderer_for_env_var },
|
||||
{ get_renderer_for_backend },
|
||||
#ifdef GDK_RENDERING_VULKAN
|
||||
{ get_renderer_for_vulkan, vulkan_cleanup },
|
||||
{ get_renderer_for_vulkan },
|
||||
#endif
|
||||
{ get_renderer_for_gl, NULL },
|
||||
{ get_renderer_for_gl },
|
||||
#ifdef GDK_RENDERING_VULKAN
|
||||
{ get_renderer_for_vulkan_fallback, vulkan_cleanup },
|
||||
{ get_renderer_for_vulkan_fallback },
|
||||
#endif
|
||||
{ get_renderer_for_gl_fallback, NULL },
|
||||
{ get_renderer_fallback, NULL },
|
||||
{ get_renderer_for_gl_fallback },
|
||||
{ get_renderer_fallback },
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -783,20 +773,13 @@ gsk_renderer_new_for_surface (GdkSurface *surface)
|
||||
|
||||
if (gsk_renderer_realize (renderer, surface, &error))
|
||||
{
|
||||
if (renderer_possibilities[i].cleanup)
|
||||
renderer_possibilities[i].cleanup (surface);
|
||||
|
||||
GSK_DEBUG (RENDERER,
|
||||
"Using renderer '%s' for surface '%s'",
|
||||
G_OBJECT_TYPE_NAME (renderer),
|
||||
G_OBJECT_TYPE_NAME (surface));
|
||||
|
||||
return renderer;
|
||||
}
|
||||
|
||||
if (renderer_possibilities[i].cleanup)
|
||||
renderer_possibilities[i].cleanup (surface);
|
||||
|
||||
GSK_DEBUG (RENDERER,
|
||||
"Failed to realize renderer '%s' for surface '%s': %s",
|
||||
G_OBJECT_TYPE_NAME (renderer),
|
||||
|
||||
@@ -590,6 +590,7 @@ populate_servers (GtkPlacesView *view)
|
||||
gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
|
||||
gtk_button_set_has_frame (GTK_BUTTON (button), FALSE);
|
||||
gtk_widget_add_css_class (button, "sidebar-button");
|
||||
gtk_widget_set_tooltip_text (button, _("Remove server"));
|
||||
gtk_grid_attach (GTK_GRID (grid), button, 1, 0, 1, 2);
|
||||
|
||||
gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), grid);
|
||||
|
||||
@@ -291,6 +291,7 @@ struct _GtkTextPrivate
|
||||
guint propagate_text_width : 1;
|
||||
guint text_handles_enabled : 1;
|
||||
guint enable_undo : 1;
|
||||
guint emoji_chooser_open : 1;
|
||||
};
|
||||
|
||||
struct _GtkTextPasswordHint
|
||||
@@ -3459,7 +3460,7 @@ gtk_text_grab_focus (GtkWidget *widget)
|
||||
if (!GTK_WIDGET_CLASS (gtk_text_parent_class)->grab_focus (GTK_WIDGET (self)))
|
||||
return FALSE;
|
||||
|
||||
if (priv->editable && !priv->in_click && !prev_focus_was_child)
|
||||
if (priv->editable && !priv->in_click && !prev_focus_was_child && !priv->emoji_chooser_open)
|
||||
{
|
||||
g_object_get (gtk_widget_get_settings (widget),
|
||||
"gtk-entry-select-on-focus",
|
||||
@@ -7183,6 +7184,15 @@ gtk_text_get_tabs (GtkText *self)
|
||||
return priv->tabs;
|
||||
}
|
||||
|
||||
static void
|
||||
emoji_chooser_closed (GtkWidget *chooser,
|
||||
GtkText *text)
|
||||
{
|
||||
GtkTextPrivate *priv = gtk_text_get_instance_private (text);
|
||||
|
||||
priv->emoji_chooser_open = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
emoji_picked (GtkEmojiChooser *chooser,
|
||||
const char *text,
|
||||
@@ -7208,6 +7218,7 @@ emoji_picked (GtkEmojiChooser *chooser,
|
||||
static void
|
||||
gtk_text_insert_emoji (GtkText *self)
|
||||
{
|
||||
GtkTextPrivate *priv = gtk_text_get_instance_private (self);
|
||||
GtkWidget *chooser;
|
||||
|
||||
if (gtk_widget_get_ancestor (GTK_WIDGET (self), GTK_TYPE_EMOJI_CHOOSER) != NULL)
|
||||
@@ -7221,10 +7232,11 @@ gtk_text_insert_emoji (GtkText *self)
|
||||
|
||||
gtk_widget_set_parent (chooser, GTK_WIDGET (self));
|
||||
g_signal_connect (chooser, "emoji-picked", G_CALLBACK (emoji_picked), self);
|
||||
g_signal_connect_swapped (chooser, "hide", G_CALLBACK (gtk_text_grab_focus_without_selecting), self);
|
||||
g_signal_connect_swapped (chooser, "hide", G_CALLBACK (emoji_chooser_closed), self);
|
||||
}
|
||||
|
||||
gtk_popover_popup (GTK_POPOVER (chooser));
|
||||
priv->emoji_chooser_open = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -577,7 +577,7 @@ init_vulkan (GtkInspectorGeneral *gen)
|
||||
const char *types[] = { "other", "integrated GPU", "discrete GPU", "virtual GPU", "CPU" };
|
||||
GError *error = NULL;
|
||||
|
||||
if (!gdk_display_init_vulkan (gen->display, &error))
|
||||
if (!gdk_display_prepare_vulkan (gen->display, &error))
|
||||
{
|
||||
gtk_label_set_text (GTK_LABEL (gen->vk_device), C_("Vulkan device", "None"));
|
||||
gtk_widget_set_visible (gen->vk_error_row, TRUE);
|
||||
@@ -617,8 +617,6 @@ init_vulkan (GtkInspectorGeneral *gen)
|
||||
add_instance_extensions (gen->vulkan_extensions_list);
|
||||
add_device_extensions (gen->display->vk_physical_device, gen->vulkan_extensions_list);
|
||||
add_layers (gen->vulkan_layers_list);
|
||||
|
||||
gdk_display_unref_vulkan (gen->display);
|
||||
#else
|
||||
gtk_label_set_text (GTK_LABEL (gen->vk_device), C_("Vulkan device", "None"));
|
||||
gtk_widget_set_visible (gen->vk_api_version_row, FALSE);
|
||||
|
||||
@@ -183,8 +183,13 @@ update_allocation (GtkWidget *w,
|
||||
char *size_label;
|
||||
GEnumClass *class;
|
||||
GEnumValue *value;
|
||||
GtkWidget *target;
|
||||
|
||||
if (!gtk_widget_compute_bounds (w, gtk_widget_get_parent (w), &bounds))
|
||||
target = gtk_widget_get_parent (w);
|
||||
if (target == NULL)
|
||||
target = w;
|
||||
|
||||
if (!gtk_widget_compute_bounds (w, target, &bounds))
|
||||
graphene_rect_init (&bounds, 0, 0, 0, 0);
|
||||
|
||||
size_label = g_strdup_printf ("%g × %g +%g +%g",
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
#include "gtklabel.h"
|
||||
#include "gtklistitem.h"
|
||||
#include "gtkpopover.h"
|
||||
#include "gtknative.h"
|
||||
#include "gtksettings.h"
|
||||
#include "gtksingleselection.h"
|
||||
#include "gtksignallistitemfactory.h"
|
||||
@@ -132,6 +133,37 @@ object_tree_widget_get_children (GObject *object)
|
||||
return G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (list)));
|
||||
}
|
||||
|
||||
static GObject *
|
||||
object_tree_window_get_parent (GObject *object)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static GListModel *
|
||||
object_tree_native_get_children (GObject *object)
|
||||
{
|
||||
GtkNative *native = GTK_NATIVE (object);
|
||||
GListStore *list;
|
||||
GListModel *sublist;
|
||||
|
||||
list = g_list_store_new (G_TYPE_LIST_MODEL);
|
||||
|
||||
sublist = G_LIST_MODEL (g_list_store_new (G_TYPE_OBJECT));
|
||||
|
||||
if (gtk_native_get_surface (native))
|
||||
g_list_store_append (G_LIST_STORE (sublist), gtk_native_get_surface (native));
|
||||
if (gtk_native_get_renderer (native))
|
||||
g_list_store_append (G_LIST_STORE (sublist), gtk_native_get_renderer (native));
|
||||
g_list_store_append (list, sublist);
|
||||
g_object_unref (sublist);
|
||||
|
||||
sublist = object_tree_widget_get_children (object);
|
||||
g_list_store_append (list, sublist);
|
||||
g_object_unref (sublist);
|
||||
|
||||
return G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (list)));
|
||||
}
|
||||
|
||||
static GListModel *
|
||||
object_tree_tree_model_sort_get_children (GObject *object)
|
||||
{
|
||||
@@ -518,6 +550,16 @@ static const ObjectTreeClassFuncs object_tree_class_funcs[] = {
|
||||
object_tree_widget_get_parent,
|
||||
object_tree_combo_box_get_children
|
||||
},
|
||||
{
|
||||
gtk_window_get_type,
|
||||
object_tree_window_get_parent,
|
||||
object_tree_native_get_children,
|
||||
},
|
||||
{
|
||||
gtk_popover_get_type,
|
||||
object_tree_widget_get_parent,
|
||||
object_tree_native_get_children,
|
||||
},
|
||||
{
|
||||
gtk_widget_get_type,
|
||||
object_tree_widget_get_parent,
|
||||
|
||||
@@ -275,6 +275,7 @@
|
||||
<property name="direction">0</property>
|
||||
<property name="popover">recent_servers_popover</property>
|
||||
<property name="icon-name">pan-down-symbolic</property>
|
||||
<property name="tooltip-text" translatable="yes">Show recent servers</property>
|
||||
<style>
|
||||
<class name="server-list-button"/>
|
||||
</style>
|
||||
|
||||
@@ -1708,6 +1708,7 @@ main (int argc, char **argv)
|
||||
g_option_context_add_main_entries (context, args, GETTEXT_PACKAGE);
|
||||
|
||||
g_option_context_parse (context, &argc, &argv, NULL);
|
||||
g_option_context_free (context);
|
||||
|
||||
path = argv[1];
|
||||
#ifdef G_OS_WIN32
|
||||
|
||||
Reference in New Issue
Block a user