Compare commits

..

5 Commits

Author SHA1 Message Date
Matthias Clasen dfefa884ad Add a GskPoint type and use it for offsets
This has a tremendous ripple effect and is kind of disastrous.
2024-01-21 21:25:24 -05:00
Matthias Clasen 72b8c6cf74 Use graphene's simd4f type for GskScale 2024-01-21 18:42:33 -05:00
Matthias Clasen 501095452a gsk: Introduce GskScale
Use a separate type for a 2d scale that the compiler won't confuse
with graphene_point_t. We can also move some of the generic scale/
transform code form gskgpunodeprocessor.c here.
2024-01-21 15:56:59 -05:00
Matthias Clasen 2ede31b682 Don't use a vec2 for blur direction either
A point_t does just as well.
2024-01-21 08:04:36 -05:00
Matthias Clasen 1355367360 gpu: Don't use a vec2 for scales
This is wasteful (since it gets stored as 4 highly-aligned floats),
and all we ever do is unpack and repack that simf4.
2024-01-21 08:04:36 -05:00
479 changed files with 19198 additions and 44459 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
# See https://www.apertis.org/policies/coding_conventions/#code-formatting # See https://wiki.apertis.org/Guidelines/Coding_conventions#Code_formatting
BasedOnStyle: GNU BasedOnStyle: GNU
AlwaysBreakAfterDefinitionReturnType: All AlwaysBreakAfterDefinitionReturnType: All
BreakBeforeBinaryOperators: None BreakBeforeBinaryOperators: None
+36 -34
View File
@@ -78,7 +78,6 @@ style-check-diff:
- "${CI_PROJECT_DIR}/_build/testsuite/reftests/output/*/*.node" - "${CI_PROJECT_DIR}/_build/testsuite/reftests/output/*/*.node"
- "${CI_PROJECT_DIR}/_build/testsuite/tools/output/*/*" - "${CI_PROJECT_DIR}/_build/testsuite/tools/output/*/*"
- "${CI_PROJECT_DIR}/_build/testsuite/gsk/compare/*/*/*.png" - "${CI_PROJECT_DIR}/_build/testsuite/gsk/compare/*/*/*.png"
- "${CI_PROJECT_DIR}/_build/testsuite/gsk/compare/*/*/*.node"
- "${CI_PROJECT_DIR}/_build/testsuite/css/output/*/*.syscap" - "${CI_PROJECT_DIR}/_build/testsuite/css/output/*/*.syscap"
- "${CI_PROJECT_DIR}/_build/testsuite/headless/*/*.log" - "${CI_PROJECT_DIR}/_build/testsuite/headless/*/*.log"
- "${CI_PROJECT_DIR}/_build_hello/meson-logs" - "${CI_PROJECT_DIR}/_build_hello/meson-logs"
@@ -210,54 +209,51 @@ msys2-mingw64:
paths: paths:
- "${CI_PROJECT_DIR}/_build/gtkdll.tar.gz" - "${CI_PROJECT_DIR}/_build/gtkdll.tar.gz"
macos: macos-x86_64:
rules: rules:
# Do not run in forks as the runner is not available there. # Do not run in forks as the runner is not available there.
# (except for dehesselle who maintains the runner) - if: $CI_PROJECT_NAMESPACE == "GNOME"
- if: $CI_PROJECT_NAMESPACE != "GNOME" && $CI_PROJECT_NAMESPACE != "dehesselle"
when: never
- if: $RUNNER == "macosintel"
variables:
SDKROOT: /opt/sdks/MacOSX10.13.4.sdk
NINJA_PKG: $CI_API_V4_URL/projects/30745/packages/generic/ninja_macos/v1.11.1.1+9/ninja-1.11.1.1-cp38-cp38-macosx_11_0_x86_64.whl
when: manual
allow_failure: true
- if: $RUNNER == "macosarm"
variables:
SDKROOT: /opt/sdks/MacOSX11.3.sdk
NINJA_PKG: ninja==1.11.1.1
stage: build stage: build
parallel:
matrix:
- RUNNER: [ "macosintel", "macosarm" ]
tags: tags:
- ${RUNNER} - macosintel
needs: [] needs: []
variables: variables:
EXTRA_MESON_FLAGS: "" MESON_FORCE_BACKTRACKE: 1
BACKEND_FLAGS: "-Dx11-backend=false -Dbroadway-backend=true"
FEATURE_FLAGS: "-Dmedia-gstreamer=disabled -Dintrospection=enabled -Dgobject-introspection:werror=false"
TMPDIR: /Users/Shared/work/tmp TMPDIR: /Users/Shared/work/tmp
SDKROOT: /opt/sdks/MacOSX10.13.4.sdk
PIP_CACHE_DIR: /Users/Shared/build/cache PIP_CACHE_DIR: /Users/Shared/build/cache
PIPENV_CACHE_DIR: $PIP_CACHE_DIR PIPENV_CACHE_DIR: $PIP_CACHE_DIR
PYTHONPYCACHEPREFIX: $PIP_CACHE_DIR PYTHONPYCACHEPREFIX: $PIP_CACHE_DIR
EXTRA_MESON_FLAGS: "-Dgobject-introspection:werror=false"
before_script: before_script:
- .gitlab-ci/show-info-macos.sh # Not using ccache on purpose as it accelerates the build so much that it
- python3 -m venv .venv # can trigger race conditions in the gobject-introspection subproject.
# Building the introspection feature requires pkg-config and bison. - bash .gitlab-ci/show-info-osx.sh
- curl -L $CI_API_V4_URL/projects/30437/packages/generic/pkgconfig/v0.29.2+10/pkg-config-0.29.2+10_$(uname -m).tar.xz | tar -C .venv -xJ - /opt/macports/bin/python3.10 -m venv .venv
- curl -L $CI_API_V4_URL/projects/30438/packages/generic/bison/v3.8.2+3/bison-3.8.2+3_$(uname -m).tar.xz | tar -C .venv -xJ - ln -s /opt/cmake/CMake.app/Contents/bin/cmake .venv/bin
- ln -s /opt/pkg-config/bin/pkg-config .venv/bin
- ln -s /opt/bison/bin/bison .venv/bin
- source .venv/bin/activate - source .venv/bin/activate
- pip3 install meson==1.3.2 $NINJA_PKG - pip3 install meson==1.2.0
# We're not setting up ccache here on purpose as it accelerates the build - pip3 install ninja==1.11.1
# so much that it triggers race conditions in the gobject-introspection - pip3 install /Users/Shared/build/pkgs/PyGObject-3.44.0-cp310-cp310-macosx_10_13_x86_64.whl
# subproject. /Users/Shared/build/pkgs/pycairo-1.23.0-cp310-cp310-macosx_10_13_x86_64.whl
script: script:
- meson setup - meson setup
${COMMON_MESON_FLAGS} ${COMMON_MESON_FLAGS}
${EXTRA_MESON_FLAGS} ${EXTRA_MESON_FLAGS}
${BACKEND_FLAGS} -Dx11-backend=false
${FEATURE_FLAGS} -Dbroadway-backend=true
-Dmacos-backend=true
-Dmedia-gstreamer=disabled
-Dintrospection=enabled
-Dcpp_std=c++11
-Dpixman:tests=disabled
-Dlibjpeg-turbo:simd=disabled
-Dbuild-demos=false
-Dbuild-tests=false
-Dbuild-examples=false
-Dbuild-testsuite=false
_build _build
- meson compile -C _build - meson compile -C _build
artifacts: artifacts:
@@ -432,6 +428,13 @@ asan-build:
_build _build
- ninja -C _build - ninja -C _build
- .gitlab-ci/run-tests.sh _build wayland gtk - .gitlab-ci/run-tests.sh _build wayland gtk
artifacts:
when: always
reports:
junit:
- "${CI_PROJECT_DIR}/_build/report-wayland.xml"
paths:
- "${CI_PROJECT_DIR}/_build/meson-logs"
reference: reference:
image: $FEDORA_IMAGE image: $FEDORA_IMAGE
@@ -481,4 +484,3 @@ publish-docs:
- "curl -X POST -F token=${PAGES_TRIGGER_TOKEN} -F ref=docs-gtk-org https://gitlab.gnome.org/api/v4/projects/665/trigger/pipeline" - "curl -X POST -F token=${PAGES_TRIGGER_TOKEN} -F ref=docs-gtk-org https://gitlab.gnome.org/api/v4/projects/665/trigger/pipeline"
rules: rules:
- if: $CI_COMMIT_REF_NAME == "main" - if: $CI_COMMIT_REF_NAME == "main"
@@ -3,11 +3,6 @@
set -eux -o pipefail set -eux -o pipefail
xcodebuild -version || : xcodebuild -version || :
xcodebuild -showsdks || :
if [ -z "$SDKROOT" ]; then
xcodebuild -showsdks || :
else
echo "SDKROOT = $SDKROOT"
fi
system_profiler SPSoftwareDataType || : system_profiler SPSoftwareDataType || :
+1 -281
View File
@@ -1,286 +1,6 @@
Overview of Changes in 4.14.1, xx-xx-xxxx Overview of Changes in 4.13.6, xx-xx-xxxx
========================================= =========================================
Overview of Changes in 4.14.0, 12-03-2024
=========================================
Note: The new renderers and dmabuf support are using graphics drivers
in different ways than the old gl renderer, and trigger new driver bugs,
(see for example https://gitlab.gnome.org/GNOME/gtk/-/issues/6418 and
https://gitlab.gnome.org/GNOME/gtk/-/issues/6388). Therefore, it is
recommended to use the latest mesa release (24.x) with the new renderers.
* GtkTextView:
- Don't snapshot children twice
- Don't blink the cursor when hidden
* GtkEmojiChooser:
- Fix presentation selector handling
* GtkSnapshot:
- Fix wrong nodes with transformed shadows
* GtkIMContext:
- Make gtk_im_context_activate_osk public
* Accessibility:
- Implement get_contents_at for all our text widgets
- Add GtkAccessibleText.get_default_attributes
* GSK:
- Don't fall back to cairo for software rendering. gl+llvmpipe is better
- Round vertical glyph position to a device pixel position if the font is hinted
- Fix problems with clip handling
- Make vulkan and ngl match their font handling
- Fix some corner-cases with offloading and clips
- Fix problem with rendering of missing glyphs in hinted fonts
* MacOs:
- Implement cursor-from-texture
* Translation updates:
Basque
British English
French
Indonesian
Kazakh
Latvian
Lithuanian
Norwegian Bokmål
Slovenian
Spanish
Turkish
Overview of Changes in 4.13.9, 02-03-2024
=========================================
* GtkEditable:
- Fix preconditions to be not too strict
* GtkEmojiChooser:
- Support search in the locale as well as in English
* GtkIconTheme:
- Make gtk_icon_paintable_new_for_file support symbolics
* GtkVideo:
- Fix a problem with cursor handling that could lead to crashes
* Accessibility:
- Fix GetCharacterAtOffset implementation
- Add a Terminal role
- Make TextCaretMoved match gtk3
- Support multiple levels of GtkEditable delegates
* GSK:
- Make the node parser more flexible for text nodes
- Change the way font scaling is handled to avoid clipping
- Fix handling of missing glyphs in the new renderers
* X11:
- Don't claim to support shadows without a compositor
* Wayland:
- Fix handling of output scales
* Tools:
- Add a compare command to gtk4-rendernode-tool
* Build:
- Fix some ubsan complaints
* Translation updates:
Basque
British English
Catalan
Finnish
Galician
Georgian
Hebrew
Indonesian
Kazakh
Latvian
Lithuanian
Persian
Polish
Russian
Slovenian
Spanish
Turkish
Ukrainian
Overview of Changes in 4.13.8, 20-02-2024
=========================================
* Accessibility:
- Add a GtkAccessibleText interface for allowing 3rd party
text widgets (notably vte) to be accessible
- Avoid duplicate accessible descriptions
- Fix GetAccessibleAtPoint
* GSK:
- Avoid offscreens for disjoint containers
- Don't use the gpu renderers with llvmpipe
- Fix various rendering issues found by tests
- Allow unnormalized node bounds again
- Fix a broken case of rounded-rect intersection
- Fix handling of external textures in gpu renderers
- Make gpu renderers work with WGL on Windows
* build:
- Allow building without dmabuf support on (old) Linux
* X11:
- Fix monitor enter/leave signals
* Translation updates:
Basque
Brazilian Portuguese
Catalan
Czech
Galician
Georgian
Hebrew
Lithuanian
Persian
Russian
Turkish
Ukrainian
Overview of Changes in 4.13.7, 11-02-2024
=========================================
* GtkFileChooser:
- Speed up opening
* GtkCalendar:
- Add some missing setters and getters
* Accessibility:
- Add socket support for webkit accessibility
- Implement AT-SPI text for GtkText
- Implement AT-SPI component generically
- Add an announce API
* GSK:
- Make the ngl renderer work on macOS
- Fix a crash in the vulkan renderer
- Make nodeparser allow aliases for fonts again
- Implement cache eviction for glyph and texture caches
- Fix ngl shaders to work on GL < 4.0
- Require GL 3.3 for the ngl renderer
- Fix problems with scaled shadows
- Fix problems with holes for underlaid subsurfaces
- Improve handling of scales and glyph cache efficiency
* Media:
- Support dmabufs in the gstreamer backend. This allows
zero-copy video playback on Wayland when paired with
hardware video decoding
- Drop the experimental ffmpeg backend. It hasn't been
building for a year
* Wayland:
- Commit empty frames if and double-buffered state is pending
- Fix monitor size information when using mutter without
the scale-monitor-framebuffer setting
- Clear the current tablet on tab leave, fixing a crash
* macOS:
- Propagate unhandled input events back to the OS
* Tools:
- Make the crash handling in gtk4-node-editor more robust
* Translation updates
Galician
Georgian
Occitan
Turkish
Overview of Changes in 4.13.6, 25-01-2024
=========================================
This release changes the ngl renderer to be the default renderer.
The intent of this change is to get wider testing and verify that
the new renderers are production-ready. If significant problems
show up, we will revert this change for 4.14.
You can still override the renderer choice using the GSK_RENDERER
environment variable.
Since ngl can handle fractional scaling much better than the old gl
renderer, we allow fractional scaling by default with gl now. If you
are using the old gl renderer (e.g. because your system is limited to
GLES2), you can disable fractional scaling by setting the GDK_DEBUG
environment variable to include the gl-no-fractional key.
* GtkColumnView:
- Fix infinite loops in dispose
- Fix problems with weak ref cycles in GtkExpression
* GtkListView:
- Fix some corner cases with sections during insertions and deletions
- Don't double-recycle widgets
* GtkStack:
- Add automatic cleanup for GtkStackPage
* GDK:
- Use standard cursor names for drag cursors
- Enable fractional scaling with gl by default
* GSK:
- Many fixes and improvements to the unified renderers:
- Fix text rendering with the uber shader
- Fix rounding issues with fractional scales
- Fix some memory leaks
- Many text rendering fixes
- Implement subpixel positioning for glyphs
- Support custom fonts in node files
- Add tests for font rendering
- Fix drawing of repeat nodes
- Implement subpixels positioning
- Evict stale textures, glyphs and atlases from the cache
- Some fixes and improvements to the GL renderer:
- Fix problems with GLES on Nvidia
- Avoid a crash in the mask demo
- Respect opacity of the first child node in containers
- Some fixes and improvements to the fallback renderer:
- Fix drawing of repeat nodes
- Make ngl the default renderer
* Wayland:
- Fix problems with tablet cursors
- Fix problems without seats
* Accessibility:
- Respect a separate "show-status-shapes setting
- Fix change notification for accessible names on some widgets
* Inspector:
- Show the git commit in devel builds
* Tools:
- Make gtk4-node-editor autosave its contents
- Add a benchmark command to gtk4-rendernode-tool
* Translation updates:
French
Galician
Georgian
Occitan
Persian
Russian
Vietnamese
Overview of Changes in 4.13.5, 07-01-2024 Overview of Changes in 4.13.5, 07-01-2024
========================================= =========================================
+1 -1
View File
@@ -600,8 +600,8 @@ update_display (void)
if (s->len > 0) if (s->len > 0)
{ {
pango_font_description_set_variations (desc, s->str); pango_font_description_set_variations (desc, s->str);
g_string_free (s, TRUE);
} }
g_string_free (s, TRUE);
font_desc = pango_font_description_to_string (desc); font_desc = pango_font_description_to_string (desc);
+1 -3
View File
@@ -116,9 +116,7 @@ static gboolean gtk_shadertoy_tick (GtkWidget *widget,
GtkWidget * GtkWidget *
gtk_shadertoy_new (void) gtk_shadertoy_new (void)
{ {
return g_object_new (gtk_shadertoy_get_type (), return g_object_new (gtk_shadertoy_get_type (), NULL);
"allowed-apis", GDK_GL_API_GL,
NULL);
} }
static void static void
-1
View File
@@ -354,7 +354,6 @@ do_images (GtkWidget *do_widget)
gicon = g_themed_icon_new_with_default_fallbacks ("battery-caution-charging-symbolic"); gicon = g_themed_icon_new_with_default_fallbacks ("battery-caution-charging-symbolic");
image = gtk_image_new_from_gicon (gicon); image = gtk_image_new_from_gicon (gicon);
gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE); gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE);
g_object_unref (gicon);
gtk_frame_set_child (GTK_FRAME (frame), image); gtk_frame_set_child (GTK_FRAME (frame), image);
-1
View File
@@ -1,5 +1,4 @@
/* Lists/Selections /* Lists/Selections
* #Keywords: suggestion, completion
* *
* The GtkDropDown widget is a modern alternative to GtkComboBox. * The GtkDropDown widget is a modern alternative to GtkComboBox.
* It uses list models instead of tree models, and the content is * It uses list models instead of tree models, and the content is
+65 -59
View File
@@ -68,9 +68,8 @@ struct _NodeEditorWindow
GArray *errors; GArray *errors;
guint update_timeout;
gboolean auto_reload; gboolean auto_reload;
gboolean mark_as_safe_pending;
gulong after_paint_handler;
}; };
struct _NodeEditorWindowClass struct _NodeEditorWindowClass
@@ -246,41 +245,6 @@ highlight_text (NodeEditorWindow *self)
gtk_text_buffer_apply_tag_by_name (self->text_buffer, "no-hyphens", &start, &end); gtk_text_buffer_apply_tag_by_name (self->text_buffer, "no-hyphens", &start, &end);
} }
static void
mark_autosave_as_unsafe (void)
{
char *path1 = NULL;
char *path2 = NULL;
path1 = get_autosave_path ("-unsafe");
path2 = get_autosave_path (NULL);
g_rename (path2, path1);
}
static void
mark_autosave_as_safe (void)
{
char *path1 = NULL;
char *path2 = NULL;
path1 = get_autosave_path ("-unsafe");
path2 = get_autosave_path (NULL);
g_rename (path1, path2);
}
static void
after_paint (GdkFrameClock *clock,
NodeEditorWindow *self)
{
if (self->mark_as_safe_pending)
{
self->mark_as_safe_pending = FALSE;
mark_autosave_as_safe ();
}
}
static void static void
reload (NodeEditorWindow *self) reload (NodeEditorWindow *self)
{ {
@@ -289,8 +253,6 @@ reload (NodeEditorWindow *self)
float scale; float scale;
GskRenderNode *big_node; GskRenderNode *big_node;
mark_autosave_as_unsafe ();
text = get_current_text (self->text_buffer); text = get_current_text (self->text_buffer);
bytes = g_bytes_new_take (text, strlen (text)); bytes = g_bytes_new_take (text, strlen (text));
@@ -352,8 +314,6 @@ reload (NodeEditorWindow *self)
} }
g_clear_pointer (&big_node, gsk_render_node_unref); g_clear_pointer (&big_node, gsk_render_node_unref);
self->mark_as_safe_pending = TRUE;
} }
static void static void
@@ -1165,6 +1125,9 @@ node_editor_window_finalize (GObject *object)
{ {
NodeEditorWindow *self = (NodeEditorWindow *)object; NodeEditorWindow *self = (NodeEditorWindow *)object;
if (self->update_timeout)
g_source_remove (self->update_timeout);
g_array_free (self->errors, TRUE); g_array_free (self->errors, TRUE);
g_clear_pointer (&self->node, gsk_render_node_unref); g_clear_pointer (&self->node, gsk_render_node_unref);
@@ -1209,7 +1172,6 @@ static void
node_editor_window_realize (GtkWidget *widget) node_editor_window_realize (GtkWidget *widget)
{ {
NodeEditorWindow *self = NODE_EDITOR_WINDOW (widget); NodeEditorWindow *self = NODE_EDITOR_WINDOW (widget);
GdkFrameClock *frameclock;
GTK_WIDGET_CLASS (node_editor_window_parent_class)->realize (widget); GTK_WIDGET_CLASS (node_editor_window_parent_class)->realize (widget);
@@ -1237,24 +1199,14 @@ node_editor_window_realize (GtkWidget *widget)
node_editor_window_add_renderer (self, node_editor_window_add_renderer (self,
gsk_cairo_renderer_new (), gsk_cairo_renderer_new (),
"Cairo"); "Cairo");
frameclock = gtk_widget_get_frame_clock (widget);
self->after_paint_handler = g_signal_connect (frameclock, "after-paint",
G_CALLBACK (after_paint), self);
} }
static void static void
node_editor_window_unrealize (GtkWidget *widget) node_editor_window_unrealize (GtkWidget *widget)
{ {
NodeEditorWindow *self = NODE_EDITOR_WINDOW (widget); NodeEditorWindow *self = NODE_EDITOR_WINDOW (widget);
GdkFrameClock *frameclock;
guint i; guint i;
frameclock = gtk_widget_get_frame_clock (widget);
g_signal_handler_disconnect (frameclock, self->after_paint_handler);
self->after_paint_handler = 0;
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (self->renderers)); i ++) for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (self->renderers)); i ++)
{ {
gpointer item = g_list_model_get_item (G_LIST_MODEL (self->renderers), i); gpointer item = g_list_model_get_item (G_LIST_MODEL (self->renderers), i);
@@ -1615,6 +1567,23 @@ edit_action_cb (GtkWidget *widget,
node_editor_window_edit (self, &start); node_editor_window_edit (self, &start);
} }
static void
node_editor_window_map (GtkWidget *widget)
{
char *path;
GTK_WIDGET_CLASS (node_editor_window_parent_class)->map (widget);
path = get_autosave_path (NULL);
if (g_file_test (path, G_FILE_TEST_EXISTS))
{
g_free (path);
return;
}
g_free (path);
}
static void static void
node_editor_window_set_property (GObject *object, node_editor_window_set_property (GObject *object,
guint prop_id, guint prop_id,
@@ -1691,6 +1660,8 @@ node_editor_window_class_init (NodeEditorWindowClass *class)
widget_class->realize = node_editor_window_realize; widget_class->realize = node_editor_window_realize;
widget_class->unrealize = node_editor_window_unrealize; widget_class->unrealize = node_editor_window_unrealize;
widget_class->map = node_editor_window_map;
properties[PROP_AUTO_RELOAD] = g_param_spec_boolean ("auto-reload", NULL, NULL, properties[PROP_AUTO_RELOAD] = g_param_spec_boolean ("auto-reload", NULL, NULL,
TRUE, TRUE,
G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME); G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME);
@@ -1794,16 +1765,16 @@ set_initial_text (NodeEditorWindow *self)
path = get_autosave_path (NULL); path = get_autosave_path (NULL);
path1 = get_autosave_path ("-unsafe"); path1 = get_autosave_path ("-unsafe");
if (g_file_get_contents (path1, &initial_text, &len, NULL)) if (g_file_get_contents (path, &initial_text, &len, NULL))
{
gtk_text_buffer_set_text (self->text_buffer, initial_text, len);
g_free (initial_text);
}
else if (g_file_get_contents (path1, &initial_text, &len, NULL))
{ {
self->auto_reload = FALSE; self->auto_reload = FALSE;
gtk_revealer_set_reveal_child (GTK_REVEALER (self->crash_warning), TRUE); gtk_revealer_set_reveal_child (GTK_REVEALER (self->crash_warning), TRUE);
gtk_text_buffer_set_text (self->text_buffer, initial_text, len);
g_free (initial_text);
}
else if (g_file_get_contents (path, &initial_text, &len, NULL))
{
gtk_text_buffer_set_text (self->text_buffer, initial_text, len); gtk_text_buffer_set_text (self->text_buffer, initial_text, len);
g_free (initial_text); g_free (initial_text);
} }
@@ -1854,6 +1825,41 @@ autosave_contents (NodeEditorWindow *self)
g_free (contents); g_free (contents);
} }
static void
mark_autosave_as_safe (void)
{
char *path1 = NULL;
char *path2 = NULL;
path1 = get_autosave_path ("-unsafe");
path2 = get_autosave_path (NULL);
g_rename (path1, path2);
}
static gboolean
update_timeout_cb (gpointer data)
{
NodeEditorWindow *self = data;
self->update_timeout = 0;
mark_autosave_as_safe ();
return G_SOURCE_REMOVE;
}
static void
initiate_autosave (NodeEditorWindow *self)
{
autosave_contents (self);
if (self->update_timeout != 0)
g_source_remove (self->update_timeout);
self->update_timeout = g_timeout_add (100, update_timeout_cb, self);
}
static void static void
node_editor_window_init (NodeEditorWindow *self) node_editor_window_init (NodeEditorWindow *self)
{ {
@@ -1918,7 +1924,7 @@ node_editor_window_init (NodeEditorWindow *self)
set_initial_text (self); set_initial_text (self);
g_signal_connect_swapped (self->text_buffer, "changed", G_CALLBACK (autosave_contents), self); g_signal_connect_swapped (self->text_buffer, "changed", G_CALLBACK (initiate_autosave), self);
if (g_getenv ("GSK_RENDERER")) if (g_getenv ("GSK_RENDERER"))
{ {
+4 -1
View File
@@ -10,6 +10,10 @@
<attribute name="label" translatable="yes">_Help</attribute> <attribute name="label" translatable="yes">_Help</attribute>
<attribute name="action">app.help</attribute> <attribute name="action">app.help</attribute>
</item> </item>
<item>
<attribute name="label" translatable="yes">_Help</attribute>
<attribute name="action">app.help</attribute>
</item>
<item> <item>
<attribute name="label" translatable="yes">_Inspector</attribute> <attribute name="label" translatable="yes">_Inspector</attribute>
<attribute name="action">app.inspector</attribute> <attribute name="action">app.inspector</attribute>
@@ -209,7 +213,6 @@
<property name="halign">1</property> <property name="halign">1</property>
<property name="label" translatable="1">The application may have crashed. <property name="label" translatable="1">The application may have crashed.
As a precaution, auto-loading has been turned off. As a precaution, auto-loading has been turned off.
You can turn it back on in the menu.
</property> </property>
</object> </object>
</child> </child>
+7 -12
View File
@@ -322,14 +322,12 @@ stroke bounds of the path.
### text ### text
| property | syntax | default | printed | | property | syntax | default | printed |
| ------------ | ------------------- | ------------------- | ----------- | | -------- | ------------------- | ------------------- | ----------- |
| color | `<color>` | black | non-default | | color | `<color>` | black | non-default |
| font | `<string>` `<url>`? | "Cantarell 15px" | always | | font | `<string>` `<url>`? | "Cantarell 11" | always |
| glyphs | `<glyphs>` | "Hello" | always | | glyphs | `<glyphs>` | "Hello" | always |
| offset | `<point>` | 0 0 | non-default | | offset | `<point>` | 0 0 | non-default |
| hint-style | `<hint style>` | slight | non-default |
| antialias | `<antialias>` | gray | non-default |
Creates a node like `gsk_text_node_new()` with the given properties. Creates a node like `gsk_text_node_new()` with the given properties.
@@ -338,15 +336,12 @@ font that is specified in the string. It can be either a data url containing
a base64-encoded font file, or a regular url that points to a font file. a base64-encoded font file, or a regular url that points to a font file.
Glyphs can be specified as an ASCII string, or as a comma-separated list of Glyphs can be specified as an ASCII string, or as a comma-separated list of
their glyph IDs. Optionally, the advance width, x and y offsets and flags can their glyph ID and advance width. Optionally, x and y offsets and flags can
be specified as well, like this: 40 10 0 0 color. be specified as well, like this: 40 10 0 0 color.
If the given font does not exist or the given glyphs are invalid for the given If the given font does not exist or the given glyphs are invalid for the given
font, an error node will be returned. font, an error node will be returned.
Possible values for hint-style are none, slight or full.
Possible value for antialias are none or gray.
### texture ### texture
| property | syntax | default | printed | | property | syntax | default | printed |
+3 -3
View File
@@ -69,9 +69,9 @@ Image:
4 CARD32 IMAGE_DATA_OFFSET 4 CARD32 IMAGE_DATA_OFFSET
ICON_FLAGS ICON_FLAGS
HAS_SUFFIX_XPM 1 HAS_SUFFIX_PNG 1
HAS_SUFFIX_SVG 2 HAS_SUFFIX_XPM 2
HAS_SUFFIX_PNG 4 HAS_SUFFIX_SVG 4
HAS_ICON_FILE 8 HAS_ICON_FILE 8
ImageData: ImageData:
-2
View File
@@ -25,8 +25,6 @@ base_url = "https://gitlab.gnome.org/GNOME/gtk/-/blob/main/"
[extra] [extra]
content_images = [ content_images = [
"../images/favicon.svg",
"../images/favicon-192x192.png",
"images/gtk-logo.svg", "images/gtk-logo.svg",
] ]
urlmap_file = "urlmap.js" urlmap_file = "urlmap.js"
-2
View File
@@ -24,8 +24,6 @@ base_url = "https://gitlab.gnome.org/GNOME/gtk/-/blob/main/"
[extra] [extra]
content_images = [ content_images = [
"../images/favicon.svg",
"../images/favicon-192x192.png",
"images/gtk-logo.svg", "images/gtk-logo.svg",
] ]
urlmap_file = "urlmap.js" urlmap_file = "urlmap.js"
-2
View File
@@ -67,8 +67,6 @@ content_files = [
"macos.md", "macos.md",
] ]
content_images = [ content_images = [
"../images/favicon.svg",
"../images/favicon-192x192.png",
"images/gtk-logo.svg", "images/gtk-logo.svg",
"images/rotated-text.png", "images/rotated-text.png",
"images/default_cursor.png", "images/default_cursor.png",
-2
View File
@@ -36,8 +36,6 @@ content_files = [
"paths.md", "paths.md",
] ]
content_images = [ content_images = [
"../images/favicon.svg",
"../images/favicon-192x192.png",
"gtk-logo.svg", "gtk-logo.svg",
"images/arc-dark.png", "images/arc-dark.png",
"images/arc-light.png", "images/arc-light.png",
+1 -1
View File
@@ -234,7 +234,7 @@ By default, GTK will try to build with support for the Vulkan graphics
API in addition to cairo and OpenGL. This option can be used to explicitly API in addition to cairo and OpenGL. This option can be used to explicitly
control whether Vulkan should be used. control whether Vulkan should be used.
### `media-gstreamer` ### `media-gstreamer` and `media-ffmpeg`
By default, GTK will try to build the gstreamer backend for By default, GTK will try to build the gstreamer backend for
media playback support. These options can be used to explicitly media playback support. These options can be used to explicitly
@@ -13,7 +13,6 @@ SYNOPSIS
| **gtk4-rendernode-tool** <COMMAND> [OPTIONS...] <FILE> | **gtk4-rendernode-tool** <COMMAND> [OPTIONS...] <FILE>
| |
| **gtk4-rendernode-tool** benchmark [OPTIONS...] <FILE> | **gtk4-rendernode-tool** benchmark [OPTIONS...] <FILE>
| **gtk4-rendernode-tool** compare [OPTIONS...] <FILE1> <FILE2>
| **gtk4-rendernode-tool** info [OPTIONS...] <FILE> | **gtk4-rendernode-tool** info [OPTIONS...] <FILE>
| **gtk4-rendernode-tool** render [OPTIONS...] <FILE> [<FILE>] | **gtk4-rendernode-tool** render [OPTIONS...] <FILE> [<FILE>]
| **gtk4-rendernode-tool** show [OPTIONS...] <FILE> | **gtk4-rendernode-tool** show [OPTIONS...] <FILE>
@@ -76,21 +75,7 @@ and prints the runtimes.
the execution of the commands on the GPU. It can be useful to use this flag to test the execution of the commands on the GPU. It can be useful to use this flag to test
command submission performance. command submission performance.
Compare
^^^^^^^
The ``compare`` command compares the rendering of a node with a reference image,
or the renderings of two nodes, or two images. If any differences are found, the
exit code is 1. If the images are identical, it is 0.
``--renderer=RENDERER``
Use the given renderer.
``--output=FILE``
Save the differences as a png image in ``FILE``.
``--quiet``
Don't write results to stdout.`
-2
View File
@@ -85,8 +85,6 @@ content_files = [
"visual_index.md", "visual_index.md",
] ]
content_images = [ content_images = [
"../images/favicon.svg",
"../images/favicon-192x192.png",
"images/aboutdialog.png", "images/aboutdialog.png",
"images/action-bar.png", "images/action-bar.png",
"images/appchooserbutton.png", "images/appchooserbutton.png",
+4 -11
View File
@@ -126,8 +126,8 @@ available on the system.
### `GTK_MEDIA` ### `GTK_MEDIA`
Specifies what backend to load for [class@Gtk.MediaFile]. The possible values Specifies what backend to load for [class@Gtk.MediaFile]. The possible values
depend on what options GTK was built with, and can include 'gstreamer' depend on what options GTK was built with, and can include 'gstreamer',
and 'none'. If set to 'none', media playback will be unavailable. 'ffmpeg' and 'none'. If set to 'none', media playback will be unavailable.
The special value 'help' can be used to obtain a list of all supported The special value 'help' can be used to obtain a list of all supported
media backends. media backends.
@@ -220,8 +220,8 @@ A number of options affect behavior instead of logging:
`gl-disable` `gl-disable`
: Disable OpenGL support : Disable OpenGL support
`gl-no-fractional` `gl-fractional`
: Disable fractional scaling for OpenGL. : Enable fractional scaling for OpenGL. This is experimental
`gl-debug` `gl-debug`
: Insert debugging information in OpenGL : Insert debugging information in OpenGL
@@ -460,13 +460,6 @@ disable certain optimizations of the "ngl" and "vulkan" renderer.
The special value `all` can be used to turn on all values. The special The special value `all` can be used to turn on all values. The special
value `help` can be used to obtain a list of all supported values. value `help` can be used to obtain a list of all supported values.
### `GSK_CACHE_TIMEOUT`
Overrides the timeout for cache GC in the "ngl" and "vulkan" renderers.
The value can be -1 to disable GC entirely, 0 to force GC to happen
before every frame, or a positive number to do GC in a timeout every
n seconds. The default timeout is 15 seconds.
### `GSK_MAX_TEXTURE_SIZE` ### `GSK_MAX_TEXTURE_SIZE`
Limit texture size to the minimum of this value and the OpenGL limit Limit texture size to the minimum of this value and the OpenGL limit
Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

-12
View File
@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.0" width="88.572334" height="96.050743" id="svg6843">
<defs id="defs6845"/>
<g transform="translate(-19.822308,-16.115941)" id="layer1">
<path d="M 20.88413,30.82696 53.816977,55.527708 107.33282,39.060543 70.587303,17.177763 20.88413,30.82696 z" id="path6976" style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"/>
<path d="m 22.94243,82.287118 -2.0583,-51.460158 32.932847,24.700748 0,55.577152 L 22.94243,82.287118 z" id="path6978" style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"/>
<path d="m 53.816977,111.10486 49.399213,-20.58416 4.11663,-51.460157 -53.515843,16.467165 0,55.577152 z" id="path6980" style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"/>
<path d="M 23.216626,81.319479 70.48573,67.361442 103.38422,90.444516" id="path6982" style="fill:none;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
<path d="m 70.434539,17.875593 0,49.109284" id="path6984" style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

+4 -2
View File
@@ -123,7 +123,7 @@ static const GdkDebugKey gdk_debug_keys[] = {
{ "portals", GDK_DEBUG_PORTALS, "Force use of portals" }, { "portals", GDK_DEBUG_PORTALS, "Force use of portals" },
{ "no-portals", GDK_DEBUG_NO_PORTALS, "Disable use of portals" }, { "no-portals", GDK_DEBUG_NO_PORTALS, "Disable use of portals" },
{ "gl-disable", GDK_DEBUG_GL_DISABLE, "Disable OpenGL support" }, { "gl-disable", GDK_DEBUG_GL_DISABLE, "Disable OpenGL support" },
{ "gl-no-fractional", GDK_DEBUG_GL_NO_FRACTIONAL, "Disable fractional scaling for OpenGL" }, { "gl-fractional", GDK_DEBUG_GL_FRACTIONAL, "Enable fractional scaling for OpenGL (experimental)" },
{ "gl-debug", GDK_DEBUG_GL_DEBUG, "Insert debugging information in OpenGL" }, { "gl-debug", GDK_DEBUG_GL_DEBUG, "Insert debugging information in OpenGL" },
{ "gl-disable-gl", GDK_DEBUG_GL_DISABLE_GL, "Only allow OpenGL GLES API" }, { "gl-disable-gl", GDK_DEBUG_GL_DISABLE_GL, "Only allow OpenGL GLES API" },
{ "gl-disable-gles", GDK_DEBUG_GL_DISABLE_GLES, "Don't allow OpenGL GLES API" }, { "gl-disable-gles", GDK_DEBUG_GL_DISABLE_GLES, "Don't allow OpenGL GLES API" },
@@ -222,6 +222,7 @@ gdk_parse_debug_var (const char *variable,
} }
else else
{ {
char *val = g_strndup (p, q - p);
for (i = 0; i < nkeys; i++) for (i = 0; i < nkeys; i++)
{ {
if (strlen (keys[i].key) == q - p && if (strlen (keys[i].key) == q - p &&
@@ -232,7 +233,8 @@ gdk_parse_debug_var (const char *variable,
} }
} }
if (i == nkeys) if (i == nkeys)
fprintf (stderr, "Unrecognized value \"%.*s\". Try %s=help\n", (int) (q - p), p, variable); fprintf (stderr, "Unrecognized value \"%s\". Try %s=help\n", val, variable);
g_free (val);
} }
p = q; p = q;
+1 -1
View File
@@ -43,7 +43,7 @@ typedef enum {
GDK_DEBUG_PORTALS = 1 << 14, GDK_DEBUG_PORTALS = 1 << 14,
GDK_DEBUG_NO_PORTALS = 1 << 15, GDK_DEBUG_NO_PORTALS = 1 << 15,
GDK_DEBUG_GL_DISABLE = 1 << 16, GDK_DEBUG_GL_DISABLE = 1 << 16,
GDK_DEBUG_GL_NO_FRACTIONAL= 1 << 17, GDK_DEBUG_GL_FRACTIONAL = 1 << 17,
GDK_DEBUG_GL_DISABLE_GL = 1 << 19, GDK_DEBUG_GL_DISABLE_GL = 1 << 19,
GDK_DEBUG_GL_DISABLE_GLES = 1 << 20, GDK_DEBUG_GL_DISABLE_GLES = 1 << 20,
+8 -67
View File
@@ -77,7 +77,6 @@ enum
PROP_0, PROP_0,
PROP_COMPOSITED, PROP_COMPOSITED,
PROP_RGBA, PROP_RGBA,
PROP_SHADOW_WIDTH,
PROP_INPUT_SHAPES, PROP_INPUT_SHAPES,
PROP_DMABUF_FORMATS, PROP_DMABUF_FORMATS,
LAST_PROP LAST_PROP
@@ -112,7 +111,6 @@ struct _GdkDisplayPrivate {
guint rgba : 1; guint rgba : 1;
guint composited : 1; guint composited : 1;
guint shadow_width: 1;
guint input_shapes : 1; guint input_shapes : 1;
GdkDebugFlags debug_flags; GdkDebugFlags debug_flags;
@@ -146,10 +144,6 @@ gdk_display_get_property (GObject *object,
g_value_set_boolean (value, gdk_display_is_rgba (display)); g_value_set_boolean (value, gdk_display_is_rgba (display));
break; break;
case PROP_SHADOW_WIDTH:
g_value_set_boolean (value, gdk_display_supports_shadow_width (display));
break;
case PROP_INPUT_SHAPES: case PROP_INPUT_SHAPES:
g_value_set_boolean (value, gdk_display_supports_input_shapes (display)); g_value_set_boolean (value, gdk_display_supports_input_shapes (display));
break; break;
@@ -249,18 +243,6 @@ gdk_display_class_init (GdkDisplayClass *class)
TRUE, TRUE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDisplay:shadow-width: (attributes org.gtk.Property.get=gdk_display_supports_shadow_width)
*
* %TRUE if the display supports extensible frames.
*
* Since: 4.14
*/
props[PROP_SHADOW_WIDTH] =
g_param_spec_boolean ("shadow-width", NULL, NULL,
TRUE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/** /**
* GdkDisplay:input-shapes: (attributes org.gtk.Property.get=gdk_display_supports_input_shapes) * GdkDisplay:input-shapes: (attributes org.gtk.Property.get=gdk_display_supports_input_shapes)
* *
@@ -272,7 +254,7 @@ gdk_display_class_init (GdkDisplayClass *class)
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/** /**
* GdkDisplay:dmabuf-formats: (attributes org.gtk.Property.get=gdk_display_get_dmabuf_formats) * GdkDisplay:dmabuf-formats:
* *
* The dma-buf formats that are supported on this display * The dma-buf formats that are supported on this display
* *
@@ -409,7 +391,6 @@ gdk_display_init (GdkDisplay *display)
priv->composited = TRUE; priv->composited = TRUE;
priv->rgba = TRUE; priv->rgba = TRUE;
priv->shadow_width = TRUE;
priv->input_shapes = TRUE; priv->input_shapes = TRUE;
} }
@@ -1382,7 +1363,7 @@ gdk_display_init_gl (GdkDisplay *self)
return; return;
} }
gdk_profiler_end_mark (before2, "Realize OpenGL context", NULL); gdk_profiler_end_mark (before2, "realize OpenGL context", NULL);
/* Only assign after realize, so GdkGLContext::realize() can use /* Only assign after realize, so GdkGLContext::realize() can use
* gdk_display_get_gl_context() == NULL to differentiate between * gdk_display_get_gl_context() == NULL to differentiate between
@@ -1392,7 +1373,7 @@ gdk_display_init_gl (GdkDisplay *self)
gdk_gl_backend_use (GDK_GL_CONTEXT_GET_CLASS (context)->backend_type); gdk_gl_backend_use (GDK_GL_CONTEXT_GET_CLASS (context)->backend_type);
gdk_profiler_end_mark (before, "Init OpenGL", NULL); gdk_profiler_end_mark (before, "initialize OpenGL", NULL);
} }
/** /**
@@ -1787,6 +1768,7 @@ gdk_display_init_egl (GdkDisplay *self,
{ {
GdkDisplayPrivate *priv = gdk_display_get_instance_private (self); GdkDisplayPrivate *priv = gdk_display_get_instance_private (self);
G_GNUC_UNUSED gint64 start_time = GDK_PROFILER_CURRENT_TIME; G_GNUC_UNUSED gint64 start_time = GDK_PROFILER_CURRENT_TIME;
G_GNUC_UNUSED gint64 start_time2;
int major, minor; int major, minor;
if (!gdk_gl_backend_can_be_used (GDK_GL_EGL, error)) if (!gdk_gl_backend_can_be_used (GDK_GL_EGL, error))
@@ -1813,6 +1795,7 @@ gdk_display_init_egl (GdkDisplay *self,
return FALSE; return FALSE;
} }
start_time2 = GDK_PROFILER_CURRENT_TIME;
if (!eglInitialize (priv->egl_display, &major, &minor)) if (!eglInitialize (priv->egl_display, &major, &minor))
{ {
priv->egl_display = NULL; priv->egl_display = NULL;
@@ -1821,6 +1804,7 @@ gdk_display_init_egl (GdkDisplay *self,
_("Could not initialize EGL display")); _("Could not initialize EGL display"));
return FALSE; return FALSE;
} }
gdk_profiler_end_mark (start_time2, "eglInitialize", NULL);
if (major < GDK_EGL_MIN_VERSION_MAJOR || if (major < GDK_EGL_MIN_VERSION_MAJOR ||
(major == GDK_EGL_MIN_VERSION_MAJOR && minor < GDK_EGL_MIN_VERSION_MINOR)) (major == GDK_EGL_MIN_VERSION_MAJOR && minor < GDK_EGL_MIN_VERSION_MINOR))
@@ -1910,7 +1894,7 @@ gdk_display_init_egl (GdkDisplay *self,
g_free (ext); g_free (ext);
} }
gdk_profiler_end_mark (start_time, "Init EGL", NULL); gdk_profiler_end_mark (start_time, "init EGL", NULL);
return TRUE; return TRUE;
} }
@@ -2037,12 +2021,9 @@ gdk_display_get_dmabuf_formats (GdkDisplay *display)
GdkDebugFlags GdkDebugFlags
gdk_display_get_debug_flags (GdkDisplay *display) gdk_display_get_debug_flags (GdkDisplay *display)
{ {
if (display == NULL)
return _gdk_debug_flags;
GdkDisplayPrivate *priv = gdk_display_get_instance_private (display); GdkDisplayPrivate *priv = gdk_display_get_instance_private (display);
return priv->debug_flags; return display ? priv->debug_flags : _gdk_debug_flags;
} }
void void
@@ -2144,46 +2125,6 @@ gdk_display_set_rgba (GdkDisplay *display,
g_object_notify_by_pspec (G_OBJECT (display), props[PROP_RGBA]); g_object_notify_by_pspec (G_OBJECT (display), props[PROP_RGBA]);
} }
/**
* gdk_display_supports_shadow_width: (attributes org.gtk.Method.get_property=shadow-width)
* @display: a `GdkDisplay`
*
* Returns whether it's possible for a surface to draw outside of the window area.
*
* If %TRUE is returned the application decides if it wants to draw shadows.
* If %FALSE is returned, the compositor decides if it wants to draw shadows.
*
* Returns: %TRUE if surfaces can draw shadows or
* %FALSE if the display does not support this functionality.
*
* Since: 4.14
*/
gboolean
gdk_display_supports_shadow_width (GdkDisplay *display)
{
GdkDisplayPrivate *priv = gdk_display_get_instance_private (display);
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
return priv->shadow_width;
}
void
gdk_display_set_shadow_width (GdkDisplay *display,
gboolean shadow_width)
{
GdkDisplayPrivate *priv = gdk_display_get_instance_private (display);
g_return_if_fail (GDK_IS_DISPLAY (display));
if (priv->shadow_width == shadow_width)
return;
priv->shadow_width = shadow_width;
g_object_notify_by_pspec (G_OBJECT (display), props[PROP_SHADOW_WIDTH]);
}
static void static void
device_removed_cb (GdkSeat *seat, device_removed_cb (GdkSeat *seat,
GdkDevice *device, GdkDevice *device,
-2
View File
@@ -63,8 +63,6 @@ GDK_AVAILABLE_IN_ALL
gboolean gdk_display_is_composited (GdkDisplay *display); gboolean gdk_display_is_composited (GdkDisplay *display);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
gboolean gdk_display_is_rgba (GdkDisplay *display); gboolean gdk_display_is_rgba (GdkDisplay *display);
GDK_AVAILABLE_IN_4_14
gboolean gdk_display_supports_shadow_width (GdkDisplay *display);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
gboolean gdk_display_supports_input_shapes (GdkDisplay *display); gboolean gdk_display_supports_input_shapes (GdkDisplay *display);
-2
View File
@@ -257,8 +257,6 @@ void gdk_display_set_composited (GdkDisplay *display
gboolean composited); gboolean composited);
void gdk_display_set_input_shapes (GdkDisplay *display, void gdk_display_set_input_shapes (GdkDisplay *display,
gboolean input_shapes); gboolean input_shapes);
void gdk_display_set_shadow_width (GdkDisplay *display,
gboolean shadow_width);
void gdk_display_add_seat (GdkDisplay *display, void gdk_display_add_seat (GdkDisplay *display,
GdkSeat *seat); GdkSeat *seat);
+1 -25
View File
@@ -2329,42 +2329,18 @@ gdk_dmabuf_sanitize (GdkDmabuf *dest,
* @dmabuf: a sanitized GdkDmabuf * @dmabuf: a sanitized GdkDmabuf
* *
* A dmabuf is considered disjoint if it uses more than * A dmabuf is considered disjoint if it uses more than
* 1 inode. * 1 file descriptor.
* Multiple file descriptors may exist when the creator
* of the dmabuf just dup()ed once for every plane...
* *
* Returns: %TRUE if the dmabuf is disjoint * Returns: %TRUE if the dmabuf is disjoint
**/ **/
gboolean gboolean
gdk_dmabuf_is_disjoint (const GdkDmabuf *dmabuf) gdk_dmabuf_is_disjoint (const GdkDmabuf *dmabuf)
{ {
struct stat first_stat;
unsigned i; unsigned i;
/* First, do a fast check */
for (i = 1; i < dmabuf->n_planes; i++) for (i = 1; i < dmabuf->n_planes; i++)
{ {
if (dmabuf->planes[0].fd != dmabuf->planes[i].fd) if (dmabuf->planes[0].fd != dmabuf->planes[i].fd)
break;
}
if (i == dmabuf->n_planes)
return FALSE;
/* We have different fds, do the fancy check instead */
if (fstat (dmabuf->planes[0].fd, &first_stat) != 0)
return TRUE;
for (i = 1; i < dmabuf->n_planes; i++)
{
struct stat plane_stat;
if (fstat (dmabuf->planes[0].fd, &plane_stat) != 0)
return TRUE;
if (first_stat.st_ino != plane_stat.st_ino)
return TRUE; return TRUE;
} }
+1 -12
View File
@@ -154,7 +154,6 @@ gdk_dmabuf_get_egl_downloader (GdkDisplay *display,
gboolean retval = FALSE; gboolean retval = FALSE;
GError *error = NULL; GError *error = NULL;
GskRenderer *renderer; GskRenderer *renderer;
GdkGLContext *previous;
g_assert (display->egl_dmabuf_formats == NULL); g_assert (display->egl_dmabuf_formats == NULL);
g_assert (display->egl_external_formats == NULL); g_assert (display->egl_external_formats == NULL);
@@ -162,7 +161,6 @@ gdk_dmabuf_get_egl_downloader (GdkDisplay *display,
if (!gdk_display_prepare_gl (display, NULL)) if (!gdk_display_prepare_gl (display, NULL))
return NULL; return NULL;
previous = gdk_gl_context_get_current ();
formats = gdk_dmabuf_formats_builder_new (); formats = gdk_dmabuf_formats_builder_new ();
external = gdk_dmabuf_formats_builder_new (); external = gdk_dmabuf_formats_builder_new ();
@@ -174,11 +172,7 @@ gdk_dmabuf_get_egl_downloader (GdkDisplay *display,
gdk_dmabuf_formats_builder_add_formats (builder, display->egl_dmabuf_formats); gdk_dmabuf_formats_builder_add_formats (builder, display->egl_dmabuf_formats);
if (!retval) if (!retval)
{ return NULL;
if (previous)
gdk_gl_context_make_current (previous);
return NULL;
}
renderer = gsk_gl_renderer_new (); renderer = gsk_gl_renderer_new ();
@@ -187,15 +181,10 @@ gdk_dmabuf_get_egl_downloader (GdkDisplay *display,
g_warning ("Failed to realize GL renderer: %s", error->message); g_warning ("Failed to realize GL renderer: %s", error->message);
g_error_free (error); g_error_free (error);
g_object_unref (renderer); g_object_unref (renderer);
if (previous)
gdk_gl_context_make_current (previous);
return NULL; return NULL;
} }
if (previous)
gdk_gl_context_make_current (previous);
return GDK_DMABUF_DOWNLOADER (renderer); return GDK_DMABUF_DOWNLOADER (renderer);
} }
-38
View File
@@ -217,41 +217,3 @@ gdk_dmabuf_formats_peek_formats (GdkDmabufFormats *self)
{ {
return self->formats; return self->formats;
} }
/**
* gdk_dmabuf_formats_equal:
* @formats1: (nullable): a `GdkDmabufFormats`
* @formats2: (nullable): another `GdkDmabufFormats`
*
* Returns whether @formats1 and @formats2 contain the
* same dmabuf formats, in the same order.
*
* Returns: `TRUE` if @formats1 and @formats2 are equal
*
* Since: 4.14
*/
gboolean
gdk_dmabuf_formats_equal (const GdkDmabufFormats *formats1,
const GdkDmabufFormats *formats2)
{
if (formats1 == formats2)
return TRUE;
if (formats1 == NULL || formats2 == NULL)
return FALSE;
if (formats1->n_formats != formats2->n_formats)
return FALSE;
for (gsize i = 0; i < formats1->n_formats; i++)
{
GdkDmabufFormat *f1 = &formats1->formats[i];
GdkDmabufFormat *f2 = &formats2->formats[i];
if (f1->fourcc != f2->fourcc ||
f1->modifier != f2->modifier)
return FALSE;
}
return TRUE;
}
-4
View File
@@ -51,8 +51,4 @@ gboolean gdk_dmabuf_formats_contains (GdkDmabufFormats *formats
guint32 fourcc, guint32 fourcc,
guint64 modifier) G_GNUC_PURE; guint64 modifier) G_GNUC_PURE;
GDK_AVAILABLE_IN_4_14
gboolean gdk_dmabuf_formats_equal (const GdkDmabufFormats *formats1,
const GdkDmabufFormats *formats2);
G_END_DECLS G_END_DECLS
+1 -2
View File
@@ -1,7 +1,6 @@
#pragma once #pragma once
#include "config.h" #ifdef HAVE_DMABUF
#ifdef HAVE_DRM_FOURCC_H
#include <drm_fourcc.h> #include <drm_fourcc.h>
#endif #endif
+1 -1
View File
@@ -33,7 +33,7 @@
/** /**
* GdkDmabufTexture: * GdkDmabufTexture:
* *
* A `GdkTexture` representing a DMA buffer. * A `GdkTexture` representing a dma-buf object.
* *
* To create a `GdkDmabufTexture`, use the auxiliary * To create a `GdkDmabufTexture`, use the auxiliary
* [class@Gdk.DmabufTextureBuilder] object. * [class@Gdk.DmabufTextureBuilder] object.
+42 -177
View File
@@ -309,202 +309,67 @@ typedef enum
* The color values are premultiplied with the alpha value. * The color values are premultiplied with the alpha value.
* @GDK_MEMORY_R8G8B8A8_PREMULTIPLIED: 4 bytes; for red, green, blue, alpha * @GDK_MEMORY_R8G8B8A8_PREMULTIPLIED: 4 bytes; for red, green, blue, alpha
* The color values are premultiplied with the alpha value. * The color values are premultiplied with the alpha value.
* @GDK_MEMORY_A8B8G8R8_PREMULTIPLIED: 4 bytes; for alpha, blue, green, red,
* The color values are premultiplied with the alpha value. Since 4.14
* @GDK_MEMORY_B8G8R8A8: 4 bytes; for blue, green, red, alpha. * @GDK_MEMORY_B8G8R8A8: 4 bytes; for blue, green, red, alpha.
* @GDK_MEMORY_A8R8G8B8: 4 bytes; for alpha, red, green, blue. * @GDK_MEMORY_A8R8G8B8: 4 bytes; for alpha, red, green, blue.
* @GDK_MEMORY_R8G8B8A8: 4 bytes; for red, green, blue, alpha. * @GDK_MEMORY_R8G8B8A8: 4 bytes; for red, green, blue, alpha.
* @GDK_MEMORY_A8B8G8R8: 4 bytes; for alpha, blue, green, red. * @GDK_MEMORY_A8B8G8R8: 4 bytes; for alpha, blue, green, red.
* @GDK_MEMORY_B8G8R8X8: 4 bytes; for blue, green, red, unused. Since 4.14
* @GDK_MEMORY_X8R8G8B8: 4 bytes; for unused, red, green, blue. Since 4.14
* @GDK_MEMORY_R8G8B8X8: 4 bytes; for red, green, blue, unused. Since 4.14
* @GDK_MEMORY_X8B8G8R8: 4 bytes; for unused, blue, green, red. Since 4.14
* @GDK_MEMORY_R8G8B8: 3 bytes; for red, green, blue. The data is opaque. * @GDK_MEMORY_R8G8B8: 3 bytes; for red, green, blue. The data is opaque.
* @GDK_MEMORY_B8G8R8: 3 bytes; for blue, green, red. The data is opaque. * @GDK_MEMORY_B8G8R8: 3 bytes; for blue, green, red. The data is opaque.
* @GDK_MEMORY_R16G16B16: 3 guint16 values; for red, green, blue. Since: 4.6
* @GDK_MEMORY_R16G16B16A16_PREMULTIPLIED: 4 guint16 values; for red, green,
* blue, alpha. The color values are premultiplied with the alpha value.
* Since: 4.6
* @GDK_MEMORY_R16G16B16A16: 4 guint16 values; for red, green, blue, alpha.
* Since: 4.6
* @GDK_MEMORY_R16G16B16_FLOAT: 3 half-float values; for red, green, blue.
* The data is opaque. Since: 4.6
* @GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED: 4 half-float values; for
* red, green, blue and alpha. The color values are premultiplied with
* the alpha value. Since: 4.6
* @GDK_MEMORY_R16G16B16A16_FLOAT: 4 half-float values; for red, green,
* blue and alpha. Since: 4.6
* @GDK_MEMORY_B32G32R32_FLOAT: 3 float values; for blue, green, red.
* The data is opaque. Since: 4.6
* @GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED: 4 float values; for
* red, green, blue and alpha. The color values are premultiplied with
* the alpha value. Since: 4.6
* @GDK_MEMORY_R32G32B32A32_FLOAT: 4 float values; for red, green, blue and
* alpha. Since: 4.6
* @GDK_MEMORY_G8A8_PREMULTIPLIED: 2 bytes; for grayscale, alpha. The color
* values are premultiplied with the alpha value. Since: 4.12
* @GDK_MEMORY_G8A8: 2 bytes; for grayscale, alpha. Since: 4.12
* @GDK_MEMORY_G8: One byte; for grayscale. The data is opaque.
* Since: 4.12
* @GDK_MEMORY_G16A16_PREMULTIPLIED: 2 guint16 values; for grayscale, alpha.
* The color values are premultiplied with the alpha value. Since: 4.12
* @GDK_MEMORY_G16A16: 2 guint16 values; for grayscale, alpha. Since: 4.12
* @GDK_MEMORY_G16: One guint16 value; for grayscale. The data is opaque.
* Since: 4.12
* @GDK_MEMORY_A8: One byte; for alpha.
* Since: 4.12
* @GDK_MEMORY_A16: One guint16 value; for alpha.
* Since: 4.12
* @GDK_MEMORY_N_FORMATS: The number of formats. This value will change as * @GDK_MEMORY_N_FORMATS: The number of formats. This value will change as
* more formats get added, so do not rely on its concrete integer. * more formats get added, so do not rely on its concrete integer.
* @GDK_MEMORY_R32G32B32_FLOAT: 3 float values; for red, green, blue.
* *
* `GdkMemoryFormat` describes formats that image data can have in memory. * `GdkMemoryFormat` describes formats that image data can have in memory.
* *
* It describes formats by listing the contents of the memory passed to it. * It describes formats by listing the contents of the memory passed to it.
* So `GDK_MEMORY_A8R8G8B8` will be 1 byte (8 bits) of alpha, followed by a * So GDK_MEMORY_A8R8G8B8 will be 1 byte (8 bits) of alpha, followed by a
* byte each of red, green and blue. It is not endian-dependent, so * byte each of red, green and blue. It is not endian-dependent, so
* `CAIRO_FORMAT_ARGB32` is represented by different `GdkMemoryFormats` * CAIRO_FORMAT_ARGB32 is represented by different `GdkMemoryFormats`
* on architectures with different endiannesses. * on architectures with different endiannesses.
* *
* Its naming is modelled after * Its naming is modelled after
* [VkFormat](https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VkFormat) * [VkFormat](https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VkFormat)
* for details). * for details).
*/ */
/**
* GDK_MEMORY_A8B8G8R8_PREMULTIPLIED:
*
* 4 bytes; for alpha, blue, green, red, The color values are premultiplied with
* the alpha value.
*
* Since: 4.14
*/
/**
* GDK_MEMORY_B8G8R8X8:
*
* 4 bytes; for blue, green, red, unused.
*
* Since: 4.14
*/
/**
* GDK_MEMORY_X8R8G8B8:
*
* 4 bytes; for unused, red, green, blue.
*
* Since: 4.14
*/
/**
* GDK_MEMORY_R8G8B8X8:
*
* 4 bytes; for red, green, blue, unused.
*
* Since: 4.14
*/
/**
* GDK_MEMORY_X8B8G8R8:
*
* 4 bytes; for unused, blue, green, red.
*
* Since: 4.14
*/
/**
* GDK_MEMORY_R16G16B16:
*
* 3 guint16 values; for red, green, blue.
*
* Since: 4.6
*/
/**
* GDK_MEMORY_R16G16B16A16_PREMULTIPLIED:
*
* 4 guint16 values; for red, green, blue, alpha. The color values are
* premultiplied with the alpha value.
*
* Since: 4.6
*/
/**
* GDK_MEMORY_R16G16B16A16:
*
* 4 guint16 values; for red, green, blue, alpha.
*
* Since: 4.6
*/
/**
* GDK_MEMORY_R16G16B16_FLOAT:
*
* 3 half-float values; for red, green, blue. The data is opaque.
*
* Since: 4.6
*/
/**
* GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED:
*
* 4 half-float values; for red, green, blue and alpha. The color values are
* premultiplied with the alpha value.
*
* Since: 4.6
*/
/**
* GDK_MEMORY_R16G16B16A16_FLOAT:
*
* 4 half-float values; for red, green, blue and alpha.
*
* Since: 4.6
*/
/**
* GDK_MEMORY_B32G32R32_FLOAT:
*
* 3 float values; for blue, green, red. The data is opaque.
*
* Since: 4.6
*/
/**
* GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED:
*
* 4 float values; for red, green, blue and alpha. The color values are
* premultiplied with the alpha value.
*
* Since: 4.6
*/
/**
* GDK_MEMORY_R32G32B32A32_FLOAT:
*
* 4 float values; for red, green, blue and alpha.
*
* Since: 4.6
*/
/**
* GDK_MEMORY_G8A8_PREMULTIPLIED:
*
* 2 bytes; for grayscale, alpha. The color values are premultiplied with the
* alpha value.
*
* Since: 4.12
*/
/**
* GDK_MEMORY_G8A8:
*
* 2 bytes; for grayscale, alpha.
*
* Since: 4.12
*/
/**
* GDK_MEMORY_G8:
*
* One byte; for grayscale. The data is opaque.
*
* Since: 4.12
*/
/**
* GDK_MEMORY_G16A16_PREMULTIPLIED:
*
* 2 guint16 values; for grayscale, alpha. The color values are premultiplied
* with the alpha value.
*
* Since: 4.12
*/
/**
* GDK_MEMORY_G16A16:
*
* 2 guint16 values; for grayscale, alpha.
*
* Since: 4.12
*/
/**
* GDK_MEMORY_G16:
*
* One guint16 value; for grayscale. The data is opaque.
*
* Since: 4.12
*/
/**
* GDK_MEMORY_A8:
*
* One byte; for alpha.
*
* Since: 4.12
*/
/**
* GDK_MEMORY_A16:
*
* One guint16 value; for alpha.
*
* Since: 4.12
*/
/**
* GDK_MEMORY_A16_FLOAT:
*
* One half-float value; for alpha.
*
* Since: 4.12
*/
/**
* GDK_MEMORY_A32_FLOAT:
*
* One float value; for alpha.
*
* Since: 4.12
*/
typedef enum { typedef enum {
GDK_MEMORY_B8G8R8A8_PREMULTIPLIED, GDK_MEMORY_B8G8R8A8_PREMULTIPLIED,
GDK_MEMORY_A8R8G8B8_PREMULTIPLIED, GDK_MEMORY_A8R8G8B8_PREMULTIPLIED,
+4 -4
View File
@@ -477,18 +477,18 @@ check_event_sanity (GdkEvent *event)
} }
#endif #endif
gboolean void
_gdk_event_emit (GdkEvent *event) _gdk_event_emit (GdkEvent *event)
{ {
#ifdef G_ENABLE_DEBUG #ifdef G_ENABLE_DEBUG
if (!check_event_sanity (event)) if (!check_event_sanity (event))
return FALSE; return;
#endif #endif
if (gdk_drag_handle_source_event (event)) if (gdk_drag_handle_source_event (event))
return TRUE; return;
return gdk_surface_handle_event (event); gdk_surface_handle_event (event);
} }
/********************************************* /*********************************************
+9 -9
View File
@@ -619,16 +619,16 @@ typedef enum
GdkEvent* _gdk_event_unqueue (GdkDisplay *display); GdkEvent* _gdk_event_unqueue (GdkDisplay *display);
gboolean _gdk_event_emit (GdkEvent *event); void _gdk_event_emit (GdkEvent *event);
GList* _gdk_event_queue_find_first (GdkDisplay *display); GList* _gdk_event_queue_find_first (GdkDisplay *display);
void _gdk_event_queue_remove_link (GdkDisplay *display, void _gdk_event_queue_remove_link (GdkDisplay *display,
GList *node); GList *node);
GList* _gdk_event_queue_append (GdkDisplay *display, GList* _gdk_event_queue_append (GdkDisplay *display,
GdkEvent *event); GdkEvent *event);
void _gdk_event_queue_handle_motion_compression (GdkDisplay *display); void _gdk_event_queue_handle_motion_compression (GdkDisplay *display);
void gdk_event_queue_handle_scroll_compression (GdkDisplay *display); void gdk_event_queue_handle_scroll_compression (GdkDisplay *display);
void _gdk_event_queue_flush (GdkDisplay *display); void _gdk_event_queue_flush (GdkDisplay *display);
double * gdk_event_dup_axes (GdkEvent *event); double * gdk_event_dup_axes (GdkEvent *event);
+34 -61
View File
@@ -79,23 +79,14 @@ static guint signals[LAST_SIGNAL];
static guint fps_counter; static guint fps_counter;
/* 60Hz plus some extra for monotonic time inaccuracy */ #define FRAME_HISTORY_MAX_LENGTH 128
#define FRAME_HISTORY_DEFAULT_LENGTH 64
#define frame_timings_unref(x) gdk_frame_timings_unref((GdkFrameTimings *) (x))
#define GDK_ARRAY_NAME timings
#define GDK_ARRAY_TYPE_NAME Timings
#define GDK_ARRAY_ELEMENT_TYPE GdkFrameTimings *
#define GDK_ARRAY_PREALLOC FRAME_HISTORY_DEFAULT_LENGTH
#define GDK_ARRAY_FREE_FUNC frame_timings_unref
#include "gdk/gdkarrayimpl.c"
struct _GdkFrameClockPrivate struct _GdkFrameClockPrivate
{ {
gint64 frame_counter; gint64 frame_counter;
int n_timings;
int current; int current;
Timings timings; GdkFrameTimings *timings[FRAME_HISTORY_MAX_LENGTH];
int n_freeze_inhibitors; int n_freeze_inhibitors;
}; };
@@ -108,8 +99,11 @@ static void
gdk_frame_clock_finalize (GObject *object) gdk_frame_clock_finalize (GObject *object)
{ {
GdkFrameClockPrivate *priv = GDK_FRAME_CLOCK (object)->priv; GdkFrameClockPrivate *priv = GDK_FRAME_CLOCK (object)->priv;
int i;
timings_clear (&priv->timings); for (i = 0; i < FRAME_HISTORY_MAX_LENGTH; i++)
if (priv->timings[i] != 0)
gdk_frame_timings_unref (priv->timings[i]);
G_OBJECT_CLASS (gdk_frame_clock_parent_class)->finalize (object); G_OBJECT_CLASS (gdk_frame_clock_parent_class)->finalize (object);
} }
@@ -263,8 +257,7 @@ gdk_frame_clock_init (GdkFrameClock *clock)
clock->priv = priv = gdk_frame_clock_get_instance_private (clock); clock->priv = priv = gdk_frame_clock_get_instance_private (clock);
priv->frame_counter = -1; priv->frame_counter = -1;
priv->current = 0; priv->current = FRAME_HISTORY_MAX_LENGTH - 1;
timings_init (&priv->timings);
if (fps_counter == 0) if (fps_counter == 0)
fps_counter = gdk_profiler_define_counter ("fps", "Frames per Second"); fps_counter = gdk_profiler_define_counter ("fps", "Frames per Second");
@@ -423,7 +416,7 @@ gdk_frame_clock_get_frame_counter (GdkFrameClock *frame_clock)
static inline gint64 static inline gint64
_gdk_frame_clock_get_history_start (GdkFrameClock *frame_clock) _gdk_frame_clock_get_history_start (GdkFrameClock *frame_clock)
{ {
return frame_clock->priv->frame_counter + 1 - timings_get_size (&frame_clock->priv->timings); return frame_clock->priv->frame_counter + 1 - frame_clock->priv->n_timings;
} }
/** /**
@@ -452,44 +445,31 @@ gdk_frame_clock_get_history_start (GdkFrameClock *frame_clock)
} }
void void
_gdk_frame_clock_begin_frame (GdkFrameClock *frame_clock, _gdk_frame_clock_begin_frame (GdkFrameClock *frame_clock)
gint64 monotonic_time)
{ {
GdkFrameClockPrivate *priv; GdkFrameClockPrivate *priv;
g_return_if_fail (GDK_IS_FRAME_CLOCK (frame_clock)); g_return_if_fail (GDK_IS_FRAME_CLOCK (frame_clock));
priv = frame_clock->priv; priv = frame_clock->priv;
priv->frame_counter++; priv->frame_counter++;
priv->current = (priv->current + 1) % FRAME_HISTORY_MAX_LENGTH;
if (G_UNLIKELY (timings_get_size (&priv->timings) == 0)) /* Try to steal the previous frame timing instead of discarding
timings_append (&priv->timings, _gdk_frame_timings_new (priv->frame_counter)); * and allocating a new one.
*/
if G_LIKELY (priv->n_timings == FRAME_HISTORY_MAX_LENGTH &&
_gdk_frame_timings_steal (priv->timings[priv->current],
priv->frame_counter))
return;
if (priv->n_timings < FRAME_HISTORY_MAX_LENGTH)
priv->n_timings++;
else else
{ gdk_frame_timings_unref (priv->timings[priv->current]);
GdkFrameTimings *timings;
priv->current = (priv->current + 1) % timings_get_size (&priv->timings); priv->timings[priv->current] = _gdk_frame_timings_new (priv->frame_counter);
timings = timings_get (&priv->timings, priv->current);
if (timings->frame_time + G_USEC_PER_SEC > monotonic_time)
{
/* Keep the timings, not a second old yet */
timings = _gdk_frame_timings_new (priv->frame_counter);
timings_splice (&priv->timings, priv->current, 0, FALSE, &timings, 1);
}
else if (_gdk_frame_timings_steal (timings, priv->frame_counter))
{
/* Stole the previous frame timing instead of discarding
* and allocating a new one, so nothing to do
*/
}
else
{
timings = _gdk_frame_timings_new (priv->frame_counter);
timings_splice (&priv->timings, priv->current, 1, FALSE, &timings, 1);
}
}
} }
static inline GdkFrameTimings * static inline GdkFrameTimings *
@@ -497,21 +477,17 @@ _gdk_frame_clock_get_timings (GdkFrameClock *frame_clock,
gint64 frame_counter) gint64 frame_counter)
{ {
GdkFrameClockPrivate *priv = frame_clock->priv; GdkFrameClockPrivate *priv = frame_clock->priv;
gsize size, pos; int pos;
if (frame_counter > priv->frame_counter) if (frame_counter > priv->frame_counter)
return NULL; return NULL;
size = timings_get_size (&priv->timings); if (frame_counter <= priv->frame_counter - priv->n_timings)
if (G_UNLIKELY (size == 0))
return NULL; return NULL;
if (priv->frame_counter - frame_counter >= size) pos = (priv->current - (priv->frame_counter - frame_counter) + FRAME_HISTORY_MAX_LENGTH) % FRAME_HISTORY_MAX_LENGTH;
return NULL;
pos = (priv->current - (priv->frame_counter - frame_counter) + size) % size; return priv->timings[pos];
return timings_get (&priv->timings, pos);
} }
/** /**
@@ -711,7 +687,7 @@ _gdk_frame_clock_emit_update (GdkFrameClock *frame_clock)
g_signal_emit (frame_clock, signals[UPDATE], 0); g_signal_emit (frame_clock, signals[UPDATE], 0);
gdk_profiler_end_mark (before, "Frameclock update", NULL); gdk_profiler_end_mark (before, "frameclock update", NULL);
} }
void void
@@ -723,7 +699,7 @@ _gdk_frame_clock_emit_layout (GdkFrameClock *frame_clock)
g_signal_emit (frame_clock, signals[LAYOUT], 0); g_signal_emit (frame_clock, signals[LAYOUT], 0);
gdk_profiler_end_mark (before, "Frameclock layout", NULL); gdk_profiler_end_mark (before, "frameclock layout", NULL);
} }
void void
@@ -735,7 +711,7 @@ _gdk_frame_clock_emit_paint (GdkFrameClock *frame_clock)
g_signal_emit (frame_clock, signals[PAINT], 0); g_signal_emit (frame_clock, signals[PAINT], 0);
gdk_profiler_end_mark (before, "Frameclock paint", NULL); gdk_profiler_end_mark (before, "frameclock paint", NULL);
} }
void void
@@ -803,10 +779,7 @@ gdk_frame_clock_get_fps (GdkFrameClock *frame_clock)
start_counter = _gdk_frame_clock_get_history_start (frame_clock); start_counter = _gdk_frame_clock_get_history_start (frame_clock);
end_counter = _gdk_frame_clock_get_frame_counter (frame_clock); end_counter = _gdk_frame_clock_get_frame_counter (frame_clock);
for (start = _gdk_frame_clock_get_timings (frame_clock, start_counter); start = _gdk_frame_clock_get_timings (frame_clock, start_counter);
end_counter > start_counter && start != NULL && !gdk_frame_timings_get_complete (start);
start = _gdk_frame_clock_get_timings (frame_clock, start_counter))
start_counter++;
for (end = _gdk_frame_clock_get_timings (frame_clock, end_counter); for (end = _gdk_frame_clock_get_timings (frame_clock, end_counter);
end_counter > start_counter && end != NULL && !gdk_frame_timings_get_complete (end); end_counter > start_counter && end != NULL && !gdk_frame_timings_get_complete (end);
end = _gdk_frame_clock_get_timings (frame_clock, end_counter)) end = _gdk_frame_clock_get_timings (frame_clock, end_counter))
@@ -838,12 +811,12 @@ _gdk_frame_clock_add_timings_to_profiler (GdkFrameClock *clock,
{ {
if (timings->drawn_time != 0) if (timings->drawn_time != 0)
{ {
gdk_profiler_add_mark (1000 * timings->drawn_time, 0, "Drawn window", NULL); gdk_profiler_add_mark (1000 * timings->drawn_time, 0, "drawn window", NULL);
} }
if (timings->presentation_time != 0) if (timings->presentation_time != 0)
{ {
gdk_profiler_add_mark (1000 * timings->presentation_time, 0, "Presented window", NULL); gdk_profiler_add_mark (1000 * timings->presentation_time, 0, "presented window", NULL);
} }
gdk_profiler_set_counter (fps_counter, gdk_frame_clock_get_fps (clock)); gdk_profiler_set_counter (fps_counter, gdk_frame_clock_get_fps (clock));
+2 -9
View File
@@ -192,13 +192,6 @@ compute_smooth_frame_time (GdkFrameClock *clock,
* and new_frame_time >= old_frame_time. */ * and new_frame_time >= old_frame_time. */
frames_passed = (new_frame_time - smoothed_frame_time_base + frame_interval / 2) / frame_interval; frames_passed = (new_frame_time - smoothed_frame_time_base + frame_interval / 2) / frame_interval;
if (frames_passed > 1)
gdk_profiler_add_markf ((smoothed_frame_time_base - (frame_interval * (frames_passed-1))) * 1000L,
frame_interval * (frames_passed-1) * 1000L,
"Dropped Frames",
"%u frames may have been dropped",
frames_passed-1);
/* We use an approximately whole number of frames in the future from /* We use an approximately whole number of frames in the future from
* last smoothed frame time. This way we avoid minor jitter in the * last smoothed frame time. This way we avoid minor jitter in the
* frame times making the animation speed uneven, but still animate * frame times making the animation speed uneven, but still animate
@@ -555,7 +548,7 @@ gdk_frame_clock_paint_idle (void *data)
priv->smoothed_frame_time_period = frame_interval; priv->smoothed_frame_time_period = frame_interval;
priv->smoothed_frame_time_reported = priv->smoothed_frame_time_base; priv->smoothed_frame_time_reported = priv->smoothed_frame_time_base;
_gdk_frame_clock_begin_frame (clock, priv->frame_time); _gdk_frame_clock_begin_frame (clock);
/* Note "current" is different now so timings != prev_timings */ /* Note "current" is different now so timings != prev_timings */
timings = gdk_frame_clock_get_current_timings (clock); timings = gdk_frame_clock_get_current_timings (clock);
@@ -701,7 +694,7 @@ gdk_frame_clock_paint_idle (void *data)
if (!gdk_frame_clock_idle_is_frozen (clock_idle)) if (!gdk_frame_clock_idle_is_frozen (clock_idle))
priv->sleep_serial = get_sleep_serial (); priv->sleep_serial = get_sleep_serial ();
gdk_profiler_end_mark (before, "Frameclock cycle", NULL); gdk_profiler_end_mark (before, "frameclock cycle", NULL);
return FALSE; return FALSE;
} }
+1 -2
View File
@@ -106,8 +106,7 @@ struct _GdkFrameTimings
void _gdk_frame_clock_inhibit_freeze (GdkFrameClock *clock); void _gdk_frame_clock_inhibit_freeze (GdkFrameClock *clock);
void _gdk_frame_clock_uninhibit_freeze (GdkFrameClock *clock); void _gdk_frame_clock_uninhibit_freeze (GdkFrameClock *clock);
void _gdk_frame_clock_begin_frame (GdkFrameClock *clock, void _gdk_frame_clock_begin_frame (GdkFrameClock *clock);
gint64 monotonic_time);
void _gdk_frame_clock_debug_print_timings (GdkFrameClock *clock, void _gdk_frame_clock_debug_print_timings (GdkFrameClock *clock,
GdkFrameTimings *timings); GdkFrameTimings *timings);
void _gdk_frame_clock_add_timings_to_profiler (GdkFrameClock *frame_clock, void _gdk_frame_clock_add_timings_to_profiler (GdkFrameClock *frame_clock,
+18 -7
View File
@@ -79,7 +79,6 @@
#include "gdkdebugprivate.h" #include "gdkdebugprivate.h"
#include "gdkdisplayprivate.h" #include "gdkdisplayprivate.h"
#include "gdkdmabufeglprivate.h" #include "gdkdmabufeglprivate.h"
#include "gdkdmabuffourccprivate.h"
#include "gdkmemoryformatprivate.h" #include "gdkmemoryformatprivate.h"
#include "gdkmemorytextureprivate.h" #include "gdkmemorytextureprivate.h"
#include "gdkprofilerprivate.h" #include "gdkprofilerprivate.h"
@@ -99,6 +98,10 @@
#include <epoxy/egl.h> #include <epoxy/egl.h>
#endif #endif
#ifdef HAVE_DMABUF
#include <drm_fourcc.h>
#endif
#include <math.h> #include <math.h>
#define DEFAULT_ALLOWED_APIS GDK_GL_API_GL | GDK_GL_API_GLES #define DEFAULT_ALLOWED_APIS GDK_GL_API_GL | GDK_GL_API_GLES
@@ -383,7 +386,7 @@ gdk_gl_context_create_egl_context (GdkGLContext *context,
else if (epoxy_has_egl_extension (egl_display, "EGL_EXT_swap_buffers_with_damage")) else if (epoxy_has_egl_extension (egl_display, "EGL_EXT_swap_buffers_with_damage"))
priv->eglSwapBuffersWithDamage = (gpointer) epoxy_eglGetProcAddress ("eglSwapBuffersWithDamageEXT"); priv->eglSwapBuffersWithDamage = (gpointer) epoxy_eglGetProcAddress ("eglSwapBuffersWithDamageEXT");
gdk_profiler_end_mark (start_time, "Create EGL context", NULL); gdk_profiler_end_mark (start_time, "realize GdkWaylandGLContext", NULL);
return api; return api;
} }
@@ -590,7 +593,7 @@ gdk_gl_context_get_scale (GdkGLContext *self)
scale = gdk_surface_get_scale (surface); scale = gdk_surface_get_scale (surface);
display = gdk_gl_context_get_display (self); display = gdk_gl_context_get_display (self);
if (gdk_display_get_debug_flags (display) & GDK_DEBUG_GL_NO_FRACTIONAL) if (!(gdk_display_get_debug_flags (display) & GDK_DEBUG_GL_FRACTIONAL))
scale = ceil (scale); scale = ceil (scale);
return scale; return scale;
@@ -658,7 +661,6 @@ gdk_gl_context_real_end_frame (GdkDrawContext *draw_context,
GdkSurface *surface = gdk_gl_context_get_surface (context); GdkSurface *surface = gdk_gl_context_get_surface (context);
GdkDisplay *display = gdk_surface_get_display (surface); GdkDisplay *display = gdk_surface_get_display (surface);
EGLSurface egl_surface; EGLSurface egl_surface;
G_GNUC_UNUSED gint64 begin_time = GDK_PROFILER_CURRENT_TIME;
if (priv->egl_context == NULL) if (priv->egl_context == NULL)
return; return;
@@ -667,6 +669,8 @@ gdk_gl_context_real_end_frame (GdkDrawContext *draw_context,
egl_surface = gdk_surface_get_egl_surface (surface); egl_surface = gdk_surface_get_egl_surface (surface);
gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "EGL", "swap buffers");
if (priv->eglSwapBuffersWithDamage) if (priv->eglSwapBuffersWithDamage)
{ {
EGLint stack_rects[4 * 4]; /* 4 rects */ EGLint stack_rects[4 * 4]; /* 4 rects */
@@ -697,8 +701,6 @@ gdk_gl_context_real_end_frame (GdkDrawContext *draw_context,
else else
eglSwapBuffers (gdk_display_get_egl_display (display), egl_surface); eglSwapBuffers (gdk_display_get_egl_display (display), egl_surface);
#endif #endif
gdk_profiler_add_mark (begin_time, GDK_PROFILER_CURRENT_TIME - begin_time, "EGL swap buffers", NULL);
} }
static void static void
@@ -1716,7 +1718,7 @@ gdk_gl_context_check_extensions (GdkGLContext *context)
} }
priv->has_half_float = gdk_gl_context_check_version (context, "3.0", "3.0") || priv->has_half_float = gdk_gl_context_check_version (context, "3.0", "3.0") ||
epoxy_has_gl_extension ("GL_OES_vertex_half_float"); epoxy_has_gl_extension ("OES_vertex_half_float");
priv->has_sync = gdk_gl_context_check_version (context, "3.2", "3.0") || priv->has_sync = gdk_gl_context_check_version (context, "3.2", "3.0") ||
epoxy_has_gl_extension ("GL_ARB_sync") || epoxy_has_gl_extension ("GL_ARB_sync") ||
@@ -2040,6 +2042,15 @@ gdk_gl_context_has_sync (GdkGLContext *self)
return priv->has_sync; return priv->has_sync;
} }
/* Return if GL_BGRA works with glTexImage2D */
gboolean
gdk_gl_context_has_bgra (GdkGLContext *self)
{
GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (self);
return priv->has_bgra;
}
/* Return if glGenVertexArrays, glBindVertexArray and glDeleteVertexArrays /* Return if glGenVertexArrays, glBindVertexArray and glDeleteVertexArrays
* can be used * can be used
*/ */
+2
View File
@@ -171,6 +171,8 @@ gboolean gdk_gl_context_has_vertex_half_float (GdkGLContext
gboolean gdk_gl_context_has_sync (GdkGLContext *self) G_GNUC_PURE; gboolean gdk_gl_context_has_sync (GdkGLContext *self) G_GNUC_PURE;
gboolean gdk_gl_context_has_bgra (GdkGLContext *self) G_GNUC_PURE;
gboolean gdk_gl_context_has_vertex_arrays (GdkGLContext *self) G_GNUC_PURE; gboolean gdk_gl_context_has_vertex_arrays (GdkGLContext *self) G_GNUC_PURE;
double gdk_gl_context_get_scale (GdkGLContext *self); double gdk_gl_context_get_scale (GdkGLContext *self);
+2 -74
View File
@@ -26,8 +26,6 @@
#include "gdkenumtypes.h" #include "gdkenumtypes.h"
#include "gdkrectangle.h" #include "gdkrectangle.h"
#include <math.h>
/** /**
* GdkMonitor: * GdkMonitor:
* *
@@ -48,7 +46,6 @@ enum {
PROP_MODEL, PROP_MODEL,
PROP_CONNECTOR, PROP_CONNECTOR,
PROP_SCALE_FACTOR, PROP_SCALE_FACTOR,
PROP_SCALE,
PROP_GEOMETRY, PROP_GEOMETRY,
PROP_WIDTH_MM, PROP_WIDTH_MM,
PROP_HEIGHT_MM, PROP_HEIGHT_MM,
@@ -73,8 +70,6 @@ static void
gdk_monitor_init (GdkMonitor *monitor) gdk_monitor_init (GdkMonitor *monitor)
{ {
monitor->scale_factor = 1; monitor->scale_factor = 1;
monitor->scale = 1.0;
monitor->scale_set = FALSE;
monitor->valid = TRUE; monitor->valid = TRUE;
} }
@@ -112,10 +107,6 @@ gdk_monitor_get_property (GObject *object,
g_value_set_int (value, monitor->scale_factor); g_value_set_int (value, monitor->scale_factor);
break; break;
case PROP_SCALE:
g_value_set_double (value, monitor->scale);
break;
case PROP_GEOMETRY: case PROP_GEOMETRY:
g_value_set_boxed (value, &monitor->geometry); g_value_set_boxed (value, &monitor->geometry);
break; break;
@@ -242,28 +233,13 @@ gdk_monitor_class_init (GdkMonitorClass *class)
* GdkMonitor:scale-factor: (attributes org.gtk.Property.get=gdk_monitor_get_scale_factor) * GdkMonitor:scale-factor: (attributes org.gtk.Property.get=gdk_monitor_get_scale_factor)
* *
* The scale factor. * The scale factor.
*
* The scale factor is the next larger integer,
* compared to [property@Gdk.Surface:scale].
*/ */
props[PROP_SCALE_FACTOR] = props[PROP_SCALE_FACTOR] =
g_param_spec_int ("scale-factor", NULL, NULL, g_param_spec_int ("scale-factor", NULL, NULL,
1, G_MAXINT, 0, G_MAXINT,
1, 1,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:scale: (attributes org.gtk.Property.get=gdk_monitor_get_scale)
*
* The scale of the monitor.
*
* Since: 4.14
*/
props[PROP_SCALE] =
g_param_spec_double ("scale", NULL, NULL,
1., G_MAXDOUBLE, 1.,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/** /**
* GdkMonitor:geometry: (attributes org.gtk.Property.get=gdk_monitor_get_geometry) * GdkMonitor:geometry: (attributes org.gtk.Property.get=gdk_monitor_get_geometry)
* *
@@ -370,7 +346,7 @@ gdk_monitor_get_display (GdkMonitor *monitor)
* display coordinate space. * display coordinate space.
* *
* The returned geometry is in application pixels, not in * The returned geometry is in application pixels, not in
* device pixels (see [method@Gdk.Monitor.get_scale]). * device pixels (see [method@Gdk.Monitor.get_scale_factor]).
*/ */
void void
gdk_monitor_get_geometry (GdkMonitor *monitor, gdk_monitor_get_geometry (GdkMonitor *monitor,
@@ -496,29 +472,6 @@ gdk_monitor_get_scale_factor (GdkMonitor *monitor)
return monitor->scale_factor; return monitor->scale_factor;
} }
/**
* gdk_monitor_get_scale: (attributes org.gtk.Method.get_property=scale)
* @monitor: a `GdkMonitor`
*
* Gets the internal scale factor that maps from monitor coordinates
* to device pixels.
*
* This can be used if you want to create pixel based data for a
* particular monitor, but most of the time youre drawing to a surface
* where it is better to use [method@Gdk.Surface.get_scale] instead.
*
* Returns: the scale
*
* Since: 4.14
*/
double
gdk_monitor_get_scale (GdkMonitor *monitor)
{
g_return_val_if_fail (GDK_IS_MONITOR (monitor), 1.);
return monitor->scale;
}
/** /**
* gdk_monitor_get_refresh_rate: (attributes org.gtk.Method.get_property=refresh-rate) * gdk_monitor_get_refresh_rate: (attributes org.gtk.Method.get_property=refresh-rate)
* @monitor: a `GdkMonitor` * @monitor: a `GdkMonitor`
@@ -630,37 +583,12 @@ void
gdk_monitor_set_scale_factor (GdkMonitor *monitor, gdk_monitor_set_scale_factor (GdkMonitor *monitor,
int scale_factor) int scale_factor)
{ {
g_return_if_fail (scale_factor >= 1);
if (monitor->scale_set)
return;
if (monitor->scale_factor == scale_factor) if (monitor->scale_factor == scale_factor)
return; return;
monitor->scale_factor = scale_factor; monitor->scale_factor = scale_factor;
monitor->scale = scale_factor;
g_object_notify (G_OBJECT (monitor), "scale-factor"); g_object_notify (G_OBJECT (monitor), "scale-factor");
g_object_notify (G_OBJECT (monitor), "scale");
}
void
gdk_monitor_set_scale (GdkMonitor *monitor,
double scale)
{
g_return_if_fail (scale >= 1.);
monitor->scale_set = TRUE;
if (monitor->scale == scale)
return;
monitor->scale = scale;
monitor->scale_factor = (int) ceil (scale);
g_object_notify (G_OBJECT (monitor), "scale");
g_object_notify (G_OBJECT (monitor), "scale-factor");
} }
void void
-2
View File
@@ -77,8 +77,6 @@ GDK_AVAILABLE_IN_ALL
const char * gdk_monitor_get_connector (GdkMonitor *monitor); const char * gdk_monitor_get_connector (GdkMonitor *monitor);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
int gdk_monitor_get_scale_factor (GdkMonitor *monitor); int gdk_monitor_get_scale_factor (GdkMonitor *monitor);
GDK_AVAILABLE_IN_4_14
double gdk_monitor_get_scale (GdkMonitor *monitor);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
int gdk_monitor_get_refresh_rate (GdkMonitor *monitor); int gdk_monitor_get_refresh_rate (GdkMonitor *monitor);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
+1 -5
View File
@@ -44,8 +44,6 @@ struct _GdkMonitor {
int refresh_rate; int refresh_rate;
GdkSubpixelLayout subpixel_layout; GdkSubpixelLayout subpixel_layout;
gboolean valid; gboolean valid;
double scale;
gboolean scale_set;
}; };
struct _GdkMonitorClass { struct _GdkMonitorClass {
@@ -66,9 +64,7 @@ void gdk_monitor_set_physical_size (GdkMonitor *monitor,
int width_mm, int width_mm,
int height_mm); int height_mm);
void gdk_monitor_set_scale_factor (GdkMonitor *monitor, void gdk_monitor_set_scale_factor (GdkMonitor *monitor,
int scale_factor); int scale);
void gdk_monitor_set_scale (GdkMonitor *monitor,
double scale);
void gdk_monitor_set_refresh_rate (GdkMonitor *monitor, void gdk_monitor_set_refresh_rate (GdkMonitor *monitor,
int refresh_rate); int refresh_rate);
void gdk_monitor_set_subpixel_layout (GdkMonitor *monitor, void gdk_monitor_set_subpixel_layout (GdkMonitor *monitor,
+6 -7
View File
@@ -32,7 +32,6 @@
#include "version/gdkversionmacros.h" #include "version/gdkversionmacros.h"
#include "gdkframeclockprivate.h" #include "gdkframeclockprivate.h"
#define CATEGORY "GTK"
gboolean gboolean
gdk_profiler_is_running (void) gdk_profiler_is_running (void)
@@ -51,7 +50,7 @@ void
const char *message) const char *message)
{ {
#ifdef HAVE_SYSPROF #ifdef HAVE_SYSPROF
sysprof_collector_mark (begin_time, duration, CATEGORY, name, message); sysprof_collector_mark (begin_time, duration, "gtk", name, message);
#endif #endif
} }
@@ -61,7 +60,7 @@ void
const char *message) const char *message)
{ {
#ifdef HAVE_SYSPROF #ifdef HAVE_SYSPROF
sysprof_collector_mark (begin_time, GDK_PROFILER_CURRENT_TIME - begin_time, CATEGORY, name, message); sysprof_collector_mark (begin_time, GDK_PROFILER_CURRENT_TIME - begin_time, "gtk", name, message);
#endif #endif
} }
@@ -75,7 +74,7 @@ void
#ifdef HAVE_SYSPROF #ifdef HAVE_SYSPROF
va_list args; va_list args;
va_start (args, message_format); va_start (args, message_format);
sysprof_collector_mark_vprintf (begin_time, duration, CATEGORY, name, message_format, args); sysprof_collector_mark_vprintf (begin_time, duration, "gtk", name, message_format, args);
va_end (args); va_end (args);
#endif /* HAVE_SYSPROF */ #endif /* HAVE_SYSPROF */
} }
@@ -89,7 +88,7 @@ void
#ifdef HAVE_SYSPROF #ifdef HAVE_SYSPROF
va_list args; va_list args;
va_start (args, message_format); va_start (args, message_format);
sysprof_collector_mark_vprintf (begin_time, GDK_PROFILER_CURRENT_TIME - begin_time, CATEGORY, name, message_format, args); sysprof_collector_mark_vprintf (begin_time, GDK_PROFILER_CURRENT_TIME - begin_time, "gtk", name, message_format, args);
va_end (args); va_end (args);
#endif /* HAVE_SYSPROF */ #endif /* HAVE_SYSPROF */
} }
@@ -104,7 +103,7 @@ guint
counter.id = sysprof_collector_request_counters (1); counter.id = sysprof_collector_request_counters (1);
counter.type = SYSPROF_CAPTURE_COUNTER_DOUBLE; counter.type = SYSPROF_CAPTURE_COUNTER_DOUBLE;
counter.value.vdbl = 0.0; counter.value.vdbl = 0.0;
g_strlcpy (counter.category, CATEGORY, sizeof counter.category); g_strlcpy (counter.category, "gtk", sizeof counter.category);
g_strlcpy (counter.name, name, sizeof counter.name); g_strlcpy (counter.name, name, sizeof counter.name);
g_strlcpy (counter.description, description, sizeof counter.name); g_strlcpy (counter.description, description, sizeof counter.name);
@@ -126,7 +125,7 @@ guint
counter.id = sysprof_collector_request_counters (1); counter.id = sysprof_collector_request_counters (1);
counter.type = SYSPROF_CAPTURE_COUNTER_INT64; counter.type = SYSPROF_CAPTURE_COUNTER_INT64;
counter.value.v64 = 0; counter.value.v64 = 0;
g_strlcpy (counter.category, CATEGORY, sizeof counter.category); g_strlcpy (counter.category, "gtk", sizeof counter.category);
g_strlcpy (counter.name, name, sizeof counter.name); g_strlcpy (counter.name, name, sizeof counter.name);
g_strlcpy (counter.description, description, sizeof counter.name); g_strlcpy (counter.description, description, sizeof counter.name);
+8 -108
View File
@@ -20,7 +20,6 @@
#include "gdksubsurfaceprivate.h" #include "gdksubsurfaceprivate.h"
#include "gdksurfaceprivate.h" #include "gdksurfaceprivate.h"
#include "gdktexture.h" #include "gdktexture.h"
#include "gsk/gskrectprivate.h"
G_DEFINE_TYPE (GdkSubsurface, gdk_subsurface, G_TYPE_OBJECT) G_DEFINE_TYPE (GdkSubsurface, gdk_subsurface, G_TYPE_OBJECT)
@@ -56,106 +55,19 @@ gdk_subsurface_get_parent (GdkSubsurface *subsurface)
return subsurface->parent; return subsurface->parent;
} }
static void
remove_subsurface (GdkSubsurface *subsurface)
{
GdkSurface *parent = subsurface->parent;
if (parent->subsurfaces_above == subsurface)
parent->subsurfaces_above = subsurface->sibling_above;
if (parent->subsurfaces_below == subsurface)
parent->subsurfaces_below = subsurface->sibling_below;
if (subsurface->sibling_above)
subsurface->sibling_above->sibling_below = subsurface->sibling_below;
if (subsurface->sibling_below)
subsurface->sibling_below->sibling_above = subsurface->sibling_above;
subsurface->sibling_above = NULL;
subsurface->sibling_below = NULL;
}
static void
insert_subsurface (GdkSubsurface *subsurface,
gboolean above,
GdkSubsurface *sibling)
{
GdkSurface *parent = subsurface->parent;
subsurface->above_parent = sibling->above_parent;
if (above)
{
subsurface->sibling_above = sibling->sibling_above;
sibling->sibling_above = subsurface;
subsurface->sibling_below = sibling;
if (subsurface->sibling_above)
subsurface->sibling_above->sibling_below = subsurface;
if (parent->subsurfaces_below == sibling)
parent->subsurfaces_below = subsurface;
}
else
{
subsurface->sibling_below = sibling->sibling_below;
sibling->sibling_below = subsurface;
subsurface->sibling_above = sibling;
if (subsurface->sibling_below)
subsurface->sibling_below->sibling_above = subsurface;
if (parent->subsurfaces_above == sibling)
parent->subsurfaces_above = subsurface;
}
}
gboolean gboolean
gdk_subsurface_attach (GdkSubsurface *subsurface, gdk_subsurface_attach (GdkSubsurface *subsurface,
GdkTexture *texture, GdkTexture *texture,
const graphene_rect_t *source, const graphene_rect_t *rect,
const graphene_rect_t *dest,
gboolean above, gboolean above,
GdkSubsurface *sibling) GdkSubsurface *sibling)
{ {
GdkSurface *parent = subsurface->parent;
g_return_val_if_fail (GDK_IS_SUBSURFACE (subsurface), FALSE); g_return_val_if_fail (GDK_IS_SUBSURFACE (subsurface), FALSE);
g_return_val_if_fail (GDK_IS_TEXTURE (texture), FALSE); g_return_val_if_fail (GDK_IS_TEXTURE (texture), FALSE);
g_return_val_if_fail (source != NULL && g_return_val_if_fail (rect != NULL, FALSE);
gsk_rect_contains_rect (&GRAPHENE_RECT_INIT (0, 0,
gdk_texture_get_width (texture),
gdk_texture_get_height (texture)),
source), FALSE);
g_return_val_if_fail (dest != NULL, FALSE);
g_return_val_if_fail (sibling != subsurface, FALSE);
g_return_val_if_fail (sibling == NULL || GDK_IS_SUBSURFACE (sibling), FALSE); g_return_val_if_fail (sibling == NULL || GDK_IS_SUBSURFACE (sibling), FALSE);
g_return_val_if_fail (sibling == NULL || sibling->parent == subsurface->parent, FALSE);
remove_subsurface (subsurface); return GDK_SUBSURFACE_GET_CLASS (subsurface)->attach (subsurface, texture, rect, above, sibling);
if (sibling)
{
insert_subsurface (subsurface, above, sibling);
}
else
{
sibling = above ? parent->subsurfaces_above : parent->subsurfaces_below;
if (sibling)
{
insert_subsurface (subsurface, !above, sibling);
}
else
{
subsurface->above_parent = above;
if (above)
parent->subsurfaces_above = subsurface;
else
parent->subsurfaces_below = subsurface;
}
}
return GDK_SUBSURFACE_GET_CLASS (subsurface)->attach (subsurface, texture, source, dest, above, sibling);
} }
void void
@@ -163,8 +75,6 @@ gdk_subsurface_detach (GdkSubsurface *subsurface)
{ {
g_return_if_fail (GDK_IS_SUBSURFACE (subsurface)); g_return_if_fail (GDK_IS_SUBSURFACE (subsurface));
remove_subsurface (subsurface);
GDK_SUBSURFACE_GET_CLASS (subsurface)->detach (subsurface); GDK_SUBSURFACE_GET_CLASS (subsurface)->detach (subsurface);
} }
@@ -177,23 +87,13 @@ gdk_subsurface_get_texture (GdkSubsurface *subsurface)
} }
void void
gdk_subsurface_get_source (GdkSubsurface *subsurface, gdk_subsurface_get_rect (GdkSubsurface *subsurface,
graphene_rect_t *source) graphene_rect_t *rect)
{ {
g_return_if_fail (GDK_IS_SUBSURFACE (subsurface)); g_return_if_fail (GDK_IS_SUBSURFACE (subsurface));
g_return_if_fail (source != NULL); g_return_if_fail (rect != NULL);
GDK_SUBSURFACE_GET_CLASS (subsurface)->get_source (subsurface, source); GDK_SUBSURFACE_GET_CLASS (subsurface)->get_rect (subsurface, rect);
}
void
gdk_subsurface_get_dest (GdkSubsurface *subsurface,
graphene_rect_t *dest)
{
g_return_if_fail (GDK_IS_SUBSURFACE (subsurface));
g_return_if_fail (dest != NULL);
GDK_SUBSURFACE_GET_CLASS (subsurface)->get_dest (subsurface, dest);
} }
gboolean gboolean
@@ -201,5 +101,5 @@ gdk_subsurface_is_above_parent (GdkSubsurface *subsurface)
{ {
g_return_val_if_fail (GDK_IS_SUBSURFACE (subsurface), TRUE); g_return_val_if_fail (GDK_IS_SUBSURFACE (subsurface), TRUE);
return subsurface->above_parent; return GDK_SUBSURFACE_GET_CLASS (subsurface)->is_above_parent (subsurface);
} }
+7 -16
View File
@@ -41,10 +41,6 @@ struct _GdkSubsurface
GdkSurface *parent; GdkSurface *parent;
int ref_count; int ref_count;
gboolean above_parent;
GdkSubsurface *sibling_above;
GdkSubsurface *sibling_below;
}; };
@@ -54,16 +50,14 @@ struct _GdkSubsurfaceClass
gboolean (* attach) (GdkSubsurface *subsurface, gboolean (* attach) (GdkSubsurface *subsurface,
GdkTexture *texture, GdkTexture *texture,
const graphene_rect_t *source, const graphene_rect_t *rect,
const graphene_rect_t *dest,
gboolean above, gboolean above,
GdkSubsurface *sibling); GdkSubsurface *sibling);
void (* detach) (GdkSubsurface *subsurface); void (* detach) (GdkSubsurface *subsurface);
GdkTexture * (* get_texture) (GdkSubsurface *subsurface); GdkTexture * (* get_texture) (GdkSubsurface *subsurface);
void (* get_source) (GdkSubsurface *subsurface, void (* get_rect) (GdkSubsurface *subsurface,
graphene_rect_t *source); graphene_rect_t *rect);
void (* get_dest) (GdkSubsurface *subsurface, gboolean (* is_above_parent) (GdkSubsurface *subsurface);
graphene_rect_t *dest);
}; };
GType gdk_subsurface_get_type (void) G_GNUC_CONST; GType gdk_subsurface_get_type (void) G_GNUC_CONST;
@@ -71,16 +65,13 @@ GType gdk_subsurface_get_type (void) G_GNUC_CONST;
GdkSurface * gdk_subsurface_get_parent (GdkSubsurface *subsurface); GdkSurface * gdk_subsurface_get_parent (GdkSubsurface *subsurface);
gboolean gdk_subsurface_attach (GdkSubsurface *subsurface, gboolean gdk_subsurface_attach (GdkSubsurface *subsurface,
GdkTexture *texture, GdkTexture *texture,
const graphene_rect_t *source, const graphene_rect_t *rect,
const graphene_rect_t *dest,
gboolean above, gboolean above,
GdkSubsurface *sibling); GdkSubsurface *sibling);
void gdk_subsurface_detach (GdkSubsurface *subsurface); void gdk_subsurface_detach (GdkSubsurface *subsurface);
GdkTexture * gdk_subsurface_get_texture (GdkSubsurface *subsurface); GdkTexture * gdk_subsurface_get_texture (GdkSubsurface *subsurface);
void gdk_subsurface_get_source (GdkSubsurface *subsurface, void gdk_subsurface_get_rect (GdkSubsurface *subsurface,
graphene_rect_t *source); graphene_rect_t *rect);
void gdk_subsurface_get_dest (GdkSubsurface *subsurface,
graphene_rect_t *dest);
gboolean gdk_subsurface_is_above_parent (GdkSubsurface *subsurface); gboolean gdk_subsurface_is_above_parent (GdkSubsurface *subsurface);
+2 -2
View File
@@ -2839,7 +2839,7 @@ add_event_mark (GdkEvent *event,
class = g_type_class_ref (GDK_TYPE_EVENT_TYPE); class = g_type_class_ref (GDK_TYPE_EVENT_TYPE);
value = g_enum_get_value (class, event_type); value = g_enum_get_value (class, event_type);
g_type_class_unref (class); g_type_class_unref (class);
kind = value ? value->value_nick : "Event"; kind = value ? value->value_nick : "event";
switch ((int) event_type) switch ((int) event_type)
{ {
@@ -2909,7 +2909,7 @@ add_event_mark (GdkEvent *event,
break; break;
} }
gdk_profiler_add_mark (time, end_time - time, "Event", message ? message : kind); gdk_profiler_add_mark (time, end_time - time, "event", message ? message : kind);
g_free (message); g_free (message);
#endif #endif
+2 -6
View File
@@ -99,12 +99,6 @@ struct _GdkSurface
GdkSeat *current_shortcuts_inhibited_seat; GdkSeat *current_shortcuts_inhibited_seat;
GPtrArray *subsurfaces; GPtrArray *subsurfaces;
/* We keep the subsurfaces above and below the surface in two linked
* lists, which start here.
*/
GdkSubsurface *subsurfaces_above;
GdkSubsurface *subsurfaces_below;
}; };
struct _GdkSurfaceClass struct _GdkSurfaceClass
@@ -351,6 +345,8 @@ void gdk_surface_request_motion (GdkSurface *surface);
gboolean gdk_surface_supports_edge_constraints (GdkSurface *surface); gboolean gdk_surface_supports_edge_constraints (GdkSurface *surface);
GdkSubsurface * gdk_surface_create_subsurface (GdkSurface *surface); GdkSubsurface * gdk_surface_create_subsurface (GdkSurface *surface);
void gdk_surface_destroy_subsurface (GdkSurface *surface,
GdkSubsurface *subsurface);
gsize gdk_surface_get_n_subsurfaces (GdkSurface *surface); gsize gdk_surface_get_n_subsurfaces (GdkSurface *surface);
GdkSubsurface * gdk_surface_get_subsurface (GdkSurface *surface, GdkSubsurface * gdk_surface_get_subsurface (GdkSurface *surface,
gsize idx); gsize idx);
-3
View File
@@ -142,9 +142,6 @@ gdk_toplevel_size_set_min_size (GdkToplevelSize *size,
* The shadow width corresponds to the part of the computed surface size * The shadow width corresponds to the part of the computed surface size
* that would consist of the shadow margin surrounding the window, would * that would consist of the shadow margin surrounding the window, would
* there be any. * there be any.
*
* Shadow width should only be set if
* [method@Gtk.Display.supports_shadow_width] is %TRUE.
*/ */
void void
gdk_toplevel_size_set_shadow_width (GdkToplevelSize *size, gdk_toplevel_size_set_shadow_width (GdkToplevelSize *size,
+2 -28
View File
@@ -260,11 +260,6 @@ gdk_vulkan_strerror (VkResult result)
case VK_ERROR_INCOMPATIBLE_SHADER_BINARY_EXT: case VK_ERROR_INCOMPATIBLE_SHADER_BINARY_EXT:
return "The provided binary shader code is not compatible with this device. (VK_ERROR_INCOMPATIBLE_SHADER_BINARY_EXT)"; return "The provided binary shader code is not compatible with this device. (VK_ERROR_INCOMPATIBLE_SHADER_BINARY_EXT)";
#endif #endif
#if VK_HEADER_VERSION >= 274
case VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR:
return "The specified Video Std parameters do not adhere to the syntactic or semantic requirements of the used video compression standard or implementation";
#endif
case VK_RESULT_MAX_ENUM: case VK_RESULT_MAX_ENUM:
default: default:
return "Unknown Vulkan error."; return "Unknown Vulkan error.";
@@ -598,8 +593,7 @@ physical_device_check_features (VkPhysicalDevice device,
v12_features.shaderStorageBufferArrayNonUniformIndexing) v12_features.shaderStorageBufferArrayNonUniformIndexing)
*out_features |= GDK_VULKAN_FEATURE_NONUNIFORM_INDEXING; *out_features |= GDK_VULKAN_FEATURE_NONUNIFORM_INDEXING;
if (ycbcr_features.samplerYcbcrConversion || if (ycbcr_features.samplerYcbcrConversion)
physical_device_supports_extension (device, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME))
*out_features |= GDK_VULKAN_FEATURE_YCBCR; *out_features |= GDK_VULKAN_FEATURE_YCBCR;
if (physical_device_supports_extension (device, VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME) && if (physical_device_supports_extension (device, VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME) &&
@@ -1472,27 +1466,13 @@ gdk_display_create_vulkan_device (GdkDisplay *display,
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_SWAPCHAIN_EXTENSION_NAME); g_ptr_array_add (device_extensions, (gpointer) VK_KHR_SWAPCHAIN_EXTENSION_NAME);
if (features & GDK_VULKAN_FEATURE_DESCRIPTOR_INDEXING) if (features & GDK_VULKAN_FEATURE_DESCRIPTOR_INDEXING)
g_ptr_array_add (device_extensions, (gpointer) VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); g_ptr_array_add (device_extensions, (gpointer) VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME);
if (features & GDK_VULKAN_FEATURE_YCBCR)
{
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
}
if (features & GDK_VULKAN_FEATURE_DMABUF) if (features & GDK_VULKAN_FEATURE_DMABUF)
{ {
g_assert (features & GDK_VULKAN_FEATURE_YCBCR);
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME); g_ptr_array_add (device_extensions, (gpointer) VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
g_ptr_array_add (device_extensions, (gpointer) VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME); g_ptr_array_add (device_extensions, (gpointer) VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME);
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME);
} }
if (features & (GDK_VULKAN_FEATURE_SEMAPHORE_IMPORT | GDK_VULKAN_FEATURE_SEMAPHORE_EXPORT)) if (features & (GDK_VULKAN_FEATURE_SEMAPHORE_IMPORT | GDK_VULKAN_FEATURE_SEMAPHORE_EXPORT))
{ g_ptr_array_add (device_extensions, (gpointer) VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
}
if (features & GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT) if (features & GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT)
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME); g_ptr_array_add (device_extensions, (gpointer) VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME);
@@ -1633,12 +1613,6 @@ gdk_display_create_vulkan_instance (GdkDisplay *display,
g_ptr_array_add (used_extensions, (gpointer) VK_EXT_DEBUG_REPORT_EXTENSION_NAME); g_ptr_array_add (used_extensions, (gpointer) VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
have_debug_report = TRUE; have_debug_report = TRUE;
} }
if (g_str_equal (extensions[i].extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME))
g_ptr_array_add (used_extensions, (gpointer) VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
if (g_str_equal (extensions[i].extensionName, VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME))
g_ptr_array_add (used_extensions, (gpointer) VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME);
if (g_str_equal (extensions[i].extensionName, VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME))
g_ptr_array_add (used_extensions, (gpointer) VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME);
} }
uint32_t n_layers; uint32_t n_layers;
+1 -1
View File
@@ -237,7 +237,7 @@ gdk_load_jpeg (GBytes *input_bytes,
g_bytes_unref (bytes); g_bytes_unref (bytes);
gdk_profiler_end_mark (before, "Load jpeg", NULL); gdk_profiler_end_mark (before, "jpeg load", NULL);
return texture; return texture;
} }
+1 -1
View File
@@ -304,7 +304,7 @@ gdk_load_png (GBytes *bytes,
{ {
gint64 end = GDK_PROFILER_CURRENT_TIME; gint64 end = GDK_PROFILER_CURRENT_TIME;
if (end - before > 500000) if (end - before > 500000)
gdk_profiler_add_mark (before, end - before, "Load png", NULL); gdk_profiler_add_mark (before, end - before, "png load", NULL);
} }
return texture; return texture;
+1 -1
View File
@@ -504,7 +504,7 @@ gdk_load_tiff (GBytes *input_bytes,
{ {
gint64 end = GDK_PROFILER_CURRENT_TIME; gint64 end = GDK_PROFILER_CURRENT_TIME;
if (end - before > 500000) if (end - before > 500000)
gdk_profiler_add_mark (before, end - before, "Load tiff", NULL); gdk_profiler_add_mark (before, end - before, "tiff load", NULL);
} }
return texture; return texture;
+66 -23
View File
@@ -214,6 +214,22 @@ typedef NSString *CALayerContentsGravity;
} }
} }
-(void)setFrame:(NSRect)frame display:(BOOL)display
{
NSRect contentRect = [self contentRectForFrameRect:frame];
GdkSurface *surface = GDK_SURFACE (gdk_surface);
gboolean maximized = (surface->state & GDK_TOPLEVEL_STATE_MAXIMIZED) != 0;
if (maximized && !inMaximizeTransition && !NSEqualRects (lastMaximizedFrame, frame))
{
gdk_synthesize_surface_state (surface, GDK_TOPLEVEL_STATE_MAXIMIZED, 0);
_gdk_surface_update_size (surface);
}
[super setFrame:frame display:display];
[[self contentView] setFrame:NSMakeRect (0, 0, contentRect.size.width, contentRect.size.height)];
}
-(id)initWithContentRect:(NSRect)contentRect -(id)initWithContentRect:(NSRect)contentRect
styleMask:(NSWindowStyleMask)styleMask styleMask:(NSWindowStyleMask)styleMask
backing:(NSBackingStoreType)backingType backing:(NSBackingStoreType)backingType
@@ -371,23 +387,19 @@ typedef NSString *CALayerContentsGravity;
-(void)windowDidMove:(NSNotification *)notification -(void)windowDidMove:(NSNotification *)notification
{ {
if ([self isZoomed])
gdk_synthesize_surface_state (GDK_SURFACE (gdk_surface), 0, GDK_TOPLEVEL_STATE_MAXIMIZED);
else
gdk_synthesize_surface_state (GDK_SURFACE (gdk_surface), GDK_TOPLEVEL_STATE_MAXIMIZED, 0);
_gdk_macos_surface_configure ([self gdkSurface]); _gdk_macos_surface_configure ([self gdkSurface]);
} }
-(void)windowDidResize:(NSNotification *)notification -(void)windowDidResize:(NSNotification *)notification
{ {
[self windowDidMove: notification]; _gdk_macos_surface_configure (gdk_surface);
/* If we're using server-side decorations, this notification is coming /* If we're using server-side decorations, this notification is coming
* in from a display-side change. We need to request a layout in * in from a display-side change. We need to request a layout in
* addition to the configure event. * addition to the configure event.
*/ */
if (GDK_IS_MACOS_TOPLEVEL_SURFACE (gdk_surface)) if (GDK_IS_MACOS_TOPLEVEL_SURFACE (gdk_surface) &&
GDK_MACOS_TOPLEVEL_SURFACE (gdk_surface)->decorated)
gdk_surface_request_layout (GDK_SURFACE (gdk_surface)); gdk_surface_request_layout (GDK_SURFACE (gdk_surface));
} }
@@ -402,6 +414,7 @@ typedef NSString *CALayerContentsGravity;
-(void)beginManualMove -(void)beginManualMove
{ {
gboolean maximized = GDK_SURFACE (gdk_surface)->state & GDK_TOPLEVEL_STATE_MAXIMIZED;
NSPoint initialMoveLocation; NSPoint initialMoveLocation;
GdkPoint point; GdkPoint point;
GdkMonitor *monitor; GdkMonitor *monitor;
@@ -420,6 +433,13 @@ typedef NSString *CALayerContentsGravity;
initialMoveLocation = [NSEvent mouseLocation]; initialMoveLocation = [NSEvent mouseLocation];
if (maximized)
[self setFrame:NSMakeRect (initialMoveLocation.x - (int)lastUnmaximizedFrame.size.width/2,
initialMoveLocation.y,
lastUnmaximizedFrame.size.width,
lastUnmaximizedFrame.size.height)
display:YES];
_gdk_macos_display_from_display_coords ([self gdkDisplay], _gdk_macos_display_from_display_coords ([self gdkDisplay],
initialMoveLocation.x, initialMoveLocation.x,
initialMoveLocation.y, initialMoveLocation.y,
@@ -762,11 +782,43 @@ typedef NSString *CALayerContentsGravity;
return rect; return rect;
} }
/* Implementing this method avoids new windows move around the screen. */
-(NSRect)windowWillUseStandardFrame:(NSWindow *)nsWindow -(NSRect)windowWillUseStandardFrame:(NSWindow *)nsWindow
defaultFrame:(NSRect)newFrame defaultFrame:(NSRect)newFrame
{ {
return newFrame; NSRect screenFrame = [[self screen] visibleFrame];
GdkMacosSurface *surface = gdk_surface;
gboolean maximized = GDK_SURFACE (surface)->state & GDK_TOPLEVEL_STATE_MAXIMIZED;
if (!maximized)
return screenFrame;
else
return lastUnmaximizedFrame;
}
-(BOOL)windowShouldZoom:(NSWindow *)nsWindow
toFrame:(NSRect)newFrame
{
GdkMacosSurface *surface = gdk_surface;
GdkToplevelState state = GDK_SURFACE (surface)->state;
if (state & GDK_TOPLEVEL_STATE_MAXIMIZED)
{
lastMaximizedFrame = newFrame;
}
else
{
lastUnmaximizedFrame = [nsWindow frame];
gdk_synthesize_surface_state (GDK_SURFACE (gdk_surface), 0, GDK_TOPLEVEL_STATE_MAXIMIZED);
}
inMaximizeTransition = YES;
return YES;
}
-(void)windowDidEndLiveResize:(NSNotification *)aNotification
{
inMaximizeTransition = NO;
} }
-(NSSize)window:(NSWindow *)window willUseFullScreenContentSize:(NSSize)proposedSize -(NSSize)window:(NSWindow *)window willUseFullScreenContentSize:(NSSize)proposedSize
@@ -823,21 +875,12 @@ typedef NSString *CALayerContentsGravity;
{ {
NSWindowStyleMask style_mask = [self styleMask]; NSWindowStyleMask style_mask = [self styleMask];
if (decorated) [self setHasShadow:decorated];
{
style_mask &= ~NSWindowStyleMaskFullSizeContentView;
[self setTitleVisibility:NSWindowTitleVisible];
}
else
{
style_mask |= NSWindowStyleMaskFullSizeContentView;
[self setTitleVisibility:NSWindowTitleHidden];
}
[self setTitlebarAppearsTransparent:!decorated]; if (decorated)
[[self standardWindowButton:NSWindowCloseButton] setHidden:!decorated]; style_mask |= NSWindowStyleMaskTitled;
[[self standardWindowButton:NSWindowMiniaturizeButton] setHidden:!decorated]; else
[[self standardWindowButton:NSWindowZoomButton] setHidden:!decorated]; style_mask &= ~NSWindowStyleMaskTitled;
[self setStyleMask:style_mask]; [self setStyleMask:style_mask];
} }
+3
View File
@@ -49,7 +49,10 @@
EdgeSnapping snapping; EdgeSnapping snapping;
NSRect lastUnmaximizedFrame;
NSRect lastMaximizedFrame;
NSRect lastUnfullscreenFrame; NSRect lastUnfullscreenFrame;
BOOL inMaximizeTransition;
BOOL inFullscreenTransition; BOOL inFullscreenTransition;
} }
-6
View File
@@ -271,11 +271,6 @@ _gdk_macos_cairo_context_end_frame (GdkDrawContext *draw_context,
[CATransaction commit]; [CATransaction commit];
} }
static void
_gdk_macos_cairo_context_empty_frame (GdkDrawContext *draw_context)
{
}
static void static void
_gdk_macos_cairo_context_surface_resized (GdkDrawContext *draw_context) _gdk_macos_cairo_context_surface_resized (GdkDrawContext *draw_context)
{ {
@@ -292,7 +287,6 @@ _gdk_macos_cairo_context_class_init (GdkMacosCairoContextClass *klass)
draw_context_class->begin_frame = _gdk_macos_cairo_context_begin_frame; draw_context_class->begin_frame = _gdk_macos_cairo_context_begin_frame;
draw_context_class->end_frame = _gdk_macos_cairo_context_end_frame; draw_context_class->end_frame = _gdk_macos_cairo_context_end_frame;
draw_context_class->empty_frame = _gdk_macos_cairo_context_empty_frame;
draw_context_class->surface_resized = _gdk_macos_cairo_context_surface_resized; draw_context_class->surface_resized = _gdk_macos_cairo_context_surface_resized;
cairo_context_class->cairo_create = _gdk_macos_cairo_context_cairo_create; cairo_context_class->cairo_create = _gdk_macos_cairo_context_cairo_create;
+1 -62
View File
@@ -151,57 +151,6 @@ create_blank_cursor (void)
return nscursor; return nscursor;
} }
static NSCursor *
create_cursor_from_texture (GdkTexture *texture,
int x,
int y)
{
guint32 width;
guint32 height;
guchar *pixels;
gsize stride;
GdkTextureDownloader *downloader;
NSCursor *nscursor;
NSBitmapImageRep *nsbitmap;
NSImage *nsimage;
if (texture == NULL)
return create_blank_cursor ();
width = gdk_texture_get_width (texture);
height = gdk_texture_get_height (texture);
nsbitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:width
pixelsHigh:height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bytesPerRow:0
bitsPerPixel:0];
pixels = [nsbitmap bitmapData];
stride = [nsbitmap bytesPerRow];
downloader = gdk_texture_downloader_new (texture);
gdk_texture_downloader_set_format (downloader, GDK_MEMORY_R8G8B8A8_PREMULTIPLIED);
gdk_texture_downloader_download_into (downloader,
pixels,
stride);
gdk_texture_downloader_free (downloader);
nsimage = [[NSImage alloc] init];
[nsimage addRepresentation:nsbitmap];
[nsimage setSize:NSMakeSize(width, height)];
[nsbitmap release];
nscursor = [[NSCursor alloc] initWithImage:nsimage
hotSpot:NSMakePoint(x, y)];
[nsimage release];
return nscursor;
}
NSCursor * NSCursor *
_gdk_macos_cursor_get_ns_cursor (GdkCursor *cursor) _gdk_macos_cursor_get_ns_cursor (GdkCursor *cursor)
{ {
@@ -212,17 +161,7 @@ _gdk_macos_cursor_get_ns_cursor (GdkCursor *cursor)
g_return_val_if_fail (!cursor || GDK_IS_CURSOR (cursor), NULL); g_return_val_if_fail (!cursor || GDK_IS_CURSOR (cursor), NULL);
if (cursor != NULL) if (cursor != NULL)
{ name = gdk_cursor_get_name (cursor);
name = gdk_cursor_get_name (cursor);
if (name == NULL)
{
nscursor = create_cursor_from_texture (gdk_cursor_get_texture (cursor),
gdk_cursor_get_hotspot_x (cursor),
gdk_cursor_get_hotspot_y (cursor));
return nscursor;
}
}
if (name == NULL) if (name == NULL)
goto load_cursor; goto load_cursor;
-1
View File
@@ -625,7 +625,6 @@ gdk_macos_display_init (GdkMacosDisplay *self)
gdk_display_set_composited (GDK_DISPLAY (self), TRUE); gdk_display_set_composited (GDK_DISPLAY (self), TRUE);
gdk_display_set_input_shapes (GDK_DISPLAY (self), FALSE); gdk_display_set_input_shapes (GDK_DISPLAY (self), FALSE);
gdk_display_set_rgba (GDK_DISPLAY (self), TRUE); gdk_display_set_rgba (GDK_DISPLAY (self), TRUE);
gdk_display_set_shadow_width (GDK_DISPLAY (self), FALSE);
} }
GdkDisplay * GdkDisplay *
+1 -8
View File
@@ -734,14 +734,7 @@ gdk_macos_event_source_dispatch (GSource *source,
if (event) if (event)
{ {
gboolean handled = _gdk_event_emit (event); _gdk_event_emit (event);
if (!handled)
{
NSEvent *nsevent = _gdk_macos_display_get_nsevent (event);
if (nsevent != NULL)
[NSApp sendEvent: nsevent];
}
gdk_event_unref (event); gdk_event_unref (event);
} }
-6
View File
@@ -545,11 +545,6 @@ gdk_macos_gl_context_end_frame (GdkDrawContext *context,
[CATransaction commit]; [CATransaction commit];
} }
static void
gdk_macos_gl_context_empty_frame (GdkDrawContext *draw_context)
{
}
static void static void
gdk_macos_gl_context_surface_resized (GdkDrawContext *draw_context) gdk_macos_gl_context_surface_resized (GdkDrawContext *draw_context)
{ {
@@ -672,7 +667,6 @@ gdk_macos_gl_context_class_init (GdkMacosGLContextClass *klass)
draw_context_class->begin_frame = gdk_macos_gl_context_begin_frame; draw_context_class->begin_frame = gdk_macos_gl_context_begin_frame;
draw_context_class->end_frame = gdk_macos_gl_context_end_frame; draw_context_class->end_frame = gdk_macos_gl_context_end_frame;
draw_context_class->empty_frame = gdk_macos_gl_context_empty_frame;
draw_context_class->surface_resized = gdk_macos_gl_context_surface_resized; draw_context_class->surface_resized = gdk_macos_gl_context_surface_resized;
gl_class->get_damage = gdk_macos_gl_context_get_damage; gl_class->get_damage = gdk_macos_gl_context_get_damage;
+171 -110
View File
@@ -96,26 +96,37 @@ _gdk_macos_toplevel_surface_unminimize (GdkMacosToplevelSurface *self)
[window deminiaturize:window]; [window deminiaturize:window];
} }
static gboolean static void
_gdk_macos_toplevel_surface_compute_size (GdkSurface *surface) _gdk_macos_toplevel_surface_present (GdkToplevel *toplevel,
GdkToplevelLayout *layout)
{ {
GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)surface; GdkSurface *surface = GDK_SURFACE (toplevel);
GdkMacosSurface *macos_surface = (GdkMacosSurface *)surface; GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)toplevel;
GdkToplevelSize size; NSWindow *nswindow = _gdk_macos_surface_get_native (GDK_MACOS_SURFACE (self));
GdkDisplay *display; GdkDisplay *display = gdk_surface_get_display (surface);
GdkMonitor *monitor; GdkMonitor *monitor;
GdkToplevelSize size;
int bounds_width, bounds_height; int bounds_width, bounds_height;
int width, height;
GdkGeometry geometry; GdkGeometry geometry;
GdkSurfaceHints mask; GdkSurfaceHints mask;
NSWindowStyleMask style_mask;
gboolean maximize;
gboolean fullscreen;
g_assert (GDK_IS_MACOS_TOPLEVEL_SURFACE (self)); g_assert (GDK_IS_MACOS_TOPLEVEL_SURFACE (self));
g_assert (GDK_IS_MACOS_WINDOW (nswindow));
if (!GDK_MACOS_SURFACE (surface)->geometry_dirty) if (layout != self->layout)
return FALSE; {
g_clear_pointer (&self->layout, gdk_toplevel_layout_unref);
self->layout = gdk_toplevel_layout_copy (layout);
}
GDK_MACOS_SURFACE (surface)->geometry_dirty = FALSE; _gdk_macos_toplevel_surface_attach_to_parent (self);
style_mask = [nswindow styleMask];
display = gdk_surface_get_display (surface);
monitor = gdk_display_get_monitor_at_surface (display, surface); monitor = gdk_display_get_monitor_at_surface (display, surface);
if (monitor) if (monitor)
@@ -133,127 +144,58 @@ _gdk_macos_toplevel_surface_compute_size (GdkSurface *surface)
} }
gdk_toplevel_size_init (&size, bounds_width, bounds_height); gdk_toplevel_size_init (&size, bounds_width, bounds_height);
gdk_toplevel_notify_compute_size (GDK_TOPLEVEL (surface), &size); gdk_toplevel_notify_compute_size (toplevel, &size);
g_warn_if_fail (size.width > 0); g_warn_if_fail (size.width > 0);
g_warn_if_fail (size.height > 0); g_warn_if_fail (size.height > 0);
width = size.width;
height = size.height;
if (self->layout != NULL && if (gdk_toplevel_layout_get_resizable (layout))
gdk_toplevel_layout_get_resizable (self->layout))
{ {
geometry.min_width = size.min_width; geometry.min_width = size.min_width;
geometry.min_height = size.min_height; geometry.min_height = size.min_height;
mask = GDK_HINT_MIN_SIZE; mask = GDK_HINT_MIN_SIZE;
/* Only set 'Resizable' mask to get native resize zones if the window is
* titled, otherwise we do this internally for CSD and do not need
* NSWindow to do it for us. Additionally, it can mess things up when
* doing a window resize since it can cause mouseDown to get passed
* through to the next window.
*/
if ((style_mask & NSWindowStyleMaskTitled) != 0)
style_mask |= NSWindowStyleMaskResizable;
else
style_mask &= ~NSWindowStyleMaskResizable;
} }
else else
{ {
geometry.max_width = geometry.min_width = size.width; geometry.max_width = geometry.min_width = width;
geometry.max_height = geometry.min_height = size.height; geometry.max_height = geometry.min_height = height;
mask = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE; mask = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE;
style_mask &= ~NSWindowStyleMaskResizable;
} }
if (style_mask != [nswindow styleMask])
[nswindow setStyleMask:style_mask];
if (size.shadow.is_valid) if (size.shadow.is_valid)
_gdk_macos_surface_set_shadow (macos_surface, _gdk_macos_surface_set_shadow (GDK_MACOS_SURFACE (surface),
size.shadow.top, size.shadow.top,
size.shadow.right, size.shadow.right,
size.shadow.bottom, size.shadow.bottom,
size.shadow.left); size.shadow.left);
_gdk_macos_surface_set_geometry_hints (macos_surface, &geometry, mask); _gdk_macos_surface_set_geometry_hints (GDK_MACOS_SURFACE (self), &geometry, mask);
gdk_surface_constrain_size (&geometry, mask, width, height, &width, &height);
if (surface->state & (GDK_TOPLEVEL_STATE_FULLSCREEN | GDK_DEBUG (MISC, "Resizing \"%s\" to %dx%d",
GDK_TOPLEVEL_STATE_MAXIMIZED | GDK_MACOS_SURFACE (self)->title ?
GDK_TOPLEVEL_STATE_TILED | GDK_MACOS_SURFACE (self)->title :
GDK_TOPLEVEL_STATE_TOP_TILED | "untitled",
GDK_TOPLEVEL_STATE_RIGHT_TILED | width, height);
GDK_TOPLEVEL_STATE_BOTTOM_TILED |
GDK_TOPLEVEL_STATE_LEFT_TILED |
GDK_TOPLEVEL_STATE_MINIMIZED) ||
[macos_surface->window inLiveResize])
return FALSE;
/* If we delayed a user resize until the beginning of the frame, _gdk_macos_surface_resize (GDK_MACOS_SURFACE (self), width, height);
* apply it now so we can start processing updates for it.
*/
if (macos_surface->next_layout.width > 0 &&
macos_surface->next_layout.height > 0)
{
int root_x = macos_surface->next_layout.root_x;
int root_y = macos_surface->next_layout.root_y;
int width = macos_surface->next_layout.width;
int height = macos_surface->next_layout.height;
gdk_surface_constrain_size (&geometry, mask,
width, height,
&width, &height);
macos_surface->next_layout.width = 0;
macos_surface->next_layout.height = 0;
_gdk_macos_surface_move_resize (macos_surface,
root_x, root_y,
width, height);
return FALSE;
}
gdk_surface_constrain_size (&geometry, mask,
size.width, size.height,
&size.width, &size.height);
if ((size.width != self->last_computed_width ||
size.height != self->last_computed_height) &&
(size.width != surface->width ||
size.height != surface->height))
{
self->last_computed_width = size.width;
self->last_computed_height = size.height;
_gdk_macos_surface_resize (macos_surface, size.width, size.height);
}
return FALSE;
}
static void
_gdk_macos_toplevel_surface_present (GdkToplevel *toplevel,
GdkToplevelLayout *layout)
{
GdkSurface *surface = GDK_SURFACE (toplevel);
GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)toplevel;
NSWindow *nswindow = _gdk_macos_surface_get_native (GDK_MACOS_SURFACE (self));
GdkDisplay *display = gdk_surface_get_display (surface);
NSWindowStyleMask style_mask;
gboolean maximize;
gboolean fullscreen;
g_assert (GDK_IS_MACOS_TOPLEVEL_SURFACE (self));
g_assert (GDK_IS_MACOS_WINDOW (nswindow));
if (layout != self->layout)
{
g_clear_pointer (&self->layout, gdk_toplevel_layout_unref);
self->layout = gdk_toplevel_layout_copy (layout);
}
_gdk_macos_toplevel_surface_attach_to_parent (self);
_gdk_macos_toplevel_surface_compute_size (surface);
/* Only set 'Resizable' mask to get native resize zones if the window is
* titled, otherwise we do this internally for CSD and do not need
* NSWindow to do it for us. Additionally, it can mess things up when
* doing a window resize since it can cause mouseDown to get passed
* through to the next window.
*/
style_mask = [nswindow styleMask];
if (gdk_toplevel_layout_get_resizable (layout) &&
(style_mask & NSWindowStyleMaskTitled) != 0)
style_mask |= NSWindowStyleMaskResizable;
else
style_mask &= ~NSWindowStyleMaskResizable;
if (style_mask != [nswindow styleMask])
[nswindow setStyleMask:style_mask];
/* Maximized state */ /* Maximized state */
if (gdk_toplevel_layout_get_maximized (layout, &maximize)) if (gdk_toplevel_layout_get_maximized (layout, &maximize))
@@ -436,6 +378,125 @@ _gdk_macos_toplevel_surface_hide (GdkSurface *surface)
GDK_SURFACE_CLASS (_gdk_macos_toplevel_surface_parent_class)->hide (surface); GDK_SURFACE_CLASS (_gdk_macos_toplevel_surface_parent_class)->hide (surface);
} }
static gboolean
_gdk_macos_toplevel_surface_compute_size (GdkSurface *surface)
{
GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)surface;
GdkMacosSurface *macos_surface = (GdkMacosSurface *)surface;
GdkToplevelSize size;
GdkDisplay *display;
GdkMonitor *monitor;
int bounds_width, bounds_height;
GdkGeometry geometry;
GdkSurfaceHints mask;
g_assert (GDK_IS_MACOS_TOPLEVEL_SURFACE (self));
if (!GDK_MACOS_SURFACE (surface)->geometry_dirty)
return FALSE;
GDK_MACOS_SURFACE (surface)->geometry_dirty = FALSE;
display = gdk_surface_get_display (surface);
monitor = gdk_display_get_monitor_at_surface (display, surface);
if (monitor)
{
GdkRectangle workarea;
gdk_macos_monitor_get_workarea (monitor, &workarea);
bounds_width = workarea.width;
bounds_height = workarea.height;
}
else
{
bounds_width = G_MAXINT;
bounds_height = G_MAXINT;
}
gdk_toplevel_size_init (&size, bounds_width, bounds_height);
gdk_toplevel_notify_compute_size (GDK_TOPLEVEL (surface), &size);
g_warn_if_fail (size.width > 0);
g_warn_if_fail (size.height > 0);
if (self->layout != NULL &&
gdk_toplevel_layout_get_resizable (self->layout))
{
geometry.min_width = size.min_width;
geometry.min_height = size.min_height;
mask = GDK_HINT_MIN_SIZE;
}
else
{
geometry.max_width = geometry.min_width = size.width;
geometry.max_height = geometry.min_height = size.height;
mask = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE;
}
if (size.shadow.is_valid)
_gdk_macos_surface_set_shadow (macos_surface,
size.shadow.top,
size.shadow.right,
size.shadow.bottom,
size.shadow.left);
_gdk_macos_surface_set_geometry_hints (macos_surface, &geometry, mask);
if (surface->state & (GDK_TOPLEVEL_STATE_FULLSCREEN |
GDK_TOPLEVEL_STATE_MAXIMIZED |
GDK_TOPLEVEL_STATE_TILED |
GDK_TOPLEVEL_STATE_TOP_TILED |
GDK_TOPLEVEL_STATE_RIGHT_TILED |
GDK_TOPLEVEL_STATE_BOTTOM_TILED |
GDK_TOPLEVEL_STATE_LEFT_TILED |
GDK_TOPLEVEL_STATE_MINIMIZED) ||
[macos_surface->window inLiveResize])
return FALSE;
/* If we delayed a user resize until the beginning of the frame,
* apply it now so we can start processing updates for it.
*/
if (macos_surface->next_layout.width > 0 &&
macos_surface->next_layout.height > 0)
{
int root_x = macos_surface->next_layout.root_x;
int root_y = macos_surface->next_layout.root_y;
int width = macos_surface->next_layout.width;
int height = macos_surface->next_layout.height;
gdk_surface_constrain_size (&geometry, mask,
width, height,
&width, &height);
macos_surface->next_layout.width = 0;
macos_surface->next_layout.height = 0;
_gdk_macos_surface_move_resize (macos_surface,
root_x, root_y,
width, height);
return FALSE;
}
gdk_surface_constrain_size (&geometry, mask,
size.width, size.height,
&size.width, &size.height);
if ((size.width != self->last_computed_width ||
size.height != self->last_computed_height) &&
(size.width != surface->width ||
size.height != surface->height))
{
self->last_computed_width = size.width;
self->last_computed_height = size.height;
_gdk_macos_surface_resize (macos_surface, size.width, size.height);
}
return FALSE;
}
static void static void
_gdk_macos_toplevel_surface_request_layout (GdkSurface *surface) _gdk_macos_toplevel_surface_request_layout (GdkSurface *surface)
{ {
+1 -1
View File
@@ -219,7 +219,7 @@ gdk_deps = [
platform_gio_dep, platform_gio_dep,
pangocairo_dep, pangocairo_dep,
vulkan_dep, vulkan_dep,
libdrm_dep, dmabuf_dep,
png_dep, png_dep,
tiff_dep, tiff_dep,
jpeg_dep, jpeg_dep,
+4 -4
View File
@@ -266,10 +266,10 @@ _XcursorReadUInt (XcursorFile *file, XcursorUInt *u)
if ((*file->read) (file, bytes, 4) != 4) if ((*file->read) (file, bytes, 4) != 4)
return XcursorFalse; return XcursorFalse;
*u = ((((unsigned int)(bytes[0])) << 0) | *u = ((bytes[0] << 0) |
(((unsigned int)(bytes[1])) << 8) | (bytes[1] << 8) |
(((unsigned int)(bytes[2])) << 16) | (bytes[2] << 16) |
(((unsigned int)(bytes[3])) << 24)); (bytes[3] << 24));
return XcursorTrue; return XcursorTrue;
} }
+2 -2
View File
@@ -186,7 +186,7 @@ gdk_wayland_cairo_context_end_frame (GdkDrawContext *draw_context,
gdk_wayland_surface_attach_image (surface, self->paint_surface, painted); gdk_wayland_surface_attach_image (surface, self->paint_surface, painted);
gdk_wayland_surface_request_frame (surface); gdk_wayland_surface_request_frame (surface);
gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "Wayland surface commit", NULL); gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "wayland", "surface commit");
gdk_wayland_surface_commit (surface); gdk_wayland_surface_commit (surface);
gdk_wayland_surface_notify_committed (surface); gdk_wayland_surface_notify_committed (surface);
@@ -206,7 +206,7 @@ gdk_wayland_cairo_context_empty_frame (GdkDrawContext *draw_context)
gdk_wayland_surface_sync (surface); gdk_wayland_surface_sync (surface);
gdk_wayland_surface_request_frame (surface); gdk_wayland_surface_request_frame (surface);
gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "Wayland surface commit", NULL); gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "wayland", "surface commit");
gdk_wayland_surface_commit (surface); gdk_wayland_surface_commit (surface);
gdk_wayland_surface_notify_committed (surface); gdk_wayland_surface_notify_committed (surface);
} }
+34 -50
View File
@@ -1253,7 +1253,7 @@ _gdk_wayland_display_load_cursor_theme (GdkWaylandDisplay *display_wayland)
gdk_wayland_display_set_cursor_theme (GDK_DISPLAY (display_wayland), name, size); gdk_wayland_display_set_cursor_theme (GDK_DISPLAY (display_wayland), name, size);
g_value_unset (&v); g_value_unset (&v);
gdk_profiler_end_mark (before, "Wayland cursor theme load", NULL); gdk_profiler_end_mark (before, "wayland", "load cursor theme");
} }
@@ -1795,7 +1795,7 @@ static TranslationEntry translations[] = {
{ FALSE, "org.gnome.desktop.wm.preferences", "action-middle-click-titlebar", "gtk-titlebar-middle-click", G_TYPE_STRING, { .s = "none" } }, { FALSE, "org.gnome.desktop.wm.preferences", "action-middle-click-titlebar", "gtk-titlebar-middle-click", G_TYPE_STRING, { .s = "none" } },
{ FALSE, "org.gnome.desktop.wm.preferences", "action-right-click-titlebar", "gtk-titlebar-right-click", G_TYPE_STRING, { .s = "menu" } }, { FALSE, "org.gnome.desktop.wm.preferences", "action-right-click-titlebar", "gtk-titlebar-right-click", G_TYPE_STRING, { .s = "menu" } },
{ FALSE, "org.gnome.desktop.a11y", "always-show-text-caret", "gtk-keynav-use-caret", G_TYPE_BOOLEAN, { .b = FALSE } }, { FALSE, "org.gnome.desktop.a11y", "always-show-text-caret", "gtk-keynav-use-caret", G_TYPE_BOOLEAN, { .b = FALSE } },
{ FALSE, "org.gnome.desktop.a11y.interface", "high-contrast", "high-contrast", G_TYPE_NONE, { .b = FALSE } }, { FALSE, "org.gnome.desktop.a11y.interface", "high-contrast", "high-contast", G_TYPE_NONE, { .b = FALSE } },
{ FALSE, "org.gnome.desktop.a11y.interface", "show-status-shapes", "gtk-show-status-shapes", G_TYPE_BOOLEAN, { .b = FALSE } }, { FALSE, "org.gnome.desktop.a11y.interface", "show-status-shapes", "gtk-show-status-shapes", G_TYPE_BOOLEAN, { .b = FALSE } },
/* Note, this setting doesn't exist, the portal and gsd fake it */ /* Note, this setting doesn't exist, the portal and gsd fake it */
{ FALSE, "org.gnome.fontconfig", "serial", "gtk-fontconfig-timestamp", G_TYPE_NONE, { .i = 0 } }, { FALSE, "org.gnome.fontconfig", "serial", "gtk-fontconfig-timestamp", G_TYPE_NONE, { .i = 0 } },
@@ -2430,49 +2430,15 @@ apply_monitor_change (GdkWaylandMonitor *monitor)
{ {
GDK_DEBUG (MISC, "monitor %d changed position %d %d, size %d %d", GDK_DEBUG (MISC, "monitor %d changed position %d %d, size %d %d",
monitor->id, monitor->id,
monitor->output_geometry.x, monitor->output_geometry.y, monitor->x, monitor->y,
monitor->output_geometry.width, monitor->output_geometry.height); monitor->width, monitor->height);
GdkRectangle logical_geometry; gdk_monitor_set_geometry (GDK_MONITOR (monitor),
gboolean needs_scaling = FALSE; &(GdkRectangle) {
double scale; monitor->x, monitor->y,
monitor->width, monitor->height });
if (monitor_has_xdg_output (monitor) &&
monitor->xdg_output_geometry.width != 0 &&
monitor->xdg_output_geometry.height != 0)
{
logical_geometry = monitor->xdg_output_geometry;
needs_scaling = logical_geometry.width == monitor->output_geometry.width &&
logical_geometry.height == monitor->output_geometry.height;
}
else
{
logical_geometry = monitor->output_geometry;
needs_scaling = TRUE;
}
if (needs_scaling)
{
int scale_factor = gdk_monitor_get_scale_factor (GDK_MONITOR (monitor));
logical_geometry.y /= scale_factor;
logical_geometry.x /= scale_factor;
logical_geometry.width /= scale_factor;
logical_geometry.height /= scale_factor;
scale = scale_factor;
}
else
{
scale = MAX (monitor->output_geometry.width / (double) logical_geometry.width,
monitor->output_geometry.height / (double) logical_geometry.height);
}
gdk_monitor_set_geometry (GDK_MONITOR (monitor), &logical_geometry);
gdk_monitor_set_connector (GDK_MONITOR (monitor), monitor->name); gdk_monitor_set_connector (GDK_MONITOR (monitor), monitor->name);
gdk_monitor_set_description (GDK_MONITOR (monitor), monitor->description); gdk_monitor_set_description (GDK_MONITOR (monitor), monitor->description);
gdk_monitor_set_scale (GDK_MONITOR (monitor), scale);
monitor->wl_output_done = FALSE; monitor->wl_output_done = FALSE;
monitor->xdg_output_done = FALSE; monitor->xdg_output_done = FALSE;
@@ -2490,8 +2456,8 @@ xdg_output_handle_logical_position (void *data,
GDK_DEBUG (MISC, "handle logical position xdg-output %d, position %d %d", GDK_DEBUG (MISC, "handle logical position xdg-output %d, position %d %d",
monitor->id, x, y); monitor->id, x, y);
monitor->xdg_output_geometry.x = x; monitor->x = x;
monitor->xdg_output_geometry.y = y; monitor->y = y;
} }
static void static void
@@ -2505,8 +2471,8 @@ xdg_output_handle_logical_size (void *data,
GDK_DEBUG (MISC, "handle logical size xdg-output %d, size %d %d", GDK_DEBUG (MISC, "handle logical size xdg-output %d, size %d %d",
monitor->id, width, height); monitor->id, width, height);
monitor->xdg_output_geometry.width = width; monitor->width = width;
monitor->xdg_output_geometry.height = height; monitor->height = height;
} }
static void static void
@@ -2592,8 +2558,8 @@ output_handle_geometry (void *data,
make, model, make, model,
transform_to_string (transform)); transform_to_string (transform));
monitor->output_geometry.x = x; monitor->x = x;
monitor->output_geometry.y = y; monitor->y = y;
switch (transform) switch (transform)
{ {
@@ -2637,12 +2603,28 @@ output_handle_scale (void *data,
int32_t scale) int32_t scale)
{ {
GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data; GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data;
GdkRectangle previous_geometry;
int previous_scale;
int width;
int height;
GDK_DEBUG (MISC, "handle scale output %d, scale %d", monitor->id, scale); GDK_DEBUG (MISC, "handle scale output %d, scale %d", monitor->id, scale);
gdk_monitor_get_geometry (GDK_MONITOR (monitor), &previous_geometry);
previous_scale = gdk_monitor_get_scale_factor (GDK_MONITOR (monitor));
/* Set the scale from wl_output protocol, regardless of xdg-output support */ /* Set the scale from wl_output protocol, regardless of xdg-output support */
gdk_monitor_set_scale_factor (GDK_MONITOR (monitor), scale); gdk_monitor_set_scale_factor (GDK_MONITOR (monitor), scale);
if (monitor_has_xdg_output (monitor))
return;
width = previous_geometry.width * previous_scale;
height = previous_geometry.height * previous_scale;
monitor->width = width / scale;
monitor->height = height / scale;
if (should_update_monitor (monitor)) if (should_update_monitor (monitor))
apply_monitor_change (monitor); apply_monitor_change (monitor);
} }
@@ -2656,6 +2638,7 @@ output_handle_mode (void *data,
int refresh) int refresh)
{ {
GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data; GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data;
int scale;
GDK_DEBUG (MISC, "handle mode output %d, size %d %d, rate %d", GDK_DEBUG (MISC, "handle mode output %d, size %d %d, rate %d",
monitor->id, width, height, refresh); monitor->id, width, height, refresh);
@@ -2663,8 +2646,9 @@ output_handle_mode (void *data,
if ((flags & WL_OUTPUT_MODE_CURRENT) == 0) if ((flags & WL_OUTPUT_MODE_CURRENT) == 0)
return; return;
monitor->output_geometry.width = width; scale = gdk_monitor_get_scale_factor (GDK_MONITOR (monitor));
monitor->output_geometry.height = height; monitor->width = width / scale;
monitor->height = height / scale;
gdk_monitor_set_refresh_rate (GDK_MONITOR (monitor), refresh); gdk_monitor_set_refresh_rate (GDK_MONITOR (monitor), refresh);
if (should_update_monitor (monitor) || !monitor_has_xdg_output (monitor)) if (should_update_monitor (monitor) || !monitor_has_xdg_output (monitor))
+2 -1
View File
@@ -87,8 +87,9 @@ static void
gdk_wayland_gl_context_empty_frame (GdkDrawContext *draw_context) gdk_wayland_gl_context_empty_frame (GdkDrawContext *draw_context)
{ {
GdkSurface *surface = gdk_draw_context_get_surface (draw_context); GdkSurface *surface = gdk_draw_context_get_surface (draw_context);
GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
if (gdk_wayland_surface_needs_commit (surface)) if (impl->has_pending_subsurface_commits)
{ {
gdk_wayland_surface_sync (surface); gdk_wayland_surface_sync (surface);
gdk_wayland_surface_request_frame (surface); gdk_wayland_surface_request_frame (surface);
+5 -4
View File
@@ -31,10 +31,11 @@ struct _GdkWaylandMonitor {
gboolean added; gboolean added;
struct zxdg_output_v1 *xdg_output; struct zxdg_output_v1 *xdg_output;
/* Raw wl_output data */ /* Size and position, can be either from wl_output or xdg_output */
GdkRectangle output_geometry; int32_t x;
/* Raw xdg_output data */ int32_t y;
GdkRectangle xdg_output_geometry; int32_t width;
int32_t height;
char *name; char *name;
char *description; char *description;
gboolean wl_output_done; gboolean wl_output_done;
+1 -1
View File
@@ -1012,7 +1012,7 @@ gdk_wayland_surface_create_xdg_popup (GdkWaylandPopup *wayland_popup,
} }
} }
gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "Wayland surface commit", NULL); gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "wayland", "surface commit");
wl_surface_commit (impl->display_server.wl_surface); wl_surface_commit (impl->display_server.wl_surface);
if (GDK_IS_POPUP (surface)) if (GDK_IS_POPUP (surface))
-1
View File
@@ -129,7 +129,6 @@ guint _gdk_wayland_cursor_get_next_image_index (GdkWaylandDisplay *display,
guint *next_image_delay); guint *next_image_delay);
void gdk_wayland_surface_sync (GdkSurface *surface); void gdk_wayland_surface_sync (GdkSurface *surface);
gboolean gdk_wayland_surface_needs_commit (GdkSurface *surface);
void gdk_wayland_surface_commit (GdkSurface *surface); void gdk_wayland_surface_commit (GdkSurface *surface);
void gdk_wayland_surface_notify_committed (GdkSurface *surface); void gdk_wayland_surface_notify_committed (GdkSurface *surface);
void gdk_wayland_surface_request_frame (GdkSurface *surface); void gdk_wayland_surface_request_frame (GdkSurface *surface);
+1 -4
View File
@@ -3629,10 +3629,7 @@ tablet_pad_handle_leave (void *data,
wp_tablet_pad, surface); wp_tablet_pad, surface);
if (pad->current_tablet) if (pad->current_tablet)
{ pad->current_tablet->pads = g_list_remove (pad->current_tablet->pads, pad);
pad->current_tablet->pads = g_list_remove (pad->current_tablet->pads, pad);
pad->current_tablet = NULL;
}
} }
static void static void
+2 -1
View File
@@ -22,11 +22,12 @@ struct _GdkWaylandSubsurface
GdkTexture *texture; GdkTexture *texture;
cairo_rectangle_int_t dest; cairo_rectangle_int_t dest;
graphene_rect_t source;
struct wl_region *opaque_region; struct wl_region *opaque_region;
struct wl_callback *frame_callback; struct wl_callback *frame_callback;
gboolean above_parent;
}; };
struct _GdkWaylandSubsurfaceClass struct _GdkWaylandSubsurfaceClass
+34 -46
View File
@@ -152,8 +152,7 @@ get_wl_buffer (GdkWaylandSubsurface *self,
static gboolean static gboolean
gdk_wayland_subsurface_attach (GdkSubsurface *sub, gdk_wayland_subsurface_attach (GdkSubsurface *sub,
GdkTexture *texture, GdkTexture *texture,
const graphene_rect_t *source, const graphene_rect_t *rect,
const graphene_rect_t *dest,
gboolean above, gboolean above,
GdkSubsurface *sibling) GdkSubsurface *sibling)
{ {
@@ -167,8 +166,8 @@ gdk_wayland_subsurface_attach (GdkSubsurface *sub,
graphene_rect_t device_rect; graphene_rect_t device_rect;
cairo_rectangle_int_t device_dest; cairo_rectangle_int_t device_dest;
if (sibling) if (sib)
will_be_above = sibling->above_parent; will_be_above = sib->above_parent;
else else
will_be_above = above; will_be_above = above;
@@ -178,37 +177,30 @@ gdk_wayland_subsurface_attach (GdkSubsurface *sub,
return FALSE; return FALSE;
} }
self->dest.x = dest->origin.x; self->dest.x = rect->origin.x;
self->dest.y = dest->origin.y; self->dest.y = rect->origin.y;
self->dest.width = dest->size.width; self->dest.width = rect->size.width;
self->dest.height = dest->size.height; self->dest.height = rect->size.height;
self->source.origin.x = source->origin.x;
self->source.origin.y = source->origin.y;
self->source.size.width = source->size.width;
self->source.size.height = source->size.height;
scale = gdk_fractional_scale_to_double (&parent->scale); scale = gdk_fractional_scale_to_double (&parent->scale);
device_rect.origin.x = rect->origin.x * scale;
device_rect.origin.x = dest->origin.x * scale; device_rect.origin.y = rect->origin.y * scale;
device_rect.origin.y = dest->origin.y * scale; device_rect.size.width = rect->size.width * scale;
device_rect.size.width = dest->size.width * scale; device_rect.size.height = rect->size.height * scale;
device_rect.size.height = dest->size.height * scale;
device_dest.x = device_rect.origin.x; device_dest.x = device_rect.origin.x;
device_dest.y = device_rect.origin.y; device_dest.y = device_rect.origin.y;
device_dest.width = device_rect.size.width; device_dest.width = device_rect.size.width;
device_dest.height = device_rect.size.height; device_dest.height = device_rect.size.height;
if (self->dest.x != dest->origin.x || if (self->dest.x != rect->origin.x ||
self->dest.y != dest->origin.y || self->dest.y != rect->origin.y ||
self->dest.width != dest->size.width || self->dest.width != rect->size.width ||
self->dest.height != dest->size.height) self->dest.height != rect->size.height)
{ {
GDK_DISPLAY_DEBUG (gdk_surface_get_display (sub->parent), OFFLOAD, GDK_DISPLAY_DEBUG (gdk_surface_get_display (sub->parent), OFFLOAD,
"Non-integer coordinates %g %g %g %g for %dx%d texture, hiding subsurface %p", "Non-integer coordinates %g %g %g %g for %dx%d texture, hiding subsurface %p",
dest->origin.x, dest->origin.y, rect->origin.x, rect->origin.y,
dest->size.width, dest->size.height, rect->size.width, rect->size.height,
gdk_texture_get_width (texture), gdk_texture_get_width (texture),
gdk_texture_get_height (texture), gdk_texture_get_height (texture),
self); self);
@@ -304,11 +296,6 @@ gdk_wayland_subsurface_attach (GdkSubsurface *sub,
{ {
wl_subsurface_set_position (self->subsurface, self->dest.x, self->dest.y); wl_subsurface_set_position (self->subsurface, self->dest.x, self->dest.y);
wp_viewport_set_destination (self->viewport, self->dest.width, self->dest.height); wp_viewport_set_destination (self->viewport, self->dest.width, self->dest.height);
wp_viewport_set_source (self->viewport,
wl_fixed_from_double (self->source.origin.x),
wl_fixed_from_double (self->source.origin.y),
wl_fixed_from_double (self->source.size.width),
wl_fixed_from_double (self->source.size.height));
if (buffer) if (buffer)
{ {
@@ -335,6 +322,8 @@ gdk_wayland_subsurface_attach (GdkSubsurface *sub,
wl_subsurface_place_above (self->subsurface, sib->surface); wl_subsurface_place_above (self->subsurface, sib->surface);
else else
wl_subsurface_place_below (self->subsurface, sib->surface); wl_subsurface_place_below (self->subsurface, sib->surface);
self->above_parent = sib->above_parent;
} }
else else
{ {
@@ -344,6 +333,7 @@ gdk_wayland_subsurface_attach (GdkSubsurface *sub,
else else
wl_subsurface_place_below (self->subsurface, wl_subsurface_place_below (self->subsurface,
GDK_WAYLAND_SURFACE (sub->parent)->display_server.wl_surface); GDK_WAYLAND_SURFACE (sub->parent)->display_server.wl_surface);
self->above_parent = above;
} }
wl_surface_commit (self->surface); wl_surface_commit (self->surface);
@@ -383,27 +373,23 @@ gdk_wayland_subsurface_get_texture (GdkSubsurface *sub)
} }
static void static void
gdk_wayland_subsurface_get_dest (GdkSubsurface *sub, gdk_wayland_subsurface_get_rect (GdkSubsurface *sub,
graphene_rect_t *dest) graphene_rect_t *rect)
{ {
GdkWaylandSubsurface *self = GDK_WAYLAND_SUBSURFACE (sub); GdkWaylandSubsurface *self = GDK_WAYLAND_SUBSURFACE (sub);
dest->origin.x = self->dest.x; rect->origin.x = self->dest.x;
dest->origin.y = self->dest.y; rect->origin.y = self->dest.y;
dest->size.width = self->dest.width; rect->size.width = self->dest.width;
dest->size.height = self->dest.height; rect->size.height = self->dest.height;
} }
static void static gboolean
gdk_wayland_subsurface_get_source (GdkSubsurface *sub, gdk_wayland_subsurface_is_above_parent (GdkSubsurface *sub)
graphene_rect_t *source)
{ {
GdkWaylandSubsurface *self = GDK_WAYLAND_SUBSURFACE (sub); GdkWaylandSubsurface *self = (GdkWaylandSubsurface *)sub;
source->origin.x = self->source.origin.x; return self->above_parent;
source->origin.y = self->source.origin.y;
source->size.width = self->source.size.width;
source->size.height = self->source.size.height;
} }
static void static void
@@ -417,8 +403,8 @@ gdk_wayland_subsurface_class_init (GdkWaylandSubsurfaceClass *class)
subsurface_class->attach = gdk_wayland_subsurface_attach; subsurface_class->attach = gdk_wayland_subsurface_attach;
subsurface_class->detach = gdk_wayland_subsurface_detach; subsurface_class->detach = gdk_wayland_subsurface_detach;
subsurface_class->get_texture = gdk_wayland_subsurface_get_texture; subsurface_class->get_texture = gdk_wayland_subsurface_get_texture;
subsurface_class->get_source = gdk_wayland_subsurface_get_source; subsurface_class->get_rect = gdk_wayland_subsurface_get_rect;
subsurface_class->get_dest = gdk_wayland_subsurface_get_dest; subsurface_class->is_above_parent = gdk_wayland_subsurface_is_above_parent;
}; };
static void static void
@@ -492,6 +478,8 @@ gdk_wayland_surface_create_subsurface (GdkSurface *surface)
wl_region_add (sub->opaque_region, 0, 0, G_MAXINT, G_MAXINT); wl_region_add (sub->opaque_region, 0, 0, G_MAXINT, G_MAXINT);
wl_surface_set_opaque_region (sub->surface, sub->opaque_region); wl_surface_set_opaque_region (sub->surface, sub->opaque_region);
sub->above_parent = TRUE;
GDK_DISPLAY_DEBUG (display, OFFLOAD, "Subsurface %p of surface %p created", sub, impl); GDK_DISPLAY_DEBUG (display, OFFLOAD, "Subsurface %p of surface %p created", sub, impl);
return GDK_SUBSURFACE (sub); return GDK_SUBSURFACE (sub);
+10 -31
View File
@@ -199,25 +199,19 @@ get_egl_window_size (GdkSurface *surface,
GdkDisplay *display = gdk_surface_get_display (surface); GdkDisplay *display = gdk_surface_get_display (surface);
GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface); GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
if (GDK_DISPLAY_DEBUG_CHECK (display, GL_NO_FRACTIONAL)) if (GDK_DISPLAY_DEBUG_CHECK (display, GL_FRACTIONAL))
{ {
*width = surface->width * gdk_fractional_scale_to_int (&impl->scale); GDK_DISPLAY_DEBUG (display, OPENGL, "Using fractional scale %g for EGL window", gdk_fractional_scale_to_double (&impl->scale));
*height = surface->height * gdk_fractional_scale_to_int (&impl->scale);
GDK_DISPLAY_DEBUG (display, OPENGL, "Using integer scale %d for EGL window (%d %d => %d %d)", *width = gdk_fractional_scale_scale (&impl->scale, surface->width),
gdk_fractional_scale_to_int (&impl->scale), *height = gdk_fractional_scale_scale (&impl->scale, surface->height);
surface->width, surface->height,
*width, *height);
} }
else else
{ {
*width = gdk_fractional_scale_scale (&impl->scale, surface->width), GDK_DISPLAY_DEBUG (display, OPENGL, "Using integer scale %d for EGL window", gdk_fractional_scale_to_int (&impl->scale));
*height = gdk_fractional_scale_scale (&impl->scale, surface->height);
GDK_DISPLAY_DEBUG (display, OPENGL, "Using fractional scale %g for EGL window (%d %d => %d %d)", *width = surface->width * gdk_fractional_scale_to_int (&impl->scale);
gdk_fractional_scale_to_double (&impl->scale), *height = surface->height * gdk_fractional_scale_to_int (&impl->scale);
surface->width, surface->height,
*width, *height);
} }
} }
@@ -280,7 +274,7 @@ gdk_wayland_surface_frame_callback (GdkSurface *surface,
GdkFrameClock *clock = gdk_surface_get_frame_clock (surface); GdkFrameClock *clock = gdk_surface_get_frame_clock (surface);
GdkFrameTimings *timings; GdkFrameTimings *timings;
gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "Wayland frame event", NULL); gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "wayland", "frame event");
GDK_DISPLAY_DEBUG (GDK_DISPLAY (display_wayland), EVENTS, "frame %p", surface); GDK_DISPLAY_DEBUG (GDK_DISPLAY (display_wayland), EVENTS, "frame %p", surface);
g_clear_pointer (&impl->frame_callback, wl_callback_destroy); g_clear_pointer (&impl->frame_callback, wl_callback_destroy);
@@ -652,12 +646,9 @@ gdk_wayland_surface_sync_opaque_region (GdkSurface *surface)
cairo_region_t *region = cairo_region_copy (impl->opaque_region); cairo_region_t *region = cairo_region_copy (impl->opaque_region);
for (gsize i = 0; i < gdk_surface_get_n_subsurfaces (surface); i++) for (gsize i = 0; i < gdk_surface_get_n_subsurfaces (surface); i++)
{ {
GdkSubsurface *subsurface = gdk_surface_get_subsurface (surface, i); GdkWaylandSubsurface *sub = (GdkWaylandSubsurface *)gdk_surface_get_subsurface (surface, i);
GdkWaylandSubsurface *sub = (GdkWaylandSubsurface *) subsurface; if (sub->above_parent)
if (subsurface->above_parent)
continue; continue;
if (sub->texture != NULL) if (sub->texture != NULL)
cairo_region_subtract_rectangle (region, &sub->dest); cairo_region_subtract_rectangle (region, &sub->dest);
} }
@@ -755,18 +746,6 @@ gdk_wayland_surface_sync (GdkSurface *surface)
gdk_wayland_surface_sync_viewport (surface); gdk_wayland_surface_sync_viewport (surface);
} }
gboolean
gdk_wayland_surface_needs_commit (GdkSurface *surface)
{
GdkWaylandSurface *self = GDK_WAYLAND_SURFACE (surface);
return self->has_pending_subsurface_commits ||
self->opaque_region_dirty ||
self->input_region_dirty ||
self->buffer_scale_dirty ||
self->viewport_dirty;
}
static void static void
gdk_wayland_surface_fractional_scale_preferred_scale_cb (void *data, gdk_wayland_surface_fractional_scale_preferred_scale_cb (void *data,
struct wp_fractional_scale_v1 *fractional_scale, struct wp_fractional_scale_v1 *fractional_scale,
+9 -49
View File
@@ -458,49 +458,6 @@ gdk_wayland_toplevel_compute_size (GdkSurface *surface)
return FALSE; return FALSE;
} }
static gboolean
has_per_edge_tiling_info (GdkToplevelState state)
{
return state & (GDK_TOPLEVEL_STATE_TOP_TILED |
GDK_TOPLEVEL_STATE_RIGHT_TILED |
GDK_TOPLEVEL_STATE_BOTTOM_TILED |
GDK_TOPLEVEL_STATE_LEFT_TILED);
}
static GdkToplevelState
infer_edge_constraints (GdkToplevelState state)
{
if (state & (GDK_TOPLEVEL_STATE_MAXIMIZED | GDK_TOPLEVEL_STATE_FULLSCREEN))
return state;
if (!(state & GDK_TOPLEVEL_STATE_TILED) || !has_per_edge_tiling_info (state))
return state |
GDK_TOPLEVEL_STATE_TOP_RESIZABLE |
GDK_TOPLEVEL_STATE_RIGHT_RESIZABLE |
GDK_TOPLEVEL_STATE_BOTTOM_RESIZABLE |
GDK_TOPLEVEL_STATE_LEFT_RESIZABLE;
if (!(state & GDK_TOPLEVEL_STATE_TOP_TILED))
state |= GDK_TOPLEVEL_STATE_TOP_RESIZABLE;
if (!(state & GDK_TOPLEVEL_STATE_RIGHT_TILED))
state |= GDK_TOPLEVEL_STATE_RIGHT_RESIZABLE;
if (!(state & GDK_TOPLEVEL_STATE_BOTTOM_TILED))
state |= GDK_TOPLEVEL_STATE_BOTTOM_RESIZABLE;
if (!(state & GDK_TOPLEVEL_STATE_LEFT_TILED))
state |= GDK_TOPLEVEL_STATE_LEFT_RESIZABLE;
return state;
}
static gboolean
supports_native_edge_constraints (GdkWaylandToplevel*toplevel)
{
struct gtk_surface1 *gtk_surface = toplevel->display_server.gtk_surface;
if (!gtk_surface)
return FALSE;
return gtk_surface1_get_version (gtk_surface) >= GTK_SURFACE1_CONFIGURE_EDGES_SINCE_VERSION;
}
static void static void
gdk_wayland_toplevel_handle_configure (GdkWaylandSurface *wayland_surface) gdk_wayland_toplevel_handle_configure (GdkWaylandSurface *wayland_surface)
{ {
@@ -518,9 +475,6 @@ gdk_wayland_toplevel_handle_configure (GdkWaylandSurface *wayland_surface)
new_state = wayland_toplevel->pending.state; new_state = wayland_toplevel->pending.state;
wayland_toplevel->pending.state = 0; wayland_toplevel->pending.state = 0;
if (!supports_native_edge_constraints (wayland_toplevel))
new_state = infer_edge_constraints (new_state);
is_resizing = wayland_toplevel->pending.is_resizing; is_resizing = wayland_toplevel->pending.is_resizing;
wayland_toplevel->pending.is_resizing = FALSE; wayland_toplevel->pending.is_resizing = FALSE;
@@ -876,7 +830,7 @@ gdk_wayland_surface_create_xdg_toplevel (GdkWaylandToplevel *wayland_toplevel)
maybe_set_gtk_surface_dbus_properties (wayland_toplevel); maybe_set_gtk_surface_dbus_properties (wayland_toplevel);
maybe_set_gtk_surface_modal (wayland_toplevel); maybe_set_gtk_surface_modal (wayland_toplevel);
gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "Wayland surface commit", NULL); gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "wayland", "surface commit");
wl_surface_commit (wayland_surface->display_server.wl_surface); wl_surface_commit (wayland_surface->display_server.wl_surface);
} }
@@ -2036,7 +1990,13 @@ gdk_wayland_toplevel_titlebar_gesture (GdkToplevel *toplevel,
static gboolean static gboolean
gdk_wayland_toplevel_supports_edge_constraints (GdkToplevel *toplevel) gdk_wayland_toplevel_supports_edge_constraints (GdkToplevel *toplevel)
{ {
return TRUE; GdkWaylandToplevel *wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel);
struct gtk_surface1 *gtk_surface = wayland_toplevel->display_server.gtk_surface;
if (!gtk_surface)
return FALSE;
return gtk_surface1_get_version (gtk_surface) >= GTK_SURFACE1_CONFIGURE_EDGES_SINCE_VERSION;
} }
static void static void
@@ -2707,7 +2667,7 @@ gdk_wayland_toplevel_set_transient_for_exported (GdkToplevel *toplevel,
g_return_val_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel), FALSE); g_return_val_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel), FALSE);
g_return_val_if_fail (GDK_IS_WAYLAND_DISPLAY (display), FALSE); g_return_val_if_fail (GDK_IS_WAYLAND_DISPLAY (display), FALSE);
if (!display_wayland->xdg_importer && !display_wayland->xdg_importer_v2) if (!display_wayland->xdg_importer)
{ {
g_warning ("Server is missing xdg_foreign support"); g_warning ("Server is missing xdg_foreign support");
return FALSE; return FALSE;
-6
View File
@@ -153,11 +153,6 @@ gdk_win32_cairo_context_end_frame (GdkDrawContext *draw_context,
g_clear_pointer (&self->window_surface, cairo_surface_destroy); g_clear_pointer (&self->window_surface, cairo_surface_destroy);
} }
static void
gdk_win32_cairo_context_empty_frame (GdkDrawContext *draw_context)
{
}
static cairo_t * static cairo_t *
gdk_win32_cairo_context_cairo_create (GdkCairoContext *context) gdk_win32_cairo_context_cairo_create (GdkCairoContext *context)
{ {
@@ -187,7 +182,6 @@ gdk_win32_cairo_context_class_init (GdkWin32CairoContextClass *klass)
draw_context_class->begin_frame = gdk_win32_cairo_context_begin_frame; draw_context_class->begin_frame = gdk_win32_cairo_context_begin_frame;
draw_context_class->end_frame = gdk_win32_cairo_context_end_frame; draw_context_class->end_frame = gdk_win32_cairo_context_end_frame;
draw_context_class->empty_frame = gdk_win32_cairo_context_empty_frame;
cairo_context_class->cairo_create = gdk_win32_cairo_context_cairo_create; cairo_context_class->cairo_create = gdk_win32_cairo_context_cairo_create;
} }
+10 -21
View File
@@ -892,11 +892,11 @@ pixbuf_to_hicon (GdkPixbuf *pixbuf,
int x, int x,
int y); int y);
HICON static GdkWin32HCursor *
_gdk_win32_create_hicon_for_texture (GdkTexture *texture, gdk_win32hcursor_create_for_texture (GdkWin32Display *display,
gboolean is_icon, GdkTexture *texture,
int x, int x,
int y) int y)
{ {
cairo_surface_t *surface; cairo_surface_t *surface;
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
@@ -906,24 +906,13 @@ _gdk_win32_create_hicon_for_texture (GdkTexture *texture,
surface = gdk_texture_download_surface (texture); surface = gdk_texture_download_surface (texture);
width = cairo_image_surface_get_width (surface); width = cairo_image_surface_get_width (surface);
height = cairo_image_surface_get_height (surface); height = cairo_image_surface_get_height (surface);
pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, width, height); pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, width, height);
icon = pixbuf_to_hicon (pixbuf, is_icon, x, y); icon = pixbuf_to_hicon (pixbuf, FALSE, x, y);
g_object_unref (pixbuf); g_object_unref (pixbuf);
return icon;
}
static GdkWin32HCursor *
gdk_win32hcursor_create_for_texture (GdkWin32Display *display,
GdkTexture *texture,
int x,
int y)
{
HICON icon = _gdk_win32_create_hicon_for_texture (texture, FALSE, x, y);
return gdk_win32_hcursor_new (display, (HCURSOR) icon, TRUE); return gdk_win32_hcursor_new (display, (HCURSOR) icon, TRUE);
} }
-1
View File
@@ -1064,7 +1064,6 @@ gdk_win32_display_check_composited (GdkWin32Display *display)
} }
gdk_display_set_composited (GDK_DISPLAY (display), composited); gdk_display_set_composited (GDK_DISPLAY (display), composited);
gdk_display_set_shadow_width (GDK_DISPLAY (display), composited);
} }
static void static void
-6
View File
@@ -117,11 +117,6 @@ gdk_win32_gl_context_egl_begin_frame (GdkDrawContext *draw_context,
GDK_DRAW_CONTEXT_CLASS (gdk_win32_gl_context_egl_parent_class)->begin_frame (draw_context, depth, update_area); GDK_DRAW_CONTEXT_CLASS (gdk_win32_gl_context_egl_parent_class)->begin_frame (draw_context, depth, update_area);
} }
static void
gdk_win32_gl_context_egl_empty_frame (GdkDrawContext *draw_context)
{
}
static void static void
gdk_win32_gl_context_egl_class_init (GdkWin32GLContextClass *klass) gdk_win32_gl_context_egl_class_init (GdkWin32GLContextClass *klass)
{ {
@@ -132,7 +127,6 @@ gdk_win32_gl_context_egl_class_init (GdkWin32GLContextClass *klass)
draw_context_class->begin_frame = gdk_win32_gl_context_egl_begin_frame; draw_context_class->begin_frame = gdk_win32_gl_context_egl_begin_frame;
draw_context_class->end_frame = gdk_win32_gl_context_egl_end_frame; draw_context_class->end_frame = gdk_win32_gl_context_egl_end_frame;
draw_context_class->empty_frame = gdk_win32_gl_context_egl_empty_frame;
} }
static void static void
+4 -20
View File
@@ -116,11 +116,6 @@ gdk_win32_gl_context_wgl_end_frame (GdkDrawContext *draw_context,
SwapBuffers (hdc); SwapBuffers (hdc);
} }
static void
gdk_win32_gl_context_wgl_empty_frame (GdkDrawContext *draw_context)
{
}
static void static void
gdk_win32_gl_context_wgl_begin_frame (GdkDrawContext *draw_context, gdk_win32_gl_context_wgl_begin_frame (GdkDrawContext *draw_context,
GdkMemoryDepth depth, GdkMemoryDepth depth,
@@ -131,7 +126,7 @@ gdk_win32_gl_context_wgl_begin_frame (GdkDrawContext *draw_context,
GDK_DRAW_CONTEXT_CLASS (gdk_win32_gl_context_wgl_parent_class)->begin_frame (draw_context, depth, update_area); GDK_DRAW_CONTEXT_CLASS (gdk_win32_gl_context_wgl_parent_class)->begin_frame (draw_context, depth, update_area);
} }
#define PIXEL_ATTRIBUTES 21 #define PIXEL_ATTRIBUTES 17
static int static int
get_wgl_pfd (HDC hdc, get_wgl_pfd (HDC hdc,
@@ -176,19 +171,10 @@ get_wgl_pfd (HDC hdc,
pixelAttribs[i++] = WGL_ALPHA_BITS_ARB; pixelAttribs[i++] = WGL_ALPHA_BITS_ARB;
pixelAttribs[i++] = 8; pixelAttribs[i++] = 8;
pixelAttribs[i++] = WGL_DEPTH_BITS_ARB;
pixelAttribs[i++] = 0;
pixelAttribs[i++] = WGL_STENCIL_BITS_ARB;
pixelAttribs[i++] = 0;
pixelAttribs[i++] = WGL_ACCUM_BITS_ARB;
pixelAttribs[i++] = 0;
/* end of "Update PIXEL_ATTRIBUTES above if any groups are added here!" */ /* end of "Update PIXEL_ATTRIBUTES above if any groups are added here!" */
pixelAttribs[i++] = 0; /* end of pixelAttribs */ pixelAttribs[i++] = 0; /* end of pixelAttribs */
g_assert (i == PIXEL_ATTRIBUTES); g_assert (i <= PIXEL_ATTRIBUTES);
if (!wglMakeCurrent (display_win32->dummy_context_wgl.hdc, if (!wglMakeCurrent (display_win32->dummy_context_wgl.hdc,
display_win32->dummy_context_wgl.hglrc)) display_win32->dummy_context_wgl.hglrc))
@@ -214,7 +200,7 @@ get_wgl_pfd (HDC hdc,
pfd->iPixelType = PFD_TYPE_RGBA; pfd->iPixelType = PFD_TYPE_RGBA;
pfd->cColorBits = GetDeviceCaps (hdc, BITSPIXEL); pfd->cColorBits = GetDeviceCaps (hdc, BITSPIXEL);
pfd->cAlphaBits = 8; pfd->cAlphaBits = 8;
pfd->iLayerType = PFD_MAIN_PLANE; pfd->dwLayerMask = PFD_MAIN_PLANE;
best_pf = ChoosePixelFormat (hdc, pfd); best_pf = ChoosePixelFormat (hdc, pfd);
} }
@@ -613,7 +599,7 @@ set_wgl_pixformat_for_hdc (GdkWin32Display *display_win32,
{ {
gboolean skip_acquire = FALSE; gboolean skip_acquire = FALSE;
gboolean set_pixel_format_result = FALSE; gboolean set_pixel_format_result = FALSE;
PIXELFORMATDESCRIPTOR pfd = {0}; PIXELFORMATDESCRIPTOR pfd;
/* one is only allowed to call SetPixelFormat(), and so ChoosePixelFormat() /* one is only allowed to call SetPixelFormat(), and so ChoosePixelFormat()
* one single time per window HDC * one single time per window HDC
@@ -823,8 +809,6 @@ gdk_win32_gl_context_wgl_class_init (GdkWin32GLContextWGLClass *klass)
draw_context_class->begin_frame = gdk_win32_gl_context_wgl_begin_frame; draw_context_class->begin_frame = gdk_win32_gl_context_wgl_begin_frame;
draw_context_class->end_frame = gdk_win32_gl_context_wgl_end_frame; draw_context_class->end_frame = gdk_win32_gl_context_wgl_end_frame;
draw_context_class->empty_frame = gdk_win32_gl_context_wgl_empty_frame;
gobject_class->dispose = gdk_win32_gl_context_wgl_dispose; gobject_class->dispose = gdk_win32_gl_context_wgl_dispose;
} }
-5
View File
@@ -211,11 +211,6 @@ Win32Cursor * win32_cursor_theme_get_cursor (Win32CursorTheme *theme,
void win32_cursor_theme_destroy (Win32CursorTheme *theme); void win32_cursor_theme_destroy (Win32CursorTheme *theme);
Win32CursorTheme *_gdk_win32_display_get_cursor_theme (GdkWin32Display *win32_display); Win32CursorTheme *_gdk_win32_display_get_cursor_theme (GdkWin32Display *win32_display);
HICON _gdk_win32_create_hicon_for_texture (GdkTexture *texture,
gboolean is_icon,
int x,
int y);
gboolean _gdk_win32_display_has_pending (GdkDisplay *display); gboolean _gdk_win32_display_has_pending (GdkDisplay *display);
void _gdk_win32_display_queue_events (GdkDisplay *display); void _gdk_win32_display_queue_events (GdkDisplay *display);
-78
View File
@@ -4308,82 +4308,6 @@ gdk_win32_surface_set_shadow_width (GdkSurface *window,
impl->shadow_y = top + bottom; impl->shadow_y = top + bottom;
} }
static void
gdk_win32_surface_set_icon_list (GdkSurface *surface,
GList *textures)
{
GdkTexture *texture, *big_texture, *small_texture;
gint big_diff, small_diff;
gint big_w, big_h, small_w, small_h;
gint w, h;
gint dw, dh, diff;
HICON small_hicon, big_hicon;
GdkWin32Surface *impl;
if (GDK_SURFACE_DESTROYED (surface))
return;
impl = GDK_WIN32_SURFACE (surface);
/* ideal sizes for small and large icons */
big_w = GetSystemMetrics (SM_CXICON);
big_h = GetSystemMetrics (SM_CYICON);
small_w = GetSystemMetrics (SM_CXSMICON);
small_h = GetSystemMetrics (SM_CYSMICON);
/* find closest sized icons in the list */
big_texture = NULL;
small_texture = NULL;
big_diff = 0;
small_diff = 0;
while (textures)
{
texture = (GdkTexture*) textures->data;
w = gdk_texture_get_width (texture);
h = gdk_texture_get_height (texture);
dw = ABS (w - big_w);
dh = ABS (h - big_h);
diff = dw*dw + dh*dh;
if (big_texture == NULL || diff < big_diff)
{
big_texture = texture;
big_diff = diff;
}
dw = ABS (w - small_w);
dh = ABS (h - small_h);
diff = dw*dw + dh*dh;
if (small_texture == NULL || diff < small_diff)
{
small_texture = texture;
small_diff = diff;
}
textures = textures->next;
}
if (big_texture == NULL || small_texture == NULL)
return;
/* Create the icons */
big_hicon = big_texture ? _gdk_win32_create_hicon_for_texture (big_texture, TRUE, 0, 0) : NULL;
small_hicon = small_texture ? _gdk_win32_create_hicon_for_texture (small_texture, TRUE, 0, 0) : NULL;
/* Set the icons */
SendMessage (GDK_SURFACE_HWND (surface), WM_SETICON, ICON_BIG,
(LPARAM)big_hicon);
SendMessage (GDK_SURFACE_HWND (surface), WM_SETICON, ICON_SMALL,
(LPARAM)small_hicon);
/* Store the icons, destroying any previous icons */
if (impl->hicon_big)
GDI_CALL (DestroyIcon, (impl->hicon_big));
impl->hicon_big = big_hicon;
if (impl->hicon_small)
GDI_CALL (DestroyIcon, (impl->hicon_small));
impl->hicon_small = small_hicon;
}
double double
_gdk_win32_surface_get_scale (GdkSurface *surface) _gdk_win32_surface_get_scale (GdkSurface *surface)
@@ -4814,8 +4738,6 @@ gdk_win32_toplevel_set_property (GObject *object,
break; break;
case LAST_PROP + GDK_TOPLEVEL_PROP_ICON_LIST: case LAST_PROP + GDK_TOPLEVEL_PROP_ICON_LIST:
gdk_win32_surface_set_icon_list (surface, g_value_get_pointer (value));
g_object_notify_by_pspec (G_OBJECT (surface), pspec);
break; break;
case LAST_PROP + GDK_TOPLEVEL_PROP_DECORATED: case LAST_PROP + GDK_TOPLEVEL_PROP_DECORATED:
-6
View File
@@ -74,11 +74,6 @@ gdk_win32_vulkan_context_begin_frame (GdkDrawContext *draw_context,
GDK_DRAW_CONTEXT_CLASS (gdk_win32_vulkan_context_parent_class)->begin_frame (draw_context, depth, update_area); GDK_DRAW_CONTEXT_CLASS (gdk_win32_vulkan_context_parent_class)->begin_frame (draw_context, depth, update_area);
} }
static void
gdk_win32_vulkan_context_empty_frame (GdkDrawContext *draw_context)
{
}
static void static void
gdk_win32_vulkan_context_class_init (GdkWin32VulkanContextClass *klass) gdk_win32_vulkan_context_class_init (GdkWin32VulkanContextClass *klass)
{ {
@@ -87,7 +82,6 @@ gdk_win32_vulkan_context_class_init (GdkWin32VulkanContextClass *klass)
context_class->create_surface = gdk_win32_vulkan_context_create_surface; context_class->create_surface = gdk_win32_vulkan_context_create_surface;
draw_context_class->begin_frame = gdk_win32_vulkan_context_begin_frame; draw_context_class->begin_frame = gdk_win32_vulkan_context_begin_frame;
draw_context_class->empty_frame = gdk_win32_vulkan_context_empty_frame;
} }
static void static void
-12
View File
@@ -1429,9 +1429,6 @@ gdk_x11_display_open (const char *display_name)
int ignore; int ignore;
int maj, min; int maj, min;
char *cm_name; char *cm_name;
gboolean frame_extents;
gboolean rgba;
gboolean composited;
XInitThreads (); XInitThreads ();
@@ -1646,13 +1643,6 @@ gdk_x11_display_open (const char *display_name)
gdk_x11_get_xatom_by_name_for_display (display, cm_name)) != None); gdk_x11_get_xatom_by_name_for_display (display, cm_name)) != None);
g_free (cm_name); g_free (cm_name);
frame_extents = gdk_x11_screen_supports_net_wm_hint (gdk_x11_display_get_screen (display),
g_intern_static_string ("_GTK_FRAME_EXTENTS"));
rgba = gdk_display_is_rgba (display);
composited = gdk_display_is_composited (display);
gdk_display_set_shadow_width (display, frame_extents && rgba && composited);
gdk_display_emit_opened (display); gdk_display_emit_opened (display);
return display; return display;
@@ -3015,8 +3005,6 @@ gdk_x11_display_init_gl_backend (GdkX11Display *self,
self->egl_version = epoxy_egl_version (egl_display); self->egl_version = epoxy_egl_version (egl_display);
XFree (visinfo);
return TRUE; return TRUE;
} }
+1 -4
View File
@@ -316,10 +316,7 @@ gdk_x11_gl_context_glx_get_damage (GdkGLContext *context)
for (i = 0; i < buffer_age - 1; i++) for (i = 0; i < buffer_age - 1; i++)
{ {
if (context->old_updated_area[i] == NULL) if (context->old_updated_area[i] == NULL)
{ return GDK_GL_CONTEXT_CLASS (gdk_x11_gl_context_glx_parent_class)->get_damage (context);
cairo_region_destroy (damage);
return GDK_GL_CONTEXT_CLASS (gdk_x11_gl_context_glx_parent_class)->get_damage (context);
}
cairo_region_union (damage, context->old_updated_area[i]); cairo_region_union (damage, context->old_updated_area[i]);
} }
+1 -6
View File
@@ -2655,7 +2655,6 @@ gdk_x11_surface_get_geometry (GdkSurface *surface,
{ {
GdkX11Surface *impl; GdkX11Surface *impl;
Window root; Window root;
Window child;
int tx; int tx;
int ty; int ty;
guint twidth; guint twidth;
@@ -2670,11 +2669,7 @@ gdk_x11_surface_get_geometry (GdkSurface *surface,
XGetGeometry (GDK_SURFACE_XDISPLAY (surface), XGetGeometry (GDK_SURFACE_XDISPLAY (surface),
GDK_SURFACE_XID (surface), GDK_SURFACE_XID (surface),
&root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth); &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
XTranslateCoordinates (GDK_SURFACE_XDISPLAY (surface),
GDK_SURFACE_XID (surface),
root, 0, 0, &tx, &ty, &child);
if (x) if (x)
*x = tx / impl->surface_scale; *x = tx / impl->surface_scale;
if (y) if (y)
+6 -5
View File
@@ -1066,7 +1066,8 @@ gsk_gl_command_queue_execute (GskGLCommandQueue *self,
gsk_gl_profiler_begin_gpu_region (self->gl_profiler); gsk_gl_profiler_begin_gpu_region (self->gl_profiler);
gsk_profiler_timer_begin (self->profiler, self->metrics.cpu_time); gsk_profiler_timer_begin (self->profiler, self->metrics.cpu_time);
glDisable (GL_DEPTH_TEST); glEnable (GL_DEPTH_TEST);
glDepthFunc (GL_LEQUAL);
/* Pre-multiplied alpha */ /* Pre-multiplied alpha */
glEnable (GL_BLEND); glEnable (GL_BLEND);
@@ -1607,8 +1608,8 @@ gsk_gl_command_queue_do_upload_texture_chunk (GskGLCommandQueue *self,
if (gdk_profiler_is_running ()) if (gdk_profiler_is_running ())
{ {
gdk_profiler_end_markf (start_time, gdk_profiler_add_markf (start_time, GDK_PROFILER_CURRENT_TIME-start_time,
"Download texture chunk", "Download Texture chunk",
"Tile %dx%d Size %dx%d", x, y, width, height); "Tile %dx%d Size %dx%d", x, y, width, height);
start_time = GDK_PROFILER_CURRENT_TIME; start_time = GDK_PROFILER_CURRENT_TIME;
} }
@@ -1653,8 +1654,8 @@ gsk_gl_command_queue_do_upload_texture_chunk (GskGLCommandQueue *self,
g_bytes_unref (bytes); g_bytes_unref (bytes);
if (gdk_profiler_is_running ()) if (gdk_profiler_is_running ())
gdk_profiler_end_markf (start_time, gdk_profiler_add_markf (start_time, GDK_PROFILER_CURRENT_TIME-start_time,
"Upload texture chunk", "Upload Texture chunk",
"Tile %dx%d Size %dx%d", x, y, width, height); "Tile %dx%d Size %dx%d", x, y, width, height);
} }
+2 -2
View File
@@ -424,7 +424,7 @@ gsk_gl_driver_load_programs (GskGLDriver *self,
failure: failure:
g_clear_object (&compiler); g_clear_object (&compiler);
gdk_profiler_end_mark (start_time, "Load GL programs", NULL); gdk_profiler_end_mark (start_time, "load programs", NULL);
return ret; return ret;
} }
@@ -477,7 +477,7 @@ gsk_gl_driver_new (GskGLCommandQueue *command_queue,
self->icons_library = gsk_gl_icon_library_new (self); self->icons_library = gsk_gl_icon_library_new (self);
self->shadows_library = gsk_gl_shadow_library_new (self); self->shadows_library = gsk_gl_shadow_library_new (self);
gdk_profiler_end_mark (before, "Create GL driver", NULL); gdk_profiler_end_mark (before, "create GskGLDriver", NULL);
return g_steal_pointer (&self); return g_steal_pointer (&self);
} }
+6 -2
View File
@@ -119,7 +119,11 @@ gsk_gl_glyph_library_init_atlas (GskGLTextureLibrary *self,
memset (pixel_data, 255, sizeof pixel_data); memset (pixel_data, 255, sizeof pixel_data);
if (gdk_gl_context_get_use_es (gdk_gl_context_get_current ())) if (!gdk_gl_context_has_bgra (gdk_gl_context_get_current ())
#if G_BYTE_ORDER == G_BIG_ENDIAN
|| gdk_gl_context_get_use_es (gdk_gl_context_get_current ())
#endif
)
{ {
gl_format = GL_RGBA; gl_format = GL_RGBA;
gl_type = GL_UNSIGNED_BYTE; gl_type = GL_UNSIGNED_BYTE;
@@ -376,7 +380,7 @@ gsk_gl_glyph_library_upload_glyph (GskGLGlyphLibrary *self,
{ {
char message[64]; char message[64];
g_snprintf (message, sizeof message, "Size %dx%d", width, height); g_snprintf (message, sizeof message, "Size %dx%d", width, height);
gdk_profiler_add_mark (start_time, GDK_PROFILER_CURRENT_TIME-start_time, "Upload glyph", message); gdk_profiler_add_mark (start_time, GDK_PROFILER_CURRENT_TIME-start_time, "Upload Glyph", message);
} }
} }
+1 -1
View File
@@ -211,6 +211,6 @@ gsk_gl_icon_library_add (GskGLIconLibrary *self,
{ {
char message[64]; char message[64];
g_snprintf (message, sizeof message, "Size %dx%d", width, height); g_snprintf (message, sizeof message, "Size %dx%d", width, height);
gdk_profiler_add_mark (start_time, GDK_PROFILER_CURRENT_TIME-start_time, "Upload icon", message); gdk_profiler_add_mark (start_time, GDK_PROFILER_CURRENT_TIME-start_time, "Upload Icon", message);
} }
} }
+4 -4
View File
@@ -4322,7 +4322,7 @@ gsk_gl_render_job_visit_node_with_offscreen (GskGLRenderJob *job,
gsk_gl_render_job_push_modelview (job, transform); gsk_gl_render_job_push_modelview (job, transform);
gsk_transform_unref (transform); gsk_transform_unref (transform);
gsk_gl_render_job_transform_bounds (job, offscreen->bounds, &viewport); gsk_gl_render_job_transform_bounds (job, offscreen->bounds, &viewport);
gsk_rect_scale (&viewport, downscale_x, downscale_y, &viewport); graphene_rect_scale (&viewport, downscale_x, downscale_y, &viewport);
} }
if (downscale_x == 1) if (downscale_x == 1)
@@ -4416,7 +4416,7 @@ gsk_gl_render_job_visit_node_with_offscreen (GskGLRenderJob *job,
float scale_x = flipped_x ? - downscale_x : downscale_x; float scale_x = flipped_x ? - downscale_x : downscale_x;
float scale_y = flipped_y ? - downscale_y : downscale_y; float scale_y = flipped_y ? - downscale_y : downscale_y;
gsk_rect_scale (&job->current_clip->rect.bounds, scale_x, scale_y, &new_clip.bounds); graphene_rect_scale (&job->current_clip->rect.bounds, scale_x, scale_y, &new_clip.bounds);
rounded_rect_scale_corners (&job->current_clip->rect, &new_clip, scale_x, scale_y); rounded_rect_scale_corners (&job->current_clip->rect, &new_clip, scale_x, scale_y);
gsk_gl_render_job_push_clip (job, &new_clip); gsk_gl_render_job_push_clip (job, &new_clip);
reset_clip = TRUE; reset_clip = TRUE;
@@ -4544,7 +4544,7 @@ gsk_gl_render_job_render (GskGLRenderJob *job,
gsk_gl_render_job_visit_node (job, root); gsk_gl_render_job_visit_node (job, root);
gdk_gl_context_pop_debug_group (job->command_queue->context); gdk_gl_context_pop_debug_group (job->command_queue->context);
gdk_profiler_end_mark (start_time, "Build GL command queue", ""); gdk_profiler_add_mark (start_time, GDK_PROFILER_CURRENT_TIME-start_time, "Build GL command queue", "");
#if 0 #if 0
/* At this point the atlases have uploaded content while we processed /* At this point the atlases have uploaded content while we processed
@@ -4562,7 +4562,7 @@ gsk_gl_render_job_render (GskGLRenderJob *job,
gdk_gl_context_push_debug_group (job->command_queue->context, "Executing command queue"); gdk_gl_context_push_debug_group (job->command_queue->context, "Executing command queue");
gsk_gl_command_queue_execute (job->command_queue, surface_height, scale, job->region, job->default_framebuffer); gsk_gl_command_queue_execute (job->command_queue, surface_height, scale, job->region, job->default_framebuffer);
gdk_gl_context_pop_debug_group (job->command_queue->context); gdk_gl_context_pop_debug_group (job->command_queue->context);
gdk_profiler_end_mark (start_time, "Execute GL command queue", ""); gdk_profiler_add_mark (start_time, GDK_PROFILER_CURRENT_TIME-start_time, "Execute GL command queue", "");
} }
static int static int
+2 -15
View File
@@ -1,7 +1,5 @@
#include "config.h" #include "config.h"
#include <gdk/gdkprofilerprivate.h>
#include "gskglbufferprivate.h" #include "gskglbufferprivate.h"
struct _GskGLBuffer struct _GskGLBuffer
@@ -16,9 +14,6 @@ struct _GskGLBuffer
G_DEFINE_TYPE (GskGLBuffer, gsk_gl_buffer, GSK_TYPE_GPU_BUFFER) G_DEFINE_TYPE (GskGLBuffer, gsk_gl_buffer, GSK_TYPE_GPU_BUFFER)
static guint profiler_buffer_uploads_id;
static gint64 profiler_buffer_uploads;
static void static void
gsk_gl_buffer_finalize (GObject *object) gsk_gl_buffer_finalize (GObject *object)
{ {
@@ -39,19 +34,13 @@ gsk_gl_buffer_map (GskGpuBuffer *buffer)
} }
static void static void
gsk_gl_buffer_unmap (GskGpuBuffer *buffer, gsk_gl_buffer_unmap (GskGpuBuffer *buffer)
gsize used)
{ {
GskGLBuffer *self = GSK_GL_BUFFER (buffer); GskGLBuffer *self = GSK_GL_BUFFER (buffer);
if (used == 0)
return;
gsk_gl_buffer_bind (self); gsk_gl_buffer_bind (self);
profiler_buffer_uploads += used; glBufferSubData (self->target, 0, gsk_gpu_buffer_get_size (buffer), self->data);
glBufferSubData (self->target, 0, used, self->data);
gdk_profiler_set_int_counter (profiler_buffer_uploads_id, profiler_buffer_uploads);
} }
static void static void
@@ -64,8 +53,6 @@ gsk_gl_buffer_class_init (GskGLBufferClass *klass)
buffer_class->unmap = gsk_gl_buffer_unmap; buffer_class->unmap = gsk_gl_buffer_unmap;
gobject_class->finalize = gsk_gl_buffer_finalize; gobject_class->finalize = gsk_gl_buffer_finalize;
profiler_buffer_uploads_id = gdk_profiler_define_int_counter ("ngl-buffer-uploads", "Number of bytes uploaded to GPU");
} }
static void static void
+1 -15
View File
@@ -9,7 +9,6 @@
#include "gdk/gdkdisplayprivate.h" #include "gdk/gdkdisplayprivate.h"
#include "gdk/gdkglcontextprivate.h" #include "gdk/gdkglcontextprivate.h"
#include "gdk/gdkprofilerprivate.h"
#include <glib/gi18n-lib.h> #include <glib/gi18n-lib.h>
@@ -126,12 +125,6 @@ gsk_gl_device_create_atlas_image (GskGpuDevice *device,
height); height);
} }
static void
gsk_gl_device_make_current (GskGpuDevice *device)
{
gdk_gl_context_make_current (gdk_display_get_gl_context (gsk_gpu_device_get_display (device)));
}
static void static void
gsk_gl_device_finalize (GObject *object) gsk_gl_device_finalize (GObject *object)
{ {
@@ -158,7 +151,6 @@ gsk_gl_device_class_init (GskGLDeviceClass *klass)
gpu_device_class->create_atlas_image = gsk_gl_device_create_atlas_image; gpu_device_class->create_atlas_image = gsk_gl_device_create_atlas_image;
gpu_device_class->create_upload_image = gsk_gl_device_create_upload_image; gpu_device_class->create_upload_image = gsk_gl_device_create_upload_image;
gpu_device_class->create_download_image = gsk_gl_device_create_download_image; gpu_device_class->create_download_image = gsk_gl_device_create_download_image;
gpu_device_class->make_current = gsk_gl_device_make_current;
object_class->finalize = gsk_gl_device_finalize; object_class->finalize = gsk_gl_device_finalize;
} }
@@ -243,7 +235,7 @@ gsk_gl_device_get_for_display (GdkDisplay *display,
if (!gdk_gl_context_check_version (context, "3.0", "3.0")) if (!gdk_gl_context_check_version (context, "3.0", "3.0"))
{ {
g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_NOT_AVAILABLE, g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_NOT_AVAILABLE,
_("OpenGL ES 3.0 is not supported by this renderer.")); _("OpenGL ES 2.0 is not supported by this renderer."));
return NULL; return NULL;
} }
@@ -474,7 +466,6 @@ gsk_gl_device_load_program (GskGLDevice *self,
guint n_external_textures, guint n_external_textures,
GError **error) GError **error)
{ {
G_GNUC_UNUSED gint64 begin_time = GDK_PROFILER_CURRENT_TIME;
GLuint vertex_shader_id, fragment_shader_id, program_id; GLuint vertex_shader_id, fragment_shader_id, program_id;
GLint link_status; GLint link_status;
@@ -529,11 +520,6 @@ gsk_gl_device_load_program (GskGLDevice *self,
return 0; return 0;
} }
gdk_profiler_end_markf (begin_time,
"Compile Program",
"name=%s id=%u frag=%u vert=%u",
op_class->shader_name, program_id, fragment_shader_id, vertex_shader_id);
return program_id; return program_id;
} }
+2 -1
View File
@@ -144,7 +144,8 @@ gsk_gl_frame_submit (GskGpuFrame *frame,
glEnable (GL_SCISSOR_TEST); glEnable (GL_SCISSOR_TEST);
glDisable (GL_DEPTH_TEST); glEnable (GL_DEPTH_TEST);
glDepthFunc (GL_LEQUAL);
glEnable (GL_BLEND); glEnable (GL_BLEND);
if (vertex_buffer) if (vertex_buffer)
+1 -11
View File
@@ -43,7 +43,7 @@ gsk_gl_image_finalize (GObject *object)
{ {
GskGLImage *self = GSK_GL_IMAGE (object); GskGLImage *self = GSK_GL_IMAGE (object);
if (self->texture_id && self->framebuffer_id) if (self->framebuffer_id)
glDeleteFramebuffers (1, &self->framebuffer_id); glDeleteFramebuffers (1, &self->framebuffer_id);
if (self->owns_texture) if (self->owns_texture)
@@ -70,7 +70,6 @@ gsk_gl_image_init (GskGLImage *self)
GskGpuImage * GskGpuImage *
gsk_gl_image_new_backbuffer (GskGLDevice *device, gsk_gl_image_new_backbuffer (GskGLDevice *device,
GdkGLContext *context,
GdkMemoryFormat format, GdkMemoryFormat format,
gsize width, gsize width,
gsize height) gsize height)
@@ -96,13 +95,6 @@ gsk_gl_image_new_backbuffer (GskGLDevice *device,
/* texture_id == 0 means backbuffer */ /* texture_id == 0 means backbuffer */
/* Check for non-standard framebuffer binding as we might not be using
* the default framebuffer on systems like macOS where we've bound an
* IOSurface to a GL_TEXTURE_RECTANGLE. Otherwise, no scissor clip will
* be applied in the command queue causing overdrawing.
*/
self->framebuffer_id = GDK_GL_CONTEXT_GET_CLASS (context)->get_default_framebuffer (context);
return GSK_GPU_IMAGE (self); return GSK_GPU_IMAGE (self);
} }
@@ -195,8 +187,6 @@ gsk_gl_image_new_for_texture (GskGLDevice *device,
if (format != real_format) if (format != real_format)
flags = GSK_GPU_IMAGE_NO_BLIT | flags = GSK_GPU_IMAGE_NO_BLIT |
(gdk_memory_format_alpha (format) == GDK_MEMORY_ALPHA_STRAIGHT ? GSK_GPU_IMAGE_STRAIGHT_ALPHA : 0); (gdk_memory_format_alpha (format) == GDK_MEMORY_ALPHA_STRAIGHT ? GSK_GPU_IMAGE_STRAIGHT_ALPHA : 0);
else
flags &= ~(GSK_GPU_IMAGE_CAN_MIPMAP | GSK_GPU_IMAGE_MIPMAP);
gsk_gpu_image_setup (GSK_GPU_IMAGE (self), gsk_gpu_image_setup (GSK_GPU_IMAGE (self),
flags | extra_flags, flags | extra_flags,
-1
View File
@@ -11,7 +11,6 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (GskGLImage, gsk_gl_image, GSK, GL_IMAGE, GskGpuImage) G_DECLARE_FINAL_TYPE (GskGLImage, gsk_gl_image, GSK, GL_IMAGE, GskGpuImage)
GskGpuImage * gsk_gl_image_new_backbuffer (GskGLDevice *device, GskGpuImage * gsk_gl_image_new_backbuffer (GskGLDevice *device,
GdkGLContext *context,
GdkMemoryFormat format, GdkMemoryFormat format,
gsize width, gsize width,
gsize height); gsize height);
+1 -2
View File
@@ -28,7 +28,6 @@ gsk_gpu_blend_mode_op_print (GskGpuOp *op,
instance = (GskGpuBlendmodeInstance *) gsk_gpu_frame_get_vertex_data (frame, shader->vertex_offset); instance = (GskGpuBlendmodeInstance *) gsk_gpu_frame_get_vertex_data (frame, shader->vertex_offset);
gsk_gpu_print_op (string, indent, "blend-mode"); gsk_gpu_print_op (string, indent, "blend-mode");
gsk_gpu_print_shader_info (string, shader->clip);
gsk_gpu_print_rect (string, instance->rect); gsk_gpu_print_rect (string, instance->rect);
gsk_gpu_print_image_descriptor (string, shader->desc, instance->bottom_id); gsk_gpu_print_image_descriptor (string, shader->desc, instance->bottom_id);
gsk_gpu_print_enum (string, GSK_TYPE_BLEND_MODE, shader->variation); gsk_gpu_print_enum (string, GSK_TYPE_BLEND_MODE, shader->variation);
@@ -61,7 +60,7 @@ gsk_gpu_blend_mode_op (GskGpuFrame *frame,
GskGpuShaderClip clip, GskGpuShaderClip clip,
GskGpuDescriptors *desc, GskGpuDescriptors *desc,
const graphene_rect_t *rect, const graphene_rect_t *rect,
const graphene_point_t *offset, const GskPoint *offset,
float opacity, float opacity,
GskBlendMode blend_mode, GskBlendMode blend_mode,
guint32 bottom_descriptor, guint32 bottom_descriptor,
+1 -1
View File
@@ -10,7 +10,7 @@ void gsk_gpu_blend_mode_op (GskGpuF
GskGpuShaderClip clip, GskGpuShaderClip clip,
GskGpuDescriptors *desc, GskGpuDescriptors *desc,
const graphene_rect_t *rect, const graphene_rect_t *rect,
const graphene_point_t *offset, const GskPoint *offset,
float opacity, float opacity,
GskBlendMode blend_mode, GskBlendMode blend_mode,
guint32 start_descriptor, guint32 start_descriptor,
-6
View File
@@ -36,9 +36,6 @@ gsk_gpu_blend_op_print (GskGpuOp *op,
case GSK_GPU_BLEND_ADD: case GSK_GPU_BLEND_ADD:
gsk_gpu_print_string (string, "add"); gsk_gpu_print_string (string, "add");
break; break;
case GSK_GPU_BLEND_CLEAR:
gsk_gpu_print_string (string, "clear");
break;
default: default:
g_assert_not_reached (); g_assert_not_reached ();
break; break;
@@ -75,9 +72,6 @@ gsk_gpu_blend_op_gl_command (GskGpuOp *op,
case GSK_GPU_BLEND_ADD: case GSK_GPU_BLEND_ADD:
glBlendFunc (GL_ONE, GL_ONE); glBlendFunc (GL_ONE, GL_ONE);
break; break;
case GSK_GPU_BLEND_CLEAR:
glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
break;
default: default:
g_assert_not_reached (); g_assert_not_reached ();
break; break;
+2
View File
@@ -85,6 +85,7 @@ gsk_gpu_blit_op_vk_command (GskGpuOp *op,
{ {
default: default:
g_assert_not_reached (); g_assert_not_reached ();
G_GNUC_FALLTHROUGH;
case GSK_GPU_BLIT_LINEAR: case GSK_GPU_BLIT_LINEAR:
filter = VK_FILTER_LINEAR; filter = VK_FILTER_LINEAR;
break; break;
@@ -159,6 +160,7 @@ gsk_gpu_blit_op_gl_command (GskGpuOp *op,
{ {
default: default:
g_assert_not_reached (); g_assert_not_reached ();
G_GNUC_FALLTHROUGH;
case GSK_GPU_BLIT_LINEAR: case GSK_GPU_BLIT_LINEAR:
filter = GL_LINEAR; filter = GL_LINEAR;
break; break;

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