Compare commits

..

1 Commits

Author SHA1 Message Date
Matthias Clasen
40b34c76e6 widget: Treat key controllers like gestures
For the purposes of cutting short event handling,
treat key controllers like gestures. It is fairly
common to have multiple key controllers on a widget,
and the event handling can inadvertently cut short
e.g. by modifier key releases that return TRUE
from handle_event.

Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1884
2019-05-12 19:30:56 +00:00
897 changed files with 57851 additions and 79186 deletions

View File

@@ -28,7 +28,6 @@ fedora-x86_64:
- "${CI_PROJECT_DIR}/_build/report.xml" - "${CI_PROJECT_DIR}/_build/report.xml"
- "${CI_PROJECT_DIR}/_build/report.html" - "${CI_PROJECT_DIR}/_build/report.html"
- "${CI_PROJECT_DIR}/_build/testsuite/reftests/output/*.png" - "${CI_PROJECT_DIR}/_build/testsuite/reftests/output/*.png"
- "${CI_PROJECT_DIR}/_build/testsuite/gsk/compare/*/*.png"
cache: cache:
key: "$CI_JOB_NAME" key: "$CI_JOB_NAME"
<<: *cache-paths <<: *cache-paths
@@ -105,7 +104,7 @@ pages:
image: registry.gitlab.gnome.org/gnome/gtk/master:v6 image: registry.gitlab.gnome.org/gnome/gtk/master:v6
stage: deploy stage: deploy
script: script:
- meson -Dgtk_doc=true _build . - meson -Ddocumentation=true _build .
- ninja -C _build - ninja -C _build
- ninja -C _build gdk4-doc gsk4-doc gtk4-doc - ninja -C _build gdk4-doc gsk4-doc gtk4-doc

View File

@@ -42,11 +42,10 @@ ccache --zero-stats
ccache --show-stats ccache --show-stats
export CCACHE_DISABLE=true export CCACHE_DISABLE=true
meson \ meson \
-Dx11-backend=false \ -Denable-x11-backend=false \
-Dwayland-backend=false \ -Denable-wayland-backend=false \
-Dwin32-backend=true \ -Denable-win32-backend=true \
-Dvulkan=no \ -Dvulkan=no \
--werror \
_build _build
unset CCACHE_DISABLE unset CCACHE_DISABLE

View File

@@ -7,8 +7,8 @@
<!-- <!--
You should try and reproduce with the demos applications available You should try and reproduce with the demos applications available
under the `demos` directory, or the test programs in the `tests` directory. under the `demos` directory, or the test programs in the `tests` directory.
Alternatively, please attach a *small and self-contained* example Alternatively, please attach a *small and self-contained* example that
*written in C* that exhibits the issue. exhibits the issue.
--> -->
## Current behavior ## Current behavior

View File

@@ -56,6 +56,12 @@
/* Define if GStreamer support is available */ /* Define if GStreamer support is available */
#mesondefine HAVE_GSTREAMER #mesondefine HAVE_GSTREAMER
/* Define to 1 if you have the `httpGetAuthString' function. */
#mesondefine HAVE_HTTPGETAUTHSTRING
/* Define if cups http_t authstring field is accessible */
#mesondefine HAVE_HTTP_AUTHSTRING
/* Define to 1 if you have the <inttypes.h> header file. */ /* Define to 1 if you have the <inttypes.h> header file. */
#mesondefine HAVE_INTTYPES_H #mesondefine HAVE_INTTYPES_H
@@ -125,9 +131,6 @@
/* Define to 1 if you have the <sys/param.h> header file. */ /* Define to 1 if you have the <sys/param.h> header file. */
#mesondefine HAVE_SYS_PARAM_H #mesondefine HAVE_SYS_PARAM_H
/* Have the sysprof-capture library */
#mesondefine HAVE_SYSPROF_CAPTURE
/* Define to 1 if you have the <sys/stat.h> header file. */ /* Define to 1 if you have the <sys/stat.h> header file. */
#mesondefine HAVE_SYS_STAT_H #mesondefine HAVE_SYS_STAT_H
@@ -238,6 +241,9 @@
#endif #endif
/* Define to 1 if XInput 2.0 is available */
#mesondefine XINPUT_2
/* Define to 1 if XInput 2.2 is available */ /* Define to 1 if XInput 2.2 is available */
#mesondefine XINPUT_2_2 #mesondefine XINPUT_2_2
@@ -291,8 +297,6 @@
#mesondefine GTK_PRINT_BACKENDS #mesondefine GTK_PRINT_BACKENDS
#mesondefine HAVE_CAIRO_SCRIPT_INTERPRETER
#mesondefine HAVE_HARFBUZZ #mesondefine HAVE_HARFBUZZ
#mesondefine HAVE_PANGOFT #mesondefine HAVE_PANGOFT

View File

@@ -1,115 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen
*/
#include "config.h"
#include "constraint-editor-application.h"
#include "constraint-editor-window.h"
struct _ConstraintEditorApplication
{
GtkApplication parent_instance;
};
G_DEFINE_TYPE(ConstraintEditorApplication, constraint_editor_application, GTK_TYPE_APPLICATION);
static void
constraint_editor_application_init (ConstraintEditorApplication *app)
{
}
static void
quit_activated (GSimpleAction *action,
GVariant *parameter,
gpointer data)
{
g_application_quit (G_APPLICATION (data));
}
static GActionEntry app_entries[] =
{
{ "quit", quit_activated, NULL, NULL, NULL }
};
static void
constraint_editor_application_startup (GApplication *app)
{
const char *quit_accels[2] = { "<Ctrl>Q", NULL };
const char *open_accels[2] = { "<Ctrl>O", NULL };
GtkCssProvider *provider;
G_APPLICATION_CLASS (constraint_editor_application_parent_class)->startup (app);
g_action_map_add_action_entries (G_ACTION_MAP (app),
app_entries, G_N_ELEMENTS (app_entries),
app);
gtk_application_set_accels_for_action (GTK_APPLICATION (app), "app.quit", quit_accels);
gtk_application_set_accels_for_action (GTK_APPLICATION (app), "win.open", open_accels);
provider = gtk_css_provider_new ();
gtk_css_provider_load_from_resource (provider, "/org/gtk/gtk4/constraint-editor/constraint-editor.css");
gtk_style_context_add_provider_for_display (gdk_display_get_default (),
GTK_STYLE_PROVIDER (provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
}
static void
constraint_editor_application_activate (GApplication *app)
{
ConstraintEditorWindow *win;
win = constraint_editor_window_new (CONSTRAINT_EDITOR_APPLICATION (app));
gtk_window_present (GTK_WINDOW (win));
}
static void
constraint_editor_application_open (GApplication *app,
GFile **files,
gint n_files,
const gchar *hint)
{
ConstraintEditorWindow *win;
gint i;
for (i = 0; i < n_files; i++)
{
win = constraint_editor_window_new (CONSTRAINT_EDITOR_APPLICATION (app));
constraint_editor_window_load (win, files[i]);
gtk_window_present (GTK_WINDOW (win));
}
}
static void
constraint_editor_application_class_init (ConstraintEditorApplicationClass *class)
{
GApplicationClass *application_class = G_APPLICATION_CLASS (class);
application_class->startup = constraint_editor_application_startup;
application_class->activate = constraint_editor_application_activate;
application_class->open = constraint_editor_application_open;
}
ConstraintEditorApplication *
constraint_editor_application_new (void)
{
return g_object_new (CONSTRAINT_EDITOR_APPLICATION_TYPE,
"application-id", "org.gtk.gtk4.ConstraintEditor",
"flags", G_APPLICATION_HANDLES_OPEN,
NULL);
}

View File

@@ -1,28 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen
*/
#pragma once
#include <gtk/gtk.h>
#define CONSTRAINT_EDITOR_APPLICATION_TYPE (constraint_editor_application_get_type ())
G_DECLARE_FINAL_TYPE (ConstraintEditorApplication, constraint_editor_application, CONSTRAINT, EDITOR_APPLICATION, GtkApplication)
ConstraintEditorApplication *constraint_editor_application_new (void);

View File

@@ -1,639 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen
*/
#include "config.h"
#include "constraint-editor-window.h"
#include "constraint-view.h"
#include "constraint-editor.h"
#include "guide-editor.h"
struct _ConstraintEditorWindow
{
GtkApplicationWindow parent_instance;
GtkWidget *paned;
GtkWidget *view;
GtkWidget *list;
};
G_DEFINE_TYPE(ConstraintEditorWindow, constraint_editor_window, GTK_TYPE_APPLICATION_WINDOW);
static GtkConstraintTarget *
find_target (GListModel *model,
GtkConstraintTarget *orig)
{
const char *name;
const char *model_name;
gpointer item;
int i;
if (orig == NULL)
return NULL;
if (GTK_IS_LABEL (orig))
name = gtk_label_get_label (GTK_LABEL (orig));
else if (GTK_IS_CONSTRAINT_GUIDE (orig))
name = gtk_constraint_guide_get_name (GTK_CONSTRAINT_GUIDE (orig));
else
{
g_warning ("Don't know how to handle %s targets", G_OBJECT_TYPE_NAME (orig));
return NULL;
}
for (i = 0; i < g_list_model_get_n_items (model); i++)
{
item = g_list_model_get_item (model, i);
g_object_unref (item);
if (GTK_IS_WIDGET (item))
model_name = gtk_widget_get_name (GTK_WIDGET (item));
else
model_name = gtk_constraint_guide_get_name (GTK_CONSTRAINT_GUIDE (item));
if (strcmp (name, model_name) == 0)
return GTK_CONSTRAINT_TARGET (item);
}
g_warning ("Failed to find target '%s'", name);
return NULL;
}
gboolean
constraint_editor_window_load (ConstraintEditorWindow *self,
GFile *file)
{
char *path;
GtkBuilder *builder;
GError *error = NULL;
GtkWidget *view;
GtkLayoutManager *layout;
GtkWidget *child;
const char *name;
gpointer item;
int i;
GListModel *list;
path = g_file_get_path (file);
builder = gtk_builder_new ();
if (!gtk_builder_add_from_file (builder, path, &error))
{
g_print ("Could not load %s: %s", path, error->message);
g_error_free (error);
g_free (path);
g_object_unref (builder);
return FALSE;
}
view = GTK_WIDGET (gtk_builder_get_object (builder, "view"));
if (!GTK_IS_BOX (view))
{
g_print ("Could not load %s: No GtkBox named 'view'", path);
g_free (path);
g_object_unref (builder);
return FALSE;
}
layout = gtk_widget_get_layout_manager (view);
if (!GTK_IS_CONSTRAINT_LAYOUT (layout))
{
g_print ("Could not load %s: Widget 'view' does not use GtkConstraintLayout", path);
g_free (path);
g_object_unref (builder);
return FALSE;
}
for (child = gtk_widget_get_first_child (view);
child;
child = gtk_widget_get_next_sibling (child))
{
if (!GTK_IS_LABEL (child))
{
g_print ("Skipping non-GtkLabel child\n");
continue;
}
name = gtk_label_get_label (GTK_LABEL (child));
constraint_view_add_child (CONSTRAINT_VIEW (self->view), name);
}
list = gtk_constraint_layout_observe_guides (GTK_CONSTRAINT_LAYOUT (layout));
for (i = 0; i < g_list_model_get_n_items (list); i++)
{
GtkConstraintGuide *guide, *clone;
int w, h;
item = g_list_model_get_item (list, i);
guide = GTK_CONSTRAINT_GUIDE (item);
/* need to clone here, to attach to the right targets */
clone = gtk_constraint_guide_new ();
gtk_constraint_guide_set_name (clone, gtk_constraint_guide_get_name (guide));
gtk_constraint_guide_set_strength (clone, gtk_constraint_guide_get_strength (guide));
gtk_constraint_guide_get_min_size (guide, &w, &h);
gtk_constraint_guide_set_min_size (clone, w, h);
gtk_constraint_guide_get_nat_size (guide, &w, &h);
gtk_constraint_guide_set_nat_size (clone, w, h);
gtk_constraint_guide_get_max_size (guide, &w, &h);
gtk_constraint_guide_set_max_size (clone, w, h);
constraint_view_add_guide (CONSTRAINT_VIEW (self->view), clone);
g_object_unref (guide);
g_object_unref (clone);
}
g_object_unref (list);
list = gtk_constraint_layout_observe_constraints (GTK_CONSTRAINT_LAYOUT (layout));
for (i = 0; i < g_list_model_get_n_items (list); i++)
{
GtkConstraint *constraint;
GtkConstraint *clone;
GtkConstraintTarget *target;
GtkConstraintTarget *source;
item = g_list_model_get_item (list, i);
constraint = GTK_CONSTRAINT (item);
target = gtk_constraint_get_target (constraint);
source = gtk_constraint_get_source (constraint);
clone = gtk_constraint_new (find_target (constraint_view_get_model (CONSTRAINT_VIEW (self->view)), target),
gtk_constraint_get_target_attribute (constraint),
gtk_constraint_get_relation (constraint),
find_target (constraint_view_get_model (CONSTRAINT_VIEW (self->view)), source),
gtk_constraint_get_target_attribute (constraint),
gtk_constraint_get_multiplier (constraint),
gtk_constraint_get_constant (constraint),
gtk_constraint_get_strength (constraint));
constraint_view_add_constraint (CONSTRAINT_VIEW (self->view), clone);
g_object_unref (constraint);
g_object_unref (clone);
}
g_object_unref (list);
g_free (path);
g_object_unref (builder);
return TRUE;
}
static void
open_response_cb (GtkNativeDialog *dialog,
gint response,
ConstraintEditorWindow *self)
{
gtk_native_dialog_hide (dialog);
if (response == GTK_RESPONSE_ACCEPT)
{
GFile *file;
file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
constraint_editor_window_load (self, file);
g_object_unref (file);
}
gtk_native_dialog_destroy (dialog);
}
static void
open_cb (GtkWidget *button,
ConstraintEditorWindow *self)
{
GtkFileChooserNative *dialog;
dialog = gtk_file_chooser_native_new ("Open file",
GTK_WINDOW (self),
GTK_FILE_CHOOSER_ACTION_OPEN,
"_Load",
"_Cancel");
gtk_native_dialog_set_modal (GTK_NATIVE_DIALOG (dialog), TRUE);
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), ".");
g_signal_connect (dialog, "response", G_CALLBACK (open_response_cb), self);
gtk_native_dialog_show (GTK_NATIVE_DIALOG (dialog));
}
static void
serialize_child (GString *str,
int indent,
GtkWidget *child)
{
const char *name;
name = gtk_widget_get_name (child);
g_string_append_printf (str, "%*s<child>\n", indent, "");
g_string_append_printf (str, "%*s <object class=\"GtkLabel\" id=\"%s\">\n", indent, "", name);
g_string_append_printf (str, "%*s <property name=\"label\">%s</property>\n", indent, "", name);
g_string_append_printf (str, "%*s </object>\n", indent, "");
g_string_append_printf (str, "%*s</child>\n", indent, "");
}
static char *
serialize_model (GListModel *list)
{
GString *str = g_string_new ("");
int i;
g_string_append (str, "<interface>\n");
g_string_append (str, " <object class=\"GtkBox\" id=\"view\">\n");
g_string_append (str, " <property name=\"layout-manager\">\n");
g_string_append (str, " <object class=\"GtkConstraintLayout\">\n");
g_string_append (str, " <constraints>\n");
for (i = 0; i < g_list_model_get_n_items (list); i++)
{
gpointer item = g_list_model_get_item (list, i);
g_object_unref (item);
if (GTK_IS_CONSTRAINT (item))
constraint_editor_serialize_constraint (str, 10, GTK_CONSTRAINT (item));
else if (GTK_IS_CONSTRAINT_GUIDE (item))
guide_editor_serialize_guide (str, 10, GTK_CONSTRAINT_GUIDE (item));
}
g_string_append (str, " </constraints>\n");
g_string_append (str, " </object>\n");
g_string_append (str, " </property>\n");
for (i = 0; i < g_list_model_get_n_items (list); i++)
{
gpointer item = g_list_model_get_item (list, i);
g_object_unref (item);
if (GTK_IS_WIDGET (item))
serialize_child (str, 4, GTK_WIDGET (item));
}
g_string_append (str, " </object>\n");
g_string_append (str, "</interface>\n");
return g_string_free (str, FALSE);
}
static void
save_response_cb (GtkNativeDialog *dialog,
gint response,
ConstraintEditorWindow *self)
{
gtk_native_dialog_hide (dialog);
if (response == GTK_RESPONSE_ACCEPT)
{
GListModel *model;
char *text, *filename;
GError *error = NULL;
model = constraint_view_get_model (CONSTRAINT_VIEW (self->view));
text = serialize_model (model);
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
if (!g_file_set_contents (filename, text, -1, &error))
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (self))),
GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"Saving failed");
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
"%s", error->message);
g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
gtk_widget_show (dialog);
g_error_free (error);
}
g_free (filename);
}
gtk_native_dialog_destroy (dialog);
}
static void
save_cb (GtkWidget *button,
ConstraintEditorWindow *self)
{
GtkFileChooserNative *dialog;
dialog = gtk_file_chooser_native_new ("Save constraints",
GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))),
GTK_FILE_CHOOSER_ACTION_SAVE,
"_Save",
"_Cancel");
gtk_native_dialog_set_modal (GTK_NATIVE_DIALOG (dialog), TRUE);
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), ".");
g_signal_connect (dialog, "response", G_CALLBACK (save_response_cb), self);
gtk_native_dialog_show (GTK_NATIVE_DIALOG (dialog));
}
static void
constraint_editor_window_finalize (GObject *object)
{
//ConstraintEditorWindow *self = (ConstraintEditorWindow *)object;
G_OBJECT_CLASS (constraint_editor_window_parent_class)->finalize (object);
}
static int child_counter;
static int guide_counter;
static void
add_child (ConstraintEditorWindow *win)
{
char *name;
child_counter++;
name = g_strdup_printf ("Child %d", child_counter);
constraint_view_add_child (CONSTRAINT_VIEW (win->view), name);
g_free (name);
}
static void
add_guide (ConstraintEditorWindow *win)
{
char *name;
GtkConstraintGuide *guide;
guide_counter++;
name = g_strdup_printf ("Guide %d", guide_counter);
guide = gtk_constraint_guide_new ();
gtk_constraint_guide_set_name (guide, name);
g_free (name);
constraint_view_add_guide (CONSTRAINT_VIEW (win->view), guide);
}
static void
constraint_editor_done (ConstraintEditor *editor,
GtkConstraint *constraint,
ConstraintEditorWindow *win)
{
GtkConstraint *old_constraint;
g_object_get (editor, "constraint", &old_constraint, NULL);
if (old_constraint)
constraint_view_remove_constraint (CONSTRAINT_VIEW (win->view), old_constraint);
constraint_view_add_constraint (CONSTRAINT_VIEW (win->view), constraint);
g_clear_object (&old_constraint);
gtk_widget_destroy (gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_WINDOW));
}
static void
edit_constraint (ConstraintEditorWindow *win,
GtkConstraint *constraint)
{
GtkWidget *window;
ConstraintEditor *editor;
GListModel *model;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (win));
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
if (constraint)
gtk_window_set_title (GTK_WINDOW (window), "Edit Constraint");
else
gtk_window_set_title (GTK_WINDOW (window), "Create Constraint");
model = constraint_view_get_model (CONSTRAINT_VIEW (win->view));
editor = constraint_editor_new (model, constraint);
gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (editor));
g_signal_connect (editor, "done", G_CALLBACK (constraint_editor_done), win);
gtk_widget_show (window);
}
static void
add_constraint (ConstraintEditorWindow *win)
{
edit_constraint (win, NULL);
}
static void
guide_editor_done (GuideEditor *editor,
GtkConstraintGuide *guide,
ConstraintEditorWindow *win)
{
gtk_widget_destroy (gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_WINDOW));
}
static void
edit_guide (ConstraintEditorWindow *win,
GtkConstraintGuide *guide)
{
GtkWidget *window;
GuideEditor *editor;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (win));
gtk_window_set_title (GTK_WINDOW (window), "Edit Guide");
editor = guide_editor_new (guide);
gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (editor));
g_signal_connect (editor, "done", G_CALLBACK (guide_editor_done), win);
gtk_widget_show (window);
}
static void
row_activated (GtkListBox *list,
GtkListBoxRow *row,
ConstraintEditorWindow *win)
{
GObject *item;
item = G_OBJECT (g_object_get_data (G_OBJECT (row), "item"));
if (GTK_IS_CONSTRAINT (item))
edit_constraint (win, GTK_CONSTRAINT (item));
else if (GTK_IS_CONSTRAINT_GUIDE (item))
edit_guide (win, GTK_CONSTRAINT_GUIDE (item));
}
static void
constraint_editor_window_class_init (ConstraintEditorWindowClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
g_type_ensure (CONSTRAINT_VIEW_TYPE);
object_class->finalize = constraint_editor_window_finalize;
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gtk/gtk4/constraint-editor/constraint-editor-window.ui");
gtk_widget_class_bind_template_child (widget_class, ConstraintEditorWindow, paned);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditorWindow, view);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditorWindow, list);
gtk_widget_class_bind_template_callback (widget_class, open_cb);
gtk_widget_class_bind_template_callback (widget_class, save_cb);
gtk_widget_class_bind_template_callback (widget_class, add_child);
gtk_widget_class_bind_template_callback (widget_class, add_guide);
gtk_widget_class_bind_template_callback (widget_class, add_constraint);
gtk_widget_class_bind_template_callback (widget_class, row_activated);
}
static void
row_edit (GtkButton *button,
ConstraintEditorWindow *win)
{
GtkWidget *row;
GObject *item;
row = gtk_widget_get_ancestor (GTK_WIDGET (button), GTK_TYPE_LIST_BOX_ROW);
item = (GObject *)g_object_get_data (G_OBJECT (row), "item");
if (GTK_IS_CONSTRAINT (item))
edit_constraint (win, GTK_CONSTRAINT (item));
else if (GTK_IS_CONSTRAINT_GUIDE (item))
edit_guide (win, GTK_CONSTRAINT_GUIDE (item));
}
static void
mark_constraints_invalid (ConstraintEditorWindow *win,
gpointer removed)
{
GtkWidget *child;
GObject *item;
for (child = gtk_widget_get_first_child (win->list);
child;
child = gtk_widget_get_next_sibling (child))
{
item = (GObject *)g_object_get_data (G_OBJECT (child), "item");
if (GTK_IS_CONSTRAINT (item))
{
GtkConstraint *constraint = GTK_CONSTRAINT (item);
if (gtk_constraint_get_target (constraint) == (GtkConstraintTarget *)removed ||
gtk_constraint_get_source (constraint) == (GtkConstraintTarget *)removed)
{
GtkWidget *button;
button = (GtkWidget *)g_object_get_data (G_OBJECT (child), "edit");
gtk_button_set_icon_name (GTK_BUTTON (button), "dialog-warning-symbolic");
gtk_widget_set_tooltip_text (button, "Constraint is invalid");
}
}
}
}
static void
row_delete (GtkButton *button,
ConstraintEditorWindow *win)
{
GtkWidget *row;
GObject *item;
row = gtk_widget_get_ancestor (GTK_WIDGET (button), GTK_TYPE_LIST_BOX_ROW);
item = (GObject *)g_object_get_data (G_OBJECT (row), "item");
if (GTK_IS_CONSTRAINT (item))
constraint_view_remove_constraint (CONSTRAINT_VIEW (win->view),
GTK_CONSTRAINT (item));
else if (GTK_IS_CONSTRAINT_GUIDE (item))
{
mark_constraints_invalid (win, item);
constraint_view_remove_guide (CONSTRAINT_VIEW (win->view),
GTK_CONSTRAINT_GUIDE (item));
}
else if (GTK_IS_WIDGET (item))
{
mark_constraints_invalid (win, item);
constraint_view_remove_child (CONSTRAINT_VIEW (win->view),
GTK_WIDGET (item));
}
}
static GtkWidget *
create_widget_func (gpointer item,
gpointer user_data)
{
ConstraintEditorWindow *win = user_data;
const char *name;
char *freeme = NULL;
GtkWidget *row, *box, *label, *button;
if (GTK_IS_WIDGET (item))
name = gtk_widget_get_name (GTK_WIDGET (item));
else if (GTK_IS_CONSTRAINT_GUIDE (item))
name = gtk_constraint_guide_get_name (GTK_CONSTRAINT_GUIDE (item));
else if (GTK_IS_CONSTRAINT (item))
name = freeme = constraint_editor_constraint_to_string (GTK_CONSTRAINT (item));
else
name = "";
row = gtk_list_box_row_new ();
g_object_set_data_full (G_OBJECT (row), "item", g_object_ref (item), g_object_unref);
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
label = gtk_label_new (name);
if (GTK_IS_WIDGET (item) || GTK_IS_CONSTRAINT_GUIDE (item))
g_object_bind_property (item, "name",
label, "label",
G_BINDING_DEFAULT);
g_object_set (label, "margin", 10, NULL);
gtk_label_set_xalign (GTK_LABEL (label), 0.0);
gtk_widget_set_hexpand (label, TRUE);
gtk_container_add (GTK_CONTAINER (row), box);
gtk_container_add (GTK_CONTAINER (box), label);
if (GTK_IS_CONSTRAINT (item) || GTK_IS_CONSTRAINT_GUIDE (item))
{
button = gtk_button_new_from_icon_name ("document-edit-symbolic");
gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
g_signal_connect (button, "clicked", G_CALLBACK (row_edit), win);
g_object_set_data (G_OBJECT (row), "edit", button);
gtk_container_add (GTK_CONTAINER (box), button);
button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
g_signal_connect (button, "clicked", G_CALLBACK (row_delete), win);
gtk_container_add (GTK_CONTAINER (box), button);
}
else if (GTK_IS_WIDGET (item))
{
button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
g_signal_connect (button, "clicked", G_CALLBACK (row_delete), win);
gtk_container_add (GTK_CONTAINER (box), button);
}
g_free (freeme);
return row;
}
static void
constraint_editor_window_init (ConstraintEditorWindow *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
gtk_list_box_bind_model (GTK_LIST_BOX (self->list),
constraint_view_get_model (CONSTRAINT_VIEW (self->view)),
create_widget_func,
self,
NULL);
}
ConstraintEditorWindow *
constraint_editor_window_new (ConstraintEditorApplication *application)
{
return g_object_new (CONSTRAINT_EDITOR_WINDOW_TYPE,
"application", application,
NULL);
}

View File

@@ -1,34 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen
*/
#pragma once
#include <gtk/gtk.h>
#include "constraint-editor-application.h"
#define CONSTRAINT_EDITOR_WINDOW_TYPE (constraint_editor_window_get_type ())
G_DECLARE_FINAL_TYPE (ConstraintEditorWindow, constraint_editor_window, CONSTRAINT, EDITOR_WINDOW, GtkApplicationWindow)
ConstraintEditorWindow * constraint_editor_window_new (ConstraintEditorApplication *application);
gboolean constraint_editor_window_load (ConstraintEditorWindow *self,
GFile *file);

View File

@@ -1,82 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="ConstraintEditorWindow" parent="GtkApplicationWindow">
<style>
<class name="devel"/>
</style>
<property name="title" translatable="yes">GTK Constraint Editor</property>
<property name="default-width">1024</property>
<property name="default-height">768</property>
<child type="titlebar">
<object class="GtkHeaderBar" id="header">
<property name="title" translatable="yes">GTK Constraint Editor</property>
<property name="show-title-buttons">1</property>
<child type="start">
<object class="GtkButton">
<property name="icon-name">document-open-symbolic</property>
<property name="tooltip-text">Open ui file</property>
<signal name="clicked" handler="open_cb"/>
</object>
</child>
<child type="start">
<object class="GtkButton">
<property name="icon-name">document-save-symbolic</property>
<property name="tooltip-text">Save to ui file</property>
<signal name="clicked" handler="save_cb"/>
</object>
</child>
</object>
</child>
<child>
<object class="GtkPaned" id="paned">
<property name="orientation">horizontal</property>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="orientation">horizontal</property>
<child>
<object class="GtkButton">
<property name="label">Add Child</property>
<signal name="clicked" handler="add_child" swapped="yes"/>
</object>
</child>
<child>
<object class="GtkButton">
<property name="label">Add Guide</property>
<signal name="clicked" handler="add_guide" swapped="yes"/>
</object>
</child>
<child>
<object class="GtkButton">
<property name="label">Add Constraint</property>
<signal name="clicked" handler="add_constraint" swapped="yes"/>
</object>
</child>
</object>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="hscrollbar-policy">never</property>
<property name="vscrollbar-policy">automatic</property>
<property name="vexpand">1</property>
<child>
<object class="GtkListBox" id="list">
<property name="show-separators">1</property>
<property name="selection-mode">none</property>
<signal name="row-activated" handler="row_activated"/>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="ConstraintView" id="view">
</object>
</child>
</object>
</child>
</template>
</interface>

View File

@@ -1,656 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen
*/
#include "config.h"
#include "constraint-editor.h"
struct _ConstraintEditor
{
GtkWidget parent_instance;
GtkWidget *grid;
GtkWidget *target;
GtkWidget *target_attr;
GtkWidget *relation;
GtkWidget *source;
GtkWidget *source_attr;
GtkWidget *multiplier;
GtkWidget *constant;
GtkWidget *strength;
GtkWidget *preview;
GtkWidget *button;
GtkConstraint *constraint;
GListModel *model;
gboolean constructed;
};
enum {
PROP_MODEL = 1,
PROP_CONSTRAINT,
LAST_PROP
};
static GParamSpec *pspecs[LAST_PROP];
enum {
DONE,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL];
G_DEFINE_TYPE(ConstraintEditor, constraint_editor, GTK_TYPE_WIDGET);
static const char *
get_target_name (GtkConstraintTarget *target)
{
if (target == NULL)
return "super";
else if (GTK_IS_WIDGET (target))
return gtk_widget_get_name (GTK_WIDGET (target));
else if (GTK_IS_CONSTRAINT_GUIDE (target))
return gtk_constraint_guide_get_name (GTK_CONSTRAINT_GUIDE (target));
else
return "";
}
static void
constraint_target_combo (GListModel *model,
GtkWidget *combo,
gboolean is_source)
{
int i;
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "super", "Super");
if (model)
{
for (i = 0; i < g_list_model_get_n_items (model); i++)
{
GObject *item = g_list_model_get_object (model, i);
const char *name;
if (GTK_IS_CONSTRAINT (item))
continue;
name = get_target_name (GTK_CONSTRAINT_TARGET (item));
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), name, name);
g_object_unref (item);
}
}
}
static void
constraint_attribute_combo (GtkWidget *combo,
gboolean is_source)
{
if (is_source)
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "none", "None");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "left", "Left");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "right", "Right");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "top", "Top");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "bottom", "Bottom");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "start", "Start");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "end", "End");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "width", "Width");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "height", "Height");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "center-x", "Center X");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "center-y", "Center Y");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "baseline", "Baseline");
}
static void
constraint_relation_combo (GtkWidget *combo)
{
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "le", "");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "eq", "=");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "ge", "");
}
static void
constraint_strength_combo (GtkWidget *combo)
{
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "weak", "Weak");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "medium", "Medium");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "strong", "Strong");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "required", "Required");
}
static gpointer
get_target (GListModel *model,
const char *id)
{
int i;
if (strcmp ("super", id) == 0)
return NULL;
for (i = 0; i < g_list_model_get_n_items (model); i++)
{
GObject *item = g_list_model_get_object (model, i);
g_object_unref (item);
if (GTK_IS_CONSTRAINT (item))
continue;
else if (GTK_IS_WIDGET (item))
{
if (strcmp (id, gtk_widget_get_name (GTK_WIDGET (item))) == 0)
return item;
}
else if (GTK_IS_CONSTRAINT_GUIDE (item))
{
if (strcmp (id, gtk_constraint_guide_get_name (GTK_CONSTRAINT_GUIDE (item))) == 0)
return item;
}
}
return NULL;
}
static GtkConstraintAttribute
get_target_attr (const char *id)
{
GtkConstraintAttribute attr;
GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_ATTRIBUTE);
GEnumValue *value = g_enum_get_value_by_nick (class, id);
attr = value->value;
g_type_class_unref (class);
return attr;
}
static const char *
get_attr_nick (GtkConstraintAttribute attr)
{
GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_ATTRIBUTE);
GEnumValue *value = g_enum_get_value (class, attr);
const char *nick = value->value_nick;
g_type_class_unref (class);
return nick;
}
static GtkConstraintRelation
get_relation (const char *id)
{
GtkConstraintRelation relation;
GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_RELATION);
GEnumValue *value = g_enum_get_value_by_nick (class, id);
relation = value->value;
g_type_class_unref (class);
return relation;
}
static const char *
get_relation_nick (GtkConstraintRelation relation)
{
GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_RELATION);
GEnumValue *value = g_enum_get_value (class, relation);
const char *nick = value->value_nick;
g_type_class_unref (class);
return nick;
}
static GtkConstraintStrength
get_strength (const char *id)
{
GtkConstraintStrength strength;
GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_STRENGTH);
GEnumValue *value = g_enum_get_value_by_nick (class, id);
strength = value->value;
g_type_class_unref (class);
return strength;
}
static const char *
get_strength_nick (GtkConstraintStrength strength)
{
GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_STRENGTH);
GEnumValue *value = g_enum_get_value (class, strength);
const char *nick = value->value_nick;
g_type_class_unref (class);
return nick;
}
void
constraint_editor_serialize_constraint (GString *str,
int indent,
GtkConstraint *constraint)
{
const char *target;
const char *target_attr;
const char *relation;
const char *source;
const char *source_attr;
double multiplier;
double constant;
const char *strength;
target = get_target_name (gtk_constraint_get_target (constraint));
target_attr = get_attr_nick (gtk_constraint_get_target_attribute (constraint));
relation = get_relation_nick (gtk_constraint_get_relation (constraint));
source = get_target_name (gtk_constraint_get_source (constraint));
source_attr = get_attr_nick (gtk_constraint_get_source_attribute (constraint));
multiplier = gtk_constraint_get_multiplier (constraint);
constant = gtk_constraint_get_constant (constraint);
strength = get_strength_nick (gtk_constraint_get_strength (constraint));
g_string_append_printf (str, "%*s<constraint target=\"%s\" target-attribute=\"%s\"\n", indent, "", target, target_attr);
g_string_append_printf (str, "%*s relation=\"%s\"\n", indent, "", relation);
if (strcmp (source_attr, "none") != 0)
{
g_string_append_printf (str, "%*s source=\"%s\" source-attribute=\"%s\"\n", indent, "", source, source_attr);
g_string_append_printf (str, "%*s multiplier=\"%g\"\n", indent, "", multiplier);
}
g_string_append_printf (str, "%*s constant=\"%g\"\n", indent, "", constant);
g_string_append_printf (str, "%*s strength=\"%s\" />\n", indent, "", strength);
}
static void
create_constraint (GtkButton *button,
ConstraintEditor *editor)
{
const char *id;
gpointer target;
GtkConstraintAttribute target_attr;
gpointer source;
GtkConstraintAttribute source_attr;
GtkConstraintRelation relation;
double multiplier;
double constant;
int strength;
GtkConstraint *constraint;
id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->target));
target = get_target (editor->model, id);
id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->target_attr));
target_attr = get_target_attr (id);
id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source));
source = get_target (editor->model, id);
id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source_attr));
source_attr = get_target_attr (id);
id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->relation));
relation = get_relation (id);
multiplier = g_ascii_strtod (gtk_editable_get_text (GTK_EDITABLE (editor->multiplier)), NULL);
constant = g_ascii_strtod (gtk_editable_get_text (GTK_EDITABLE (editor->constant)), NULL);
id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->strength));
strength = get_strength (id);
constraint = gtk_constraint_new (target, target_attr,
relation,
source, source_attr,
multiplier,
constant,
strength);
g_signal_emit (editor, signals[DONE], 0, constraint);
g_object_unref (constraint);
}
static void
source_attr_changed (ConstraintEditor *editor)
{
const char *id;
id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source_attr));
if (strcmp (id, "none") == 0)
{
gtk_combo_box_set_active (GTK_COMBO_BOX (editor->source), -1);
gtk_editable_set_text (GTK_EDITABLE (editor->multiplier), "");
gtk_widget_set_sensitive (editor->source, FALSE);
gtk_widget_set_sensitive (editor->multiplier, FALSE);
}
else
{
gtk_widget_set_sensitive (editor->source, TRUE);
gtk_widget_set_sensitive (editor->multiplier, TRUE);
}
}
char *
constraint_editor_constraint_to_string (GtkConstraint *constraint)
{
GString *str;
const char *name;
const char *attr;
const char *relation;
double c, m;
str = g_string_new ("");
name = get_target_name (gtk_constraint_get_target (constraint));
attr = get_attr_nick (gtk_constraint_get_target_attribute (constraint));
relation = get_relation_nick (gtk_constraint_get_relation (constraint));
if (name == NULL)
name = "[ ]";
g_string_append_printf (str, "%s.%s %s ", name, attr, relation);
c = gtk_constraint_get_constant (constraint);
attr = get_attr_nick (gtk_constraint_get_source_attribute (constraint));
if (strcmp (attr, "none") != 0)
{
name = get_target_name (gtk_constraint_get_source (constraint));
m = gtk_constraint_get_multiplier (constraint);
if (name == NULL)
name = "[ ]";
g_string_append_printf (str, "%s.%s", name, attr);
if (m != 1.0)
g_string_append_printf (str, " × %g", m);
if (c > 0.0)
g_string_append_printf (str, " + %g", c);
else if (c < 0.0)
g_string_append_printf (str, " - %g", -c);
}
else
g_string_append_printf (str, "%g", c);
return g_string_free (str, FALSE);
}
static void
update_preview (ConstraintEditor *editor)
{
GString *str;
const char *name;
const char *attr;
char *relation;
const char *multiplier;
const char *constant;
double c, m;
if (!editor->constructed)
return;
str = g_string_new ("");
name = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->target));
attr = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->target_attr));
relation = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (editor->relation));
if (name == NULL)
name = "[ ]";
g_string_append_printf (str, "%s.%s %s ", name, attr, relation);
g_free (relation);
constant = gtk_editable_get_text (GTK_EDITABLE (editor->constant));
c = g_ascii_strtod (constant, NULL);
attr = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source_attr));
if (strcmp (attr, "none") != 0)
{
name = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source));
multiplier = gtk_editable_get_text (GTK_EDITABLE (editor->multiplier));
m = g_ascii_strtod (multiplier, NULL);
if (name == NULL)
name = "[ ]";
g_string_append_printf (str, "%s.%s", name, attr);
if (m != 1.0)
g_string_append_printf (str, " × %g", m);
if (c > 0.0)
g_string_append_printf (str, " + %g", c);
else if (c < 0.0)
g_string_append_printf (str, " - %g", -c);
}
else
g_string_append_printf (str, "%g", c);
gtk_label_set_label (GTK_LABEL (editor->preview), str->str);
g_string_free (str, TRUE);
}
static void
update_button (ConstraintEditor *editor)
{
if (gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->target)) != NULL &&
gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source)) != NULL)
gtk_widget_set_sensitive (editor->button, TRUE);
else
gtk_widget_set_sensitive (editor->button, FALSE);
}
static void
constraint_editor_init (ConstraintEditor *editor)
{
gtk_widget_init_template (GTK_WIDGET (editor));
}
static void
constraint_editor_constructed (GObject *object)
{
ConstraintEditor *editor = CONSTRAINT_EDITOR (object);
constraint_target_combo (editor->model, editor->target, FALSE);
constraint_attribute_combo (editor->target_attr, FALSE);
constraint_relation_combo (editor->relation);
constraint_target_combo (editor->model, editor->source, TRUE);
constraint_attribute_combo (editor->source_attr, TRUE);
constraint_strength_combo (editor->strength);
if (editor->constraint)
{
GtkConstraintTarget *target;
GtkConstraintAttribute attr;
GtkConstraintRelation relation;
GtkConstraintStrength strength;
const char *nick;
char *val;
double multiplier;
double constant;
target = gtk_constraint_get_target (editor->constraint);
nick = get_target_name (target);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->target), nick);
attr = gtk_constraint_get_target_attribute (editor->constraint);
nick = get_attr_nick (attr);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->target_attr), nick);
target = gtk_constraint_get_source (editor->constraint);
nick = get_target_name (target);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->source), nick);
attr = gtk_constraint_get_source_attribute (editor->constraint);
nick = get_attr_nick (attr);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->source_attr), nick);
relation = gtk_constraint_get_relation (editor->constraint);
nick = get_relation_nick (relation);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->relation), nick);
multiplier = gtk_constraint_get_multiplier (editor->constraint);
val = g_strdup_printf ("%g", multiplier);
gtk_editable_set_text (GTK_EDITABLE (editor->multiplier), val);
g_free (val);
constant = gtk_constraint_get_constant (editor->constraint);
val = g_strdup_printf ("%g", constant);
gtk_editable_set_text (GTK_EDITABLE (editor->constant), val);
g_free (val);
strength = gtk_constraint_get_strength (editor->constraint);
nick = get_strength_nick (strength);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->strength), nick);
gtk_button_set_label (GTK_BUTTON (editor->button), "Apply");
}
else
{
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->target_attr), "left");
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->source_attr), "left");
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->relation), "eq");
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->strength), "required");
gtk_editable_set_text (GTK_EDITABLE (editor->multiplier), "1.0");
gtk_editable_set_text (GTK_EDITABLE (editor->constant), "0.0");
gtk_button_set_label (GTK_BUTTON (editor->button), "Create");
}
editor->constructed = TRUE;
update_preview (editor);
update_button (editor);
}
static void
constraint_editor_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
ConstraintEditor *self = CONSTRAINT_EDITOR (object);
switch (property_id)
{
case PROP_MODEL:
self->model = g_value_dup_object (value);
break;
case PROP_CONSTRAINT:
self->constraint = g_value_dup_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
constraint_editor_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
ConstraintEditor *self = CONSTRAINT_EDITOR (object);
switch (property_id)
{
case PROP_MODEL:
g_value_set_object (value, self->model);
break;
case PROP_CONSTRAINT:
g_value_set_object (value, self->constraint);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
constraint_editor_dispose (GObject *object)
{
ConstraintEditor *self = (ConstraintEditor *)object;
g_clear_pointer (&self->grid, gtk_widget_unparent);
g_clear_object (&self->model);
g_clear_object (&self->constraint);
G_OBJECT_CLASS (constraint_editor_parent_class)->dispose (object);
}
static void
constraint_editor_class_init (ConstraintEditorClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->constructed = constraint_editor_constructed;
object_class->dispose = constraint_editor_dispose;
object_class->set_property = constraint_editor_set_property;
object_class->get_property = constraint_editor_get_property;
pspecs[PROP_CONSTRAINT] =
g_param_spec_object ("constraint", "constraint", "constraint",
GTK_TYPE_CONSTRAINT,
G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY);
pspecs[PROP_MODEL] =
g_param_spec_object ("model", "model", "model",
G_TYPE_LIST_MODEL,
G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_properties (object_class, LAST_PROP, pspecs);
signals[DONE] =
g_signal_new ("done",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
NULL,
G_TYPE_NONE, 1, GTK_TYPE_CONSTRAINT);
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gtk/gtk4/constraint-editor/constraint-editor.ui");
gtk_widget_class_bind_template_child (widget_class, ConstraintEditor, grid);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditor, target);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditor, target_attr);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditor, relation);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditor, source);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditor, source_attr);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditor, multiplier);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditor, constant);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditor, strength);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditor, preview);
gtk_widget_class_bind_template_child (widget_class, ConstraintEditor, button);
gtk_widget_class_bind_template_callback (widget_class, update_preview);
gtk_widget_class_bind_template_callback (widget_class, update_button);
gtk_widget_class_bind_template_callback (widget_class, create_constraint);
gtk_widget_class_bind_template_callback (widget_class, source_attr_changed);
}
ConstraintEditor *
constraint_editor_new (GListModel *model,
GtkConstraint *constraint)
{
return g_object_new (CONSTRAINT_EDITOR_TYPE,
"model", model,
"constraint", constraint,
NULL);
}

View File

@@ -1,12 +0,0 @@
constraintview {
background: black;
color: white;
}
constraintview .child {
background: red;
}
constraintview .guide {
background: blue;
}

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/org/gtk/gtk4/constraint-editor">
<file preprocess="xml-stripblanks">constraint-editor-window.ui</file>
<file preprocess="xml-stripblanks">constraint-editor.ui</file>
<file preprocess="xml-stripblanks">guide-editor.ui</file>
<file>constraint-editor.css</file>
</gresource>
</gresources>

View File

@@ -1,34 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen
*/
#pragma once
#include <gtk/gtk.h>
#define CONSTRAINT_EDITOR_TYPE (constraint_editor_get_type ())
G_DECLARE_FINAL_TYPE (ConstraintEditor, constraint_editor, CONSTRAINT, EDITOR, GtkWidget)
ConstraintEditor * constraint_editor_new (GListModel *model,
GtkConstraint *constraint);
void constraint_editor_serialize_constraint (GString *str,
int indent,
GtkConstraint *constraint);
char *constraint_editor_constraint_to_string (GtkConstraint *constraint);

View File

@@ -1,163 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="ConstraintEditor" parent="GtkWidget">
<child>
<object class="GtkGrid" id="grid">
<property name="margin">20</property>
<property name="row-spacing">10</property>
<property name="column-spacing">10</property>
<child>
<object class="GtkLabel">
<property name="label">Target</property>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkComboBoxText" id="target">
<signal name="changed" handler="update_preview" swapped="yes"/>
<signal name="changed" handler="update_button" swapped="yes"/>
<layout>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkComboBoxText" id="target_attr">
<signal name="changed" handler="update_preview" swapped="yes"/>
<layout>
<property name="left-attach">2</property>
<property name="top-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Relation</property>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkComboBoxText" id="relation">
<signal name="changed" handler="update_preview" swapped="yes"/>
<layout>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Source</property>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkComboBoxText" id="source">
<signal name="changed" handler="update_preview" swapped="yes"/>
<signal name="changed" handler="update_button" swapped="yes"/>
<layout>
<property name="left-attach">1</property>
<property name="top-attach">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkComboBoxText" id="source_attr">
<signal name="changed" handler="update_preview" swapped="yes"/>
<signal name="changed" handler="source_attr_changed" swapped="yes"/>
<layout>
<property name="left-attach">2</property>
<property name="top-attach">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Multiplier</property>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">4</property>
</layout>
</object>
</child>
<child>
<object class="GtkEntry" id="multiplier">
<signal name="changed" handler="update_preview" swapped="yes"/>
<layout>
<property name="left-attach">1</property>
<property name="top-attach">4</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Constant</property>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">5</property>
</layout>
</object>
</child>
<child>
<object class="GtkEntry" id="constant">
<signal name="changed" handler="update_preview" swapped="yes"/>
<layout>
<property name="left-attach">1</property>
<property name="top-attach">5</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Strength</property>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">6</property>
</layout>
</object>
</child>
<child>
<object class="GtkComboBoxText" id="strength">
<layout>
<property name="left-attach">1</property>
<property name="top-attach">6</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="preview">
<property name="xalign">0</property>
<layout>
<property name="left-attach">1</property>
<property name="top-attach">7</property>
<property name="column-span">2</property>
</layout>
<attributes>
<attribute name="scale" value="1.44"/>
</attributes>
</object>
</child>
<child>
<object class="GtkButton" id="button">
<property name="label">Create</property>
<signal name="clicked" handler="create_constraint"/>
<layout>
<property name="left-attach">2</property>
<property name="top-attach">8</property>
</layout>
</object>
</child>
</object>
</child>
</template>
</interface>

View File

@@ -1,93 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen
*/
#include "constraint-view-child.h"
struct _ConstraintViewChild
{
GObject parent_instance;
char *name;
};
enum {
PROP_NAME = 1,
LAST_PROP
};
static GParamSpec props[LAST_PROP];
G_DEFINE_TYPE (ConstraintViewChild, constraint_view_child, G_TYPE_OBJECT)
static void
constraint_view_child_init (ConstraintViewChild *child)
{
}
static void
constraint_view_child_finalize (GObject *object)
{
ConstraintViewChild *child = CONSTRAINT_VIEW_CHILD (object);
g_free (child->name);
G_OBJECT_CLASS (constraint_view_child_parent_class)->finalize (object);
}
static void
constraint_view_child_set_property (GObject *object,
static void
constraint_view_child_class_init (ConstraintViewChildClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
object_class->finalize = constraint_view_child_finalize;
object_class->get_property = constraint_view_child_get_property;
object_class->set_property = constraint_view_child_set_property;
props[PROP_NAME] =
g_param_spec_string ("name", "name", "name",
NULL,
G_PARAM_READWRITE);
g_object_class_install_properties (object_class, LAST_PROP, props);
}
#define CONSTRAINT_VIEW_CHILD_TYPE (constraint_view_get_type ())
G_DECLARE_TYPE (ConstraintViewChild, constraint_view_child, CONSTRAINT, VIEW_CHILD, GObject)
#define CONSTRAINT_VIEW_WIDGET_TYPE (constraint_view_widget_get_type ())
G_DECLARE_FINAL_TYPE (ConstraintViewWidget, constraint_view_widget, CONSTRAINT, VIEW_WIDGET, ConstraintViewChild)
ConstraintViewWidget * constraint_view_widget_new (void);
#define CONSTRAINT_VIEW_GUIDE_TYPE (constraint_view_guide_get_type ())
G_DECLARE_FINAL_TYPE (ConstraintViewGuide, constraint_view_guide, CONSTRAINT, VIEW_GUIDE, ConstraintViewChild)
ConstraintViewGuide * constraint_view_guide_new (void);
#define CONSTRAINT_VIEW_CONSTRAINT_TYPE (constraint_view_constraint_get_type ())
G_DECLARE_FINAL_TYPE (ConstraintViewConstraint, constraint_view_constraint, CONSTRAINT, VIEW_CONSTRAINT, ConstraintViewChild)
ConstraintViewGuide * constraint_view_constraint_new (void);

View File

@@ -1,44 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen
*/
#pragma once
#include <gtk/gtk.h>
#define CONSTRAINT_VIEW_CHILD_TYPE (constraint_view_get_type ())
G_DECLARE_TYPE (ConstraintViewChild, constraint_view_child, CONSTRAINT, VIEW_CHILD, GObject)
#define CONSTRAINT_VIEW_WIDGET_TYPE (constraint_view_widget_get_type ())
G_DECLARE_FINAL_TYPE (ConstraintViewWidget, constraint_view_widget, CONSTRAINT, VIEW_WIDGET, ConstraintViewChild)
ConstraintViewWidget * constraint_view_widget_new (void);
#define CONSTRAINT_VIEW_GUIDE_TYPE (constraint_view_guide_get_type ())
G_DECLARE_FINAL_TYPE (ConstraintViewGuide, constraint_view_guide, CONSTRAINT, VIEW_GUIDE, ConstraintViewChild)
ConstraintViewGuide * constraint_view_guide_new (void);
#define CONSTRAINT_VIEW_CONSTRAINT_TYPE (constraint_view_constraint_get_type ())
G_DECLARE_FINAL_TYPE (ConstraintViewConstraint, constraint_view_constraint, CONSTRAINT, VIEW_CONSTRAINT, ConstraintViewChild)
ConstraintViewGuide * constraint_view_constraint_new (void);

View File

@@ -1,343 +0,0 @@
/* Copyright (C) 2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include <gtk/gtk.h>
#include "constraint-view.h"
struct _ConstraintView
{
GtkWidget parent;
GListModel *model;
GtkWidget *drag_widget;
};
G_DEFINE_TYPE (ConstraintView, constraint_view, GTK_TYPE_WIDGET);
static void
constraint_view_dispose (GObject *object)
{
ConstraintView *view = CONSTRAINT_VIEW (object);
GtkWidget *child;
while ((child = gtk_widget_get_first_child (GTK_WIDGET (view))) != NULL)
gtk_widget_unparent (child);
g_clear_object (&view->model);
G_OBJECT_CLASS (constraint_view_parent_class)->dispose (object);
}
static void
constraint_view_class_init (ConstraintViewClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->dispose = constraint_view_dispose;
gtk_widget_class_set_css_name (widget_class, "constraintview");
}
static void
update_weak_position (ConstraintView *self,
GtkWidget *child,
double x,
double y)
{
GtkLayoutManager *manager;
GtkConstraint *constraint;
manager = gtk_widget_get_layout_manager (GTK_WIDGET (self));
constraint = (GtkConstraint *)g_object_get_data (G_OBJECT (child), "x-constraint");
if (constraint)
{
gtk_constraint_layout_remove_constraint (GTK_CONSTRAINT_LAYOUT (manager),
constraint);
g_object_set_data (G_OBJECT (child), "x-constraint", NULL);
}
if (x != -100)
{
constraint = gtk_constraint_new_constant (child,
GTK_CONSTRAINT_ATTRIBUTE_CENTER_X,
GTK_CONSTRAINT_RELATION_EQ,
x,
GTK_CONSTRAINT_STRENGTH_WEAK);
g_object_set_data (G_OBJECT (constraint), "internal", "yes");
gtk_constraint_layout_add_constraint (GTK_CONSTRAINT_LAYOUT (manager),
constraint);
g_object_set_data (G_OBJECT (child), "x-constraint", constraint);
}
constraint = (GtkConstraint *)g_object_get_data (G_OBJECT (child), "y-constraint");
if (constraint)
{
gtk_constraint_layout_remove_constraint (GTK_CONSTRAINT_LAYOUT (manager),
constraint);
g_object_set_data (G_OBJECT (child), "y-constraint", NULL);
}
if (y != -100)
{
constraint = gtk_constraint_new_constant (child,
GTK_CONSTRAINT_ATTRIBUTE_CENTER_Y,
GTK_CONSTRAINT_RELATION_EQ,
y,
GTK_CONSTRAINT_STRENGTH_WEAK);
g_object_set_data (G_OBJECT (constraint), "internal", "yes");
gtk_constraint_layout_add_constraint (GTK_CONSTRAINT_LAYOUT (manager),
constraint);
g_object_set_data (G_OBJECT (child), "y-constraint", constraint);
}
}
static void
drag_begin (GtkGestureDrag *drag,
double start_x,
double start_y,
ConstraintView *self)
{
GtkWidget *widget;
widget = gtk_widget_pick (GTK_WIDGET (self), start_x, start_y, GTK_PICK_DEFAULT);
if (GTK_IS_LABEL (widget))
{
widget = gtk_widget_get_ancestor (widget, GTK_TYPE_FRAME);
if (widget &&
gtk_widget_get_parent (widget) == (GtkWidget *)self)
{
self->drag_widget = widget;
}
}
}
static void
drag_update (GtkGestureDrag *drag,
double offset_x,
double offset_y,
ConstraintView *self)
{
double x, y;
if (!self->drag_widget)
return;
gtk_gesture_drag_get_start_point (drag, &x, &y);
update_weak_position (self, self->drag_widget, x + offset_x, y + offset_y);
}
static void
drag_end (GtkGestureDrag *drag,
double offset_x,
double offset_y,
ConstraintView *self)
{
self->drag_widget = NULL;
}
static gboolean
omit_internal (gpointer item, gpointer user_data)
{
if (g_object_get_data (G_OBJECT (item), "internal"))
return FALSE;
return TRUE;
}
static void
constraint_view_init (ConstraintView *self)
{
GtkLayoutManager *manager;
GtkEventController *controller;
GListStore *list;
GListModel *all_children;
GListModel *all_constraints;
GListModel *guides;
GListModel *children;
GListModel *constraints;
manager = gtk_constraint_layout_new ();
gtk_widget_set_layout_manager (GTK_WIDGET (self), manager);
all_children = gtk_widget_observe_children (GTK_WIDGET (self));
all_constraints = gtk_constraint_layout_observe_constraints (GTK_CONSTRAINT_LAYOUT (manager));
guides = gtk_constraint_layout_observe_guides (GTK_CONSTRAINT_LAYOUT (manager));
constraints = (GListModel *)gtk_filter_list_model_new (all_constraints, omit_internal, NULL, NULL);
children = (GListModel *)gtk_filter_list_model_new (all_children, omit_internal, NULL, NULL);
list = g_list_store_new (G_TYPE_LIST_MODEL);
g_list_store_append (list, children);
g_list_store_append (list, guides);
g_list_store_append (list, constraints);
self->model = G_LIST_MODEL (gtk_flatten_list_model_new (G_TYPE_OBJECT, G_LIST_MODEL (list)));
g_object_unref (children);
g_object_unref (guides);
g_object_unref (constraints);
g_object_unref (all_children);
g_object_unref (all_constraints);
g_object_unref (list);
controller = (GtkEventController *)gtk_gesture_drag_new ();
g_signal_connect (controller, "drag-begin", G_CALLBACK (drag_begin), self);
g_signal_connect (controller, "drag-update", G_CALLBACK (drag_update), self);
g_signal_connect (controller, "drag-end", G_CALLBACK (drag_end), self);
gtk_widget_add_controller (GTK_WIDGET (self), controller);
}
ConstraintView *
constraint_view_new (void)
{
return g_object_new (CONSTRAINT_VIEW_TYPE, NULL);
}
void
constraint_view_add_child (ConstraintView *view,
const char *name)
{
GtkWidget *frame;
GtkWidget *label;
label = gtk_label_new (name);
frame = gtk_frame_new (NULL);
gtk_style_context_add_class (gtk_widget_get_style_context (frame), "child");
gtk_widget_set_name (frame, name);
gtk_container_add (GTK_CONTAINER (frame), label);
gtk_widget_set_parent (frame, GTK_WIDGET (view));
update_weak_position (view, frame, 100, 100);
}
void
constraint_view_remove_child (ConstraintView *view,
GtkWidget *child)
{
update_weak_position (view, child, -100, -100);
gtk_widget_unparent (child);
}
void
constraint_view_add_guide (ConstraintView *view,
GtkConstraintGuide *guide)
{
GtkConstraintLayout *layout;
GtkWidget *frame;
GtkWidget *label;
const char *name;
GtkConstraint *constraint;
struct {
const char *name;
GtkConstraintAttribute attr;
} names[] = {
{ "left-constraint", GTK_CONSTRAINT_ATTRIBUTE_LEFT },
{ "top-constraint", GTK_CONSTRAINT_ATTRIBUTE_TOP },
{ "width-constraint", GTK_CONSTRAINT_ATTRIBUTE_WIDTH },
{ "height-constraint", GTK_CONSTRAINT_ATTRIBUTE_HEIGHT },
};
int i;
name = gtk_constraint_guide_get_name (guide);
label = gtk_label_new (name);
g_object_bind_property (guide, "name",
label, "label",
G_BINDING_DEFAULT);
frame = gtk_frame_new (NULL);
gtk_style_context_add_class (gtk_widget_get_style_context (frame), "guide");
g_object_set_data (G_OBJECT (frame), "internal", "yes");
gtk_container_add (GTK_CONTAINER (frame), label);
gtk_widget_insert_after (frame, GTK_WIDGET (view), NULL);
g_object_set_data (G_OBJECT (guide), "frame", frame);
layout = GTK_CONSTRAINT_LAYOUT (gtk_widget_get_layout_manager (GTK_WIDGET (view)));
gtk_constraint_layout_add_guide (layout, g_object_ref (guide));
for (i = 0; i < G_N_ELEMENTS (names); i++)
{
constraint = gtk_constraint_new (frame,
names[i].attr,
GTK_CONSTRAINT_RELATION_EQ,
guide,
names[i].attr,
1.0, 0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED);
g_object_set_data (G_OBJECT (constraint), "internal", "yes");
gtk_constraint_layout_add_constraint (layout, constraint);
g_object_set_data (G_OBJECT (guide), names[i].name, constraint);
}
update_weak_position (view, frame, 150, 150);
}
void
constraint_view_remove_guide (ConstraintView *view,
GtkConstraintGuide *guide)
{
GtkConstraintLayout *layout;
GtkWidget *frame;
GtkConstraint *constraint;
const char *names[] = {
"left-constraint",
"top-constraint",
"width-constraint",
"height-constraint"
};
int i;
layout = GTK_CONSTRAINT_LAYOUT (gtk_widget_get_layout_manager (GTK_WIDGET (view)));
for (i = 0; i < G_N_ELEMENTS (names); i++)
{
constraint = (GtkConstraint*)g_object_get_data (G_OBJECT (guide), names[i]);
gtk_constraint_layout_remove_constraint (layout, constraint);
}
frame = (GtkWidget *)g_object_get_data (G_OBJECT (guide), "frame");
update_weak_position (view, frame, -100, -100);
gtk_widget_unparent (frame);
gtk_constraint_layout_remove_guide (layout, guide);
}
void
constraint_view_add_constraint (ConstraintView *view,
GtkConstraint *constraint)
{
GtkLayoutManager *manager;
manager = gtk_widget_get_layout_manager (GTK_WIDGET (view));
gtk_constraint_layout_add_constraint (GTK_CONSTRAINT_LAYOUT (manager),
g_object_ref (constraint));
}
void
constraint_view_remove_constraint (ConstraintView *view,
GtkConstraint *constraint)
{
GtkLayoutManager *manager;
manager = gtk_widget_get_layout_manager (GTK_WIDGET (view));
gtk_constraint_layout_remove_constraint (GTK_CONSTRAINT_LAYOUT (manager),
constraint);
}
GListModel *
constraint_view_get_model (ConstraintView *view)
{
return view->model;
}

View File

@@ -1,44 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen
*/
#pragma once
#include <gtk/gtk.h>
#define CONSTRAINT_VIEW_TYPE (constraint_view_get_type ())
G_DECLARE_FINAL_TYPE (ConstraintView, constraint_view, CONSTRAINT, VIEW, GtkWidget)
ConstraintView * constraint_view_new (void);
void constraint_view_add_child (ConstraintView *view,
const char *name);
void constraint_view_remove_child (ConstraintView *view,
GtkWidget *child);
void constraint_view_add_guide (ConstraintView *view,
GtkConstraintGuide *guide);
void constraint_view_remove_guide (ConstraintView *view,
GtkConstraintGuide *guide);
void constraint_view_guide_changed (ConstraintView *view,
GtkConstraintGuide *guide);
void constraint_view_add_constraint (ConstraintView *view,
GtkConstraint *constraint);
void constraint_view_remove_constraint (ConstraintView *view,
GtkConstraint *constraint);
GListModel * constraint_view_get_model (ConstraintView *view);

View File

@@ -1,411 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen
*/
#include "config.h"
#include "guide-editor.h"
struct _GuideEditor
{
GtkWidget parent_instance;
GtkWidget *grid;
GtkWidget *name;
GtkWidget *min_width;
GtkWidget *min_height;
GtkWidget *nat_width;
GtkWidget *nat_height;
GtkWidget *max_width;
GtkWidget *max_height;
GtkWidget *strength;
GtkWidget *button;
GtkConstraintGuide *guide;
gboolean constructed;
};
enum {
PROP_GUIDE = 1,
LAST_PROP
};
static GParamSpec *pspecs[LAST_PROP];
enum {
DONE,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL];
G_DEFINE_TYPE(GuideEditor, guide_editor, GTK_TYPE_WIDGET);
static void
guide_strength_combo (GtkWidget *combo)
{
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "weak", "Weak");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "medium", "Medium");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "strong", "Strong");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "required", "Required");
}
static GtkConstraintStrength
get_strength (const char *id)
{
GtkConstraintStrength strength;
GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_STRENGTH);
GEnumValue *value = g_enum_get_value_by_nick (class, id);
strength = value->value;
g_type_class_unref (class);
return strength;
}
const char *
get_strength_nick (GtkConstraintStrength strength)
{
GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_STRENGTH);
GEnumValue *value = g_enum_get_value (class, strength);
const char *nick = value->value_nick;
g_type_class_unref (class);
return nick;
}
void
guide_editor_serialize_guide (GString *str,
int indent,
GtkConstraintGuide *guide)
{
int min_width, min_height;
int nat_width, nat_height;
int max_width, max_height;
const char *name;
const char *strength;
gtk_constraint_guide_get_min_size (guide, &min_width, &min_height);
gtk_constraint_guide_get_nat_size (guide, &nat_width, &nat_height);
gtk_constraint_guide_get_max_size (guide, &max_width, &max_height);
name = gtk_constraint_guide_get_name (guide);
strength = get_strength_nick (gtk_constraint_guide_get_strength (guide));
g_string_append_printf (str, "%*s<guide min-width=\"%d\" min-height=\"%d\"\n", indent, "", min_width, min_height);
g_string_append_printf (str, "%*s nat-width=\"%d\" nat-height=\"%d\"\n", indent, "", nat_width, nat_height);
g_string_append_printf (str, "%*s max-width=\"%d\" max-height=\"%d\"\n", indent, "", max_width, max_height);
g_string_append_printf (str, "%*s name=\"%s\" strength=\"%s\" />\n", indent, "", name, strength);
}
static void
create_guide (GtkButton *button,
GuideEditor *editor)
{
const char *id;
int strength;
const char *name;
int w, h;
GtkConstraintGuide *guide;
if (editor->guide)
guide = g_object_ref (editor->guide);
else
guide = gtk_constraint_guide_new ();
name = gtk_editable_get_text (GTK_EDITABLE (editor->name));
gtk_constraint_guide_set_name (guide, name);
w = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (editor->min_width));
h = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (editor->min_height));
gtk_constraint_guide_set_min_size (guide, w, h);
w = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (editor->nat_width));
h = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (editor->nat_height));
gtk_constraint_guide_set_nat_size (guide, w, h);
w = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (editor->max_width));
h = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (editor->max_height));
gtk_constraint_guide_set_max_size (guide, w, h);
id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->strength));
strength = get_strength (id);
gtk_constraint_guide_set_strength (guide, strength);
g_signal_emit (editor, signals[DONE], 0, guide);
g_object_unref (guide);
}
static void
guide_editor_init (GuideEditor *editor)
{
gtk_widget_init_template (GTK_WIDGET (editor));
}
static int guide_counter;
static int
min_input (GtkSpinButton *spin_button,
double *new_val)
{
if (strcmp (gtk_editable_get_text (GTK_EDITABLE (spin_button)), "") == 0)
{
*new_val = 0.0;
return TRUE;
}
return FALSE;
}
static int
max_input (GtkSpinButton *spin_button,
double *new_val)
{
if (strcmp (gtk_editable_get_text (GTK_EDITABLE (spin_button)), "") == 0)
{
*new_val = G_MAXINT;
return TRUE;
}
return FALSE;
}
static gboolean
min_output (GtkSpinButton *spin_button)
{
GtkAdjustment *adjustment;
double value;
GtkWidget *box, *text;
adjustment = gtk_spin_button_get_adjustment (spin_button);
value = gtk_adjustment_get_value (adjustment);
box = gtk_widget_get_first_child (GTK_WIDGET (spin_button));
text = gtk_widget_get_first_child (box);
if (value == 0.0)
{
gtk_editable_set_text (GTK_EDITABLE (spin_button), "");
gtk_text_set_placeholder_text (GTK_TEXT (text), "unset");
return TRUE;
}
else
{
gtk_text_set_placeholder_text (GTK_TEXT (text), "");
return FALSE;
}
}
static gboolean
max_output (GtkSpinButton *spin_button)
{
GtkAdjustment *adjustment;
double value;
GtkWidget *box, *text;
adjustment = gtk_spin_button_get_adjustment (spin_button);
value = gtk_adjustment_get_value (adjustment);
box = gtk_widget_get_first_child (GTK_WIDGET (spin_button));
text = gtk_widget_get_first_child (box);
if (value == (double)G_MAXINT)
{
gtk_editable_set_text (GTK_EDITABLE (spin_button), "");
gtk_text_set_placeholder_text (GTK_TEXT (text), "unset");
return TRUE;
}
else
{
gtk_text_set_placeholder_text (GTK_TEXT (text), "");
return FALSE;
}
}
static void
guide_editor_constructed (GObject *object)
{
GuideEditor *editor = GUIDE_EDITOR (object);
guide_strength_combo (editor->strength);
g_signal_connect (editor->min_width, "input", G_CALLBACK (min_input), NULL);
g_signal_connect (editor->min_width, "output", G_CALLBACK (min_output), NULL);
g_signal_connect (editor->min_height, "input", G_CALLBACK (min_input), NULL);
g_signal_connect (editor->min_height, "output", G_CALLBACK (min_output), NULL);
g_signal_connect (editor->max_width, "input", G_CALLBACK (max_input), NULL);
g_signal_connect (editor->max_width, "output", G_CALLBACK (max_output), NULL);
g_signal_connect (editor->max_height, "input", G_CALLBACK (max_input), NULL);
g_signal_connect (editor->max_height, "output", G_CALLBACK (max_output), NULL);
if (editor->guide)
{
GtkConstraintStrength strength;
const char *nick;
int w, h;
nick = gtk_constraint_guide_get_name (editor->guide);
if (nick)
gtk_editable_set_text (GTK_EDITABLE (editor->name), nick);
gtk_constraint_guide_get_min_size (editor->guide, &w, &h);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->min_width), w);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->min_height), h);
gtk_constraint_guide_get_nat_size (editor->guide, &w, &h);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->nat_width), w);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->nat_height), h);
gtk_constraint_guide_get_max_size (editor->guide, &w, &h);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->max_width), w);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->max_height), h);
strength = gtk_constraint_guide_get_strength (editor->guide);
nick = get_strength_nick (strength);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->strength), nick);
gtk_button_set_label (GTK_BUTTON (editor->button), "Apply");
}
else
{
char *name;
guide_counter++;
name = g_strdup_printf ("Guide %d", guide_counter);
gtk_editable_set_text (GTK_EDITABLE (editor->name), name);
g_free (name);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->min_width), 0.0);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->min_height), 0.0);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->nat_width), 0.0);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->nat_height), 0.0);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->max_width), G_MAXINT);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->max_height), G_MAXINT);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->strength), "medium");
gtk_button_set_label (GTK_BUTTON (editor->button), "Create");
}
editor->constructed = TRUE;
}
static void
guide_editor_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
GuideEditor *self = GUIDE_EDITOR (object);
switch (property_id)
{
case PROP_GUIDE:
self->guide = g_value_dup_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
guide_editor_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
GuideEditor *self = GUIDE_EDITOR (object);
switch (property_id)
{
case PROP_GUIDE:
g_value_set_object (value, self->guide);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
guide_editor_dispose (GObject *object)
{
GuideEditor *self = (GuideEditor *)object;
g_clear_pointer (&self->grid, gtk_widget_unparent);
g_clear_object (&self->guide);
G_OBJECT_CLASS (guide_editor_parent_class)->dispose (object);
}
static void
guide_editor_class_init (GuideEditorClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->constructed = guide_editor_constructed;
object_class->dispose = guide_editor_dispose;
object_class->set_property = guide_editor_set_property;
object_class->get_property = guide_editor_get_property;
pspecs[PROP_GUIDE] =
g_param_spec_object ("guide", "guide", "guide",
GTK_TYPE_CONSTRAINT_GUIDE,
G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_properties (object_class, LAST_PROP, pspecs);
signals[DONE] =
g_signal_new ("done",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
NULL,
G_TYPE_NONE, 1, GTK_TYPE_CONSTRAINT_GUIDE);
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gtk/gtk4/constraint-editor/guide-editor.ui");
gtk_widget_class_bind_template_child (widget_class, GuideEditor, grid);
gtk_widget_class_bind_template_child (widget_class, GuideEditor, name);
gtk_widget_class_bind_template_child (widget_class, GuideEditor, min_width);
gtk_widget_class_bind_template_child (widget_class, GuideEditor, min_height);
gtk_widget_class_bind_template_child (widget_class, GuideEditor, nat_width);
gtk_widget_class_bind_template_child (widget_class, GuideEditor, nat_height);
gtk_widget_class_bind_template_child (widget_class, GuideEditor, max_width);
gtk_widget_class_bind_template_child (widget_class, GuideEditor, max_height);
gtk_widget_class_bind_template_child (widget_class, GuideEditor, strength);
gtk_widget_class_bind_template_child (widget_class, GuideEditor, button);
gtk_widget_class_bind_template_callback (widget_class, create_guide);
}
GuideEditor *
guide_editor_new (GtkConstraintGuide *guide)
{
return g_object_new (GUIDE_EDITOR_TYPE,
"guide", guide,
NULL);
}

View File

@@ -1,32 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen
*/
#pragma once
#include <gtk/gtk.h>
#define GUIDE_EDITOR_TYPE (guide_editor_get_type ())
G_DECLARE_FINAL_TYPE (GuideEditor, guide_editor, GUIDE, EDITOR, GtkWidget)
GuideEditor * guide_editor_new (GtkConstraintGuide *guide);
void guide_editor_serialize_guide (GString *str,
int indent,
GtkConstraintGuide *guide);

View File

@@ -1,188 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkAdjustment" id="min_width_adj">
<property name="lower">0</property>
<property name="upper">2147483647</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
<property name="page-size">0</property>
</object>
<object class="GtkAdjustment" id="min_height_adj">
<property name="lower">0</property>
<property name="upper">2147483647</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
<property name="page-size">0</property>
</object>
<object class="GtkAdjustment" id="nat_width_adj">
<property name="lower">0</property>
<property name="upper">2147483647</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
<property name="page-size">0</property>
</object>
<object class="GtkAdjustment" id="nat_height_adj">
<property name="lower">0</property>
<property name="upper">2147483647</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
<property name="page-size">0</property>
</object>
<object class="GtkAdjustment" id="max_width_adj">
<property name="lower">0</property>
<property name="upper">2147483647</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
<property name="page-size">0</property>
</object>
<object class="GtkAdjustment" id="max_height_adj">
<property name="lower">0</property>
<property name="upper">2147483647</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
<property name="page-size">0</property>
</object>
<template class="GuideEditor" parent="GtkWidget">
<child>
<object class="GtkGrid" id="grid">
<property name="margin">20</property>
<property name="row-spacing">10</property>
<property name="column-spacing">10</property>
<child>
<object class="GtkLabel">
<property name="label">Name</property>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</layout>
</object>
</child>
<child>
<object class="GtkEntry" id="name">
<property name="max-width-chars">20</property>
<layout>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
<property name="column-span">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Min Size</property>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkSpinButton" id="min_width">
<property name="adjustment">min_width_adj</property>
<property name="max-width-chars">5</property>
<layout>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkSpinButton" id="min_height">
<property name="adjustment">min_height_adj</property>
<property name="max-width-chars">5</property>
<layout>
<property name="left-attach">2</property>
<property name="top-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Nat Size</property>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkSpinButton" id="nat_width">
<property name="adjustment">nat_width_adj</property>
<property name="max-width-chars">5</property>
<layout>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkSpinButton" id="nat_height">
<property name="adjustment">nat_height_adj</property>
<property name="max-width-chars">5</property>
<layout>
<property name="left-attach">2</property>
<property name="top-attach">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Max Size</property>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkSpinButton" id="max_width">
<property name="adjustment">max_width_adj</property>
<property name="max-width-chars">5</property>
<layout>
<property name="left-attach">1</property>
<property name="top-attach">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkSpinButton" id="max_height">
<property name="adjustment">max_height_adj</property>
<property name="max-width-chars">5</property>
<layout>
<property name="left-attach">2</property>
<property name="top-attach">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Strength</property>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">4</property>
</layout>
</object>
</child>
<child>
<object class="GtkComboBoxText" id="strength">
<layout>
<property name="left-attach">1</property>
<property name="top-attach">4</property>
<property name="column-span">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton" id="button">
<property name="label">Create</property>
<signal name="clicked" handler="create_guide"/>
<layout>
<property name="left-attach">2</property>
<property name="top-attach">5</property>
</layout>
</object>
</child>
</object>
</child>
</template>
</interface>

View File

@@ -1,28 +0,0 @@
/*
* Copyright © 2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen <mclasen@redhat.com>
*/
#include "config.h"
#include <constraint-editor-application.h>
int
main (int argc, char *argv[])
{
return g_application_run (G_APPLICATION (constraint_editor_application_new ()), argc, argv);
}

View File

@@ -1,19 +0,0 @@
constraint_editor_sources = [
'main.c',
'constraint-editor-application.c',
'constraint-editor-window.c',
'constraint-view.c',
'constraint-editor.c',
'guide-editor.c',
]
constraint_editor_resources = gnome.compile_resources('constraint_editor_resources',
'constraint-editor.gresource.xml',
source_dir: '.')
executable('gtk4-constraint-editor',
constraint_editor_sources, constraint_editor_resources,
dependencies: libgtk_dep,
include_directories: confinc,
gui_app: true,
install: false)

View File

@@ -477,7 +477,7 @@ surface_state_changed (GtkWidget *widget)
DemoApplicationWindow *window = (DemoApplicationWindow *)widget; DemoApplicationWindow *window = (DemoApplicationWindow *)widget;
GdkSurfaceState new_state; GdkSurfaceState new_state;
new_state = gdk_surface_get_state (gtk_native_get_surface (GTK_NATIVE (widget))); new_state = gdk_surface_get_state (gtk_widget_get_surface (widget));
window->maximized = (new_state & GDK_SURFACE_STATE_MAXIMIZED) != 0; window->maximized = (new_state & GDK_SURFACE_STATE_MAXIMIZED) != 0;
window->fullscreen = (new_state & GDK_SURFACE_STATE_FULLSCREEN) != 0; window->fullscreen = (new_state & GDK_SURFACE_STATE_FULLSCREEN) != 0;
} }
@@ -487,14 +487,14 @@ demo_application_window_realize (GtkWidget *widget)
{ {
GTK_WIDGET_CLASS (demo_application_window_parent_class)->realize (widget); GTK_WIDGET_CLASS (demo_application_window_parent_class)->realize (widget);
g_signal_connect_swapped (gtk_native_get_surface (GTK_NATIVE (widget)), "notify::state", g_signal_connect_swapped (gtk_widget_get_surface (widget), "notify::state",
G_CALLBACK (surface_state_changed), widget); G_CALLBACK (surface_state_changed), widget);
} }
static void static void
demo_application_window_unrealize (GtkWidget *widget) demo_application_window_unrealize (GtkWidget *widget)
{ {
g_signal_handlers_disconnect_by_func (gtk_native_get_surface (GTK_NATIVE (widget)), g_signal_handlers_disconnect_by_func (gtk_widget_get_surface (widget),
surface_state_changed, widget); surface_state_changed, widget);
GTK_WIDGET_CLASS (demo_application_window_parent_class)->unrealize (widget); GTK_WIDGET_CLASS (demo_application_window_parent_class)->unrealize (widget);

View File

@@ -458,6 +458,7 @@ blur_overlay_class_init (BlurOverlayClass *klass)
static void static void
blur_overlay_init (BlurOverlay *overlay) blur_overlay_init (BlurOverlay *overlay)
{ {
gtk_widget_set_has_surface (GTK_WIDGET (overlay), FALSE);
} }
GtkWidget * GtkWidget *

View File

@@ -74,17 +74,17 @@ find_toplevel_at_pointer (GdkDisplay *display)
pointer_window = gdk_device_get_surface_at_position (gtk_get_current_event_device (), NULL, NULL); pointer_window = gdk_device_get_surface_at_position (gtk_get_current_event_device (), NULL, NULL);
if (pointer_window) if (pointer_window)
widget = GTK_WIDGET (gtk_native_get_for_surface (pointer_window)); widget = GTK_WIDGET (gtk_root_get_for_surface (pointer_window));
return widget; return widget;
} }
static void static void
released_cb (GtkGestureClick *gesture, released_cb (GtkGestureMultiPress *gesture,
guint n_press, guint n_press,
gdouble x, gdouble x,
gdouble y, gdouble y,
gboolean *clicked) gboolean *clicked)
{ {
*clicked = TRUE; *clicked = TRUE;
} }
@@ -105,6 +105,7 @@ query_for_toplevel (GdkDisplay *display,
popup = gtk_window_new (GTK_WINDOW_POPUP); popup = gtk_window_new (GTK_WINDOW_POPUP);
gtk_window_set_display (GTK_WINDOW (popup), display); gtk_window_set_display (GTK_WINDOW (popup), display);
gtk_window_set_modal (GTK_WINDOW (popup), TRUE); gtk_window_set_modal (GTK_WINDOW (popup), TRUE);
gtk_window_set_position (GTK_WINDOW (popup), GTK_WIN_POS_CENTER);
frame = gtk_frame_new (NULL); frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
@@ -119,11 +120,11 @@ query_for_toplevel (GdkDisplay *display,
device = gtk_get_current_event_device (); device = gtk_get_current_event_device ();
if (gdk_seat_grab (gdk_device_get_seat (device), if (gdk_seat_grab (gdk_device_get_seat (device),
gtk_native_get_surface (GTK_NATIVE (popup)), gtk_widget_get_surface (popup),
GDK_SEAT_CAPABILITY_ALL_POINTING, GDK_SEAT_CAPABILITY_ALL_POINTING,
FALSE, cursor, NULL, NULL, NULL) == GDK_GRAB_SUCCESS) FALSE, cursor, NULL, NULL, NULL) == GDK_GRAB_SUCCESS)
{ {
GtkGesture *gesture = gtk_gesture_click_new (); GtkGesture *gesture = gtk_gesture_multi_press_new ();
gboolean clicked = FALSE; gboolean clicked = FALSE;
g_signal_connect (gesture, "released", g_signal_connect (gesture, "released",

View File

@@ -319,7 +319,7 @@ do_clipboard (GtkWidget *do_widget)
G_CALLBACK (drag_data_received), image); G_CALLBACK (drag_data_received), image);
/* context menu on image */ /* context menu on image */
gesture = gtk_gesture_click_new (); gesture = gtk_gesture_multi_press_new ();
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY);
g_signal_connect (gesture, "pressed", G_CALLBACK (pressed_cb), image); g_signal_connect (gesture, "pressed", G_CALLBACK (pressed_cb), image);
gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (gesture)); gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (gesture));
@@ -344,7 +344,7 @@ do_clipboard (GtkWidget *do_widget)
G_CALLBACK (drag_data_received), image); G_CALLBACK (drag_data_received), image);
/* context menu on image */ /* context menu on image */
gesture = gtk_gesture_click_new (); gesture = gtk_gesture_multi_press_new ();
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY);
g_signal_connect (gesture, "pressed", G_CALLBACK (pressed_cb), image); g_signal_connect (gesture, "pressed", G_CALLBACK (pressed_cb), image);
gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (gesture)); gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (gesture));

View File

@@ -1,289 +0,0 @@
/* Constraints/Simple
*
* GtkConstraintLayout provides a layout manager that uses relations
* between widgets (also known as "constraints") to compute the position
* and size of each child.
*/
#include <glib/gi18n.h>
#include <gtk/gtk.h>
G_DECLARE_FINAL_TYPE (SimpleGrid, simple_grid, SIMPLE, GRID, GtkWidget)
struct _SimpleGrid
{
GtkWidget parent_instance;
GtkWidget *button1, *button2;
GtkWidget *button3;
};
G_DEFINE_TYPE (SimpleGrid, simple_grid, GTK_TYPE_WIDGET)
static void
simple_grid_destroy (GtkWidget *widget)
{
SimpleGrid *self = SIMPLE_GRID (widget);
g_clear_pointer (&self->button1, gtk_widget_destroy);
g_clear_pointer (&self->button2, gtk_widget_destroy);
g_clear_pointer (&self->button3, gtk_widget_destroy);
GTK_WIDGET_CLASS (simple_grid_parent_class)->destroy (widget);
}
static void
simple_grid_class_init (SimpleGridClass *klass)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
widget_class->destroy = simple_grid_destroy;
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_CONSTRAINT_LAYOUT);
}
/* Layout:
*
* +-------------------------------------+
* | +-----------++-------++-----------+ |
* | | Child 1 || Space || Child 2 | |
* | +-----------++-------++-----------+ |
* | +---------------------------------+ |
* | | Child 3 | |
* | +---------------------------------+ |
* +-------------------------------------+
*
* Constraints:
*
* super.start = child1.start - 8
* child1.width = child2.width
* child1.end = space.start
* space.end = child2.start
* child2.end = super.end - 8
* super.start = child3.start - 8
* child3.end = super.end - 8
* super.top = child1.top - 8
* super.top = child2.top - 8
* child1.bottom = child3.top - 12
* child2.bottom = child3.top - 12
* child3.height = child1.height
* child3.height = child2.height
* child3.bottom = super.bottom - 8
*
* To add some flexibility, we make the space
* stretchable:
*
* space.width >= 10
* space.width = 100
* space.width <= 200
*/
static void
build_constraints (SimpleGrid *self,
GtkConstraintLayout *manager)
{
GtkConstraintGuide *guide;
guide = gtk_constraint_guide_new ();
gtk_constraint_guide_set_name (guide, "space");
gtk_constraint_guide_set_min_size (guide, 10, 10);
gtk_constraint_guide_set_nat_size (guide, 100, 10);
gtk_constraint_guide_set_max_size (guide, 200, 20);
gtk_constraint_guide_set_strength (guide, GTK_CONSTRAINT_STRENGTH_STRONG);
gtk_constraint_layout_add_guide (manager, guide);
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new_constant (GTK_CONSTRAINT_TARGET (self->button1),
GTK_CONSTRAINT_ATTRIBUTE_WIDTH,
GTK_CONSTRAINT_RELATION_LE,
200.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (NULL,
GTK_CONSTRAINT_ATTRIBUTE_START,
GTK_CONSTRAINT_RELATION_EQ,
self->button1,
GTK_CONSTRAINT_ATTRIBUTE_START,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (self->button1,
GTK_CONSTRAINT_ATTRIBUTE_WIDTH,
GTK_CONSTRAINT_RELATION_EQ,
self->button2,
GTK_CONSTRAINT_ATTRIBUTE_WIDTH,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (self->button1,
GTK_CONSTRAINT_ATTRIBUTE_END,
GTK_CONSTRAINT_RELATION_EQ,
guide,
GTK_CONSTRAINT_ATTRIBUTE_START,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (guide,
GTK_CONSTRAINT_ATTRIBUTE_END,
GTK_CONSTRAINT_RELATION_EQ,
self->button2,
GTK_CONSTRAINT_ATTRIBUTE_START,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (self->button2,
GTK_CONSTRAINT_ATTRIBUTE_END,
GTK_CONSTRAINT_RELATION_EQ,
NULL,
GTK_CONSTRAINT_ATTRIBUTE_END,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (NULL,
GTK_CONSTRAINT_ATTRIBUTE_START,
GTK_CONSTRAINT_RELATION_EQ,
self->button3,
GTK_CONSTRAINT_ATTRIBUTE_START,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (self->button3,
GTK_CONSTRAINT_ATTRIBUTE_END,
GTK_CONSTRAINT_RELATION_EQ,
NULL,
GTK_CONSTRAINT_ATTRIBUTE_END,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (NULL,
GTK_CONSTRAINT_ATTRIBUTE_TOP,
GTK_CONSTRAINT_RELATION_EQ,
self->button1,
GTK_CONSTRAINT_ATTRIBUTE_TOP,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (NULL,
GTK_CONSTRAINT_ATTRIBUTE_TOP,
GTK_CONSTRAINT_RELATION_EQ,
self->button2,
GTK_CONSTRAINT_ATTRIBUTE_TOP,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (self->button1,
GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
GTK_CONSTRAINT_RELATION_EQ,
self->button3,
GTK_CONSTRAINT_ATTRIBUTE_TOP,
1.0,
-12.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (self->button2,
GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
GTK_CONSTRAINT_RELATION_EQ,
self->button3,
GTK_CONSTRAINT_ATTRIBUTE_TOP,
1.0,
-12.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (self->button3,
GTK_CONSTRAINT_ATTRIBUTE_HEIGHT,
GTK_CONSTRAINT_RELATION_EQ,
self->button1,
GTK_CONSTRAINT_ATTRIBUTE_HEIGHT,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (self->button3,
GTK_CONSTRAINT_ATTRIBUTE_HEIGHT,
GTK_CONSTRAINT_RELATION_EQ,
self->button2,
GTK_CONSTRAINT_ATTRIBUTE_HEIGHT,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (self->button3,
GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
GTK_CONSTRAINT_RELATION_EQ,
NULL,
GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
}
static void
simple_grid_init (SimpleGrid *self)
{
GtkWidget *widget = GTK_WIDGET (self);
self->button1 = gtk_button_new_with_label ("Child 1");
gtk_widget_set_parent (self->button1, widget);
gtk_widget_set_name (self->button1, "button1");
self->button2 = gtk_button_new_with_label ("Child 2");
gtk_widget_set_parent (self->button2, widget);
gtk_widget_set_name (self->button2, "button2");
self->button3 = gtk_button_new_with_label ("Child 3");
gtk_widget_set_parent (self->button3, widget);
gtk_widget_set_name (self->button3, "button3");
GtkLayoutManager *manager = gtk_widget_get_layout_manager (GTK_WIDGET (self));
build_constraints (self, GTK_CONSTRAINT_LAYOUT (manager));
}
GtkWidget *
do_constraints (GtkWidget *do_widget)
{
static GtkWidget *window;
if (!window)
{
GtkWidget *header, *box, *grid, *button;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
header = gtk_header_bar_new ();
gtk_header_bar_set_title (GTK_HEADER_BAR (header), "Constraints");
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
gtk_window_set_titlebar (GTK_WINDOW (window), header);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
gtk_container_add (GTK_CONTAINER (window), box);
grid = g_object_new (simple_grid_get_type (), NULL);
gtk_widget_set_hexpand (grid, TRUE);
gtk_widget_set_vexpand (grid, TRUE);
gtk_container_add (GTK_CONTAINER (box), grid);
button = gtk_button_new_with_label ("Close");
gtk_container_add (GTK_CONTAINER (box), button);
gtk_widget_set_hexpand (grid, TRUE);
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (gtk_widget_destroy), window);
}
if (!gtk_widget_get_visible (window))
gtk_widget_show (window);
else
gtk_widget_destroy (window);
return window;
}

View File

@@ -1,245 +0,0 @@
/* Constraints/Interactive
*
* Demonstrate how constraints can be updates during
* user interaction.
*/
#include <glib/gi18n.h>
#include <gtk/gtk.h>
G_DECLARE_FINAL_TYPE (InteractiveGrid, interactive_grid, INTERACTIVE, GRID, GtkWidget)
struct _InteractiveGrid
{
GtkWidget parent_instance;
GtkWidget *button1, *button2;
GtkWidget *button3;
GtkConstraintGuide *guide;
GtkConstraint *constraint;
};
G_DEFINE_TYPE (InteractiveGrid, interactive_grid, GTK_TYPE_WIDGET)
static void
interactive_grid_destroy (GtkWidget *widget)
{
InteractiveGrid *self = INTERACTIVE_GRID (widget);
g_clear_pointer (&self->button1, gtk_widget_destroy);
g_clear_pointer (&self->button2, gtk_widget_destroy);
g_clear_pointer (&self->button3, gtk_widget_destroy);
GTK_WIDGET_CLASS (interactive_grid_parent_class)->destroy (widget);
}
static void
interactive_grid_class_init (InteractiveGridClass *klass)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
widget_class->destroy = interactive_grid_destroy;
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_CONSTRAINT_LAYOUT);
}
static void
build_constraints (InteractiveGrid *self,
GtkConstraintLayout *manager)
{
self->guide = g_object_new (GTK_TYPE_CONSTRAINT_GUIDE, NULL);
gtk_constraint_layout_add_guide (manager, self->guide);
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new_constant (GTK_CONSTRAINT_TARGET (self->guide),
GTK_CONSTRAINT_ATTRIBUTE_WIDTH,
GTK_CONSTRAINT_RELATION_EQ,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (NULL,
GTK_CONSTRAINT_ATTRIBUTE_START,
GTK_CONSTRAINT_RELATION_EQ,
GTK_CONSTRAINT_TARGET (self->button1),
GTK_CONSTRAINT_ATTRIBUTE_START,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (GTK_CONSTRAINT_TARGET (self->button1),
GTK_CONSTRAINT_ATTRIBUTE_END,
GTK_CONSTRAINT_RELATION_EQ,
GTK_CONSTRAINT_TARGET (self->guide),
GTK_CONSTRAINT_ATTRIBUTE_START,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (GTK_CONSTRAINT_TARGET (self->button2),
GTK_CONSTRAINT_ATTRIBUTE_START,
GTK_CONSTRAINT_RELATION_EQ,
GTK_CONSTRAINT_TARGET (self->guide),
GTK_CONSTRAINT_ATTRIBUTE_END,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (GTK_CONSTRAINT_TARGET (self->button2),
GTK_CONSTRAINT_ATTRIBUTE_END,
GTK_CONSTRAINT_RELATION_EQ,
NULL,
GTK_CONSTRAINT_ATTRIBUTE_END,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (NULL,
GTK_CONSTRAINT_ATTRIBUTE_START,
GTK_CONSTRAINT_RELATION_EQ,
GTK_CONSTRAINT_TARGET (self->button3),
GTK_CONSTRAINT_ATTRIBUTE_START,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (GTK_CONSTRAINT_TARGET (self->button3),
GTK_CONSTRAINT_ATTRIBUTE_END,
GTK_CONSTRAINT_RELATION_EQ,
GTK_CONSTRAINT_TARGET (self->guide),
GTK_CONSTRAINT_ATTRIBUTE_START,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (NULL,
GTK_CONSTRAINT_ATTRIBUTE_TOP,
GTK_CONSTRAINT_RELATION_EQ,
GTK_CONSTRAINT_TARGET (self->button1),
GTK_CONSTRAINT_ATTRIBUTE_TOP,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (GTK_CONSTRAINT_TARGET (self->button2),
GTK_CONSTRAINT_ATTRIBUTE_TOP,
GTK_CONSTRAINT_RELATION_EQ,
GTK_CONSTRAINT_TARGET (self->button1),
GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (GTK_CONSTRAINT_TARGET (self->button3),
GTK_CONSTRAINT_ATTRIBUTE_TOP,
GTK_CONSTRAINT_RELATION_EQ,
GTK_CONSTRAINT_TARGET (self->button2),
GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
gtk_constraint_layout_add_constraint (manager,
gtk_constraint_new (GTK_CONSTRAINT_TARGET (self->button3),
GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
GTK_CONSTRAINT_RELATION_EQ,
NULL,
GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
1.0,
-8.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED));
}
static void
drag_cb (GtkGestureDrag *drag,
double offset_x,
double offset_y,
InteractiveGrid *self)
{
GtkConstraintLayout *layout = GTK_CONSTRAINT_LAYOUT (gtk_widget_get_layout_manager (GTK_WIDGET (self)));
double x, y;
if (self->constraint)
{
gtk_constraint_layout_remove_constraint (layout, self->constraint);
g_clear_object (&self->constraint);
}
gtk_gesture_drag_get_start_point (drag, &x, &y);
self->constraint = gtk_constraint_new_constant (GTK_CONSTRAINT_TARGET (self->guide),
GTK_CONSTRAINT_ATTRIBUTE_LEFT,
GTK_CONSTRAINT_RELATION_EQ,
x + offset_x,
GTK_CONSTRAINT_STRENGTH_REQUIRED);
gtk_constraint_layout_add_constraint (layout, g_object_ref (self->constraint));
gtk_widget_queue_allocate (GTK_WIDGET (self));
}
static void
interactive_grid_init (InteractiveGrid *self)
{
GtkWidget *widget = GTK_WIDGET (self);
GtkGesture *drag;
self->button1 = gtk_button_new_with_label ("Child 1");
gtk_widget_set_parent (self->button1, widget);
gtk_widget_set_name (self->button1, "button1");
self->button2 = gtk_button_new_with_label ("Child 2");
gtk_widget_set_parent (self->button2, widget);
gtk_widget_set_name (self->button2, "button2");
self->button3 = gtk_button_new_with_label ("Child 3");
gtk_widget_set_parent (self->button3, widget);
gtk_widget_set_name (self->button3, "button3");
GtkLayoutManager *manager = gtk_widget_get_layout_manager (GTK_WIDGET (self));
build_constraints (self, GTK_CONSTRAINT_LAYOUT (manager));
drag = gtk_gesture_drag_new ();
g_signal_connect (drag, "drag-update", G_CALLBACK (drag_cb), self);
gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (drag));
}
GtkWidget *
do_constraints2 (GtkWidget *do_widget)
{
static GtkWidget *window;
if (!window)
{
GtkWidget *header, *box, *grid, *button;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
header = gtk_header_bar_new ();
gtk_header_bar_set_title (GTK_HEADER_BAR (header), "Constraints");
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
gtk_window_set_titlebar (GTK_WINDOW (window), header);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
gtk_container_add (GTK_CONTAINER (window), box);
grid = g_object_new (interactive_grid_get_type (), NULL);
gtk_widget_set_hexpand (grid, TRUE);
gtk_widget_set_vexpand (grid, TRUE);
gtk_container_add (GTK_CONTAINER (box), grid);
button = gtk_button_new_with_label ("Close");
gtk_container_add (GTK_CONTAINER (box), button);
gtk_widget_set_hexpand (grid, TRUE);
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (gtk_widget_destroy), window);
}
if (!gtk_widget_get_visible (window))
gtk_widget_show (window);
else
gtk_widget_destroy (window);
return window;
}

View File

@@ -1,165 +0,0 @@
/* Constraints/VFL
*
* GtkConstraintLayout allows defining constraints using a
* compact syntax called Visual Format Language, or VFL.
*/
#include <glib/gi18n.h>
#include <gtk/gtk.h>
G_DECLARE_FINAL_TYPE (VflGrid, vfl_grid, VFL, GRID, GtkWidget)
struct _VflGrid
{
GtkWidget parent_instance;
GtkWidget *button1, *button2;
GtkWidget *button3;
};
G_DEFINE_TYPE (VflGrid, vfl_grid, GTK_TYPE_WIDGET)
static void
vfl_grid_destroy (GtkWidget *widget)
{
VflGrid *self = VFL_GRID (widget);
g_clear_pointer (&self->button1, gtk_widget_destroy);
g_clear_pointer (&self->button2, gtk_widget_destroy);
g_clear_pointer (&self->button3, gtk_widget_destroy);
GTK_WIDGET_CLASS (vfl_grid_parent_class)->destroy (widget);
}
static void
vfl_grid_class_init (VflGridClass *klass)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
widget_class->destroy = vfl_grid_destroy;
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_CONSTRAINT_LAYOUT);
}
/* Layout:
*
* +-----------------------------+
* | +-----------+ +-----------+ |
* | | Child 1 | | Child 2 | |
* | +-----------+ +-----------+ |
* | +-------------------------+ |
* | | Child 3 | |
* | +-------------------------+ |
* +-----------------------------+
*
* Constraints:
*
* super.start = child1.start - 8
* child1.width = child2.width
* child1.end = child2.start - 12
* child2.end = super.end - 8
* super.start = child3.start - 8
* child3.end = super.end - 8
* super.top = child1.top - 8
* super.top = child2.top - 8
* child1.bottom = child3.top - 12
* child2.bottom = child3.top - 12
* child3.height = child1.height
* child3.height = child2.height
* child3.bottom = super.bottom - 8
*
* Visual format:
*
* H:|-8-[view1(==view2)-12-[view2]-8-|
* H:|-8-[view3]-8-|
* V:|-8-[view1]-12-[view3(==view1)]-8-|
* V:|-8-[view2]-12-[view3(==view2)]-8-|
*/
static void
build_constraints (VflGrid *self,
GtkConstraintLayout *manager)
{
const char * const vfl[] = {
"H:|-[button1(==button2)]-12-[button2]-|",
"H:|-[button3]-|",
"V:|-[button1]-12-[button3(==button1)]-|",
"V:|-[button2]-12-[button3(==button2)]-|",
};
GError *error = NULL;
gtk_constraint_layout_add_constraints_from_description (manager, vfl, G_N_ELEMENTS (vfl),
8, 8,
&error,
"button1", self->button1,
"button2", self->button2,
"button3", self->button3,
NULL);
if (error != NULL)
{
g_printerr ("VFL parsing error:\n%s", error->message);
g_error_free (error);
}
}
static void
vfl_grid_init (VflGrid *self)
{
GtkWidget *widget = GTK_WIDGET (self);
self->button1 = gtk_button_new_with_label ("Child 1");
gtk_widget_set_parent (self->button1, widget);
gtk_widget_set_name (self->button1, "button1");
self->button2 = gtk_button_new_with_label ("Child 2");
gtk_widget_set_parent (self->button2, widget);
gtk_widget_set_name (self->button2, "button2");
self->button3 = gtk_button_new_with_label ("Child 3");
gtk_widget_set_parent (self->button3, widget);
gtk_widget_set_name (self->button3, "button3");
GtkLayoutManager *manager = gtk_widget_get_layout_manager (GTK_WIDGET (self));
build_constraints (self, GTK_CONSTRAINT_LAYOUT (manager));
}
GtkWidget *
do_constraints3 (GtkWidget *do_widget)
{
static GtkWidget *window;
if (!window)
{
GtkWidget *header, *box, *grid, *button;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
header = gtk_header_bar_new ();
gtk_header_bar_set_title (GTK_HEADER_BAR (header), "Constraints");
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
gtk_window_set_titlebar (GTK_WINDOW (window), header);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
gtk_container_add (GTK_CONTAINER (window), box);
grid = g_object_new (vfl_grid_get_type (), NULL);
gtk_widget_set_hexpand (grid, TRUE);
gtk_widget_set_vexpand (grid, TRUE);
gtk_container_add (GTK_CONTAINER (box), grid);
button = gtk_button_new_with_label ("Close");
gtk_container_add (GTK_CONTAINER (box), button);
gtk_widget_set_hexpand (grid, TRUE);
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (gtk_widget_destroy), window);
}
if (!gtk_widget_get_visible (window))
gtk_widget_show (window);
else
gtk_widget_destroy (window);
return window;
}

View File

@@ -1,178 +0,0 @@
/* Constraints/Grid
*
* GtkConstraintLayout lets you define complex layouts
* like grids.
*/
#include <glib/gi18n.h>
#include <gtk/gtk.h>
G_DECLARE_FINAL_TYPE (ComplexGrid, complex_grid, COMPLEX, GRID, GtkWidget)
struct _ComplexGrid
{
GtkWidget parent_instance;
GtkWidget *button1, *button2, *button3;
GtkWidget *button4, *button5;
};
G_DEFINE_TYPE (ComplexGrid, complex_grid, GTK_TYPE_WIDGET)
static void
complex_grid_destroy (GtkWidget *widget)
{
ComplexGrid *self = COMPLEX_GRID (widget);
g_clear_pointer (&self->button1, gtk_widget_destroy);
g_clear_pointer (&self->button2, gtk_widget_destroy);
g_clear_pointer (&self->button3, gtk_widget_destroy);
g_clear_pointer (&self->button4, gtk_widget_destroy);
g_clear_pointer (&self->button5, gtk_widget_destroy);
GTK_WIDGET_CLASS (complex_grid_parent_class)->destroy (widget);
}
static void
complex_grid_class_init (ComplexGridClass *klass)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
widget_class->destroy = complex_grid_destroy;
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_CONSTRAINT_LAYOUT);
}
/* Layout:
*
* +--------------------------------------+
* | +-----------+ |
* | | Child 4 | |
* | +-----------+-----------+----------+ |
* | | Child 1 | Child 2 | Child 3 | |
* | +-----------+-----------+----------+ |
* | | Child 5 | |
* | +-----------+ |
* +--------------------------------------+
*
*/
static void
build_constraints (ComplexGrid *self,
GtkConstraintLayout *manager)
{
GtkGridConstraint *constraint;
GtkConstraint *s;
s = gtk_constraint_new (NULL, GTK_CONSTRAINT_ATTRIBUTE_LEFT,
GTK_CONSTRAINT_RELATION_EQ,
self->button1, GTK_CONSTRAINT_ATTRIBUTE_LEFT,
1.0, 0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED);
gtk_constraint_layout_add_constraint (manager, s);
s = gtk_constraint_new (self->button3, GTK_CONSTRAINT_ATTRIBUTE_RIGHT,
GTK_CONSTRAINT_RELATION_EQ,
NULL, GTK_CONSTRAINT_ATTRIBUTE_RIGHT,
1.0, 0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED);
gtk_constraint_layout_add_constraint (manager, s);
s = gtk_constraint_new (NULL, GTK_CONSTRAINT_ATTRIBUTE_TOP,
GTK_CONSTRAINT_RELATION_EQ,
self->button4, GTK_CONSTRAINT_ATTRIBUTE_TOP,
1.0, 0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED);
gtk_constraint_layout_add_constraint (manager, s);
s = gtk_constraint_new (NULL, GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
GTK_CONSTRAINT_RELATION_EQ,
self->button5, GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
1.0, 0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED);
gtk_constraint_layout_add_constraint (manager, s);
constraint = gtk_grid_constraint_new ();
g_object_set (constraint, "column-homogeneous", TRUE, NULL);
gtk_grid_constraint_add (constraint, self->button1, 0, 1, 0, 1);
gtk_grid_constraint_add (constraint, self->button2, 1, 2, 0, 1);
gtk_grid_constraint_add (constraint, self->button3, 2, 3, 0, 1);
gtk_grid_constraint_attach (constraint, manager);
constraint = gtk_grid_constraint_new ();
g_object_set (constraint, "row-homogeneous", TRUE, NULL);
gtk_grid_constraint_add (constraint, self->button4, 0, 1, 0, 1);
gtk_grid_constraint_add (constraint, self->button2, 0, 1, 1, 2);
gtk_grid_constraint_add (constraint, self->button5, 0, 1, 2, 3);
gtk_grid_constraint_attach (constraint, manager);
}
static void
complex_grid_init (ComplexGrid *self)
{
GtkWidget *widget = GTK_WIDGET (self);
GtkLayoutManager *manager = gtk_widget_get_layout_manager (GTK_WIDGET (self));
self->button1 = gtk_button_new_with_label ("Child 1");
gtk_widget_set_parent (self->button1, widget);
gtk_widget_set_name (self->button1, "button1");
self->button2 = gtk_button_new_with_label ("Child 2");
gtk_widget_set_parent (self->button2, widget);
gtk_widget_set_name (self->button2, "button2");
self->button3 = gtk_button_new_with_label ("Child 3");
gtk_widget_set_parent (self->button3, widget);
gtk_widget_set_name (self->button3, "button3");
self->button4 = gtk_button_new_with_label ("Child 4");
gtk_widget_set_parent (self->button4, widget);
gtk_widget_set_name (self->button4, "button4");
self->button5 = gtk_button_new_with_label ("Child 5");
gtk_widget_set_parent (self->button5, widget);
gtk_widget_set_name (self->button5, "button5");
build_constraints (self, GTK_CONSTRAINT_LAYOUT (manager));
}
GtkWidget *
do_constraints4 (GtkWidget *do_widget)
{
static GtkWidget *window;
if (!window)
{
GtkWidget *header, *box, *grid, *button;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
header = gtk_header_bar_new ();
gtk_header_bar_set_title (GTK_HEADER_BAR (header), "Constraints");
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
gtk_window_set_titlebar (GTK_WINDOW (window), header);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
gtk_container_add (GTK_CONTAINER (window), box);
grid = g_object_new (complex_grid_get_type (), NULL);
gtk_widget_set_hexpand (grid, TRUE);
gtk_widget_set_vexpand (grid, TRUE);
gtk_container_add (GTK_CONTAINER (box), grid);
button = gtk_button_new_with_label ("Close");
gtk_container_add (GTK_CONTAINER (box), button);
gtk_widget_set_hexpand (grid, TRUE);
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (gtk_widget_destroy), window);
}
if (!gtk_widget_get_visible (window))
gtk_widget_show (window);
else
gtk_widget_destroy (window);
return window;
}

View File

@@ -1,354 +0,0 @@
/* Constraints/Words
*
* GtkConstraintLayout lets you define big grids.
*/
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#define WORDS_TYPE_BASE (words_base_get_type ())
#define WORDS_TYPE_GRID (words_grid_get_type ())
#define WORDS_TYPE_CONSTRAINT (words_constraint_get_type ())
typedef struct
{
GtkWidget parent_instance;
} WordsBase;
typedef WordsBase WordsGrid;
typedef WordsBase WordsConstraint;
typedef GtkWidgetClass WordsBaseClass;
typedef GtkWidgetClass WordsGridClass;
typedef GtkWidgetClass WordsConstraintClass;
G_DEFINE_TYPE (WordsBase, words_base, GTK_TYPE_WIDGET)
G_DEFINE_TYPE (WordsGrid, words_grid, WORDS_TYPE_BASE)
G_DEFINE_TYPE (WordsConstraint, words_constraint, WORDS_TYPE_BASE)
static void
words_grid_init (WordsGrid *words)
{
}
static void
words_grid_class_init (WordsGridClass *class)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_GRID_LAYOUT);
}
static void
words_constraint_init (WordsGrid *words)
{
}
static void
words_constraint_class_init (WordsConstraintClass *class)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_CONSTRAINT_LAYOUT);
}
static void
word_base_dispose (GObject *object)
{
GtkWidget *self = GTK_WIDGET (object);
GtkWidget *child;
while ((child = gtk_widget_get_first_child (self)) != NULL)
gtk_widget_unparent (child);
G_OBJECT_CLASS (words_base_parent_class)->dispose (object);
}
static void
words_base_class_init (WordsBaseClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = word_base_dispose;
}
static int num_words = 100;
static gboolean use_constraints = FALSE;
static void
read_words (WordsBase *self)
{
GBytes *data;
const char *words;
int left, top;
GtkWidget *child = NULL;
GtkLayoutManager *layout = gtk_widget_get_layout_manager (GTK_WIDGET (self));
GtkGridConstraint *grid;
GtkConstraint *constraint;
int count;
int rightmost;
GtkWidget *right_child = NULL;
gboolean use_constraint = GTK_IS_CONSTRAINT_LAYOUT (layout);
if (use_constraint)
{
grid = gtk_grid_constraint_new ();
g_object_set (grid,
"row-homogeneous", TRUE,
"column-homogeneous", FALSE,
NULL);
}
else
{
gtk_grid_layout_set_row_homogeneous (GTK_GRID_LAYOUT (layout), TRUE);
gtk_grid_layout_set_column_homogeneous (GTK_GRID_LAYOUT (layout), FALSE);
}
data = g_resources_lookup_data ("/constraints5/words", 0, NULL);
words = g_bytes_get_data (data, NULL);
count = 0;
rightmost = 0;
left = 0;
top = 0;
while (words && words[0])
{
char *p = strchr (words, '\n');
char *word;
int len;
if (p)
{
word = strndup (words, p - words);
words = p + 1;
}
else
{
word = strdup (words);
words = NULL;
}
len = strlen (word);
child = gtk_button_new_with_label (word);
if (left + len > 50)
{
top++;
left = 0;
}
gtk_widget_set_parent (child, GTK_WIDGET (self));
if (left + len > rightmost)
{
rightmost = left + len;
right_child = child;
}
if (use_constraint)
{
gtk_grid_constraint_add (grid, child,
left, left + len,
top, top + 1);
if (left == 0 && top == 0)
{
constraint = gtk_constraint_new (NULL,
GTK_CONSTRAINT_ATTRIBUTE_TOP,
GTK_CONSTRAINT_RELATION_EQ,
child,
GTK_CONSTRAINT_ATTRIBUTE_TOP,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED);
gtk_constraint_layout_add_constraint (GTK_CONSTRAINT_LAYOUT (layout),
constraint);
constraint = gtk_constraint_new (NULL,
GTK_CONSTRAINT_ATTRIBUTE_LEFT,
GTK_CONSTRAINT_RELATION_EQ,
child,
GTK_CONSTRAINT_ATTRIBUTE_LEFT,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED);
gtk_constraint_layout_add_constraint (GTK_CONSTRAINT_LAYOUT (layout),
constraint);
}
}
else
{
GtkGridLayoutChild *grid_child = GTK_GRID_LAYOUT_CHILD (gtk_layout_manager_get_layout_child (layout, child));
g_object_set (grid_child,
"left-attach", left,
"top-attach", top,
"column-span", len,
"row-span", 1,
NULL);
}
left = left + len;
count++;
if (count >= num_words)
break;
}
if (use_constraint)
{
constraint = gtk_constraint_new (NULL,
GTK_CONSTRAINT_ATTRIBUTE_RIGHT,
GTK_CONSTRAINT_RELATION_EQ,
right_child,
GTK_CONSTRAINT_ATTRIBUTE_RIGHT,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED);
gtk_constraint_layout_add_constraint (GTK_CONSTRAINT_LAYOUT (layout),
constraint);
constraint = gtk_constraint_new (NULL,
GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
GTK_CONSTRAINT_RELATION_EQ,
child,
GTK_CONSTRAINT_ATTRIBUTE_BOTTOM,
1.0,
0.0,
GTK_CONSTRAINT_STRENGTH_REQUIRED);
gtk_constraint_layout_add_constraint (GTK_CONSTRAINT_LAYOUT (layout),
constraint);
gtk_grid_constraint_attach (grid, GTK_CONSTRAINT_LAYOUT (layout));
}
g_bytes_unref (data);
}
static void
words_base_init (WordsBase *self)
{
read_words (self);
}
static void
show_words (GtkWidget *parent)
{
GtkWidget *window;
GtkWidget *header, *box, *grid, *button;
GtkWidget *swin;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_transient_for (GTK_WINDOW (window),
GTK_WINDOW (gtk_widget_get_root (parent)));
gtk_window_set_modal (GTK_WINDOW (window), TRUE);
header = gtk_header_bar_new ();
gtk_header_bar_set_title (GTK_HEADER_BAR (header), use_constraints ? "Constraints" : "Grid");
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
gtk_window_set_titlebar (GTK_WINDOW (window), header);
gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add (GTK_CONTAINER (window), box);
swin = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_propagate_natural_width (GTK_SCROLLED_WINDOW (swin), TRUE);
gtk_scrolled_window_set_propagate_natural_height (GTK_SCROLLED_WINDOW (swin), TRUE);
gtk_widget_set_hexpand (swin, TRUE);
gtk_widget_set_vexpand (swin, TRUE);
gtk_widget_set_halign (swin, GTK_ALIGN_FILL);
gtk_widget_set_valign (swin, GTK_ALIGN_FILL);
gtk_container_add (GTK_CONTAINER (box), swin);
if (use_constraints)
grid = g_object_new (WORDS_TYPE_CONSTRAINT, NULL);
else
grid = g_object_new (WORDS_TYPE_GRID, NULL);
gtk_widget_set_halign (swin, GTK_ALIGN_START);
gtk_widget_set_valign (swin, GTK_ALIGN_START);
gtk_container_add (GTK_CONTAINER (swin), grid);
button = gtk_button_new_with_label ("Close");
gtk_container_add (GTK_CONTAINER (box), button);
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (gtk_widget_destroy), window);
gtk_widget_show (window);
}
static void
use_constraints_cb (GtkButton *button)
{
use_constraints = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
}
static void
word_count_cb (GtkSpinButton *button)
{
num_words = gtk_spin_button_get_value_as_int (button);
}
GtkWidget *
do_constraints5 (GtkWidget *do_widget)
{
static GtkWidget *window;
if (!window)
{
GtkWidget *header, *grid, *button, *label;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
header = gtk_header_bar_new ();
gtk_header_bar_set_title (GTK_HEADER_BAR (header), "Words");
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), TRUE);
gtk_window_set_titlebar (GTK_WINDOW (window), header);
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
grid = gtk_grid_new ();
g_object_set (grid,
"margin", 12,
"row-spacing", 12,
"column-spacing", 6,
"halign", GTK_ALIGN_FILL,
"valign", GTK_ALIGN_FILL,
"hexpand", TRUE,
"vexpand", TRUE,
NULL);
gtk_container_add (GTK_CONTAINER (window), grid);
label = gtk_label_new ("Constraints:");
gtk_label_set_xalign (GTK_LABEL (label), 1.0);
gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
button = gtk_check_button_new ();
g_signal_connect (button, "clicked", G_CALLBACK (use_constraints_cb), NULL);
gtk_grid_attach (GTK_GRID (grid), button, 1, 0, 1, 1);
label = gtk_label_new ("Words:");
gtk_label_set_xalign (GTK_LABEL (label), 1.0);
gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
button = gtk_spin_button_new_with_range (0, 1300, 1);
g_signal_connect (button, "value-changed", G_CALLBACK (word_count_cb), NULL);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (button), 10);
gtk_grid_attach (GTK_GRID (grid), button, 1, 1, 1, 1);
button = gtk_button_new_with_label ("Show");
gtk_widget_set_halign (button, GTK_ALIGN_END);
gtk_widget_set_valign (button, GTK_ALIGN_END);
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (show_words), window);
gtk_grid_attach (GTK_GRID (grid), button, 0, 2, 2, 1);
}
if (!gtk_widget_get_visible (window))
gtk_widget_show (window);
else
gtk_widget_destroy (window);
return window;
}

View File

@@ -37,9 +37,6 @@
<gresource prefix="/theming_style_classes"> <gresource prefix="/theming_style_classes">
<file>theming.ui</file> <file>theming.ui</file>
</gresource> </gresource>
<gresource prefix="/themes">
<file>themes.ui</file>
</gresource>
<gresource prefix="/css_pixbufs"> <gresource prefix="/css_pixbufs">
<file alias="gtk.css">css_pixbufs.css</file> <file alias="gtk.css">css_pixbufs.css</file>
<file>cssview.css</file> <file>cssview.css</file>
@@ -59,9 +56,6 @@
<file>cssview.css</file> <file>cssview.css</file>
<file>reset.css</file> <file>reset.css</file>
</gresource> </gresource>
<gresource prefix="/constraints5">
<file>words</file>
</gresource>
<gresource prefix="/cursors"> <gresource prefix="/cursors">
<file>cursors.ui</file> <file>cursors.ui</file>
<file>alias_cursor.png</file> <file>alias_cursor.png</file>
@@ -153,11 +147,6 @@
<file>clipboard.c</file> <file>clipboard.c</file>
<file>colorsel.c</file> <file>colorsel.c</file>
<file>combobox.c</file> <file>combobox.c</file>
<file>constraints.c</file>
<file>constraints2.c</file>
<file>constraints3.c</file>
<file>constraints4.c</file>
<file>constraints5.c</file>
<file>css_accordion.c</file> <file>css_accordion.c</file>
<file>css_basics.c</file> <file>css_basics.c</file>
<file>css_blendmodes.c</file> <file>css_blendmodes.c</file>
@@ -223,7 +212,6 @@
<file>textview.c</file> <file>textview.c</file>
<file>textscroll.c</file> <file>textscroll.c</file>
<file>theming_style_classes.c</file> <file>theming_style_classes.c</file>
<file>themes.c</file>
<file>transparent.c</file> <file>transparent.c</file>
<file>tree_store.c</file> <file>tree_store.c</file>
<file>textmask.c</file> <file>textmask.c</file>

View File

@@ -41,6 +41,8 @@ demo_tagged_entry_init (DemoTaggedEntry *entry)
{ {
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry); DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
gtk_widget_set_has_surface (GTK_WIDGET (entry), FALSE);
priv->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); priv->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_set_parent (priv->box, GTK_WIDGET (entry)); gtk_widget_set_parent (priv->box, GTK_WIDGET (entry));
@@ -250,11 +252,11 @@ static guint signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE (DemoTaggedEntryTag, demo_tagged_entry_tag, GTK_TYPE_WIDGET) G_DEFINE_TYPE (DemoTaggedEntryTag, demo_tagged_entry_tag, GTK_TYPE_WIDGET)
static void static void
on_released (GtkGestureClick *gesture, on_released (GtkGestureMultiPress *gesture,
int n_press, int n_press,
double x, double x,
double y, double y,
DemoTaggedEntryTag *tag) DemoTaggedEntryTag *tag)
{ {
g_signal_emit (tag, signals[SIGNAL_CLICKED], 0); g_signal_emit (tag, signals[SIGNAL_CLICKED], 0);
} }
@@ -265,12 +267,14 @@ demo_tagged_entry_tag_init (DemoTaggedEntryTag *tag)
GtkGesture *gesture; GtkGesture *gesture;
GtkCssProvider *provider; GtkCssProvider *provider;
gtk_widget_set_has_surface (GTK_WIDGET (tag), FALSE);
tag->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); tag->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_set_parent (tag->box, GTK_WIDGET (tag)); gtk_widget_set_parent (tag->box, GTK_WIDGET (tag));
tag->label = gtk_label_new (""); tag->label = gtk_label_new ("");
gtk_container_add (GTK_CONTAINER (tag->box), tag->label); gtk_container_add (GTK_CONTAINER (tag->box), tag->label);
gesture = gtk_gesture_click_new (); gesture = gtk_gesture_multi_press_new ();
g_signal_connect (gesture, "released", G_CALLBACK (on_released), tag); g_signal_connect (gesture, "released", G_CALLBACK (on_released), tag);
gtk_widget_add_controller (GTK_WIDGET (tag), GTK_EVENT_CONTROLLER (gesture)); gtk_widget_add_controller (GTK_WIDGET (tag), GTK_EVENT_CONTROLLER (gesture));

View File

@@ -299,7 +299,7 @@ pressed_cb (GtkGesture *gesture,
rect.height = 0; rect.height = 0;
gtk_menu_popup_at_rect (GTK_MENU (menu), gtk_menu_popup_at_rect (GTK_MENU (menu),
gtk_native_get_surface (gtk_widget_get_native (widget)), gtk_widget_get_surface (widget),
&rect, &rect,
GDK_GRAVITY_NORTH_WEST, GDK_GRAVITY_NORTH_WEST,
GDK_GRAVITY_NORTH_WEST, GDK_GRAVITY_NORTH_WEST,
@@ -356,7 +356,7 @@ do_dnd (GtkWidget *do_widget)
gtk_widget_set_hexpand (fixed, TRUE); gtk_widget_set_hexpand (fixed, TRUE);
gtk_widget_set_vexpand (fixed, TRUE); gtk_widget_set_vexpand (fixed, TRUE);
multipress = gtk_gesture_click_new (); multipress = gtk_gesture_multi_press_new ();
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (multipress), 0); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (multipress), 0);
g_signal_connect (multipress, "pressed", G_CALLBACK (pressed_cb), NULL); g_signal_connect (multipress, "pressed", G_CALLBACK (pressed_cb), NULL);
g_signal_connect (multipress, "released", G_CALLBACK (released_cb), NULL); g_signal_connect (multipress, "released", G_CALLBACK (released_cb), NULL);

View File

@@ -38,7 +38,7 @@ do_expander (GtkWidget *do_widget)
if (!window) if (!window)
{ {
toplevel = GTK_WIDGET (gtk_widget_get_root (do_widget)); toplevel = gtk_widget_get_toplevel (do_widget);
window = gtk_message_dialog_new_with_markup (GTK_WINDOW (toplevel), window = gtk_message_dialog_new_with_markup (GTK_WINDOW (toplevel),
0, 0,
GTK_MESSAGE_ERROR, GTK_MESSAGE_ERROR,

View File

@@ -164,26 +164,6 @@ create_switch (void)
return w; return w;
} }
static void
mapped (GtkWidget *w)
{
gtk_menu_button_popup (GTK_MENU_BUTTON (w));
}
static GtkWidget *
create_menu_button (void)
{
GtkWidget *w = gtk_menu_button_new ();
GtkWidget *popover = gtk_popover_new (NULL);
gtk_container_add (GTK_CONTAINER (popover), gtk_button_new_with_label ("Hey!"));
gtk_popover_set_autohide (GTK_POPOVER (popover), FALSE);
gtk_menu_button_set_popover (GTK_MENU_BUTTON (w), popover);
g_signal_connect (w, "map", G_CALLBACK (mapped), NULL);
return w;
}
static const struct { static const struct {
const char *name; const char *name;
GtkWidget * (*create_func) (void); GtkWidget * (*create_func) (void);
@@ -199,7 +179,6 @@ static const struct {
{ "Video", create_video }, { "Video", create_video },
{ "Gears", create_gears }, { "Gears", create_gears },
{ "Switch", create_switch }, { "Switch", create_switch },
{ "Menubutton", create_menu_button },
}; };
static int selected_widget_type = -1; static int selected_widget_type = -1;
@@ -219,7 +198,7 @@ set_widget_type (GtkFishbowl *fishbowl,
gtk_fishbowl_set_creation_func (fishbowl, gtk_fishbowl_set_creation_func (fishbowl,
widget_types[selected_widget_type].create_func); widget_types[selected_widget_type].create_func);
window = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (fishbowl))); window = gtk_widget_get_toplevel (GTK_WIDGET (fishbowl));
headerbar = gtk_window_get_titlebar (GTK_WINDOW (window)); headerbar = gtk_window_get_titlebar (GTK_WINDOW (window));
gtk_header_bar_set_title (GTK_HEADER_BAR (headerbar), gtk_header_bar_set_title (GTK_HEADER_BAR (headerbar),
widget_types[selected_widget_type].name); widget_types[selected_widget_type].name);
@@ -255,15 +234,6 @@ prev_button_clicked_cb (GtkButton *source,
set_widget_type (fishbowl, new_index); set_widget_type (fishbowl, new_index);
} }
void
changes_toggled_cb (GtkToggleButton *button,
gpointer user_data)
{
if (gtk_toggle_button_get_active (button))
gtk_button_set_icon_name (GTK_BUTTON (button), "changes-prevent");
else
gtk_button_set_icon_name (GTK_BUTTON (button), "changes-allow");
}
GtkWidget * GtkWidget *
do_fishbowl (GtkWidget *do_widget) do_fishbowl (GtkWidget *do_widget)
@@ -291,7 +261,6 @@ do_fishbowl (GtkWidget *do_widget)
gtk_builder_add_callback_symbols (builder, gtk_builder_add_callback_symbols (builder,
"next_button_clicked_cb", G_CALLBACK (next_button_clicked_cb), "next_button_clicked_cb", G_CALLBACK (next_button_clicked_cb),
"prev_button_clicked_cb", G_CALLBACK (prev_button_clicked_cb), "prev_button_clicked_cb", G_CALLBACK (prev_button_clicked_cb),
"changes_toggled_cb", G_CALLBACK (changes_toggled_cb),
NULL); NULL);
gtk_builder_connect_signals (builder, NULL); gtk_builder_connect_signals (builder, NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));

View File

@@ -2,8 +2,6 @@
<interface> <interface>
<object class="GtkWindow" id="window"> <object class="GtkWindow" id="window">
<property name="title" translatable="yes">Fishbowl</property> <property name="title" translatable="yes">Fishbowl</property>
<property name="default-width">400</property>
<property name="default-height">400</property>
<child type="titlebar"> <child type="titlebar">
<object class="GtkHeaderBar" id=""> <object class="GtkHeaderBar" id="">
<property name="show-title-buttons">1</property> <property name="show-title-buttons">1</property>
@@ -33,7 +31,7 @@
</child> </child>
<child type="end"> <child type="end">
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label" bind-source="bowl" bind-property="framerate-string"/> <property name="label" bind-source="bowl" bind-property="framerate"/>
</object> </object>
</child> </child>
<child type="end"> <child type="end">
@@ -48,9 +46,17 @@
</child> </child>
<child type="end"> <child type="end">
<object class="GtkToggleButton" id="changes_allow"> <object class="GtkToggleButton" id="changes_allow">
<property name="visible" bind-source="changes_allow" bind-property="active" bind-flags="invert-boolean"/>
<property name="icon-name">changes-allow</property> <property name="icon-name">changes-allow</property>
<property name="relief">none</property> <property name="relief">none</property>
<signal name="notify::active" handler="changes_toggled_cb"/> </object>
</child>
<child type="end">
<object class="GtkToggleButton" id="changes_prevent">
<property name="active" bind-source="changes_allow" bind-property="active" bind-flags="bidirectional|invert-boolean"/>
<property name="visible" bind-source="changes_prevent" bind-property="active" bind-flags="invert-boolean"/>
<property name="icon-name">changes-prevent</property>
<property name="relief">none</property>
</object> </object>
</child> </child>
</object> </object>
@@ -59,7 +65,7 @@
<object class="GtkFishbowl" id="bowl"> <object class="GtkFishbowl" id="bowl">
<property name="visible">True</property> <property name="visible">True</property>
<property name="animating">True</property> <property name="animating">True</property>
<property name="benchmark" bind-source="changes_allow" bind-property="active" bind-flags="invert-boolean | sync-create"/> <property name="benchmark" bind-source="changes_allow" bind-property="active" bind-flags="invert-boolean"/>
</object> </object>
</child> </child>
</object> </object>

View File

@@ -1669,7 +1669,7 @@ toggle_edit (void)
static void static void
stop_edit (void) stop_edit (void)
{ {
g_signal_emit_by_name (edit_toggle, "clicked"); gtk_button_clicked (GTK_BUTTON (edit_toggle));
} }
static gboolean static gboolean

View File

@@ -209,6 +209,7 @@ gtk_font_plane_init (GtkFontPlane *plane)
{ {
GtkGesture *gesture; GtkGesture *gesture;
gtk_widget_set_has_surface (GTK_WIDGET (plane), FALSE);
gtk_widget_set_can_focus (GTK_WIDGET (plane), TRUE); gtk_widget_set_can_focus (GTK_WIDGET (plane), TRUE);
gesture = gtk_gesture_drag_new (); gesture = gtk_gesture_drag_new ();

View File

@@ -53,7 +53,6 @@ enum {
PROP_BENCHMARK, PROP_BENCHMARK,
PROP_COUNT, PROP_COUNT,
PROP_FRAMERATE, PROP_FRAMERATE,
PROP_FRAMERATE_STRING,
PROP_UPDATE_DELAY, PROP_UPDATE_DELAY,
NUM_PROPERTIES NUM_PROPERTIES
}; };
@@ -67,6 +66,8 @@ gtk_fishbowl_init (GtkFishbowl *fishbowl)
{ {
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl); GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
gtk_widget_set_has_surface (GTK_WIDGET (fishbowl), FALSE);
priv->update_delay = G_USEC_PER_SEC; priv->update_delay = G_USEC_PER_SEC;
} }
@@ -289,14 +290,6 @@ gtk_fishbowl_get_property (GObject *object,
g_value_set_double (value, gtk_fishbowl_get_framerate (fishbowl)); g_value_set_double (value, gtk_fishbowl_get_framerate (fishbowl));
break; break;
case PROP_FRAMERATE_STRING:
{
char *s = g_strdup_printf ("%.2f", gtk_fishbowl_get_framerate (fishbowl));
g_value_set_string (value, s);
g_free (s);
}
break;
case PROP_UPDATE_DELAY: case PROP_UPDATE_DELAY:
g_value_set_int64 (value, gtk_fishbowl_get_update_delay (fishbowl)); g_value_set_int64 (value, gtk_fishbowl_get_update_delay (fishbowl));
break; break;
@@ -350,13 +343,6 @@ gtk_fishbowl_class_init (GtkFishbowlClass *klass)
0, 0,
G_PARAM_READABLE); G_PARAM_READABLE);
props[PROP_FRAMERATE_STRING] =
g_param_spec_string ("framerate-string",
"Framerate as string",
"Framerate as string, with 2 decimals",
NULL,
G_PARAM_READABLE);
props[PROP_UPDATE_DELAY] = props[PROP_UPDATE_DELAY] =
g_param_spec_int64 ("update-delay", g_param_spec_int64 ("update-delay",
"Update delay", "Update delay",
@@ -505,10 +491,7 @@ gtk_fishbowl_do_update (GtkFishbowl *fishbowl)
n_frames = end_counter - start_counter; n_frames = end_counter - start_counter;
priv->framerate = ((double) n_frames) * G_USEC_PER_SEC / (end_timestamp - start_timestamp); priv->framerate = ((double) n_frames) * G_USEC_PER_SEC / (end_timestamp - start_timestamp);
priv->framerate = ((int)(priv->framerate * 100))/100.0;
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE]); g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE]);
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE_STRING]);
if (!priv->benchmark) if (!priv->benchmark)
return; return;

View File

@@ -136,11 +136,11 @@ static void set_cursor_if_appropriate (GtkTextView *text_view,
gint y); gint y);
static void static void
released_cb (GtkGestureClick *gesture, released_cb (GtkGestureMultiPress *gesture,
guint n_press, guint n_press,
gdouble x, gdouble x,
gdouble y, gdouble y,
GtkWidget *text_view) GtkWidget *text_view)
{ {
GtkTextIter start, end, iter; GtkTextIter start, end, iter;
GtkTextBuffer *buffer; GtkTextBuffer *buffer;
@@ -247,7 +247,7 @@ do_hypertext (GtkWidget *do_widget)
g_signal_connect (controller, "key-pressed", G_CALLBACK (key_pressed), view); g_signal_connect (controller, "key-pressed", G_CALLBACK (key_pressed), view);
gtk_widget_add_controller (view, controller); gtk_widget_add_controller (view, controller);
controller = GTK_EVENT_CONTROLLER (gtk_gesture_click_new ()); controller = GTK_EVENT_CONTROLLER (gtk_gesture_multi_press_new ());
g_signal_connect (controller, "released", g_signal_connect (controller, "released",
G_CALLBACK (released_cb), view); G_CALLBACK (released_cb), view);
gtk_widget_add_controller (view, controller); gtk_widget_add_controller (view, controller);

View File

@@ -20,7 +20,7 @@ on_bar_response (GtkInfoBar *info_bar,
return; return;
} }
window = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (info_bar))); window = gtk_widget_get_toplevel (GTK_WIDGET (info_bar));
dialog = gtk_message_dialog_new (GTK_WINDOW (window), dialog = gtk_message_dialog_new (GTK_WINDOW (window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO, GTK_MESSAGE_INFO,

View File

@@ -25,7 +25,7 @@ activate_link (GtkWidget *label,
GtkWidget *dialog; GtkWidget *dialog;
GtkWidget *parent; GtkWidget *parent;
parent = GTK_WIDGET (gtk_widget_get_root (label)); parent = gtk_widget_get_toplevel (label);
dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (parent), dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (parent),
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO, GTK_MESSAGE_INFO,

View File

@@ -171,9 +171,13 @@
<object class="GtkMenuButton" id="more-button"> <object class="GtkMenuButton" id="more-button">
<property name="can-focus">1</property> <property name="can-focus">1</property>
<property name="receives-default">1</property> <property name="receives-default">1</property>
<property name="popup">menu1</property>
<property name="relief">none</property> <property name="relief">none</property>
<property name="label" translatable="yes">More...</property> <property name="popup">menu1</property>
<child>
<object class="GtkLabel" id="label7">
<property name="label" translatable="yes">More...</property>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>

View File

@@ -164,7 +164,7 @@ run_example_for_row (GtkWidget *window,
cbdata->model = model; cbdata->model = model;
cbdata->path = gtk_tree_model_get_path (model, iter); cbdata->path = gtk_tree_model_get_path (model, iter);
if (GTK_IS_WINDOW (demo)) if (gtk_widget_is_toplevel (demo))
{ {
gtk_window_set_transient_for (GTK_WINDOW (demo), GTK_WINDOW (window)); gtk_window_set_transient_for (GTK_WINDOW (demo), GTK_WINDOW (window));
gtk_window_set_modal (GTK_WINDOW (demo), TRUE); gtk_window_set_modal (GTK_WINDOW (demo), TRUE);
@@ -991,7 +991,7 @@ row_activated_cb (GtkWidget *tree_view,
GtkWidget *window; GtkWidget *window;
GtkTreeModel *model; GtkTreeModel *model;
window = GTK_WIDGET (gtk_widget_get_root (tree_view)); window = gtk_widget_get_toplevel (tree_view);
model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)); model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
gtk_tree_model_get_iter (model, &iter, path); gtk_tree_model_get_iter (model, &iter, path);

View File

@@ -8,11 +8,6 @@ demos = files([
'clipboard.c', 'clipboard.c',
'colorsel.c', 'colorsel.c',
'combobox.c', 'combobox.c',
'constraints.c',
'constraints2.c',
'constraints3.c',
'constraints4.c',
'constraints5.c',
'css_accordion.c', 'css_accordion.c',
'css_basics.c', 'css_basics.c',
'css_blendmodes.c', 'css_blendmodes.c',
@@ -75,7 +70,6 @@ demos = files([
'textmask.c', 'textmask.c',
'textview.c', 'textview.c',
'textscroll.c', 'textscroll.c',
'themes.c',
'theming_style_classes.c', 'theming_style_classes.c',
'transparent.c', 'transparent.c',
'tree_store.c', 'tree_store.c',

View File

@@ -176,7 +176,7 @@ drawing_area_unroot (GtkWidget *widget)
DrawingArea *area = (DrawingArea *) widget; DrawingArea *area = (DrawingArea *) widget;
GtkWidget *toplevel; GtkWidget *toplevel;
toplevel = GTK_WIDGET (gtk_widget_get_root (widget)); toplevel = gtk_widget_get_toplevel (widget);
if (area->pad_controller) if (area->pad_controller)
{ {
@@ -198,7 +198,7 @@ drawing_area_root (GtkWidget *widget)
GTK_WIDGET_CLASS (drawing_area_parent_class)->root (widget); GTK_WIDGET_CLASS (drawing_area_parent_class)->root (widget);
toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (area))); toplevel = gtk_widget_get_toplevel (GTK_WIDGET (area));
action_group = g_simple_action_group_new (); action_group = g_simple_action_group_new ();
area->pad_controller = gtk_pad_controller_new (G_ACTION_GROUP (action_group), NULL); area->pad_controller = gtk_pad_controller_new (G_ACTION_GROUP (action_group), NULL);
@@ -330,6 +330,8 @@ drawing_area_init (DrawingArea *area)
{ {
GtkGesture *gesture; GtkGesture *gesture;
gtk_widget_set_has_surface (GTK_WIDGET (area), FALSE);
gesture = gtk_gesture_stylus_new (); gesture = gtk_gesture_stylus_new ();
g_signal_connect (gesture, "down", g_signal_connect (gesture, "down",
G_CALLBACK (stylus_gesture_down), area); G_CALLBACK (stylus_gesture_down), area);

View File

@@ -143,7 +143,7 @@ do_popover (GtkWidget *do_widget)
popover = create_popover (widget, popover = create_popover (widget,
gtk_label_new ("This popover does not grab input"), gtk_label_new ("This popover does not grab input"),
GTK_POS_TOP); GTK_POS_TOP);
gtk_popover_set_autohide (GTK_POPOVER (popover), FALSE); gtk_popover_set_modal (GTK_POPOVER (popover), FALSE);
g_signal_connect (widget, "toggled", g_signal_connect (widget, "toggled",
G_CALLBACK (toggle_changed_cb), popover); G_CALLBACK (toggle_changed_cb), popover);
gtk_container_add (GTK_CONTAINER (box), widget); gtk_container_add (GTK_CONTAINER (box), widget);

View File

@@ -8,8 +8,8 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
static GtkWidget *window = NULL; static GtkWidget *window = NULL;
static GtkWidget *menu = NULL;
static GtkWidget *notebook = NULL; static GtkWidget *notebook = NULL;
static GSimpleActionGroup *actions = NULL;
static guint search_progress_id = 0; static guint search_progress_id = 0;
static guint finish_search_id = 0; static guint finish_search_id = 0;
@@ -83,42 +83,69 @@ stop_search (GtkButton *button,
} }
static void static void
clear_entry (GSimpleAction *action, clear_entry (GtkEntry *entry)
GVariant *parameter,
gpointer user_data)
{ {
GtkEditable *editable = user_data; gtk_editable_set_text (GTK_EDITABLE (entry), "");
gtk_editable_set_text (editable, "");
} }
static void static void
set_search_by (GSimpleAction *action, search_by_name (GtkWidget *item,
GVariant *value, GtkEntry *entry)
gpointer user_data)
{ {
GtkEntry *entry = user_data; gtk_entry_set_icon_tooltip_text (entry,
const char *term; GTK_ENTRY_ICON_PRIMARY,
"Search by name\n"
"Click here to change the search type");
gtk_entry_set_placeholder_text (entry, "name");
}
term = g_variant_get_string (value, NULL); static void
search_by_description (GtkWidget *item,
GtkEntry *entry)
{
g_simple_action_set_state (action, value); gtk_entry_set_icon_tooltip_text (entry,
GTK_ENTRY_ICON_PRIMARY,
"Search by description\n"
"Click here to change the search type");
gtk_entry_set_placeholder_text (entry, "description");
}
if (g_str_equal (term, "name")) static void
{ search_by_file (GtkWidget *item,
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, "Search by name"); GtkEntry *entry)
gtk_entry_set_placeholder_text (entry, "name"); {
} gtk_entry_set_icon_tooltip_text (entry,
else if (g_str_equal (term, "description")) GTK_ENTRY_ICON_PRIMARY,
{ "Search by file name\n"
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, "Search by description"); "Click here to change the search type");
gtk_entry_set_placeholder_text (entry, "description"); gtk_entry_set_placeholder_text (entry, "file name");
} }
else if (g_str_equal (term, "filename"))
{ GtkWidget *
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, "Search by file name"); create_search_menu (GtkWidget *entry)
gtk_entry_set_placeholder_text (entry, "file name"); {
} GtkWidget *menu;
GtkWidget *item;
menu = gtk_menu_new ();
item = gtk_menu_item_new_with_mnemonic ("Search by _name");
g_signal_connect (item, "activate",
G_CALLBACK (search_by_name), entry);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
item = gtk_menu_item_new_with_mnemonic ("Search by _description");
g_signal_connect (item, "activate",
G_CALLBACK (search_by_description), entry);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
item = gtk_menu_item_new_with_mnemonic ("Search by _file name");
g_signal_connect (item, "activate",
G_CALLBACK (search_by_file), entry);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
return menu;
} }
static void static void
@@ -127,28 +154,7 @@ icon_press_cb (GtkEntry *entry,
gpointer data) gpointer data)
{ {
if (position == GTK_ENTRY_ICON_PRIMARY) if (position == GTK_ENTRY_ICON_PRIMARY)
{ gtk_menu_popup_at_pointer (GTK_MENU (menu), NULL);
GAction *action;
GVariant *state;
GVariant *new_state;
const char *s;
action = g_action_map_lookup_action (G_ACTION_MAP (actions), "search-by");
state = g_action_get_state (action);
s = g_variant_get_string (state, NULL);
if (g_str_equal (s, "name"))
new_state = g_variant_new_string ("description");
else if (g_str_equal (s, "description"))
new_state = g_variant_new_string ("filename");
else if (g_str_equal (s, "filename"))
new_state = g_variant_new_string ("name");
else
g_assert_not_reached ();
g_action_change_state (action, new_state);
g_variant_unref (state);
}
} }
static void static void
@@ -159,6 +165,7 @@ activate_cb (GtkEntry *entry,
return; return;
start_search (button, entry); start_search (button, entry);
} }
static void static void
@@ -180,62 +187,32 @@ search_entry_destroyed (GtkWidget *widget)
} }
static void static void
text_changed (GObject *object, entry_populate_popup (GtkEntry *entry,
GParamSpec *pspec, GtkMenu *menu,
gpointer data) gpointer user_data)
{ {
GtkEntry *entry = GTK_ENTRY (object); GtkWidget *item;
GActionMap *actions = data; GtkWidget *search_menu;
GAction *action;
gboolean has_text; gboolean has_text;
has_text = gtk_entry_get_text_length (entry) > 0; has_text = gtk_entry_get_text_length (entry) > 0;
action = g_action_map_lookup_action (actions, "clear"); item = gtk_separator_menu_item_new ();
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), has_text); gtk_widget_show (item);
} gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
static GMenuModel * item = gtk_menu_item_new_with_mnemonic ("C_lear");
create_search_menu_model (void) gtk_widget_show (item);
{ g_signal_connect_swapped (item, "activate",
GMenu *menu = g_menu_new (); G_CALLBACK (clear_entry), entry);
g_menu_append (menu, _("Name"), "search.search-by::name"); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
g_menu_append (menu, _("Description"), "search.search-by::description"); gtk_widget_set_sensitive (item, has_text);
g_menu_append (menu, _("File Name"), "search.search-by::filename");
return G_MENU_MODEL (menu); search_menu = create_search_menu (GTK_WIDGET (entry));
} item = gtk_menu_item_new_with_label ("Search by");
gtk_widget_show (item);
static void gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), search_menu);
entry_add_to_context_menu (GtkEntry *entry) gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
{
GMenu *menu;
GActionEntry entries[] = {
{ "clear", clear_entry, NULL, NULL, NULL },
{ "search-by", NULL, "s", "'name'", set_search_by }
};
GMenuModel *submenu;
GMenuItem *item;
actions = g_simple_action_group_new ();
g_action_map_add_action_entries (G_ACTION_MAP (actions), entries, G_N_ELEMENTS(entries), entry);
gtk_widget_insert_action_group (GTK_WIDGET (entry), "search", G_ACTION_GROUP (actions));
menu = g_menu_new ();
item = g_menu_item_new (_("C_lear"), "search.clear");
g_menu_item_set_attribute (item, "touch-icon", "s", "edit-clear-symbolic");
g_menu_append_item (G_MENU (menu), item);
g_object_unref (item);
submenu = create_search_menu_model ();
g_menu_append_submenu (menu, _("Search By"), submenu);
g_object_unref (submenu);
gtk_entry_set_extra_menu (entry, G_MENU_MODEL (menu));
g_object_unref (menu);
g_signal_connect (entry, "notify::text", G_CALLBACK (text_changed), actions);
} }
GtkWidget * GtkWidget *
@@ -294,25 +271,29 @@ do_search_entry (GtkWidget *do_widget)
gtk_widget_show (cancel_button); gtk_widget_show (cancel_button);
/* Set up the search icon */ /* Set up the search icon */
GVariant *value = g_variant_ref_sink (g_variant_new_string ("name")); search_by_name (NULL, GTK_ENTRY (entry));
set_search_by (NULL, value, entry);
g_variant_unref (value);
gtk_entry_set_icon_activatable (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, TRUE); /* Set up the clear icon */
gtk_entry_set_icon_sensitive (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, TRUE); g_signal_connect (entry, "icon-press",
G_CALLBACK (icon_press_cb), NULL);
g_signal_connect (entry, "activate",
G_CALLBACK (activate_cb), NULL);
g_signal_connect (entry, "icon-press", G_CALLBACK (icon_press_cb), NULL); /* Create the menu */
g_signal_connect (entry, "activate", G_CALLBACK (activate_cb), NULL); menu = create_search_menu (entry);
gtk_menu_attach_to_widget (GTK_MENU (menu), entry, NULL);
/* add accessible alternatives for icon functionality */ /* add accessible alternatives for icon functionality */
entry_add_to_context_menu (GTK_ENTRY (entry)); g_object_set (entry, "populate-all", TRUE, NULL);
g_signal_connect (entry, "populate-popup",
G_CALLBACK (entry_populate_popup), NULL);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
{ {
g_clear_object (&actions); gtk_widget_destroy (menu);
gtk_widget_destroy (window); gtk_widget_destroy (window);
} }

View File

@@ -218,11 +218,11 @@ puzzle_key_pressed (GtkEventControllerKey *controller,
} }
static void static void
puzzle_button_pressed (GtkGestureClick *gesture, puzzle_button_pressed (GtkGestureMultiPress *gesture,
int n_press, int n_press,
double x, double x,
double y, double y,
GtkWidget *grid) GtkWidget *grid)
{ {
GtkWidget *child; GtkWidget *child;
int l, t, i; int l, t, i;
@@ -282,7 +282,6 @@ start_puzzle (GdkPaintable *puzzle)
GtkWidget *picture, *grid; GtkWidget *picture, *grid;
GtkEventController *controller; GtkEventController *controller;
guint x, y; guint x, y;
float aspect_ratio;
/* Remove the old grid (if there is one) */ /* Remove the old grid (if there is one) */
grid = gtk_bin_get_child (GTK_BIN (frame)); grid = gtk_bin_get_child (GTK_BIN (frame));
@@ -293,10 +292,7 @@ start_puzzle (GdkPaintable *puzzle)
grid = gtk_grid_new (); grid = gtk_grid_new ();
gtk_widget_set_can_focus (grid, TRUE); gtk_widget_set_can_focus (grid, TRUE);
gtk_container_add (GTK_CONTAINER (frame), grid); gtk_container_add (GTK_CONTAINER (frame), grid);
aspect_ratio = gdk_paintable_get_intrinsic_aspect_ratio (puzzle); gtk_aspect_frame_set (GTK_ASPECT_FRAME (frame), 0.5, 0.5, (float) gdk_paintable_get_intrinsic_aspect_ratio (puzzle), FALSE);
if (aspect_ratio == 0.0)
aspect_ratio = 1.0;
gtk_aspect_frame_set (GTK_ASPECT_FRAME (frame), 0.5, 0.5, aspect_ratio, FALSE);
/* Add a key event controller so people can use the arrow /* Add a key event controller so people can use the arrow
* keys to move the puzzle */ * keys to move the puzzle */
@@ -306,7 +302,7 @@ start_puzzle (GdkPaintable *puzzle)
grid); grid);
gtk_widget_add_controller (GTK_WIDGET (grid), controller); gtk_widget_add_controller (GTK_WIDGET (grid), controller);
controller = GTK_EVENT_CONTROLLER (gtk_gesture_click_new ()); controller = GTK_EVENT_CONTROLLER (gtk_gesture_multi_press_new ());
g_signal_connect (controller, "pressed", g_signal_connect (controller, "pressed",
G_CALLBACK (puzzle_button_pressed), G_CALLBACK (puzzle_button_pressed),
grid); grid);
@@ -449,11 +445,12 @@ do_sliding_puzzle (GtkWidget *do_widget)
g_signal_connect (apply, "clicked", G_CALLBACK (reconfigure), NULL); g_signal_connect (apply, "clicked", G_CALLBACK (reconfigure), NULL);
popover = gtk_popover_new (NULL); popover = gtk_popover_new (NULL);
gtk_popover_set_modal (GTK_POPOVER (popover), TRUE);
gtk_container_add (GTK_CONTAINER (popover), tweaks); gtk_container_add (GTK_CONTAINER (popover), tweaks);
tweak = gtk_menu_button_new (); tweak = gtk_menu_button_new ();
gtk_menu_button_set_popover (GTK_MENU_BUTTON (tweak), popover); gtk_menu_button_set_popover (GTK_MENU_BUTTON (tweak), popover);
gtk_menu_button_set_icon_name (GTK_MENU_BUTTON (tweak), "emblem-system-symbolic"); gtk_button_set_icon_name (GTK_BUTTON (tweak), "emblem-system-symbolic");
restart = gtk_button_new_from_icon_name ("view-refresh-symbolic"); restart = gtk_button_new_from_icon_name ("view-refresh-symbolic");
g_signal_connect (restart, "clicked", G_CALLBACK (reshuffle), NULL); g_signal_connect (restart, "clicked", G_CALLBACK (reshuffle), NULL);

View File

@@ -1,203 +0,0 @@
/* Benchmark/Themes
*
* This demo switches themes like a maniac, like some of you.
*/
#include <gtk/gtk.h>
static guint tick_cb;
static gint64
guess_refresh_interval (GdkFrameClock *frame_clock)
{
gint64 interval;
gint64 i;
interval = G_MAXINT64;
for (i = gdk_frame_clock_get_history_start (frame_clock);
i < gdk_frame_clock_get_frame_counter (frame_clock);
i++)
{
GdkFrameTimings *t, *before;
gint64 ts, before_ts;
t = gdk_frame_clock_get_timings (frame_clock, i);
before = gdk_frame_clock_get_timings (frame_clock, i - 1);
if (t == NULL || before == NULL)
continue;
ts = gdk_frame_timings_get_frame_time (t);
before_ts = gdk_frame_timings_get_frame_time (before);
if (ts == 0 || before_ts == 0)
continue;
interval = MIN (interval, ts - before_ts);
}
if (interval == G_MAXINT64)
return 0;
return interval;
}
static double
frame_clock_get_fps (GdkFrameClock *frame_clock)
{
GdkFrameTimings *start, *end;
gint64 start_counter, end_counter;
gint64 start_timestamp, end_timestamp;
gint64 interval;
start_counter = gdk_frame_clock_get_history_start (frame_clock);
end_counter = gdk_frame_clock_get_frame_counter (frame_clock);
start = gdk_frame_clock_get_timings (frame_clock, start_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 = gdk_frame_clock_get_timings (frame_clock, end_counter))
end_counter--;
if (end_counter - start_counter < 4)
return 0.0;
start_timestamp = gdk_frame_timings_get_presentation_time (start);
end_timestamp = gdk_frame_timings_get_presentation_time (end);
if (start_timestamp == 0 || end_timestamp == 0)
{
start_timestamp = gdk_frame_timings_get_frame_time (start);
end_timestamp = gdk_frame_timings_get_frame_time (end);
}
interval = gdk_frame_timings_get_refresh_interval (end);
if (interval == 0)
{
interval = guess_refresh_interval (frame_clock);
if (interval == 0)
return 0.0;
}
return ((double) end_counter - start_counter) * G_USEC_PER_SEC / (end_timestamp - start_timestamp);
}
typedef struct {
const char *name;
gboolean dark;
} Theme;
static Theme themes[] = {
{ "Adwaita", FALSE },
{ "Adwaita", TRUE },
{ "HighContrast", FALSE },
{ "HighContrastInverse", FALSE }
};
static int theme;
static gboolean
change_theme (GtkWidget *widget,
GdkFrameClock *frame_clock,
gpointer data)
{
GtkBuilder *builder = data;
GtkWidget *header;
GtkWidget *label;
Theme next = themes[theme++ % G_N_ELEMENTS (themes)];
char *name;
g_object_set (gtk_settings_get_default (),
"gtk-theme-name", next.name,
"gtk-application-prefer-dark-theme", next.dark,
NULL);
header = GTK_WIDGET (gtk_builder_get_object (builder, "header"));
name = g_strconcat (next.name, next.dark ? " (dark)" : NULL, NULL);
gtk_header_bar_set_title (GTK_HEADER_BAR (header), name);
g_free (name);
label = GTK_WIDGET (gtk_builder_get_object (builder, "fps"));
if (frame_clock)
{
char *fps;
fps = g_strdup_printf ("%.2f fps", frame_clock_get_fps (frame_clock));
gtk_label_set_label (GTK_LABEL (label), fps);
g_free (fps);
}
else
gtk_label_set_label (GTK_LABEL (label), "");
return G_SOURCE_CONTINUE;
}
static void
clicked (GtkGestureClick *gesture,
int n_press,
double x,
double y,
gpointer data)
{
GtkWidget *window;
const GdkEvent *event;
GdkModifierType state;
window = gtk_widget_get_ancestor (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)), GTK_TYPE_WINDOW);
event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), NULL);
gdk_event_get_state (event, &state);
if (state & GDK_CONTROL_MASK)
{
if (tick_cb)
{
gtk_widget_remove_tick_callback (window, tick_cb);
tick_cb = 0;
}
change_theme (window, NULL, data);
}
else
{
if (tick_cb)
{
gtk_widget_remove_tick_callback (window, tick_cb);
tick_cb = 0;
}
else
{
tick_cb = gtk_widget_add_tick_callback (window, change_theme, data, NULL);
}
}
}
GtkWidget *
do_themes (GtkWidget *do_widget)
{
static GtkWidget *window = NULL;
if (!window)
{
GtkBuilder *builder;
GtkWidget *header;
GtkGesture *gesture;
builder = gtk_builder_new_from_resource ("/themes/themes.ui");
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
header = GTK_WIDGET (gtk_builder_get_object (builder, "header"));
gesture = gtk_gesture_click_new ();
g_signal_connect (gesture, "pressed", G_CALLBACK (clicked), builder);
gtk_widget_add_controller (header, GTK_EVENT_CONTROLLER (gesture));
gtk_widget_realize (window);
}
if (!gtk_widget_get_visible (window))
gtk_widget_show (window);
else
gtk_widget_destroy (window);
return window;
}

View File

@@ -1,241 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkWindow" id="window">
<property name="resizable">0</property>
<child type="titlebar">
<object class="GtkHeaderBar" id="header">
<property name="show-title-buttons">1</property>
<child type="end">
<object class="GtkLabel" id="fps">
</object>
</child>
</object>
</child>
<child>
<object class="GtkGrid" id="grid">
<property name="margin">10</property>
<property name="row-spacing">10</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkToolbar">
<property name="hexpand">1</property>
<property name="show-arrow">0</property>
<style>
<class name="primary-toolbar"/>
</style>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="label" translatable="yes">Normal</property>
<property name="use-underline">1</property>
<property name="is-important">1</property>
<property name="icon-name">edit-find</property>
</object>
</child>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="label" translatable="yes">Active</property>
<property name="use-underline">1</property>
<property name="is-important">1</property>
<property name="icon-name">edit-find</property>
<property name="active">1</property>
</object>
</child>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="sensitive">0</property>
<property name="label" translatable="yes">Insensitive</property>
<property name="use-underline">1</property>
<property name="is-important">1</property>
<property name="icon-name">edit-find</property>
</object>
</child>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="label" translatable="yes">Raised</property>
<property name="use-underline">1</property>
<property name="is-important">1</property>
<property name="icon-name">edit-find</property>
<style>
<class name="raised"/>
</style>
</object>
</child>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="label" translatable="yes">Raised Active</property>
<property name="use-underline">1</property>
<property name="is-important">1</property>
<property name="icon-name">edit-find</property>
<property name="active">1</property>
<style>
<class name="raised"/>
</style>
</object>
</child>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="sensitive">0</property>
<property name="label" translatable="yes">Insensitive Active</property>
<property name="use-underline">1</property>
<property name="icon-name">edit-find</property>
<property name="is-important">1</property>
<property name="active">1</property>
</object>
</child>
<child>
<object class="GtkToolItem">
<child>
<object class="GtkEntry" id="entry1">
<property name="can-focus">1</property>
<property name="width-chars">10</property>
<property name="invisible-char">•</property>
<property name="placeholder-text" translatable="yes">Search...</property>
<property name="secondary-icon-name">edit-find-symbolic</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkToolItem">
<child>
<object class="GtkSwitch" id="switch1">
<property name="can-focus">1</property>
<property name="valign">center</property>
<property name="tooltip_text">Switch it</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="valign">center</property>
<property name="halign">center</property>
<style>
<class name="linked"/>
</style>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Hi, I am a button</property>
<property name="can-focus">1</property>
<property name="receives-default">1</property>
</object>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">And I&apos;m another button</property>
<property name="can-focus">1</property>
<property name="receives-default">1</property>
</object>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">This is a button party!</property>
<property name="can-focus">1</property>
<property name="receives-default">1</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkToolbar">
<property name="hexpand">1</property>
<property name="toolbar-style">icons</property>
<style>
<class name="inline-toolbar"/>
</style>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="label" translatable="yes">Normal</property>
<property name="use-underline">1</property>
<property name="icon-name">list-add-symbolic</property>
</object>
</child>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="label" translatable="yes">Normal</property>
<property name="use-underline">1</property>
<property name="icon-name">list-add-symbolic</property>
</object>
</child>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="label" translatable="yes">Active</property>
<property name="use-underline">1</property>
<property name="icon-name">list-remove-symbolic</property>
<property name="active">1</property>
</object>
</child>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="label" translatable="yes">Active</property>
<property name="use-underline">1</property>
<property name="icon-name">list-remove-symbolic</property>
<property name="active">1</property>
</object>
</child>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="sensitive">0</property>
<property name="label" translatable="yes">Insensitive</property>
<property name="use-underline">1</property>
<property name="icon-name">edit-find-symbolic</property>
</object>
</child>
<child>
<object class="GtkToggleToolButton">
<property name="homogeneous">1</property>
<property name="sensitive">0</property>
<property name="label" translatable="yes">Insensitive Active</property>
<property name="use-underline">1</property>
<property name="icon-name">go-up-symbolic</property>
<property name="active">1</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="spacing">10</property>
<child>
<object class="GtkButton">
<property name="label">Plain</property>
<property name="halign">end</property>
<property name="hexpand">1</property>
<property name="vexpand">1</property>
</object>
</child>
<child>
<object class="GtkButton">
<property name="label">Destructive</property>
<style>
<class name="destructive-action"/>
</style>
</object>
</child>
<child>
<object class="GtkButton">
<property name="label">Suggested</property>
<style>
<class name="suggested-action"/>
</style>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

View File

@@ -33,7 +33,7 @@ open_clicked_cb (GtkWidget *button,
GtkWidget *dialog; GtkWidget *dialog;
dialog = gtk_file_chooser_dialog_new ("Select a video", dialog = gtk_file_chooser_dialog_new ("Select a video",
GTK_WINDOW (gtk_widget_get_root (button)), GTK_WINDOW (gtk_widget_get_toplevel (button)),
GTK_FILE_CHOOSER_ACTION_OPEN, GTK_FILE_CHOOSER_ACTION_OPEN,
"_Cancel", GTK_RESPONSE_CANCEL, "_Cancel", GTK_RESPONSE_CANCEL,
"_Open", GTK_RESPONSE_ACCEPT, "_Open", GTK_RESPONSE_ACCEPT,
@@ -48,7 +48,7 @@ static void
fullscreen_clicked_cb (GtkWidget *button, fullscreen_clicked_cb (GtkWidget *button,
gpointer unused) gpointer unused)
{ {
GtkWidget *window = GTK_WIDGET (gtk_widget_get_root (button)); GtkWidget *window = gtk_widget_get_toplevel (button);
gtk_window_fullscreen (GTK_WINDOW (window)); gtk_window_fullscreen (GTK_WINDOW (window));
} }

View File

@@ -1,4 +1,3 @@
subdir('constraint-editor')
subdir('gtk-demo') subdir('gtk-demo')
subdir('icon-browser') subdir('icon-browser')
subdir('node-editor') subdir('node-editor')

View File

@@ -13,7 +13,6 @@ executable('gtk4-node-editor',
node_editor_sources, node_editor_resources, node_editor_sources, node_editor_resources,
dependencies: libgtk_dep, dependencies: libgtk_dep,
include_directories: confinc, include_directories: confinc,
c_args: ['-DNODE_EDITOR_SOURCE_DIR="@0@/../../testsuite/gsk/compare/"'.format(meson.current_source_dir())],
gui_app: true, gui_app: true,
link_args: extra_demo_ldflags, link_args: extra_demo_ldflags,
install: false) install: false)

View File

@@ -25,10 +25,6 @@
#include "gsk/gskrendernodeparserprivate.h" #include "gsk/gskrendernodeparserprivate.h"
#ifndef NODE_EDITOR_SOURCE_DIR
#define NODE_EDITOR_SOURCE_DIR "." /* Fallback */
#endif
typedef struct typedef struct
{ {
gsize start_chars; gsize start_chars;
@@ -45,12 +41,6 @@ struct _NodeEditorWindow
GtkTextBuffer *text_buffer; GtkTextBuffer *text_buffer;
GtkTextTagTable *tag_table; GtkTextTagTable *tag_table;
GtkWidget *testcase_popover;
GtkWidget *testcase_error_label;
GtkWidget *testcase_cairo_checkbutton;
GtkWidget *testcase_name_entry;
GtkWidget *testcase_save_button;
GtkWidget *renderer_listbox; GtkWidget *renderer_listbox;
GListStore *renderers; GListStore *renderers;
GdkPaintable *paintable; GdkPaintable *paintable;
@@ -416,7 +406,7 @@ save_response_cb (GtkWidget *dialog,
{ {
GtkWidget *dialog; GtkWidget *dialog;
dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (self))), dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))),
GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO, GTK_MESSAGE_INFO,
GTK_BUTTONS_OK, GTK_BUTTONS_OK,
@@ -440,7 +430,7 @@ save_cb (GtkWidget *button,
GtkWidget *dialog; GtkWidget *dialog;
dialog = gtk_file_chooser_dialog_new ("Save node", dialog = gtk_file_chooser_dialog_new ("Save node",
GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))),
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_FILE_CHOOSER_ACTION_SAVE,
"_Cancel", GTK_RESPONSE_CANCEL, "_Cancel", GTK_RESPONSE_CANCEL,
"_Save", GTK_RESPONSE_ACCEPT, "_Save", GTK_RESPONSE_ACCEPT,
@@ -474,46 +464,14 @@ create_texture (NodeEditorWindow *self)
if (node == NULL) if (node == NULL)
return NULL; return NULL;
renderer = gtk_native_get_renderer (gtk_widget_get_native (GTK_WIDGET (self))); /* ahem */
renderer = GTK_ROOT_GET_IFACE (gtk_widget_get_root (GTK_WIDGET (self)))->get_renderer (gtk_widget_get_root (GTK_WIDGET (self)));
texture = gsk_renderer_render_texture (renderer, node, NULL); texture = gsk_renderer_render_texture (renderer, node, NULL);
gsk_render_node_unref (node); gsk_render_node_unref (node);
return texture; return texture;
} }
static GdkTexture *
create_cairo_texture (NodeEditorWindow *self)
{
GdkPaintable *paintable;
GtkSnapshot *snapshot;
GskRenderer *renderer;
GskRenderNode *node;
GdkTexture *texture;
GdkSurface *surface;
paintable = gtk_picture_get_paintable (GTK_PICTURE (self->picture));
if (paintable == NULL ||
gdk_paintable_get_intrinsic_width (paintable) <= 0 ||
gdk_paintable_get_intrinsic_height (paintable) <= 0)
return NULL;
snapshot = gtk_snapshot_new ();
gdk_paintable_snapshot (paintable, snapshot, gdk_paintable_get_intrinsic_width (paintable), gdk_paintable_get_intrinsic_height (paintable));
node = gtk_snapshot_free_to_node (snapshot);
if (node == NULL)
return NULL;
surface = gtk_native_get_surface (gtk_widget_get_native (GTK_WIDGET (self)));
renderer = gsk_cairo_renderer_new ();
gsk_renderer_realize (renderer, surface, NULL);
texture = gsk_renderer_render_texture (renderer, node, NULL);
gsk_render_node_unref (node);
gsk_renderer_unrealize (renderer);
g_object_unref (renderer);
return texture;
}
static void static void
export_image_response_cb (GtkWidget *dialog, export_image_response_cb (GtkWidget *dialog,
gint response, gint response,
@@ -557,7 +515,7 @@ export_image_cb (GtkWidget *button,
return; return;
dialog = gtk_file_chooser_dialog_new ("", dialog = gtk_file_chooser_dialog_new ("",
GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))),
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_FILE_CHOOSER_ACTION_SAVE,
"_Cancel", GTK_RESPONSE_CANCEL, "_Cancel", GTK_RESPONSE_CANCEL,
"_Save", GTK_RESPONSE_ACCEPT, "_Save", GTK_RESPONSE_ACCEPT,
@@ -570,72 +528,6 @@ export_image_cb (GtkWidget *button,
gtk_widget_show (dialog); gtk_widget_show (dialog);
} }
static void
testcase_name_entry_changed_cb (GtkWidget *button,
GParamSpec *pspec,
NodeEditorWindow *self)
{
const char *text = gtk_editable_get_text (GTK_EDITABLE (self->testcase_name_entry));
if (strlen (text) > 0)
gtk_widget_set_sensitive (self->testcase_save_button, TRUE);
else
gtk_widget_set_sensitive (self->testcase_save_button, FALSE);
}
static void
testcase_save_clicked_cb (GtkWidget *button,
NodeEditorWindow *self)
{
const char *testcase_name = gtk_editable_get_text (GTK_EDITABLE (self->testcase_name_entry));
char *source_dir = g_canonicalize_filename (NODE_EDITOR_SOURCE_DIR, NULL);
char *node_file_name;
char *node_file;
char *png_file_name;
char *png_file;
char *text = NULL;
GdkTexture *texture;
GError *error = NULL;
node_file_name = g_strconcat (testcase_name, ".node", NULL);
node_file = g_build_filename (source_dir, node_file_name, NULL);
g_free (node_file_name);
png_file_name = g_strconcat (testcase_name, ".png", NULL);
png_file = g_build_filename (source_dir, png_file_name, NULL);
g_free (png_file_name);
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->testcase_cairo_checkbutton)))
texture = create_cairo_texture (self);
else
texture = create_texture (self);
if (!gdk_texture_save_to_png (texture, png_file))
{
gtk_label_set_label (GTK_LABEL (self->testcase_error_label),
"Could not save texture file");
goto out;
}
text = get_current_text (self->text_buffer);
if (!g_file_set_contents (node_file, text, -1, &error))
{
gtk_label_set_label (GTK_LABEL (self->testcase_error_label), error->message);
/* TODO: Remove texture file again? */
goto out;
}
gtk_editable_set_text (GTK_EDITABLE (self->testcase_name_entry), "");
gtk_popover_popdown (GTK_POPOVER (self->testcase_popover));
out:
g_free (text);
g_free (png_file);
g_free (node_file);
g_free (source_dir);
}
static void static void
node_editor_window_finalize (GObject *object) node_editor_window_finalize (GObject *object)
{ {
@@ -656,7 +548,7 @@ node_editor_window_add_renderer (NodeEditorWindow *self,
GdkSurface *surface; GdkSurface *surface;
GdkPaintable *paintable; GdkPaintable *paintable;
surface = gtk_native_get_surface (GTK_NATIVE (self)); surface = gtk_widget_get_surface (GTK_WIDGET (self));
g_assert (surface != NULL); g_assert (surface != NULL);
if (renderer != NULL && !gsk_renderer_realize (renderer, surface, NULL)) if (renderer != NULL && !gsk_renderer_realize (renderer, surface, NULL))
@@ -730,18 +622,11 @@ node_editor_window_class_init (NodeEditorWindowClass *class)
gtk_widget_class_bind_template_child (widget_class, NodeEditorWindow, text_view); gtk_widget_class_bind_template_child (widget_class, NodeEditorWindow, text_view);
gtk_widget_class_bind_template_child (widget_class, NodeEditorWindow, picture); gtk_widget_class_bind_template_child (widget_class, NodeEditorWindow, picture);
gtk_widget_class_bind_template_child (widget_class, NodeEditorWindow, renderer_listbox); gtk_widget_class_bind_template_child (widget_class, NodeEditorWindow, renderer_listbox);
gtk_widget_class_bind_template_child (widget_class, NodeEditorWindow, testcase_popover);
gtk_widget_class_bind_template_child (widget_class, NodeEditorWindow, testcase_error_label);
gtk_widget_class_bind_template_child (widget_class, NodeEditorWindow, testcase_cairo_checkbutton);
gtk_widget_class_bind_template_child (widget_class, NodeEditorWindow, testcase_name_entry);
gtk_widget_class_bind_template_child (widget_class, NodeEditorWindow, testcase_save_button);
gtk_widget_class_bind_template_callback (widget_class, text_view_query_tooltip_cb); gtk_widget_class_bind_template_callback (widget_class, text_view_query_tooltip_cb);
gtk_widget_class_bind_template_callback (widget_class, open_cb); gtk_widget_class_bind_template_callback (widget_class, open_cb);
gtk_widget_class_bind_template_callback (widget_class, save_cb); gtk_widget_class_bind_template_callback (widget_class, save_cb);
gtk_widget_class_bind_template_callback (widget_class, export_image_cb); gtk_widget_class_bind_template_callback (widget_class, export_image_cb);
gtk_widget_class_bind_template_callback (widget_class, testcase_save_clicked_cb);
gtk_widget_class_bind_template_callback (widget_class, testcase_name_entry_changed_cb);
} }
static GtkWidget * static GtkWidget *

View File

@@ -1,81 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<object class="GtkPopover" id="testcase_popover">
<child>
<object class="GtkGrid">
<property name="column-spacing">12</property>
<property name="row-spacing">12</property>
<child>
<object class="GtkLabel">
<property name="label">Testcase Name:</property>
</object>
</child>
<child>
<object class="GtkEntry" id="testcase_name_entry">
<property name="hexpand">1</property>
<property name="activates-default">1</property>
<signal name="notify::text" handler="testcase_name_entry_changed_cb" />
</object>
</child>
<child>
<object class="GtkCheckButton" id="testcase_cairo_checkbutton">
<property name="label">Render using Cairo renderer</property>
<layout>
<property name="top-attach">1</property>
<property name="left-attach">0</property>
<property name="column-span">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="wrap">1</property>
<property name="label">&lt;i&gt;There will be a .node and a .png file placed in the testsuite/gsk/compare directory. &lt;b&gt;You need to add it to the meson.build yourself.&lt;/b&gt;&lt;/i&gt;</property>
<property name="use-markup">1</property>
<property name="max-width-chars">50</property>
<layout>
<property name="top-attach">2</property>
<property name="left-attach">0</property>
<property name="column-span">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="testcase_error_label">
<property name="wrap">1</property>
<property name="xalign">0</property>
<layout>
<property name="top-attach">3</property>
<property name="left-attach">0</property>
<property name="column-span">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton" id="testcase_save_button">
<property name="label">Save</property>
<property name="hexpand">1</property>
<property name="halign">end</property>
<property name="receives-default">1</property>
<property name="sensitive">0</property>
<signal name="clicked" handler="testcase_save_clicked_cb" />
<style>
<class name="suggested-action" />
</style>
<layout>
<property name="top-attach">4</property>
<property name="left-attach">0</property>
<property name="column-span">2</property>
</layout>
</object>
</child>
</object>
</child>
</object>
<template class="NodeEditorWindow" parent="GtkApplicationWindow"> <template class="NodeEditorWindow" parent="GtkApplicationWindow">
<style> <style>
<class name="devel"/> <class name="devel"/>
@@ -108,17 +32,6 @@
<signal name="clicked" handler="export_image_cb"/> <signal name="clicked" handler="export_image_cb"/>
</object> </object>
</child> </child>
<child type="start">
<object class="GtkSeparator">
<property name="orientation">vertical</property>
</object>
</child>
<child type="start">
<object class="GtkMenuButton">
<property name="label">Save Testcase</property>
<property name="popover">testcase_popover</property>
</object>
</child>
<child type="title"> <child type="title">
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label" translatable="yes">GTK Node Editor</property> <property name="label" translatable="yes">GTK Node Editor</property>

View File

@@ -64,7 +64,7 @@ get_idle (gpointer data)
GtkApplication *app = gtk_window_get_application (GTK_WINDOW (window)); GtkApplication *app = gtk_window_get_application (GTK_WINDOW (window));
gtk_widget_set_sensitive (window, TRUE); gtk_widget_set_sensitive (window, TRUE);
gdk_surface_set_cursor (gtk_native_get_surface (GTK_NATIVE (window)), NULL); gdk_surface_set_cursor (gtk_widget_get_surface (window), NULL);
g_application_unmark_busy (G_APPLICATION (app)); g_application_unmark_busy (G_APPLICATION (app));
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
@@ -81,7 +81,7 @@ get_busy (GSimpleAction *action,
g_application_mark_busy (G_APPLICATION (app)); g_application_mark_busy (G_APPLICATION (app));
cursor = gdk_cursor_new_from_name ("wait", NULL); cursor = gdk_cursor_new_from_name ("wait", NULL);
gdk_surface_set_cursor (gtk_native_get_surface (GTK_NATIVE (window)), cursor); gdk_surface_set_cursor (gtk_widget_get_surface (window), cursor);
g_object_unref (cursor); g_object_unref (cursor);
g_timeout_add (5000, get_idle, window); g_timeout_add (5000, get_idle, window);
@@ -118,8 +118,6 @@ activate_delete (GSimpleAction *action,
GtkWidget *window = user_data; GtkWidget *window = user_data;
GtkWidget *infobar; GtkWidget *infobar;
g_print ("Activate action delete\n");
if (!on_page (2)) if (!on_page (2))
return; return;
@@ -160,7 +158,7 @@ activate_open (GSimpleAction *action,
return; return;
button = GTK_WIDGET (g_object_get_data (G_OBJECT (window), "open_menubutton")); button = GTK_WIDGET (g_object_get_data (G_OBJECT (window), "open_menubutton"));
g_signal_emit_by_name (button, "clicked"); gtk_button_clicked (GTK_BUTTON (button));
} }
static void static void
@@ -175,7 +173,7 @@ activate_record (GSimpleAction *action,
return; return;
button = GTK_WIDGET (g_object_get_data (G_OBJECT (window), "record_button")); button = GTK_WIDGET (g_object_get_data (G_OBJECT (window), "record_button"));
g_signal_emit_by_name (button, "clicked"); gtk_button_clicked (GTK_BUTTON (button));
} }
static void static void
@@ -190,7 +188,7 @@ activate_lock (GSimpleAction *action,
return; return;
button = GTK_WIDGET (g_object_get_data (G_OBJECT (window), "lockbutton")); button = GTK_WIDGET (g_object_get_data (G_OBJECT (window), "lockbutton"));
g_signal_emit_by_name (button, "clicked"); gtk_button_clicked (GTK_BUTTON (button));
} }
static void static void
@@ -525,6 +523,22 @@ on_range_to_changed (GtkSpinButton *to)
gtk_spin_button_set_value (from, v2); gtk_spin_button_set_value (from, v2);
} }
static void
update_header (GtkListBoxRow *row,
GtkListBoxRow *before,
gpointer data)
{
if (before != NULL &&
gtk_list_box_row_get_header (row) == NULL)
{
GtkWidget *separator;
separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
gtk_widget_show (separator);
gtk_list_box_row_set_header (row, separator);
}
}
static void static void
info_bar_response (GtkWidget *infobar, gint response_id) info_bar_response (GtkWidget *infobar, gint response_id)
{ {
@@ -1270,11 +1284,11 @@ textbuffer_notify_selection (GObject *object, GParamSpec *pspec, GtkWidget *butt
} }
static gboolean static gboolean
osd_frame_pressed (GtkGestureClick *gesture, osd_frame_pressed (GtkGestureMultiPress *gesture,
int press, int press,
double x, double x,
double y, double y,
gpointer data) gpointer data)
{ {
GtkWidget *frame = data; GtkWidget *frame = data;
GtkWidget *osd; GtkWidget *osd;
@@ -1303,113 +1317,96 @@ page_combo_separator_func (GtkTreeModel *model,
} }
static void static void
toggle_format (GSimpleAction *action, activate_item (GtkWidget *item, GtkTextView *tv)
GVariant *value,
gpointer user_data)
{ {
GtkTextView *text_view = user_data; const gchar *tag;
GtkTextIter start, end; GtkTextIter start, end;
const char *name; gboolean active;
name = g_action_get_name (G_ACTION (action)); g_object_get (item, "active", &active, NULL);
tag = (const gchar *)g_object_get_data (G_OBJECT (item), "tag");
g_simple_action_set_state (action, value); gtk_text_buffer_get_selection_bounds (gtk_text_view_get_buffer (tv), &start, &end);
if (active)
gtk_text_buffer_get_selection_bounds (gtk_text_view_get_buffer (text_view), &start, &end); gtk_text_buffer_apply_tag_by_name (gtk_text_view_get_buffer (tv), tag, &start, &end);
if (g_variant_get_boolean (value))
gtk_text_buffer_apply_tag_by_name (gtk_text_view_get_buffer (text_view), name, &start, &end);
else else
gtk_text_buffer_remove_tag_by_name (gtk_text_view_get_buffer (text_view), name, &start, &end); gtk_text_buffer_remove_tag_by_name (gtk_text_view_get_buffer (tv), tag, &start, &end);
} }
static GActionGroup *actions; static void
add_item (GtkTextView *tv,
GtkWidget *popup,
const gchar *text,
const gchar *tag,
gboolean set)
{
GtkWidget *item, *label;
if (GTK_IS_MENU (popup))
{
item = gtk_check_menu_item_new ();
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), set);
g_signal_connect (item, "toggled", G_CALLBACK (activate_item), tv);
}
else
{
item = gtk_check_button_new ();
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), set);
gtk_widget_set_focus_on_click (item, FALSE);
g_signal_connect (item, "clicked", G_CALLBACK (activate_item), tv);
}
label = gtk_label_new ("");
gtk_label_set_xalign (GTK_LABEL (label), 0);
gtk_label_set_markup (GTK_LABEL (label), text);
gtk_widget_show (label);
gtk_container_add (GTK_CONTAINER (item), label);
g_object_set_data (G_OBJECT (item), "tag", (gpointer)tag);
gtk_widget_show (item);
gtk_container_add (GTK_CONTAINER (popup), item);
}
static void static void
text_changed (GtkTextBuffer *buffer) populate_popup (GtkTextView *tv,
GtkWidget *popup)
{ {
GAction *bold;
GAction *italic;
GAction *underline;
GtkTextIter iter;
GtkTextTagTable *tags;
GtkTextTag *bold_tag, *italic_tag, *underline_tag;
gboolean all_bold, all_italic, all_underline;
GtkTextIter start, end;
gboolean has_selection; gboolean has_selection;
GtkWidget *item;
GtkTextIter start, end, iter;
GtkTextTagTable *tags;
GtkTextTag *bold, *italic, *underline;
gboolean all_bold, all_italic, all_underline;
bold = g_action_map_lookup_action (G_ACTION_MAP (actions), "bold"); has_selection = gtk_text_buffer_get_selection_bounds (gtk_text_view_get_buffer (tv), &start, &end);
italic = g_action_map_lookup_action (G_ACTION_MAP (actions), "italic");
underline = g_action_map_lookup_action (G_ACTION_MAP (actions), "underline");
has_selection = gtk_text_buffer_get_selection_bounds (buffer, &start, &end);
g_simple_action_set_enabled (G_SIMPLE_ACTION (bold), has_selection);
g_simple_action_set_enabled (G_SIMPLE_ACTION (italic), has_selection);
g_simple_action_set_enabled (G_SIMPLE_ACTION (underline), has_selection);
if (!has_selection) if (!has_selection)
return; return;
tags = gtk_text_buffer_get_tag_table (buffer); tags = gtk_text_buffer_get_tag_table (gtk_text_view_get_buffer (tv));
bold_tag = gtk_text_tag_table_lookup (tags, "bold"); bold = gtk_text_tag_table_lookup (tags, "bold");
italic_tag = gtk_text_tag_table_lookup (tags, "italic"); italic = gtk_text_tag_table_lookup (tags, "italic");
underline_tag = gtk_text_tag_table_lookup (tags, "underline"); underline = gtk_text_tag_table_lookup (tags, "underline");
all_bold = TRUE; all_bold = TRUE;
all_italic = TRUE; all_italic = TRUE;
all_underline = TRUE; all_underline = TRUE;
gtk_text_iter_assign (&iter, &start); gtk_text_iter_assign (&iter, &start);
while (!gtk_text_iter_equal (&iter, &end)) while (!gtk_text_iter_equal (&iter, &end))
{ {
all_bold &= gtk_text_iter_has_tag (&iter, bold_tag); all_bold &= gtk_text_iter_has_tag (&iter, bold);
all_italic &= gtk_text_iter_has_tag (&iter, italic_tag); all_italic &= gtk_text_iter_has_tag (&iter, italic);
all_underline &= gtk_text_iter_has_tag (&iter, underline_tag); all_underline &= gtk_text_iter_has_tag (&iter, underline);
gtk_text_iter_forward_char (&iter); gtk_text_iter_forward_char (&iter);
} }
g_simple_action_set_state (G_SIMPLE_ACTION (bold), g_variant_new_boolean (all_bold)); if (GTK_IS_MENU (popup))
g_simple_action_set_state (G_SIMPLE_ACTION (italic), g_variant_new_boolean (all_italic)); {
g_simple_action_set_state (G_SIMPLE_ACTION (underline), g_variant_new_boolean (all_underline)); item = gtk_separator_menu_item_new ();
} gtk_widget_show (item);
gtk_container_add (GTK_CONTAINER (popup), item);
}
static void add_item (tv, popup, "<b>Bold</b>", "bold", all_bold);
text_view_add_to_context_menu (GtkTextView *text_view) add_item (tv, popup, "<i>Italics</i>", "italic", all_italic);
{ add_item (tv, popup, "<u>Underline</u>", "underline", all_underline);
GMenu *menu;
GActionEntry entries[] = {
{ "bold", NULL, NULL, "false", toggle_format },
{ "italic", NULL, NULL, "false", toggle_format },
{ "underline", NULL, NULL, "false", toggle_format },
};
GMenuItem *item;
GAction *action;
actions = G_ACTION_GROUP (g_simple_action_group_new ());
g_action_map_add_action_entries (G_ACTION_MAP (actions), entries, G_N_ELEMENTS (entries), text_view);
action = g_action_map_lookup_action (G_ACTION_MAP (actions), "bold");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
action = g_action_map_lookup_action (G_ACTION_MAP (actions), "italic");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
action = g_action_map_lookup_action (G_ACTION_MAP (actions), "underline");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
gtk_widget_insert_action_group (GTK_WIDGET (text_view), "format", G_ACTION_GROUP (actions));
menu = g_menu_new ();
item = g_menu_item_new (_("Bold"), "format.bold");
g_menu_item_set_attribute (item, "touch-icon", "s", "format-text-bold-symbolic");
g_menu_append_item (G_MENU (menu), item);
g_object_unref (item);
item = g_menu_item_new (_("Italics"), "format.italic");
g_menu_item_set_attribute (item, "touch-icon", "s", "format-text-italic-symbolic");
g_menu_append_item (G_MENU (menu), item);
g_object_unref (item);
item = g_menu_item_new (_("Underline"), "format.underline");
g_menu_item_set_attribute (item, "touch-icon", "s", "format-text-underline-symbolic");
g_menu_append_item (G_MENU (menu), item);
gtk_text_view_set_extra_menu (text_view, G_MENU_MODEL (menu));
g_signal_connect (gtk_text_view_get_buffer (text_view), "changed", G_CALLBACK (text_changed), NULL);
g_signal_connect (gtk_text_view_get_buffer (text_view), "mark-set", G_CALLBACK (text_changed), NULL);
} }
static void static void
@@ -1623,37 +1620,6 @@ adjustment3_value_changed (GtkAdjustment *adj, GtkProgressBar *pbar)
gtk_progress_bar_set_fraction (pbar, fraction); gtk_progress_bar_set_fraction (pbar, fraction);
} }
static void
clicked_cb (GtkGesture *gesture,
int n_press,
double x,
double y,
GtkPopover *popover)
{
GdkRectangle rect;
rect.x = x;
rect.y = y;
rect.width = 1;
rect.height = 1;
gtk_popover_set_pointing_to (popover, &rect);
gtk_popover_popup (popover);
}
static void
set_up_context_popover (GtkWidget *widget,
GMenuModel *model)
{
GtkWidget *popover = gtk_popover_menu_new_from_model (widget, model);
GtkGesture *gesture;
g_object_set (popover, "has-arrow", FALSE, NULL);
gesture = gtk_gesture_click_new ();
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY);
g_signal_connect (gesture, "pressed", G_CALLBACK (clicked_cb), popover);
gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
}
static void static void
activate (GApplication *app) activate (GApplication *app)
{ {
@@ -1667,7 +1633,6 @@ activate (GApplication *app)
GtkWidget *dialog; GtkWidget *dialog;
GtkAdjustment *adj; GtkAdjustment *adj;
GtkCssProvider *provider; GtkCssProvider *provider;
GMenuModel *model;
static GActionEntry win_entries[] = { static GActionEntry win_entries[] = {
{ "dark", NULL, NULL, "false", change_theme_state }, { "dark", NULL, NULL, "false", change_theme_state },
{ "transition", NULL, NULL, "false", change_transition_state }, { "transition", NULL, NULL, "false", change_transition_state },
@@ -1685,10 +1650,6 @@ activate (GApplication *app)
} accels[] = { } accels[] = {
{ "app.about", { "F1", NULL } }, { "app.about", { "F1", NULL } },
{ "app.quit", { "<Primary>q", NULL } }, { "app.quit", { "<Primary>q", NULL } },
{ "app.open-in", { "<Primary>n", NULL } },
{ "app.cut", { "<Primary>x", NULL } },
{ "app.copy", { "<Primary>c", NULL } },
{ "app.paste", { "<Primary>v", NULL } },
{ "win.dark", { "<Primary>d", NULL } }, { "win.dark", { "<Primary>d", NULL } },
{ "win.search", { "<Primary>s", NULL } }, { "win.search", { "<Primary>s", NULL } },
{ "win.delete", { "Delete", NULL } }, { "win.delete", { "Delete", NULL } },
@@ -1707,7 +1668,7 @@ activate (GApplication *app)
gtk_css_provider_load_from_resource (provider, "/org/gtk/WidgetFactory4/widget-factory.css"); gtk_css_provider_load_from_resource (provider, "/org/gtk/WidgetFactory4/widget-factory.css");
gtk_style_context_add_provider_for_display (gdk_display_get_default (), gtk_style_context_add_provider_for_display (gdk_display_get_default (),
GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER (provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); GTK_STYLE_PROVIDER_PRIORITY_USER);
g_object_unref (provider); g_object_unref (provider);
builder = gtk_builder_new_from_resource ("/org/gtk/WidgetFactory4/widget-factory.ui"); builder = gtk_builder_new_from_resource ("/org/gtk/WidgetFactory4/widget-factory.ui");
@@ -1770,6 +1731,7 @@ activate (GApplication *app)
g_signal_connect (adj, "value-changed", G_CALLBACK (spin_value_changed), widget); g_signal_connect (adj, "value-changed", G_CALLBACK (spin_value_changed), widget);
widget = (GtkWidget *)gtk_builder_get_object (builder, "listbox"); widget = (GtkWidget *)gtk_builder_get_object (builder, "listbox");
gtk_list_box_set_header_func (GTK_LIST_BOX (widget), update_header, NULL, NULL);
g_signal_connect (widget, "row-activated", G_CALLBACK (row_activated), NULL); g_signal_connect (widget, "row-activated", G_CALLBACK (row_activated), NULL);
widget2 = (GtkWidget *)gtk_builder_get_object (builder, "listboxrow1switch"); widget2 = (GtkWidget *)gtk_builder_get_object (builder, "listboxrow1switch");
@@ -1894,7 +1856,8 @@ activate (GApplication *app)
g_object_set_data (G_OBJECT (widget), "osd", widget2); g_object_set_data (G_OBJECT (widget), "osd", widget2);
widget = (GtkWidget *)gtk_builder_get_object (builder, "textview1"); widget = (GtkWidget *)gtk_builder_get_object (builder, "textview1");
text_view_add_to_context_menu (GTK_TEXT_VIEW (widget)); g_signal_connect (widget, "populate-popup",
G_CALLBACK (populate_popup), NULL);
widget = (GtkWidget *)gtk_builder_get_object (builder, "open_popover"); widget = (GtkWidget *)gtk_builder_get_object (builder, "open_popover");
widget2 = (GtkWidget *)gtk_builder_get_object (builder, "open_popover_entry"); widget2 = (GtkWidget *)gtk_builder_get_object (builder, "open_popover_entry");
@@ -1940,13 +1903,6 @@ activate (GApplication *app)
g_signal_connect (adj, "value-changed", G_CALLBACK (adjustment3_value_changed), widget); g_signal_connect (adj, "value-changed", G_CALLBACK (adjustment3_value_changed), widget);
g_signal_connect (adj, "value-changed", G_CALLBACK (adjustment3_value_changed), widget2); g_signal_connect (adj, "value-changed", G_CALLBACK (adjustment3_value_changed), widget2);
widget = (GtkWidget *)gtk_builder_get_object (builder, "extra_info_entry");
g_timeout_add (100, (GSourceFunc)pulse_it, widget);
widget = (GtkWidget *)gtk_builder_get_object (builder, "box_for_context");
model = (GMenuModel *)gtk_builder_get_object (builder, "new_style_context_menu_model");
set_up_context_popover (widget, model);
gtk_widget_show (GTK_WIDGET (window)); gtk_widget_show (GTK_WIDGET (window));
g_object_unref (builder); g_object_unref (builder);
@@ -1979,41 +1935,6 @@ local_options (GApplication *app,
return -1; return -1;
} }
static void
activate_action (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
g_print ("Activate action %s\n", g_action_get_name (G_ACTION (action)));
}
static void
select_action (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
g_print ("Select action %s value %s\n",
g_action_get_name (G_ACTION (action)),
g_variant_get_string (parameter, NULL));
g_simple_action_set_state (action, parameter);
}
static void
toggle_action (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GVariant *state = g_action_get_state (G_ACTION (action));
g_print ("Toggle action %s to %s\n",
g_action_get_name (G_ACTION (action)),
g_variant_get_boolean (state) ? "false" : "true");
g_simple_action_set_state (action,
g_variant_new_boolean (!g_variant_get_boolean (state)));
}
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@@ -2028,36 +1949,7 @@ main (int argc, char *argv[])
{ "beer", NULL, NULL, "false", NULL }, { "beer", NULL, NULL, "false", NULL },
{ "water", NULL, NULL, "true", NULL }, { "water", NULL, NULL, "true", NULL },
{ "dessert", NULL, "s", "'bars'", NULL }, { "dessert", NULL, "s", "'bars'", NULL },
{ "pay", NULL, "s", NULL, NULL }, { "pay", NULL, "s", NULL, NULL }
{ "print", activate_action, NULL, NULL, NULL },
{ "share", activate_action, NULL, NULL, NULL },
{ "labels", activate_action, NULL, NULL, NULL },
{ "new", activate_action, NULL, NULL, NULL },
{ "open", activate_action, NULL, NULL, NULL },
{ "open-in", activate_action, NULL, NULL, NULL },
{ "open-tab", activate_action, NULL, NULL, NULL },
{ "open-window", activate_action, NULL, NULL, NULL },
{ "save", activate_action, NULL, NULL, NULL },
{ "save-as", activate_action, NULL, NULL, NULL },
{ "cut", activate_action, NULL, NULL, NULL },
{ "copy", activate_action, NULL, NULL, NULL },
{ "paste", activate_action, NULL, NULL, NULL },
{ "pin", toggle_action, NULL, "true", NULL },
{ "size", select_action, "s", "'medium'", NULL },
{ "berk", toggle_action, NULL, "true", NULL },
{ "broni", toggle_action, NULL, "true", NULL },
{ "drutt", toggle_action, NULL, "true", NULL },
{ "upstairs", toggle_action, NULL, "true", NULL },
{ "option-a", activate_action, NULL, NULL, NULL },
{ "option-b", activate_action, NULL, NULL, NULL },
{ "option-c", activate_action, NULL, NULL, NULL },
{ "option-d", activate_action, NULL, NULL, NULL },
{ "check-on", NULL, NULL, "true", NULL },
{ "check-off", NULL, NULL, "false", NULL },
{ "radio-x", NULL, "s", "'x'", NULL },
{ "check-on-disabled", NULL, NULL, "true", NULL },
{ "check-off-disabled", NULL, NULL, "false", NULL },
{ "radio-x-disabled", NULL, "s", "'x'", NULL },
}; };
gint status; gint status;
@@ -2068,12 +1960,6 @@ main (int argc, char *argv[])
app); app);
action = g_action_map_lookup_action (G_ACTION_MAP (app), "wine"); action = g_action_map_lookup_action (G_ACTION_MAP (app), "wine");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
action = g_action_map_lookup_action (G_ACTION_MAP (app), "check-on-disabled");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
action = g_action_map_lookup_action (G_ACTION_MAP (app), "check-off-disabled");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
action = g_action_map_lookup_action (G_ACTION_MAP (app), "radio-x-disabled");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);

View File

@@ -33,12 +33,12 @@
<menu id="dinner_menu"> <menu id="dinner_menu">
<section> <section>
<item> <item>
<attribute name="label" translatable="yes">_Steak</attribute> <attribute name="label" translatable="yes">Steak</attribute>
<attribute name="action">app.main</attribute> <attribute name="action">app.main</attribute>
<attribute name="target">steak</attribute> <attribute name="target">steak</attribute>
</item> </item>
<item> <item>
<attribute name="label" translatable="yes">_Pizza</attribute> <attribute name="label" translatable="yes">Pizza</attribute>
<attribute name="action">app.main</attribute> <attribute name="action">app.main</attribute>
<attribute name="target">pizza</attribute> <attribute name="target">pizza</attribute>
</item> </item>
@@ -1207,6 +1207,7 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
<property name="wrap-mode">2</property> <property name="wrap-mode">2</property>
<property name="left-margin">10</property> <property name="left-margin">10</property>
<property name="right-margin">10</property> <property name="right-margin">10</property>
<property name="populate-all">1</property>
</object> </object>
</child> </child>
</object> </object>
@@ -1576,9 +1577,6 @@ microphone-sensitivity-medium-symbolic</property>
<object class="GtkImage" id="imageo"> <object class="GtkImage" id="imageo">
<property name="icon-name">org.gtk.WidgetFactory4</property> <property name="icon-name">org.gtk.WidgetFactory4</property>
<property name="pixel-size">256</property> <property name="pixel-size">256</property>
<style>
<class name="icon-dropshadow" />
</style>
</object> </object>
</property> </property>
</object> </object>
@@ -1619,7 +1617,6 @@ microphone-sensitivity-medium-symbolic</property>
<child> <child>
<object class="GtkListBox" id="listbox"> <object class="GtkListBox" id="listbox">
<property name="selection-mode">none</property> <property name="selection-mode">none</property>
<property name="show-separators">1</property>
<child type="placeholder"> <child type="placeholder">
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">No rows found</property> <property name="label">No rows found</property>
@@ -1820,16 +1817,11 @@ microphone-sensitivity-medium-symbolic</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child>
<object class="GtkPopoverMenuBar">
<property name="menu-model">menu_bar_model</property>
</object>
</child>
<child> <child>
<object class="GtkMenuBar"> <object class="GtkMenuBar">
<child> <child>
<object class="GtkMenuItem" id="menuitem1"> <object class="GtkMenuItem" id="menuitem1">
<property name="label" translatable="yes">File</property> <property name="label" translatable="yes">_File</property>
<property name="use-underline">1</property> <property name="use-underline">1</property>
<child type="submenu"> <child type="submenu">
<object class="GtkMenu" id="menu1"> <object class="GtkMenu" id="menu1">
@@ -1873,7 +1865,7 @@ microphone-sensitivity-medium-symbolic</property>
</child> </child>
<child> <child>
<object class="GtkMenuItem" id="menuitem2"> <object class="GtkMenuItem" id="menuitem2">
<property name="label" translatable="yes">Edit</property> <property name="label" translatable="yes">_Edit</property>
<property name="use-underline">1</property> <property name="use-underline">1</property>
<child type="submenu"> <child type="submenu">
<object class="GtkMenu" id="menu2"> <object class="GtkMenu" id="menu2">
@@ -2015,7 +2007,7 @@ microphone-sensitivity-medium-symbolic</property>
</child> </child>
<child> <child>
<object class="GtkMenuItem" id="menuitem3"> <object class="GtkMenuItem" id="menuitem3">
<property name="label" translatable="yes">View</property> <property name="label" translatable="yes">_View</property>
<property name="use-underline">1</property> <property name="use-underline">1</property>
<child type="submenu"> <child type="submenu">
<object class="GtkMenu" id="view-menu"> <object class="GtkMenu" id="view-menu">
@@ -2055,7 +2047,7 @@ microphone-sensitivity-medium-symbolic</property>
</child> </child>
<child> <child>
<object class="GtkMenuItem" id="menuitem4"> <object class="GtkMenuItem" id="menuitem4">
<property name="label" translatable="yes">Help</property> <property name="label" translatable="yes">_Help</property>
<property name="use-underline">1</property> <property name="use-underline">1</property>
<child type="submenu"> <child type="submenu">
<object class="GtkMenu" id="menu3"> <object class="GtkMenu" id="menu3">
@@ -2437,18 +2429,37 @@ microphone-sensitivity-medium-symbolic</property>
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="halign">fill</property> <property name="halign">start</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkBox" id="lockbox"> <object class="GtkBox" id="lockbox">
<property name="halign">fill</property> <property name="halign">start</property>
<property name="hexpand">1</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkMenuButton" id="open_menubutton"> <object class="GtkMenuButton" id="open_menubutton">
<property name="halign">center</property> <property name="halign">center</property>
<property name="popover">open_popover</property> <property name="popover">open_popover</property>
<property name="label">Open</property> <style>
<class name="text-button"/>
<class name="image-button"/>
</style>
<child>
<object class="GtkBox">
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="valign">baseline</property>
<property name="label">Open</property>
</object>
</child>
<child>
<object class="GtkImage">
<property name="valign">baseline</property>
<property name="icon-name">pan-down-symbolic</property>
</object>
</child>
</object>
</child>
</object> </object>
</child> </child>
<child> <child>
@@ -2514,15 +2525,6 @@ microphone-sensitivity-medium-symbolic</property>
<child> <child>
<object class="GtkLockButton" id="lockbutton"/> <object class="GtkLockButton" id="lockbutton"/>
</child> </child>
<child>
<object class="GtkMenuButton">
<property name="icon-name">view-more-symbolic</property>
<property name="popover">new_style_menu</property>
<!--
<property name="menu-model">new_style_menu_model</property>
-->
</object>
</child>
</object> </object>
</child> </child>
<child> <child>
@@ -2977,7 +2979,7 @@ microphone-sensitivity-medium-symbolic</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkGestureClick"> <object class="GtkGestureMultiPress">
<signal name="pressed" handler="osd_frame_pressed" object="osd_frame" swapped="no"/> <signal name="pressed" handler="osd_frame_pressed" object="osd_frame" swapped="no"/>
</object> </object>
</child> </child>
@@ -3037,7 +3039,7 @@ microphone-sensitivity-medium-symbolic</property>
<object class="GtkNotebookPage"> <object class="GtkNotebookPage">
<property name="tab-expand">1</property> <property name="tab-expand">1</property>
<property name="child"> <property name="child">
<object class="GtkBox" id="box_for_context"> <object class="GtkBox">
<property name="height-request">120</property> <property name="height-request">120</property>
</object> </object>
</property> </property>
@@ -3418,9 +3420,8 @@ bad things might happen.</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkEntry" id="extra_info_entry"> <object class="GtkEntry">
<property name="placeholder-text">Tell me anything…</property> <property name="placeholder-text">Tell me anything…</property>
<property name="progress-fraction">0.2</property>
</object> </object>
</child> </child>
<layout> <layout>
@@ -3478,7 +3479,7 @@ bad things might happen.</property>
</widgets> </widgets>
</object> </object>
<object class="GtkPopover" id="notebook_info_popover"> <object class="GtkPopover" id="notebook_info_popover">
<property name="autohide">0</property> <property name="modal">0</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">No updates at this time</property> <property name="label">No updates at this time</property>
@@ -3489,7 +3490,7 @@ bad things might happen.</property>
</child> </child>
</object> </object>
<object class="GtkPopover" id="notebook_info_popover3"> <object class="GtkPopover" id="notebook_info_popover3">
<property name="autohide">0</property> <property name="modal">0</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">You're in too deep!</property> <property name="label">You're in too deep!</property>
@@ -3500,7 +3501,7 @@ bad things might happen.</property>
</child> </child>
</object> </object>
<object class="GtkPopover" id="notebook_info_popover2"> <object class="GtkPopover" id="notebook_info_popover2">
<property name="autohide">0</property> <property name="modal">0</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="orientation">horizontal</property> <property name="orientation">horizontal</property>
@@ -3523,510 +3524,4 @@ bad things might happen.</property>
</object> </object>
</child> </child>
</object> </object>
<object class="GtkPopoverMenu" id="new_style_menu">
<child>
<object class="GtkBox">
<property name="name">main</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="halign">fill</property>
<style>
<class name="circular-buttons"/>
</style>
<child>
<object class="GtkModelButton">
<property name="icon"><object class="GThemedIcon"><property name="name">printer-symbolic</property></object></property>
<property name="iconic">1</property>
<property name="action-name">app.print</property>
<property name="hexpand">1</property>
<property name="halign">center</property>
<style>
<class name="circular"/>
</style>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="icon"><object class="GThemedIcon"><property name="name">emblem-shared-symbolic</property></object></property>
<property name="iconic">1</property>
<property name="action-name">app.share</property>
<property name="hexpand">1</property>
<property name="halign">center</property>
<style>
<class name="circular"/>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSeparator"/>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Open in New Window</property>
<property name="action-name">app.open-in</property>
<property name="indicator-size-group">main-indicators</property>
</object>
</child>
<child>
<object class="GtkSeparator"/>
</child>
<child>
<object class="GtkBox">
<style>
<class name="inline-buttons"/>
</style>
<child>
<object class="GtkLabel" id="cut_copy_paste_filler">
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Edit</property>
<property name="xalign">0</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="icon"><object class="GThemedIcon"><property name="name">edit-cut-symbolic</property></object></property>
<property name="iconic">1</property>
<property name="relief">none</property>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="icon"><object class="GThemedIcon"><property name="name">edit-copy-symbolic</property></object></property>
<property name="iconic">1</property>
<property name="relief">none</property>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="icon"><object class="GThemedIcon"><property name="name">edit-paste-symbolic</property></object></property>
<property name="iconic">1</property>
<property name="relief">none</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSeparator"/>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Pin</property>
<property name="action-name">app.pin</property>
<property name="indicator-size-group">main-indicators</property>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Select Labels…</property>
<property name="action-name">app.labels</property>
<property name="indicator-size-group">main-indicators</property>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Share…</property>
<property name="action-name">app.share</property>
<property name="indicator-size-group">main-indicators</property>
</object>
</child>
<child>
<object class="GtkSeparator"/>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Basement</property>
<property name="menu-name">basement</property>
<property name="indicator-size-group">main-indicators</property>
</object>
</child>
<child>
<object class="GtkSeparator"/>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Large</property>
<property name="action-name">app.size</property>
<property name="action-target">'large'</property>
<property name="indicator-size-group">main-indicators</property>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Medium</property>
<property name="action-name">app.size</property>
<property name="action-target">'medium'</property>
<property name="indicator-size-group">main-indicators</property>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Small</property>
<property name="action-name">app.size</property>
<property name="action-target">'small'</property>
<property name="indicator-size-group">main-indicators</property>
</object>
</child>
<child>
<object class="GtkSeparator"/>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Move to Trash</property>
<property name="action-name">win.delete</property>
<property name="indicator-size-group">main-indicators</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="name">basement</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkModelButton">
<property name="text">Basement</property>
<property name="role">title</property>
<property name="menu-name">main</property>
</object>
</child>
<child>
<object class="GtkSeparator"/>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Berk</property>
<property name="action-name">app.berk</property>
<property name="indicator-size-group">basement-indicators</property>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Broni</property>
<property name="action-name">app.broni</property>
<property name="indicator-size-group">basement-indicators</property>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="text">Drutt</property>
<property name="action-name">app.drutt</property>
<property name="indicator-size-group">basement-indicators</property>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="text">The Thing Upstairs</property>
<property name="action-name">app.upstairs</property>
<property name="indicator-size-group">basement-indicators</property>
</object>
</child>
</object>
</child>
</object>
<object class="GtkSizeGroup" id="main-indicators">
<property name="mode">horizontal</property>
<widgets>
<widget name="cut_copy_paste_filler"/>
</widgets>
</object>
<object class="GtkSizeGroup" id="basement-indicators">
<property name="mode">horizontal</property>
</object>
<menu id="new_style_menu_model">
<section>
<attribute name="display-hint">circular-buttons</attribute>
<item>
<attribute name="verb-icon">printer-symbolic</attribute>
<attribute name="action">app.print</attribute>
</item>
<item>
<attribute name="verb-icon">emblem-shared-symbolic</attribute>
<attribute name="action">app.share</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">Open in New Window</attribute>
<attribute name="action">app.open-in</attribute>
</item>
</section>
<section>
<attribute name="display-hint">inline-buttons</attribute>
<attribute name="label" translatable="yes">Edit</attribute>
<item>
<attribute name="verb-icon">edit-cut-symbolic</attribute>
<attribute name="action">app.cut</attribute>
</item>
<item>
<attribute name="verb-icon">edit-copy-symbolic</attribute>
<attribute name="action">app.copy</attribute>
</item>
<item>
<attribute name="verb-icon">edit-paste-symbolic</attribute>
<attribute name="action">app.paste</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">Pin</attribute>
<attribute name="action">app.pin</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Select Labels…</attribute>
<attribute name="action">app.labels</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Share…</attribute>
<attribute name="action">app.share</attribute>
</item>
</section>
<section>
<submenu>
<attribute name="label" translatable="yes">Basement</attribute>
<section>
<item>
<attribute name="label" translatable="yes">Berk</attribute>
<attribute name="action">app.berk</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Broni</attribute>
<attribute name="action">app.broni</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Drutt</attribute>
<attribute name="action">app.drutt</attribute>
</item>
<item>
<attribute name="label" translatable="yes">The Thing Upstairs</attribute>
<attribute name="action">app.upstairs</attribute>
</item>
</section>
</submenu>
</section>
<section>
<item>
<attribute name="label" translatable="yes">Large</attribute>
<attribute name="action">app.size</attribute>
<attribute name="target">large</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Medium</attribute>
<attribute name="action">app.size</attribute>
<attribute name="target">medium</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Small</attribute>
<attribute name="action">app.size</attribute>
<attribute name="target">small</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">Move to Trash</attribute>
<attribute name="action">win.delete</attribute>
</item>
</section>
</menu>
<menu id="new_style_context_menu_model">
<section>
<item>
<attribute name="label" translatable="yes">Open</attribute>
<attribute name="action">win.open</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">Open in New Tab</attribute>
<attribute name="action">app.open-tab</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Open in New Window</attribute>
<attribute name="action">app.open-window</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">Cut</attribute>
<attribute name="action">app.cut</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Copy</attribute>
<attribute name="action">app.copy</attribute>
</item>
</section>
<section>
<submenu>
<attribute name="label" translatable="yes">Options</attribute>
<section>
<item>
<attribute name="label" translatable="yes">Option A</attribute>
<attribute name="action">app.option-a</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Option B</attribute>
<attribute name="action">app.option-b</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Option C</attribute>
<attribute name="action">app.option-c</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Option D</attribute>
<attribute name="action">app.option-d</attribute>
</item>
</section>
</submenu>
</section>
<section>
<item>
<attribute name="label" translatable="yes">Move to Trash</attribute>
<attribute name="action">win.delete</attribute>
</item>
</section>
</menu>
<menu id="menu_bar_model">
<submenu>
<attribute name="label" translatable="yes">_File</attribute>
<section>
<item>
<attribute name="label" translatable="yes">_New</attribute>
<attribute name="action">app.new</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Open</attribute>
<attribute name="action">app.open</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Save</attribute>
<attribute name="action">app.save</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Save _As</attribute>
<attribute name="action">app.save-as</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Quit</attribute>
<attribute name="action">app.quit</attribute>
</item>
</section>
</submenu>
<submenu>
<attribute name="label" translatable="yes">_Edit</attribute>
<section>
<item>
<attribute name="label" translatable="yes">Cu_t</attribute>
<attribute name="action">app.cut</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Copy</attribute>
<attribute name="action">app.copy</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Paste</attribute>
<attribute name="action">app.paste</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Delete</attribute>
<attribute name="action">win.delete</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Search</attribute>
<attribute name="action">win.search</attribute>
</item>
</section>
<section>
<submenu>
<attribute name="label" translatable="yes">Checks &amp; Radios</attribute>
<section>
<item>
<attribute name="label" translatable="yes">Check</attribute>
<attribute name="action">app.check-on</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Check</attribute>
<attribute name="action">app.check-off</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Check</attribute>
<attribute name="action">app.check-on-disabled</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Check</attribute>
<attribute name="action">app.check-off-disabled</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Check</attribute>
<attribute name="action">app.check-no-action</attribute>
<attribute name="hidden-when">action-missing</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">Radio</attribute>
<attribute name="action">app.radio-x</attribute>
<attribute name="target">x</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Radio</attribute>
<attribute name="action">app.radio-x</attribute>
<attribute name="target">y</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Radio</attribute>
<attribute name="action">app.radio-x-disabled</attribute>
<attribute name="target">x</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Radio</attribute>
<attribute name="action">app.radio-x-disabled</attribute>
<attribute name="target">y</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Radio</attribute>
<attribute name="action">app.radio-no-action</attribute>
<attribute name="hidden-when">action-missing</attribute>
</item>
</section>
</submenu>
</section>
</submenu>
<submenu>
<attribute name="label" translatable="yes">_View</attribute>
<section>
<item>
<attribute name="label" translatable="yes">Dark Theme</attribute>
<attribute name="action">win.dark</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Toolbar</attribute>
<attribute name="action">win.toolbar</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Statusbar</attribute>
<attribute name="action">win.statusbar</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Select Background</attribute>
<attribute name="action">win.background</attribute>
</item>
</section>
</submenu>
<submenu>
<attribute name="label" translatable="yes">_Help</attribute>
<item>
<attribute name="label" translatable="yes">About</attribute>
<attribute name="action">app.about</attribute>
</item>
</submenu>
</menu>
</interface> </interface>

View File

@@ -1,9 +1,8 @@
# GdkAtom is an opaque typedef # GdkAtom is an opaque typedef
<TYPEDEF> <STRUCT>
<NAME>GdkAtom</NAME> <NAME>GdkAtom</NAME>
typedef struct _GdkAtom *GdkAtom; </STRUCT>
</TYPEDEF>
<MACRO> <MACRO>
<NAME>GDK_WINDOWING_X11</NAME> <NAME>GDK_WINDOWING_X11</NAME>

View File

@@ -95,6 +95,7 @@ gdk_display_list_seats
gdk_display_get_n_monitors gdk_display_get_n_monitors
gdk_display_get_monitor gdk_display_get_monitor
gdk_display_get_primary_monitor gdk_display_get_primary_monitor
gdk_display_get_monitor_at_point
gdk_display_get_monitor_at_surface gdk_display_get_monitor_at_surface
gdk_display_get_clipboard gdk_display_get_clipboard
gdk_display_get_primary_clipboard gdk_display_get_primary_clipboard
@@ -178,19 +179,19 @@ GdkSurfaceEdge
GdkSurfaceTypeHint GdkSurfaceTypeHint
GdkSurfaceState GdkSurfaceState
gdk_surface_new_toplevel gdk_surface_new_toplevel
gdk_surface_new_temp
gdk_surface_new_popup gdk_surface_new_popup
gdk_surface_get_parent gdk_surface_new_temp
gdk_surface_new_child
gdk_surface_destroy gdk_surface_destroy
gdk_surface_get_surface_type gdk_surface_get_surface_type
gdk_surface_get_display gdk_surface_get_display
gdk_surface_show gdk_surface_show
gdk_surface_show_unraised gdk_surface_show_unraised
gdk_surface_show_with_auto_dismissal
gdk_surface_hide gdk_surface_hide
gdk_surface_is_destroyed gdk_surface_is_destroyed
gdk_surface_is_visible gdk_surface_is_visible
gdk_surface_is_viewable gdk_surface_is_viewable
gdk_surface_is_input_only
gdk_surface_get_state gdk_surface_get_state
gdk_surface_iconify gdk_surface_iconify
gdk_surface_deiconify gdk_surface_deiconify
@@ -207,8 +208,13 @@ gdk_surface_set_fullscreen_mode
gdk_surface_set_keep_above gdk_surface_set_keep_above
gdk_surface_set_keep_below gdk_surface_set_keep_below
gdk_surface_set_opacity gdk_surface_set_opacity
gdk_surface_set_pass_through
gdk_surface_get_pass_through
gdk_surface_move
gdk_surface_resize gdk_surface_resize
gdk_surface_move_resize
gdk_surface_move_to_rect gdk_surface_move_to_rect
gdk_surface_has_native
gdk_surface_raise gdk_surface_raise
gdk_surface_lower gdk_surface_lower
gdk_surface_restack gdk_surface_restack
@@ -239,10 +245,13 @@ gdk_surface_get_accept_focus
gdk_surface_set_focus_on_map gdk_surface_set_focus_on_map
gdk_surface_get_focus_on_map gdk_surface_get_focus_on_map
gdk_surface_input_shape_combine_region gdk_surface_input_shape_combine_region
gdk_surface_set_child_input_shapes
gdk_surface_merge_child_input_shapes
gdk_surface_set_title gdk_surface_set_title
GDK_PARENT_RELATIVE GDK_PARENT_RELATIVE
gdk_surface_set_cursor gdk_surface_set_cursor
gdk_surface_get_cursor gdk_surface_get_cursor
gdk_surface_get_geometry
gdk_surface_set_geometry_hints gdk_surface_set_geometry_hints
gdk_surface_get_width gdk_surface_get_width
gdk_surface_get_height gdk_surface_get_height
@@ -253,9 +262,17 @@ gdk_surface_set_type_hint
gdk_surface_get_type_hint gdk_surface_get_type_hint
gdk_surface_set_shadow_width gdk_surface_set_shadow_width
gdk_surface_get_position gdk_surface_get_position
gdk_surface_get_root_origin
gdk_surface_get_frame_extents
gdk_surface_get_origin
gdk_surface_get_root_coords
gdk_surface_get_device_position gdk_surface_get_device_position
GdkModifierType GdkModifierType
GdkModifierIntent GdkModifierIntent
gdk_surface_get_parent
gdk_surface_get_toplevel
gdk_surface_get_children
gdk_surface_peek_children
gdk_surface_set_icon_name gdk_surface_set_icon_name
gdk_surface_set_transient_for gdk_surface_set_transient_for
gdk_surface_set_startup_id gdk_surface_set_startup_id
@@ -271,6 +288,10 @@ gdk_surface_set_support_multidevice
gdk_surface_get_device_cursor gdk_surface_get_device_cursor
gdk_surface_set_device_cursor gdk_surface_set_device_cursor
<SUBSECTION>
gdk_surface_coords_from_parent
gdk_surface_coords_to_parent
<SUBSECTION Standard> <SUBSECTION Standard>
GDK_SURFACE GDK_SURFACE
GDK_SURFACE_GET_CLASS GDK_SURFACE_GET_CLASS
@@ -477,6 +498,7 @@ gdk_device_get_seat
<SUBSECTION> <SUBSECTION>
gdk_device_get_state gdk_device_get_state
gdk_device_get_position
gdk_device_get_surface_at_position gdk_device_get_surface_at_position
gdk_device_get_history gdk_device_get_history
gdk_device_free_history gdk_device_free_history
@@ -591,6 +613,7 @@ gdk_event_get_click_count
gdk_event_get_coords gdk_event_get_coords
gdk_event_get_keycode gdk_event_get_keycode
gdk_event_get_keyval gdk_event_get_keyval
gdk_event_get_root_coords
gdk_event_get_scroll_direction gdk_event_get_scroll_direction
gdk_event_get_scroll_deltas gdk_event_get_scroll_deltas
gdk_event_is_scroll_stop_event gdk_event_is_scroll_stop_event
@@ -800,6 +823,7 @@ gdk_x11_lookup_xdisplay
gdk_x11_get_server_time gdk_x11_get_server_time
gdk_x11_device_get_id gdk_x11_device_get_id
gdk_x11_device_manager_lookup gdk_x11_device_manager_lookup
gdk_disable_multidevice
gdk_x11_display_open gdk_x11_display_open
gdk_x11_display_set_program_class gdk_x11_display_set_program_class
gdk_x11_display_get_user_time gdk_x11_display_get_user_time
@@ -857,6 +881,18 @@ GDK_X11_APP_LAUNCH_CONTEXT_CLASS
GDK_IS_X11_APP_LAUNCH_CONTEXT GDK_IS_X11_APP_LAUNCH_CONTEXT
GDK_IS_X11_APP_LAUNCH_CONTEXT_CLASS GDK_IS_X11_APP_LAUNCH_CONTEXT_CLASS
GDK_X11_APP_LAUNCH_CONTEXT_GET_CLASS GDK_X11_APP_LAUNCH_CONTEXT_GET_CLASS
GDK_TYPE_X11_DEVICE_CORE
GDK_X11_DEVICE_CORE
GDK_X11_DEVICE_CORE_CLASS
GDK_IS_X11_DEVICE_CORE
GDK_IS_X11_DEVICE_CORE_CLASS
GDK_X11_DEVICE_CORE_GET_CLASS
GDK_TYPE_X11_DEVICE_MANAGER_CORE
GDK_X11_DEVICE_MANAGER_CORE
GDK_X11_DEVICE_MANAGER_CORE_CLASS
GDK_IS_X11_DEVICE_MANAGER_CORE
GDK_IS_X11_DEVICE_MANAGER_CORE_CLASS
GDK_X11_DEVICE_MANAGER_CORE_GET_CLASS
GDK_TYPE_X11_DEVICE_MANAGER_XI2 GDK_TYPE_X11_DEVICE_MANAGER_XI2
GDK_X11_DEVICE_MANAGER_XI2 GDK_X11_DEVICE_MANAGER_XI2
GDK_X11_DEVICE_MANAGER_XI2_CLASS GDK_X11_DEVICE_MANAGER_XI2_CLASS
@@ -926,6 +962,8 @@ GDK_X11_SURFACE_GET_CLASS
<SUBSECTION Private> <SUBSECTION Private>
gdk_x11_app_launch_context_get_type gdk_x11_app_launch_context_get_type
gdk_x11_cursor_get_type gdk_x11_cursor_get_type
gdk_x11_device_core_get_type
gdk_x11_device_manager_core_get_type
gdk_x11_device_manager_xi2_get_type gdk_x11_device_manager_xi2_get_type
gdk_x11_device_manager_xi_get_type gdk_x11_device_manager_xi_get_type
gdk_x11_device_xi2_get_type gdk_x11_device_xi2_get_type
@@ -1128,7 +1166,6 @@ gdk_monitor_get_width_mm
gdk_monitor_get_height_mm gdk_monitor_get_height_mm
gdk_monitor_get_manufacturer gdk_monitor_get_manufacturer
gdk_monitor_get_model gdk_monitor_get_model
gdk_monitor_get_connector
gdk_monitor_get_scale_factor gdk_monitor_get_scale_factor
gdk_monitor_get_refresh_rate gdk_monitor_get_refresh_rate
GdkSubpixelLayout GdkSubpixelLayout

View File

@@ -99,26 +99,24 @@ if wayland_enabled
src_dir += [ gdkwayland_inc ] src_dir += [ gdkwayland_inc ]
endif endif
if get_option('gtk_doc') configure_file(input: 'version.xml.in', output: 'version.xml', configuration: version_conf)
configure_file(input: 'version.xml.in', output: 'version.xml', configuration: version_conf)
gnome.gtkdoc('gdk4', gnome.gtkdoc('gdk4',
mode: 'none', mode: 'none',
main_xml: 'gdk4-docs.xml', main_xml: 'gdk4-docs.xml',
src_dir: src_dir, src_dir: src_dir,
dependencies: libgtk_dep, dependencies: libgtk_dep,
gobject_typesfile: join_paths(meson.current_source_dir(), 'gdk4.types'), gobject_typesfile: join_paths(meson.current_source_dir(), 'gdk4.types'),
scan_args: [ scan_args: [
'--ignore-decorators=_GDK_EXTERN|G_GNUC_WARN_UNUSED_RESULT', '--ignore-decorators=_GDK_EXTERN|G_GNUC_WARN_UNUSED_RESULT',
'--ignore-headers=' + ' '.join(private_headers), '--ignore-headers=' + ' '.join(private_headers),
], ],
fixxref_args: [ fixxref_args: [
'--html-dir=@0@'.format(docpath), '--html-dir=@0@'.format(docpath),
'--extra-dir=@0@'.format(join_paths(glib_docpath, 'glib')), '--extra-dir=@0@'.format(join_paths(glib_docpath, 'glib')),
'--extra-dir=@0@'.format(join_paths(glib_docpath, 'gobject')), '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gobject')),
'--extra-dir=@0@'.format(join_paths(glib_docpath, 'gio')), '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gio')),
'--extra-dir=@0@'.format(cairo_docpath), '--extra-dir=@0@'.format(cairo_docpath),
], ],
html_assets: images, html_assets: images,
install: true) install: true)
endif

View File

@@ -34,29 +34,27 @@ private_headers = [
images = [ images = [
] ]
if get_option('gtk_doc') configure_file(input: 'version.xml.in', output: 'version.xml', configuration: version_conf)
configure_file(input: 'version.xml.in', output: 'version.xml', configuration: version_conf)
gnome.gtkdoc('gsk4', gnome.gtkdoc('gsk4',
mode: 'none', mode: 'none',
main_xml: 'gsk4-docs.xml', main_xml: 'gsk4-docs.xml',
src_dir: [ src_dir: [
gskinc, gskinc,
], ],
dependencies: libgtk_dep, dependencies: libgtk_dep,
gobject_typesfile: join_paths(meson.current_source_dir(), 'gsk4.types'), gobject_typesfile: join_paths(meson.current_source_dir(), 'gsk4.types'),
scan_args: [ scan_args: [
'--ignore-decorators=_GDK_EXTERN', '--ignore-decorators=_GDK_EXTERN',
'--ignore-headers=' + ' '.join(private_headers), '--ignore-headers=' + ' '.join(private_headers),
], ],
fixxref_args: [ fixxref_args: [
'--html-dir=@0@'.format(docpath), '--html-dir=@0@'.format(docpath),
'--extra-dir=@0@'.format(join_paths(glib_docpath, 'glib')), '--extra-dir=@0@'.format(join_paths(glib_docpath, 'glib')),
'--extra-dir=@0@'.format(join_paths(glib_docpath, 'gobject')), '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gobject')),
'--extra-dir=@0@'.format(join_paths(glib_docpath, 'gio')), '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gio')),
'--extra-dir=@0@'.format(cairo_docpath), '--extra-dir=@0@'.format(cairo_docpath),
'--extra-dir=../gdk', '--extra-dir=../gdk',
], ],
html_assets: images, html_assets: images,
install: true) install: true)
endif

View File

@@ -258,11 +258,9 @@
</para> </para>
<para> <para>
Actions are added to their relevant scope (application, Actions are added to their relevant scope (application or
window or widget) either using the GActionMap interface, window) either using the GActionMap interface, or by using
or by using gtk_widget_insert_action_group(). Actions that gtk_widget_insert_action_group().
will be the same for all instances of a widget class can
be added globally using gtk_widget_class_install_action().
</para> </para>
</refsect2> </refsect2>
@@ -319,8 +317,8 @@
</para> </para>
<para> <para>
Another way of obtaining widgets that are connected to actions Another of obtaining widgets that are connected to actions is
is to create a menu using a GMenu menu model. GMenu provides an to create a menu using a GMenu menu model. GMenu provides an
abstract way to describe typical menus: nested groups of items abstract way to describe typical menus: nested groups of items
where each item can have a label, and icon, and an action. where each item can have a label, and icon, and an action.
</para> </para>
@@ -366,25 +364,6 @@
(typically a GtkWindow, GtkDialog or GtkPopover) (typically a GtkWindow, GtkDialog or GtkPopover)
</para></listitem> </para></listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term>clipboard.cut, clipboard.copy, clipboard.paste</term>
<listitem><para>Clipboard operations on entries, text view
and labels, typically used in the context menu
</para></listitem>
</varlistentry>
<varlistentry>
<term>selection.delete, selection.select-all</term>
<listitem><para>Selection operations on entries, text view
and labels
</para></listitem>
</varlistentry>
<varlistentry>
<term>color.select, color.customize</term>
<listitem><para>Operations on colors in GtkColorChooserWidget.
These actions are unusual in that they have the non-trivial
parameter type (dddd).
</para></listitem>
</varlistentry>
</variablelist> </variablelist>
</para> </para>

View File

@@ -355,8 +355,8 @@ How to compile GTK itself
</group> </group>
<sbr/> <sbr/>
<group> <group>
<arg choice="plain">-Dgtk_doc=true</arg> <arg choice="plain">-Ddocumentation=true</arg>
<arg choice="plain">-Dgtk_doc=false</arg> <arg choice="plain">-Ddocumentation=false</arg>
</group> </group>
<sbr/> <sbr/>
<group> <group>
@@ -382,7 +382,7 @@ How to compile GTK itself
</formalpara> </formalpara>
<formalpara> <formalpara>
<title><systemitem>gtk_doc</systemitem> and <title><systemitem>documentation</systemitem> and
<systemitem>man-pages</systemitem></title> <systemitem>man-pages</systemitem></title>
<para> <para>
@@ -394,7 +394,7 @@ How to compile GTK itself
<application>gtk-doc</application> installed and <application>gtk-doc</application> installed and
are modifying GTK, you may want to enable are modifying GTK, you may want to enable
<application>gtk-doc</application> support by passing <application>gtk-doc</application> support by passing
in <systemitem>gtk_doc</systemitem>. in <systemitem>documentation</systemitem>.
</para> </para>
<para> <para>
Additionally, some tools provided by GTK have their own Additionally, some tools provided by GTK have their own

View File

@@ -109,9 +109,6 @@
<xi:include href="xml/gtkcustomlayout.xml" /> <xi:include href="xml/gtkcustomlayout.xml" />
<xi:include href="xml/gtkfixedlayout.xml" /> <xi:include href="xml/gtkfixedlayout.xml" />
<xi:include href="xml/gtkgridlayout.xml" /> <xi:include href="xml/gtkgridlayout.xml" />
<xi:include href="xml/gtkconstraintlayout.xml" />
<xi:include href="xml/gtkconstraint.xml" />
<xi:include href="xml/gtkconstraintguide.xml" />
</chapter> </chapter>
<chapter id="DisplayWidgets"> <chapter id="DisplayWidgets">
@@ -227,7 +224,6 @@
<xi:include href="xml/gtkradiotoolbutton.xml" /> <xi:include href="xml/gtkradiotoolbutton.xml" />
<xi:include href="xml/gtkpopover.xml" /> <xi:include href="xml/gtkpopover.xml" />
<xi:include href="xml/gtkpopovermenu.xml" /> <xi:include href="xml/gtkpopovermenu.xml" />
<xi:include href="xml/gtkpopovermenubar.xml" />
</chapter> </chapter>
<chapter id="SelectorWidgets"> <chapter id="SelectorWidgets">
@@ -336,7 +332,7 @@
<xi:include href="xml/gtkgesturesingle.xml" /> <xi:include href="xml/gtkgesturesingle.xml" />
<xi:include href="xml/gtkgesturedrag.xml" /> <xi:include href="xml/gtkgesturedrag.xml" />
<xi:include href="xml/gtkgesturelongpress.xml" /> <xi:include href="xml/gtkgesturelongpress.xml" />
<xi:include href="xml/gtkgestureclick.xml" /> <xi:include href="xml/gtkgesturemultipress.xml" />
<xi:include href="xml/gtkgesturepan.xml" /> <xi:include href="xml/gtkgesturepan.xml" />
<xi:include href="xml/gtkgestureswipe.xml" /> <xi:include href="xml/gtkgestureswipe.xml" />
<xi:include href="xml/gtkgesturerotate.xml" /> <xi:include href="xml/gtkgesturerotate.xml" />

View File

@@ -537,6 +537,7 @@ gtk_button_new
gtk_button_new_with_label gtk_button_new_with_label
gtk_button_new_with_mnemonic gtk_button_new_with_mnemonic
gtk_button_new_from_icon_name gtk_button_new_from_icon_name
gtk_button_clicked
gtk_button_set_relief gtk_button_set_relief
gtk_button_get_relief gtk_button_get_relief
gtk_button_get_label gtk_button_get_label
@@ -893,8 +894,6 @@ gtk_text_get_attributes
gtk_text_set_tabs gtk_text_set_tabs
gtk_text_get_tabs gtk_text_get_tabs
gtk_text_grab_focus_without_selecting gtk_text_grab_focus_without_selecting
gtk_text_set_extra_menu
gtk_text_get_extra_menu
<SUBSECTION Private> <SUBSECTION Private>
gtk_text_get_type gtk_text_get_type
</SECTION> </SECTION>
@@ -965,8 +964,6 @@ GtkInputHints
gtk_entry_set_input_hints gtk_entry_set_input_hints
gtk_entry_get_input_hints gtk_entry_get_input_hints
gtk_entry_grab_focus_without_selecting gtk_entry_grab_focus_without_selecting
gtk_entry_set_extra_menu
gtk_entry_get_extra_menu
<SUBSECTION Standard> <SUBSECTION Standard>
GTK_ENTRY GTK_ENTRY
@@ -989,8 +986,6 @@ GtkPasswordEntry
gtk_password_entry_new gtk_password_entry_new
gtk_password_entry_set_show_peek_icon gtk_password_entry_set_show_peek_icon
gtk_password_entry_get_show_peek_icon gtk_password_entry_get_show_peek_icon
gtk_password_entry_set_extra_menu
gtk_password_entry_get_extra_menu
<SUBSECTION Private> <SUBSECTION Private>
gtk_password_entry_get_type gtk_password_entry_get_type
</SECTION> </SECTION>
@@ -1719,9 +1714,6 @@ gtk_label_set_single_line_mode
gtk_label_get_current_uri gtk_label_get_current_uri
gtk_label_set_track_visited_links gtk_label_set_track_visited_links
gtk_label_get_track_visited_links gtk_label_get_track_visited_links
gtk_label_set_extra_menu
gtk_label_get_extra_menu
<SUBSECTION Standard> <SUBSECTION Standard>
GTK_LABEL GTK_LABEL
GTK_IS_LABEL GTK_IS_LABEL
@@ -1784,6 +1776,7 @@ gtk_map_list_model_get_type
<FILE>gtkmenu</FILE> <FILE>gtkmenu</FILE>
<TITLE>GtkMenu</TITLE> <TITLE>GtkMenu</TITLE>
GtkMenu GtkMenu
GtkArrowPlacement
gtk_menu_new gtk_menu_new
gtk_menu_new_from_model gtk_menu_new_from_model
gtk_menu_reorder_child gtk_menu_reorder_child
@@ -1857,14 +1850,6 @@ gtk_menu_button_set_direction
gtk_menu_button_get_direction gtk_menu_button_get_direction
gtk_menu_button_set_align_widget gtk_menu_button_set_align_widget
gtk_menu_button_get_align_widget gtk_menu_button_get_align_widget
gtk_menu_button_set_icon_name
gtk_menu_button_get_icon_name
gtk_menu_button_set_label
gtk_menu_button_get_label
gtk_menu_button_set_relief
gtk_menu_button_get_relief
gtk_menu_button_popup
gtk_menu_button_popdown
<SUBSECTION Standard> <SUBSECTION Standard>
GTK_TYPE_MENU_BUTTON GTK_TYPE_MENU_BUTTON
GTK_MENU_BUTTON GTK_MENU_BUTTON
@@ -3098,9 +3083,6 @@ gtk_text_view_set_input_hints
gtk_text_view_get_input_hints gtk_text_view_get_input_hints
gtk_text_view_set_monospace gtk_text_view_set_monospace
gtk_text_view_get_monospace gtk_text_view_get_monospace
gtk_text_view_set_extra_menu
gtk_text_view_get_extra_menu
GTK_TEXT_VIEW_PRIORITY_VALIDATE GTK_TEXT_VIEW_PRIORITY_VALIDATE
<SUBSECTION Standard> <SUBSECTION Standard>
GTK_TEXT_VIEW GTK_TEXT_VIEW
@@ -4454,8 +4436,8 @@ gtk_widget_set_name
gtk_widget_get_name gtk_widget_get_name
gtk_widget_set_sensitive gtk_widget_set_sensitive
gtk_widget_set_parent gtk_widget_set_parent
gtk_widget_get_toplevel
gtk_widget_get_root gtk_widget_get_root
gtk_widget_get_native
gtk_widget_get_ancestor gtk_widget_get_ancestor
gtk_widget_is_ancestor gtk_widget_is_ancestor
gtk_widget_translate_coordinates gtk_widget_translate_coordinates
@@ -4505,6 +4487,9 @@ gtk_widget_set_tooltip_window
gtk_widget_get_has_tooltip gtk_widget_get_has_tooltip
gtk_widget_set_has_tooltip gtk_widget_set_has_tooltip
gtk_widget_trigger_tooltip_query gtk_widget_trigger_tooltip_query
gtk_widget_get_surface
gtk_widget_register_surface
gtk_widget_unregister_surface
gtk_widget_get_allocated_width gtk_widget_get_allocated_width
gtk_widget_get_allocated_height gtk_widget_get_allocated_height
gtk_widget_get_allocation gtk_widget_get_allocation
@@ -4524,6 +4509,8 @@ gtk_widget_set_focus_on_click
gtk_widget_set_focus_child gtk_widget_set_focus_child
gtk_widget_get_can_target gtk_widget_get_can_target
gtk_widget_set_can_target gtk_widget_set_can_target
gtk_widget_get_has_surface
gtk_widget_set_has_surface
gtk_widget_get_sensitive gtk_widget_get_sensitive
gtk_widget_is_sensitive gtk_widget_is_sensitive
gtk_widget_get_visible gtk_widget_get_visible
@@ -4537,6 +4524,8 @@ gtk_widget_has_focus
gtk_widget_has_visible_focus gtk_widget_has_visible_focus
gtk_widget_has_grab gtk_widget_has_grab
gtk_widget_is_drawable gtk_widget_is_drawable
gtk_widget_is_toplevel
gtk_widget_set_surface
gtk_widget_set_receives_default gtk_widget_set_receives_default
gtk_widget_get_receives_default gtk_widget_get_receives_default
gtk_widget_set_support_multidevice gtk_widget_set_support_multidevice
@@ -4549,6 +4538,11 @@ gtk_widget_get_opacity
gtk_widget_set_opacity gtk_widget_set_opacity
gtk_widget_get_overflow gtk_widget_get_overflow
gtk_widget_set_overflow gtk_widget_set_overflow
gtk_widget_insert_action_group
gtk_widget_list_action_prefixes
gtk_widget_get_action_group
gtk_widget_activate_action
gtk_widget_activate_default
gtk_widget_measure gtk_widget_measure
gtk_widget_snapshot_child gtk_widget_snapshot_child
gtk_widget_get_next_sibling gtk_widget_get_next_sibling
@@ -4559,7 +4553,6 @@ gtk_widget_insert_before
gtk_widget_insert_after gtk_widget_insert_after
gtk_widget_set_layout_manager gtk_widget_set_layout_manager
gtk_widget_get_layout_manager gtk_widget_get_layout_manager
gtk_widget_should_layout
<SUBSECTION> <SUBSECTION>
gtk_widget_get_path gtk_widget_get_path
@@ -4625,17 +4618,6 @@ gtk_widget_class_set_connect_func
gtk_widget_observe_children gtk_widget_observe_children
gtk_widget_observe_controllers gtk_widget_observe_controllers
<SUBSECTION Actions>
gtk_widget_insert_action_group
gtk_widget_activate_action
gtk_widget_activate_action_variant
gtk_widget_activate_default
GtkWidgetActionActivateFunc
gtk_widget_class_install_action
gtk_widget_class_install_property_action
gtk_widget_class_query_action
gtk_widget_action_set_enabled
<SUBSECTION Standard> <SUBSECTION Standard>
GTK_WIDGET GTK_WIDGET
GTK_IS_WIDGET GTK_IS_WIDGET
@@ -4667,6 +4649,8 @@ gtk_window_set_modal
gtk_window_set_default_size gtk_window_set_default_size
gtk_window_set_hide_on_close gtk_window_set_hide_on_close
gtk_window_get_hide_on_close gtk_window_get_hide_on_close
GtkWindowPosition
gtk_window_set_position
gtk_window_set_transient_for gtk_window_set_transient_for
gtk_window_set_attached_to gtk_window_set_attached_to
gtk_window_set_destroy_with_parent gtk_window_set_destroy_with_parent
@@ -5202,6 +5186,7 @@ GtkBindingSet
GtkBindingEntry GtkBindingEntry
GtkBindingSignal GtkBindingSignal
GtkBindingArg GtkBindingArg
gtk_binding_entry_add_signall
gtk_binding_set_new gtk_binding_set_new
gtk_binding_set_by_class gtk_binding_set_by_class
gtk_binding_set_find gtk_binding_set_find
@@ -6456,6 +6441,8 @@ gtk_flow_box_child_get_type
<TITLE>GtkPopover</TITLE> <TITLE>GtkPopover</TITLE>
GtkPopover GtkPopover
gtk_popover_new gtk_popover_new
gtk_popover_new_from_model
gtk_popover_bind_model
gtk_popover_popup gtk_popover_popup
gtk_popover_popdown gtk_popover_popdown
gtk_popover_set_relative_to gtk_popover_set_relative_to
@@ -6467,10 +6454,8 @@ gtk_popover_get_position
GtkPopoverConstraint GtkPopoverConstraint
gtk_popover_set_constrain_to gtk_popover_set_constrain_to
gtk_popover_get_constrain_to gtk_popover_get_constrain_to
gtk_popover_set_autohide gtk_popover_set_modal
gtk_popover_get_autohide gtk_popover_get_modal
gtk_popover_set_has_arrow
gtk_popover_get_has_arrow
gtk_popover_set_default_widget gtk_popover_set_default_widget
gtk_popover_get_default_widget gtk_popover_get_default_widget
<SUBSECTION Standard> <SUBSECTION Standard>
@@ -6493,7 +6478,6 @@ gtk_popover_get_type
<TITLE>GtkPopoverMenu</TITLE> <TITLE>GtkPopoverMenu</TITLE>
GtkPopoverMenu GtkPopoverMenu
gtk_popover_menu_new gtk_popover_menu_new
gtk_popover_menu_new_from_model
gtk_popover_menu_add_submenu gtk_popover_menu_add_submenu
gtk_popover_menu_open_submenu gtk_popover_menu_open_submenu
@@ -6509,23 +6493,6 @@ GTK_POPOVER_MENU_GET_CLASS
gtk_popover_menu_get_type gtk_popover_menu_get_type
</SECTION> </SECTION>
<SECTION>
<FILE>gtkpopovermenubar</FILE>
<TITLE>GtkPopoverMenuBar</TITLE>
GtkPopoverMenuBar
gtk_popover_menu_bar_new_from_model
gtk_popover_menu_bar_set_menu_model
gtk_popover_menu_bar_get_menu_model
<SUBSECTION Standard>
GTK_TYPE_POPOVER_MENU_BAR
GTK_IS_POPOVER_MENU_BAR
GTK_POPOVER_MENU_BAR
<SUBSECTION Private>
gtk_popover_menu_bar_get_type
</SECTION>
<SECTION> <SECTION>
<FILE>gtkmodelbutton</FILE> <FILE>gtkmodelbutton</FILE>
<TITLE>GtkModelButton</TITLE> <TITLE>GtkModelButton</TITLE>
@@ -6547,9 +6514,6 @@ GtkEventController
GtkPropagationPhase GtkPropagationPhase
gtk_event_controller_get_propagation_phase gtk_event_controller_get_propagation_phase
gtk_event_controller_set_propagation_phase gtk_event_controller_set_propagation_phase
GtkPropagationLimit
gtk_event_controller_get_propagation_limit
gtk_event_controller_set_propagation_limit
gtk_event_controller_handle_event gtk_event_controller_handle_event
gtk_event_controller_get_widget gtk_event_controller_get_widget
gtk_event_controller_reset gtk_event_controller_reset
@@ -6753,23 +6717,23 @@ gtk_gesture_long_press_get_type
</SECTION> </SECTION>
<SECTION> <SECTION>
<FILE>gtkgestureclick</FILE> <FILE>gtkgesturemultipress</FILE>
<TITLE>GtkGestureClick</TITLE> <TITLE>GtkGestureMultiPress</TITLE>
GtkGestureClick GtkGestureMultiPress
gtk_gesture_click_new gtk_gesture_multi_press_new
gtk_gesture_click_set_area gtk_gesture_multi_press_set_area
gtk_gesture_click_get_area gtk_gesture_multi_press_get_area
<SUBSECTION Standard> <SUBSECTION Standard>
GTK_TYPE_GESTURE_CLICK GTK_TYPE_GESTURE_MULTI_PRESS
GTK_GESTURE_CLICK GTK_GESTURE_MULTI_PRESS
GTK_GESTURE_CLICK_CLASS GTK_GESTURE_MULTI_PRESS_CLASS
GTK_IS_GESTURE_CLICK GTK_IS_GESTURE_MULTI_PRESS
GTK_IS_GESTURE_CLICK_CLASS GTK_IS_GESTURE_MULTI_PRESS_CLASS
GTK_GESTURE_CLICK_GET_CLASS GTK_GESTURE_MULTI_PRESS_GET_CLASS
<SUBSECTION Private> <SUBSECTION Private>
gtk_gesture_click_get_type gtk_gesture_multi_press_get_type
</SECTION> </SECTION>
<SECTION> <SECTION>
@@ -7139,26 +7103,17 @@ gtk_media_stream_get_type
<FILE>gtkroot</FILE> <FILE>gtkroot</FILE>
<TITLE>GtkRoot</TITLE> <TITLE>GtkRoot</TITLE>
GtkRoot GtkRoot
gtk_root_get_display gtk_root_get_for_surface
gtk_root_get_focus gtk_root_get_focus
gtk_root_set_focus gtk_root_set_focus
<SUBSECTION>
gtk_root_install_properties
<SUBSECTION Private> <SUBSECTION Private>
gtk_root_get_type gtk_root_get_type
</SECTION> </SECTION>
<SECTION>
<FILE>gtknative</FILE>
GtkNative
gtk_native_get_for_surface
gtk_native_get_surface
gtk_native_get_renderer
gtk_native_check_resize
<SUBSECTION Private>
gtk_native_get_type
</SECTION>
<SECTION> <SECTION>
<FILE>gtklayoutmanager</FILE> <FILE>gtklayoutmanager</FILE>
GtkLayoutManager GtkLayoutManager
@@ -7287,87 +7242,3 @@ gtk_grid_layout_get_type
GTK_TYPE_GRID_LAYOUT_CHILD GTK_TYPE_GRID_LAYOUT_CHILD
gtk_grid_layout_child_get_type gtk_grid_layout_child_get_type
</SECTION> </SECTION>
<SECTION>
<FILE>gtkconstraint</FILE>
GtkConstraint
GtkConstraintTarget
gtk_constraint_new
gtk_constraint_new_constant
gtk_constraint_get_target
GtkConstraintAttribute
gtk_constraint_get_target_attribute
GtkConstraintRelation
gtk_constraint_get_relation
gtk_constraint_get_source
gtk_constraint_get_source_attribute
gtk_constraint_get_multiplier
gtk_constraint_get_constant
GtkConstraintStrength
gtk_constraint_get_strength
gtk_constraint_is_required
gtk_constraint_is_attached
gtk_constraint_is_constant
<SUBSECTION Standard>
GTK_TYPE_CONSTRAINT
gtk_constraint_get_type
GTK_TYPE_CONSTRAINT_TARGET
gtk_constraint_target_get_type
</SECTION>
<SECTION>
<FILE>gtkconstraintlayout</FILE>
GtkConstraintLayout
GtkConstraintLayoutChild
GtkConstraintVflParserError
gtk_constraint_layout_new
<SUBSECTION Constraints>
gtk_constraint_layout_add_constraint
gtk_constraint_layout_remove_constraint
gtk_constraint_layout_remove_all_constraints
<SUBSECTION Guides>
gtk_constraint_layout_add_guide
gtk_constraint_layout_remove_guide
<SUBSECTION VFL>
gtk_constraint_layout_add_constraints_from_description
gtk_constraint_layout_add_constraints_from_descriptionv
<SUBSECTION>
gtk_constraint_layout_observe_constraints
gtk_constraint_layout_observe_guides
<SUBSECTION Standard>
GTK_TYPE_CONSTRAINT_LAYOUT
gtk_constraint_layout_get_type
GTK_TYPE_CONSTRAINT_LAYOUT_CHILD
gtk_constraint_layout_child_get_type
GTK_CONSTRAINT_VFL_PARSER_ERROR
gtk_constraint_vfl_parser_error_quark
</SECTION>
<SECTION>
<FILE>gtkconstraintguide</FILE>
GtkConstraintGuide
gtk_constraint_guide_new
gtk_constraint_guide_set_name
gtk_constraint_guide_get_name
gtk_constraint_guide_set_strength
gtk_constraint_guide_get_strength
gtk_constraint_guide_set_min_size
gtk_constraint_guide_get_min_size
gtk_constraint_guide_set_nat_size
gtk_constraint_guide_get_nat_size
gtk_constraint_guide_set_max_size
gtk_constraint_guide_get_max_size
<SUBSECTION Standard>
GTK_TYPE_CONSTRAINT_GUIDE
gtk_constraint_guide_get_tyoe
</SECTION>

View File

@@ -1,6 +1,3 @@
#include <gtk/gtk.h>
#include <gtk/gtkunixprint.h>
gtk_about_dialog_get_type gtk_about_dialog_get_type
gtk_accel_group_get_type gtk_accel_group_get_type
gtk_accel_label_get_type gtk_accel_label_get_type
@@ -49,10 +46,6 @@ gtk_color_chooser_dialog_get_type
gtk_color_chooser_widget_get_type gtk_color_chooser_widget_get_type
gtk_combo_box_get_type gtk_combo_box_get_type
gtk_combo_box_text_get_type gtk_combo_box_text_get_type
gtk_constraint_get_type
gtk_constraint_guide_get_type
gtk_constraint_layout_get_type
gtk_constraint_target_get_type
gtk_container_get_type gtk_container_get_type
gtk_css_provider_get_type gtk_css_provider_get_type
gtk_dialog_get_type gtk_dialog_get_type
@@ -82,9 +75,9 @@ gtk_font_chooser_dialog_get_type
gtk_font_chooser_widget_get_type gtk_font_chooser_widget_get_type
gtk_frame_get_type gtk_frame_get_type
gtk_gesture_get_type gtk_gesture_get_type
gtk_gesture_click_get_type
gtk_gesture_drag_get_type gtk_gesture_drag_get_type
gtk_gesture_long_press_get_type gtk_gesture_long_press_get_type
gtk_gesture_multi_press_get_type
gtk_gesture_pan_get_type gtk_gesture_pan_get_type
gtk_gesture_rotate_get_type gtk_gesture_rotate_get_type
gtk_gesture_single_get_type gtk_gesture_single_get_type
@@ -136,7 +129,6 @@ gtk_password_entry_get_type
gtk_picture_get_type gtk_picture_get_type
gtk_popover_get_type gtk_popover_get_type
gtk_popover_menu_get_type gtk_popover_menu_get_type
gtk_popover_menu_bar_get_type
@DISABLE_ON_W32@gtk_printer_get_type @DISABLE_ON_W32@gtk_printer_get_type
gtk_print_context_get_type gtk_print_context_get_type
@DISABLE_ON_W32@gtk_print_job_get_type @DISABLE_ON_W32@gtk_print_job_get_type

View File

@@ -104,7 +104,8 @@
a #GdkSurface, which in turn represents a windowing system surface in the a #GdkSurface, which in turn represents a windowing system surface in the
backend. If a widget has grabbed the current input device, or all input backend. If a widget has grabbed the current input device, or all input
devices, the event is propagated to that #GtkWidget. Otherwise, it is devices, the event is propagated to that #GtkWidget. Otherwise, it is
propagated to the the #GtkRoot which owns the #GdkSurface receiving the event. propagated to the the #GtkWidget which called gtk_widget_register_surface()
on the #GdkSurface receiving the event.
</para> </para>
<para> <para>

View File

@@ -23,13 +23,6 @@ private_headers = [
'gtkcolorswatchprivate.h', 'gtkcolorswatchprivate.h',
'gtkcomboboxprivate.h', 'gtkcomboboxprivate.h',
'gtkcontainerprivate.h', 'gtkcontainerprivate.h',
'gtkconstraintexpressionprivate.h',
'gtkconstraintguideprivate.h',
'gtkconstraintlayoutprivate.h',
'gtkconstraintprivate.h',
'gtkconstraintsolverprivate.h',
'gtkconstrainttypesprivate.h',
'gtkconstraintvflparserprivate.h',
'gtkcssanimatedstyleprivate.h', 'gtkcssanimatedstyleprivate.h',
'gtkcssanimationprivate.h', 'gtkcssanimationprivate.h',
'gtkcssarrayvalueprivate.h', 'gtkcssarrayvalueprivate.h',
@@ -148,7 +141,7 @@ private_headers = [
'gtkplacesviewrowprivate.h', 'gtkplacesviewrowprivate.h',
'gtkpointerfocusprivate.h', 'gtkpointerfocusprivate.h',
'gtkpopoverprivate.h', 'gtkpopoverprivate.h',
'gtkprinterprivate.h', 'gtkprinter-private.h',
'gtkprintoperation-private.h', 'gtkprintoperation-private.h',
'gtkprivate.h', 'gtkprivate.h',
'gtkprogresstrackerprivate.h', 'gtkprogresstrackerprivate.h',
@@ -388,6 +381,9 @@ expand_content_files = [
'tree_widget.sgml', 'tree_widget.sgml',
] ]
configure_file(input: 'version.xml.in', output: 'version.xml', configuration: version_conf)
configure_file(input: 'getting_started.xml.in', output: 'getting_started.xml', configuration: src_dir_conf)
types_conf = configuration_data() types_conf = configuration_data()
if os_win32 if os_win32
types_conf.set('DISABLE_ON_W32', '%') types_conf.set('DISABLE_ON_W32', '%')
@@ -401,44 +397,39 @@ else
types_conf.set('DISABLE_ON_QUARTZ', '') types_conf.set('DISABLE_ON_QUARTZ', '')
endif endif
if get_option('gtk_doc') gnome.gtkdoc('gtk4',
configure_file(input: 'version.xml.in', output: 'version.xml', configuration: version_conf) mode: 'none',
configure_file(input: 'getting_started.xml.in', output: 'getting_started.xml', configuration: src_dir_conf) main_xml: 'gtk4-docs.xml',
src_dir: [
gnome.gtkdoc('gtk4', gtkinc,
mode: 'none', ],
main_xml: 'gtk4-docs.xml', dependencies: libgtk_dep,
src_dir: [ gobject_typesfile: configure_file(
gtkinc, input: 'gtk4.types.in',
], output: 'gtk4.types',
dependencies: libgtk_dep, configuration: types_conf,
gobject_typesfile: configure_file( ),
input: 'gtk4.types.in', scan_args: [
output: 'gtk4.types', '--ignore-decorators=_GDK_EXTERN|G_GNUC_WARN_UNUSED_RESULT',
configuration: types_conf, '--ignore-headers=' + ' '.join(private_headers),
), ],
scan_args: [ mkdb_args: [
'--ignore-decorators=_GDK_EXTERN|G_GNUC_WARN_UNUSED_RESULT', '--default-includes=gtk/gtk.h',
'--ignore-headers=' + ' '.join(private_headers), ],
], fixxref_args: [
mkdb_args: [ '--html-dir=@0@'.format(docpath),
'--default-includes=gtk/gtk.h', '--extra-dir=@0@'.format(join_paths(glib_docpath, 'glib')),
], '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gobject')),
fixxref_args: [ '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gio')),
'--html-dir=@0@'.format(docpath), '--extra-dir=@0@'.format(cairo_docpath),
'--extra-dir=@0@'.format(join_paths(glib_docpath, 'glib')), '--extra-dir=@0@'.format(gdkpixbuf_docpath),
'--extra-dir=@0@'.format(join_paths(glib_docpath, 'gobject')), '--extra-dir=../gdk',
'--extra-dir=@0@'.format(join_paths(glib_docpath, 'gio')), '--extra-dir=../gsk',
'--extra-dir=@0@'.format(cairo_docpath), ],
'--extra-dir=@0@'.format(gdkpixbuf_docpath), content_files: content_files,
'--extra-dir=../gdk', expand_content_files: expand_content_files,
'--extra-dir=../gsk', html_assets: images,
], install: true)
content_files: content_files,
expand_content_files: expand_content_files,
html_assets: images,
install: true)
endif
xsltproc = find_program('xsltproc', required: false) xsltproc = find_program('xsltproc', required: false)
if get_option('man-pages') and not xsltproc.found() if get_option('man-pages') and not xsltproc.found()

View File

@@ -265,8 +265,9 @@
<para> <para>
The gdk_window_new() function has been replaced by a number of more The gdk_window_new() function has been replaced by a number of more
specialized constructors: gdk_surface_new_toplevel(), gdk_surface_new_popup(), specialized constructors: gdk_surface_new_toplevel(), gdk_surface_new_popup(),
gdk_surface_new_temp(), gdk_wayland_surface_new_subsurface(). gdk_surface_new_temp(), gdk_surface_new_child(), gdk_surface_new_input(),
Use the appropriate ones to create your windows. gdk_wayland_surface_new_subsurface(). Use the appropriate ones to create
your windows.
</para> </para>
<para> <para>
Native and foreign subwindows are no longer supported. These concepts were Native and foreign subwindows are no longer supported. These concepts were
@@ -314,15 +315,8 @@
doubles, and the _double variants have been removed. Update your doubles, and the _double variants have been removed. Update your
code accordingly. code accordingly.
</para> </para>
<para>
Any APIs that deal with global (or root) coordinates have been
removed in GTK4, since not all backends support them. You should
replace your use of such APIs with surface-relative equivalents.
Examples of this are gdk_surfae_get_origin(), gdk_surface_move()
or gdk_event_get_root_coords().
</para>
</section> </section>
<section> <section>
<title>Adapt to GdkKeymap API changes</title> <title>Adapt to GdkKeymap API changes</title>
<para> <para>
@@ -331,21 +325,6 @@
</para> </para>
</section> </section>
<section>
<title>Adapt to event controller API changes</title>
<para>
A few changes to the event controller and #GtkGesture APIs
did not make it back to GTK3, and have to be taken into account
when moving to GTK4. One is that the
#GtkEventControllerMotion::enter,
#GtkEventControllerMotion::leave,
#GtkEventControllerKey::focus-in and
#GtkEventControllerKey::focus-out signals
have gained new arguments. Another is that #GtkGestureMultiPress
has been renamed to #GtkGestureClick.
</para>
</section>
<section> <section>
<title>Stop using GtkEventBox</title> <title>Stop using GtkEventBox</title>
<para> <para>
@@ -692,7 +671,7 @@
<title>Adapt to changes in GtkOverlay API</title> <title>Adapt to changes in GtkOverlay API</title>
<para> <para>
The GtkOverlay::pass-through child property has been replaced by the The GtkOverlay::pass-through child property has been replaced by the
GtkWidget::can-pick property. Note that they have the opposite sense: GtkWidget::can-pick property. Note that they have the oppositve sense:
pass-through == !can-pick. pass-through == !can-pick.
</para> </para>
</section> </section>
@@ -777,42 +756,6 @@
instead. instead.
</para> </para>
</section> </section>
<section>
<title>GtkPopover::modal has been renamed to autohide</title>
<para>
The modal property has been renamed to autohide.
gtk-builder-tool can assist with the rename in ui files.
</para>
</section>
<section>
<title>gtk_widget_get_surface has been removed</title>
<para>
gtk_widget_get_surface() has been removed.
Use gtk_native_get_surface() in combination with
gtk_widget_get_native() instead.
</para>
</section>
<section>
<title>gtk_widget_is_toplevel has been removed</title>
<para>
gtk_widget_is_toplevel() has been removed.
Use GTK_IS_ROOT, GTK_IS_NATIVE or GTK_IS_WINDOW
instead, as appropriate.
</para>
</section>
<section>
<title>gtk_widget_get_toplevel has been removed</title>
<para>
gtk_widget_get_toplevel() has been removed.
Use gtk_widget_get_root() or gtk_widget_get_native()
instead, as appropriate.
</para>
</section>
</section> </section>
</chapter> </chapter>

View File

@@ -65,6 +65,15 @@ The X11 GDK backend can be influenced with some additional environment variables
</para> </para>
</formalpara> </formalpara>
<formalpara>
<title><envar>GDK_CORE_DEVICE_EVENTS</envar></title>
<para>
If set, GDK makes does not use the XInput extension, and only reacts
to core X input events.
</para>
</formalpara>
<formalpara> <formalpara>
<title><envar>GDK_SCALE</envar></title> <title><envar>GDK_SCALE</envar></title>

View File

@@ -1,21 +1,19 @@
if get_option('gtk_doc') glib_prefix = dependency('glib-2.0').get_pkgconfig_variable('prefix')
glib_prefix = dependency('glib-2.0').get_pkgconfig_variable('prefix') glib_docpath = join_paths(glib_prefix, 'share', 'gtk-doc', 'html')
glib_docpath = join_paths(glib_prefix, 'share', 'gtk-doc', 'html')
cairo_prefix = dependency('cairo-gobject').get_pkgconfig_variable('prefix') cairo_prefix = dependency('cairo-gobject').get_pkgconfig_variable('prefix')
cairo_docpath = join_paths(cairo_prefix, 'share', 'gtk-doc', 'html', 'cairo') cairo_docpath = join_paths(cairo_prefix, 'share', 'gtk-doc', 'html', 'cairo')
gdkpixbuf_prefix = dependency('gdk-pixbuf-2.0').get_pkgconfig_variable('prefix') gdkpixbuf_prefix = dependency('gdk-pixbuf-2.0').get_pkgconfig_variable('prefix')
gdkpixbuf_docpath = join_paths(gdkpixbuf_prefix, 'share', 'gtk-doc', 'html', 'gdk-pixbuf') gdkpixbuf_docpath = join_paths(gdkpixbuf_prefix, 'share', 'gtk-doc', 'html', 'gdk-pixbuf')
docpath = join_paths(gtk_datadir, 'gtk-doc', 'html') docpath = join_paths(gtk_datadir, 'gtk-doc', 'html')
version_conf = configuration_data() version_conf = configuration_data()
version_conf.set('GTK_VERSION', meson.project_version()) version_conf.set('GTK_VERSION', meson.project_version())
src_dir_conf = configuration_data() src_dir_conf = configuration_data()
src_dir_conf.set('SRC_DIR', meson.source_root()) src_dir_conf.set('SRC_DIR', meson.source_root())
endif
subdir('gdk') subdir('gdk')
subdir('gsk') subdir('gsk')

View File

@@ -1,4 +1,4 @@
if x11_enabled and get_option('gtk_doc') if x11_enabled
doc_shooter_sources = [ doc_shooter_sources = [
'shadow.c', 'shadow.c',
'shooter.c', 'shooter.c',

View File

@@ -235,7 +235,7 @@ shoot_one (WidgetInfo *info)
gtk_main_quit (); gtk_main_quit ();
} }
window = gtk_native_get_surface (GTK_NATIVE (info->window)); window = gtk_widget_get_surface (info->window);
id = gdk_x11_surface_get_xid (window); id = gdk_x11_surface_get_xid (window);
if (window_is_csd (window)) if (window_is_csd (window))
decor = (info->include_decorations) ? DECOR_NONE : DECOR_WINDOW_FRAME; decor = (info->include_decorations) ? DECOR_NONE : DECOR_WINDOW_FRAME;

View File

@@ -29,9 +29,9 @@ size_allocate_cb (GtkWidget *widget,
surface = NULL; surface = NULL;
} }
if (gtk_native_get_surface (gtk_widget_get_native (widget))) if (gtk_widget_get_surface (widget))
{ {
surface = gdk_surface_create_similar_surface (gtk_native_get_surface (gtk_widget_get_native (widget)), surface = gdk_surface_create_similar_surface (gtk_widget_get_surface (widget),
CAIRO_CONTENT_COLOR, CAIRO_CONTENT_COLOR,
gtk_widget_get_width (widget), gtk_widget_get_width (widget),
gtk_widget_get_height (widget)); gtk_widget_get_height (widget));
@@ -110,11 +110,11 @@ drag_end (GtkGestureDrag *gesture,
} }
static void static void
pressed (GtkGestureClick *gesture, pressed (GtkGestureMultiPress *gesture,
int n_press, int n_press,
double x, double x,
double y, double y,
GtkWidget *area) GtkWidget *area)
{ {
clear_surface (); clear_surface ();
gtk_widget_queue_draw (area); gtk_widget_queue_draw (area);
@@ -164,7 +164,7 @@ activate (GtkApplication *app,
g_signal_connect (drag, "drag-update", G_CALLBACK (drag_update), drawing_area); g_signal_connect (drag, "drag-update", G_CALLBACK (drag_update), drawing_area);
g_signal_connect (drag, "drag-end", G_CALLBACK (drag_end), drawing_area); g_signal_connect (drag, "drag-end", G_CALLBACK (drag_end), drawing_area);
press = gtk_gesture_click_new (); press = gtk_gesture_multi_press_new ();
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (press), GDK_BUTTON_SECONDARY); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (press), GDK_BUTTON_SECONDARY);
gtk_widget_add_controller (drawing_area, GTK_EVENT_CONTROLLER (press)); gtk_widget_add_controller (drawing_area, GTK_EVENT_CONTROLLER (press));

View File

@@ -20,7 +20,7 @@
#include "gdkdevice-broadway.h" #include "gdkdevice-broadway.h"
#include "gdksurfaceprivate.h" #include "gdksurface.h"
#include "gdkprivate-broadway.h" #include "gdkprivate-broadway.h"
static gboolean gdk_broadway_device_get_history (GdkDevice *device, static gboolean gdk_broadway_device_get_history (GdkDevice *device,
@@ -215,7 +215,7 @@ _gdk_broadway_surface_grab_check_destroy (GdkSurface *surface)
/* Make sure there is no lasting grab in this native surface */ /* Make sure there is no lasting grab in this native surface */
grab = _gdk_display_get_last_device_grab (display, d->data); grab = _gdk_display_get_last_device_grab (display, d->data);
if (grab && grab->surface == surface) if (grab && grab->native_surface == surface)
{ {
grab->serial_end = grab->serial_start; grab->serial_end = grab->serial_start;
grab->implicit_ungrab = TRUE; grab->implicit_ungrab = TRUE;
@@ -251,7 +251,7 @@ gdk_broadway_device_grab (GdkDevice *device,
{ {
/* Device is a pointer */ /* Device is a pointer */
return _gdk_broadway_server_grab_pointer (broadway_display->server, return _gdk_broadway_server_grab_pointer (broadway_display->server,
GDK_BROADWAY_SURFACE (surface)->id, GDK_SURFACE_IMPL_BROADWAY (surface->impl)->id,
owner_events, owner_events,
event_mask, event_mask,
time_); time_);

View File

@@ -95,10 +95,10 @@ _gdk_broadway_display_size_changed (GdkDisplay *display,
toplevels = broadway_display->toplevels; toplevels = broadway_display->toplevels;
for (l = toplevels; l != NULL; l = l->next) for (l = toplevels; l != NULL; l = l->next)
{ {
GdkBroadwaySurface *toplevel = l->data; GdkSurfaceImplBroadway *toplevel_impl = l->data;
if (toplevel->maximized) if (toplevel_impl->maximized)
gdk_surface_move_resize (GDK_SURFACE (toplevel), 0, 0, msg->width, msg->height); gdk_surface_move_resize (toplevel_impl->wrapper, 0, 0, msg->width, msg->height);
} }
} }
@@ -420,6 +420,7 @@ gdk_broadway_display_class_init (GdkBroadwayDisplayClass * class)
object_class->dispose = gdk_broadway_display_dispose; object_class->dispose = gdk_broadway_display_dispose;
object_class->finalize = gdk_broadway_display_finalize; object_class->finalize = gdk_broadway_display_finalize;
display_class->surface_type = GDK_TYPE_BROADWAY_SURFACE;
display_class->cairo_context_type = GDK_TYPE_BROADWAY_CAIRO_CONTEXT; display_class->cairo_context_type = GDK_TYPE_BROADWAY_CAIRO_CONTEXT;
display_class->get_name = gdk_broadway_display_get_name; display_class->get_name = gdk_broadway_display_get_name;
@@ -434,7 +435,7 @@ gdk_broadway_display_class_init (GdkBroadwayDisplayClass * class)
display_class->get_next_serial = gdk_broadway_display_get_next_serial; display_class->get_next_serial = gdk_broadway_display_get_next_serial;
display_class->notify_startup_complete = gdk_broadway_display_notify_startup_complete; display_class->notify_startup_complete = gdk_broadway_display_notify_startup_complete;
display_class->create_surface = _gdk_broadway_display_create_surface; display_class->create_surface_impl = _gdk_broadway_display_create_surface_impl;
display_class->get_keymap = _gdk_broadway_display_get_keymap; display_class->get_keymap = _gdk_broadway_display_get_keymap;
display_class->text_property_to_utf8_list = _gdk_broadway_display_text_property_to_utf8_list; display_class->text_property_to_utf8_list = _gdk_broadway_display_text_property_to_utf8_list;
display_class->utf8_to_string_target = _gdk_broadway_display_utf8_to_string_target; display_class->utf8_to_string_target = _gdk_broadway_display_utf8_to_string_target;

View File

@@ -26,7 +26,7 @@
#include "gdkdragprivate.h" #include "gdkdragprivate.h"
#include "gdksurfaceprivate.h" #include "gdkinternals.h"
#include "gdkproperty.h" #include "gdkproperty.h"
#include "gdkprivate-broadway.h" #include "gdkprivate-broadway.h"
#include "gdkinternals.h" #include "gdkinternals.h"
@@ -94,7 +94,7 @@ _gdk_broadway_surface_drag_begin (GdkSurface *surface,
GdkDrag *new_context; GdkDrag *new_context;
g_return_val_if_fail (surface != NULL, NULL); g_return_val_if_fail (surface != NULL, NULL);
g_return_val_if_fail (GDK_IS_BROADWAY_SURFACE (surface), NULL); g_return_val_if_fail (GDK_SURFACE_IS_BROADWAY (surface), NULL);
new_context = g_object_new (GDK_TYPE_BROADWAY_DRAG, new_context = g_object_new (GDK_TYPE_BROADWAY_DRAG,
"device", device, "device", device,

View File

@@ -20,7 +20,7 @@
#include "gdkeventsource.h" #include "gdkeventsource.h"
#include "gdkseat.h" #include "gdkseat.h"
#include "gdksurfaceprivate.h" #include "gdkinternals.h"
#include "gdkframeclockprivate.h" #include "gdkframeclockprivate.h"
#include <stdlib.h> #include <stdlib.h>
@@ -288,8 +288,6 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
surface->x = message->configure_notify.x; surface->x = message->configure_notify.x;
surface->y = message->configure_notify.y; surface->y = message->configure_notify.y;
gdk_broadway_surface_update_popups (surface);
event = gdk_event_new (GDK_CONFIGURE); event = gdk_event_new (GDK_CONFIGURE);
event->any.surface = g_object_ref (surface); event->any.surface = g_object_ref (surface);
event->configure.x = message->configure_notify.x; event->configure.x = message->configure_notify.x;

View File

@@ -68,7 +68,6 @@ void _gdk_broadway_roundtrip_notify (GdkSurface *surface,
void _gdk_broadway_surface_grab_check_destroy (GdkSurface *surface); void _gdk_broadway_surface_grab_check_destroy (GdkSurface *surface);
void _gdk_broadway_surface_grab_check_unmap (GdkSurface *surface, void _gdk_broadway_surface_grab_check_unmap (GdkSurface *surface,
gulong serial); gulong serial);
void gdk_broadway_surface_update_popups (GdkSurface *surface);
void _gdk_keymap_keys_changed (GdkDisplay *display); void _gdk_keymap_keys_changed (GdkDisplay *display);
gint _gdk_broadway_get_group_for_state (GdkDisplay *display, gint _gdk_broadway_get_group_for_state (GdkDisplay *display,
@@ -102,13 +101,10 @@ void _gdk_broadway_display_get_default_cursor_size (GdkDisplay *display,
void _gdk_broadway_display_get_maximal_cursor_size (GdkDisplay *display, void _gdk_broadway_display_get_maximal_cursor_size (GdkDisplay *display,
guint *width, guint *width,
guint *height); guint *height);
GdkSurface * _gdk_broadway_display_create_surface (GdkDisplay *display, void _gdk_broadway_display_create_surface_impl (GdkDisplay *display,
GdkSurfaceType surface_type, GdkSurface *surface,
GdkSurface *parent, GdkSurface *real_parent,
int x, GdkSurfaceAttr *attributes);
int y,
int width,
int height);
gint _gdk_broadway_display_text_property_to_utf8_list (GdkDisplay *display, gint _gdk_broadway_display_text_property_to_utf8_list (GdkDisplay *display,
GdkAtom encoding, GdkAtom encoding,
gint format, gint format,
@@ -130,4 +126,6 @@ void _gdk_broadway_surface_resize_surface (GdkSurface *surface);
void _gdk_broadway_cursor_update_theme (GdkCursor *cursor); void _gdk_broadway_cursor_update_theme (GdkCursor *cursor);
void _gdk_broadway_cursor_display_finalize (GdkDisplay *display); void _gdk_broadway_cursor_display_finalize (GdkDisplay *display);
#define GDK_SURFACE_IS_BROADWAY(win) (GDK_IS_SURFACE_IMPL_BROADWAY (((GdkSurface *)win)->impl))
#endif /* __GDK_PRIVATE_BROADWAY_H__ */ #endif /* __GDK_PRIVATE_BROADWAY_H__ */

View File

@@ -29,26 +29,51 @@
#include "gdkbroadwaydisplay.h" #include "gdkbroadwaydisplay.h"
#include "gdkdisplay.h" #include "gdkdisplay.h"
#include "gdksurfaceprivate.h" #include "gdksurface.h"
#include "gdksurfaceimpl.h"
#include "gdkdisplay-broadway.h" #include "gdkdisplay-broadway.h"
#include "gdkprivate-broadway.h" #include "gdkprivate-broadway.h"
#include "gdkinternals.h" #include "gdkinternals.h"
#include "gdkdeviceprivate.h" #include "gdkdeviceprivate.h"
#include "gdkeventsource.h" #include "gdkeventsource.h"
#include "gdktextureprivate.h" #include <gdk/gdktextureprivate.h>
#include "gdkframeclockidleprivate.h" #include <gdk/gdkframeclockprivate.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
/* Forward declarations */ /* Forward declarations */
static void gdk_broadway_surface_finalize (GObject *object); static void gdk_surface_impl_broadway_finalize (GObject *object);
#define SURFACE_IS_TOPLEVEL(surface) TRUE #define SURFACE_IS_TOPLEVEL(surface) \
(GDK_SURFACE_TYPE (surface) != GDK_SURFACE_CHILD)
struct _GdkBroadwaySurface {
GdkSurface parent;
};
struct _GdkBroadwaySurfaceClass {
GdkSurfaceClass parent_class;
};
G_DEFINE_TYPE (GdkBroadwaySurface, gdk_broadway_surface, GDK_TYPE_SURFACE) G_DEFINE_TYPE (GdkBroadwaySurface, gdk_broadway_surface, GDK_TYPE_SURFACE)
static void
gdk_broadway_surface_class_init (GdkBroadwaySurfaceClass *broadway_surface_class)
{
}
static void
gdk_broadway_surface_init (GdkBroadwaySurface *broadway_surface)
{
}
G_DEFINE_TYPE (GdkSurfaceImplBroadway,
gdk_surface_impl_broadway,
GDK_TYPE_SURFACE_IMPL)
/* We need to flush in an idle rather than AFTER_PAINT, as the clock /* We need to flush in an idle rather than AFTER_PAINT, as the clock
is frozen during e.g. surface resizes so the paint will not happen is frozen during e.g. surface resizes so the paint will not happen
and the surface resize request is never flushed. */ and the surface resize request is never flushed. */
@@ -59,23 +84,26 @@ queue_flush (GdkSurface *surface)
} }
static void static void
gdk_broadway_surface_init (GdkBroadwaySurface *impl) gdk_surface_impl_broadway_init (GdkSurfaceImplBroadway *impl)
{ {
} }
static void static void
gdk_broadway_surface_finalize (GObject *object) gdk_surface_impl_broadway_finalize (GObject *object)
{ {
GdkBroadwaySurface *impl; GdkSurface *wrapper;
GdkSurfaceImplBroadway *impl;
GdkBroadwayDisplay *broadway_display; GdkBroadwayDisplay *broadway_display;
g_return_if_fail (GDK_IS_BROADWAY_SURFACE (object)); g_return_if_fail (GDK_IS_SURFACE_IMPL_BROADWAY (object));
impl = GDK_BROADWAY_SURFACE (object); impl = GDK_SURFACE_IMPL_BROADWAY (object);
_gdk_broadway_surface_grab_check_destroy (GDK_SURFACE (impl)); wrapper = impl->wrapper;
broadway_display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (GDK_SURFACE (impl))); _gdk_broadway_surface_grab_check_destroy (wrapper);
broadway_display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (impl->wrapper));
g_hash_table_remove (broadway_display->id_ht, GINT_TO_POINTER(impl->id)); g_hash_table_remove (broadway_display->id_ht, GINT_TO_POINTER(impl->id));
@@ -84,7 +112,7 @@ gdk_broadway_surface_finalize (GObject *object)
broadway_display->toplevels = g_list_remove (broadway_display->toplevels, impl); broadway_display->toplevels = g_list_remove (broadway_display->toplevels, impl);
G_OBJECT_CLASS (gdk_broadway_surface_parent_class)->finalize (object); G_OBJECT_CLASS (gdk_surface_impl_broadway_parent_class)->finalize (object);
} }
static gboolean static gboolean
@@ -97,17 +125,17 @@ thaw_clock_cb (GdkFrameClock *clock)
void void
_gdk_broadway_roundtrip_notify (GdkSurface *surface, _gdk_broadway_roundtrip_notify (GdkSurface *surface,
guint32 tag, guint32 tag,
gboolean local_reply) gboolean local_reply)
{ {
GdkBroadwaySurface *impl = GDK_BROADWAY_SURFACE (surface); GdkSurfaceImplBroadway *impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
GdkFrameClock *clock = gdk_surface_get_frame_clock (surface); GdkFrameClock *clock = gdk_surface_get_frame_clock (surface);
GdkFrameTimings *timings; GdkFrameTimings *timings;
timings = gdk_frame_clock_get_timings (clock, impl->pending_frame_counter); timings = gdk_frame_clock_get_timings (clock, impl->pending_frame_counter);
impl->pending_frame_counter = 0; impl->pending_frame_counter = 0;
/* If there is no remote web client, rate limit update to once a second */ /* If there is no remove web client, rate limit update to once a second */
if (local_reply) if (local_reply)
g_timeout_add_seconds (1, (GSourceFunc)thaw_clock_cb, g_object_ref (clock)); g_timeout_add_seconds (1, (GSourceFunc)thaw_clock_cb, g_object_ref (clock));
else else
@@ -124,19 +152,16 @@ _gdk_broadway_roundtrip_notify (GdkSurface *surface,
#ifdef G_ENABLE_DEBUG #ifdef G_ENABLE_DEBUG
if ((_gdk_debug_flags & GDK_DEBUG_FRAMES) != 0) if ((_gdk_debug_flags & GDK_DEBUG_FRAMES) != 0)
_gdk_frame_clock_debug_print_timings (clock, timings); _gdk_frame_clock_debug_print_timings (clock, timings);
if (gdk_profiler_is_running ())
_gdk_frame_clock_add_timings_to_profiler (clock, timings);
#endif #endif
} }
} }
static void static void
on_frame_clock_after_paint (GdkFrameClock *clock, on_frame_clock_after_paint (GdkFrameClock *clock,
GdkSurface *surface) GdkSurface *surface)
{ {
GdkDisplay *display = gdk_surface_get_display (surface); GdkDisplay *display = gdk_surface_get_display (surface);
GdkBroadwaySurface *impl = GDK_BROADWAY_SURFACE (surface); GdkSurfaceImplBroadway *impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
GdkBroadwayDisplay *broadway_display; GdkBroadwayDisplay *broadway_display;
impl->pending_frame_counter = gdk_frame_clock_get_frame_counter (clock); impl->pending_frame_counter = gdk_frame_clock_get_frame_counter (clock);
@@ -151,7 +176,7 @@ on_frame_clock_after_paint (GdkFrameClock *clock,
static void static void
on_frame_clock_before_paint (GdkFrameClock *clock, on_frame_clock_before_paint (GdkFrameClock *clock,
GdkSurface *surface) GdkSurface *surface)
{ {
GdkFrameTimings *timings = gdk_frame_clock_get_current_timings (clock); GdkFrameTimings *timings = gdk_frame_clock_get_current_timings (clock);
gint64 presentation_time; gint64 presentation_time;
@@ -176,58 +201,30 @@ on_frame_clock_before_paint (GdkFrameClock *clock,
static void static void
connect_frame_clock (GdkSurface *surface) connect_frame_clock (GdkSurface *surface)
{ {
GdkFrameClock *frame_clock = gdk_surface_get_frame_clock (surface); if (SURFACE_IS_TOPLEVEL (surface))
{
GdkFrameClock *frame_clock = gdk_surface_get_frame_clock (surface);
g_signal_connect (frame_clock, "before-paint", g_signal_connect (frame_clock, "before-paint",
G_CALLBACK (on_frame_clock_before_paint), surface); G_CALLBACK (on_frame_clock_before_paint), surface);
g_signal_connect (frame_clock, "after-paint", g_signal_connect (frame_clock, "after-paint",
G_CALLBACK (on_frame_clock_after_paint), surface); G_CALLBACK (on_frame_clock_after_paint), surface);
}
} }
static void void
disconnect_frame_clock (GdkSurface *surface) _gdk_broadway_display_create_surface_impl (GdkDisplay *display,
{ GdkSurface *surface,
GdkFrameClock *frame_clock = gdk_surface_get_frame_clock (surface); GdkSurface *real_parent,
GdkSurfaceAttr *attributes)
g_signal_handlers_disconnect_by_func (frame_clock,
on_frame_clock_before_paint, surface);
g_signal_handlers_disconnect_by_func (frame_clock,
on_frame_clock_after_paint, surface);
}
GdkSurface *
_gdk_broadway_display_create_surface (GdkDisplay *display,
GdkSurfaceType surface_type,
GdkSurface *parent,
int x,
int y,
int width,
int height)
{ {
GdkSurfaceImplBroadway *impl;
GdkBroadwayDisplay *broadway_display; GdkBroadwayDisplay *broadway_display;
GdkFrameClock *frame_clock;
GdkSurface *surface;
GdkBroadwaySurface *impl;
frame_clock = _gdk_frame_clock_idle_new ();
surface = g_object_new (GDK_TYPE_BROADWAY_SURFACE,
"surface-type", surface_type,
"display", display,
"frame-clock", frame_clock,
NULL);
g_object_unref (frame_clock);
surface->parent = parent;
surface->x = x;
surface->y = y;
surface->width = width;
surface->height = height;
broadway_display = GDK_BROADWAY_DISPLAY (display); broadway_display = GDK_BROADWAY_DISPLAY (display);
impl = GDK_BROADWAY_SURFACE (surface); impl = g_object_new (GDK_TYPE_SURFACE_IMPL_BROADWAY, NULL);
surface->impl = (GdkSurfaceImpl *)impl;
impl->id = _gdk_broadway_server_new_surface (broadway_display->server, impl->id = _gdk_broadway_server_new_surface (broadway_display->server,
surface->x, surface->x,
surface->y, surface->y,
@@ -235,20 +232,24 @@ _gdk_broadway_display_create_surface (GdkDisplay *display,
surface->height, surface->height,
surface->surface_type == GDK_SURFACE_TEMP); surface->surface_type == GDK_SURFACE_TEMP);
g_hash_table_insert (broadway_display->id_ht, GINT_TO_POINTER(impl->id), surface); g_hash_table_insert (broadway_display->id_ht, GINT_TO_POINTER(impl->id), surface);
impl->wrapper = surface;
if (!surface->parent) g_assert (surface->surface_type == GDK_SURFACE_TOPLEVEL ||
broadway_display->toplevels = g_list_prepend (broadway_display->toplevels, impl); surface->surface_type == GDK_SURFACE_TEMP);
g_assert (surface->parent == NULL);
broadway_display->toplevels = g_list_prepend (broadway_display->toplevels, impl);
connect_frame_clock (surface); connect_frame_clock (surface);
return surface;
} }
static cairo_surface_t * static cairo_surface_t *
gdk_broadway_surface_ref_cairo_surface (GdkSurface *surface) gdk_surface_broadway_ref_cairo_surface (GdkSurface *surface)
{ {
if (GDK_IS_BROADWAY_SURFACE (surface) && GdkSurfaceImplBroadway *impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
GDK_SURFACE_DESTROYED (surface))
if (GDK_IS_SURFACE_IMPL_BROADWAY (surface) &&
GDK_SURFACE_DESTROYED (impl->wrapper))
return NULL; return NULL;
return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
@@ -256,16 +257,15 @@ gdk_broadway_surface_ref_cairo_surface (GdkSurface *surface)
static void static void
_gdk_broadway_surface_destroy (GdkSurface *surface, _gdk_broadway_surface_destroy (GdkSurface *surface,
gboolean foreign_destroy) gboolean recursing,
gboolean foreign_destroy)
{ {
GdkBroadwaySurface *impl; GdkSurfaceImplBroadway *impl;
GdkBroadwayDisplay *broadway_display; GdkBroadwayDisplay *broadway_display;
g_return_if_fail (GDK_IS_SURFACE (surface)); g_return_if_fail (GDK_IS_SURFACE (surface));
impl = GDK_BROADWAY_SURFACE (surface); impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
disconnect_frame_clock (surface);
if (impl->node_data) if (impl->node_data)
g_array_unref (impl->node_data); g_array_unref (impl->node_data);
@@ -283,15 +283,15 @@ _gdk_broadway_surface_destroy (GdkSurface *surface,
void void
gdk_broadway_surface_set_nodes (GdkSurface *surface, gdk_broadway_surface_set_nodes (GdkSurface *surface,
GArray *nodes, GArray *nodes,
GPtrArray *node_textures) GPtrArray *node_textures)
{ {
GdkBroadwaySurface *impl; GdkSurfaceImplBroadway *impl;
GdkBroadwayDisplay *broadway_display; GdkBroadwayDisplay *broadway_display;
g_return_if_fail (GDK_IS_SURFACE (surface)); g_return_if_fail (GDK_IS_SURFACE (surface));
impl = GDK_BROADWAY_SURFACE (surface); impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
broadway_display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (surface)); broadway_display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (surface));
@@ -322,13 +322,13 @@ gdk_broadway_surface_destroy_notify (GdkSurface *surface)
} }
static void static void
gdk_broadway_surface_show (GdkSurface *surface, gdk_surface_broadway_show (GdkSurface *surface,
gboolean already_mapped) gboolean already_mapped)
{ {
GdkBroadwaySurface *impl; GdkSurfaceImplBroadway *impl;
GdkBroadwayDisplay *broadway_display; GdkBroadwayDisplay *broadway_display;
impl = GDK_BROADWAY_SURFACE (surface); impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
impl->visible = TRUE; impl->visible = TRUE;
/* FIXME: update state ? */ /* FIXME: update state ? */
@@ -340,12 +340,12 @@ gdk_broadway_surface_show (GdkSurface *surface,
} }
static void static void
gdk_broadway_surface_hide (GdkSurface *surface) gdk_surface_broadway_hide (GdkSurface *surface)
{ {
GdkBroadwaySurface *impl; GdkSurfaceImplBroadway *impl;
GdkBroadwayDisplay *broadway_display; GdkBroadwayDisplay *broadway_display;
impl = GDK_BROADWAY_SURFACE (surface); impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
impl->visible = FALSE; impl->visible = FALSE;
/* FIXME: update state ? */ /* FIXME: update state ? */
@@ -362,20 +362,20 @@ gdk_broadway_surface_hide (GdkSurface *surface)
} }
static void static void
gdk_broadway_surface_withdraw (GdkSurface *surface) gdk_surface_broadway_withdraw (GdkSurface *surface)
{ {
gdk_broadway_surface_hide (surface); gdk_surface_broadway_hide (surface);
} }
static void static void
gdk_broadway_surface_move_resize (GdkSurface *surface, gdk_surface_broadway_move_resize (GdkSurface *surface,
gboolean with_move, gboolean with_move,
gint x, gint x,
gint y, gint y,
gint width, gint width,
gint height) gint height)
{ {
GdkBroadwaySurface *impl = GDK_BROADWAY_SURFACE (surface); GdkSurfaceImplBroadway *impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
GdkBroadwayDisplay *broadway_display; GdkBroadwayDisplay *broadway_display;
gboolean size_changed; gboolean size_changed;
@@ -405,12 +405,6 @@ gdk_broadway_surface_move_resize (GdkSurface *surface,
} }
} }
if (surface->parent)
{
impl->offset_x = x - surface->parent->x;
impl->offset_y = y - surface->parent->y;
}
_gdk_broadway_server_surface_move_resize (broadway_display->server, _gdk_broadway_server_surface_move_resize (broadway_display->server,
impl->id, impl->id,
with_move, with_move,
@@ -425,19 +419,19 @@ gdk_broadway_surface_move_resize (GdkSurface *surface,
} }
static void static void
gdk_broadway_surface_raise (GdkSurface *surface) gdk_surface_broadway_raise (GdkSurface *surface)
{ {
} }
static void static void
gdk_broadway_surface_restack_toplevel (GdkSurface *surface, gdk_surface_broadway_restack_toplevel (GdkSurface *surface,
GdkSurface *sibling, GdkSurface *sibling,
gboolean above) gboolean above)
{ {
} }
static void static void
gdk_broadway_surface_lower (GdkSurface *surface) gdk_surface_broadway_lower (GdkSurface *surface)
{ {
} }
@@ -446,7 +440,7 @@ static void
gdk_broadway_surface_focus (GdkSurface *surface, gdk_broadway_surface_focus (GdkSurface *surface,
guint32 timestamp) guint32 timestamp)
{ {
GdkBroadwaySurface *impl; GdkSurfaceImplBroadway *impl;
GdkBroadwayDisplay *broadway_display; GdkBroadwayDisplay *broadway_display;
g_return_if_fail (GDK_IS_SURFACE (surface)); g_return_if_fail (GDK_IS_SURFACE (surface));
@@ -455,7 +449,7 @@ gdk_broadway_surface_focus (GdkSurface *surface,
!surface->accept_focus) !surface->accept_focus)
return; return;
impl = GDK_BROADWAY_SURFACE (surface); impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
broadway_display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (surface)); broadway_display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (surface));
_gdk_broadway_server_surface_focus (broadway_display->server, _gdk_broadway_server_surface_focus (broadway_display->server,
impl->id); impl->id);
@@ -480,26 +474,26 @@ gdk_broadway_surface_set_modal_hint (GdkSurface *surface,
} }
static void static void
gdk_broadway_surface_set_geometry_hints (GdkSurface *surface, gdk_broadway_surface_set_geometry_hints (GdkSurface *surface,
const GdkGeometry *geometry, const GdkGeometry *geometry,
GdkSurfaceHints geom_mask) GdkSurfaceHints geom_mask)
{ {
GdkBroadwaySurface *impl; GdkSurfaceImplBroadway *impl;
impl = GDK_BROADWAY_SURFACE (surface); impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
impl->geometry_hints = *geometry; impl->geometry_hints = *geometry;
impl->geometry_hints_mask = geom_mask; impl->geometry_hints_mask = geom_mask;
} }
static void static void
gdk_broadway_surface_set_title (GdkSurface *surface, gdk_broadway_surface_set_title (GdkSurface *surface,
const gchar *title) const gchar *title)
{ {
} }
static void static void
gdk_broadway_surface_set_startup_id (GdkSurface *surface, gdk_broadway_surface_set_startup_id (GdkSurface *surface,
const gchar *startup_id) const gchar *startup_id)
{ {
} }
@@ -509,58 +503,80 @@ gdk_broadway_surface_set_transient_for (GdkSurface *surface,
GdkSurface *parent) GdkSurface *parent)
{ {
GdkBroadwayDisplay *display; GdkBroadwayDisplay *display;
GdkBroadwaySurface *impl; GdkSurfaceImplBroadway *impl;
int parent_id; int parent_id;
impl = GDK_BROADWAY_SURFACE (surface); impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
parent_id = 0; parent_id = 0;
if (parent) if (parent)
parent_id = GDK_BROADWAY_SURFACE (parent)->id; parent_id = GDK_SURFACE_IMPL_BROADWAY (parent->impl)->id;
impl->transient_for = parent_id; impl->transient_for = parent_id;
display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (surface)); display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (impl->wrapper));
_gdk_broadway_server_surface_set_transient_for (display->server, impl->id, impl->transient_for); _gdk_broadway_server_surface_set_transient_for (display->server, impl->id, impl->transient_for);
} }
static void static void
gdk_broadway_surface_get_geometry (GdkSurface *surface, gdk_surface_broadway_get_geometry (GdkSurface *surface,
gint *x, gint *x,
gint *y, gint *y,
gint *width, gint *width,
gint *height) gint *height)
{ {
GdkSurfaceImplBroadway *impl;
g_return_if_fail (GDK_IS_SURFACE (surface)); g_return_if_fail (GDK_IS_SURFACE (surface));
impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
/* TODO: These should really roundtrip to the client to get the current data */ /* TODO: These should really roundtrip to the client to get the current data */
if (x) if (x)
*x = surface->x; *x = impl->wrapper->x;
if (y) if (y)
*y = surface->y; *y = impl->wrapper->y;
if (width) if (width)
*width = surface->width; *width = impl->wrapper->width;
if (height) if (height)
*height = surface->height; *height = impl->wrapper->height;
} }
static void static void
gdk_broadway_surface_get_root_coords (GdkSurface *surface, gdk_surface_broadway_get_root_coords (GdkSurface *surface,
gint x, gint x,
gint y, gint y,
gint *root_x, gint *root_x,
gint *root_y) gint *root_y)
{ {
GdkSurfaceImplBroadway *impl;
impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
if (root_x) if (root_x)
*root_x = x + surface->x; *root_x = x + impl->wrapper->x;
if (root_y) if (root_y)
*root_y = y + surface->y; *root_y = y + impl->wrapper->y;
}
static void
gdk_broadway_surface_get_frame_extents (GdkSurface *surface,
GdkRectangle *rect)
{
g_return_if_fail (rect != NULL);
/* TODO: This should take wm frame into account */
rect->x = surface->x;
rect->y = surface->y;
rect->width = surface->width;
rect->height = surface->height;
} }
static gboolean static gboolean
gdk_broadway_surface_get_device_state (GdkSurface *surface, gdk_surface_broadway_get_device_state (GdkSurface *surface,
GdkDevice *device, GdkDevice *device,
gdouble *x, gdouble *x,
gdouble *y, gdouble *y,
@@ -581,7 +597,7 @@ gdk_broadway_surface_get_device_state (GdkSurface *surface,
} }
static void static void
gdk_broadway_surface_input_shape_combine_region (GdkSurface *surface, gdk_surface_broadway_input_shape_combine_region (GdkSurface *surface,
const cairo_region_t *shape_region, const cairo_region_t *shape_region,
gint offset_x, gint offset_x,
gint offset_y) gint offset_y)
@@ -668,7 +684,7 @@ gdk_broadway_surface_unstick (GdkSurface *surface)
static void static void
gdk_broadway_surface_maximize (GdkSurface *surface) gdk_broadway_surface_maximize (GdkSurface *surface)
{ {
GdkBroadwaySurface *impl; GdkSurfaceImplBroadway *impl;
GdkDisplay *display; GdkDisplay *display;
GdkMonitor *monitor; GdkMonitor *monitor;
GdkRectangle geom; GdkRectangle geom;
@@ -677,7 +693,7 @@ gdk_broadway_surface_maximize (GdkSurface *surface)
!SURFACE_IS_TOPLEVEL (surface)) !SURFACE_IS_TOPLEVEL (surface))
return; return;
impl = GDK_BROADWAY_SURFACE (surface); impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
if (impl->maximized) if (impl->maximized)
return; return;
@@ -703,13 +719,13 @@ gdk_broadway_surface_maximize (GdkSurface *surface)
static void static void
gdk_broadway_surface_unmaximize (GdkSurface *surface) gdk_broadway_surface_unmaximize (GdkSurface *surface)
{ {
GdkBroadwaySurface *impl; GdkSurfaceImplBroadway *impl;
if (GDK_SURFACE_DESTROYED (surface) || if (GDK_SURFACE_DESTROYED (surface) ||
!SURFACE_IS_TOPLEVEL (surface)) !SURFACE_IS_TOPLEVEL (surface))
return; return;
impl = GDK_BROADWAY_SURFACE (surface); impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
if (!impl->maximized) if (!impl->maximized)
return; return;
@@ -800,24 +816,6 @@ gdk_broadway_surface_set_functions (GdkSurface *surface,
return; return;
} }
void
gdk_broadway_surface_update_popups (GdkSurface *parent)
{
GList *l;
for (l = parent ->children; l; l = l->next)
{
GdkBroadwaySurface *popup_impl = l->data;
GdkSurface *popup = GDK_SURFACE (popup_impl);
int new_x = parent->x + popup_impl->offset_x;
int new_y = parent->y + popup_impl->offset_y;
if (new_x != popup->x || new_y != popup->y)
gdk_broadway_surface_move_resize (popup, TRUE, new_x, new_y, popup->width, popup->height);
gdk_broadway_surface_restack_toplevel (popup, parent, TRUE);
}
}
typedef struct _MoveResizeData MoveResizeData; typedef struct _MoveResizeData MoveResizeData;
struct _MoveResizeData struct _MoveResizeData
@@ -1082,11 +1080,10 @@ create_moveresize_surface (MoveResizeData *mv_resize,
GdkGrabStatus status; GdkGrabStatus status;
GdkSeat *seat; GdkSeat *seat;
GdkDevice *pointer; GdkDevice *pointer;
GdkRectangle rect = { -100, -100, 1, 1 };
g_assert (mv_resize->moveresize_emulation_surface == NULL); g_assert (mv_resize->moveresize_emulation_surface == NULL);
mv_resize->moveresize_emulation_surface = gdk_surface_new_temp (mv_resize->display, &rect); mv_resize->moveresize_emulation_surface = gdk_surface_new_temp (mv_resize->display);
gdk_surface_show (mv_resize->moveresize_emulation_surface); gdk_surface_show (mv_resize->moveresize_emulation_surface);
@@ -1118,7 +1115,8 @@ create_moveresize_surface (MoveResizeData *mv_resize,
static void static void
calculate_unmoving_origin (MoveResizeData *mv_resize) calculate_unmoving_origin (MoveResizeData *mv_resize)
{ {
gint x, y, width, height; GdkRectangle rect;
gint width, height;
if (mv_resize->moveresize_geom_mask & GDK_HINT_WIN_GRAVITY && if (mv_resize->moveresize_geom_mask & GDK_HINT_WIN_GRAVITY &&
mv_resize->moveresize_geometry.win_gravity == GDK_GRAVITY_STATIC) mv_resize->moveresize_geometry.win_gravity == GDK_GRAVITY_STATIC)
@@ -1129,51 +1127,52 @@ calculate_unmoving_origin (MoveResizeData *mv_resize)
} }
else else
{ {
gdk_surface_get_frame_extents (mv_resize->moveresize_surface, &rect);
gdk_surface_get_geometry (mv_resize->moveresize_surface, gdk_surface_get_geometry (mv_resize->moveresize_surface,
&x, &y, &width, &height); NULL, NULL, &width, &height);
switch (mv_resize->moveresize_geometry.win_gravity) switch (mv_resize->moveresize_geometry.win_gravity)
{ {
case GDK_GRAVITY_NORTH_WEST: case GDK_GRAVITY_NORTH_WEST:
mv_resize->moveresize_orig_x = x; mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = y; mv_resize->moveresize_orig_y = rect.y;
break; break;
case GDK_GRAVITY_NORTH: case GDK_GRAVITY_NORTH:
mv_resize->moveresize_orig_x = x + width / 2; mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
mv_resize->moveresize_orig_y = y; mv_resize->moveresize_orig_y = rect.y;
break; break;
case GDK_GRAVITY_NORTH_EAST: case GDK_GRAVITY_NORTH_EAST:
mv_resize->moveresize_orig_x = x = width; mv_resize->moveresize_orig_x = rect.x + rect.width - width;
mv_resize->moveresize_orig_y = y; mv_resize->moveresize_orig_y = rect.y;
break; break;
case GDK_GRAVITY_WEST: case GDK_GRAVITY_WEST:
mv_resize->moveresize_orig_x = x; mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = y + height / 2; mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
break; break;
case GDK_GRAVITY_CENTER: case GDK_GRAVITY_CENTER:
mv_resize->moveresize_orig_x = x + width / 2; mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
mv_resize->moveresize_orig_y = y + height / 2; mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
break; break;
case GDK_GRAVITY_EAST: case GDK_GRAVITY_EAST:
mv_resize->moveresize_orig_x = x + width; mv_resize->moveresize_orig_x = rect.x + rect.width - width;
mv_resize->moveresize_orig_y = y + height / 2; mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
break; break;
case GDK_GRAVITY_SOUTH_WEST: case GDK_GRAVITY_SOUTH_WEST:
mv_resize->moveresize_orig_x = x + width; mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = y + height; mv_resize->moveresize_orig_y = rect.y + rect.height - height;
break; break;
case GDK_GRAVITY_SOUTH: case GDK_GRAVITY_SOUTH:
mv_resize->moveresize_orig_x = x + width / 2; mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
mv_resize->moveresize_orig_y = y + height; mv_resize->moveresize_orig_y = rect.y + rect.height - height;
break; break;
case GDK_GRAVITY_SOUTH_EAST: case GDK_GRAVITY_SOUTH_EAST:
mv_resize->moveresize_orig_x = x; mv_resize->moveresize_orig_x = rect.x + rect.width - width;
mv_resize->moveresize_orig_y = y + height; mv_resize->moveresize_orig_y = rect.y + rect.height - height;
break; break;
case GDK_GRAVITY_STATIC: case GDK_GRAVITY_STATIC:
default: default:
mv_resize->moveresize_orig_x = x; mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = y; mv_resize->moveresize_orig_y = rect.y;
break; break;
} }
} }
@@ -1189,9 +1188,9 @@ gdk_broadway_surface_begin_resize_drag (GdkSurface *surface,
guint32 timestamp) guint32 timestamp)
{ {
MoveResizeData *mv_resize; MoveResizeData *mv_resize;
GdkBroadwaySurface *impl; GdkSurfaceImplBroadway *impl;
impl = GDK_BROADWAY_SURFACE (surface); impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
if (GDK_SURFACE_DESTROYED (surface) || if (GDK_SURFACE_DESTROYED (surface) ||
!SURFACE_IS_TOPLEVEL (surface)) !SURFACE_IS_TOPLEVEL (surface))
@@ -1208,8 +1207,8 @@ gdk_broadway_surface_begin_resize_drag (GdkSurface *surface,
mv_resize->is_resize = TRUE; mv_resize->is_resize = TRUE;
mv_resize->moveresize_button = button; mv_resize->moveresize_button = button;
mv_resize->resize_edge = edge; mv_resize->resize_edge = edge;
mv_resize->moveresize_x = x + surface->x; mv_resize->moveresize_x = x + impl->wrapper->x;
mv_resize->moveresize_y = y + surface->y; mv_resize->moveresize_y = y + impl->wrapper->y;
mv_resize->moveresize_surface = g_object_ref (surface); mv_resize->moveresize_surface = g_object_ref (surface);
mv_resize->moveresize_orig_width = gdk_surface_get_width (surface); mv_resize->moveresize_orig_width = gdk_surface_get_width (surface);
@@ -1232,9 +1231,9 @@ gdk_broadway_surface_begin_move_drag (GdkSurface *surface,
guint32 timestamp) guint32 timestamp)
{ {
MoveResizeData *mv_resize; MoveResizeData *mv_resize;
GdkBroadwaySurface *impl; GdkSurfaceImplBroadway *impl;
impl = GDK_BROADWAY_SURFACE (surface); impl = GDK_SURFACE_IMPL_BROADWAY (surface->impl);
if (GDK_SURFACE_DESTROYED (surface) || if (GDK_SURFACE_DESTROYED (surface) ||
!SURFACE_IS_TOPLEVEL (surface)) !SURFACE_IS_TOPLEVEL (surface))
@@ -1250,8 +1249,8 @@ gdk_broadway_surface_begin_move_drag (GdkSurface *surface,
mv_resize->is_resize = FALSE; mv_resize->is_resize = FALSE;
mv_resize->moveresize_button = button; mv_resize->moveresize_button = button;
mv_resize->moveresize_x = x + surface->x; mv_resize->moveresize_x = x + impl->wrapper->x;
mv_resize->moveresize_y = y + surface->y; mv_resize->moveresize_y = y + impl->wrapper->y;
mv_resize->moveresize_surface = g_object_ref (surface); mv_resize->moveresize_surface = g_object_ref (surface);
mv_resize->moveresize_orig_width = gdk_surface_get_width (surface); mv_resize->moveresize_orig_width = gdk_surface_get_width (surface);
@@ -1297,25 +1296,25 @@ gdk_broadway_get_last_seen_time (GdkSurface *surface)
} }
static void static void
gdk_broadway_surface_class_init (GdkBroadwaySurfaceClass *klass) gdk_surface_impl_broadway_class_init (GdkSurfaceImplBroadwayClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
GdkSurfaceClass *impl_class = GDK_SURFACE_CLASS (klass); GdkSurfaceImplClass *impl_class = GDK_SURFACE_IMPL_CLASS (klass);
object_class->finalize = gdk_broadway_surface_finalize; object_class->finalize = gdk_surface_impl_broadway_finalize;
impl_class->ref_cairo_surface = gdk_broadway_surface_ref_cairo_surface; impl_class->ref_cairo_surface = gdk_surface_broadway_ref_cairo_surface;
impl_class->show = gdk_broadway_surface_show; impl_class->show = gdk_surface_broadway_show;
impl_class->hide = gdk_broadway_surface_hide; impl_class->hide = gdk_surface_broadway_hide;
impl_class->withdraw = gdk_broadway_surface_withdraw; impl_class->withdraw = gdk_surface_broadway_withdraw;
impl_class->raise = gdk_broadway_surface_raise; impl_class->raise = gdk_surface_broadway_raise;
impl_class->lower = gdk_broadway_surface_lower; impl_class->lower = gdk_surface_broadway_lower;
impl_class->restack_toplevel = gdk_broadway_surface_restack_toplevel; impl_class->restack_toplevel = gdk_surface_broadway_restack_toplevel;
impl_class->move_resize = gdk_broadway_surface_move_resize; impl_class->move_resize = gdk_surface_broadway_move_resize;
impl_class->get_geometry = gdk_broadway_surface_get_geometry; impl_class->get_geometry = gdk_surface_broadway_get_geometry;
impl_class->get_root_coords = gdk_broadway_surface_get_root_coords; impl_class->get_root_coords = gdk_surface_broadway_get_root_coords;
impl_class->get_device_state = gdk_broadway_surface_get_device_state; impl_class->get_device_state = gdk_surface_broadway_get_device_state;
impl_class->input_shape_combine_region = gdk_broadway_surface_input_shape_combine_region; impl_class->input_shape_combine_region = gdk_surface_broadway_input_shape_combine_region;
impl_class->destroy = _gdk_broadway_surface_destroy; impl_class->destroy = _gdk_broadway_surface_destroy;
impl_class->beep = gdk_broadway_surface_beep; impl_class->beep = gdk_broadway_surface_beep;
@@ -1327,6 +1326,7 @@ gdk_broadway_surface_class_init (GdkBroadwaySurfaceClass *klass)
impl_class->set_title = gdk_broadway_surface_set_title; impl_class->set_title = gdk_broadway_surface_set_title;
impl_class->set_startup_id = gdk_broadway_surface_set_startup_id; impl_class->set_startup_id = gdk_broadway_surface_set_startup_id;
impl_class->set_transient_for = gdk_broadway_surface_set_transient_for; impl_class->set_transient_for = gdk_broadway_surface_set_transient_for;
impl_class->get_frame_extents = gdk_broadway_surface_get_frame_extents;
impl_class->set_accept_focus = gdk_broadway_surface_set_accept_focus; impl_class->set_accept_focus = gdk_broadway_surface_set_accept_focus;
impl_class->set_focus_on_map = gdk_broadway_surface_set_focus_on_map; impl_class->set_focus_on_map = gdk_broadway_surface_set_focus_on_map;
impl_class->set_icon_list = gdk_broadway_surface_set_icon_list; impl_class->set_icon_list = gdk_broadway_surface_set_icon_list;

View File

@@ -25,17 +25,28 @@
#ifndef __GDK_SURFACE_BROADWAY_H__ #ifndef __GDK_SURFACE_BROADWAY_H__
#define __GDK_SURFACE_BROADWAY_H__ #define __GDK_SURFACE_BROADWAY_H__
#include <gdk/gdksurfaceprivate.h> #include <gdk/gdksurfaceimpl.h>
#include "gdkbroadwaysurface.h"
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GdkSurfaceImplBroadway GdkSurfaceImplBroadway;
typedef struct _GdkSurfaceImplBroadwayClass GdkSurfaceImplBroadwayClass;
/* Surface implementation for Broadway /* Surface implementation for Broadway
*/ */
struct _GdkBroadwaySurface #define GDK_TYPE_SURFACE_IMPL_BROADWAY (gdk_surface_impl_broadway_get_type ())
#define GDK_SURFACE_IMPL_BROADWAY(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_SURFACE_IMPL_BROADWAY, GdkSurfaceImplBroadway))
#define GDK_SURFACE_IMPL_BROADWAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_SURFACE_IMPL_BROADWAY, GdkSurfaceImplBroadwayClass))
#define GDK_IS_SURFACE_IMPL_BROADWAY(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_SURFACE_IMPL_BROADWAY))
#define GDK_IS_SURFACE_IMPL_BROADWAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_SURFACE_IMPL_BROADWAY))
#define GDK_SURFACE_IMPL_BROADWAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_SURFACE_IMPL_BROADWAY, GdkSurfaceImplBroadwayClass))
struct _GdkSurfaceImplBroadway
{ {
GdkSurface parent_instance; GdkSurfaceImpl parent_instance;
GdkSurface *wrapper;
GdkCursor *cursor; GdkCursor *cursor;
@@ -60,17 +71,14 @@ struct _GdkBroadwaySurface
GArray *node_data; GArray *node_data;
GPtrArray *node_data_textures; GPtrArray *node_data_textures;
int offset_x;
int offset_y;
}; };
struct _GdkBroadwaySurfaceClass struct _GdkSurfaceImplBroadwayClass
{ {
GdkSurfaceClass parent_class; GdkSurfaceImplClass parent_class;
}; };
GType gdk_surface_broadway_get_type (void); GType gdk_surface_impl_broadway_get_type (void);
G_END_DECLS G_END_DECLS

View File

@@ -0,0 +1,224 @@
/* sp-capture-types.h
*
* Copyright © 2016 Christian Hergert <chergert@redhat.com>
*
* This file is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SP_CAPTURE_FORMAT_H
#define SP_CAPTURE_FORMAT_H
#include <glib.h>
#ifndef SP_DISABLE_GOBJECT
# include <glib-object.h>
#endif
#include "sp-clock.h"
G_BEGIN_DECLS
#define SP_CAPTURE_MAGIC (GUINT32_TO_LE(0xFDCA975E))
#define SP_CAPTURE_ALIGN (sizeof(SpCaptureAddress))
#if __WORDSIZE == 64
# define SP_CAPTURE_JITMAP_MARK G_GUINT64_CONSTANT(0xE000000000000000)
# define SP_CAPTURE_ADDRESS_FORMAT "0x%016lx"
#else
# define SP_CAPTURE_JITMAP_MARK G_GUINT64_CONSTANT(0xE0000000)
# define SP_CAPTURE_ADDRESS_FORMAT "0x%016llx"
#endif
#define SP_CAPTURE_CURRENT_TIME (sp_clock_get_current_time())
#define SP_CAPTURE_COUNTER_INT64 0
#define SP_CAPTURE_COUNTER_DOUBLE 1
typedef struct _SpCaptureReader SpCaptureReader;
typedef struct _SpCaptureWriter SpCaptureWriter;
typedef struct _SpCaptureCursor SpCaptureCursor;
typedef struct _SpCaptureCondition SpCaptureCondition;
typedef guint64 SpCaptureAddress;
typedef union
{
gint64 v64;
gdouble vdbl;
} SpCaptureCounterValue;
typedef enum
{
SP_CAPTURE_FRAME_TIMESTAMP = 1,
SP_CAPTURE_FRAME_SAMPLE = 2,
SP_CAPTURE_FRAME_MAP = 3,
SP_CAPTURE_FRAME_PROCESS = 4,
SP_CAPTURE_FRAME_FORK = 5,
SP_CAPTURE_FRAME_EXIT = 6,
SP_CAPTURE_FRAME_JITMAP = 7,
SP_CAPTURE_FRAME_CTRDEF = 8,
SP_CAPTURE_FRAME_CTRSET = 9,
SP_CAPTURE_FRAME_MARK = 10,
} SpCaptureFrameType;
#pragma pack(push, 1)
typedef struct
{
guint32 magic;
guint8 version;
guint32 little_endian : 1;
guint32 padding : 23;
gchar capture_time[64];
gint64 time;
gint64 end_time;
gchar suffix[168];
} SpCaptureFileHeader;
typedef struct
{
guint16 len;
gint16 cpu;
gint32 pid;
gint64 time;
guint8 type;
guint64 padding : 56;
guint8 data[0];
} SpCaptureFrame;
typedef struct
{
SpCaptureFrame frame;
guint64 start;
guint64 end;
guint64 offset;
guint64 inode;
gchar filename[0];
} SpCaptureMap;
typedef struct
{
SpCaptureFrame frame;
guint32 n_jitmaps;
guint8 data[0];
} SpCaptureJitmap;
typedef struct
{
SpCaptureFrame frame;
gchar cmdline[0];
} SpCaptureProcess;
typedef struct
{
SpCaptureFrame frame;
guint16 n_addrs;
guint64 padding : 48;
SpCaptureAddress addrs[0];
} SpCaptureSample;
typedef struct
{
SpCaptureFrame frame;
GPid child_pid;
} SpCaptureFork;
typedef struct
{
SpCaptureFrame frame;
} SpCaptureExit;
typedef struct
{
SpCaptureFrame frame;
} SpCaptureTimestamp;
typedef struct
{
gchar category[32];
gchar name[32];
gchar description[52];
guint32 id : 24;
guint8 type;
SpCaptureCounterValue value;
} SpCaptureCounter;
typedef struct
{
SpCaptureFrame frame;
guint16 n_counters;
guint64 padding : 48;
SpCaptureCounter counters[0];
} SpCaptureFrameCounterDefine;
typedef struct
{
/*
* 96 bytes might seem a bit odd, but the counter frame header is 32
* bytes. So this makes a nice 2-cacheline aligned size which is
* useful when the number of counters is rather small.
*/
guint32 ids[8];
SpCaptureCounterValue values[8];
} SpCaptureCounterValues;
typedef struct
{
SpCaptureFrame frame;
guint16 n_values;
guint64 padding : 48;
SpCaptureCounterValues values[0];
} SpCaptureFrameCounterSet;
typedef struct
{
SpCaptureFrame frame;
gint64 duration;
gchar group[24];
gchar name[40];
gchar message[0];
} SpCaptureMark;
#pragma pack(pop)
G_STATIC_ASSERT (sizeof (SpCaptureFileHeader) == 256);
G_STATIC_ASSERT (sizeof (SpCaptureFrame) == 24);
G_STATIC_ASSERT (sizeof (SpCaptureMap) == 56);
G_STATIC_ASSERT (sizeof (SpCaptureJitmap) == 28);
G_STATIC_ASSERT (sizeof (SpCaptureProcess) == 24);
G_STATIC_ASSERT (sizeof (SpCaptureSample) == 32);
G_STATIC_ASSERT (sizeof (SpCaptureFork) == 28);
G_STATIC_ASSERT (sizeof (SpCaptureExit) == 24);
G_STATIC_ASSERT (sizeof (SpCaptureTimestamp) == 24);
G_STATIC_ASSERT (sizeof (SpCaptureCounter) == 128);
G_STATIC_ASSERT (sizeof (SpCaptureCounterValues) == 96);
G_STATIC_ASSERT (sizeof (SpCaptureFrameCounterDefine) == 32);
G_STATIC_ASSERT (sizeof (SpCaptureFrameCounterSet) == 32);
G_STATIC_ASSERT (sizeof (SpCaptureMark) == 96);
static inline gint
sp_capture_address_compare (SpCaptureAddress a,
SpCaptureAddress b)
{
if (a < b)
return -1;
if (a > b)
return 1;
else
return 0;
}
G_END_DECLS
#endif /* SP_CAPTURE_FORMAT_H */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,132 @@
/* sp-capture-writer.h
*
* Copyright © 2016 Christian Hergert <chergert@redhat.com>
*
* This file is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SP_CAPTURE_WRITER_H
#define SP_CAPTURE_WRITER_H
#include "capture/sp-capture-types.h"
G_BEGIN_DECLS
typedef struct _SpCaptureWriter SpCaptureWriter;
typedef struct
{
/*
* The number of frames indexed by SpCaptureFrameType
*/
gsize frame_count[16];
/*
* Padding for future expansion.
*/
gsize padding[48];
} SpCaptureStat;
SpCaptureWriter *sp_capture_writer_new (const gchar *filename,
gsize buffer_size);
SpCaptureWriter *sp_capture_writer_new_from_fd (int fd,
gsize buffer_size);
SpCaptureWriter *sp_capture_writer_ref (SpCaptureWriter *self);
void sp_capture_writer_unref (SpCaptureWriter *self);
void sp_capture_writer_stat (SpCaptureWriter *self,
SpCaptureStat *stat);
gboolean sp_capture_writer_add_map (SpCaptureWriter *self,
gint64 time,
gint cpu,
GPid pid,
guint64 start,
guint64 end,
guint64 offset,
guint64 inode,
const gchar *filename);
gboolean sp_capture_writer_add_mark (SpCaptureWriter *self,
gint64 time,
gint cpu,
GPid pid,
guint64 duration,
const gchar *group,
const gchar *name,
const gchar *message);
guint64 sp_capture_writer_add_jitmap (SpCaptureWriter *self,
const gchar *name);
gboolean sp_capture_writer_add_process (SpCaptureWriter *self,
gint64 time,
gint cpu,
GPid pid,
const gchar *cmdline);
gboolean sp_capture_writer_add_sample (SpCaptureWriter *self,
gint64 time,
gint cpu,
GPid pid,
const SpCaptureAddress *addrs,
guint n_addrs);
gboolean sp_capture_writer_add_fork (SpCaptureWriter *self,
gint64 time,
gint cpu,
GPid pid,
GPid child_pid);
gboolean sp_capture_writer_add_exit (SpCaptureWriter *self,
gint64 time,
gint cpu,
GPid pid);
gboolean sp_capture_writer_add_timestamp (SpCaptureWriter *self,
gint64 time,
gint cpu,
GPid pid);
gboolean sp_capture_writer_define_counters (SpCaptureWriter *self,
gint64 time,
gint cpu,
GPid pid,
const SpCaptureCounter *counters,
guint n_counters);
gboolean sp_capture_writer_set_counters (SpCaptureWriter *self,
gint64 time,
gint cpu,
GPid pid,
const guint *counters_ids,
const SpCaptureCounterValue *values,
guint n_counters);
gboolean sp_capture_writer_flush (SpCaptureWriter *self);
gboolean sp_capture_writer_save_as (SpCaptureWriter *self,
const gchar *filename,
GError **error);
gint sp_capture_writer_request_counter (SpCaptureWriter *self,
guint n_counters);
SpCaptureReader *sp_capture_writer_create_reader (SpCaptureWriter *self,
GError **error);
gboolean sp_capture_writer_splice (SpCaptureWriter *self,
SpCaptureWriter *dest,
GError **error);
gboolean _sp_capture_writer_splice_from_fd (SpCaptureWriter *self,
int fd,
GError **error) G_GNUC_INTERNAL;
#ifndef SP_DISABLE_GOBJECT
# define SP_TYPE_CAPTURE_WRITER (sp_capture_writer_get_type())
GType sp_capture_writer_get_type (void);
#endif
#if GLIB_CHECK_VERSION(2, 44, 0)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (SpCaptureWriter, sp_capture_writer_unref)
#endif
G_END_DECLS
#endif /* SP_CAPTURE_WRITER_H */

52
gdk/capture/sp-clock.c Normal file
View File

@@ -0,0 +1,52 @@
/* sp-clock.c
*
* Copyright © 2016 Christian Hergert <chergert@redhat.com>
*
* This file is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "sp-clock.h"
gint sp_clock = -1;
void
sp_clock_init (void)
{
static const gint clock_ids[] = {
CLOCK_MONOTONIC_RAW,
CLOCK_MONOTONIC_COARSE,
CLOCK_MONOTONIC,
CLOCK_REALTIME_COARSE,
CLOCK_REALTIME,
};
guint i;
if (sp_clock != -1)
return;
for (i = 0; i < G_N_ELEMENTS (clock_ids); i++)
{
struct timespec ts;
int clock_id = clock_ids [i];
if (0 == clock_gettime (clock_id, &ts))
{
sp_clock = clock_id;
return;
}
}
g_assert_not_reached ();
}

55
gdk/capture/sp-clock.h Normal file
View File

@@ -0,0 +1,55 @@
/* sp-clock.h
*
* Copyright © 2016 Christian Hergert <chergert@redhat.com>
*
* This file is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SP_CLOCK_H
#define SP_CLOCK_H
#include <glib.h>
#include <time.h>
G_BEGIN_DECLS
typedef gint SpClock;
typedef gint64 SpTimeStamp;
typedef gint32 SpTimeSpan;
extern SpClock sp_clock;
static inline SpTimeStamp
sp_clock_get_current_time (void)
{
struct timespec ts;
clock_gettime (sp_clock, &ts);
return (ts.tv_sec * G_GINT64_CONSTANT (1000000000)) + ts.tv_nsec;
}
static inline SpTimeSpan
sp_clock_get_relative_time (SpTimeStamp epoch)
{
return sp_clock_get_current_time () - epoch;
}
void sp_clock_init (void);
G_END_DECLS
#endif /* SP_CLOCK_H */

View File

@@ -213,8 +213,8 @@ gdk_pre_parse (void)
(GDebugKey *) gdk_debug_keys, (GDebugKey *) gdk_debug_keys,
G_N_ELEMENTS (gdk_debug_keys)); G_N_ELEMENTS (gdk_debug_keys));
if (g_getenv ("GTK_TRACE_FD")) if (g_getenv ("SYSPROF_TRACE_FD"))
gdk_profiler_start (atoi (g_getenv ("GTK_TRACE_FD"))); gdk_profiler_start (atoi (g_getenv ("SYSPROF_TRACE_FD")));
else if (g_getenv ("GTK_TRACE")) else if (g_getenv ("GTK_TRACE"))
gdk_profiler_start (-1); gdk_profiler_start (-1);
} }

View File

@@ -234,7 +234,7 @@ gdk_content_formats_unref (GdkContentFormats *formats)
* This is meant for debugging and logging. * This is meant for debugging and logging.
* *
* The form of the representation may change at any time and is * The form of the representation may change at any time and is
* not guaranteed to stay identical. * not guranteed to stay identical.
**/ **/
void void
gdk_content_formats_print (GdkContentFormats *formats, gdk_content_formats_print (GdkContentFormats *formats,

View File

@@ -79,7 +79,15 @@ struct _GdkContentProviderClass
GError **error); GError **error);
/*< private >*/ /*< private >*/
gpointer padding[8]; /* Padding for future expansion */
void (*_gdk_reserved1) (void);
void (*_gdk_reserved2) (void);
void (*_gdk_reserved3) (void);
void (*_gdk_reserved4) (void);
void (*_gdk_reserved5) (void);
void (*_gdk_reserved6) (void);
void (*_gdk_reserved7) (void);
void (*_gdk_reserved8) (void);
}; };

View File

@@ -314,7 +314,7 @@ gdk_device_class_init (GdkDeviceClass *klass)
G_TYPE_FROM_CLASS (object_class), G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, 0, NULL, NULL,
NULL, g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/** /**
@@ -330,7 +330,7 @@ gdk_device_class_init (GdkDeviceClass *klass)
G_TYPE_FROM_CLASS (object_class), G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, 0, NULL, NULL,
NULL, g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, GDK_TYPE_DEVICE_TOOL); G_TYPE_NONE, 1, GDK_TYPE_DEVICE_TOOL);
} }
@@ -510,7 +510,7 @@ gdk_device_get_property (GObject *object,
* Gets the current state of a pointer device relative to @surface. As a slave * Gets the current state of a pointer device relative to @surface. As a slave
* devices coordinates are those of its master pointer, this * devices coordinates are those of its master pointer, this
* function may not be called on devices of type %GDK_DEVICE_TYPE_SLAVE, * function may not be called on devices of type %GDK_DEVICE_TYPE_SLAVE,
* unless there is an ongoing grab on them. See gdk_seat_grab(). * unless there is an ongoing grab on them. See gdk_device_grab().
*/ */
void void
gdk_device_get_state (GdkDevice *device, gdk_device_get_state (GdkDevice *device,
@@ -528,20 +528,24 @@ gdk_device_get_state (GdkDevice *device,
GDK_DEVICE_GET_CLASS (device)->get_state (device, surface, axes, mask); GDK_DEVICE_GET_CLASS (device)->get_state (device, surface, axes, mask);
} }
/* /**
* gdk_device_get_position: * gdk_device_get_position:
* @device: pointer device to query status about. * @device: pointer device to query status about.
* @x: (out): location to store root window X coordinate of @device * @x: (out) (allow-none): location to store root window X coordinate of @device, or %NULL.
* @y: (out): location to store root window Y coordinate of @device * @y: (out) (allow-none): location to store root window Y coordinate of @device, or %NULL.
* *
* Gets the current location of @device in double precision. * Gets the current location of @device in double precision. As a slave device's
*/ * coordinates are those of its master pointer, this function
* may not be called on devices of type %GDK_DEVICE_TYPE_SLAVE,
* unless there is an ongoing grab on them. See gdk_device_grab().
**/
void void
gdk_device_get_position (GdkDevice *device, gdk_device_get_position (GdkDevice *device,
double *x, double *x,
double *y) double *y)
{ {
GdkDisplay *display; GdkDisplay *display;
gdouble tmp_x, tmp_y;
g_return_if_fail (GDK_IS_DEVICE (device)); g_return_if_fail (GDK_IS_DEVICE (device));
g_return_if_fail (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD); g_return_if_fail (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD);
@@ -551,7 +555,16 @@ gdk_device_get_position (GdkDevice *device,
g_return_if_fail (gdk_device_get_device_type (device) != GDK_DEVICE_TYPE_SLAVE || g_return_if_fail (gdk_device_get_device_type (device) != GDK_DEVICE_TYPE_SLAVE ||
gdk_display_device_is_grabbed (display, device)); gdk_display_device_is_grabbed (display, device));
_gdk_device_query_state (device, NULL, NULL, x, y, NULL, NULL, NULL); _gdk_device_query_state (device,
NULL,
NULL,
&tmp_x, &tmp_y,
NULL, NULL, NULL);
if (x)
*x = tmp_x;
if (y)
*y = tmp_y;
} }
/** /**
@@ -568,7 +581,7 @@ gdk_device_get_position (GdkDevice *device,
* *
* As a slave device coordinates are those of its master pointer, This * As a slave device coordinates are those of its master pointer, This
* function may not be called on devices of type %GDK_DEVICE_TYPE_SLAVE, * function may not be called on devices of type %GDK_DEVICE_TYPE_SLAVE,
* unless there is an ongoing grab on them, see gdk_seat_grab(). * unless there is an ongoing grab on them, see gdk_device_grab().
* *
* Returns: (nullable) (transfer none): the #GdkSurface under the * Returns: (nullable) (transfer none): the #GdkSurface under the
* device position, or %NULL. * device position, or %NULL.
@@ -588,6 +601,13 @@ gdk_device_get_surface_at_position (GdkDevice *device,
surface = _gdk_device_surface_at_position (device, &tmp_x, &tmp_y, NULL, FALSE); surface = _gdk_device_surface_at_position (device, &tmp_x, &tmp_y, NULL, FALSE);
/* This might need corrections, as the native surface returned
may contain client side children */
if (surface)
surface = _gdk_surface_find_descendant_at (surface,
tmp_x, tmp_y,
&tmp_x, &tmp_y);
if (win_x) if (win_x)
*win_x = tmp_x; *win_x = tmp_x;
if (win_y) if (win_y)
@@ -1224,7 +1244,7 @@ get_native_grab_event_mask (GdkEventMask grab_mask)
GdkGrabStatus GdkGrabStatus
gdk_device_grab (GdkDevice *device, gdk_device_grab (GdkDevice *device,
GdkSurface *surface, GdkSurface *surface,
GdkGrabOwnership grab_ownership, GdkGrabOwnership grab_ownership,
gboolean owner_events, gboolean owner_events,
GdkEventMask event_mask, GdkEventMask event_mask,
@@ -1232,16 +1252,19 @@ gdk_device_grab (GdkDevice *device,
guint32 time_) guint32 time_)
{ {
GdkGrabStatus res; GdkGrabStatus res;
GdkSurface *native;
g_return_val_if_fail (GDK_IS_DEVICE (device), GDK_GRAB_FAILED); g_return_val_if_fail (GDK_IS_DEVICE (device), GDK_GRAB_FAILED);
g_return_val_if_fail (GDK_IS_SURFACE (surface), GDK_GRAB_FAILED); g_return_val_if_fail (GDK_IS_SURFACE (surface), GDK_GRAB_FAILED);
g_return_val_if_fail (gdk_surface_get_display (surface) == gdk_device_get_display (device), GDK_GRAB_FAILED); g_return_val_if_fail (gdk_surface_get_display (surface) == gdk_device_get_display (device), GDK_GRAB_FAILED);
if (GDK_SURFACE_DESTROYED (surface)) native = gdk_surface_get_toplevel (surface);
if (native == NULL || GDK_SURFACE_DESTROYED (native))
return GDK_GRAB_NOT_VIEWABLE; return GDK_GRAB_NOT_VIEWABLE;
res = GDK_DEVICE_GET_CLASS (device)->grab (device, res = GDK_DEVICE_GET_CLASS (device)->grab (device,
surface, native,
owner_events, owner_events,
get_native_grab_event_mask (event_mask), get_native_grab_event_mask (event_mask),
NULL, NULL,
@@ -1259,6 +1282,7 @@ gdk_device_grab (GdkDevice *device,
_gdk_display_add_device_grab (display, _gdk_display_add_device_grab (display,
device, device,
surface, surface,
native,
grab_ownership, grab_ownership,
owner_events, owner_events,
event_mask, event_mask,
@@ -1524,7 +1548,7 @@ _gdk_device_translate_screen_coord (GdkDevice *device,
else else
scale = 1; scale = 1;
offset = - surface_root_x; offset = - surface_root_x - surface->abs_x;
} }
else else
{ {
@@ -1533,7 +1557,7 @@ _gdk_device_translate_screen_coord (GdkDevice *device,
else else
scale = 1; scale = 1;
offset = - surface_root_y; offset = - surface_root_y - surface->abs_y;
} }
if (axis_value) if (axis_value)

View File

@@ -167,6 +167,10 @@ void gdk_device_get_state (GdkDevice *device,
gdouble *axes, gdouble *axes,
GdkModifierType *mask); GdkModifierType *mask);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
void gdk_device_get_position (GdkDevice *device,
double *x,
double *y);
GDK_AVAILABLE_IN_ALL
GdkSurface * gdk_device_get_surface_at_position (GdkDevice *device, GdkSurface * gdk_device_get_surface_at_position (GdkDevice *device,
double *win_x, double *win_x,
double *win_y); double *win_y);

View File

@@ -31,9 +31,9 @@
#include "gdkdeviceprivate.h" #include "gdkdeviceprivate.h"
#include "gdkdisplaymanagerprivate.h" #include "gdkdisplaymanagerprivate.h"
#include "gdkevents.h" #include "gdkevents.h"
#include "gdksurfaceimpl.h"
#include "gdkinternals.h" #include "gdkinternals.h"
#include "gdkmonitorprivate.h" #include "gdkmonitorprivate.h"
#include "gdkframeclockidleprivate.h"
#include <math.h> #include <math.h>
#include <glib.h> #include <glib.h>
@@ -171,6 +171,8 @@ gdk_display_class_init (GdkDisplayClass *class)
object_class->get_property = gdk_display_get_property; object_class->get_property = gdk_display_get_property;
class->get_app_launch_context = gdk_display_real_get_app_launch_context; class->get_app_launch_context = gdk_display_real_get_app_launch_context;
class->surface_type = GDK_TYPE_SURFACE;
class->opened = gdk_display_real_opened; class->opened = gdk_display_real_opened;
class->make_default = gdk_display_real_make_default; class->make_default = gdk_display_real_make_default;
class->event_data_copy = gdk_display_real_event_data_copy; class->event_data_copy = gdk_display_real_event_data_copy;
@@ -220,7 +222,7 @@ gdk_display_class_init (GdkDisplayClass *class)
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GdkDisplayClass, opened), G_STRUCT_OFFSET (GdkDisplayClass, opened),
NULL, NULL, NULL, NULL,
NULL, g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/** /**
@@ -237,7 +239,7 @@ gdk_display_class_init (GdkDisplayClass *class)
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GdkDisplayClass, closed), G_STRUCT_OFFSET (GdkDisplayClass, closed),
NULL, NULL, NULL, NULL,
NULL, g_cclosure_marshal_VOID__BOOLEAN,
G_TYPE_NONE, G_TYPE_NONE,
1, 1,
G_TYPE_BOOLEAN); G_TYPE_BOOLEAN);
@@ -255,7 +257,7 @@ gdk_display_class_init (GdkDisplayClass *class)
G_OBJECT_CLASS_TYPE (object_class), G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, 0, NULL, NULL,
NULL, g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, GDK_TYPE_SEAT); G_TYPE_NONE, 1, GDK_TYPE_SEAT);
/** /**
@@ -271,7 +273,7 @@ gdk_display_class_init (GdkDisplayClass *class)
G_OBJECT_CLASS_TYPE (object_class), G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, 0, NULL, NULL,
NULL, g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, GDK_TYPE_SEAT); G_TYPE_NONE, 1, GDK_TYPE_SEAT);
/** /**
@@ -287,7 +289,7 @@ gdk_display_class_init (GdkDisplayClass *class)
G_OBJECT_CLASS_TYPE (object_class), G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, 0, NULL, NULL,
NULL, g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, GDK_TYPE_MONITOR); G_TYPE_NONE, 1, GDK_TYPE_MONITOR);
/** /**
@@ -303,7 +305,7 @@ gdk_display_class_init (GdkDisplayClass *class)
G_OBJECT_CLASS_TYPE (object_class), G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, 0, NULL, NULL,
NULL, g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, GDK_TYPE_MONITOR); G_TYPE_NONE, 1, GDK_TYPE_MONITOR);
/** /**
@@ -334,6 +336,7 @@ static void
free_device_grab (GdkDeviceGrabInfo *info) free_device_grab (GdkDeviceGrabInfo *info)
{ {
g_object_unref (info->surface); g_object_unref (info->surface);
g_object_unref (info->native_surface);
g_free (info); g_free (info);
} }
@@ -555,6 +558,7 @@ GdkDeviceGrabInfo *
_gdk_display_add_device_grab (GdkDisplay *display, _gdk_display_add_device_grab (GdkDisplay *display,
GdkDevice *device, GdkDevice *device,
GdkSurface *surface, GdkSurface *surface,
GdkSurface *native_surface,
GdkGrabOwnership grab_ownership, GdkGrabOwnership grab_ownership,
gboolean owner_events, gboolean owner_events,
GdkEventMask event_mask, GdkEventMask event_mask,
@@ -568,6 +572,7 @@ _gdk_display_add_device_grab (GdkDisplay *display,
info = g_new0 (GdkDeviceGrabInfo, 1); info = g_new0 (GdkDeviceGrabInfo, 1);
info->surface = g_object_ref (surface); info->surface = g_object_ref (surface);
info->native_surface = g_object_ref (native_surface);
info->serial_start = serial_start; info->serial_start = serial_start;
info->serial_end = G_MAXULONG; info->serial_end = G_MAXULONG;
info->owner_events = owner_events; info->owner_events = owner_events;
@@ -840,7 +845,9 @@ _gdk_display_end_device_grab (GdkDisplay *display,
return FALSE; return FALSE;
grab = l->data; grab = l->data;
if (grab && (if_child == NULL || if_child == grab->surface)) if (grab &&
(if_child == NULL ||
_gdk_surface_event_parent_of (if_child, grab->surface)))
{ {
grab->serial_end = serial; grab->serial_end = serial;
grab->implicit_ungrab = implicit; grab->implicit_ungrab = implicit;
@@ -1322,19 +1329,24 @@ _gdk_display_event_data_free (GdkDisplay *display,
GDK_DISPLAY_GET_CLASS (display)->event_data_free (display, event); GDK_DISPLAY_GET_CLASS (display)->event_data_free (display, event);
} }
GdkSurface * void
gdk_display_create_surface (GdkDisplay *display, gdk_display_create_surface_impl (GdkDisplay *display,
GdkSurfaceType surface_type, GdkSurface *surface,
GdkSurface *parent, GdkSurface *real_parent,
int x, GdkSurfaceAttr *attributes)
int y,
int width,
int height)
{ {
return GDK_DISPLAY_GET_CLASS (display)->create_surface (display, GDK_DISPLAY_GET_CLASS (display)->create_surface_impl (display,
surface_type, surface,
parent, real_parent,
x, y, width, height); attributes);
}
GdkSurface *
_gdk_display_create_surface (GdkDisplay *display)
{
return g_object_new (GDK_DISPLAY_GET_CLASS (display)->surface_type,
"display", display,
NULL);
} }
/** /**
@@ -1614,6 +1626,66 @@ gdk_display_get_primary_monitor (GdkDisplay *display)
return GDK_DISPLAY_GET_CLASS (display)->get_primary_monitor (display); return GDK_DISPLAY_GET_CLASS (display)->get_primary_monitor (display);
} }
/**
* gdk_display_get_monitor_at_point:
* @display: a #GdkDisplay
* @x: the x coordinate of the point
* @y: the y coordinate of the point
*
* Gets the monitor in which the point (@x, @y) is located,
* or a nearby monitor if the point is not in any monitor.
*
* Returns: (transfer none): the monitor containing the point
*/
GdkMonitor *
gdk_display_get_monitor_at_point (GdkDisplay *display,
int x,
int y)
{
GdkMonitor *nearest = NULL;
int nearest_dist = G_MAXINT;
int n_monitors, i;
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
n_monitors = gdk_display_get_n_monitors (display);
for (i = 0; i < n_monitors; i++)
{
GdkMonitor *monitor;
GdkRectangle geometry;
int dist_x, dist_y, dist;
monitor = gdk_display_get_monitor (display, i);
gdk_monitor_get_geometry (monitor, &geometry);
if (x < geometry.x)
dist_x = geometry.x - x;
else if (geometry.x + geometry.width <= x)
dist_x = x - (geometry.x + geometry.width) + 1;
else
dist_x = 0;
if (y < geometry.y)
dist_y = geometry.y - y;
else if (geometry.y + geometry.height <= y)
dist_y = y - (geometry.y + geometry.height) + 1;
else
dist_y = 0;
dist = dist_x + dist_y;
if (dist < nearest_dist)
{
nearest_dist = dist;
nearest = monitor;
}
if (nearest_dist == 0)
break;
}
return nearest;
}
/** /**
* gdk_display_get_monitor_at_surface: * gdk_display_get_monitor_at_surface:
* @display: a #GdkDisplay * @display: a #GdkDisplay
@@ -1646,7 +1718,6 @@ gdk_display_get_monitor_at_surface (GdkDisplay *display,
return best; return best;
} }
/* the fallback implementation requires global coordinates */
gdk_surface_get_geometry (surface, &win.x, &win.y, &win.width, &win.height); gdk_surface_get_geometry (surface, &win.x, &win.y, &win.width, &win.height);
gdk_surface_get_origin (surface, &win.x, &win.y); gdk_surface_get_origin (surface, &win.x, &win.y);
@@ -1668,7 +1739,12 @@ gdk_display_get_monitor_at_surface (GdkDisplay *display,
} }
} }
return best; if (best)
return best;
return gdk_display_get_monitor_at_point (display,
win.x + win.width / 2,
win.y + win.height / 2);
} }
void void

View File

@@ -114,6 +114,10 @@ GdkMonitor * gdk_display_get_monitor (GdkDisplay *display,
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
GdkMonitor * gdk_display_get_primary_monitor (GdkDisplay *display); GdkMonitor * gdk_display_get_primary_monitor (GdkDisplay *display);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
GdkMonitor * gdk_display_get_monitor_at_point (GdkDisplay *display,
int x,
int y);
GDK_AVAILABLE_IN_ALL
GdkMonitor * gdk_display_get_monitor_at_surface (GdkDisplay *display, GdkMonitor * gdk_display_get_monitor_at_surface (GdkDisplay *display,
GdkSurface *surface); GdkSurface *surface);

View File

@@ -156,7 +156,7 @@ gdk_display_manager_class_init (GdkDisplayManagerClass *klass)
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GdkDisplayManagerClass, display_opened), G_STRUCT_OFFSET (GdkDisplayManagerClass, display_opened),
NULL, NULL, NULL, NULL,
NULL, g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, G_TYPE_NONE,
1, 1,
GDK_TYPE_DISPLAY); GDK_TYPE_DISPLAY);

View File

@@ -41,6 +41,7 @@ typedef struct _GdkDisplayClass GdkDisplayClass;
typedef struct typedef struct
{ {
GdkSurface *surface; GdkSurface *surface;
GdkSurface *native_surface;
gulong serial_start; gulong serial_start;
gulong serial_end; /* exclusive, i.e. not active on serial_end */ gulong serial_end; /* exclusive, i.e. not active on serial_end */
guint event_mask; guint event_mask;
@@ -112,6 +113,7 @@ struct _GdkDisplayClass
{ {
GObjectClass parent_class; GObjectClass parent_class;
GType surface_type; /* type for native surfaces for this display, set in class_init */
GType cairo_context_type; /* type for GdkCairoContext, must be set */ GType cairo_context_type; /* type for GdkCairoContext, must be set */
GType vk_context_type; /* type for GdkVulkanContext, must be set if vk_extension_name != NULL */ GType vk_context_type; /* type for GdkVulkanContext, must be set if vk_extension_name != NULL */
const char *vk_extension_name; /* Name of required windowing vulkan extension or %NULL (default) if Vulkan isn't supported */ const char *vk_extension_name; /* Name of required windowing vulkan extension or %NULL (default) if Vulkan isn't supported */
@@ -140,13 +142,10 @@ struct _GdkDisplayClass
GdkEvent *new_event); GdkEvent *new_event);
void (*event_data_free) (GdkDisplay *display, void (*event_data_free) (GdkDisplay *display,
GdkEvent *event); GdkEvent *event);
GdkSurface * (*create_surface) (GdkDisplay *display, void (*create_surface_impl) (GdkDisplay *display,
GdkSurfaceType surface_type, GdkSurface *surface,
GdkSurface *parent, GdkSurface *real_parent,
int x, GdkSurfaceAttr *attributes);
int y,
int width,
int height);
GdkKeymap * (*get_keymap) (GdkDisplay *display); GdkKeymap * (*get_keymap) (GdkDisplay *display);
@@ -201,6 +200,7 @@ GdkDeviceGrabInfo * _gdk_display_get_last_device_grab (GdkDisplay *display,
GdkDeviceGrabInfo * _gdk_display_add_device_grab (GdkDisplay *display, GdkDeviceGrabInfo * _gdk_display_add_device_grab (GdkDisplay *display,
GdkDevice *device, GdkDevice *device,
GdkSurface *surface, GdkSurface *surface,
GdkSurface *native_surface,
GdkGrabOwnership grab_ownership, GdkGrabOwnership grab_ownership,
gboolean owner_events, gboolean owner_events,
GdkEventMask event_mask, GdkEventMask event_mask,
@@ -231,13 +231,11 @@ void _gdk_display_event_data_copy (GdkDisplay *display
GdkEvent *new_event); GdkEvent *new_event);
void _gdk_display_event_data_free (GdkDisplay *display, void _gdk_display_event_data_free (GdkDisplay *display,
GdkEvent *event); GdkEvent *event);
GdkSurface * gdk_display_create_surface (GdkDisplay *display, void gdk_display_create_surface_impl (GdkDisplay *display,
GdkSurfaceType surface_type, GdkSurface *surface,
GdkSurface *parent, GdkSurface *real_parent,
int x, GdkSurfaceAttr *attributes);
int y, GdkSurface * _gdk_display_create_surface (GdkDisplay *display);
int width,
int height);
gboolean gdk_display_make_gl_context_current (GdkDisplay *display, gboolean gdk_display_make_gl_context_current (GdkDisplay *display,
GdkGLContext *context); GdkGLContext *context);

View File

@@ -450,7 +450,7 @@ gdk_drag_class_init (GdkDragClass *klass)
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GdkDragClass, cancel), G_STRUCT_OFFSET (GdkDragClass, cancel),
NULL, NULL, NULL, NULL,
NULL, g_cclosure_marshal_VOID__ENUM,
G_TYPE_NONE, 1, GDK_TYPE_DRAG_CANCEL_REASON); G_TYPE_NONE, 1, GDK_TYPE_DRAG_CANCEL_REASON);
/** /**
@@ -465,7 +465,7 @@ gdk_drag_class_init (GdkDragClass *klass)
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GdkDragClass, drop_performed), G_STRUCT_OFFSET (GdkDragClass, drop_performed),
NULL, NULL, NULL, NULL,
NULL, g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/** /**
@@ -482,7 +482,7 @@ gdk_drag_class_init (GdkDragClass *klass)
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GdkDragClass, dnd_finished), G_STRUCT_OFFSET (GdkDragClass, dnd_finished),
NULL, NULL, NULL, NULL,
NULL, g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
g_object_class_install_properties (object_class, N_PROPERTIES, properties); g_object_class_install_properties (object_class, N_PROPERTIES, properties);

View File

@@ -24,7 +24,6 @@
#include "gdkinternals.h" #include "gdkinternals.h"
#include "gdkintl.h" #include "gdkintl.h"
#include "gdkprofilerprivate.h"
/** /**
* SECTION:gdkdrawcontext * SECTION:gdkdrawcontext
@@ -175,15 +174,9 @@ gdk_draw_context_class_init (GdkDrawContextClass *klass)
g_object_class_install_properties (gobject_class, LAST_PROP, pspecs); g_object_class_install_properties (gobject_class, LAST_PROP, pspecs);
} }
static guint pixels_counter;
static void static void
gdk_draw_context_init (GdkDrawContext *self) gdk_draw_context_init (GdkDrawContext *self)
{ {
#ifdef G_ENABLE_DEBUG
if (pixels_counter == 0)
pixels_counter = gdk_profiler_define_int_counter ("frame pixels", "Pixels drawn per frame");
#endif
} }
/** /**
@@ -322,25 +315,6 @@ gdk_draw_context_begin_frame (GdkDrawContext *context,
GDK_DRAW_CONTEXT_GET_CLASS (context)->begin_frame (context, priv->frame_region); GDK_DRAW_CONTEXT_GET_CLASS (context)->begin_frame (context, priv->frame_region);
} }
#ifdef G_ENABLE_DEBUG
static gint64
region_get_pixels (cairo_region_t *region)
{
int i, n;
cairo_rectangle_int_t rect;
gint64 pixels = 0;
n = cairo_region_num_rectangles (region);
for (i = 0; i < n; i++)
{
cairo_region_get_rectangle (region, i, &rect);
pixels += rect.width * rect.height;
}
return pixels;
}
#endif
/** /**
* gdk_draw_context_end_frame: * gdk_draw_context_end_frame:
* @context: a #GdkDrawContext * @context: a #GdkDrawContext
@@ -380,13 +354,6 @@ gdk_draw_context_end_frame (GdkDrawContext *context)
GDK_DRAW_CONTEXT_GET_CLASS (context)->end_frame (context, priv->frame_region); GDK_DRAW_CONTEXT_GET_CLASS (context)->end_frame (context, priv->frame_region);
#ifdef G_ENABLE_DEBUG
if (gdk_profiler_is_running ())
gdk_profiler_set_int_counter (pixels_counter,
g_get_monotonic_time () * 1000,
region_get_pixels (priv->frame_region));
#endif
g_clear_pointer (&priv->frame_region, cairo_region_destroy); g_clear_pointer (&priv->frame_region, cairo_region_destroy);
g_clear_object (&priv->surface->paint_context); g_clear_object (&priv->surface->paint_context);
} }

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