Compare commits
20 Commits
wip/matthi
...
matthiasc/
Author | SHA1 | Date | |
---|---|---|---|
|
4f6ea7c418 | ||
|
ba8f39a90a | ||
|
6d17e74d0e | ||
|
9ab78cd215 | ||
|
8ae8fe9e4c | ||
|
d63a729ab1 | ||
|
444323244c | ||
|
ce44bd7fa4 | ||
|
3568a591f1 | ||
|
1577db0092 | ||
|
ea7ab799ad | ||
|
6535af8424 | ||
|
7821cb1417 | ||
|
8c50312abf | ||
|
723010ed09 | ||
|
f0affa8886 | ||
|
8b3304820e | ||
|
5592af40ad | ||
|
d3268b3af0 | ||
|
c5e1c97ca4 |
@@ -119,76 +119,48 @@ get_image_paintable (GtkImage *image)
|
||||
}
|
||||
|
||||
static void
|
||||
drag_begin (GtkDragSource *source,
|
||||
GdkDrag *drag,
|
||||
GtkWidget *widget)
|
||||
drag_begin (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
gpointer data)
|
||||
{
|
||||
GdkPaintable *paintable;
|
||||
|
||||
paintable = get_image_paintable (GTK_IMAGE (widget));
|
||||
if (paintable)
|
||||
{
|
||||
gtk_drag_source_set_icon (source, paintable, -2, -2);
|
||||
gtk_drag_set_icon_paintable (drag, paintable, -2, -2);
|
||||
g_object_unref (paintable);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
get_texture (GValue *value,
|
||||
gpointer data)
|
||||
void
|
||||
drag_data_get (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
GtkSelectionData *selection_data,
|
||||
guint info,
|
||||
gpointer data)
|
||||
{
|
||||
GdkPaintable *paintable = get_image_paintable (GTK_IMAGE (data));
|
||||
GdkPaintable *paintable;
|
||||
|
||||
paintable = get_image_paintable (GTK_IMAGE (widget));
|
||||
if (GDK_IS_TEXTURE (paintable))
|
||||
g_value_set_object (value, paintable);
|
||||
}
|
||||
|
||||
static GdkContentProvider *
|
||||
prepare_drag (GtkDragSource *source,
|
||||
double x,
|
||||
double y,
|
||||
GtkWidget *image)
|
||||
{
|
||||
return gdk_content_provider_new_with_callback (GDK_TYPE_TEXTURE, get_texture, image);
|
||||
gtk_selection_data_set_texture (selection_data, GDK_TEXTURE (paintable));
|
||||
}
|
||||
|
||||
static void
|
||||
got_texture (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer data)
|
||||
drag_data_received (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GtkSelectionData *selection_data,
|
||||
gpointer data)
|
||||
{
|
||||
GdkDrop *drop = GDK_DROP (source);
|
||||
GtkWidget *image = data;
|
||||
const GValue *value;
|
||||
GError *error = NULL;
|
||||
|
||||
value = gdk_drop_read_value_finish (drop, result, &error);
|
||||
if (value)
|
||||
if (gtk_selection_data_get_length (selection_data) > 0)
|
||||
{
|
||||
GdkTexture *texture = g_value_get_object (value);
|
||||
gtk_image_set_from_paintable (GTK_IMAGE (image), GDK_PAINTABLE (texture));
|
||||
}
|
||||
else
|
||||
{
|
||||
g_print ("Failed to get data: %s\n", error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
}
|
||||
GdkTexture *texture;
|
||||
|
||||
static gboolean
|
||||
drag_drop (GtkDropTarget *dest,
|
||||
GdkDrop *drop,
|
||||
int x,
|
||||
int y,
|
||||
GtkWidget *widget)
|
||||
{
|
||||
if (gdk_drop_has_value (drop, GDK_TYPE_TEXTURE))
|
||||
{
|
||||
gdk_drop_read_value_async (drop, GDK_TYPE_TEXTURE, G_PRIORITY_DEFAULT, NULL, got_texture, widget);
|
||||
return TRUE;
|
||||
texture = gtk_selection_data_get_texture (selection_data);
|
||||
gtk_image_set_from_paintable (GTK_IMAGE (data), GDK_PAINTABLE (texture));
|
||||
g_object_unref (texture);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -199,8 +171,12 @@ copy_image (GSimpleAction *action,
|
||||
GdkClipboard *clipboard = gtk_widget_get_clipboard (GTK_WIDGET (data));
|
||||
GdkPaintable *paintable = get_image_paintable (GTK_IMAGE (data));
|
||||
|
||||
g_print ("copy image\n");
|
||||
if (GDK_IS_TEXTURE (paintable))
|
||||
gdk_clipboard_set_texture (clipboard, GDK_TEXTURE (paintable));
|
||||
{
|
||||
g_print ("set clipboard\n");
|
||||
gdk_clipboard_set_texture (clipboard, GDK_TEXTURE (paintable));
|
||||
}
|
||||
|
||||
if (paintable)
|
||||
g_object_unref (paintable);
|
||||
@@ -271,9 +247,6 @@ do_clipboard (GtkWidget *do_widget)
|
||||
{ "paste", paste_image, NULL, NULL, NULL },
|
||||
};
|
||||
GActionGroup *actions;
|
||||
GtkDragSource *source;
|
||||
GtkDropTarget *dest;
|
||||
GdkContentFormats *formats;
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_display (GTK_WINDOW (window),
|
||||
@@ -332,21 +305,22 @@ do_clipboard (GtkWidget *do_widget)
|
||||
|
||||
/* Create the first image */
|
||||
image = gtk_image_new_from_icon_name ("dialog-warning");
|
||||
gtk_image_set_pixel_size (GTK_IMAGE (image), 48);
|
||||
gtk_container_add (GTK_CONTAINER (hbox), image);
|
||||
|
||||
/* make image a drag source */
|
||||
source = gtk_drag_source_new ();
|
||||
g_signal_connect (source, "prepare", G_CALLBACK (prepare_drag), NULL);
|
||||
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin), image);
|
||||
gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (source));
|
||||
gtk_drag_source_set (image, GDK_BUTTON1_MASK, NULL, GDK_ACTION_COPY);
|
||||
gtk_drag_source_add_image_targets (image);
|
||||
g_signal_connect (image, "drag-begin",
|
||||
G_CALLBACK (drag_begin), image);
|
||||
g_signal_connect (image, "drag-data-get",
|
||||
G_CALLBACK (drag_data_get), image);
|
||||
|
||||
/* accept drops on image */
|
||||
formats = gdk_content_formats_new_for_gtype (GDK_TYPE_TEXTURE);
|
||||
dest = gtk_drop_target_new (formats, GDK_ACTION_COPY);
|
||||
gdk_content_formats_unref (formats);
|
||||
g_signal_connect (dest, "drag-drop", G_CALLBACK (drag_drop), image);
|
||||
gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (dest));
|
||||
gtk_drag_dest_set (image, GTK_DEST_DEFAULT_ALL,
|
||||
NULL, GDK_ACTION_COPY);
|
||||
gtk_drag_dest_add_image_targets (image);
|
||||
g_signal_connect (image, "drag-data-received",
|
||||
G_CALLBACK (drag_data_received), image);
|
||||
|
||||
/* context menu on image */
|
||||
gesture = gtk_gesture_click_new ();
|
||||
@@ -363,21 +337,22 @@ do_clipboard (GtkWidget *do_widget)
|
||||
|
||||
/* Create the second image */
|
||||
image = gtk_image_new_from_icon_name ("process-stop");
|
||||
gtk_image_set_pixel_size (GTK_IMAGE (image), 48);
|
||||
gtk_container_add (GTK_CONTAINER (hbox), image);
|
||||
|
||||
/* make image a drag source */
|
||||
source = gtk_drag_source_new ();
|
||||
g_signal_connect (source, "prepare", G_CALLBACK (prepare_drag), NULL);
|
||||
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin), image);
|
||||
gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (source));
|
||||
gtk_drag_source_set (image, GDK_BUTTON1_MASK, NULL, GDK_ACTION_COPY);
|
||||
gtk_drag_source_add_image_targets (image);
|
||||
g_signal_connect (image, "drag-begin",
|
||||
G_CALLBACK (drag_begin), image);
|
||||
g_signal_connect (image, "drag-data-get",
|
||||
G_CALLBACK (drag_data_get), image);
|
||||
|
||||
/* accept drops on image */
|
||||
formats = gdk_content_formats_new_for_gtype (GDK_TYPE_TEXTURE);
|
||||
dest = gtk_drop_target_new (formats, GDK_ACTION_COPY);
|
||||
gdk_content_formats_unref (formats);
|
||||
g_signal_connect (dest, "drag-drop", G_CALLBACK (drag_drop), image);
|
||||
gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (dest));
|
||||
gtk_drag_dest_set (image, GTK_DEST_DEFAULT_ALL,
|
||||
NULL, GDK_ACTION_COPY);
|
||||
gtk_drag_dest_add_image_targets (image);
|
||||
g_signal_connect (image, "drag-data-received",
|
||||
G_CALLBACK (drag_data_received), image);
|
||||
|
||||
/* context menu on image */
|
||||
gesture = gtk_gesture_click_new ();
|
||||
|
@@ -97,7 +97,6 @@ do_infobar (GtkWidget *do_widget)
|
||||
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
||||
gtk_label_set_xalign (GTK_LABEL (label), 0);
|
||||
gtk_container_add (GTK_CONTAINER (gtk_info_bar_get_content_area (GTK_INFO_BAR (bar))), label);
|
||||
gtk_info_bar_set_default_response (GTK_INFO_BAR (bar), GTK_RESPONSE_OK);
|
||||
|
||||
button = gtk_toggle_button_new_with_label ("Question");
|
||||
g_object_bind_property (bar, "revealed", button, "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
||||
|
@@ -5,6 +5,9 @@
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
/* Drag 'n Drop */
|
||||
static const char *target_table[] = {
|
||||
"text/uri-list"
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -73,11 +76,30 @@ search_text_changed (GtkEntry *entry, IconBrowserWindow *win)
|
||||
gtk_tree_model_filter_refilter (win->filter_model);
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
get_icon (GtkWidget *image, const gchar *name, gint size)
|
||||
{
|
||||
GtkIconInfo *info;
|
||||
GtkStyleContext *context;
|
||||
GdkTexture *texture;
|
||||
GdkPixbuf *pixbuf;
|
||||
|
||||
context = gtk_widget_get_style_context (image);
|
||||
info = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_default (), name, size, 0);
|
||||
texture = GDK_TEXTURE (gtk_icon_info_load_symbolic_for_context (info, context, NULL, NULL));
|
||||
pixbuf = gdk_pixbuf_get_from_texture (texture);
|
||||
g_object_unref (texture);
|
||||
g_object_unref (info);
|
||||
|
||||
return pixbuf;
|
||||
}
|
||||
|
||||
static void
|
||||
set_image (GtkWidget *image, const gchar *name, gint size)
|
||||
{
|
||||
gtk_image_set_from_icon_name (GTK_IMAGE (image), name);
|
||||
gtk_image_set_pixel_size (GTK_IMAGE (image), size);
|
||||
gtk_drag_source_set_icon_name (image, name);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -343,107 +365,78 @@ search_mode_toggled (GObject *searchbar, GParamSpec *pspec, IconBrowserWindow *w
|
||||
gtk_list_box_unselect_all (GTK_LIST_BOX (win->context_list));
|
||||
}
|
||||
|
||||
static GdkPaintable *
|
||||
get_image_paintable (GtkImage *image)
|
||||
static void
|
||||
get_image_data (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
GtkSelectionData *selection,
|
||||
guint target_info,
|
||||
gpointer data)
|
||||
{
|
||||
const gchar *icon_name;
|
||||
GtkIconTheme *icon_theme;
|
||||
GtkIconInfo *icon_info;
|
||||
int size;
|
||||
GtkWidget *image;
|
||||
const gchar *name;
|
||||
gint size;
|
||||
GdkPixbuf *pixbuf;
|
||||
|
||||
switch (gtk_image_get_storage_type (image))
|
||||
{
|
||||
case GTK_IMAGE_PAINTABLE:
|
||||
return g_object_ref (gtk_image_get_paintable (image));
|
||||
case GTK_IMAGE_ICON_NAME:
|
||||
icon_name = gtk_image_get_icon_name (image);
|
||||
size = gtk_image_get_pixel_size (image);
|
||||
icon_theme = gtk_icon_theme_get_for_display (gtk_widget_get_display (GTK_WIDGET (image)));
|
||||
icon_info = gtk_icon_theme_lookup_icon (icon_theme, icon_name, size,
|
||||
GTK_ICON_LOOKUP_FORCE_SIZE | GTK_ICON_LOOKUP_GENERIC_FALLBACK);
|
||||
if (icon_info == NULL)
|
||||
return NULL;
|
||||
return gtk_icon_info_load_icon (icon_info, NULL);
|
||||
default:
|
||||
g_warning ("Image storage type %d not handled",
|
||||
gtk_image_get_storage_type (image));
|
||||
return NULL;
|
||||
}
|
||||
image = gtk_bin_get_child (GTK_BIN (widget));
|
||||
|
||||
name = gtk_image_get_icon_name (GTK_IMAGE (image));
|
||||
size = gtk_image_get_pixel_size (GTK_IMAGE (image));
|
||||
|
||||
pixbuf = get_icon (image, name, size);
|
||||
gtk_selection_data_set_pixbuf (selection, pixbuf);
|
||||
g_object_unref (pixbuf);
|
||||
}
|
||||
|
||||
static void
|
||||
drag_begin (GtkDragSource *source,
|
||||
GdkDrag *drag,
|
||||
GtkWidget *widget)
|
||||
get_scalable_image_data (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
GtkSelectionData *selection,
|
||||
guint target_info,
|
||||
gpointer data)
|
||||
{
|
||||
GdkPaintable *paintable;
|
||||
|
||||
paintable = get_image_paintable (GTK_IMAGE (widget));
|
||||
if (paintable)
|
||||
{
|
||||
int w, h;
|
||||
|
||||
w = gdk_paintable_get_intrinsic_width (paintable);
|
||||
h = gdk_paintable_get_intrinsic_height (paintable);
|
||||
gtk_drag_source_set_icon (source, paintable, w, h);
|
||||
g_object_unref (paintable);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
get_texture (GValue *value,
|
||||
gpointer data)
|
||||
{
|
||||
GdkPaintable *paintable = get_image_paintable (GTK_IMAGE (data));
|
||||
|
||||
if (GDK_IS_TEXTURE (paintable))
|
||||
g_value_set_object (value, paintable);
|
||||
}
|
||||
|
||||
static void
|
||||
get_file (GValue *value,
|
||||
gpointer data)
|
||||
{
|
||||
const char *name;
|
||||
gchar *uris[2];
|
||||
GtkIconInfo *info;
|
||||
GtkWidget *image;
|
||||
GFile *file;
|
||||
const gchar *name;
|
||||
|
||||
name = gtk_image_get_icon_name (GTK_IMAGE (data));
|
||||
image = gtk_bin_get_child (GTK_BIN (widget));
|
||||
name = gtk_image_get_icon_name (GTK_IMAGE (image));
|
||||
|
||||
info = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_default (), name, -1, 0);
|
||||
file = g_file_new_for_path (gtk_icon_info_get_filename (info));
|
||||
g_value_set_object (value, file);
|
||||
g_object_unref (file);
|
||||
uris[0] = g_file_get_uri (file);
|
||||
uris[1] = NULL;
|
||||
|
||||
gtk_selection_data_set_uris (selection, uris);
|
||||
|
||||
g_free (uris[0]);
|
||||
g_object_unref (info);
|
||||
g_object_unref (file);
|
||||
}
|
||||
|
||||
static void
|
||||
setup_image_dnd (GtkWidget *image)
|
||||
{
|
||||
GdkContentProvider *content;
|
||||
GtkDragSource *source;
|
||||
|
||||
source = gtk_drag_source_new ();
|
||||
content = gdk_content_provider_new_with_callback (GDK_TYPE_TEXTURE, get_texture, image);
|
||||
gtk_drag_source_set_content (source, content);
|
||||
g_object_unref (content);
|
||||
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin), image);
|
||||
gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (source));
|
||||
gtk_drag_source_set (image, GDK_BUTTON1_MASK, NULL, GDK_ACTION_COPY);
|
||||
gtk_drag_source_add_image_targets (image);
|
||||
g_signal_connect (image, "drag-data-get", G_CALLBACK (get_image_data), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
setup_scalable_image_dnd (GtkWidget *image)
|
||||
{
|
||||
GdkContentProvider *content;
|
||||
GtkDragSource *source;
|
||||
GtkWidget *parent;
|
||||
GdkContentFormats *targets;
|
||||
|
||||
source = gtk_drag_source_new ();
|
||||
content = gdk_content_provider_new_with_callback (G_TYPE_FILE, get_file, image);
|
||||
gtk_drag_source_set_content (source, content);
|
||||
g_object_unref (content);
|
||||
parent = gtk_widget_get_parent (image);
|
||||
targets = gdk_content_formats_new (target_table, G_N_ELEMENTS (target_table));
|
||||
gtk_drag_source_set (parent, GDK_BUTTON1_MASK,
|
||||
targets,
|
||||
GDK_ACTION_COPY);
|
||||
gdk_content_formats_unref (targets);
|
||||
|
||||
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin), image);
|
||||
gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (source));
|
||||
g_signal_connect (parent, "drag-data-get", G_CALLBACK (get_scalable_image_data), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -453,7 +446,8 @@ icon_browser_window_init (IconBrowserWindow *win)
|
||||
|
||||
gtk_widget_init_template (GTK_WIDGET (win));
|
||||
|
||||
list = gdk_content_formats_new_for_gtype (G_TYPE_STRING);
|
||||
list = gdk_content_formats_new (NULL, 0);
|
||||
list = gtk_content_formats_add_text_targets (list);
|
||||
gtk_icon_view_enable_model_drag_source (GTK_ICON_VIEW (win->list),
|
||||
GDK_BUTTON1_MASK,
|
||||
list,
|
||||
@@ -465,6 +459,7 @@ icon_browser_window_init (IconBrowserWindow *win)
|
||||
setup_image_dnd (win->image3);
|
||||
setup_image_dnd (win->image4);
|
||||
setup_image_dnd (win->image5);
|
||||
setup_image_dnd (win->image6);
|
||||
setup_scalable_image_dnd (win->image6);
|
||||
|
||||
win->contexts = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, context_free);
|
||||
|
@@ -344,13 +344,6 @@
|
||||
<xi:include href="xml/gtkpadcontroller.xml" />
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Data exchange, clipboards and Drag-and-Drop</title>
|
||||
<xi:include href="xml/gtkdragsource.xml"/>
|
||||
<xi:include href="xml/gtkdragicon.xml"/>
|
||||
<xi:include href="xml/gtkdroptarget.xml"/>
|
||||
</chapter>
|
||||
|
||||
</part>
|
||||
|
||||
<part id="gtkbase">
|
||||
@@ -359,6 +352,7 @@
|
||||
<xi:include href="xml/gtkfeatures.xml" />
|
||||
<xi:include href="xml/gtkaccelgroup.xml" />
|
||||
<xi:include href="xml/gtkaccelmap.xml" />
|
||||
<xi:include href="xml/gtkdnd.xml" />
|
||||
<xi:include href="xml/gtksettings.xml" />
|
||||
<xi:include href="xml/gtkbindings.xml" />
|
||||
<xi:include href="xml/gtkenums.xml" />
|
||||
|
@@ -5001,6 +5001,49 @@ GTK_TYPE_SELECTION_DATA
|
||||
gtk_selection_data_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkdnd</FILE>
|
||||
<TITLE>Drag and Drop</TITLE>
|
||||
GtkDestDefaults
|
||||
GtkDragResult
|
||||
|
||||
<SUBSECTION Destination Side>
|
||||
gtk_drag_dest_set
|
||||
gtk_drag_dest_unset
|
||||
gtk_drag_dest_find_target
|
||||
gtk_drag_dest_get_target_list
|
||||
gtk_drag_dest_set_target_list
|
||||
gtk_drag_dest_add_text_targets
|
||||
gtk_drag_dest_add_image_targets
|
||||
gtk_drag_dest_add_uri_targets
|
||||
gtk_drag_dest_set_track_motion
|
||||
gtk_drag_dest_get_track_motion
|
||||
gtk_drag_get_data
|
||||
gtk_drag_get_source_widget
|
||||
gtk_drag_highlight
|
||||
gtk_drag_unhighlight
|
||||
|
||||
<SUBSECTION Source Side>
|
||||
gtk_drag_begin
|
||||
gtk_drag_cancel
|
||||
gtk_drag_set_icon_widget
|
||||
gtk_drag_set_icon_paintable
|
||||
gtk_drag_set_icon_name
|
||||
gtk_drag_set_icon_gicon
|
||||
gtk_drag_set_icon_default
|
||||
gtk_drag_check_threshold
|
||||
gtk_drag_source_set
|
||||
gtk_drag_source_set_icon_name
|
||||
gtk_drag_source_set_icon_gicon
|
||||
gtk_drag_source_set_icon_paintable
|
||||
gtk_drag_source_unset
|
||||
gtk_drag_source_set_target_list
|
||||
gtk_drag_source_get_target_list
|
||||
gtk_drag_source_add_text_targets
|
||||
gtk_drag_source_add_image_targets
|
||||
gtk_drag_source_add_uri_targets
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkbindings</FILE>
|
||||
<TITLE>Bindings</TITLE>
|
||||
@@ -7148,69 +7191,3 @@ gtk_constraint_guide_get_max_size
|
||||
GTK_TYPE_CONSTRAINT_GUIDE
|
||||
gtk_constraint_guide_get_tyoe
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkdragsource</FILE>
|
||||
GtkDragSource
|
||||
gtk_drag_source_new
|
||||
gtk_drag_source_set_content
|
||||
gtk_drag_source_get_content
|
||||
gtk_drag_source_set_actions
|
||||
gtk_drag_source_get_actions
|
||||
gtk_drag_source_set_icon
|
||||
gtk_drag_source_drag_cancel
|
||||
gtk_drag_source_get_drag
|
||||
gtk_drag_check_threshold
|
||||
<SUBSECTION Standard>
|
||||
GTK_TYPE_DRAG_SOURCE
|
||||
GTK_DRAG_SOURCE
|
||||
GTK_DRAG_SOURCE_CLASS
|
||||
GTK_IS_DRAG_SOURCE
|
||||
GTK_IS_DRAG_SOURCE_CLASS
|
||||
GTK_DRAG_SOURCE_GET_CLASS
|
||||
<SUBSECTION Private>
|
||||
gtk_drag_source_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkdroptarget</FILE>
|
||||
GtkDropTarget
|
||||
gtk_drop_target_new
|
||||
gtk_drop_target_set_formats
|
||||
gtk_drop_target_get_formats
|
||||
gtk_drop_target_set_actions
|
||||
gtk_drop_target_get_actions
|
||||
gtk_drop_target_get_drop
|
||||
gtk_drop_target_find_mimetype
|
||||
gtk_drop_target_read_selection
|
||||
gtk_drop_target_read_selection_finish
|
||||
gtk_drag_highlight
|
||||
gtk_drag_unhighlight
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GTK_TYPE_DROP_TARGET
|
||||
GTK_DROP_TARGET
|
||||
GTK_DROP_TARGET_CLASS
|
||||
GTK_IS_DROP_TARGET
|
||||
GTK_IS_DROP_TARGET_CLASS
|
||||
GTK_DROP_TARGET_GET_CLASS
|
||||
<SUBSECTION Private>
|
||||
gtk_drop_target_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkdragicon</FILE>
|
||||
GtkDragIcon
|
||||
gtk_drag_icon_new_for_drag
|
||||
gtk_drag_icon_set_from_paintable
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GTK_TYPE_DRAG_ICON
|
||||
GTK_DRAG_ICON
|
||||
GTK_DRAG_ICON_CLASS
|
||||
GTK_IS_DRAG_ICON
|
||||
GTK_IS_DRAG_ICON_CLASS
|
||||
GTK_DRAG_ICON_GET_CLASS
|
||||
<SUBSECTION Private>
|
||||
gtk_drag_icon_get_type
|
||||
</SECTION>
|
||||
|
@@ -57,10 +57,7 @@ gtk_constraint_target_get_type
|
||||
gtk_container_get_type
|
||||
gtk_css_provider_get_type
|
||||
gtk_dialog_get_type
|
||||
gtk_drag_icon_get_type
|
||||
gtk_drag_source_get_type
|
||||
gtk_drawing_area_get_type
|
||||
gtk_drop_target_get_type
|
||||
gtk_editable_get_type
|
||||
gtk_entry_buffer_get_type
|
||||
gtk_entry_completion_get_type
|
||||
|
@@ -48,6 +48,7 @@ private_headers = [
|
||||
'gtkcssfontfeaturesvalueprivate.h',
|
||||
'gtkcssfontvariationsvalueprivate.h',
|
||||
'gtkcssiconthemevalueprivate.h',
|
||||
'gtkcssimagebuiltinprivate.h',
|
||||
'gtkcssimagecrossfadeprivate.h',
|
||||
'gtkcssimagefallbackprivate.h',
|
||||
'gtkcssimageiconthemeprivate.h',
|
||||
@@ -96,6 +97,7 @@ private_headers = [
|
||||
'gtkcsswidgetnodeprivate.h',
|
||||
'gtkcsswin32sizevalueprivate.h',
|
||||
'gtkdialogprivate.h',
|
||||
'gtkdndprivate.h',
|
||||
'gtkentryprivate.h',
|
||||
'gtkeventcontrollerlegacyprivate.h',
|
||||
'gtkeventcontrollerprivate.h',
|
||||
|
@@ -903,37 +903,6 @@
|
||||
gtk_tooltip_set_custom().
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Switch to the new DND api</title>
|
||||
<para>
|
||||
The source-side DND apis in GTK 4 have been changed to use an event controller, #GtkDragSource.
|
||||
</para>
|
||||
<para>
|
||||
Instead of calling gtk_drag_source_set() and connecting to #GtkWidget signals, you create
|
||||
a #GtkDragSource object, attach it to the widget with gtk_widget_add_controller(), and connect
|
||||
to #GtkDragSource signals. Instead of calling gtk_drag_begin() on a widget to start a drag
|
||||
manually, call gdk_drag_begin().
|
||||
</para>
|
||||
<para>
|
||||
The ::drag-data-get signal has been replaced by the #GtkDragSource::prepare signal, which
|
||||
returns a #GdkContentProvider for the drag operation.
|
||||
</para>
|
||||
<para>
|
||||
The destination-side DND apis in GTK 4 have also been changed to use and event controller,
|
||||
#GTkDropTarget.
|
||||
</para>
|
||||
<para>
|
||||
Instead of calling gtk_drag_dest_set() and connecting to #GtkWidget signals, you create
|
||||
a #GtkDropTarget object, attach it to the widget with gtk_widget_add_controller(), and
|
||||
connect to #GtkDropTarget signals.
|
||||
</para>
|
||||
<para>
|
||||
The ::drag-motion signal has been renamed to #GtkDragSource::accept, and instead of
|
||||
::drag-data-received, you need to use async read methods on the #GdkDrop object, such
|
||||
as gdk_drop_read_value_async() or gdk_drop_read_text_async().
|
||||
</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
</chapter>
|
||||
|
@@ -42,116 +42,29 @@
|
||||
#include "filetransferportalprivate.h"
|
||||
|
||||
static GDBusProxy *file_transfer_proxy = NULL;
|
||||
static gboolean done;
|
||||
static guint timeout_id;
|
||||
|
||||
static void
|
||||
got_proxy (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer data)
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
file_transfer_proxy = g_dbus_proxy_new_for_bus_finish (result, &error);
|
||||
if (!file_transfer_proxy)
|
||||
{
|
||||
g_message ("failed to get file transfer portal proxy: %s", error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
|
||||
if (timeout_id)
|
||||
{
|
||||
g_source_remove (timeout_id);
|
||||
timeout_id = 0;
|
||||
}
|
||||
|
||||
done = TRUE;
|
||||
g_main_context_wakeup (NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
got_bus (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer data)
|
||||
{
|
||||
GDBusConnection **bus = data;
|
||||
GError *error = NULL;
|
||||
|
||||
*bus = g_bus_get_finish (result, &error);
|
||||
if (!*bus)
|
||||
{
|
||||
g_message ("failed to get session bus connection: %s", error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
|
||||
if (timeout_id)
|
||||
{
|
||||
g_source_remove (timeout_id);
|
||||
timeout_id = 0;
|
||||
}
|
||||
|
||||
done = TRUE;
|
||||
g_main_context_wakeup (NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
give_up_on_proxy (gpointer data)
|
||||
{
|
||||
GCancellable *cancellable = data;
|
||||
|
||||
g_cancellable_cancel (cancellable);
|
||||
|
||||
timeout_id = 0;
|
||||
|
||||
done = TRUE;
|
||||
g_main_context_wakeup (NULL);
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static GDBusProxy *
|
||||
ensure_file_transfer_portal (void)
|
||||
{
|
||||
if (file_transfer_proxy == NULL)
|
||||
{
|
||||
GCancellable *cancellable;
|
||||
GDBusConnection *bus = NULL;
|
||||
GError *error = NULL;
|
||||
|
||||
cancellable = g_cancellable_new ();
|
||||
|
||||
done = FALSE;
|
||||
timeout_id = g_timeout_add (500, give_up_on_proxy, cancellable);
|
||||
g_bus_get (G_BUS_TYPE_SESSION,
|
||||
cancellable,
|
||||
got_bus,
|
||||
&bus);
|
||||
file_transfer_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
||||
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES
|
||||
| G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS
|
||||
| G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
||||
NULL,
|
||||
"org.freedesktop.portal.Documents",
|
||||
"/org/freedesktop/portal/documents",
|
||||
"org.freedesktop.portal.FileTransfer",
|
||||
NULL, &error);
|
||||
|
||||
while (!done)
|
||||
g_main_context_iteration (NULL, TRUE);
|
||||
|
||||
if (bus)
|
||||
if (error)
|
||||
{
|
||||
done = FALSE;
|
||||
timeout_id = g_timeout_add (500, give_up_on_proxy, cancellable);
|
||||
g_dbus_proxy_new (bus,
|
||||
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES
|
||||
| G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS
|
||||
| G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
||||
NULL,
|
||||
"org.freedesktop.portal.Documents",
|
||||
"/org/freedesktop/portal/documents",
|
||||
"org.freedesktop.portal.FileTransfer",
|
||||
cancellable,
|
||||
got_proxy,
|
||||
NULL);
|
||||
|
||||
while (!done)
|
||||
g_main_context_iteration (NULL, TRUE);
|
||||
|
||||
g_clear_object (&bus);
|
||||
g_debug ("Failed to get proxy: %s", error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
|
||||
g_clear_object (&cancellable);
|
||||
}
|
||||
|
||||
if (file_transfer_proxy)
|
||||
|
@@ -24,7 +24,6 @@
|
||||
#include "gdkcontentformats.h"
|
||||
#include "filetransferportalprivate.h"
|
||||
#include "gdktexture.h"
|
||||
#include "gdkrgbaprivate.h"
|
||||
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
|
||||
@@ -849,63 +848,6 @@ file_uri_deserializer (GdkContentDeserializer *deserializer)
|
||||
g_object_unref (output);
|
||||
}
|
||||
|
||||
static void
|
||||
color_deserializer_finish (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer deserializer)
|
||||
{
|
||||
GOutputStream *stream = G_OUTPUT_STREAM (source);
|
||||
GError *error = NULL;
|
||||
gssize written;
|
||||
|
||||
written = g_output_stream_splice_finish (stream, result, &error);
|
||||
if (written < 0)
|
||||
{
|
||||
gdk_content_deserializer_return_error (deserializer, error);
|
||||
return;
|
||||
}
|
||||
else if (written == 0)
|
||||
{
|
||||
GdkRGBA black = GDK_RGBA ("000");
|
||||
|
||||
/* Never return NULL, we only return that on error */
|
||||
g_value_set_boxed (gdk_content_deserializer_get_value (deserializer), &black);
|
||||
}
|
||||
else
|
||||
{
|
||||
guint16 *data;
|
||||
GdkRGBA rgba;
|
||||
|
||||
data = (guint16 *)g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (stream));
|
||||
rgba.red = data[0] / 65535.0;
|
||||
rgba.green = data[1] / 65535.0;
|
||||
rgba.blue = data[2] / 65535.0;
|
||||
rgba.alpha = data[3] / 65535.0;
|
||||
|
||||
g_value_set_boxed (gdk_content_deserializer_get_value (deserializer), &rgba);
|
||||
}
|
||||
gdk_content_deserializer_return_success (deserializer);
|
||||
}
|
||||
|
||||
static void
|
||||
color_deserializer (GdkContentDeserializer *deserializer)
|
||||
{
|
||||
GOutputStream *output;
|
||||
guint16 *data;
|
||||
|
||||
data = g_new0 (guint16, 4);
|
||||
output = g_memory_output_stream_new (data, 4 * sizeof (guint16), NULL, g_free);
|
||||
|
||||
g_output_stream_splice_async (output,
|
||||
gdk_content_deserializer_get_input_stream (deserializer),
|
||||
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
|
||||
gdk_content_deserializer_get_priority (deserializer),
|
||||
gdk_content_deserializer_get_cancellable (deserializer),
|
||||
color_deserializer_finish,
|
||||
deserializer);
|
||||
g_object_unref (output);
|
||||
}
|
||||
|
||||
static void
|
||||
init (void)
|
||||
{
|
||||
@@ -1014,11 +956,5 @@ init (void)
|
||||
string_deserializer,
|
||||
(gpointer) "ASCII",
|
||||
NULL);
|
||||
|
||||
gdk_content_register_deserializer ("application/x-color",
|
||||
GDK_TYPE_RGBA,
|
||||
color_deserializer,
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
@@ -21,7 +21,6 @@
|
||||
#include "gdkcontentprovider.h"
|
||||
|
||||
#include "gdkcontentformats.h"
|
||||
#include "gdkcontentserializer.h"
|
||||
#include "gdkintl.h"
|
||||
#include "gdkcontentproviderimpl.h"
|
||||
|
||||
@@ -281,232 +280,3 @@ gdk_content_provider_new_for_bytes (const char *mime_type,
|
||||
|
||||
return GDK_CONTENT_PROVIDER (content);
|
||||
}
|
||||
|
||||
#define GDK_TYPE_CONTENT_PROVIDER_CALLBACK (gdk_content_provider_callback_get_type ())
|
||||
#define GDK_CONTENT_PROVIDER_CALLBACK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GDK_TYPE_CONTENT_PROVIDER_CALLBACK, GdkContentProviderCallback))
|
||||
|
||||
typedef struct _GdkContentProviderCallback GdkContentProviderCallback;
|
||||
typedef struct _GdkContentProviderCallbackClass GdkContentProviderCallbackClass;
|
||||
|
||||
struct _GdkContentProviderCallback
|
||||
{
|
||||
GdkContentProvider parent;
|
||||
|
||||
GType type;
|
||||
GdkContentProviderGetValueFunc func;
|
||||
gpointer data;
|
||||
};
|
||||
|
||||
struct _GdkContentProviderCallbackClass
|
||||
{
|
||||
GdkContentProviderClass parent_class;
|
||||
};
|
||||
|
||||
GType gdk_content_provider_callback_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_DEFINE_TYPE (GdkContentProviderCallback, gdk_content_provider_callback, GDK_TYPE_CONTENT_PROVIDER)
|
||||
|
||||
static GdkContentFormats *
|
||||
gdk_content_provider_callback_ref_formats (GdkContentProvider *provider)
|
||||
{
|
||||
GdkContentProviderCallback *callback = GDK_CONTENT_PROVIDER_CALLBACK (provider);
|
||||
|
||||
return gdk_content_formats_new_for_gtype (callback->type);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gdk_content_provider_callback_get_value (GdkContentProvider *provider,
|
||||
GValue *value,
|
||||
GError **error)
|
||||
{
|
||||
GdkContentProviderCallback *callback = GDK_CONTENT_PROVIDER_CALLBACK (provider);
|
||||
|
||||
if (G_VALUE_HOLDS (value, callback->type) && callback->func != NULL)
|
||||
{
|
||||
callback->func (value, callback->data);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return GDK_CONTENT_PROVIDER_CLASS (gdk_content_provider_callback_parent_class)->get_value (provider, value, error);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_content_provider_callback_class_init (GdkContentProviderCallbackClass *class)
|
||||
{
|
||||
GdkContentProviderClass *provider_class = GDK_CONTENT_PROVIDER_CLASS (class);
|
||||
|
||||
provider_class->ref_formats = gdk_content_provider_callback_ref_formats;
|
||||
provider_class->get_value = gdk_content_provider_callback_get_value;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_content_provider_callback_init (GdkContentProviderCallback *content)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_content_provider_new_for_callback:
|
||||
* @type: the type that the callback provides
|
||||
* @func: callback to populate a #GValue
|
||||
* @data: (closure): data that gets passed to @func
|
||||
*
|
||||
* Create a content provider that provides data that is provided via a callback.
|
||||
*
|
||||
* Returns: a new #GdkContentProvider
|
||||
**/
|
||||
GdkContentProvider *
|
||||
gdk_content_provider_new_with_callback (GType type,
|
||||
GdkContentProviderGetValueFunc func,
|
||||
gpointer data)
|
||||
{
|
||||
GdkContentProviderCallback *content;
|
||||
|
||||
content = g_object_new (GDK_TYPE_CONTENT_PROVIDER_CALLBACK, NULL);
|
||||
content->type = type;
|
||||
content->func = func;
|
||||
content->data = data;
|
||||
|
||||
return GDK_CONTENT_PROVIDER (content);
|
||||
}
|
||||
|
||||
#define GDK_TYPE_CONTENT_PROVIDER_CALLBACK2 (gdk_content_provider_callback2_get_type ())
|
||||
#define GDK_CONTENT_PROVIDER_CALLBACK2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GDK_TYPE_CONTENT_PROVIDER_CALLBACK2, GdkContentProviderCallback2))
|
||||
|
||||
typedef struct _GdkContentProviderCallback2 GdkContentProviderCallback2;
|
||||
typedef struct _GdkContentProviderCallback2Class GdkContentProviderCallback2Class;
|
||||
|
||||
struct _GdkContentProviderCallback2
|
||||
{
|
||||
GdkContentProvider parent;
|
||||
|
||||
GdkContentFormats *formats;
|
||||
GdkContentProviderGetBytesFunc func;
|
||||
gpointer data;
|
||||
};
|
||||
|
||||
struct _GdkContentProviderCallback2Class
|
||||
{
|
||||
GdkContentProviderClass parent_class;
|
||||
};
|
||||
|
||||
GType gdk_content_provider_callback2_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_DEFINE_TYPE (GdkContentProviderCallback2, gdk_content_provider_callback2, GDK_TYPE_CONTENT_PROVIDER)
|
||||
|
||||
static GdkContentFormats *
|
||||
gdk_content_provider_callback2_ref_formats (GdkContentProvider *provider)
|
||||
{
|
||||
GdkContentProviderCallback2 *callback = GDK_CONTENT_PROVIDER_CALLBACK2 (provider);
|
||||
|
||||
return gdk_content_formats_ref (callback->formats);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_content_provider_callback2_write_mime_type_done (GObject *stream,
|
||||
GAsyncResult *result,
|
||||
gpointer task)
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
if (!g_output_stream_write_all_finish (G_OUTPUT_STREAM (stream), result, NULL, &error))
|
||||
g_task_return_error (task, error);
|
||||
else
|
||||
g_task_return_boolean (task, TRUE);
|
||||
|
||||
g_object_unref (task);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_content_provider_callback2_write_mime_type_async (GdkContentProvider *provider,
|
||||
const char *mime_type,
|
||||
GOutputStream *stream,
|
||||
int io_priority,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
GdkContentProviderCallback2 *content = GDK_CONTENT_PROVIDER_CALLBACK2 (provider);
|
||||
GTask *task;
|
||||
GBytes *bytes;
|
||||
|
||||
task = g_task_new (content, cancellable, callback, user_data);
|
||||
g_task_set_priority (task, io_priority);
|
||||
g_task_set_source_tag (task, gdk_content_provider_callback2_write_mime_type_async);
|
||||
|
||||
if (!gdk_content_formats_contain_mime_type (content->formats, mime_type))
|
||||
{
|
||||
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||
_("Cannot provide contents as “%s”"), mime_type);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
bytes = content->func (mime_type, content->data);
|
||||
if (!bytes)
|
||||
{
|
||||
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||
_("Failed to get contents as “%s”"), mime_type);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
g_object_set_data_full (G_OBJECT (task), "bytes", bytes, (GDestroyNotify)g_bytes_unref);
|
||||
|
||||
g_output_stream_write_all_async (stream,
|
||||
g_bytes_get_data (bytes, NULL),
|
||||
g_bytes_get_size (bytes),
|
||||
io_priority,
|
||||
cancellable,
|
||||
gdk_content_provider_callback2_write_mime_type_done,
|
||||
task);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gdk_content_provider_callback2_write_mime_type_finish (GdkContentProvider *provider,
|
||||
GAsyncResult *result,
|
||||
GError **error)
|
||||
{
|
||||
g_return_val_if_fail (g_task_is_valid (result, provider), FALSE);
|
||||
g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == gdk_content_provider_callback2_write_mime_type_async, FALSE);
|
||||
|
||||
return g_task_propagate_boolean (G_TASK (result), error);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_content_provider_callback2_class_init (GdkContentProviderCallback2Class *class)
|
||||
{
|
||||
GdkContentProviderClass *provider_class = GDK_CONTENT_PROVIDER_CLASS (class);
|
||||
|
||||
provider_class->ref_formats = gdk_content_provider_callback2_ref_formats;
|
||||
provider_class->write_mime_type_async = gdk_content_provider_callback2_write_mime_type_async;
|
||||
provider_class->write_mime_type_finish = gdk_content_provider_callback2_write_mime_type_finish;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_content_provider_callback2_init (GdkContentProviderCallback2 *content)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_content_provider_new_with_formats:
|
||||
* @formats: formats to advertise
|
||||
* @func: callback to populate a #GValue
|
||||
* @data: data that gets passed to @func
|
||||
*
|
||||
* Create a content provider that provides data that is provided via a callback.
|
||||
*
|
||||
* Returns: a new #GdkContentProvider
|
||||
**/
|
||||
GdkContentProvider *
|
||||
gdk_content_provider_new_with_formats (GdkContentFormats *formats,
|
||||
GdkContentProviderGetBytesFunc func,
|
||||
gpointer data)
|
||||
{
|
||||
GdkContentProviderCallback2 *content;
|
||||
content = g_object_new (GDK_TYPE_CONTENT_PROVIDER_CALLBACK2, NULL);
|
||||
content->formats = gdk_content_formats_union_serialize_mime_types (gdk_content_formats_ref (formats));
|
||||
content->func = func;
|
||||
content->data = data;
|
||||
|
||||
return GDK_CONTENT_PROVIDER (content);
|
||||
}
|
||||
|
@@ -35,21 +35,6 @@ GDK_AVAILABLE_IN_ALL
|
||||
GdkContentProvider * gdk_content_provider_new_for_bytes (const char *mime_type,
|
||||
GBytes *bytes);
|
||||
|
||||
typedef void (*GdkContentProviderGetValueFunc) (GValue *value,
|
||||
gpointer data);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkContentProvider * gdk_content_provider_new_with_callback (GType type,
|
||||
GdkContentProviderGetValueFunc func,
|
||||
gpointer data);
|
||||
|
||||
typedef GBytes * (*GdkContentProviderGetBytesFunc) (const char *mime_type,
|
||||
gpointer data);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkContentProvider * gdk_content_provider_new_with_formats (GdkContentFormats *formats,
|
||||
GdkContentProviderGetBytesFunc func,
|
||||
gpointer data);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@@ -25,7 +25,6 @@
|
||||
#include "gdkpixbuf.h"
|
||||
#include "filetransferportalprivate.h"
|
||||
#include "gdktextureprivate.h"
|
||||
#include "gdkrgba.h"
|
||||
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
#include <string.h>
|
||||
@@ -863,48 +862,6 @@ file_text_serializer (GdkContentSerializer *serializer)
|
||||
gdk_content_serializer_set_task_data (serializer, path, g_free);
|
||||
}
|
||||
|
||||
static void
|
||||
color_serializer_finish (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer serializer)
|
||||
{
|
||||
GOutputStream *stream = G_OUTPUT_STREAM (source);
|
||||
GError *error = NULL;
|
||||
|
||||
if (!g_output_stream_write_all_finish (stream, result, NULL, &error))
|
||||
gdk_content_serializer_return_error (serializer, error);
|
||||
else
|
||||
gdk_content_serializer_return_success (serializer);
|
||||
}
|
||||
|
||||
static void
|
||||
color_serializer (GdkContentSerializer *serializer)
|
||||
{
|
||||
const GValue *value;
|
||||
GdkRGBA *rgba;
|
||||
guint16 *data;
|
||||
|
||||
value = gdk_content_serializer_get_value (serializer);
|
||||
rgba = g_value_get_boxed (value);
|
||||
data = g_new0 (guint16, 4);
|
||||
if (rgba)
|
||||
{
|
||||
data[0] = (guint16) (rgba->red * 65535);
|
||||
data[1] = (guint16) (rgba->green * 65535);
|
||||
data[2] = (guint16) (rgba->blue * 65535);
|
||||
data[3] = (guint16) (rgba->alpha * 65535);
|
||||
}
|
||||
|
||||
g_output_stream_write_all_async (gdk_content_serializer_get_output_stream (serializer),
|
||||
data,
|
||||
4 * sizeof (guint16),
|
||||
gdk_content_serializer_get_priority (serializer),
|
||||
gdk_content_serializer_get_cancellable (serializer),
|
||||
color_serializer_finish,
|
||||
serializer);
|
||||
gdk_content_serializer_set_task_data (serializer, data, g_free);
|
||||
}
|
||||
|
||||
static void
|
||||
init (void)
|
||||
{
|
||||
@@ -1027,11 +984,5 @@ init (void)
|
||||
string_serializer,
|
||||
(gpointer) "ASCII",
|
||||
NULL);
|
||||
|
||||
gdk_content_register_serializer (GDK_TYPE_RGBA,
|
||||
"application/x-color",
|
||||
color_serializer,
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
@@ -90,30 +90,20 @@ G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GdkDrag, gdk_drag, G_TYPE_OBJECT)
|
||||
|
||||
/**
|
||||
* SECTION:dnd
|
||||
* @Title: Drag And Drop
|
||||
* @Short_description: Functions for controlling drag and drop handling
|
||||
* @title: Drag And Drop
|
||||
* @short_description: Functions for controlling drag and drop handling
|
||||
*
|
||||
* These functions provide a low-level interface for drag and drop.
|
||||
* These functions provide a low level interface for drag and drop.
|
||||
*
|
||||
* The GdkDrag object represents the source side of an ongoing DND operation.
|
||||
* It is created when a drag is started, and stays alive for duration of
|
||||
* the DND operation. After a drag has been started with gdk_drag_begin(),
|
||||
* the caller gets informed about the status of the ongoing drag operation
|
||||
* with signals on the #GtkDrag object.
|
||||
* the DND operation.
|
||||
*
|
||||
* The GdkDrop object represents the target side of an ongoing DND operation.
|
||||
* Possible drop sites get informed about the status of the ongoing drag operation
|
||||
* with events of type %GDK_DRAG_ENTER, %GDK_DRAG_LEAVE, %GDK_DRAG_MOTION and
|
||||
* %GDK_DROP_START. The #GdkDrop object can be obtained from these #GdkEvents
|
||||
* using gdk_event_get_drop().
|
||||
*
|
||||
* The actual data transfer is initiated from the target side via an async
|
||||
* read, using one of the GdkDrop functions for this purpose: gdk_drop_read_async(),
|
||||
* gdk_drop_read_value_async() or gdk_drop_read_text_async().
|
||||
*
|
||||
* GTK provides a higher level abstraction based on top of these functions,
|
||||
* and so they are not normally needed in GTK applications. See the
|
||||
* [Drag and Drop][gtk4-Drag-and-Drop] section of the GTK documentation
|
||||
* GTK+ provides a higher level abstraction based on top of these functions,
|
||||
* and so they are not normally needed in GTK+ applications. See the
|
||||
* [Drag and Drop][gtk4-Drag-and-Drop] section of the GTK+ documentation
|
||||
* for more information.
|
||||
*/
|
||||
|
||||
|
@@ -1001,30 +1001,3 @@ gdk_drop_emit_drop_event (GdkDrop *self,
|
||||
gdk_drop_do_emit_event (event, dont_queue);
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_drop_has_value:
|
||||
* @self: a #GdkDrop
|
||||
* @type: the type to check
|
||||
*
|
||||
* Returns whether calling gdk_drop_read_value_async() for @type
|
||||
* can succeed.
|
||||
*
|
||||
* Returns: %TRUE if the data can be deserialized to the given type
|
||||
*/
|
||||
gboolean
|
||||
gdk_drop_has_value (GdkDrop *self,
|
||||
GType type)
|
||||
{
|
||||
GdkContentFormats *formats;
|
||||
gboolean ret;
|
||||
|
||||
formats = gdk_content_formats_ref (gdk_drop_get_formats (self));
|
||||
formats = gdk_content_formats_union_deserialize_gtypes (formats);
|
||||
|
||||
ret = gdk_content_formats_contain_gtype (formats, type);
|
||||
|
||||
gdk_content_formats_unref (formats);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@@ -92,9 +92,6 @@ char * gdk_drop_read_text_finish (GdkDrop
|
||||
GAsyncResult *result,
|
||||
GError **error);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gdk_drop_has_value (GdkDrop *self,
|
||||
GType type);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@@ -1013,13 +1013,6 @@ gdk_event_set_coords (GdkEvent *event,
|
||||
event->touchpad_pinch.x = x;
|
||||
event->touchpad_pinch.y = y;
|
||||
break;
|
||||
case GDK_DRAG_ENTER:
|
||||
case GDK_DRAG_LEAVE:
|
||||
case GDK_DRAG_MOTION:
|
||||
case GDK_DROP_START:
|
||||
event->dnd.x = x;
|
||||
event->dnd.y = y;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@@ -248,10 +248,10 @@ gdk_seat_get_capabilities (GdkSeat *seat)
|
||||
* elsewhere.
|
||||
* @event: (nullable): the event that is triggering the grab, or %NULL if none
|
||||
* is available.
|
||||
* @prepare_func: (nullable) (scope call): function to
|
||||
* @prepare_func: (nullable) (scope call) (closure prepare_func_data): function to
|
||||
* prepare the surface to be grabbed, it can be %NULL if @surface is
|
||||
* visible before this call.
|
||||
* @prepare_func_data: (closure): user data to pass to @prepare_func
|
||||
* @prepare_func_data: user data to pass to @prepare_func
|
||||
*
|
||||
* Grabs the seat so that all events corresponding to the given @capabilities
|
||||
* are passed to this application until the seat is ungrabbed with gdk_seat_ungrab(),
|
||||
|
@@ -3583,13 +3583,7 @@ gdk_surface_register_dnd (GdkSurface *surface)
|
||||
*
|
||||
* Starts a drag and creates a new drag context for it.
|
||||
*
|
||||
* This function is called by the drag source. After this call, you
|
||||
* probably want to set up the drag icon using the surface returned
|
||||
* by gdk_drag_get_drag_surface().
|
||||
*
|
||||
* Note: if @actions include %GDK_ACTION_MOVE, you need to listen for
|
||||
* the #GdkDrag::dnd-finished signal and delete the data at the source
|
||||
* if gdk_drag_get_selected_action() returns %GDK_ACTION_MOVE.
|
||||
* This function is called by the drag source.
|
||||
*
|
||||
* Returns: (transfer full) (nullable): a newly created #GdkDrag or
|
||||
* %NULL on error.
|
||||
|
@@ -680,6 +680,7 @@ gdk_quartz_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
{
|
||||
guint tmp_keyval;
|
||||
GdkModifierType bit;
|
||||
guint tmp_modifiers = 0;
|
||||
|
||||
if (keyval)
|
||||
*keyval = 0;
|
||||
@@ -693,23 +694,24 @@ gdk_quartz_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
if (hardware_keycode < 0 || hardware_keycode >= NUM_KEYCODES)
|
||||
return FALSE;
|
||||
|
||||
/* Check if modifiers modify the keyval */
|
||||
for (bit = GDK_SHIFT_MASK; bit < GDK_BUTTON1_MASK; bit <<= 1)
|
||||
{
|
||||
if (translate_keysym (hardware_keycode,
|
||||
(bit == GDK_MOD1_MASK) ? 0 : group,
|
||||
state & ~bit,
|
||||
NULL, NULL) !=
|
||||
translate_keysym (hardware_keycode,
|
||||
(bit == GDK_MOD1_MASK) ? 1 : group,
|
||||
state | bit,
|
||||
NULL, NULL))
|
||||
tmp_modifiers |= bit;
|
||||
}
|
||||
|
||||
tmp_keyval = translate_keysym (hardware_keycode, group, state, level, effective_group);
|
||||
|
||||
/* Check if modifiers modify the keyval */
|
||||
if (consumed_modifiers)
|
||||
{
|
||||
guint tmp_modifiers = (state & GDK_MODIFIER_MASK);
|
||||
|
||||
for (bit = 1; bit <= tmp_modifiers; bit <<= 1)
|
||||
{
|
||||
if ((bit & tmp_modifiers) &&
|
||||
translate_keysym (hardware_keycode, group, state & ~bit,
|
||||
NULL, NULL) == tmp_keyval)
|
||||
tmp_modifiers &= ~bit;
|
||||
}
|
||||
|
||||
*consumed_modifiers = tmp_modifiers;
|
||||
}
|
||||
*consumed_modifiers = tmp_modifiers;
|
||||
|
||||
if (keyval)
|
||||
*keyval = tmp_keyval;
|
||||
|
@@ -4109,7 +4109,7 @@ gdk_wayland_surface_is_exported (GdkSurface *surface)
|
||||
* gdk_wayland_surface_export_handle:
|
||||
* @surface: the #GdkSurface to obtain a handle for
|
||||
* @callback: callback to call with the handle
|
||||
* @user_data: (closure): user data for @callback
|
||||
* @user_data: user data for @callback
|
||||
* @destroy_func: destroy notify for @user_data
|
||||
*
|
||||
* Asynchronously obtains a handle for a surface that can be passed
|
||||
|
@@ -747,7 +747,7 @@ gdk_x11_drop_status (GdkDrop *drop,
|
||||
GdkDragAction actions)
|
||||
{
|
||||
GdkX11Drop *drop_x11 = GDK_X11_DROP (drop);
|
||||
GdkDragAction possible_actions, suggested_action;
|
||||
GdkDragAction possible_actions;
|
||||
XEvent xev;
|
||||
GdkDisplay *display;
|
||||
|
||||
@@ -755,17 +755,6 @@ gdk_x11_drop_status (GdkDrop *drop,
|
||||
|
||||
possible_actions = actions & gdk_drop_get_actions (drop);
|
||||
|
||||
if (drop_x11->suggested_action != 0)
|
||||
suggested_action = drop_x11->suggested_action;
|
||||
else if (possible_actions & GDK_ACTION_COPY)
|
||||
suggested_action = GDK_ACTION_COPY;
|
||||
else if (possible_actions & GDK_ACTION_MOVE)
|
||||
suggested_action = GDK_ACTION_MOVE;
|
||||
else if (possible_actions & GDK_ACTION_ASK)
|
||||
suggested_action = GDK_ACTION_ASK;
|
||||
else
|
||||
suggested_action = 0;
|
||||
|
||||
xev.xclient.type = ClientMessage;
|
||||
xev.xclient.message_type = gdk_x11_get_xatom_by_name_for_display (display, "XdndStatus");
|
||||
xev.xclient.format = 32;
|
||||
@@ -775,7 +764,7 @@ gdk_x11_drop_status (GdkDrop *drop,
|
||||
xev.xclient.data.l[1] = (possible_actions != 0) ? (2 | 1) : 0;
|
||||
xev.xclient.data.l[2] = 0;
|
||||
xev.xclient.data.l[3] = 0;
|
||||
xev.xclient.data.l[4] = xdnd_action_to_atom (display, suggested_action);
|
||||
xev.xclient.data.l[4] = xdnd_action_to_atom (display, possible_actions);
|
||||
|
||||
if (gdk_drop_get_drag (drop))
|
||||
{
|
||||
|
@@ -90,8 +90,8 @@
|
||||
#include <gtk/gtkcustomlayout.h>
|
||||
#include <gtk/gtkdebug.h>
|
||||
#include <gtk/gtkdialog.h>
|
||||
#include <gtk/gtkdnd.h>
|
||||
#include <gtk/gtkdragdest.h>
|
||||
#include <gtk/gtkdragicon.h>
|
||||
#include <gtk/gtkdragsource.h>
|
||||
#include <gtk/gtkdrawingarea.h>
|
||||
#include <gtk/gtkeditable.h>
|
||||
|
@@ -412,7 +412,7 @@ gtk_builder_cscope_init (GtkBuilderCScope *self)
|
||||
* Calling this function is only necessary if you want to add custom
|
||||
* callbacks via gtk_builder_cscope_add_callback_symbol().
|
||||
*
|
||||
* Returns: (transfer full): a new #GtkBuilderCScope
|
||||
* Returns: a new #GtkBuilderCScope
|
||||
**/
|
||||
GtkBuilderScope *
|
||||
gtk_builder_cscope_new (void)
|
||||
@@ -502,7 +502,7 @@ gtk_builder_cscope_add_callback_symbols (GtkBuilderCScope *self,
|
||||
* Fetches a symbol previously added to @self
|
||||
* with gtk_builder_cscope_add_callback_symbol().
|
||||
*
|
||||
* Returns: (nullable) (transfer none): The callback symbol in @builder for @callback_name, or %NULL
|
||||
* Returns: (nullable): The callback symbol in @builder for @callback_name, or %NULL
|
||||
*/
|
||||
GCallback
|
||||
gtk_builder_cscope_lookup_callback_symbol (GtkBuilderCScope *self,
|
||||
|
@@ -72,6 +72,7 @@
|
||||
#endif
|
||||
|
||||
#include "gtkcalendar.h"
|
||||
#include "gtkdnd.h"
|
||||
#include "gtkdragdest.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkmain.h"
|
||||
@@ -86,10 +87,6 @@
|
||||
#include "gtkgesturedrag.h"
|
||||
#include "gtkeventcontrollerscroll.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtkdragsource.h"
|
||||
#include "gtknative.h"
|
||||
#include "gtkicontheme.h"
|
||||
#include "gtkdragicon.h"
|
||||
|
||||
#define TIMEOUT_INITIAL 500
|
||||
#define TIMEOUT_REPEAT 50
|
||||
@@ -251,6 +248,7 @@ struct _GtkCalendarPrivate
|
||||
guint need_timer : 1;
|
||||
|
||||
guint in_drag : 1;
|
||||
guint drag_highlight : 1;
|
||||
|
||||
guint32 timer;
|
||||
gint click_child;
|
||||
@@ -331,17 +329,22 @@ static gboolean gtk_calendar_query_tooltip (GtkWidget *widget,
|
||||
gboolean keyboard_mode,
|
||||
GtkTooltip *tooltip);
|
||||
|
||||
static gboolean gtk_calendar_drag_accept (GtkDropTarget *dest,
|
||||
static void gtk_calendar_drag_data_get (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
GtkSelectionData *selection_data);
|
||||
static void gtk_calendar_drag_data_received (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GtkCalendar *calendar);
|
||||
static void gtk_calendar_drag_leave (GtkDropTarget *dest,
|
||||
GtkSelectionData *selection_data);
|
||||
static gboolean gtk_calendar_drag_motion (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GtkCalendar *calendar);
|
||||
static gboolean gtk_calendar_drag_drop (GtkDropTarget *dest,
|
||||
gint x,
|
||||
gint y);
|
||||
static void gtk_calendar_drag_leave (GtkWidget *widget,
|
||||
GdkDrop *drop);
|
||||
static gboolean gtk_calendar_drag_drop (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
int x,
|
||||
int y,
|
||||
GtkCalendar *calendar);
|
||||
gint x,
|
||||
gint y);
|
||||
|
||||
|
||||
static void calendar_start_spinning (GtkCalendar *calendar,
|
||||
@@ -389,6 +392,12 @@ gtk_calendar_class_init (GtkCalendarClass *class)
|
||||
widget_class->grab_notify = gtk_calendar_grab_notify;
|
||||
widget_class->query_tooltip = gtk_calendar_query_tooltip;
|
||||
|
||||
widget_class->drag_data_get = gtk_calendar_drag_data_get;
|
||||
widget_class->drag_motion = gtk_calendar_drag_motion;
|
||||
widget_class->drag_leave = gtk_calendar_drag_leave;
|
||||
widget_class->drag_drop = gtk_calendar_drag_drop;
|
||||
widget_class->drag_data_received = gtk_calendar_drag_data_received;
|
||||
|
||||
/**
|
||||
* GtkCalendar:year:
|
||||
*
|
||||
@@ -666,8 +675,6 @@ gtk_calendar_init (GtkCalendar *calendar)
|
||||
#else
|
||||
gchar *week_start;
|
||||
#endif
|
||||
GdkContentFormats *formats;
|
||||
GtkDropTarget *dest;
|
||||
|
||||
gtk_widget_set_can_focus (widget, TRUE);
|
||||
|
||||
@@ -785,17 +792,11 @@ gtk_calendar_init (GtkCalendar *calendar)
|
||||
priv->click_child = -1;
|
||||
|
||||
priv->in_drag = 0;
|
||||
priv->drag_highlight = 0;
|
||||
|
||||
formats = gdk_content_formats_new_for_gtype (G_TYPE_STRING);
|
||||
dest = gtk_drop_target_new (formats, GDK_ACTION_COPY);
|
||||
gdk_content_formats_unref (formats);
|
||||
gtk_drag_dest_set (widget, 0, NULL, GDK_ACTION_COPY);
|
||||
gtk_drag_dest_add_text_targets (widget);
|
||||
|
||||
g_signal_connect (dest, "accept", G_CALLBACK (gtk_calendar_drag_accept), calendar);
|
||||
g_signal_connect (dest, "drag-leave", G_CALLBACK (gtk_calendar_drag_leave), calendar);
|
||||
g_signal_connect (dest, "drag-drop", G_CALLBACK (gtk_calendar_drag_drop), calendar);
|
||||
|
||||
gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (dest));
|
||||
|
||||
priv->year_before = 0;
|
||||
|
||||
/* Translate to calendar:YM if you want years to be displayed
|
||||
@@ -2394,6 +2395,7 @@ calendar_snapshot_arrow (GtkCalendar *calendar,
|
||||
{
|
||||
GtkWidget *widget = GTK_WIDGET (calendar);
|
||||
GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
|
||||
GtkCssImageBuiltinType image_type;
|
||||
GtkStyleContext *context;
|
||||
GtkStateFlags state;
|
||||
GdkRectangle rect;
|
||||
@@ -2416,11 +2418,19 @@ calendar_snapshot_arrow (GtkCalendar *calendar,
|
||||
rect.x, rect.y,
|
||||
rect.width, rect.height);
|
||||
|
||||
if (arrow == ARROW_MONTH_LEFT || arrow == ARROW_YEAR_LEFT)
|
||||
image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT;
|
||||
else
|
||||
image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT;
|
||||
|
||||
gtk_snapshot_save (snapshot);
|
||||
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT(
|
||||
rect.x + (rect.width - 8) / 2,
|
||||
rect.y + (rect.height - 8) / 2));
|
||||
gtk_css_style_snapshot_icon (gtk_style_context_lookup_style (context), snapshot, 8, 8);
|
||||
gtk_css_style_snapshot_icon (gtk_style_context_lookup_style (context),
|
||||
snapshot,
|
||||
8, 8,
|
||||
image_type);
|
||||
gtk_snapshot_restore (snapshot);
|
||||
|
||||
gtk_style_context_restore (context);
|
||||
@@ -2660,27 +2670,6 @@ gtk_calendar_drag_begin (GtkGestureDrag *gesture,
|
||||
priv->in_drag = TRUE;
|
||||
}
|
||||
|
||||
static GdkContentProvider *
|
||||
get_calendar_content (GtkCalendar *calendar)
|
||||
{
|
||||
GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
|
||||
GDate *date;
|
||||
gchar str[128];
|
||||
GValue value = G_VALUE_INIT;
|
||||
GdkContentProvider *content;
|
||||
|
||||
date = g_date_new_dmy (priv->selected_day, priv->month + 1, priv->year);
|
||||
g_date_strftime (str, 127, "%x", date);
|
||||
g_free (date);
|
||||
|
||||
g_value_init (&value, G_TYPE_STRING);
|
||||
g_value_set_string (&value, str);
|
||||
content = gdk_content_provider_new_for_value (&value);
|
||||
g_value_unset (&value);
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_calendar_drag_update (GtkGestureDrag *gesture,
|
||||
double x,
|
||||
@@ -2691,12 +2680,8 @@ gtk_calendar_drag_update (GtkGestureDrag *gesture,
|
||||
GtkCalendar *calendar = GTK_CALENDAR (widget);
|
||||
GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
|
||||
gdouble start_x, start_y;
|
||||
GdkContentProvider *content;
|
||||
GdkDevice *device;
|
||||
GdkDrag *drag;
|
||||
GtkIconTheme *theme;
|
||||
GdkPaintable *paintable;
|
||||
GdkSurface *surface;
|
||||
GdkContentFormats *targets;
|
||||
|
||||
if (!priv->in_drag)
|
||||
return;
|
||||
@@ -2706,22 +2691,19 @@ gtk_calendar_drag_update (GtkGestureDrag *gesture,
|
||||
|
||||
gtk_gesture_drag_get_start_point (gesture, &start_x, &start_y);
|
||||
|
||||
surface = gtk_native_get_surface (gtk_widget_get_native (widget));
|
||||
device = gtk_gesture_get_device (GTK_GESTURE (gesture));
|
||||
gtk_event_controller_reset (GTK_EVENT_CONTROLLER (gesture));
|
||||
|
||||
content = get_calendar_content (calendar);
|
||||
|
||||
drag = gdk_drag_begin (surface, device, content, GDK_ACTION_COPY, start_x, start_y);
|
||||
|
||||
theme = gtk_icon_theme_get_for_display (gtk_widget_get_display (widget));
|
||||
paintable = gtk_icon_theme_load_icon (theme, "text-x-generic", 32, 0, NULL);
|
||||
gtk_drag_icon_set_from_paintable (drag, paintable, 0, 0);
|
||||
g_clear_object (&paintable);
|
||||
|
||||
g_object_unref (content);
|
||||
g_object_unref (drag);
|
||||
targets = gdk_content_formats_new (NULL, 0);
|
||||
targets = gtk_content_formats_add_text_targets (targets);
|
||||
drag = gtk_drag_begin (widget,
|
||||
gtk_gesture_get_device (GTK_GESTURE (gesture)),
|
||||
targets, GDK_ACTION_COPY,
|
||||
start_x, start_y);
|
||||
|
||||
priv->in_drag = 0;
|
||||
gdk_content_formats_unref (targets);
|
||||
|
||||
gtk_drag_set_icon_default (drag);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -2941,6 +2923,24 @@ gtk_calendar_grab_notify (GtkWidget *widget,
|
||||
* Drag and Drop *
|
||||
****************************************/
|
||||
|
||||
static void
|
||||
gtk_calendar_drag_data_get (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
GtkSelectionData *selection_data)
|
||||
{
|
||||
GtkCalendar *calendar = GTK_CALENDAR (widget);
|
||||
GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
|
||||
GDate *date;
|
||||
gchar str[128];
|
||||
gsize len;
|
||||
|
||||
date = g_date_new_dmy (priv->selected_day, priv->month + 1, priv->year);
|
||||
len = g_date_strftime (str, 127, "%x", date);
|
||||
gtk_selection_data_set_text (selection_data, str, len);
|
||||
|
||||
g_free (date);
|
||||
}
|
||||
|
||||
/* Get/set whether drag_motion requested the drag data and
|
||||
* drag_data_received should thus not actually insert the data,
|
||||
* since the data doesn’t result from a drop.
|
||||
@@ -2962,33 +2962,87 @@ get_status_pending (GdkDrop *drop)
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_calendar_drag_leave (GtkDropTarget *dest,
|
||||
GdkDrop *drop,
|
||||
GtkCalendar *calendar)
|
||||
gtk_calendar_drag_leave (GtkWidget *widget,
|
||||
GdkDrop *drop)
|
||||
{
|
||||
GtkCalendar *calendar = GTK_CALENDAR (widget);
|
||||
GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
|
||||
|
||||
priv->drag_highlight = 0;
|
||||
gtk_drag_unhighlight (widget);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_calendar_drag_motion (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
GtkCalendar *calendar = GTK_CALENDAR (widget);
|
||||
GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
|
||||
GdkAtom target;
|
||||
|
||||
if (!priv->drag_highlight)
|
||||
{
|
||||
priv->drag_highlight = 1;
|
||||
gtk_drag_highlight (widget);
|
||||
}
|
||||
|
||||
target = gtk_drag_dest_find_target (widget, drop, NULL);
|
||||
if (target == NULL || gdk_drop_get_actions (drop) == 0)
|
||||
gdk_drop_status (drop, 0);
|
||||
else if (get_status_pending (drop) == 0)
|
||||
{
|
||||
set_status_pending (drop, gdk_drop_get_actions (drop));
|
||||
gtk_drag_get_data (widget, drop, target);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_calendar_drag_drop (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
GdkAtom target;
|
||||
|
||||
target = gtk_drag_dest_find_target (widget, drop, NULL);
|
||||
if (target != NULL)
|
||||
{
|
||||
gtk_drag_get_data (widget, drop, target);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
got_text (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer data)
|
||||
gtk_calendar_drag_data_received (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GtkSelectionData *selection_data)
|
||||
{
|
||||
GtkDropTarget *dest = GTK_DROP_TARGET (data);
|
||||
GtkCalendar *calendar = GTK_CALENDAR (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (dest)));
|
||||
GtkCalendar *calendar = GTK_CALENDAR (widget);
|
||||
GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
|
||||
GdkDrop *drop = GDK_DROP (source);
|
||||
guint day, month, year;
|
||||
gchar *str;
|
||||
GDate *date;
|
||||
GdkDragAction suggested_action;
|
||||
|
||||
suggested_action = get_status_pending (drop);
|
||||
set_status_pending (drop, 0);
|
||||
|
||||
str = gdk_drop_read_text_finish (drop, result, NULL);
|
||||
|
||||
if (suggested_action)
|
||||
{
|
||||
set_status_pending (drop, 0);
|
||||
|
||||
/* We are getting this data due to a request in drag_motion,
|
||||
* rather than due to a request in drag_drop, so we are just
|
||||
* supposed to call drag_status, not actually paste in the
|
||||
* data.
|
||||
*/
|
||||
str = (gchar*) gtk_selection_data_get_text (selection_data);
|
||||
|
||||
if (str)
|
||||
{
|
||||
date = g_date_new ();
|
||||
@@ -3000,13 +3054,14 @@ got_text (GObject *source,
|
||||
}
|
||||
else
|
||||
suggested_action = 0;
|
||||
|
||||
gdk_drop_status (drop, suggested_action);
|
||||
if (suggested_action == 0)
|
||||
gtk_drop_target_deny_drop (dest, drop);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
date = g_date_new ();
|
||||
str = (gchar*) gtk_selection_data_get_text (selection_data);
|
||||
if (str)
|
||||
{
|
||||
g_date_set_parse (date, str);
|
||||
@@ -3018,7 +3073,6 @@ got_text (GObject *source,
|
||||
g_warning ("Received invalid date data");
|
||||
g_date_free (date);
|
||||
gdk_drop_finish (drop, 0);
|
||||
gtk_drop_target_deny_drop (dest, drop);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3029,6 +3083,7 @@ got_text (GObject *source,
|
||||
|
||||
gdk_drop_finish (drop, suggested_action);
|
||||
|
||||
|
||||
g_object_freeze_notify (G_OBJECT (calendar));
|
||||
if (!(priv->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE)
|
||||
&& (priv->display_flags & GTK_CALENDAR_SHOW_HEADING))
|
||||
@@ -3037,47 +3092,6 @@ got_text (GObject *source,
|
||||
g_object_thaw_notify (G_OBJECT (calendar));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_calendar_drag_accept (GtkDropTarget *dest,
|
||||
GdkDrop *drop,
|
||||
GtkCalendar *calendar)
|
||||
{
|
||||
GdkAtom target;
|
||||
|
||||
target = gtk_drop_target_find_mimetype (dest);
|
||||
if (!target || gdk_drop_get_actions (drop) == 0)
|
||||
{
|
||||
gdk_drop_status (drop, 0);
|
||||
return FALSE;
|
||||
}
|
||||
else if (get_status_pending (drop) == 0)
|
||||
{
|
||||
set_status_pending (drop, gdk_drop_get_actions (drop));
|
||||
gdk_drop_read_text_async (drop, NULL, got_text, dest);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_calendar_drag_drop (GtkDropTarget *dest,
|
||||
GdkDrop *drop,
|
||||
int x,
|
||||
int y,
|
||||
GtkCalendar *calendar)
|
||||
{
|
||||
GdkAtom target;
|
||||
|
||||
target = gtk_drop_target_find_mimetype (dest);
|
||||
if (target != NULL)
|
||||
{
|
||||
set_status_pending (drop, 0);
|
||||
gdk_drop_read_text_async (drop, NULL, got_text, dest);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/****************************************
|
||||
* Public API *
|
||||
|
@@ -406,6 +406,7 @@ gtk_cell_renderer_toggle_snapshot (GtkCellRenderer *cell,
|
||||
gint xpad, ypad;
|
||||
GtkStateFlags state;
|
||||
GtkBorder padding, border;
|
||||
GtkCssImageBuiltinType image_type;
|
||||
|
||||
gtk_cell_renderer_toggle_get_size (cell, widget, cell_area,
|
||||
&x_offset, &y_offset,
|
||||
@@ -451,12 +452,32 @@ gtk_cell_renderer_toggle_snapshot (GtkCellRenderer *cell,
|
||||
gtk_style_context_get_padding (context, &padding);
|
||||
gtk_style_context_get_border (context, &border);
|
||||
|
||||
if (priv->radio)
|
||||
{
|
||||
if (state & GTK_STATE_FLAG_INCONSISTENT)
|
||||
image_type = GTK_CSS_IMAGE_BUILTIN_OPTION_INCONSISTENT;
|
||||
else if (state & GTK_STATE_FLAG_CHECKED)
|
||||
image_type = GTK_CSS_IMAGE_BUILTIN_OPTION;
|
||||
else
|
||||
image_type = GTK_CSS_IMAGE_BUILTIN_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (state & GTK_STATE_FLAG_INCONSISTENT)
|
||||
image_type = GTK_CSS_IMAGE_BUILTIN_CHECK_INCONSISTENT;
|
||||
else if (state & GTK_STATE_FLAG_CHECKED)
|
||||
image_type = GTK_CSS_IMAGE_BUILTIN_CHECK;
|
||||
else
|
||||
image_type = GTK_CSS_IMAGE_BUILTIN_NONE;
|
||||
}
|
||||
|
||||
gtk_snapshot_translate (snapshot,
|
||||
&GRAPHENE_POINT_INIT (cell_area->x + x_offset + xpad + padding.left + border.left,
|
||||
cell_area->y + y_offset + ypad + padding.top + border.top));
|
||||
gtk_css_style_snapshot_icon (gtk_style_context_lookup_style (context), snapshot,
|
||||
width - padding.left - padding.right - border.left - border.right,
|
||||
height - padding.top - padding.bottom - border.top - border.bottom);
|
||||
height - padding.top - padding.bottom - border.top - border.bottom,
|
||||
image_type);
|
||||
|
||||
gtk_style_context_restore (context);
|
||||
gtk_snapshot_pop (snapshot);
|
||||
|
@@ -98,6 +98,7 @@ static void
|
||||
gtk_check_button_update_node_state (GtkWidget *widget)
|
||||
{
|
||||
GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
|
||||
GtkCssImageBuiltinType image_type;
|
||||
GtkStateFlags state;
|
||||
|
||||
if (!priv->indicator_widget)
|
||||
@@ -105,6 +106,17 @@ gtk_check_button_update_node_state (GtkWidget *widget)
|
||||
|
||||
state = gtk_widget_get_state_flags (widget);
|
||||
|
||||
/* XXX: This is somewhat awkward here, but there's no better
|
||||
* way to update the icon
|
||||
*/
|
||||
if (state & GTK_STATE_FLAG_CHECKED)
|
||||
image_type = GTK_IS_RADIO_BUTTON (widget) ? GTK_CSS_IMAGE_BUILTIN_OPTION : GTK_CSS_IMAGE_BUILTIN_CHECK;
|
||||
else if (state & GTK_STATE_FLAG_INCONSISTENT)
|
||||
image_type = GTK_IS_RADIO_BUTTON (widget) ? GTK_CSS_IMAGE_BUILTIN_OPTION_INCONSISTENT : GTK_CSS_IMAGE_BUILTIN_CHECK_INCONSISTENT;
|
||||
else
|
||||
image_type = GTK_CSS_IMAGE_BUILTIN_NONE;
|
||||
|
||||
gtk_icon_set_image (GTK_ICON (priv->indicator_widget), image_type);
|
||||
gtk_widget_set_state_flags (priv->indicator_widget, state, TRUE);
|
||||
}
|
||||
|
||||
|
@@ -36,6 +36,7 @@
|
||||
#include "gtkcolorchooserprivate.h"
|
||||
#include "gtkcolorchooserdialog.h"
|
||||
#include "gtkcolorswatchprivate.h"
|
||||
#include "gtkdnd.h"
|
||||
#include "gtkdragdest.h"
|
||||
#include "gtkdragsource.h"
|
||||
#include "gtkintl.h"
|
||||
@@ -44,9 +45,6 @@
|
||||
#include "gtkprivate.h"
|
||||
#include "gtksnapshot.h"
|
||||
#include "gtkstylecontext.h"
|
||||
#include "gtkdragsource.h"
|
||||
#include "gtkdragdest.h"
|
||||
#include "gtkeventcontroller.h"
|
||||
|
||||
|
||||
/**
|
||||
@@ -123,6 +121,21 @@ static void gtk_color_button_get_property (GObject *object,
|
||||
static void gtk_color_button_clicked (GtkButton *button,
|
||||
gpointer user_data);
|
||||
|
||||
/* source side drag signals */
|
||||
static void gtk_color_button_drag_begin (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
gpointer data);
|
||||
static void gtk_color_button_drag_data_get (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
GtkSelectionData *selection_data,
|
||||
GtkColorButton *button);
|
||||
|
||||
/* target side drag signals */
|
||||
static void gtk_color_button_drag_data_received (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GtkSelectionData *selection_data,
|
||||
GtkColorButton *button);
|
||||
|
||||
|
||||
static guint color_button_signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
@@ -232,64 +245,91 @@ gtk_color_button_class_init (GtkColorButtonClass *klass)
|
||||
}
|
||||
|
||||
static void
|
||||
got_color (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer data)
|
||||
gtk_color_button_drag_data_received (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GtkSelectionData *selection_data,
|
||||
GtkColorButton *button)
|
||||
{
|
||||
GdkDrop *drop = GDK_DROP (source);
|
||||
const GValue *value;
|
||||
GtkColorButtonPrivate *priv = gtk_color_button_get_instance_private (button);
|
||||
gint length;
|
||||
guint16 *dropped;
|
||||
|
||||
value = gdk_drop_read_value_finish (drop, result, NULL);
|
||||
if (value)
|
||||
{
|
||||
GdkRGBA *color = g_value_get_boxed (value);
|
||||
gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (data), color);
|
||||
gdk_drop_finish (drop, GDK_ACTION_COPY);
|
||||
}
|
||||
else
|
||||
gdk_drop_finish (drop, 0);
|
||||
}
|
||||
length = gtk_selection_data_get_length (selection_data);
|
||||
|
||||
static gboolean
|
||||
gtk_color_button_drag_drop (GtkDropTarget *dest,
|
||||
GdkDrop *drop,
|
||||
int x,
|
||||
int y,
|
||||
GtkColorButton *button)
|
||||
{
|
||||
if (gdk_drop_has_value (drop, GDK_TYPE_RGBA))
|
||||
if (length < 0)
|
||||
return;
|
||||
|
||||
/* We accept drops with the wrong format, since the KDE color
|
||||
* chooser incorrectly drops application/x-color with format 8.
|
||||
*/
|
||||
if (length != 8)
|
||||
{
|
||||
gdk_drop_read_value_async (drop, GDK_TYPE_RGBA, G_PRIORITY_DEFAULT, NULL, got_color, button);
|
||||
return TRUE;
|
||||
g_warning ("%s: Received invalid color data", G_STRFUNC);
|
||||
return;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
||||
dropped = (guint16 *) gtk_selection_data_get_data (selection_data);
|
||||
|
||||
priv->rgba.red = dropped[0] / 65535.;
|
||||
priv->rgba.green = dropped[1] / 65535.;
|
||||
priv->rgba.blue = dropped[2] / 65535.;
|
||||
priv->rgba.alpha = dropped[3] / 65535.;
|
||||
|
||||
gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (priv->swatch), &priv->rgba);
|
||||
|
||||
g_signal_emit (button, color_button_signals[COLOR_SET], 0);
|
||||
|
||||
g_object_freeze_notify (G_OBJECT (button));
|
||||
g_object_notify (G_OBJECT (button), "rgba");
|
||||
g_object_thaw_notify (G_OBJECT (button));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_color_button_drag_begin (GtkDragSource *source,
|
||||
GdkDrag *drag,
|
||||
GtkColorButton *button)
|
||||
set_color_icon (GdkDrag *drag,
|
||||
const GdkRGBA *rgba)
|
||||
{
|
||||
GtkColorButtonPrivate *priv = gtk_color_button_get_instance_private (button);
|
||||
GtkSnapshot *snapshot;
|
||||
GdkPaintable *paintable;
|
||||
|
||||
snapshot = gtk_snapshot_new ();
|
||||
gtk_snapshot_append_color (snapshot, &priv->rgba, &GRAPHENE_RECT_INIT(0, 0, 48, 32));
|
||||
gtk_snapshot_append_color (snapshot,
|
||||
rgba,
|
||||
&GRAPHENE_RECT_INIT(0, 0, 48, 32));
|
||||
paintable = gtk_snapshot_free_to_paintable (snapshot, NULL);
|
||||
|
||||
gtk_drag_source_set_icon (source, paintable, 0, 0);
|
||||
|
||||
gtk_drag_set_icon_paintable (drag, paintable, 0, 0);
|
||||
g_object_unref (paintable);
|
||||
}
|
||||
|
||||
static void
|
||||
get_rgba_value (GValue *value,
|
||||
gpointer data)
|
||||
gtk_color_button_drag_begin (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
gpointer data)
|
||||
{
|
||||
GtkColorButtonPrivate *priv = gtk_color_button_get_instance_private (GTK_COLOR_BUTTON (data));
|
||||
g_value_set_boxed (value, &priv->rgba);
|
||||
GtkColorButton *button = data;
|
||||
GtkColorButtonPrivate *priv = gtk_color_button_get_instance_private (button);
|
||||
|
||||
set_color_icon (drag, &priv->rgba);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_color_button_drag_data_get (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
GtkSelectionData *selection_data,
|
||||
GtkColorButton *button)
|
||||
{
|
||||
GtkColorButtonPrivate *priv = gtk_color_button_get_instance_private (button);
|
||||
guint16 dropped[4];
|
||||
|
||||
dropped[0] = (guint16) (priv->rgba.red * 65535);
|
||||
dropped[1] = (guint16) (priv->rgba.green * 65535);
|
||||
dropped[2] = (guint16) (priv->rgba.blue * 65535);
|
||||
dropped[3] = (guint16) (priv->rgba.alpha * 65535);
|
||||
|
||||
gtk_selection_data_set (selection_data,
|
||||
gtk_selection_data_get_target (selection_data),
|
||||
16, (guchar *)dropped, 8);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -300,9 +340,6 @@ gtk_color_button_init (GtkColorButton *button)
|
||||
PangoRectangle rect;
|
||||
GtkStyleContext *context;
|
||||
GdkContentFormats *targets;
|
||||
GdkContentProvider *content;
|
||||
GtkDragSource *source;
|
||||
GtkDropTarget *dest;
|
||||
|
||||
priv->button = gtk_button_new ();
|
||||
g_signal_connect (priv->button, "clicked", G_CALLBACK (gtk_color_button_clicked), button);
|
||||
@@ -327,17 +364,23 @@ gtk_color_button_init (GtkColorButton *button)
|
||||
priv->use_alpha = FALSE;
|
||||
|
||||
targets = gdk_content_formats_new (drop_types, G_N_ELEMENTS (drop_types));
|
||||
dest = gtk_drop_target_new (targets, GDK_ACTION_COPY);
|
||||
g_signal_connect (dest, "drag-drop", G_CALLBACK (gtk_color_button_drag_drop), button);
|
||||
gtk_widget_add_controller (GTK_WIDGET (button), GTK_EVENT_CONTROLLER (dest));
|
||||
gtk_drag_dest_set (priv->button,
|
||||
GTK_DEST_DEFAULT_MOTION |
|
||||
GTK_DEST_DEFAULT_HIGHLIGHT |
|
||||
GTK_DEST_DEFAULT_DROP,
|
||||
targets,
|
||||
GDK_ACTION_COPY);
|
||||
gtk_drag_source_set (priv->button,
|
||||
GDK_BUTTON1_MASK|GDK_BUTTON3_MASK,
|
||||
targets,
|
||||
GDK_ACTION_COPY);
|
||||
gdk_content_formats_unref (targets);
|
||||
|
||||
source = gtk_drag_source_new ();
|
||||
content = gdk_content_provider_new_with_callback (GDK_TYPE_RGBA, get_rgba_value, button);
|
||||
gtk_drag_source_set_content (source, content);
|
||||
g_object_unref (content);
|
||||
g_signal_connect (source, "drag-begin", G_CALLBACK (gtk_color_button_drag_begin), button);
|
||||
gtk_widget_add_controller (priv->button, GTK_EVENT_CONTROLLER (source));
|
||||
g_signal_connect (priv->button, "drag-begin",
|
||||
G_CALLBACK (gtk_color_button_drag_begin), button);
|
||||
g_signal_connect (priv->button, "drag-data-received",
|
||||
G_CALLBACK (gtk_color_button_drag_data_received), button);
|
||||
g_signal_connect (priv->button, "drag-data-get",
|
||||
G_CALLBACK (gtk_color_button_drag_data_get), button);
|
||||
|
||||
context = gtk_widget_get_style_context (GTK_WIDGET (priv->button));
|
||||
gtk_style_context_add_class (context, "color");
|
||||
|
@@ -22,6 +22,7 @@
|
||||
#include "gtkbox.h"
|
||||
#include "gtkcolorchooserprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
#include "gtkdnd.h"
|
||||
#include "gtkdragdest.h"
|
||||
#include "gtkdragsource.h"
|
||||
#include "gtkgesturelongpress.h"
|
||||
@@ -39,7 +40,6 @@
|
||||
#include "gtkwidgetprivate.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtknative.h"
|
||||
#include "gtkdragsource.h"
|
||||
|
||||
#include "a11y/gtkcolorswatchaccessibleprivate.h"
|
||||
|
||||
@@ -66,7 +66,6 @@ typedef struct
|
||||
GtkWidget *overlay_widget;
|
||||
|
||||
GtkWidget *popover;
|
||||
GtkDropTarget *dest;
|
||||
} GtkColorSwatchPrivate;
|
||||
|
||||
enum
|
||||
@@ -74,8 +73,7 @@ enum
|
||||
PROP_ZERO,
|
||||
PROP_RGBA,
|
||||
PROP_SELECTABLE,
|
||||
PROP_HAS_MENU,
|
||||
PROP_CAN_DROP
|
||||
PROP_HAS_MENU
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (GtkColorSwatch, gtk_color_swatch, GTK_TYPE_WIDGET)
|
||||
@@ -115,57 +113,87 @@ swatch_snapshot (GtkWidget *widget,
|
||||
gtk_widget_snapshot_child (widget, priv->overlay_widget, snapshot);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gtk_color_swatch_drag_begin (GtkDragSource *source,
|
||||
GdkDrag *drag,
|
||||
GtkColorSwatch *swatch)
|
||||
drag_set_color_icon (GdkDrag *drag,
|
||||
const GdkRGBA *color)
|
||||
{
|
||||
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
|
||||
GtkSnapshot *snapshot;
|
||||
GdkPaintable *paintable;
|
||||
|
||||
snapshot = gtk_snapshot_new ();
|
||||
gtk_snapshot_append_color (snapshot, &priv->color, &GRAPHENE_RECT_INIT(0, 0, 48, 32));
|
||||
gtk_snapshot_append_color (snapshot,
|
||||
color,
|
||||
&GRAPHENE_RECT_INIT(0, 0, 48, 32));
|
||||
paintable = gtk_snapshot_free_to_paintable (snapshot, NULL);
|
||||
|
||||
gtk_drag_source_set_icon (source, paintable, 0, 0);
|
||||
|
||||
gtk_drag_set_icon_paintable (drag, paintable, 4, 4);
|
||||
g_object_unref (paintable);
|
||||
}
|
||||
|
||||
static void
|
||||
got_color (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer data)
|
||||
swatch_drag_begin (GtkWidget *widget,
|
||||
GdkDrag *drag)
|
||||
{
|
||||
GdkDrop *drop = GDK_DROP (source);
|
||||
const GValue *value;
|
||||
GtkColorSwatch *swatch = GTK_COLOR_SWATCH (widget);
|
||||
GdkRGBA color;
|
||||
|
||||
value = gdk_drop_read_value_finish (drop, result, NULL);
|
||||
if (value)
|
||||
{
|
||||
GdkRGBA *color = g_value_get_boxed (value);
|
||||
gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (data), color);
|
||||
gdk_drop_finish (drop, GDK_ACTION_COPY);
|
||||
}
|
||||
else
|
||||
gdk_drop_finish (drop, 0);
|
||||
gtk_color_swatch_get_rgba (swatch, &color);
|
||||
drag_set_color_icon (drag, &color);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
swatch_drag_drop (GtkDropTarget *dest,
|
||||
GdkDrop *drop,
|
||||
int x,
|
||||
int y,
|
||||
GtkColorSwatch *swatch)
|
||||
static void
|
||||
swatch_drag_data_get (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
GtkSelectionData *selection_data)
|
||||
{
|
||||
if (gdk_drop_has_value (drop, GDK_TYPE_RGBA))
|
||||
GtkColorSwatch *swatch = GTK_COLOR_SWATCH (widget);
|
||||
guint16 vals[4];
|
||||
GdkRGBA color;
|
||||
|
||||
gtk_color_swatch_get_rgba (swatch, &color);
|
||||
|
||||
vals[0] = color.red * 0xffff;
|
||||
vals[1] = color.green * 0xffff;
|
||||
vals[2] = color.blue * 0xffff;
|
||||
vals[3] = color.alpha * 0xffff;
|
||||
|
||||
gtk_selection_data_set (selection_data,
|
||||
g_intern_static_string ("application/x-color"),
|
||||
16, (guchar *)vals, 8);
|
||||
}
|
||||
|
||||
static void
|
||||
swatch_drag_data_received (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GtkSelectionData *selection_data)
|
||||
{
|
||||
gint length;
|
||||
guint16 *vals;
|
||||
GdkRGBA color;
|
||||
|
||||
length = gtk_selection_data_get_length (selection_data);
|
||||
|
||||
if (length < 0)
|
||||
return;
|
||||
|
||||
/* We accept drops with the wrong format, since the KDE color
|
||||
* chooser incorrectly drops application/x-color with format 8.
|
||||
*/
|
||||
if (length != 8)
|
||||
{
|
||||
gdk_drop_read_value_async (drop, GDK_TYPE_RGBA, G_PRIORITY_DEFAULT, NULL, got_color, swatch);
|
||||
return TRUE;
|
||||
g_warning ("Received invalid color data");
|
||||
return;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
vals = (guint16 *) gtk_selection_data_get_data (selection_data);
|
||||
|
||||
color.red = (gdouble)vals[0] / 0xffff;
|
||||
color.green = (gdouble)vals[1] / 0xffff;
|
||||
color.blue = (gdouble)vals[2] / 0xffff;
|
||||
color.alpha = (gdouble)vals[3] / 0xffff;
|
||||
|
||||
gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (widget), &color);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -427,9 +455,6 @@ swatch_get_property (GObject *object,
|
||||
case PROP_HAS_MENU:
|
||||
g_value_set_boolean (value, priv->has_menu);
|
||||
break;
|
||||
case PROP_CAN_DROP:
|
||||
g_value_set_boolean (value, priv->dest != NULL);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@@ -456,9 +481,6 @@ swatch_set_property (GObject *object,
|
||||
case PROP_HAS_MENU:
|
||||
priv->has_menu = g_value_get_boolean (value);
|
||||
break;
|
||||
case PROP_CAN_DROP:
|
||||
gtk_color_swatch_set_can_drop (swatch, g_value_get_boolean (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@@ -473,7 +495,7 @@ swatch_finalize (GObject *object)
|
||||
|
||||
g_free (priv->icon);
|
||||
gtk_widget_unparent (priv->overlay_widget);
|
||||
|
||||
|
||||
G_OBJECT_CLASS (gtk_color_swatch_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
@@ -501,6 +523,9 @@ gtk_color_swatch_class_init (GtkColorSwatchClass *class)
|
||||
|
||||
widget_class->measure = gtk_color_swatch_measure;
|
||||
widget_class->snapshot = swatch_snapshot;
|
||||
widget_class->drag_begin = swatch_drag_begin;
|
||||
widget_class->drag_data_get = swatch_drag_data_get;
|
||||
widget_class->drag_data_received = swatch_drag_data_received;
|
||||
widget_class->popup_menu = swatch_popup_menu;
|
||||
widget_class->size_allocate = swatch_size_allocate;
|
||||
widget_class->state_flags_changed = swatch_state_flags_changed;
|
||||
@@ -514,9 +539,6 @@ gtk_color_swatch_class_init (GtkColorSwatchClass *class)
|
||||
g_object_class_install_property (object_class, PROP_HAS_MENU,
|
||||
g_param_spec_boolean ("has-menu", P_("Has Menu"), P_("Whether the swatch should offer customization"),
|
||||
TRUE, GTK_PARAM_READWRITE));
|
||||
g_object_class_install_property (object_class, PROP_CAN_DROP,
|
||||
g_param_spec_boolean ("can-drop", P_("Can Drop"), P_("Whether the swatch should accept drops"),
|
||||
FALSE, GTK_PARAM_READWRITE));
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_COLOR_SWATCH_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("colorswatch"));
|
||||
@@ -578,14 +600,6 @@ static const char *dnd_targets[] = {
|
||||
"application/x-color"
|
||||
};
|
||||
|
||||
static void
|
||||
get_rgba_value (GValue *value,
|
||||
gpointer data)
|
||||
{
|
||||
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (GTK_COLOR_SWATCH (data));
|
||||
g_value_set_boxed (value, &priv->color);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_color_swatch_set_rgba (GtkColorSwatch *swatch,
|
||||
const GdkRGBA *color)
|
||||
@@ -597,16 +611,12 @@ gtk_color_swatch_set_rgba (GtkColorSwatch *swatch,
|
||||
|
||||
if (!priv->has_color)
|
||||
{
|
||||
GdkContentProvider *content;
|
||||
GtkDragSource *source;
|
||||
|
||||
source = gtk_drag_source_new ();
|
||||
content = gdk_content_provider_new_with_callback (GDK_TYPE_RGBA, get_rgba_value, swatch);
|
||||
gtk_drag_source_set_content (source, content);
|
||||
g_object_unref (content);
|
||||
g_signal_connect (source, "drag-begin", G_CALLBACK (gtk_color_swatch_drag_begin), swatch);
|
||||
|
||||
gtk_widget_add_controller (GTK_WIDGET (swatch), GTK_EVENT_CONTROLLER (source));
|
||||
GdkContentFormats *targets = gdk_content_formats_new (dnd_targets, G_N_ELEMENTS (dnd_targets));
|
||||
gtk_drag_source_set (GTK_WIDGET (swatch),
|
||||
GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
|
||||
targets,
|
||||
GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
||||
gdk_content_formats_unref (targets);
|
||||
}
|
||||
|
||||
priv->has_color = TRUE;
|
||||
@@ -666,28 +676,21 @@ void
|
||||
gtk_color_swatch_set_can_drop (GtkColorSwatch *swatch,
|
||||
gboolean can_drop)
|
||||
{
|
||||
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
|
||||
|
||||
if (can_drop == (priv->dest != NULL))
|
||||
return;
|
||||
|
||||
if (can_drop && !priv->dest)
|
||||
if (can_drop)
|
||||
{
|
||||
GdkContentFormats *targets;
|
||||
|
||||
targets = gdk_content_formats_new (dnd_targets, G_N_ELEMENTS (dnd_targets));
|
||||
priv->dest = gtk_drop_target_new (targets, GDK_ACTION_COPY);
|
||||
g_signal_connect (priv->dest, "drag-drop", G_CALLBACK (swatch_drag_drop), swatch);
|
||||
gtk_widget_add_controller (GTK_WIDGET (swatch), GTK_EVENT_CONTROLLER (priv->dest));
|
||||
GdkContentFormats *targets = gdk_content_formats_new (dnd_targets, G_N_ELEMENTS (dnd_targets));
|
||||
gtk_drag_dest_set (GTK_WIDGET (swatch),
|
||||
GTK_DEST_DEFAULT_HIGHLIGHT |
|
||||
GTK_DEST_DEFAULT_MOTION |
|
||||
GTK_DEST_DEFAULT_DROP,
|
||||
targets,
|
||||
GDK_ACTION_COPY);
|
||||
gdk_content_formats_unref (targets);
|
||||
}
|
||||
if (!can_drop && priv->dest)
|
||||
else
|
||||
{
|
||||
gtk_widget_remove_controller (GTK_WIDGET (swatch), GTK_EVENT_CONTROLLER (priv->dest));
|
||||
priv->dest = NULL;
|
||||
gtk_drag_dest_unset (GTK_WIDGET (swatch));
|
||||
}
|
||||
|
||||
g_object_notify (G_OBJECT (swatch), "can-drop");
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -480,8 +480,8 @@ gtk_container_get_request_mode (GtkWidget *widget)
|
||||
/**
|
||||
* gtk_container_forall: (virtual forall)
|
||||
* @container: a #GtkContainer
|
||||
* @callback: (scope call): a callback
|
||||
* @callback_data: (closure): callback user data
|
||||
* @callback: (scope call) (closure callback_data): a callback
|
||||
* @callback_data: callback user data
|
||||
*
|
||||
* Invokes @callback on each direct child of @container, including
|
||||
* children that are considered “internal” (implementation details
|
||||
|
@@ -79,15 +79,6 @@ gtk_css_animated_style_is_static (GtkCssStyle *style)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static GtkCssStyle *
|
||||
gtk_css_animated_style_get_static_style (GtkCssStyle *style)
|
||||
{
|
||||
/* This is called a lot, so we avoid a dynamic type check here */
|
||||
GtkCssAnimatedStyle *animated = (GtkCssAnimatedStyle *) style;
|
||||
|
||||
return animated->style;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_animated_style_dispose (GObject *object)
|
||||
{
|
||||
@@ -132,7 +123,6 @@ gtk_css_animated_style_class_init (GtkCssAnimatedStyleClass *klass)
|
||||
style_class->get_value = gtk_css_animated_style_get_value;
|
||||
style_class->get_section = gtk_css_animated_style_get_section;
|
||||
style_class->is_static = gtk_css_animated_style_is_static;
|
||||
style_class->get_static_style = gtk_css_animated_style_get_static_style;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -369,6 +369,7 @@ gtk_css_value_array_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_ARRAY = {
|
||||
"GtkCssArrayValue",
|
||||
gtk_css_value_array_free,
|
||||
gtk_css_value_array_compute,
|
||||
gtk_css_value_array_equal,
|
||||
@@ -391,11 +392,27 @@ _gtk_css_array_value_new_from_array (GtkCssValue **values,
|
||||
guint n_values)
|
||||
{
|
||||
GtkCssValue *result;
|
||||
gboolean is_static;
|
||||
int i;
|
||||
|
||||
g_return_val_if_fail (values != NULL, NULL);
|
||||
g_return_val_if_fail (n_values > 0, NULL);
|
||||
|
||||
|
||||
if (n_values == 1)
|
||||
return values[0];
|
||||
|
||||
is_static = TRUE;
|
||||
for (i = 0; i < n_values; i++)
|
||||
{
|
||||
if (!values[i]->is_static)
|
||||
{
|
||||
is_static = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
result = _gtk_css_value_alloc (>K_CSS_VALUE_ARRAY, sizeof (GtkCssValue) + sizeof (GtkCssValue *) * (n_values - 1));
|
||||
result->is_static = is_static;
|
||||
result->n_values = n_values;
|
||||
memcpy (&result->values[0], values, sizeof (GtkCssValue *) * n_values);
|
||||
|
||||
@@ -409,7 +426,7 @@ _gtk_css_array_value_parse (GtkCssParser *parser,
|
||||
GtkCssValue *value, *result;
|
||||
GPtrArray *values;
|
||||
|
||||
values = g_ptr_array_new ();
|
||||
values = g_ptr_array_sized_new (2);
|
||||
|
||||
do {
|
||||
value = parse_func (parser);
|
||||
@@ -430,9 +447,12 @@ _gtk_css_array_value_parse (GtkCssParser *parser,
|
||||
}
|
||||
|
||||
GtkCssValue *
|
||||
_gtk_css_array_value_get_nth (const GtkCssValue *value,
|
||||
guint i)
|
||||
_gtk_css_array_value_get_nth (GtkCssValue *value,
|
||||
guint i)
|
||||
{
|
||||
if (value->class != >K_CSS_VALUE_ARRAY)
|
||||
return value;
|
||||
|
||||
g_return_val_if_fail (value != NULL, NULL);
|
||||
g_return_val_if_fail (value->class == >K_CSS_VALUE_ARRAY, NULL);
|
||||
g_return_val_if_fail (value->n_values > 0, NULL);
|
||||
@@ -443,6 +463,9 @@ _gtk_css_array_value_get_nth (const GtkCssValue *value,
|
||||
guint
|
||||
_gtk_css_array_value_get_n_values (const GtkCssValue *value)
|
||||
{
|
||||
if (value->class != >K_CSS_VALUE_ARRAY)
|
||||
return 1;
|
||||
|
||||
g_return_val_if_fail (value != NULL, 0);
|
||||
g_return_val_if_fail (value->class == >K_CSS_VALUE_ARRAY, 0);
|
||||
|
||||
|
@@ -32,7 +32,7 @@ GtkCssValue * _gtk_css_array_value_new_from_array (GtkCssValue **
|
||||
GtkCssValue * _gtk_css_array_value_parse (GtkCssParser *parser,
|
||||
GtkCssValue * (* parse_func) (GtkCssParser *));
|
||||
|
||||
GtkCssValue * _gtk_css_array_value_get_nth (const GtkCssValue *value,
|
||||
GtkCssValue * _gtk_css_array_value_get_nth (GtkCssValue *value,
|
||||
guint i);
|
||||
guint _gtk_css_array_value_get_n_values (const GtkCssValue *value);
|
||||
|
||||
|
@@ -153,6 +153,7 @@ gtk_css_value_bg_size_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_BG_SIZE = {
|
||||
"GtkCssBgSizeValue",
|
||||
gtk_css_value_bg_size_free,
|
||||
gtk_css_value_bg_size_compute,
|
||||
gtk_css_value_bg_size_equal,
|
||||
@@ -162,9 +163,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_BG_SIZE = {
|
||||
gtk_css_value_bg_size_print
|
||||
};
|
||||
|
||||
static GtkCssValue auto_singleton = { >K_CSS_VALUE_BG_SIZE, 1, FALSE, FALSE, NULL, NULL };
|
||||
static GtkCssValue cover_singleton = { >K_CSS_VALUE_BG_SIZE, 1, TRUE, FALSE, NULL, NULL };
|
||||
static GtkCssValue contain_singleton = { >K_CSS_VALUE_BG_SIZE, 1, FALSE, TRUE, NULL, NULL };
|
||||
static GtkCssValue auto_singleton = { >K_CSS_VALUE_BG_SIZE, 1, 0, FALSE, FALSE, NULL, NULL };
|
||||
static GtkCssValue cover_singleton = { >K_CSS_VALUE_BG_SIZE, 1, 0, TRUE, FALSE, NULL, NULL };
|
||||
static GtkCssValue contain_singleton = { >K_CSS_VALUE_BG_SIZE, 1, 0, FALSE, TRUE, NULL, NULL };
|
||||
|
||||
GtkCssValue *
|
||||
_gtk_css_bg_size_value_new (GtkCssValue *x,
|
||||
|
@@ -140,6 +140,7 @@ gtk_css_value_border_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_BORDER = {
|
||||
"GtkCssBorderValue",
|
||||
gtk_css_value_border_free,
|
||||
gtk_css_value_border_compute,
|
||||
gtk_css_value_border_equal,
|
||||
|
@@ -245,6 +245,7 @@ gtk_css_value_calc_get_calc_term_order (const GtkCssValue *value)
|
||||
|
||||
static const GtkCssNumberValueClass GTK_CSS_VALUE_CALC = {
|
||||
{
|
||||
"GtkCssCalcValue",
|
||||
gtk_css_value_calc_free,
|
||||
gtk_css_value_calc_compute,
|
||||
gtk_css_value_calc_equal,
|
||||
|
@@ -45,6 +45,7 @@ struct _GtkCssValue
|
||||
union
|
||||
{
|
||||
gchar *name;
|
||||
GdkRGBA rgba;
|
||||
|
||||
struct
|
||||
{
|
||||
@@ -104,7 +105,7 @@ gtk_css_value_color_get_fallback (guint property_id,
|
||||
case GTK_CSS_PROPERTY_TEXT_SHADOW:
|
||||
case GTK_CSS_PROPERTY_ICON_SHADOW:
|
||||
case GTK_CSS_PROPERTY_BOX_SHADOW:
|
||||
return _gtk_css_rgba_value_new_transparent ();
|
||||
return gtk_css_color_value_new_transparent ();
|
||||
case GTK_CSS_PROPERTY_COLOR:
|
||||
case GTK_CSS_PROPERTY_BACKGROUND_COLOR:
|
||||
case GTK_CSS_PROPERTY_BORDER_TOP_COLOR:
|
||||
@@ -125,7 +126,7 @@ gtk_css_value_color_get_fallback (guint property_id,
|
||||
if (property_id < GTK_CSS_PROPERTY_N_PROPERTIES)
|
||||
g_warning ("No fallback color defined for property '%s'",
|
||||
_gtk_style_property_get_name (GTK_STYLE_PROPERTY (_gtk_css_style_property_lookup_by_id (property_id))));
|
||||
return _gtk_css_rgba_value_new_transparent ();
|
||||
return gtk_css_color_value_new_transparent ();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,7 +137,7 @@ gtk_css_value_color_compute (GtkCssValue *value,
|
||||
GtkCssStyle *style,
|
||||
GtkCssStyle *parent_style)
|
||||
{
|
||||
GtkCssValue *resolved, *current;
|
||||
GtkCssValue *resolved;
|
||||
|
||||
/* The computed value of the ‘currentColor’ keyword is the computed
|
||||
* value of the ‘color’ property. If the ‘currentColor’ keyword is
|
||||
@@ -144,20 +145,31 @@ gtk_css_value_color_compute (GtkCssValue *value,
|
||||
*/
|
||||
if (property_id == GTK_CSS_PROPERTY_COLOR)
|
||||
{
|
||||
GtkCssValue *current;
|
||||
|
||||
if (parent_style)
|
||||
current = gtk_css_style_get_value (parent_style, GTK_CSS_PROPERTY_COLOR);
|
||||
else
|
||||
current = NULL;
|
||||
|
||||
resolved = _gtk_css_color_value_resolve (value,
|
||||
provider,
|
||||
current,
|
||||
NULL);
|
||||
}
|
||||
else if (value->type == COLOR_TYPE_LITERAL)
|
||||
{
|
||||
resolved = _gtk_css_value_ref (value);
|
||||
}
|
||||
else
|
||||
{
|
||||
current = gtk_css_style_get_value (style, GTK_CSS_PROPERTY_COLOR);
|
||||
GtkCssValue *current = gtk_css_style_get_value (style, GTK_CSS_PROPERTY_COLOR);
|
||||
|
||||
resolved = _gtk_css_color_value_resolve (value,
|
||||
provider,
|
||||
current,
|
||||
NULL);
|
||||
}
|
||||
|
||||
resolved = _gtk_css_color_value_resolve (value,
|
||||
provider,
|
||||
current,
|
||||
NULL);
|
||||
|
||||
if (resolved == NULL)
|
||||
return gtk_css_value_color_get_fallback (property_id, provider, style, parent_style);
|
||||
@@ -175,7 +187,7 @@ gtk_css_value_color_equal (const GtkCssValue *value1,
|
||||
switch (value1->type)
|
||||
{
|
||||
case COLOR_TYPE_LITERAL:
|
||||
return _gtk_css_value_equal (value1->last_value, value2->last_value);
|
||||
return gdk_rgba_equal (&value1->sym_col.rgba, &value2->sym_col.rgba);
|
||||
case COLOR_TYPE_NAME:
|
||||
return g_str_equal (value1->sym_col.name, value2->sym_col.name);
|
||||
case COLOR_TYPE_SHADE:
|
||||
@@ -216,7 +228,11 @@ gtk_css_value_color_print (const GtkCssValue *value,
|
||||
switch (value->type)
|
||||
{
|
||||
case COLOR_TYPE_LITERAL:
|
||||
_gtk_css_value_print (value->last_value, string);
|
||||
{
|
||||
char *s = gdk_rgba_to_string (&value->sym_col.rgba);
|
||||
g_string_append (string, s);
|
||||
g_free (s);
|
||||
}
|
||||
break;
|
||||
case COLOR_TYPE_NAME:
|
||||
g_string_append (string, "@");
|
||||
@@ -269,6 +285,7 @@ gtk_css_value_color_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_COLOR = {
|
||||
"GtkCssColorValue",
|
||||
gtk_css_value_color_free,
|
||||
gtk_css_value_color_compute,
|
||||
gtk_css_value_color_equal,
|
||||
@@ -278,6 +295,41 @@ static const GtkCssValueClass GTK_CSS_VALUE_COLOR = {
|
||||
gtk_css_value_color_print
|
||||
};
|
||||
|
||||
static void
|
||||
apply_alpha (const GdkRGBA *in,
|
||||
GdkRGBA *out,
|
||||
double factor)
|
||||
{
|
||||
*out = *in;
|
||||
|
||||
out->alpha = CLAMP (in->alpha * factor, 0, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
apply_shade (const GdkRGBA *in,
|
||||
GdkRGBA *out,
|
||||
double factor)
|
||||
{
|
||||
GtkHSLA hsla;
|
||||
|
||||
_gtk_hsla_init_from_rgba (&hsla, in);
|
||||
_gtk_hsla_shade (&hsla, &hsla, factor);
|
||||
|
||||
_gdk_rgba_init_from_hsla (out, &hsla);
|
||||
}
|
||||
|
||||
static void
|
||||
apply_mix (const GdkRGBA *in1,
|
||||
const GdkRGBA *in2,
|
||||
GdkRGBA *out,
|
||||
double factor)
|
||||
{
|
||||
out->red = CLAMP (in1->red + ((in2->red - in1->red) * factor), 0, 1);
|
||||
out->green = CLAMP (in1->green + ((in2->green - in1->green) * factor), 0, 1);
|
||||
out->blue = CLAMP (in1->blue + ((in2->blue - in1->blue) * factor), 0, 1);
|
||||
out->alpha = CLAMP (in1->alpha + ((in2->alpha - in1->alpha) * factor), 0, 1);
|
||||
}
|
||||
|
||||
GtkCssValue *
|
||||
_gtk_css_color_value_resolve (GtkCssValue *color,
|
||||
GtkStyleProvider *provider,
|
||||
@@ -291,7 +343,7 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
|
||||
switch (color->type)
|
||||
{
|
||||
case COLOR_TYPE_LITERAL:
|
||||
return _gtk_css_value_ref (color->last_value);
|
||||
return _gtk_css_value_ref (color);
|
||||
case COLOR_TYPE_NAME:
|
||||
{
|
||||
GtkCssValue *named;
|
||||
@@ -315,21 +367,17 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
|
||||
case COLOR_TYPE_SHADE:
|
||||
{
|
||||
GtkCssValue *val;
|
||||
GtkHSLA hsla;
|
||||
GdkRGBA shade;
|
||||
|
||||
val = _gtk_css_color_value_resolve (color->sym_col.shade.color, provider, current, cycle_list);
|
||||
if (val == NULL)
|
||||
return NULL;
|
||||
|
||||
_gtk_hsla_init_from_rgba (&hsla, _gtk_css_rgba_value_get_rgba (val));
|
||||
_gtk_hsla_shade (&hsla, &hsla, color->sym_col.shade.factor);
|
||||
|
||||
_gdk_rgba_init_from_hsla (&shade, &hsla);
|
||||
apply_shade (gtk_css_color_value_get_rgba (val), &shade, color->sym_col.shade.factor);
|
||||
|
||||
_gtk_css_value_unref (val);
|
||||
|
||||
value = _gtk_css_rgba_value_new_from_rgba (&shade);
|
||||
value = _gtk_css_color_value_new_literal (&shade);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -342,12 +390,12 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
|
||||
if (val == NULL)
|
||||
return NULL;
|
||||
|
||||
alpha = *_gtk_css_rgba_value_get_rgba (val);
|
||||
alpha.alpha = CLAMP (alpha.alpha * color->sym_col.alpha.factor, 0, 1);
|
||||
alpha = *gtk_css_color_value_get_rgba (val);
|
||||
apply_alpha (&alpha, &alpha, color->sym_col.alpha.factor);
|
||||
|
||||
_gtk_css_value_unref (val);
|
||||
|
||||
value = _gtk_css_rgba_value_new_from_rgba (&alpha);
|
||||
value = _gtk_css_color_value_new_literal (&alpha);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -359,21 +407,18 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
|
||||
val = _gtk_css_color_value_resolve (color->sym_col.mix.color1, provider, current, cycle_list);
|
||||
if (val == NULL)
|
||||
return NULL;
|
||||
color1 = *_gtk_css_rgba_value_get_rgba (val);
|
||||
color1 = *gtk_css_color_value_get_rgba (val);
|
||||
_gtk_css_value_unref (val);
|
||||
|
||||
val = _gtk_css_color_value_resolve (color->sym_col.mix.color2, provider, current, cycle_list);
|
||||
if (val == NULL)
|
||||
return NULL;
|
||||
color2 = *_gtk_css_rgba_value_get_rgba (val);
|
||||
color2 = *gtk_css_color_value_get_rgba (val);
|
||||
_gtk_css_value_unref (val);
|
||||
|
||||
res.red = CLAMP (color1.red + ((color2.red - color1.red) * color->sym_col.mix.factor), 0, 1);
|
||||
res.green = CLAMP (color1.green + ((color2.green - color1.green) * color->sym_col.mix.factor), 0, 1);
|
||||
res.blue = CLAMP (color1.blue + ((color2.blue - color1.blue) * color->sym_col.mix.factor), 0, 1);
|
||||
res.alpha = CLAMP (color1.alpha + ((color2.alpha - color1.alpha) * color->sym_col.mix.factor), 0, 1);
|
||||
apply_mix (&color1, &color2, &res, color->sym_col.mix.factor);
|
||||
|
||||
value =_gtk_css_rgba_value_new_from_rgba (&res);
|
||||
value = _gtk_css_color_value_new_literal (&res);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -420,6 +465,24 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
|
||||
return value;
|
||||
}
|
||||
|
||||
static GtkCssValue transparent_black_singleton = { >K_CSS_VALUE_COLOR, 1, 1, COLOR_TYPE_LITERAL, NULL,
|
||||
.sym_col.rgba = {0, 0, 0, 0} };
|
||||
static GtkCssValue white_singleton = { >K_CSS_VALUE_COLOR, 1, 1, COLOR_TYPE_LITERAL, NULL,
|
||||
.sym_col.rgba = {1, 1, 1, 1} };
|
||||
|
||||
|
||||
GtkCssValue *
|
||||
gtk_css_color_value_new_transparent (void)
|
||||
{
|
||||
return _gtk_css_value_ref (&transparent_black_singleton);
|
||||
}
|
||||
|
||||
GtkCssValue *
|
||||
gtk_css_color_value_new_white (void)
|
||||
{
|
||||
return _gtk_css_value_ref (&white_singleton);
|
||||
}
|
||||
|
||||
GtkCssValue *
|
||||
_gtk_css_color_value_new_literal (const GdkRGBA *color)
|
||||
{
|
||||
@@ -428,8 +491,9 @@ _gtk_css_color_value_new_literal (const GdkRGBA *color)
|
||||
g_return_val_if_fail (color != NULL, NULL);
|
||||
|
||||
value = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_COLOR);
|
||||
value->is_static = TRUE;
|
||||
value->type = COLOR_TYPE_LITERAL;
|
||||
value->last_value = _gtk_css_rgba_value_new_from_rgba (color);
|
||||
value->sym_col.rgba = *color;
|
||||
|
||||
return value;
|
||||
}
|
||||
@@ -456,6 +520,15 @@ _gtk_css_color_value_new_shade (GtkCssValue *color,
|
||||
|
||||
gtk_internal_return_val_if_fail (color->class == >K_CSS_VALUE_COLOR, NULL);
|
||||
|
||||
if (color->type == COLOR_TYPE_LITERAL)
|
||||
{
|
||||
GdkRGBA c;
|
||||
|
||||
apply_shade (&color->sym_col.rgba, &c, factor);
|
||||
|
||||
return _gtk_css_color_value_new_literal (&c);
|
||||
}
|
||||
|
||||
value = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_COLOR);
|
||||
value->type = COLOR_TYPE_SHADE;
|
||||
value->sym_col.shade.color = _gtk_css_value_ref (color);
|
||||
@@ -472,6 +545,15 @@ _gtk_css_color_value_new_alpha (GtkCssValue *color,
|
||||
|
||||
gtk_internal_return_val_if_fail (color->class == >K_CSS_VALUE_COLOR, NULL);
|
||||
|
||||
if (color->type == COLOR_TYPE_LITERAL)
|
||||
{
|
||||
GdkRGBA c;
|
||||
|
||||
apply_alpha (&color->sym_col.rgba, &c, factor);
|
||||
|
||||
return _gtk_css_color_value_new_literal (&c);
|
||||
}
|
||||
|
||||
value = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_COLOR);
|
||||
value->type = COLOR_TYPE_ALPHA;
|
||||
value->sym_col.alpha.color = _gtk_css_value_ref (color);
|
||||
@@ -490,6 +572,17 @@ _gtk_css_color_value_new_mix (GtkCssValue *color1,
|
||||
gtk_internal_return_val_if_fail (color1->class == >K_CSS_VALUE_COLOR, NULL);
|
||||
gtk_internal_return_val_if_fail (color2->class == >K_CSS_VALUE_COLOR, NULL);
|
||||
|
||||
if (color1->type == COLOR_TYPE_LITERAL &&
|
||||
color2->type == COLOR_TYPE_LITERAL)
|
||||
{
|
||||
GdkRGBA result;
|
||||
|
||||
apply_mix (&color1->sym_col.rgba, &color2->sym_col.rgba, &result, factor);
|
||||
|
||||
return _gtk_css_color_value_new_literal (&result);
|
||||
|
||||
}
|
||||
|
||||
value = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_COLOR);
|
||||
value->type = COLOR_TYPE_MIX;
|
||||
value->sym_col.mix.color1 = _gtk_css_value_ref (color1);
|
||||
@@ -502,7 +595,7 @@ _gtk_css_color_value_new_mix (GtkCssValue *color1,
|
||||
GtkCssValue *
|
||||
_gtk_css_color_value_new_current_color (void)
|
||||
{
|
||||
static GtkCssValue current_color = { >K_CSS_VALUE_COLOR, 1, COLOR_TYPE_CURRENT_COLOR, NULL, };
|
||||
static GtkCssValue current_color = { >K_CSS_VALUE_COLOR, 1, 0, COLOR_TYPE_CURRENT_COLOR, NULL, };
|
||||
|
||||
return _gtk_css_value_ref (¤t_color);
|
||||
}
|
||||
@@ -665,3 +758,11 @@ _gtk_css_color_value_parse (GtkCssParser *parser)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const GdkRGBA *
|
||||
gtk_css_color_value_get_rgba (const GtkCssValue *color)
|
||||
{
|
||||
g_assert (color->class == >K_CSS_VALUE_COLOR);
|
||||
g_assert (color->type == COLOR_TYPE_LITERAL);
|
||||
|
||||
return &color->sym_col.rgba;
|
||||
}
|
||||
|
@@ -24,6 +24,8 @@
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
||||
GtkCssValue * gtk_css_color_value_new_transparent (void);
|
||||
GtkCssValue * gtk_css_color_value_new_white (void);
|
||||
GtkCssValue * _gtk_css_color_value_new_literal (const GdkRGBA *color);
|
||||
GtkCssValue * _gtk_css_color_value_new_name (const gchar *name);
|
||||
GtkCssValue * _gtk_css_color_value_new_shade (GtkCssValue *color,
|
||||
@@ -42,6 +44,7 @@ GtkCssValue * _gtk_css_color_value_resolve (GtkCssValue *color
|
||||
GtkStyleProvider *provider,
|
||||
GtkCssValue *current,
|
||||
GSList *cycle_list);
|
||||
const GdkRGBA * gtk_css_color_value_get_rgba (const GtkCssValue *color);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
@@ -99,6 +99,7 @@ gtk_css_value_corner_print (const GtkCssValue *corner,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_CORNER = {
|
||||
"GtkCssCornerValue",
|
||||
gtk_css_value_corner_free,
|
||||
gtk_css_value_corner_compute,
|
||||
gtk_css_value_corner_equal,
|
||||
@@ -114,6 +115,12 @@ _gtk_css_corner_value_new (GtkCssValue *x,
|
||||
{
|
||||
GtkCssValue *result;
|
||||
|
||||
if (x == y)
|
||||
{
|
||||
_gtk_css_value_unref (y);
|
||||
return _gtk_css_value_ref (x);
|
||||
}
|
||||
|
||||
result = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_CORNER);
|
||||
result->x = x;
|
||||
result->y = y;
|
||||
@@ -155,6 +162,9 @@ double
|
||||
_gtk_css_corner_value_get_x (const GtkCssValue *corner,
|
||||
double one_hundred_percent)
|
||||
{
|
||||
if (corner->class != >K_CSS_VALUE_CORNER)
|
||||
return _gtk_css_number_value_get (corner, one_hundred_percent);
|
||||
|
||||
g_return_val_if_fail (corner != NULL, 0.0);
|
||||
g_return_val_if_fail (corner->class == >K_CSS_VALUE_CORNER, 0.0);
|
||||
|
||||
@@ -165,6 +175,9 @@ double
|
||||
_gtk_css_corner_value_get_y (const GtkCssValue *corner,
|
||||
double one_hundred_percent)
|
||||
{
|
||||
if (corner->class != >K_CSS_VALUE_CORNER)
|
||||
return _gtk_css_number_value_get (corner, one_hundred_percent);
|
||||
|
||||
g_return_val_if_fail (corner != NULL, 0.0);
|
||||
g_return_val_if_fail (corner->class == >K_CSS_VALUE_CORNER, 0.0);
|
||||
|
||||
|
@@ -279,6 +279,7 @@ gtk_css_value_dimension_get_calc_term_order (const GtkCssValue *value)
|
||||
|
||||
static const GtkCssNumberValueClass GTK_CSS_VALUE_DIMENSION = {
|
||||
{
|
||||
"GtkCssDimensionValue",
|
||||
gtk_css_value_dimension_free,
|
||||
gtk_css_value_dimension_compute,
|
||||
gtk_css_value_dimension_equal,
|
||||
@@ -300,37 +301,45 @@ gtk_css_dimension_value_new (double value,
|
||||
GtkCssUnit unit)
|
||||
{
|
||||
static GtkCssValue number_singletons[] = {
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_NUMBER, 0 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_NUMBER, 1 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_NUMBER, 96 }, /* DPI default */
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_NUMBER, 0 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_NUMBER, 1 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_NUMBER, 96 }, /* DPI default */
|
||||
};
|
||||
static GtkCssValue px_singletons[] = {
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PX, 0 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PX, 1 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PX, 2 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PX, 3 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PX, 4 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PX, 8 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PX, 16 }, /* Icon size default */
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PX, 32 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PX, 64 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 0 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 1 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 2 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 3 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 4 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 5 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 6 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 7 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 8 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 16 }, /* Icon size default */
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 32 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 10 * 96.0 / 72.0 }, /* font size 10 */
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_PX, 11 * 96.0 / 72.0 }, /* font size 11 */
|
||||
};
|
||||
static GtkCssValue percent_singletons[] = {
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PERCENT, 0 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PERCENT, 50 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_PERCENT, 100 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 0, GTK_CSS_PERCENT, 0 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 0, GTK_CSS_PERCENT, 50 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 0, GTK_CSS_PERCENT, 100 },
|
||||
};
|
||||
static GtkCssValue second_singletons[] = {
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_S, 0 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_S, 1 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_S, 0 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_S, 0.15 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_S, 0.2 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_S, 0.3 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_S, 1 },
|
||||
};
|
||||
static GtkCssValue deg_singletons[] = {
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_DEG, 0 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_DEG, 90 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_DEG, 180 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, GTK_CSS_DEG, 270 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_DEG, 0 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_DEG, 90 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_DEG, 180 },
|
||||
{ >K_CSS_VALUE_DIMENSION.value_class, 1, 1, GTK_CSS_DEG, 270 },
|
||||
};
|
||||
GtkCssValue *result;
|
||||
gboolean is_static = FALSE;
|
||||
|
||||
switch ((guint)unit)
|
||||
{
|
||||
@@ -341,6 +350,7 @@ gtk_css_dimension_value_new (double value,
|
||||
if (value == 96)
|
||||
return _gtk_css_value_ref (&number_singletons[2]);
|
||||
|
||||
is_static = TRUE;
|
||||
break;
|
||||
|
||||
case GTK_CSS_PX:
|
||||
@@ -348,17 +358,22 @@ gtk_css_dimension_value_new (double value,
|
||||
value == 1 ||
|
||||
value == 2 ||
|
||||
value == 3 ||
|
||||
value == 4)
|
||||
value == 4 ||
|
||||
value == 5 ||
|
||||
value == 6 ||
|
||||
value == 7 ||
|
||||
value == 8)
|
||||
return _gtk_css_value_ref (&px_singletons[(int) value]);
|
||||
if (value == 8)
|
||||
return _gtk_css_value_ref (&px_singletons[5]);
|
||||
if (value == 16)
|
||||
return _gtk_css_value_ref (&px_singletons[6]);
|
||||
return _gtk_css_value_ref (&px_singletons[9]);
|
||||
if (value == 32)
|
||||
return _gtk_css_value_ref (&px_singletons[7]);
|
||||
if (value == 64)
|
||||
return _gtk_css_value_ref (&px_singletons[8]);
|
||||
return _gtk_css_value_ref (&px_singletons[10]);
|
||||
if (value == 10 * 96.0 / 72.0)
|
||||
return _gtk_css_value_ref (&px_singletons[11]);
|
||||
if (value == 11 * 96.0 / 72.0)
|
||||
return _gtk_css_value_ref (&px_singletons[12]);
|
||||
|
||||
is_static = TRUE;
|
||||
break;
|
||||
|
||||
case GTK_CSS_PERCENT:
|
||||
@@ -372,9 +387,18 @@ gtk_css_dimension_value_new (double value,
|
||||
break;
|
||||
|
||||
case GTK_CSS_S:
|
||||
if (value == 0 || value == 1)
|
||||
return _gtk_css_value_ref (&second_singletons[(int)value]);
|
||||
if (value == 0)
|
||||
return _gtk_css_value_ref (&second_singletons[0]);
|
||||
if (value == 0.15)
|
||||
return _gtk_css_value_ref (&second_singletons[1]);
|
||||
if (value == 0.2)
|
||||
return _gtk_css_value_ref (&second_singletons[2]);
|
||||
if (value == 0.3)
|
||||
return _gtk_css_value_ref (&second_singletons[3]);
|
||||
if (value == 1)
|
||||
return _gtk_css_value_ref (&second_singletons[4]);
|
||||
|
||||
is_static = TRUE;
|
||||
break;
|
||||
|
||||
case GTK_CSS_DEG:
|
||||
@@ -386,7 +410,32 @@ gtk_css_dimension_value_new (double value,
|
||||
return _gtk_css_value_ref (°_singletons[2]);
|
||||
if (value == 270)
|
||||
return _gtk_css_value_ref (°_singletons[3]);
|
||||
|
||||
is_static = TRUE;
|
||||
break;
|
||||
|
||||
case GTK_CSS_RAD:
|
||||
value = value * 360.0 / (2 * G_PI);
|
||||
unit = GTK_CSS_DEG;
|
||||
is_static = TRUE;
|
||||
break;
|
||||
|
||||
case GTK_CSS_GRAD:
|
||||
value = value * 360.0 / 400.0;
|
||||
unit = GTK_CSS_DEG;
|
||||
is_static = TRUE;
|
||||
break;
|
||||
|
||||
case GTK_CSS_TURN:
|
||||
value = value * 360.0;
|
||||
unit = GTK_CSS_DEG;
|
||||
is_static = TRUE;
|
||||
break;
|
||||
|
||||
case GTK_CSS_MS:
|
||||
value = value / 1000.0;
|
||||
unit = GTK_CSS_S;
|
||||
is_static = TRUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -394,6 +443,7 @@ gtk_css_dimension_value_new (double value,
|
||||
}
|
||||
|
||||
result = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_DIMENSION.value_class);
|
||||
result->is_static = is_static;
|
||||
result->unit = unit;
|
||||
result->value = value;
|
||||
|
||||
@@ -508,6 +558,9 @@ gtk_css_dimension_value_parse (GtkCssParser *parser,
|
||||
}
|
||||
|
||||
result = gtk_css_dimension_value_new (number, unit);
|
||||
if (flags & GTK_CSS_PARSE_NON_STATIC)
|
||||
result->is_static = FALSE;
|
||||
|
||||
gtk_css_parser_consume_token (parser);
|
||||
|
||||
return result;
|
||||
|
@@ -135,6 +135,7 @@ gtk_css_value_ease_print (const GtkCssValue *ease,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_EASE = {
|
||||
"GtkCssEaseValue",
|
||||
gtk_css_value_ease_free,
|
||||
gtk_css_value_ease_compute,
|
||||
gtk_css_value_ease_equal,
|
||||
@@ -158,6 +159,7 @@ _gtk_css_ease_value_new_cubic_bezier (double x1,
|
||||
g_return_val_if_fail (x2 <= 1.0, NULL);
|
||||
|
||||
value = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_EASE);
|
||||
value->is_static = TRUE;
|
||||
|
||||
value->type = GTK_CSS_EASE_CUBIC_BEZIER;
|
||||
value->u.cubic.x1 = x1;
|
||||
@@ -177,6 +179,7 @@ _gtk_css_ease_value_new_steps (guint n_steps,
|
||||
g_return_val_if_fail (n_steps > 0, NULL);
|
||||
|
||||
value = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_EASE);
|
||||
value->is_static = TRUE;
|
||||
|
||||
value->type = GTK_CSS_EASE_STEPS;
|
||||
value->u.steps.steps = n_steps;
|
||||
|
@@ -78,6 +78,7 @@ gtk_css_value_enum_print (const GtkCssValue *value,
|
||||
/* GtkBorderStyle */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_BORDER_STYLE = {
|
||||
"GtkCssBorderStyleValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -88,16 +89,16 @@ static const GtkCssValueClass GTK_CSS_VALUE_BORDER_STYLE = {
|
||||
};
|
||||
|
||||
static GtkCssValue border_style_values[] = {
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_NONE, "none" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_SOLID, "solid" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_INSET, "inset" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_OUTSET, "outset" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_HIDDEN, "hidden" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DOTTED, "dotted" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DASHED, "dashed" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DOUBLE, "double" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_GROOVE, "groove" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_RIDGE, "ridge" }
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, 1, GTK_BORDER_STYLE_NONE, "none" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, 1, GTK_BORDER_STYLE_SOLID, "solid" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, 1, GTK_BORDER_STYLE_INSET, "inset" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, 1, GTK_BORDER_STYLE_OUTSET, "outset" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, 1, GTK_BORDER_STYLE_HIDDEN, "hidden" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, 1, GTK_BORDER_STYLE_DOTTED, "dotted" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, 1, GTK_BORDER_STYLE_DASHED, "dashed" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, 1, GTK_BORDER_STYLE_DOUBLE, "double" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, 1, GTK_BORDER_STYLE_GROOVE, "groove" },
|
||||
{ >K_CSS_VALUE_BORDER_STYLE, 1, 1, GTK_BORDER_STYLE_RIDGE, "ridge" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -135,6 +136,7 @@ _gtk_css_border_style_value_get (const GtkCssValue *value)
|
||||
/* GtkCssBlendMode */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_BLEND_MODE = {
|
||||
"GtkCssBlendModeValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -145,22 +147,22 @@ static const GtkCssValueClass GTK_CSS_VALUE_BLEND_MODE = {
|
||||
};
|
||||
|
||||
static GtkCssValue blend_mode_values[] = {
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_DEFAULT, "normal" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_MULTIPLY, "multiply" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_SCREEN, "screen" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_OVERLAY, "overlay" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_DARKEN, "darken" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_LIGHTEN, "lighten" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_COLOR_DODGE, "color-dodge" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_COLOR_BURN, "color-burn" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_HARD_LIGHT, "hard-light" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_SOFT_LIGHT, "soft-light" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_DIFFERENCE, "difference" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_EXCLUSION, "exclusion" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_COLOR, "color" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_HUE, "hue" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_SATURATION, "saturation" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, GSK_BLEND_MODE_LUMINOSITY, "luminosity" }
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_DEFAULT, "normal" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_MULTIPLY, "multiply" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_SCREEN, "screen" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_OVERLAY, "overlay" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_DARKEN, "darken" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_LIGHTEN, "lighten" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_COLOR_DODGE, "color-dodge" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_COLOR_BURN, "color-burn" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_HARD_LIGHT, "hard-light" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_SOFT_LIGHT, "soft-light" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_DIFFERENCE, "difference" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_EXCLUSION, "exclusion" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_COLOR, "color" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_HUE, "hue" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_SATURATION, "saturation" },
|
||||
{ >K_CSS_VALUE_BLEND_MODE, 1, 1, GSK_BLEND_MODE_LUMINOSITY, "luminosity" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -285,6 +287,7 @@ gtk_css_value_font_size_compute (GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_SIZE = {
|
||||
"GtkCssFontSizeValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_font_size_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -295,15 +298,15 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_SIZE = {
|
||||
};
|
||||
|
||||
static GtkCssValue font_size_values[] = {
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, GTK_CSS_FONT_SIZE_SMALLER, "smaller" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, GTK_CSS_FONT_SIZE_LARGER, "larger" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, GTK_CSS_FONT_SIZE_XX_SMALL, "xx-small" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, GTK_CSS_FONT_SIZE_X_SMALL, "x-small" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, GTK_CSS_FONT_SIZE_SMALL, "small" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, GTK_CSS_FONT_SIZE_MEDIUM, "medium" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, GTK_CSS_FONT_SIZE_LARGE, "large" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, GTK_CSS_FONT_SIZE_X_LARGE, "x-large" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, GTK_CSS_FONT_SIZE_XX_LARGE, "xx-large" }
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, 0, GTK_CSS_FONT_SIZE_SMALLER, "smaller" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, 0, GTK_CSS_FONT_SIZE_LARGER, "larger" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, 0, GTK_CSS_FONT_SIZE_XX_SMALL, "xx-small" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, 0, GTK_CSS_FONT_SIZE_X_SMALL, "x-small" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, 0, GTK_CSS_FONT_SIZE_SMALL, "small" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, 0, GTK_CSS_FONT_SIZE_MEDIUM, "medium" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, 0, GTK_CSS_FONT_SIZE_LARGE, "large" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, 0, GTK_CSS_FONT_SIZE_X_LARGE, "x-large" },
|
||||
{ >K_CSS_VALUE_FONT_SIZE, 1, 0, GTK_CSS_FONT_SIZE_XX_LARGE, "xx-large" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -341,6 +344,7 @@ _gtk_css_font_size_value_get (const GtkCssValue *value)
|
||||
/* PangoStyle */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_STYLE = {
|
||||
"GtkCssFontStyleValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -351,9 +355,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_STYLE = {
|
||||
};
|
||||
|
||||
static GtkCssValue font_style_values[] = {
|
||||
{ >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_OBLIQUE, "oblique" },
|
||||
{ >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_ITALIC, "italic" }
|
||||
{ >K_CSS_VALUE_FONT_STYLE, 1, 1, PANGO_STYLE_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_STYLE, 1, 1, PANGO_STYLE_OBLIQUE, "oblique" },
|
||||
{ >K_CSS_VALUE_FONT_STYLE, 1, 1, PANGO_STYLE_ITALIC, "italic" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -439,6 +443,7 @@ gtk_css_value_font_weight_compute (GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_WEIGHT = {
|
||||
"GtkCssFontWeightValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_font_weight_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -449,8 +454,8 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_WEIGHT = {
|
||||
};
|
||||
|
||||
static GtkCssValue font_weight_values[] = {
|
||||
{ >K_CSS_VALUE_FONT_WEIGHT, 1, BOLDER, "bolder" },
|
||||
{ >K_CSS_VALUE_FONT_WEIGHT, 1, LIGHTER, "lighter" },
|
||||
{ >K_CSS_VALUE_FONT_WEIGHT, 1, 0, BOLDER, "bolder" },
|
||||
{ >K_CSS_VALUE_FONT_WEIGHT, 1, 0, LIGHTER, "lighter" },
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -488,6 +493,7 @@ gtk_css_font_weight_value_get (const GtkCssValue *value)
|
||||
/* PangoStretch */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_STRETCH = {
|
||||
"GtkCssFontStretchValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -498,15 +504,15 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_STRETCH = {
|
||||
};
|
||||
|
||||
static GtkCssValue font_stretch_values[] = {
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, PANGO_STRETCH_ULTRA_CONDENSED, "ultra-condensed" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, PANGO_STRETCH_EXTRA_CONDENSED, "extra-condensed" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, PANGO_STRETCH_CONDENSED, "condensed" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, PANGO_STRETCH_SEMI_CONDENSED, "semi-condensed" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, PANGO_STRETCH_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, PANGO_STRETCH_SEMI_EXPANDED, "semi-expanded" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, PANGO_STRETCH_EXPANDED, "expanded" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, PANGO_STRETCH_EXTRA_EXPANDED, "extra-expanded" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, PANGO_STRETCH_ULTRA_EXPANDED, "ultra-expanded" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, 1, PANGO_STRETCH_ULTRA_CONDENSED, "ultra-condensed" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, 1, PANGO_STRETCH_EXTRA_CONDENSED, "extra-condensed" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, 1, PANGO_STRETCH_CONDENSED, "condensed" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, 1, PANGO_STRETCH_SEMI_CONDENSED, "semi-condensed" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, 1, PANGO_STRETCH_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, 1, PANGO_STRETCH_SEMI_EXPANDED, "semi-expanded" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, 1, PANGO_STRETCH_EXPANDED, "expanded" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, 1, PANGO_STRETCH_EXTRA_EXPANDED, "extra-expanded" },
|
||||
{ >K_CSS_VALUE_FONT_STRETCH, 1, 1, PANGO_STRETCH_ULTRA_EXPANDED, "ultra-expanded" },
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -544,6 +550,7 @@ _gtk_css_font_stretch_value_get (const GtkCssValue *value)
|
||||
/* GtkTextDecorationLine */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_TEXT_DECORATION_LINE = {
|
||||
"GtkCssTextDecorationLineValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -554,9 +561,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_TEXT_DECORATION_LINE = {
|
||||
};
|
||||
|
||||
static GtkCssValue text_decoration_line_values[] = {
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_LINE, 1, GTK_CSS_TEXT_DECORATION_LINE_NONE, "none" },
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_LINE, 1, GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE, "underline" },
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_LINE, 1, GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH, "line-through" },
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_LINE, 1, 1, GTK_CSS_TEXT_DECORATION_LINE_NONE, "none" },
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_LINE, 1, 1, GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE, "underline" },
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_LINE, 1, 1, GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH, "line-through" },
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -594,6 +601,7 @@ _gtk_css_text_decoration_line_value_get (const GtkCssValue *value)
|
||||
/* GtkTextDecorationStyle */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_TEXT_DECORATION_STYLE = {
|
||||
"GtkCssTextDecorationStyleValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -604,9 +612,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_TEXT_DECORATION_STYLE = {
|
||||
};
|
||||
|
||||
static GtkCssValue text_decoration_style_values[] = {
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_STYLE, 1, GTK_CSS_TEXT_DECORATION_STYLE_SOLID, "solid" },
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_STYLE, 1, GTK_CSS_TEXT_DECORATION_STYLE_DOUBLE, "double" },
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_STYLE, 1, GTK_CSS_TEXT_DECORATION_STYLE_WAVY, "wavy" },
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_STYLE, 1, 1, GTK_CSS_TEXT_DECORATION_STYLE_SOLID, "solid" },
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_STYLE, 1, 1, GTK_CSS_TEXT_DECORATION_STYLE_DOUBLE, "double" },
|
||||
{ >K_CSS_VALUE_TEXT_DECORATION_STYLE, 1, 1, GTK_CSS_TEXT_DECORATION_STYLE_WAVY, "wavy" },
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -644,6 +652,7 @@ _gtk_css_text_decoration_style_value_get (const GtkCssValue *value)
|
||||
/* GtkCssArea */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_AREA = {
|
||||
"GtkCssAreaValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -654,9 +663,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_AREA = {
|
||||
};
|
||||
|
||||
static GtkCssValue area_values[] = {
|
||||
{ >K_CSS_VALUE_AREA, 1, GTK_CSS_AREA_BORDER_BOX, "border-box" },
|
||||
{ >K_CSS_VALUE_AREA, 1, GTK_CSS_AREA_PADDING_BOX, "padding-box" },
|
||||
{ >K_CSS_VALUE_AREA, 1, GTK_CSS_AREA_CONTENT_BOX, "content-box" }
|
||||
{ >K_CSS_VALUE_AREA, 1, 1, GTK_CSS_AREA_BORDER_BOX, "border-box" },
|
||||
{ >K_CSS_VALUE_AREA, 1, 1, GTK_CSS_AREA_PADDING_BOX, "padding-box" },
|
||||
{ >K_CSS_VALUE_AREA, 1, 1, GTK_CSS_AREA_CONTENT_BOX, "content-box" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -700,6 +709,7 @@ _gtk_css_area_value_get (const GtkCssValue *value)
|
||||
/* GtkCssDirection */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_DIRECTION = {
|
||||
"GtkCssDirectionValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -710,10 +720,10 @@ static const GtkCssValueClass GTK_CSS_VALUE_DIRECTION = {
|
||||
};
|
||||
|
||||
static GtkCssValue direction_values[] = {
|
||||
{ >K_CSS_VALUE_DIRECTION, 1, GTK_CSS_DIRECTION_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_DIRECTION, 1, GTK_CSS_DIRECTION_REVERSE, "reverse" },
|
||||
{ >K_CSS_VALUE_DIRECTION, 1, GTK_CSS_DIRECTION_ALTERNATE, "alternate" },
|
||||
{ >K_CSS_VALUE_DIRECTION, 1, GTK_CSS_DIRECTION_ALTERNATE_REVERSE, "alternate-reverse" }
|
||||
{ >K_CSS_VALUE_DIRECTION, 1, 1, GTK_CSS_DIRECTION_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_DIRECTION, 1, 1, GTK_CSS_DIRECTION_REVERSE, "reverse" },
|
||||
{ >K_CSS_VALUE_DIRECTION, 1, 1, GTK_CSS_DIRECTION_ALTERNATE, "alternate" },
|
||||
{ >K_CSS_VALUE_DIRECTION, 1, 1, GTK_CSS_DIRECTION_ALTERNATE_REVERSE, "alternate-reverse" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -760,6 +770,7 @@ _gtk_css_direction_value_get (const GtkCssValue *value)
|
||||
/* GtkCssPlayState */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_PLAY_STATE = {
|
||||
"GtkCssPlayStateValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -770,8 +781,8 @@ static const GtkCssValueClass GTK_CSS_VALUE_PLAY_STATE = {
|
||||
};
|
||||
|
||||
static GtkCssValue play_state_values[] = {
|
||||
{ >K_CSS_VALUE_PLAY_STATE, 1, GTK_CSS_PLAY_STATE_RUNNING, "running" },
|
||||
{ >K_CSS_VALUE_PLAY_STATE, 1, GTK_CSS_PLAY_STATE_PAUSED, "paused" }
|
||||
{ >K_CSS_VALUE_PLAY_STATE, 1, 1, GTK_CSS_PLAY_STATE_RUNNING, "running" },
|
||||
{ >K_CSS_VALUE_PLAY_STATE, 1, 1, GTK_CSS_PLAY_STATE_PAUSED, "paused" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -815,6 +826,7 @@ _gtk_css_play_state_value_get (const GtkCssValue *value)
|
||||
/* GtkCssFillMode */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FILL_MODE = {
|
||||
"GtkCssFillModeValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -825,10 +837,10 @@ static const GtkCssValueClass GTK_CSS_VALUE_FILL_MODE = {
|
||||
};
|
||||
|
||||
static GtkCssValue fill_mode_values[] = {
|
||||
{ >K_CSS_VALUE_FILL_MODE, 1, GTK_CSS_FILL_NONE, "none" },
|
||||
{ >K_CSS_VALUE_FILL_MODE, 1, GTK_CSS_FILL_FORWARDS, "forwards" },
|
||||
{ >K_CSS_VALUE_FILL_MODE, 1, GTK_CSS_FILL_BACKWARDS, "backwards" },
|
||||
{ >K_CSS_VALUE_FILL_MODE, 1, GTK_CSS_FILL_BOTH, "both" }
|
||||
{ >K_CSS_VALUE_FILL_MODE, 1, 1, GTK_CSS_FILL_NONE, "none" },
|
||||
{ >K_CSS_VALUE_FILL_MODE, 1, 1, GTK_CSS_FILL_FORWARDS, "forwards" },
|
||||
{ >K_CSS_VALUE_FILL_MODE, 1, 1, GTK_CSS_FILL_BACKWARDS, "backwards" },
|
||||
{ >K_CSS_VALUE_FILL_MODE, 1, 1, GTK_CSS_FILL_BOTH, "both" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -872,6 +884,7 @@ _gtk_css_fill_mode_value_get (const GtkCssValue *value)
|
||||
/* GtkCssIconStyle */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_ICON_STYLE = {
|
||||
"GtkCssIconStyleValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -882,9 +895,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_ICON_STYLE = {
|
||||
};
|
||||
|
||||
static GtkCssValue icon_style_values[] = {
|
||||
{ >K_CSS_VALUE_ICON_STYLE, 1, GTK_CSS_ICON_STYLE_REQUESTED, "requested" },
|
||||
{ >K_CSS_VALUE_ICON_STYLE, 1, GTK_CSS_ICON_STYLE_REGULAR, "regular" },
|
||||
{ >K_CSS_VALUE_ICON_STYLE, 1, GTK_CSS_ICON_STYLE_SYMBOLIC, "symbolic" }
|
||||
{ >K_CSS_VALUE_ICON_STYLE, 1, 1, GTK_CSS_ICON_STYLE_REQUESTED, "requested" },
|
||||
{ >K_CSS_VALUE_ICON_STYLE, 1, 1, GTK_CSS_ICON_STYLE_REGULAR, "regular" },
|
||||
{ >K_CSS_VALUE_ICON_STYLE, 1, 1, GTK_CSS_ICON_STYLE_SYMBOLIC, "symbolic" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -928,6 +941,7 @@ _gtk_css_icon_style_value_get (const GtkCssValue *value)
|
||||
/* GtkCssFontKerning */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_KERNING = {
|
||||
"GtkCssFontKerningValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -938,9 +952,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_KERNING = {
|
||||
};
|
||||
|
||||
static GtkCssValue font_kerning_values[] = {
|
||||
{ >K_CSS_VALUE_FONT_KERNING, 1, GTK_CSS_FONT_KERNING_AUTO, "auto" },
|
||||
{ >K_CSS_VALUE_FONT_KERNING, 1, GTK_CSS_FONT_KERNING_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_KERNING, 1, GTK_CSS_FONT_KERNING_NONE, "none" }
|
||||
{ >K_CSS_VALUE_FONT_KERNING, 1, 1, GTK_CSS_FONT_KERNING_AUTO, "auto" },
|
||||
{ >K_CSS_VALUE_FONT_KERNING, 1, 1, GTK_CSS_FONT_KERNING_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_KERNING, 1, 1, GTK_CSS_FONT_KERNING_NONE, "none" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -984,6 +998,7 @@ _gtk_css_font_kerning_value_get (const GtkCssValue *value)
|
||||
/* GtkCssFontVariantPos */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_POSITION = {
|
||||
"GtkCssFontVariationPositionValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -994,9 +1009,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_POSITION = {
|
||||
};
|
||||
|
||||
static GtkCssValue font_variant_position_values[] = {
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_POSITION, 1, GTK_CSS_FONT_VARIANT_POSITION_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_POSITION, 1, GTK_CSS_FONT_VARIANT_POSITION_SUB, "sub" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_POSITION, 1, GTK_CSS_FONT_VARIANT_POSITION_SUPER, "super" }
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_POSITION, 1, 1, GTK_CSS_FONT_VARIANT_POSITION_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_POSITION, 1, 1, GTK_CSS_FONT_VARIANT_POSITION_SUB, "sub" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_POSITION, 1, 1, GTK_CSS_FONT_VARIANT_POSITION_SUPER, "super" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -1040,6 +1055,7 @@ _gtk_css_font_variant_position_value_get (const GtkCssValue *value)
|
||||
/* GtkCssFontVariantCaps */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_CAPS = {
|
||||
"GtkCssFontVariantCapsValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -1050,13 +1066,13 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_CAPS = {
|
||||
};
|
||||
|
||||
static GtkCssValue font_variant_caps_values[] = {
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, GTK_CSS_FONT_VARIANT_CAPS_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, GTK_CSS_FONT_VARIANT_CAPS_SMALL_CAPS, "small-caps" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, GTK_CSS_FONT_VARIANT_CAPS_ALL_SMALL_CAPS, "all-small-caps" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, GTK_CSS_FONT_VARIANT_CAPS_PETITE_CAPS, "petite-caps" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, GTK_CSS_FONT_VARIANT_CAPS_ALL_PETITE_CAPS, "all-petite-caps" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, GTK_CSS_FONT_VARIANT_CAPS_UNICASE, "unicase" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, GTK_CSS_FONT_VARIANT_CAPS_TITLING_CAPS, "titling-caps" }
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, 1, GTK_CSS_FONT_VARIANT_CAPS_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, 1, GTK_CSS_FONT_VARIANT_CAPS_SMALL_CAPS, "small-caps" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, 1, GTK_CSS_FONT_VARIANT_CAPS_ALL_SMALL_CAPS, "all-small-caps" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, 1, GTK_CSS_FONT_VARIANT_CAPS_PETITE_CAPS, "petite-caps" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, 1, GTK_CSS_FONT_VARIANT_CAPS_ALL_PETITE_CAPS, "all-petite-caps" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, 1, GTK_CSS_FONT_VARIANT_CAPS_UNICASE, "unicase" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_CAPS, 1, 1, GTK_CSS_FONT_VARIANT_CAPS_TITLING_CAPS, "titling-caps" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -1100,6 +1116,7 @@ _gtk_css_font_variant_caps_value_get (const GtkCssValue *value)
|
||||
/* GtkCssFontVariantAlternate */
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_ALTERNATE = {
|
||||
"GtkCssFontVariantAlternateValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_enum_equal,
|
||||
@@ -1110,8 +1127,8 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_ALTERNATE = {
|
||||
};
|
||||
|
||||
static GtkCssValue font_variant_alternate_values[] = {
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_ALTERNATE, 1, GTK_CSS_FONT_VARIANT_ALTERNATE_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_ALTERNATE, 1, GTK_CSS_FONT_VARIANT_ALTERNATE_HISTORICAL_FORMS, "historical-forms" }
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_ALTERNATE, 1, 1, GTK_CSS_FONT_VARIANT_ALTERNATE_NORMAL, "normal" },
|
||||
{ >K_CSS_VALUE_FONT_VARIANT_ALTERNATE, 1, 1, GTK_CSS_FONT_VARIANT_ALTERNATE_HISTORICAL_FORMS, "historical-forms" }
|
||||
};
|
||||
|
||||
GtkCssValue *
|
||||
@@ -1213,6 +1230,7 @@ gtk_css_font_variant_ligature_value_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_LIGATURE = {
|
||||
"GtkCssFontVariantLigatureValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_flags_equal,
|
||||
@@ -1319,6 +1337,7 @@ gtk_css_font_variant_numeric_value_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_NUMERIC = {
|
||||
"GtkCssFontVariantNumbericValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_flags_equal,
|
||||
@@ -1422,6 +1441,7 @@ gtk_css_font_variant_east_asian_value_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_EAST_ASIAN = {
|
||||
"GtkCssFontVariantEastAsianValue",
|
||||
gtk_css_value_enum_free,
|
||||
gtk_css_value_enum_compute,
|
||||
gtk_css_value_flags_equal,
|
||||
|
@@ -693,6 +693,7 @@ gtk_css_value_filter_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FILTER = {
|
||||
"GtkCssFilterValue",
|
||||
gtk_css_value_filter_free,
|
||||
gtk_css_value_filter_compute,
|
||||
gtk_css_value_filter_equal,
|
||||
@@ -702,7 +703,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_FILTER = {
|
||||
gtk_css_value_filter_print
|
||||
};
|
||||
|
||||
static GtkCssValue none_singleton = { >K_CSS_VALUE_FILTER, 1, 0, { { GTK_CSS_FILTER_NONE } } };
|
||||
static GtkCssValue none_singleton = { >K_CSS_VALUE_FILTER, 1, 1, 0, { { GTK_CSS_FILTER_NONE } } };
|
||||
|
||||
static GtkCssValue *
|
||||
gtk_css_filter_value_alloc (guint n_filters)
|
||||
@@ -777,6 +778,7 @@ gtk_css_filter_value_parse (GtkCssParser *parser)
|
||||
GtkCssValue *value;
|
||||
GArray *array;
|
||||
guint i;
|
||||
gboolean is_static = TRUE;
|
||||
|
||||
if (gtk_css_parser_try_ident (parser, "none"))
|
||||
return gtk_css_filter_value_new_none ();
|
||||
@@ -793,6 +795,7 @@ gtk_css_filter_value_parse (GtkCssParser *parser)
|
||||
goto fail;
|
||||
|
||||
filter.type = GTK_CSS_FILTER_BLUR;
|
||||
is_static = is_static && filter.blur.value->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "brightness"))
|
||||
{
|
||||
@@ -800,6 +803,7 @@ gtk_css_filter_value_parse (GtkCssParser *parser)
|
||||
goto fail;
|
||||
|
||||
filter.type = GTK_CSS_FILTER_BRIGHTNESS;
|
||||
is_static = is_static && filter.brightness.value->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "contrast"))
|
||||
{
|
||||
@@ -807,6 +811,7 @@ gtk_css_filter_value_parse (GtkCssParser *parser)
|
||||
goto fail;
|
||||
|
||||
filter.type = GTK_CSS_FILTER_CONTRAST;
|
||||
is_static = is_static && filter.contrast.value->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "grayscale"))
|
||||
{
|
||||
@@ -814,13 +819,15 @@ gtk_css_filter_value_parse (GtkCssParser *parser)
|
||||
goto fail;
|
||||
|
||||
filter.type = GTK_CSS_FILTER_GRAYSCALE;
|
||||
is_static = is_static && filter.grayscale.value->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "hue-rotate"))
|
||||
{
|
||||
if (!gtk_css_parser_consume_function (parser, 1, 1, gtk_css_filter_parse_angle, &filter.blur.value))
|
||||
if (!gtk_css_parser_consume_function (parser, 1, 1, gtk_css_filter_parse_angle, &filter.hue_rotate.value))
|
||||
goto fail;
|
||||
|
||||
filter.type = GTK_CSS_FILTER_HUE_ROTATE;
|
||||
is_static = is_static && filter.hue_rotate.value->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "invert"))
|
||||
{
|
||||
@@ -828,6 +835,7 @@ gtk_css_filter_value_parse (GtkCssParser *parser)
|
||||
goto fail;
|
||||
|
||||
filter.type = GTK_CSS_FILTER_INVERT;
|
||||
is_static = is_static && filter.invert.value->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "opacity"))
|
||||
{
|
||||
@@ -835,6 +843,7 @@ gtk_css_filter_value_parse (GtkCssParser *parser)
|
||||
goto fail;
|
||||
|
||||
filter.type = GTK_CSS_FILTER_OPACITY;
|
||||
is_static = is_static && filter.opacity.value->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "saturate"))
|
||||
{
|
||||
@@ -842,6 +851,7 @@ gtk_css_filter_value_parse (GtkCssParser *parser)
|
||||
goto fail;
|
||||
|
||||
filter.type = GTK_CSS_FILTER_SATURATE;
|
||||
is_static = is_static && filter.saturate.value->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "sepia"))
|
||||
{
|
||||
@@ -849,6 +859,7 @@ gtk_css_filter_value_parse (GtkCssParser *parser)
|
||||
goto fail;
|
||||
|
||||
filter.type = GTK_CSS_FILTER_SEPIA;
|
||||
is_static = is_static && filter.sepia.value->is_static;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -865,6 +876,7 @@ gtk_css_filter_value_parse (GtkCssParser *parser)
|
||||
}
|
||||
|
||||
value = gtk_css_filter_value_alloc (array->len);
|
||||
value->is_static = is_static;
|
||||
memcpy (value->filters, array->data, sizeof (GtkCssFilter) * array->len);
|
||||
|
||||
g_array_free (array, TRUE);
|
||||
|
@@ -35,10 +35,10 @@ static GtkCssValue *gtk_css_font_features_value_new_empty (void);
|
||||
|
||||
static void
|
||||
gtk_css_font_features_value_add_feature (GtkCssValue *value,
|
||||
const char *name,
|
||||
int num)
|
||||
const char *name,
|
||||
GtkCssValue *val)
|
||||
{
|
||||
g_hash_table_insert (value->features, g_strdup (name), GINT_TO_POINTER (num));
|
||||
g_hash_table_insert (value->features, g_strdup (name), val);
|
||||
}
|
||||
|
||||
|
||||
@@ -74,8 +74,10 @@ gtk_css_value_font_features_equal (const GtkCssValue *value1,
|
||||
while (g_hash_table_iter_next (&iter, &name, &val1))
|
||||
{
|
||||
val2 = g_hash_table_lookup (value2->features, name);
|
||||
if (val2 == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (val1 != val2)
|
||||
if (!_gtk_css_value_equal (val1, val2))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -89,10 +91,9 @@ gtk_css_value_font_features_transition (GtkCssValue *start,
|
||||
double progress)
|
||||
{
|
||||
const char *name;
|
||||
gpointer start_val, end_val;
|
||||
GtkCssValue *start_val, *end_val;
|
||||
GHashTableIter iter;
|
||||
gpointer transition;
|
||||
GtkCssValue *result;
|
||||
GtkCssValue *result, *transition;
|
||||
|
||||
/* XXX: For value that are only in start or end but not both,
|
||||
* we don't transition but just keep the value.
|
||||
@@ -106,11 +107,11 @@ gtk_css_value_font_features_transition (GtkCssValue *start,
|
||||
{
|
||||
end_val = g_hash_table_lookup (end->features, name);
|
||||
if (end_val == NULL)
|
||||
transition = start_val;
|
||||
transition = _gtk_css_value_ref (start_val);
|
||||
else
|
||||
transition = progress > 0.5 ? start_val : end_val;
|
||||
transition = _gtk_css_value_transition (start_val, end_val, property_id, progress);
|
||||
|
||||
gtk_css_font_features_value_add_feature (result, name, GPOINTER_TO_INT (transition));
|
||||
gtk_css_font_features_value_add_feature (result, name, transition);
|
||||
}
|
||||
|
||||
g_hash_table_iter_init (&iter, end->features);
|
||||
@@ -120,7 +121,7 @@ gtk_css_value_font_features_transition (GtkCssValue *start,
|
||||
if (start_val != NULL)
|
||||
continue;
|
||||
|
||||
gtk_css_font_features_value_add_feature (result, name, GPOINTER_TO_INT (end_val));
|
||||
gtk_css_font_features_value_add_feature (result, name, _gtk_css_value_ref (end_val));
|
||||
}
|
||||
|
||||
return result;
|
||||
@@ -132,7 +133,7 @@ gtk_css_value_font_features_print (const GtkCssValue *value,
|
||||
{
|
||||
GHashTableIter iter;
|
||||
const char *name;
|
||||
gpointer val;
|
||||
GtkCssValue *val;
|
||||
gboolean first = TRUE;
|
||||
|
||||
if (value == default_font_features)
|
||||
@@ -149,11 +150,12 @@ gtk_css_value_font_features_print (const GtkCssValue *value,
|
||||
else
|
||||
g_string_append (string, ", ");
|
||||
g_string_append_printf (string, "\"%s\" ", name);
|
||||
g_string_append_printf (string, "%d", GPOINTER_TO_INT (val));
|
||||
_gtk_css_value_print (val, string);
|
||||
}
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_FEATURES = {
|
||||
"GtkCssFontFeaturesValue",
|
||||
gtk_css_value_font_features_free,
|
||||
gtk_css_value_font_features_compute,
|
||||
gtk_css_value_font_features_equal,
|
||||
@@ -203,7 +205,7 @@ is_valid_opentype_tag (const char *s)
|
||||
GtkCssValue *
|
||||
gtk_css_font_features_value_parse (GtkCssParser *parser)
|
||||
{
|
||||
GtkCssValue *result;
|
||||
GtkCssValue *result, *val;
|
||||
char *name;
|
||||
int num;
|
||||
|
||||
@@ -229,12 +231,16 @@ gtk_css_font_features_value_parse (GtkCssParser *parser)
|
||||
}
|
||||
|
||||
if (gtk_css_parser_try_ident (parser, "on"))
|
||||
num = 1;
|
||||
val = _gtk_css_number_value_new (1.0, GTK_CSS_NUMBER);
|
||||
else if (gtk_css_parser_try_ident (parser, "off"))
|
||||
num = 0;
|
||||
val = _gtk_css_number_value_new (0.0, GTK_CSS_NUMBER);
|
||||
else if (gtk_css_parser_has_integer (parser))
|
||||
{
|
||||
if (!gtk_css_parser_consume_integer (parser, &num))
|
||||
if (gtk_css_parser_consume_integer (parser, &num))
|
||||
{
|
||||
val = _gtk_css_number_value_new ((double)num, GTK_CSS_NUMBER);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_free (name);
|
||||
_gtk_css_value_unref (result);
|
||||
@@ -242,9 +248,9 @@ gtk_css_font_features_value_parse (GtkCssParser *parser)
|
||||
}
|
||||
}
|
||||
else
|
||||
num = 1;
|
||||
val = _gtk_css_number_value_new (1.0, GTK_CSS_NUMBER);
|
||||
|
||||
gtk_css_font_features_value_add_feature (result, name, num);
|
||||
gtk_css_font_features_value_add_feature (result, name, val);
|
||||
g_free (name);
|
||||
} while (gtk_css_parser_try_token (parser, GTK_CSS_TOKEN_COMMA));
|
||||
|
||||
@@ -274,7 +280,7 @@ gtk_css_font_features_value_get_features (GtkCssValue *value)
|
||||
first = FALSE;
|
||||
else
|
||||
g_string_append (string, ", ");
|
||||
g_string_append_printf (string, "%s %d", name, GPOINTER_TO_INT (val));
|
||||
g_string_append_printf (string, "%s %d", name, (int)_gtk_css_number_value_get (val, 100));
|
||||
}
|
||||
|
||||
return g_string_free (string, FALSE);
|
||||
|
@@ -154,6 +154,7 @@ gtk_css_value_font_variations_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIATIONS = {
|
||||
"GtkCssFontVariationsValue",
|
||||
gtk_css_value_font_variations_free,
|
||||
gtk_css_value_font_variations_compute,
|
||||
gtk_css_value_font_variations_equal,
|
||||
|
@@ -111,6 +111,7 @@ gtk_css_value_icon_theme_print (const GtkCssValue *icon_theme,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_ICON_THEME = {
|
||||
"GtkCssIconThemeValue",
|
||||
gtk_css_value_icon_theme_free,
|
||||
gtk_css_value_icon_theme_compute,
|
||||
gtk_css_value_icon_theme_equal,
|
||||
@@ -120,7 +121,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_ICON_THEME = {
|
||||
gtk_css_value_icon_theme_print
|
||||
};
|
||||
|
||||
static GtkCssValue default_icon_theme_value = { >K_CSS_VALUE_ICON_THEME, 1, NULL, 0 };
|
||||
static GtkCssValue default_icon_theme_value = { >K_CSS_VALUE_ICON_THEME, 1, 0, NULL, 0 };
|
||||
|
||||
GtkCssValue *
|
||||
gtk_css_icon_theme_value_new (GtkIconTheme *icontheme)
|
||||
|
670
gtk/gtkcssimagebuiltin.c
Normal file
670
gtk/gtkcssimagebuiltin.c
Normal file
@@ -0,0 +1,670 @@
|
||||
/*
|
||||
* Copyright © 2012 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: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gtkcssimagebuiltinprivate.h"
|
||||
|
||||
#include "gtkcssenumvalueprivate.h"
|
||||
#include "gtkcssnumbervalueprivate.h"
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtkcssstyleprivate.h"
|
||||
#include "gtkhslaprivate.h"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "fallback-c89.c"
|
||||
|
||||
G_DEFINE_TYPE (GtkCssImageBuiltin, gtk_css_image_builtin, GTK_TYPE_CSS_IMAGE)
|
||||
|
||||
static GtkCssImage *the_one_true_image;
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_draw_check (GtkCssImage *image,
|
||||
cairo_t *cr,
|
||||
double width,
|
||||
double height,
|
||||
gboolean checked,
|
||||
gboolean inconsistent)
|
||||
{
|
||||
GtkCssImageBuiltin *builtin = GTK_CSS_IMAGE_BUILTIN (image);
|
||||
gint x, y, exterior_size, interior_size, pad;
|
||||
|
||||
exterior_size = MIN (width, height);
|
||||
|
||||
if (exterior_size % 2 == 0) /* Ensure odd */
|
||||
exterior_size -= 1;
|
||||
|
||||
pad = 1 + MAX (1, (exterior_size - 2) / 9);
|
||||
interior_size = MAX (1, exterior_size - 2 * pad);
|
||||
|
||||
if (interior_size < 7)
|
||||
pad = MAX (0, (exterior_size - interior_size) / 2);
|
||||
|
||||
x = - (1 + exterior_size - (gint) width) / 2;
|
||||
y = - (1 + exterior_size - (gint) height) / 2;
|
||||
|
||||
gdk_cairo_set_source_rgba (cr, &builtin->fg_color);
|
||||
|
||||
if (inconsistent)
|
||||
{
|
||||
int line_thickness = MAX (1, (3 + interior_size * 2) / 7);
|
||||
|
||||
cairo_rectangle (cr,
|
||||
x + pad,
|
||||
y + pad + (1 + interior_size - line_thickness) / 2,
|
||||
interior_size,
|
||||
line_thickness);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (checked)
|
||||
{
|
||||
cairo_save (cr);
|
||||
cairo_translate (cr,
|
||||
x + pad, y + pad);
|
||||
|
||||
cairo_scale (cr, interior_size / 7., interior_size / 7.);
|
||||
|
||||
cairo_rectangle (cr, 0, 0, 7, 7);
|
||||
cairo_clip (cr);
|
||||
|
||||
cairo_move_to (cr, 7.0, 0.0);
|
||||
cairo_line_to (cr, 7.5, 1.0);
|
||||
cairo_curve_to (cr, 5.3, 2.0,
|
||||
4.3, 4.0,
|
||||
3.5, 7.0);
|
||||
cairo_curve_to (cr, 3.0, 5.7,
|
||||
1.3, 4.7,
|
||||
0.0, 4.7);
|
||||
cairo_line_to (cr, 0.2, 3.5);
|
||||
cairo_curve_to (cr, 1.1, 3.5,
|
||||
2.3, 4.3,
|
||||
3.0, 5.0);
|
||||
cairo_curve_to (cr, 1.0, 3.9,
|
||||
2.4, 4.1,
|
||||
3.2, 4.9);
|
||||
cairo_curve_to (cr, 3.5, 3.1,
|
||||
5.2, 2.0,
|
||||
7.0, 0.0);
|
||||
|
||||
cairo_fill (cr);
|
||||
cairo_restore (cr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_draw_option (GtkCssImage *image,
|
||||
cairo_t *cr,
|
||||
double width,
|
||||
double height,
|
||||
gboolean checked,
|
||||
gboolean inconsistent)
|
||||
{
|
||||
GtkCssImageBuiltin *builtin = GTK_CSS_IMAGE_BUILTIN (image);
|
||||
gint x, y, exterior_size, interior_size, pad;
|
||||
|
||||
exterior_size = MIN (width, height);
|
||||
|
||||
if (exterior_size % 2 == 0) /* Ensure odd */
|
||||
exterior_size -= 1;
|
||||
|
||||
x = - (1 + exterior_size - width) / 2;
|
||||
y = - (1 + exterior_size - height) / 2;
|
||||
|
||||
gdk_cairo_set_source_rgba (cr, &builtin->fg_color);
|
||||
|
||||
pad = 1 + MAX (1, 2 * (exterior_size - 2) / 9);
|
||||
interior_size = MAX (1, exterior_size - 2 * pad);
|
||||
|
||||
if (interior_size < 7)
|
||||
pad = MAX (0, (exterior_size - interior_size) / 2);
|
||||
|
||||
if (inconsistent)
|
||||
{
|
||||
gint line_thickness;
|
||||
|
||||
line_thickness = MAX (1, (3 + interior_size * 2) / 7);
|
||||
|
||||
cairo_rectangle (cr,
|
||||
x + pad,
|
||||
y + pad + (interior_size - line_thickness) / 2.,
|
||||
interior_size,
|
||||
line_thickness);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
else if (checked)
|
||||
{
|
||||
cairo_new_sub_path (cr);
|
||||
cairo_arc (cr,
|
||||
x + pad + interior_size / 2.,
|
||||
y + pad + interior_size / 2.,
|
||||
interior_size / 2.,
|
||||
0, 2 * G_PI);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_draw_arrow (GtkCssImage *image,
|
||||
cairo_t *cr,
|
||||
double width,
|
||||
double height,
|
||||
GtkCssImageBuiltinType image_type)
|
||||
{
|
||||
GtkCssImageBuiltin *builtin = GTK_CSS_IMAGE_BUILTIN (image);
|
||||
double line_width;
|
||||
double size;
|
||||
|
||||
size = MIN (width, height);
|
||||
|
||||
cairo_translate (cr, width / 2.0, height / 2.0);
|
||||
switch ((guint) image_type)
|
||||
{
|
||||
case GTK_CSS_IMAGE_BUILTIN_ARROW_UP:
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN:
|
||||
cairo_rotate (cr, G_PI);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT:
|
||||
cairo_rotate (cr, 3 * G_PI / 2);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT:
|
||||
cairo_rotate (cr, G_PI / 2);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
}
|
||||
|
||||
line_width = size / 3.0 / sqrt (2);
|
||||
cairo_set_line_width (cr, line_width);
|
||||
cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
|
||||
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
|
||||
|
||||
cairo_scale (cr,
|
||||
(size / (size + line_width)),
|
||||
(size / (size + line_width)));
|
||||
|
||||
cairo_move_to (cr, -size / 2.0, size / 4.0);
|
||||
cairo_rel_line_to (cr, size / 2.0, -size / 2.0);
|
||||
cairo_rel_line_to (cr, size / 2.0, size / 2.0);
|
||||
|
||||
gdk_cairo_set_source_rgba (cr, &builtin->fg_color);
|
||||
cairo_stroke (cr);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_draw_expander (GtkCssImage *image,
|
||||
cairo_t *cr,
|
||||
double width,
|
||||
double height,
|
||||
gboolean horizontal,
|
||||
gboolean is_rtl,
|
||||
gboolean expanded)
|
||||
{
|
||||
GtkCssImageBuiltin *builtin = GTK_CSS_IMAGE_BUILTIN (image);
|
||||
double vertical_overshoot;
|
||||
int diameter;
|
||||
double radius;
|
||||
double interp; /* interpolation factor for center position */
|
||||
double x_double_horz, y_double_horz;
|
||||
double x_double_vert, y_double_vert;
|
||||
double x_double, y_double;
|
||||
gdouble angle;
|
||||
gint line_width;
|
||||
gdouble progress;
|
||||
|
||||
line_width = 1;
|
||||
progress = expanded ? 1 : 0;
|
||||
|
||||
if (!horizontal)
|
||||
{
|
||||
if (is_rtl)
|
||||
angle = (G_PI) - ((G_PI / 2) * progress);
|
||||
else
|
||||
angle = (G_PI / 2) * progress;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_rtl)
|
||||
angle = (G_PI / 2) + ((G_PI / 2) * progress);
|
||||
else
|
||||
angle = (G_PI / 2) - ((G_PI / 2) * progress);
|
||||
}
|
||||
|
||||
interp = progress;
|
||||
|
||||
/* Compute distance that the stroke extends beyonds the end
|
||||
* of the triangle we draw.
|
||||
*/
|
||||
vertical_overshoot = line_width / 2.0 * (1. / tan (G_PI / 8));
|
||||
|
||||
/* For odd line widths, we end the vertical line of the triangle
|
||||
* at a half pixel, so we round differently.
|
||||
*/
|
||||
if (line_width % 2 == 1)
|
||||
vertical_overshoot = ceil (0.5 + vertical_overshoot) - 0.5;
|
||||
else
|
||||
vertical_overshoot = ceil (vertical_overshoot);
|
||||
|
||||
/* Adjust the size of the triangle we draw so that the entire stroke fits
|
||||
*/
|
||||
diameter = (gint) MAX (3, width - 2 * vertical_overshoot);
|
||||
|
||||
/* If the line width is odd, we want the diameter to be even,
|
||||
* and vice versa, so force the sum to be odd. This relationship
|
||||
* makes the point of the triangle look right.
|
||||
*/
|
||||
diameter -= (1 - (diameter + line_width) % 2);
|
||||
|
||||
radius = diameter / 2.;
|
||||
|
||||
/* Adjust the center so that the stroke is properly aligned with
|
||||
* the pixel grid. The center adjustment is different for the
|
||||
* horizontal and vertical orientations. For intermediate positions
|
||||
* we interpolate between the two.
|
||||
*/
|
||||
x_double_vert = floor ((width / 2) - (radius + line_width) / 2.) + (radius + line_width) / 2.;
|
||||
y_double_vert = (height / 2) - 0.5;
|
||||
|
||||
x_double_horz = (width / 2) - 0.5;
|
||||
y_double_horz = floor ((height / 2) - (radius + line_width) / 2.) + (radius + line_width) / 2.;
|
||||
|
||||
x_double = x_double_vert * (1 - interp) + x_double_horz * interp;
|
||||
y_double = y_double_vert * (1 - interp) + y_double_horz * interp;
|
||||
|
||||
cairo_translate (cr, x_double, y_double);
|
||||
cairo_rotate (cr, angle);
|
||||
|
||||
cairo_move_to (cr, - radius / 2., - radius);
|
||||
cairo_line_to (cr, radius / 2., 0);
|
||||
cairo_line_to (cr, - radius / 2., radius);
|
||||
cairo_close_path (cr);
|
||||
|
||||
cairo_set_line_width (cr, line_width);
|
||||
|
||||
gdk_cairo_set_source_rgba (cr, &builtin->fg_color);
|
||||
|
||||
cairo_fill (cr);
|
||||
}
|
||||
|
||||
static void
|
||||
color_shade (const GdkRGBA *color,
|
||||
gdouble factor,
|
||||
GdkRGBA *color_return)
|
||||
{
|
||||
GtkHSLA hsla;
|
||||
|
||||
_gtk_hsla_init_from_rgba (&hsla, color);
|
||||
_gtk_hsla_shade (&hsla, &hsla, factor);
|
||||
_gdk_rgba_init_from_hsla (color_return, &hsla);
|
||||
}
|
||||
|
||||
static void
|
||||
render_dot (cairo_t *cr,
|
||||
const GdkRGBA *lighter,
|
||||
const GdkRGBA *darker,
|
||||
gdouble x,
|
||||
gdouble y,
|
||||
gdouble size)
|
||||
{
|
||||
size = CLAMP ((gint) size, 2, 3);
|
||||
|
||||
if (size == 2)
|
||||
{
|
||||
gdk_cairo_set_source_rgba (cr, lighter);
|
||||
cairo_rectangle (cr, x, y, 1, 1);
|
||||
cairo_rectangle (cr, x + 1, y + 1, 1, 1);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
else if (size == 3)
|
||||
{
|
||||
gdk_cairo_set_source_rgba (cr, lighter);
|
||||
cairo_rectangle (cr, x, y, 2, 1);
|
||||
cairo_rectangle (cr, x, y, 1, 2);
|
||||
cairo_fill (cr);
|
||||
|
||||
gdk_cairo_set_source_rgba (cr, darker);
|
||||
cairo_rectangle (cr, x + 1, y + 1, 2, 1);
|
||||
cairo_rectangle (cr, x + 2, y, 1, 2);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_draw_pane_separator (GtkCssImage *image,
|
||||
cairo_t *cr,
|
||||
double width,
|
||||
double height)
|
||||
{
|
||||
GtkCssImageBuiltin *builtin = GTK_CSS_IMAGE_BUILTIN (image);
|
||||
GdkRGBA lighter, darker;
|
||||
gint xx, yy;
|
||||
|
||||
cairo_set_line_width (cr, 1.0);
|
||||
|
||||
color_shade (&builtin->bg_color, 0.7, &darker);
|
||||
color_shade (&builtin->bg_color, 1.3, &lighter);
|
||||
|
||||
if (width > height)
|
||||
for (xx = width / 2 - 15; xx <= width / 2 + 15; xx += 5)
|
||||
render_dot (cr, &lighter, &darker, xx, height / 2 - 1, 3);
|
||||
else
|
||||
for (yy = height / 2 - 15; yy <= height / 2 + 15; yy += 5)
|
||||
render_dot (cr, &lighter, &darker, width / 2 - 1, yy, 3);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_draw_handle (GtkCssImage *image,
|
||||
cairo_t *cr,
|
||||
double width,
|
||||
double height)
|
||||
{
|
||||
GtkCssImageBuiltin *builtin = GTK_CSS_IMAGE_BUILTIN (image);
|
||||
GdkRGBA lighter, darker;
|
||||
gint xx, yy;
|
||||
|
||||
cairo_set_line_width (cr, 1.0);
|
||||
|
||||
color_shade (&builtin->bg_color, 0.7, &darker);
|
||||
color_shade (&builtin->bg_color, 1.3, &lighter);
|
||||
|
||||
for (yy = 0; yy < height; yy += 3)
|
||||
for (xx = 0; xx < width; xx += 6)
|
||||
{
|
||||
render_dot (cr, &lighter, &darker, xx, yy, 2);
|
||||
render_dot (cr, &lighter, &darker, xx + 3, yy + 1, 2);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_draw_spinner (GtkCssImage *image,
|
||||
cairo_t *cr,
|
||||
double width,
|
||||
double height)
|
||||
{
|
||||
GtkCssImageBuiltin *builtin = GTK_CSS_IMAGE_BUILTIN (image);
|
||||
guint num_steps;
|
||||
gdouble radius;
|
||||
gdouble half;
|
||||
gint i;
|
||||
|
||||
radius = MIN (width / 2, height / 2);
|
||||
|
||||
cairo_translate (cr, width / 2, height / 2);
|
||||
|
||||
num_steps = 12;
|
||||
|
||||
cairo_set_line_width (cr, 2.0);
|
||||
|
||||
half = num_steps / 2;
|
||||
|
||||
for (i = 0; i < num_steps; i++)
|
||||
{
|
||||
gint inset = 0.7 * radius;
|
||||
/* transparency is a function of time and intial value */
|
||||
gdouble t = 1.0 - (gdouble) i / num_steps;
|
||||
gdouble xscale = - sin (i * G_PI / half);
|
||||
gdouble yscale = - cos (i * G_PI / half);
|
||||
|
||||
cairo_move_to (cr,
|
||||
(radius - inset) * xscale,
|
||||
(radius - inset) * yscale);
|
||||
cairo_line_to (cr,
|
||||
radius * xscale,
|
||||
radius * yscale);
|
||||
|
||||
cairo_set_source_rgba (cr,
|
||||
builtin->fg_color.red,
|
||||
builtin->fg_color.green,
|
||||
builtin->fg_color.blue,
|
||||
builtin->fg_color.alpha * t);
|
||||
|
||||
cairo_stroke (cr);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_real_snapshot (GtkCssImage *image,
|
||||
GtkSnapshot *snapshot,
|
||||
double width,
|
||||
double height)
|
||||
{
|
||||
/* It's a builtin image, other code will draw things */
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
gtk_css_image_builtin_parse (GtkCssImage *image,
|
||||
GtkCssParser *parser)
|
||||
{
|
||||
if (!gtk_css_parser_try_ident (parser, "builtin"))
|
||||
{
|
||||
gtk_css_parser_error_syntax (parser, "Expected 'builtin'");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_print (GtkCssImage *image,
|
||||
GString *string)
|
||||
{
|
||||
g_string_append (string, "builtin");
|
||||
}
|
||||
|
||||
static GtkCssImage *
|
||||
gtk_css_image_builtin_compute (GtkCssImage *image,
|
||||
guint property_id,
|
||||
GtkStyleProvider *provider,
|
||||
GtkCssStyle *style,
|
||||
GtkCssStyle *parent_style)
|
||||
{
|
||||
GtkCssImageBuiltin *result;
|
||||
|
||||
result = g_object_new (GTK_TYPE_CSS_IMAGE_BUILTIN, NULL);
|
||||
|
||||
result->fg_color = *gtk_css_color_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_COLOR));
|
||||
result->bg_color = *gtk_css_color_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BACKGROUND_COLOR));
|
||||
|
||||
return GTK_CSS_IMAGE (result);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_css_image_builtin_equal (GtkCssImage *image1,
|
||||
GtkCssImage *image2)
|
||||
{
|
||||
GtkCssImageBuiltin *builtin1 = (GtkCssImageBuiltin *) image1;
|
||||
GtkCssImageBuiltin *builtin2 = (GtkCssImageBuiltin *) image2;
|
||||
|
||||
return gdk_rgba_equal (&builtin1->fg_color, &builtin2->fg_color)
|
||||
&& gdk_rgba_equal (&builtin1->bg_color, &builtin2->bg_color);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_dispose (GObject *object)
|
||||
{
|
||||
if (the_one_true_image == GTK_CSS_IMAGE (object))
|
||||
the_one_true_image = NULL;
|
||||
|
||||
G_OBJECT_CLASS (gtk_css_image_builtin_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_class_init (GtkCssImageBuiltinClass *klass)
|
||||
{
|
||||
GtkCssImageClass *image_class = GTK_CSS_IMAGE_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
image_class->snapshot = gtk_css_image_builtin_real_snapshot;
|
||||
image_class->parse = gtk_css_image_builtin_parse;
|
||||
image_class->print = gtk_css_image_builtin_print;
|
||||
image_class->compute = gtk_css_image_builtin_compute;
|
||||
image_class->equal = gtk_css_image_builtin_equal;
|
||||
|
||||
object_class->dispose = gtk_css_image_builtin_dispose;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_image_builtin_init (GtkCssImageBuiltin *builtin)
|
||||
{
|
||||
/* white background */
|
||||
builtin->bg_color.red = builtin->bg_color.green = builtin->bg_color.blue = builtin->bg_color.alpha = 1.0;
|
||||
/* black foreground */
|
||||
builtin->fg_color.alpha = 1.0;
|
||||
}
|
||||
|
||||
GtkCssImage *
|
||||
gtk_css_image_builtin_new (void)
|
||||
{
|
||||
if (the_one_true_image == NULL)
|
||||
the_one_true_image = g_object_new (GTK_TYPE_CSS_IMAGE_BUILTIN, NULL);
|
||||
else
|
||||
g_object_ref (the_one_true_image);
|
||||
|
||||
return the_one_true_image;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_css_image_builtin_draw (GtkCssImage *image,
|
||||
cairo_t *cr,
|
||||
double width,
|
||||
double height,
|
||||
GtkCssImageBuiltinType image_type)
|
||||
{
|
||||
if (!GTK_IS_CSS_IMAGE_BUILTIN (image))
|
||||
{
|
||||
_gtk_css_image_draw (image, cr, width, height);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (image_type)
|
||||
{
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_NONE:
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_CHECK:
|
||||
case GTK_CSS_IMAGE_BUILTIN_CHECK_INCONSISTENT:
|
||||
gtk_css_image_builtin_draw_check (image, cr,
|
||||
width, height,
|
||||
image_type == GTK_CSS_IMAGE_BUILTIN_CHECK,
|
||||
image_type == GTK_CSS_IMAGE_BUILTIN_CHECK_INCONSISTENT);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_OPTION:
|
||||
case GTK_CSS_IMAGE_BUILTIN_OPTION_INCONSISTENT:
|
||||
gtk_css_image_builtin_draw_option (image, cr,
|
||||
width, height,
|
||||
image_type == GTK_CSS_IMAGE_BUILTIN_OPTION,
|
||||
image_type == GTK_CSS_IMAGE_BUILTIN_OPTION_INCONSISTENT);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_ARROW_UP:
|
||||
case GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN:
|
||||
case GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT:
|
||||
case GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT:
|
||||
gtk_css_image_builtin_draw_arrow (image, cr,
|
||||
width, height,
|
||||
image_type);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT:
|
||||
gtk_css_image_builtin_draw_expander (image, cr,
|
||||
width, height,
|
||||
TRUE, FALSE, FALSE);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_LEFT:
|
||||
gtk_css_image_builtin_draw_expander (image, cr,
|
||||
width, height,
|
||||
FALSE, FALSE, FALSE);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_RIGHT:
|
||||
gtk_css_image_builtin_draw_expander (image, cr,
|
||||
width, height,
|
||||
TRUE, TRUE, FALSE);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_RIGHT:
|
||||
gtk_css_image_builtin_draw_expander (image, cr,
|
||||
width, height,
|
||||
FALSE, TRUE, FALSE);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT_EXPANDED:
|
||||
gtk_css_image_builtin_draw_expander (image, cr,
|
||||
width, height,
|
||||
TRUE, FALSE, TRUE);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_LEFT_EXPANDED:
|
||||
gtk_css_image_builtin_draw_expander (image, cr,
|
||||
width, height,
|
||||
FALSE, FALSE, TRUE);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_RIGHT_EXPANDED:
|
||||
gtk_css_image_builtin_draw_expander (image, cr,
|
||||
width, height,
|
||||
TRUE, TRUE, TRUE);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_RIGHT_EXPANDED:
|
||||
gtk_css_image_builtin_draw_expander (image, cr,
|
||||
width, height,
|
||||
FALSE, TRUE, TRUE);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_PANE_SEPARATOR:
|
||||
gtk_css_image_builtin_draw_pane_separator (image, cr,
|
||||
width, height);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_HANDLE:
|
||||
gtk_css_image_builtin_draw_handle (image, cr,
|
||||
width, height);
|
||||
break;
|
||||
case GTK_CSS_IMAGE_BUILTIN_SPINNER:
|
||||
gtk_css_image_builtin_draw_spinner (image, cr,
|
||||
width, height);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gtk_css_image_builtin_snapshot (GtkCssImage *image,
|
||||
GtkSnapshot *snapshot,
|
||||
double width,
|
||||
double height,
|
||||
GtkCssImageBuiltinType image_type)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_CSS_IMAGE (image));
|
||||
g_return_if_fail (snapshot != NULL);
|
||||
g_return_if_fail (width > 0);
|
||||
g_return_if_fail (height > 0);
|
||||
|
||||
if (!GTK_IS_CSS_IMAGE_BUILTIN (image))
|
||||
{
|
||||
gtk_css_image_snapshot (image, snapshot, width, height);
|
||||
return;
|
||||
}
|
||||
|
||||
if (image_type != GTK_CSS_IMAGE_BUILTIN_NONE)
|
||||
{
|
||||
cairo_t *cr = gtk_snapshot_append_cairo (snapshot,
|
||||
&GRAPHENE_RECT_INIT (0, 0, width, height));
|
||||
gtk_css_image_builtin_draw (image, cr, width, height, image_type);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
}
|
68
gtk/gtkcssimagebuiltinprivate.h
Normal file
68
gtk/gtkcssimagebuiltinprivate.h
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright © 2012 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: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __GTK_CSS_IMAGE_BUILTIN_PRIVATE_H__
|
||||
#define __GTK_CSS_IMAGE_BUILTIN_PRIVATE_H__
|
||||
|
||||
#include "gtk/gtkcssimageprivate.h"
|
||||
#include "gtk/gtkicontheme.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_CSS_IMAGE_BUILTIN (gtk_css_image_builtin_get_type ())
|
||||
#define GTK_CSS_IMAGE_BUILTIN(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, GTK_TYPE_CSS_IMAGE_BUILTIN, GtkCssImageBuiltin))
|
||||
#define GTK_CSS_IMAGE_BUILTIN_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST (cls, GTK_TYPE_CSS_IMAGE_BUILTIN, GtkCssImageBuiltinClass))
|
||||
#define GTK_IS_CSS_IMAGE_BUILTIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, GTK_TYPE_CSS_IMAGE_BUILTIN))
|
||||
#define GTK_IS_CSS_IMAGE_BUILTIN_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE (obj, GTK_TYPE_CSS_IMAGE_BUILTIN))
|
||||
#define GTK_CSS_IMAGE_BUILTIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CSS_IMAGE_BUILTIN, GtkCssImageBuiltinClass))
|
||||
|
||||
typedef struct _GtkCssImageBuiltin GtkCssImageBuiltin;
|
||||
typedef struct _GtkCssImageBuiltinClass GtkCssImageBuiltinClass;
|
||||
|
||||
struct _GtkCssImageBuiltin
|
||||
{
|
||||
GtkCssImage parent;
|
||||
|
||||
GdkRGBA fg_color;
|
||||
GdkRGBA bg_color;
|
||||
};
|
||||
|
||||
struct _GtkCssImageBuiltinClass
|
||||
{
|
||||
GtkCssImageClass parent_class;
|
||||
};
|
||||
|
||||
GType gtk_css_image_builtin_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GtkCssImage * gtk_css_image_builtin_new (void);
|
||||
|
||||
void gtk_css_image_builtin_draw (GtkCssImage *image,
|
||||
cairo_t *cr,
|
||||
double width,
|
||||
double height,
|
||||
GtkCssImageBuiltinType image_type);
|
||||
void gtk_css_image_builtin_snapshot (GtkCssImage *image,
|
||||
GtkSnapshot *snapshot,
|
||||
double width,
|
||||
double height,
|
||||
GtkCssImageBuiltinType image_type);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_CSS_IMAGE_BUILTIN_PRIVATE_H__ */
|
@@ -21,7 +21,7 @@
|
||||
|
||||
#include "gtkcssimagefallbackprivate.h"
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtkcssrgbavalueprivate.h"
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
|
||||
#include "gtkstyleproviderprivate.h"
|
||||
|
||||
@@ -74,7 +74,7 @@ gtk_css_image_fallback_snapshot (GtkCssImage *image,
|
||||
const GdkRGBA *color;
|
||||
|
||||
if (fallback->color)
|
||||
color = _gtk_css_rgba_value_get_rgba (fallback->color);
|
||||
color = gtk_css_color_value_get_rgba (fallback->color);
|
||||
else
|
||||
color = &red;
|
||||
|
||||
|
@@ -25,7 +25,7 @@
|
||||
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtkcssnumbervalueprivate.h"
|
||||
#include "gtkcssrgbavalueprivate.h"
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtkcssprovider.h"
|
||||
|
||||
G_DEFINE_TYPE (GtkCssImageLinear, _gtk_css_image_linear, GTK_TYPE_CSS_IMAGE)
|
||||
@@ -194,7 +194,7 @@ gtk_css_image_linear_snapshot (GtkCssImage *image,
|
||||
linear->stops->len - 1);
|
||||
|
||||
gtk_snapshot_append_color (snapshot,
|
||||
_gtk_css_rgba_value_get_rgba (stop->color),
|
||||
gtk_css_color_value_get_rgba (stop->color),
|
||||
&GRAPHENE_RECT_INIT (0, 0, width, height));
|
||||
return;
|
||||
}
|
||||
@@ -240,7 +240,7 @@ gtk_css_image_linear_snapshot (GtkCssImage *image,
|
||||
offset += step;
|
||||
|
||||
stops[last].offset = (offset - start) / (end - start);
|
||||
stops[last].color = *_gtk_css_rgba_value_get_rgba (stop->color);
|
||||
stops[last].color = *gtk_css_color_value_get_rgba (stop->color);
|
||||
}
|
||||
|
||||
offset = pos;
|
||||
|
@@ -26,7 +26,7 @@
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtkcssnumbervalueprivate.h"
|
||||
#include "gtkcsspositionvalueprivate.h"
|
||||
#include "gtkcssrgbavalueprivate.h"
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtkcssprovider.h"
|
||||
|
||||
G_DEFINE_TYPE (GtkCssImageRadial, _gtk_css_image_radial, GTK_TYPE_CSS_IMAGE)
|
||||
@@ -208,7 +208,7 @@ gtk_css_image_radial_snapshot (GtkCssImage *image,
|
||||
|
||||
stop = &g_array_index (radial->stops, GtkCssImageRadialColorStop, last);
|
||||
|
||||
rgba = _gtk_css_rgba_value_get_rgba (stop->color);
|
||||
rgba = gtk_css_color_value_get_rgba (stop->color);
|
||||
offset += step;
|
||||
|
||||
cairo_pattern_add_color_stop_rgba (pattern,
|
||||
|
@@ -22,7 +22,7 @@
|
||||
#include "gtkcssimagerecolorprivate.h"
|
||||
#include "gtkcssimageprivate.h"
|
||||
#include "gtkcsspalettevalueprivate.h"
|
||||
#include "gtkcssrgbavalueprivate.h"
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtkiconthemeprivate.h"
|
||||
#include "gdkpixbufutilsprivate.h"
|
||||
|
||||
@@ -74,7 +74,7 @@ lookup_symbolic_colors (GtkCssStyle *style,
|
||||
const GdkRGBA *lookup;
|
||||
|
||||
color = gtk_css_style_get_value (style, GTK_CSS_PROPERTY_COLOR);
|
||||
*color_out = *_gtk_css_rgba_value_get_rgba (color);
|
||||
*color_out = *gtk_css_color_value_get_rgba (color);
|
||||
|
||||
lookup = gtk_css_palette_value_get_color (palette, "success");
|
||||
if (lookup)
|
||||
|
@@ -123,6 +123,7 @@ gtk_css_value_image_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_IMAGE = {
|
||||
"GtkCssImageValue",
|
||||
gtk_css_value_image_free,
|
||||
gtk_css_value_image_compute,
|
||||
gtk_css_value_image_equal,
|
||||
@@ -135,7 +136,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_IMAGE = {
|
||||
GtkCssValue *
|
||||
_gtk_css_image_value_new (GtkCssImage *image)
|
||||
{
|
||||
static GtkCssValue none_singleton = { >K_CSS_VALUE_IMAGE, 1, NULL };
|
||||
static GtkCssValue none_singleton = { >K_CSS_VALUE_IMAGE, 1, 1, NULL };
|
||||
GtkCssValue *value;
|
||||
|
||||
if (image == NULL)
|
||||
|
@@ -78,6 +78,7 @@ gtk_css_value_inherit_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_INHERIT = {
|
||||
"GtkCssInheritValue",
|
||||
gtk_css_value_inherit_free,
|
||||
gtk_css_value_inherit_compute,
|
||||
gtk_css_value_inherit_equal,
|
||||
|
@@ -102,6 +102,7 @@ gtk_css_value_initial_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_INITIAL = {
|
||||
"GtkCssInitialValue",
|
||||
gtk_css_value_initial_free,
|
||||
gtk_css_value_initial_compute,
|
||||
gtk_css_value_initial_equal,
|
||||
|
@@ -22,7 +22,6 @@
|
||||
#include "gtkcssnodedeclarationprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
#include "gtkwidgetpath.h"
|
||||
#include "gtkprivate.h"
|
||||
|
||||
/* GTK_CSS_MATCHER_WIDGET_PATH */
|
||||
|
||||
@@ -159,17 +158,7 @@ gtk_css_matcher_widget_path_has_position (const GtkCssMatcher *matcher,
|
||||
return x / a >= 0;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_matcher_widget_path_print (const GtkCssMatcher *matcher,
|
||||
GString *string)
|
||||
{
|
||||
char *s = gtk_widget_path_to_string (matcher->path.path);
|
||||
g_string_append (string, s);
|
||||
g_free (s);
|
||||
}
|
||||
|
||||
static const GtkCssMatcherClass GTK_CSS_MATCHER_WIDGET_PATH = {
|
||||
GTK_CSS_MATCHER_TYPE_WIDGET_PATH,
|
||||
gtk_css_matcher_widget_path_get_parent,
|
||||
gtk_css_matcher_widget_path_get_previous,
|
||||
gtk_css_matcher_widget_path_get_state,
|
||||
@@ -177,7 +166,7 @@ static const GtkCssMatcherClass GTK_CSS_MATCHER_WIDGET_PATH = {
|
||||
gtk_css_matcher_widget_path_has_class,
|
||||
gtk_css_matcher_widget_path_has_id,
|
||||
gtk_css_matcher_widget_path_has_position,
|
||||
gtk_css_matcher_widget_path_print
|
||||
FALSE
|
||||
};
|
||||
|
||||
gboolean
|
||||
@@ -345,15 +334,7 @@ gtk_css_matcher_node_has_position (const GtkCssMatcher *matcher,
|
||||
a, b);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_matcher_node_print (const GtkCssMatcher *matcher,
|
||||
GString *string)
|
||||
{
|
||||
gtk_css_node_print (matcher->node.node, 0, string, 0);
|
||||
}
|
||||
|
||||
static const GtkCssMatcherClass GTK_CSS_MATCHER_NODE = {
|
||||
GTK_CSS_MATCHER_TYPE_NODE,
|
||||
gtk_css_matcher_node_get_parent,
|
||||
gtk_css_matcher_node_get_previous,
|
||||
gtk_css_matcher_node_get_state,
|
||||
@@ -361,7 +342,7 @@ static const GtkCssMatcherClass GTK_CSS_MATCHER_NODE = {
|
||||
gtk_css_matcher_node_has_class,
|
||||
gtk_css_matcher_node_has_id,
|
||||
gtk_css_matcher_node_has_position,
|
||||
gtk_css_matcher_node_print
|
||||
FALSE
|
||||
};
|
||||
|
||||
void
|
||||
@@ -438,15 +419,7 @@ gtk_css_matcher_any_has_position (const GtkCssMatcher *matcher,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_matcher_any_print (const GtkCssMatcher *matcher,
|
||||
GString *string)
|
||||
{
|
||||
g_string_append (string, "ANY");
|
||||
}
|
||||
|
||||
static const GtkCssMatcherClass GTK_CSS_MATCHER_ANY = {
|
||||
GTK_CSS_MATCHER_TYPE_ANY,
|
||||
gtk_css_matcher_any_get_parent,
|
||||
gtk_css_matcher_any_get_previous,
|
||||
gtk_css_matcher_any_get_state,
|
||||
@@ -454,7 +427,7 @@ static const GtkCssMatcherClass GTK_CSS_MATCHER_ANY = {
|
||||
gtk_css_matcher_any_has_class,
|
||||
gtk_css_matcher_any_has_id,
|
||||
gtk_css_matcher_any_has_position,
|
||||
gtk_css_matcher_any_print
|
||||
TRUE
|
||||
};
|
||||
|
||||
void
|
||||
@@ -469,17 +442,9 @@ static gboolean
|
||||
gtk_css_matcher_superset_get_parent (GtkCssMatcher *matcher,
|
||||
const GtkCssMatcher *child)
|
||||
{
|
||||
gboolean ret = TRUE;
|
||||
_gtk_css_matcher_any_init (matcher);
|
||||
|
||||
if (child->klass->type == GTK_CSS_MATCHER_TYPE_NODE)
|
||||
{
|
||||
ret = gtk_css_matcher_node_get_parent (matcher, child);
|
||||
matcher->klass = child->klass;
|
||||
}
|
||||
else
|
||||
_gtk_css_matcher_any_init (matcher);
|
||||
|
||||
return ret;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -494,7 +459,12 @@ gtk_css_matcher_superset_get_previous (GtkCssMatcher *matcher,
|
||||
static GtkStateFlags
|
||||
gtk_css_matcher_superset_get_state (const GtkCssMatcher *matcher)
|
||||
{
|
||||
return GTK_STATE_FLAG_ACTIVE | GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_SELECTED
|
||||
/* XXX: This gets tricky when we implement :not() */
|
||||
|
||||
if (matcher->superset.relevant & GTK_CSS_CHANGE_STATE)
|
||||
return _gtk_css_matcher_get_state (matcher->superset.subset);
|
||||
else
|
||||
return GTK_STATE_FLAG_ACTIVE | GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_SELECTED
|
||||
| GTK_STATE_FLAG_INSENSITIVE | GTK_STATE_FLAG_INCONSISTENT
|
||||
| GTK_STATE_FLAG_FOCUSED | GTK_STATE_FLAG_BACKDROP | GTK_STATE_FLAG_LINK
|
||||
| GTK_STATE_FLAG_VISITED;
|
||||
@@ -504,21 +474,30 @@ static gboolean
|
||||
gtk_css_matcher_superset_has_name (const GtkCssMatcher *matcher,
|
||||
/*interned*/ const char *name)
|
||||
{
|
||||
return TRUE;
|
||||
if (matcher->superset.relevant & GTK_CSS_CHANGE_NAME)
|
||||
return _gtk_css_matcher_has_name (matcher->superset.subset, name);
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_css_matcher_superset_has_class (const GtkCssMatcher *matcher,
|
||||
GQuark class_name)
|
||||
{
|
||||
return TRUE;
|
||||
if (matcher->superset.relevant & GTK_CSS_CHANGE_CLASS)
|
||||
return _gtk_css_matcher_has_class (matcher->superset.subset, class_name);
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_css_matcher_superset_has_id (const GtkCssMatcher *matcher,
|
||||
const char *id)
|
||||
{
|
||||
return TRUE;
|
||||
if (matcher->superset.relevant & GTK_CSS_CHANGE_NAME)
|
||||
return _gtk_css_matcher_has_id (matcher->superset.subset, id);
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -527,23 +506,13 @@ gtk_css_matcher_superset_has_position (const GtkCssMatcher *matcher,
|
||||
int a,
|
||||
int b)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_matcher_superset_print (const GtkCssMatcher *matcher,
|
||||
GString *string)
|
||||
{
|
||||
g_string_append (string, "SUPERSET(");
|
||||
if (matcher->klass->type == GTK_CSS_MATCHER_TYPE_NODE)
|
||||
gtk_css_node_print (matcher->node.node, 0, string, 0);
|
||||
if (matcher->superset.relevant & GTK_CSS_CHANGE_POSITION)
|
||||
return _gtk_css_matcher_has_position (matcher->superset.subset, forward, a, b);
|
||||
else
|
||||
g_string_append (string, "...");
|
||||
g_string_append (string, ")");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const GtkCssMatcherClass GTK_CSS_MATCHER_SUPERSET = {
|
||||
0,
|
||||
gtk_css_matcher_superset_get_parent,
|
||||
gtk_css_matcher_superset_get_previous,
|
||||
gtk_css_matcher_superset_get_state,
|
||||
@@ -551,61 +520,19 @@ static const GtkCssMatcherClass GTK_CSS_MATCHER_SUPERSET = {
|
||||
gtk_css_matcher_superset_has_class,
|
||||
gtk_css_matcher_superset_has_id,
|
||||
gtk_css_matcher_superset_has_position,
|
||||
gtk_css_matcher_superset_print
|
||||
FALSE
|
||||
};
|
||||
|
||||
void
|
||||
_gtk_css_matcher_superset_init (GtkCssMatcher *matcher,
|
||||
const GtkCssMatcher *subset,
|
||||
GtkCssMatcherClass *klass,
|
||||
GtkCssChange relevant)
|
||||
{
|
||||
g_return_if_fail (subset != NULL);
|
||||
g_return_if_fail ((relevant & ~(GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_POSITION | GTK_CSS_CHANGE_STATE | GTK_CSS_CHANGE_HOVER)) == 0);
|
||||
g_return_if_fail ((relevant & ~(GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_POSITION | GTK_CSS_CHANGE_STATE)) == 0);
|
||||
|
||||
switch (subset->klass->type)
|
||||
{
|
||||
case GTK_CSS_MATCHER_TYPE_NODE:
|
||||
matcher->node = subset->node;
|
||||
break;
|
||||
case GTK_CSS_MATCHER_TYPE_WIDGET_PATH:
|
||||
matcher->path = subset->path;
|
||||
break;
|
||||
case GTK_CSS_MATCHER_TYPE_ANY:
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
}
|
||||
|
||||
*klass = GTK_CSS_MATCHER_SUPERSET;
|
||||
klass->type = subset->klass->type;
|
||||
|
||||
if (relevant & GTK_CSS_CHANGE_CLASS)
|
||||
klass->has_class = subset->klass->has_class;
|
||||
if (relevant & GTK_CSS_CHANGE_NAME)
|
||||
klass->has_name = subset->klass->has_name;
|
||||
if (relevant & GTK_CSS_CHANGE_NAME)
|
||||
klass->has_id = subset->klass->has_id;
|
||||
if (relevant & GTK_CSS_CHANGE_POSITION)
|
||||
klass->has_position = subset->klass->has_position;
|
||||
if (relevant & GTK_CSS_CHANGE_STATE)
|
||||
klass->get_state = subset->klass->get_state;
|
||||
|
||||
matcher->klass = klass;
|
||||
matcher->superset.klass = >K_CSS_MATCHER_SUPERSET;
|
||||
matcher->superset.subset = subset;
|
||||
matcher->superset.relevant = relevant;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_css_matcher_print (const GtkCssMatcher *matcher,
|
||||
GString *string)
|
||||
{
|
||||
matcher->klass->print (matcher, string);
|
||||
}
|
||||
|
||||
char *
|
||||
gtk_css_matcher_to_string (const GtkCssMatcher *matcher)
|
||||
{
|
||||
GString *string = g_string_new ("");
|
||||
gtk_css_matcher_print (matcher, string);
|
||||
return g_string_free (string, FALSE);
|
||||
}
|
||||
|
@@ -29,14 +29,7 @@ typedef struct _GtkCssMatcherSuperset GtkCssMatcherSuperset;
|
||||
typedef struct _GtkCssMatcherWidgetPath GtkCssMatcherWidgetPath;
|
||||
typedef struct _GtkCssMatcherClass GtkCssMatcherClass;
|
||||
|
||||
typedef enum {
|
||||
GTK_CSS_MATCHER_TYPE_NODE,
|
||||
GTK_CSS_MATCHER_TYPE_WIDGET_PATH,
|
||||
GTK_CSS_MATCHER_TYPE_ANY
|
||||
} GtkCssMatcherType;
|
||||
|
||||
struct _GtkCssMatcherClass {
|
||||
GtkCssMatcherType type;
|
||||
gboolean (* get_parent) (GtkCssMatcher *matcher,
|
||||
const GtkCssMatcher *child);
|
||||
gboolean (* get_previous) (GtkCssMatcher *matcher,
|
||||
@@ -53,8 +46,7 @@ struct _GtkCssMatcherClass {
|
||||
gboolean forward,
|
||||
int a,
|
||||
int b);
|
||||
void (* print) (const GtkCssMatcher *matcher,
|
||||
GString *string);
|
||||
gboolean is_any;
|
||||
};
|
||||
|
||||
struct _GtkCssMatcherWidgetPath {
|
||||
@@ -75,10 +67,17 @@ struct _GtkCssMatcherNode {
|
||||
guint n_classes;
|
||||
};
|
||||
|
||||
struct _GtkCssMatcherSuperset {
|
||||
const GtkCssMatcherClass *klass;
|
||||
const GtkCssMatcher *subset;
|
||||
GtkCssChange relevant;
|
||||
};
|
||||
|
||||
union _GtkCssMatcher {
|
||||
const GtkCssMatcherClass *klass;
|
||||
GtkCssMatcherWidgetPath path;
|
||||
GtkCssMatcherNode node;
|
||||
GtkCssMatcherSuperset superset;
|
||||
};
|
||||
|
||||
gboolean _gtk_css_matcher_init (GtkCssMatcher *matcher,
|
||||
@@ -89,7 +88,6 @@ void _gtk_css_matcher_node_init (GtkCssMatcher *match
|
||||
void _gtk_css_matcher_any_init (GtkCssMatcher *matcher);
|
||||
void _gtk_css_matcher_superset_init (GtkCssMatcher *matcher,
|
||||
const GtkCssMatcher *subset,
|
||||
GtkCssMatcherClass *klass,
|
||||
GtkCssChange relevant);
|
||||
|
||||
|
||||
@@ -146,12 +144,9 @@ _gtk_css_matcher_has_position (const GtkCssMatcher *matcher,
|
||||
static inline gboolean
|
||||
_gtk_css_matcher_matches_any (const GtkCssMatcher *matcher)
|
||||
{
|
||||
return matcher->klass->type == GTK_CSS_MATCHER_TYPE_ANY;
|
||||
return matcher->klass->is_any;
|
||||
}
|
||||
|
||||
void gtk_css_matcher_print (const GtkCssMatcher *matcher,
|
||||
GString *string);
|
||||
char * gtk_css_matcher_to_string (const GtkCssMatcher *matcher);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
135
gtk/gtkcssnode.c
135
gtk/gtkcssnode.c
@@ -19,7 +19,6 @@
|
||||
|
||||
#include "gtkcssnodeprivate.h"
|
||||
|
||||
#include "gtkcssstaticstyleprivate.h"
|
||||
#include "gtkcssanimatedstyleprivate.h"
|
||||
#include "gtkcssstylepropertyprivate.h"
|
||||
#include "gtkintl.h"
|
||||
@@ -111,40 +110,6 @@ enum {
|
||||
static guint cssnode_signals[LAST_SIGNAL] = { 0 };
|
||||
static GParamSpec *cssnode_properties[NUM_PROPERTIES];
|
||||
|
||||
static int recreated_styles;
|
||||
static int recomputed_change;
|
||||
static int self_change;
|
||||
static int parent_style_change;
|
||||
static int other_radical_change;
|
||||
static int changes[64];
|
||||
|
||||
void print_recreated_styles (void);
|
||||
void print_recreated_styles (void)
|
||||
{
|
||||
int i;
|
||||
g_print ("recreated styles: %d, recomputed change: %d, self: %d parent: %d, other %d\n",
|
||||
recreated_styles,
|
||||
recomputed_change,
|
||||
self_change,
|
||||
parent_style_change,
|
||||
other_radical_change);
|
||||
for (i = 0; i < 64; i++)
|
||||
{
|
||||
if (changes[i])
|
||||
{
|
||||
char *s = gtk_css_change_to_string (1 << i);
|
||||
g_print (" %s %d\n", s, changes[i]);
|
||||
g_free (s);
|
||||
changes[i] = 0;
|
||||
}
|
||||
}
|
||||
recreated_styles = 0;
|
||||
recomputed_change = 0;
|
||||
self_change = 0;
|
||||
parent_style_change = 0;
|
||||
other_radical_change = 0;
|
||||
}
|
||||
|
||||
static GtkStyleProvider *
|
||||
gtk_css_node_get_style_provider_or_null (GtkCssNode *cssnode)
|
||||
{
|
||||
@@ -383,14 +348,12 @@ store_in_global_parent_cache (GtkCssNode *node,
|
||||
}
|
||||
|
||||
static GtkCssStyle *
|
||||
gtk_css_node_create_style (GtkCssNode *cssnode,
|
||||
GtkCssChange change)
|
||||
gtk_css_node_create_style (GtkCssNode *cssnode)
|
||||
{
|
||||
const GtkCssNodeDeclaration *decl;
|
||||
GtkCssMatcher matcher;
|
||||
GtkCssStyle *parent;
|
||||
GtkCssStyle *style;
|
||||
gboolean compute_change;
|
||||
|
||||
decl = gtk_css_node_get_declaration (cssnode);
|
||||
|
||||
@@ -400,38 +363,14 @@ gtk_css_node_create_style (GtkCssNode *cssnode,
|
||||
|
||||
parent = cssnode->parent ? cssnode->parent->style : NULL;
|
||||
|
||||
compute_change = change & (GTK_CSS_CHANGE_ID | GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_SOURCE);
|
||||
|
||||
if (gtk_css_node_init_matcher (cssnode, &matcher))
|
||||
style = gtk_css_static_style_new_compute (gtk_css_node_get_style_provider (cssnode),
|
||||
&matcher,
|
||||
parent,
|
||||
compute_change);
|
||||
parent);
|
||||
else
|
||||
style = gtk_css_static_style_new_compute (gtk_css_node_get_style_provider (cssnode),
|
||||
NULL,
|
||||
parent,
|
||||
compute_change);
|
||||
|
||||
recreated_styles++;
|
||||
if (compute_change)
|
||||
recomputed_change++;
|
||||
|
||||
#if 0
|
||||
{
|
||||
char *s = gtk_css_node_declaration_to_string (cssnode->decl);
|
||||
char *c = gtk_css_change_to_string (((GtkCssStaticStyle *)style)->change);
|
||||
g_print ("create style for %s: change %s (%s)\n", s, c, compute_change ? "recomputed" : "cached");
|
||||
g_free (c);
|
||||
g_free (s);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!compute_change)
|
||||
{
|
||||
GtkCssStyle *old_style = gtk_css_style_get_static_style (cssnode->style);
|
||||
((GtkCssStaticStyle *)style)->change = ((GtkCssStaticStyle *)old_style)->change;
|
||||
}
|
||||
parent);
|
||||
|
||||
store_in_global_parent_cache (cssnode, decl, style);
|
||||
|
||||
@@ -452,30 +391,12 @@ gtk_css_style_needs_recreation (GtkCssStyle *style,
|
||||
|
||||
/* Try to avoid invalidating if we can */
|
||||
if (change & GTK_CSS_RADICAL_CHANGE)
|
||||
{
|
||||
if (change & GTK_CSS_CHANGE_PARENT_STYLE)
|
||||
parent_style_change++;
|
||||
else
|
||||
other_radical_change++;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
if (gtk_css_static_style_get_change (GTK_CSS_STATIC_STYLE (style)) & change)
|
||||
{
|
||||
int i;
|
||||
GtkCssChange e = gtk_css_static_style_get_change (GTK_CSS_STATIC_STYLE (style)) & change;
|
||||
self_change++;
|
||||
for (i = 0; i < 64; i++)
|
||||
{
|
||||
if (e & (1 << i))
|
||||
changes[i]++;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static GtkCssStyle *
|
||||
@@ -486,10 +407,17 @@ gtk_css_node_real_update_style (GtkCssNode *cssnode,
|
||||
{
|
||||
GtkCssStyle *static_style, *new_static_style, *new_style;
|
||||
|
||||
static_style = gtk_css_style_get_static_style (style);
|
||||
if (GTK_IS_CSS_ANIMATED_STYLE (style))
|
||||
{
|
||||
static_style = GTK_CSS_ANIMATED_STYLE (style)->style;
|
||||
}
|
||||
else
|
||||
{
|
||||
static_style = style;
|
||||
}
|
||||
|
||||
if (gtk_css_style_needs_recreation (static_style, change))
|
||||
new_static_style = gtk_css_node_create_style (cssnode, change);
|
||||
new_static_style = gtk_css_node_create_style (cssnode);
|
||||
else
|
||||
new_static_style = g_object_ref (static_style);
|
||||
|
||||
@@ -508,7 +436,7 @@ gtk_css_node_real_update_style (GtkCssNode *cssnode,
|
||||
}
|
||||
else if (static_style != style && (change & GTK_CSS_CHANGE_TIMESTAMP))
|
||||
{
|
||||
new_style = gtk_css_animated_style_new_advance ((GtkCssAnimatedStyle *)style,
|
||||
new_style = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (style),
|
||||
static_style,
|
||||
timestamp);
|
||||
}
|
||||
@@ -1210,23 +1138,9 @@ void
|
||||
gtk_css_node_set_state (GtkCssNode *cssnode,
|
||||
GtkStateFlags state_flags)
|
||||
{
|
||||
GtkStateFlags old_state;
|
||||
|
||||
old_state = gtk_css_node_declaration_get_state (cssnode->decl);
|
||||
|
||||
if (gtk_css_node_declaration_set_state (&cssnode->decl, state_flags))
|
||||
{
|
||||
GtkStateFlags states = old_state ^ state_flags;
|
||||
GtkCssChange change = 0;
|
||||
|
||||
if (states & GTK_STATE_FLAG_PRELIGHT)
|
||||
change |= GTK_CSS_CHANGE_HOVER;
|
||||
if (states & GTK_STATE_FLAG_ACTIVE)
|
||||
change |= GTK_CSS_CHANGE_ACTIVE;
|
||||
if (states & ~(GTK_STATE_FLAG_PRELIGHT|GTK_STATE_FLAG_ACTIVE))
|
||||
change |= GTK_CSS_CHANGE_STATE;
|
||||
|
||||
gtk_css_node_invalidate (cssnode, change);
|
||||
gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_STATE);
|
||||
g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_STATE]);
|
||||
}
|
||||
}
|
||||
@@ -1484,19 +1398,6 @@ gtk_css_node_print (GtkCssNode *cssnode,
|
||||
if (!cssnode->visible)
|
||||
g_string_append_c (string, ']');
|
||||
|
||||
if (flags & GTK_STYLE_CONTEXT_PRINT_SHOW_CHANGE)
|
||||
{
|
||||
GtkCssStyle *style = gtk_css_node_get_style (cssnode);
|
||||
GtkCssChange change;
|
||||
|
||||
if (!GTK_IS_CSS_STATIC_STYLE (style))
|
||||
style = GTK_CSS_ANIMATED_STYLE (style)->style;
|
||||
|
||||
change = gtk_css_static_style_get_change (GTK_CSS_STATIC_STYLE (style));
|
||||
g_string_append (string, " ");
|
||||
gtk_css_change_print (change, string);
|
||||
}
|
||||
|
||||
g_string_append_c (string, '\n');
|
||||
|
||||
if (flags & GTK_STYLE_CONTEXT_PRINT_SHOW_STYLE)
|
||||
|
@@ -115,6 +115,15 @@ gtk_css_number_value_transition (GtkCssValue *start,
|
||||
{
|
||||
GtkCssValue *result, *mul_start, *mul_end;
|
||||
|
||||
if (progress == 0)
|
||||
return _gtk_css_value_ref (start);
|
||||
|
||||
if (progress == 1)
|
||||
return _gtk_css_value_ref (end);
|
||||
|
||||
if (start == end)
|
||||
return _gtk_css_value_ref (start);
|
||||
|
||||
mul_start = gtk_css_number_value_multiply (start, 1 - progress);
|
||||
mul_end = gtk_css_number_value_multiply (end, progress);
|
||||
|
||||
|
@@ -32,7 +32,8 @@ typedef enum /*< skip >*/ {
|
||||
GTK_CSS_PARSE_NUMBER = (1 << 2),
|
||||
GTK_CSS_PARSE_LENGTH = (1 << 3),
|
||||
GTK_CSS_PARSE_ANGLE = (1 << 4),
|
||||
GTK_CSS_PARSE_TIME = (1 << 5)
|
||||
GTK_CSS_PARSE_TIME = (1 << 5),
|
||||
GTK_CSS_PARSE_NON_STATIC = (1 << 6)
|
||||
} GtkCssNumberParseFlags;
|
||||
|
||||
typedef struct _GtkCssNumberValueClass GtkCssNumberValueClass;
|
||||
|
@@ -21,7 +21,7 @@
|
||||
|
||||
#include "gtkcssiconthemevalueprivate.h"
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtkcssrgbavalueprivate.h"
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtkprivate.h"
|
||||
|
||||
struct _GtkCssValue {
|
||||
@@ -244,6 +244,7 @@ gtk_css_value_palette_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_PALETTE = {
|
||||
"GtkCssPaletteValue",
|
||||
gtk_css_value_palette_free,
|
||||
gtk_css_value_palette_compute,
|
||||
gtk_css_value_palette_equal,
|
||||
@@ -348,7 +349,7 @@ gtk_css_palette_value_get_color (GtkCssValue *value,
|
||||
for (i = 0; i < value->n_colors; i ++)
|
||||
{
|
||||
if (strcmp (value->color_names[i], name) == 0)
|
||||
return _gtk_css_rgba_value_get_rgba (value->color_values[i]);
|
||||
return gtk_css_color_value_get_rgba (value->color_values[i]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@@ -150,6 +150,7 @@ done:
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_POSITION = {
|
||||
"GtkCssPositionValue",
|
||||
gtk_css_value_position_free,
|
||||
gtk_css_value_position_compute,
|
||||
gtk_css_value_position_equal,
|
||||
@@ -166,6 +167,7 @@ _gtk_css_position_value_new (GtkCssValue *x,
|
||||
GtkCssValue *result;
|
||||
|
||||
result = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_POSITION);
|
||||
result->is_static = x->is_static && y->is_static;
|
||||
result->x = x;
|
||||
result->y = y;
|
||||
|
||||
|
@@ -99,6 +99,7 @@ struct GtkCssRuleset
|
||||
GtkCssSelector *selector;
|
||||
GtkCssSelectorTree *selector_match;
|
||||
PropertyValue *styles;
|
||||
GtkBitmask *set_styles;
|
||||
guint n_styles;
|
||||
guint owns_styles : 1;
|
||||
};
|
||||
@@ -235,6 +236,8 @@ gtk_css_ruleset_init_copy (GtkCssRuleset *new,
|
||||
/* First copy takes over ownership */
|
||||
if (ruleset->owns_styles)
|
||||
ruleset->owns_styles = FALSE;
|
||||
if (new->set_styles)
|
||||
new->set_styles = _gtk_bitmask_copy (new->set_styles);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -253,6 +256,8 @@ gtk_css_ruleset_clear (GtkCssRuleset *ruleset)
|
||||
}
|
||||
g_free (ruleset->styles);
|
||||
}
|
||||
if (ruleset->set_styles)
|
||||
_gtk_bitmask_free (ruleset->set_styles);
|
||||
if (ruleset->selector)
|
||||
_gtk_css_selector_free (ruleset->selector);
|
||||
|
||||
@@ -269,6 +274,13 @@ gtk_css_ruleset_add (GtkCssRuleset *ruleset,
|
||||
|
||||
g_return_if_fail (ruleset->owns_styles || ruleset->n_styles == 0);
|
||||
|
||||
if (ruleset->set_styles == NULL)
|
||||
ruleset->set_styles = _gtk_bitmask_new ();
|
||||
|
||||
ruleset->set_styles = _gtk_bitmask_set (ruleset->set_styles,
|
||||
_gtk_css_style_property_get_id (property),
|
||||
TRUE);
|
||||
|
||||
ruleset->owns_styles = TRUE;
|
||||
|
||||
for (i = 0; i < ruleset->n_styles; i++)
|
||||
@@ -425,44 +437,62 @@ verify_tree_match_results (GtkCssProvider *provider,
|
||||
#endif
|
||||
}
|
||||
|
||||
static GtkCssChange
|
||||
get_change (GtkCssProvider *provider,
|
||||
const GtkCssMatcher *matcher)
|
||||
static void
|
||||
verify_tree_get_change_results (GtkCssProvider *provider,
|
||||
const GtkCssMatcher *matcher,
|
||||
GtkCssChange change)
|
||||
{
|
||||
GtkCssProviderPrivate *priv = gtk_css_provider_get_instance_private (provider);
|
||||
GtkCssChange change = 0;
|
||||
GPtrArray *tree_rules;
|
||||
int i;
|
||||
|
||||
tree_rules = _gtk_css_selector_tree_match_all (priv->tree, matcher);
|
||||
if (tree_rules)
|
||||
{
|
||||
for (i = tree_rules->len - 1; i >= 0; i--)
|
||||
{
|
||||
GtkCssRuleset *ruleset;
|
||||
|
||||
ruleset = tree_rules->pdata[i];
|
||||
|
||||
change |= _gtk_css_selector_get_change (ruleset->selector);
|
||||
}
|
||||
|
||||
g_ptr_array_free (tree_rules, TRUE);
|
||||
}
|
||||
|
||||
#if 0
|
||||
#ifdef VERIFY_TREE
|
||||
{
|
||||
char *s = gtk_css_matcher_to_string (matcher);
|
||||
char *d = gtk_css_change_to_string (change);
|
||||
int n = tree_rules ? tree_rules->len : 0;
|
||||
g_print ("change for %s from %d rules: %s\n", s, n, d);
|
||||
g_free (s);
|
||||
g_free (d);
|
||||
GtkCssProviderPrivate *priv = gtk_css_provider_get_instance_private (provider);
|
||||
GtkCssChange verify_change = 0;
|
||||
GPtrArray *tree_rules;
|
||||
int i;
|
||||
|
||||
tree_rules = _gtk_css_selector_tree_match_all (priv->tree, matcher);
|
||||
if (tree_rules)
|
||||
{
|
||||
verify_tree_match_results (provider, matcher, tree_rules);
|
||||
|
||||
for (i = tree_rules->len - 1; i >= 0; i--)
|
||||
{
|
||||
GtkCssRuleset *ruleset;
|
||||
|
||||
ruleset = tree_rules->pdata[i];
|
||||
|
||||
verify_change |= _gtk_css_selector_get_change (ruleset->selector);
|
||||
}
|
||||
|
||||
g_ptr_array_free (tree_rules, TRUE);
|
||||
}
|
||||
|
||||
if (change != verify_change)
|
||||
{
|
||||
GString *s;
|
||||
|
||||
s = g_string_new ("");
|
||||
g_string_append (s, "expected change ");
|
||||
gtk_css_change_print (verify_change, s);
|
||||
g_string_append (s, ", but it was ");
|
||||
gtk_css_change_print (change, s);
|
||||
if ((change & ~verify_change) != 0)
|
||||
{
|
||||
g_string_append (s, ", unexpectedly set: ");
|
||||
gtk_css_change_print (change & ~verify_change, s);
|
||||
}
|
||||
if ((~change & verify_change) != 0)
|
||||
{
|
||||
g_string_append_printf (s, ", unexpectedly not set: ");
|
||||
gtk_css_change_print (~change & verify_change, s);
|
||||
}
|
||||
g_warning (s->str);
|
||||
g_string_free (s, TRUE);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return change;
|
||||
}
|
||||
|
||||
|
||||
static GtkCssValue *
|
||||
gtk_css_style_provider_get_color (GtkStyleProvider *provider,
|
||||
const char *name)
|
||||
@@ -535,11 +565,11 @@ gtk_css_style_provider_lookup (GtkStyleProvider *provider,
|
||||
if (change)
|
||||
{
|
||||
GtkCssMatcher change_matcher;
|
||||
GtkCssMatcherClass matcher_class;
|
||||
|
||||
_gtk_css_matcher_superset_init (&change_matcher, matcher, &matcher_class, GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_NAME);
|
||||
_gtk_css_matcher_superset_init (&change_matcher, matcher, GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_CLASS);
|
||||
|
||||
*change = get_change (css_provider, &change_matcher);
|
||||
*change = _gtk_css_selector_tree_get_change_all (priv->tree, &change_matcher);
|
||||
verify_tree_get_change_results (css_provider, &change_matcher, *change);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1030,7 +1060,6 @@ gtk_css_provider_postprocess (GtkCssProvider *css_provider)
|
||||
priv->tree = _gtk_css_selector_tree_builder_build (builder);
|
||||
_gtk_css_selector_tree_builder_free (builder);
|
||||
|
||||
#if 0
|
||||
#ifndef VERIFY_TREE
|
||||
for (i = 0; i < priv->rulesets->len; i++)
|
||||
{
|
||||
@@ -1042,7 +1071,6 @@ gtk_css_provider_postprocess (GtkCssProvider *css_provider)
|
||||
ruleset->selector = NULL;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -113,6 +113,7 @@ gtk_css_value_border_repeat_print (const GtkCssValue *repeat,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_BACKGROUND_REPEAT = {
|
||||
"GtkCssBackgroundRepeatValue",
|
||||
gtk_css_value_repeat_free,
|
||||
gtk_css_value_repeat_compute,
|
||||
gtk_css_value_repeat_equal,
|
||||
@@ -123,6 +124,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_BACKGROUND_REPEAT = {
|
||||
};
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_BORDER_REPEAT = {
|
||||
"GtkCssBorderRepeatValue",
|
||||
gtk_css_value_repeat_free,
|
||||
gtk_css_value_repeat_compute,
|
||||
gtk_css_value_repeat_equal,
|
||||
|
@@ -98,6 +98,7 @@ gtk_css_value_rgba_print (const GtkCssValue *rgba,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_RGBA = {
|
||||
"GtkCssRgbaValue",
|
||||
gtk_css_value_rgba_free,
|
||||
gtk_css_value_rgba_compute,
|
||||
gtk_css_value_rgba_equal,
|
||||
@@ -107,9 +108,10 @@ static const GtkCssValueClass GTK_CSS_VALUE_RGBA = {
|
||||
gtk_css_value_rgba_print
|
||||
};
|
||||
|
||||
static GtkCssValue transparent_black_singleton = { >K_CSS_VALUE_RGBA, 1, { 0, 0, 0, 0 }};
|
||||
static GtkCssValue transparent_white_singleton = { >K_CSS_VALUE_RGBA, 1, { 1, 1, 1, 0 }};
|
||||
static GtkCssValue opaque_white_singleton = { >K_CSS_VALUE_RGBA, 1, { 1, 1, 1, 1 }};
|
||||
static GtkCssValue transparent_black_singleton = { >K_CSS_VALUE_RGBA, 1, 1, { 0, 0, 0, 0 }};
|
||||
static GtkCssValue transparent_white_singleton = { >K_CSS_VALUE_RGBA, 1, 1, { 1, 1, 1, 0 }};
|
||||
static GtkCssValue opaque_black_singleton = { >K_CSS_VALUE_RGBA, 1, 1, { 0, 0, 0, 1 }};
|
||||
static GtkCssValue opaque_white_singleton = { >K_CSS_VALUE_RGBA, 1, 1, { 1, 1, 1, 1 }};
|
||||
|
||||
GtkCssValue *
|
||||
_gtk_css_rgba_value_new_from_rgba (const GdkRGBA *rgba)
|
||||
@@ -136,6 +138,11 @@ _gtk_css_rgba_value_new_from_rgba (const GdkRGBA *rgba)
|
||||
rgba->green == 1 &&
|
||||
rgba->blue == 1)
|
||||
return _gtk_css_value_ref (&opaque_white_singleton);
|
||||
|
||||
if (rgba->red == 0 &&
|
||||
rgba->green == 0 &&
|
||||
rgba->blue == 0)
|
||||
return _gtk_css_value_ref (&opaque_black_singleton);
|
||||
}
|
||||
|
||||
value = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_RGBA);
|
||||
|
@@ -30,15 +30,13 @@
|
||||
# include <intrin.h>
|
||||
#endif
|
||||
|
||||
#undef PRINT_TREE
|
||||
|
||||
typedef struct _GtkCssSelectorClass GtkCssSelectorClass;
|
||||
typedef gboolean (* GtkCssSelectorForeachFunc) (const GtkCssSelector *selector,
|
||||
const GtkCssMatcher *matcher,
|
||||
gpointer data);
|
||||
|
||||
struct _GtkCssSelectorClass {
|
||||
const char *name;
|
||||
const char *name;
|
||||
|
||||
void (* print) (const GtkCssSelector *selector,
|
||||
GString *string);
|
||||
@@ -106,7 +104,6 @@ union _GtkCssSelector
|
||||
struct _GtkCssSelectorTree
|
||||
{
|
||||
GtkCssSelector selector;
|
||||
GtkCssChange change;
|
||||
gint32 parent_offset;
|
||||
gint32 previous_offset;
|
||||
gint32 sibling_offset;
|
||||
@@ -731,18 +728,6 @@ comp_pseudoclass_state (const GtkCssSelector *a,
|
||||
return a->state.state - b->state.state;
|
||||
}
|
||||
|
||||
#define GTK_CSS_CHANGE_PSEUDOCLASS_HOVER GTK_CSS_CHANGE_HOVER
|
||||
DEFINE_SIMPLE_SELECTOR(pseudoclass_hover, PSEUDOCLASS_HOVER, print_pseudoclass_state,
|
||||
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
||||
FALSE, TRUE, FALSE)
|
||||
#undef GTK_CSS_CHANGE_PSEUDOCLASS_HOVER
|
||||
|
||||
#define GTK_CSS_CHANGE_PSEUDOCLASS_ACTIVE GTK_CSS_CHANGE_ACTIVE
|
||||
DEFINE_SIMPLE_SELECTOR(pseudoclass_active, PSEUDOCLASS_ACTIVE, print_pseudoclass_state,
|
||||
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
||||
FALSE, TRUE, FALSE)
|
||||
#undef GTK_CSS_CHANGE_PSEUDOCLASS_ACTIVE
|
||||
|
||||
#define GTK_CSS_CHANGE_PSEUDOCLASS_STATE GTK_CSS_CHANGE_STATE
|
||||
DEFINE_SIMPLE_SELECTOR(pseudoclass_state, PSEUDOCLASS_STATE, print_pseudoclass_state,
|
||||
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
|
||||
@@ -1284,6 +1269,8 @@ gtk_css_selector_parse_selector_pseudo_class (GtkCssParser *parser,
|
||||
{ "first-child", 0, POSITION_FORWARD, 0, 1 },
|
||||
{ "last-child", 0, POSITION_BACKWARD, 0, 1 },
|
||||
{ "only-child", 0, POSITION_ONLY, 0, 0 },
|
||||
{ "active", GTK_STATE_FLAG_ACTIVE, },
|
||||
{ "hover", GTK_STATE_FLAG_PRELIGHT, },
|
||||
{ "selected", GTK_STATE_FLAG_SELECTED, },
|
||||
{ "disabled", GTK_STATE_FLAG_INSENSITIVE, },
|
||||
{ "indeterminate", GTK_STATE_FLAG_INCONSISTENT, },
|
||||
@@ -1319,26 +1306,6 @@ gtk_css_selector_parse_selector_pseudo_class (GtkCssParser *parser,
|
||||
return selector;
|
||||
}
|
||||
}
|
||||
|
||||
if (g_ascii_strcasecmp ("hover", token->string.string) == 0)
|
||||
{
|
||||
selector = gtk_css_selector_new (negate ? >K_CSS_SELECTOR_NOT_PSEUDOCLASS_HOVER
|
||||
: >K_CSS_SELECTOR_PSEUDOCLASS_HOVER,
|
||||
selector);
|
||||
selector->state.state = GTK_STATE_FLAG_PRELIGHT;
|
||||
gtk_css_parser_consume_token (parser);
|
||||
return selector;
|
||||
}
|
||||
|
||||
if (g_ascii_strcasecmp ("active", token->string.string) == 0)
|
||||
{
|
||||
selector = gtk_css_selector_new (negate ? >K_CSS_SELECTOR_NOT_PSEUDOCLASS_ACTIVE
|
||||
: >K_CSS_SELECTOR_PSEUDOCLASS_ACTIVE,
|
||||
selector);
|
||||
selector->state.state = GTK_STATE_FLAG_ACTIVE;
|
||||
gtk_css_parser_consume_token (parser);
|
||||
return selector;
|
||||
}
|
||||
|
||||
gtk_css_parser_error (parser,
|
||||
GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE,
|
||||
@@ -1907,7 +1874,7 @@ gtk_css_selector_tree_get_change (const GtkCssSelectorTree *tree,
|
||||
return 0;
|
||||
|
||||
if (!tree->selector.class->is_simple)
|
||||
return tree->change | GTK_CSS_CHANGE_GOT_MATCH;
|
||||
return gtk_css_selector_tree_collect_change (tree) | GTK_CSS_CHANGE_GOT_MATCH;
|
||||
|
||||
for (prev = gtk_css_selector_tree_get_previous (tree);
|
||||
prev != NULL;
|
||||
@@ -1944,16 +1911,11 @@ _gtk_css_selector_tree_get_change_all (const GtkCssSelectorTree *tree,
|
||||
}
|
||||
|
||||
#ifdef PRINT_TREE
|
||||
|
||||
static void
|
||||
_gtk_css_selector_tree_print_recurse (const GtkCssSelectorTree *tree,
|
||||
GString *str,
|
||||
const char *prefix,
|
||||
GHashTable *counts)
|
||||
_gtk_css_selector_tree_print (const GtkCssSelectorTree *tree, GString *str, char *prefix)
|
||||
{
|
||||
gboolean first = TRUE;
|
||||
int len, i;
|
||||
int count;
|
||||
|
||||
for (; tree != NULL; tree = gtk_css_selector_tree_get_sibling (tree), first = FALSE)
|
||||
{
|
||||
@@ -1979,10 +1941,6 @@ _gtk_css_selector_tree_print_recurse (const GtkCssSelectorTree *tree,
|
||||
tree->selector.class->print (&tree->selector, str);
|
||||
len = str->len - len;
|
||||
|
||||
count = GPOINTER_TO_INT (g_hash_table_lookup (counts, (gpointer)tree->selector.class->name));
|
||||
count++;
|
||||
g_hash_table_insert (counts, (gpointer)tree->selector.class->name, GINT_TO_POINTER (count));
|
||||
|
||||
if (gtk_css_selector_tree_get_previous (tree))
|
||||
{
|
||||
GString *prefix2 = g_string_new (prefix);
|
||||
@@ -1994,35 +1952,13 @@ _gtk_css_selector_tree_print_recurse (const GtkCssSelectorTree *tree,
|
||||
for (i = 0; i < len; i++)
|
||||
g_string_append_c (prefix2, ' ');
|
||||
|
||||
_gtk_css_selector_tree_print_recurse (gtk_css_selector_tree_get_previous (tree), str, prefix2->str, counts);
|
||||
_gtk_css_selector_tree_print (gtk_css_selector_tree_get_previous (tree), str, prefix2->str);
|
||||
g_string_free (prefix2, TRUE);
|
||||
}
|
||||
else
|
||||
g_string_append (str, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_css_selector_tree_print (const GtkCssSelectorTree *tree, GString *str, const char *prefix)
|
||||
{
|
||||
GHashTable *counts;
|
||||
GHashTableIter iter;
|
||||
const char *key;
|
||||
gpointer value;
|
||||
|
||||
counts = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
|
||||
_gtk_css_selector_tree_print_recurse (tree, str, prefix, counts);
|
||||
|
||||
g_string_append (str, "\n\nSelector counts:\n");
|
||||
g_hash_table_iter_init (&iter, counts);
|
||||
while (g_hash_table_iter_next (&iter, (gpointer *)&key, &value))
|
||||
g_string_append_printf (str, "%-*s %4d\n", (int)strlen ("not_pseudoclass_position"), key, GPOINTER_TO_INT (value));
|
||||
|
||||
g_string_append (str, "\n");
|
||||
|
||||
g_hash_table_unref (counts);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
@@ -2148,7 +2084,6 @@ subdivide_infos (GByteArray *array, GList *infos, gint32 parent_offset)
|
||||
remaining = NULL;
|
||||
|
||||
tree = alloc_tree (array, &tree_offset);
|
||||
tree->change = 0;
|
||||
tree->parent_offset = parent_offset;
|
||||
tree->selector = max_selector;
|
||||
|
||||
@@ -2258,20 +2193,6 @@ fixup_offsets (GtkCssSelectorTree *tree, guint8 *data)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
compute_change (GtkCssSelectorTree *tree)
|
||||
{
|
||||
for (; tree != NULL;
|
||||
tree = (GtkCssSelectorTree *)gtk_css_selector_tree_get_sibling (tree))
|
||||
{
|
||||
GtkCssSelectorTree *prev = (GtkCssSelectorTree *)gtk_css_selector_tree_get_previous (tree);
|
||||
|
||||
tree->change = gtk_css_selector_tree_collect_change (tree);
|
||||
|
||||
compute_change (prev);
|
||||
}
|
||||
}
|
||||
|
||||
GtkCssSelectorTree *
|
||||
_gtk_css_selector_tree_builder_build (GtkCssSelectorTreeBuilder *builder)
|
||||
{
|
||||
@@ -2295,8 +2216,6 @@ _gtk_css_selector_tree_builder_build (GtkCssSelectorTreeBuilder *builder)
|
||||
|
||||
fixup_offsets (tree, data);
|
||||
|
||||
compute_change (tree);
|
||||
|
||||
/* Convert offsets to final pointers */
|
||||
for (l = builder->infos; l != NULL; l = l->next)
|
||||
{
|
||||
|
@@ -200,6 +200,7 @@ gtk_css_value_shadows_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_SHADOWS = {
|
||||
"GtkCssShadowsValue",
|
||||
gtk_css_value_shadows_free,
|
||||
gtk_css_value_shadows_compute,
|
||||
gtk_css_value_shadows_equal,
|
||||
@@ -209,7 +210,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_SHADOWS = {
|
||||
gtk_css_value_shadows_print
|
||||
};
|
||||
|
||||
static GtkCssValue none_singleton = { >K_CSS_VALUE_SHADOWS, 1, 0, { NULL } };
|
||||
static GtkCssValue none_singleton = { >K_CSS_VALUE_SHADOWS, 1, 1, 0, { NULL } };
|
||||
|
||||
GtkCssValue *
|
||||
_gtk_css_shadows_value_new_none (void)
|
||||
@@ -222,14 +223,30 @@ gtk_css_shadows_value_new (GtkCssValue **values,
|
||||
guint len)
|
||||
{
|
||||
GtkCssValue *result;
|
||||
|
||||
gboolean is_static;
|
||||
int i;
|
||||
|
||||
g_return_val_if_fail (values != NULL, NULL);
|
||||
g_return_val_if_fail (len > 0, NULL);
|
||||
|
||||
|
||||
if (len == 1)
|
||||
return values[0];
|
||||
|
||||
is_static = TRUE;
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
if (!values[i]->is_static)
|
||||
{
|
||||
is_static = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
result = _gtk_css_value_alloc (>K_CSS_VALUE_SHADOWS, sizeof (GtkCssValue) + sizeof (GtkCssValue *) * (len - 1));
|
||||
result->is_static = is_static;
|
||||
result->len = len;
|
||||
memcpy (&result->values[0], values, sizeof (GtkCssValue *) * len);
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -266,6 +283,9 @@ _gtk_css_shadows_value_parse (GtkCssParser *parser,
|
||||
gboolean
|
||||
_gtk_css_shadows_value_is_none (const GtkCssValue *shadows)
|
||||
{
|
||||
if (gtk_css_shadow_value_is_shadow (shadows))
|
||||
return FALSE;
|
||||
|
||||
g_return_val_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS, TRUE);
|
||||
|
||||
return shadows->len == 0;
|
||||
@@ -274,6 +294,9 @@ _gtk_css_shadows_value_is_none (const GtkCssValue *shadows)
|
||||
gsize
|
||||
gtk_css_shadows_value_get_n_shadows (const GtkCssValue *shadows)
|
||||
{
|
||||
if (gtk_css_shadow_value_is_shadow (shadows))
|
||||
return 1;
|
||||
|
||||
return shadows->len;
|
||||
}
|
||||
|
||||
@@ -283,6 +306,12 @@ gtk_css_shadows_value_get_shadows (const GtkCssValue *shadows,
|
||||
{
|
||||
guint i;
|
||||
|
||||
if (gtk_css_shadow_value_is_shadow (shadows))
|
||||
{
|
||||
gtk_css_shadow_value_get_shadow (shadows, &out_shadows[0]);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < shadows->len; i++)
|
||||
gtk_css_shadow_value_get_shadow (shadows->values[i], &out_shadows[i]);
|
||||
}
|
||||
@@ -294,6 +323,14 @@ gtk_css_shadows_value_snapshot_outset (const GtkCssValue *shadows,
|
||||
{
|
||||
guint i;
|
||||
|
||||
if (gtk_css_shadow_value_is_shadow (shadows))
|
||||
{
|
||||
if (!_gtk_css_shadow_value_get_inset (shadows))
|
||||
gtk_css_shadow_value_snapshot_outset (shadows, snapshot, border_box);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS);
|
||||
|
||||
for (i = 0; i < shadows->len; i++)
|
||||
@@ -312,6 +349,14 @@ gtk_css_shadows_value_snapshot_inset (const GtkCssValue *shadows,
|
||||
{
|
||||
guint i;
|
||||
|
||||
if (gtk_css_shadow_value_is_shadow (shadows))
|
||||
{
|
||||
if (_gtk_css_shadow_value_get_inset (shadows))
|
||||
gtk_css_shadow_value_snapshot_outset (shadows, snapshot, padding_box);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS);
|
||||
|
||||
for (i = 0; i < shadows->len; i++)
|
||||
@@ -331,6 +376,15 @@ _gtk_css_shadows_value_get_extents (const GtkCssValue *shadows,
|
||||
GtkBorder b = { 0 }, sb;
|
||||
const GtkCssValue *shadow;
|
||||
|
||||
if (gtk_css_shadow_value_is_shadow (shadows))
|
||||
{
|
||||
if (!_gtk_css_shadow_value_get_inset (shadows))
|
||||
gtk_css_shadow_value_get_extents (shadows, &b);
|
||||
|
||||
*border = b;
|
||||
return;
|
||||
}
|
||||
|
||||
g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS);
|
||||
|
||||
for (i = 0; i < shadows->len; i++)
|
||||
@@ -355,9 +409,22 @@ gboolean
|
||||
gtk_css_shadows_value_push_snapshot (const GtkCssValue *value,
|
||||
GtkSnapshot *snapshot)
|
||||
{
|
||||
gboolean need_shadow = FALSE;
|
||||
gboolean need_shadow;
|
||||
int i;
|
||||
|
||||
if (gtk_css_shadow_value_is_shadow (value))
|
||||
{
|
||||
GskShadow shadow;
|
||||
|
||||
if (!gtk_css_shadow_value_is_clear (value))
|
||||
return FALSE;
|
||||
|
||||
gtk_css_shadow_value_get_shadow (value, &shadow);
|
||||
gtk_snapshot_push_shadow (snapshot, &shadow, 1);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
need_shadow = FALSE;
|
||||
for (i = 0; i < value->len; i++)
|
||||
{
|
||||
if (!gtk_css_shadow_value_is_clear (value->values[i]))
|
||||
|
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtkcssnumbervalueprivate.h"
|
||||
#include "gtkcssrgbavalueprivate.h"
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtksnapshotprivate.h"
|
||||
#include "gtkstylecontextprivate.h"
|
||||
#include "gtkpango.h"
|
||||
@@ -155,6 +155,7 @@ gtk_css_value_shadow_print (const GtkCssValue *shadow,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_SHADOW = {
|
||||
"GtkCssShadowValue",
|
||||
gtk_css_value_shadow_free,
|
||||
gtk_css_value_shadow_compute,
|
||||
gtk_css_value_shadow_equal,
|
||||
@@ -176,6 +177,12 @@ gtk_css_shadow_value_new (GtkCssValue *hoffset,
|
||||
|
||||
retval = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_SHADOW);
|
||||
|
||||
retval->is_static =
|
||||
hoffset->is_static &&
|
||||
voffset->is_static &&
|
||||
radius->is_static &&
|
||||
color->is_static;
|
||||
|
||||
retval->hoffset = hoffset;
|
||||
retval->voffset = voffset;
|
||||
retval->radius = radius;
|
||||
@@ -196,7 +203,7 @@ _gtk_css_shadow_value_new_for_transition (GtkCssValue *target)
|
||||
_gtk_css_number_value_new (0, GTK_CSS_PX),
|
||||
_gtk_css_number_value_new (0, GTK_CSS_PX),
|
||||
target->inset,
|
||||
_gtk_css_rgba_value_new_transparent ());
|
||||
gtk_css_color_value_new_transparent ());
|
||||
}
|
||||
|
||||
enum {
|
||||
@@ -359,7 +366,7 @@ void
|
||||
gtk_css_shadow_value_get_shadow (const GtkCssValue *value,
|
||||
GskShadow *shadow)
|
||||
{
|
||||
shadow->color = *_gtk_css_rgba_value_get_rgba (value->color);
|
||||
shadow->color = *gtk_css_color_value_get_rgba (value->color);
|
||||
shadow->dx = _gtk_css_number_value_get (value->hoffset, 0);
|
||||
shadow->dy = _gtk_css_number_value_get (value->voffset, 0);
|
||||
shadow->radius = _gtk_css_number_value_get (value->radius, 0);
|
||||
@@ -373,12 +380,12 @@ gtk_css_shadow_value_snapshot_outset (const GtkCssValue *shadow,
|
||||
g_return_if_fail (shadow->class == >K_CSS_VALUE_SHADOW);
|
||||
|
||||
/* We don't need to draw invisible shadows */
|
||||
if (gdk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
|
||||
if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color)))
|
||||
return;
|
||||
|
||||
gtk_snapshot_append_outset_shadow (snapshot,
|
||||
border_box,
|
||||
_gtk_css_rgba_value_get_rgba (shadow->color),
|
||||
gtk_css_color_value_get_rgba (shadow->color),
|
||||
_gtk_css_number_value_get (shadow->hoffset, 0),
|
||||
_gtk_css_number_value_get (shadow->voffset, 0),
|
||||
_gtk_css_number_value_get (shadow->spread, 0),
|
||||
@@ -396,14 +403,14 @@ gtk_css_shadow_value_snapshot_inset (const GtkCssValue *shadow,
|
||||
g_return_if_fail (shadow->class == >K_CSS_VALUE_SHADOW);
|
||||
|
||||
/* We don't need to draw invisible shadows */
|
||||
if (gdk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
|
||||
if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color)))
|
||||
return;
|
||||
|
||||
dx = _gtk_css_number_value_get (shadow->hoffset, 0);
|
||||
dy = _gtk_css_number_value_get (shadow->voffset, 0);
|
||||
spread = _gtk_css_number_value_get (shadow->spread, 0);
|
||||
radius = _gtk_css_number_value_get (shadow->radius, 0);
|
||||
color = _gtk_css_rgba_value_get_rgba (shadow->color);
|
||||
color = gtk_css_color_value_get_rgba (shadow->color);
|
||||
|
||||
/* These are trivial to do with a color node */
|
||||
if (spread == 0 && radius == 0 &&
|
||||
@@ -469,6 +476,11 @@ gtk_css_shadow_value_snapshot_inset (const GtkCssValue *shadow,
|
||||
gboolean
|
||||
gtk_css_shadow_value_is_clear (const GtkCssValue *shadow)
|
||||
{
|
||||
return gdk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color));
|
||||
return gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color));
|
||||
}
|
||||
|
||||
gboolean
|
||||
gtk_css_shadow_value_is_shadow (const GtkCssValue *maybe_shadow)
|
||||
{
|
||||
return maybe_shadow->class == >K_CSS_VALUE_SHADOW;
|
||||
}
|
||||
|
@@ -43,9 +43,6 @@ void gtk_css_shadow_value_get_extents (const GtkCssValue
|
||||
void gtk_css_shadow_value_get_shadow (const GtkCssValue *value,
|
||||
GskShadow *shadow);
|
||||
|
||||
void _gtk_css_shadow_value_paint_icon (const GtkCssValue *shadow,
|
||||
cairo_t *cr);
|
||||
|
||||
void gtk_css_shadow_value_snapshot_outset (const GtkCssValue *shadow,
|
||||
GtkSnapshot *snapshot,
|
||||
const GskRoundedRect *border_box);
|
||||
@@ -55,6 +52,8 @@ void gtk_css_shadow_value_snapshot_inset (const GtkCssValue
|
||||
|
||||
gboolean gtk_css_shadow_value_is_clear (const GtkCssValue *shadow);
|
||||
|
||||
gboolean gtk_css_shadow_value_is_shadow (const GtkCssValue *maybe_shadow);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_SHADOW_H__ */
|
||||
|
@@ -158,8 +158,7 @@ gtk_css_static_style_get_default (void)
|
||||
settings = gtk_settings_get_default ();
|
||||
default_style = gtk_css_static_style_new_compute (GTK_STYLE_PROVIDER (settings),
|
||||
NULL,
|
||||
NULL,
|
||||
TRUE);
|
||||
NULL);
|
||||
g_object_set_data_full (G_OBJECT (settings), I_("gtk-default-style"),
|
||||
default_style, clear_default_style);
|
||||
}
|
||||
@@ -170,8 +169,7 @@ gtk_css_static_style_get_default (void)
|
||||
GtkCssStyle *
|
||||
gtk_css_static_style_new_compute (GtkStyleProvider *provider,
|
||||
const GtkCssMatcher *matcher,
|
||||
GtkCssStyle *parent,
|
||||
gboolean compute_change)
|
||||
GtkCssStyle *parent)
|
||||
{
|
||||
GtkCssStaticStyle *result;
|
||||
GtkCssLookup lookup;
|
||||
@@ -183,7 +181,7 @@ gtk_css_static_style_new_compute (GtkStyleProvider *provider,
|
||||
gtk_style_provider_lookup (provider,
|
||||
matcher,
|
||||
&lookup,
|
||||
compute_change ? &change : NULL);
|
||||
&change);
|
||||
|
||||
result = g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL);
|
||||
|
||||
|
@@ -55,8 +55,7 @@ GType gtk_css_static_style_get_type (void) G_GNUC_CO
|
||||
GtkCssStyle * gtk_css_static_style_get_default (void);
|
||||
GtkCssStyle * gtk_css_static_style_new_compute (GtkStyleProvider *provider,
|
||||
const GtkCssMatcher *matcher,
|
||||
GtkCssStyle *parent,
|
||||
gboolean compute_change);
|
||||
GtkCssStyle *parent);
|
||||
|
||||
void gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
|
||||
GtkStyleProvider *provider,
|
||||
|
@@ -117,6 +117,7 @@ out:
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_STRING = {
|
||||
"GtkCssStringValue",
|
||||
gtk_css_value_string_free,
|
||||
gtk_css_value_string_compute,
|
||||
gtk_css_value_string_equal,
|
||||
@@ -127,6 +128,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_STRING = {
|
||||
};
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_IDENT = {
|
||||
"GtkCssIdentValue",
|
||||
gtk_css_value_string_free,
|
||||
gtk_css_value_string_compute,
|
||||
gtk_css_value_string_equal,
|
||||
@@ -148,6 +150,7 @@ _gtk_css_string_value_new_take (char *string)
|
||||
GtkCssValue *result;
|
||||
|
||||
result = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_STRING);
|
||||
result->is_static = TRUE;
|
||||
result->string = string;
|
||||
|
||||
return result;
|
||||
@@ -188,6 +191,7 @@ _gtk_css_ident_value_new_take (char *ident)
|
||||
GtkCssValue *result;
|
||||
|
||||
result = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_IDENT);
|
||||
result->is_static = TRUE;
|
||||
result->string = ident;
|
||||
|
||||
return result;
|
||||
|
@@ -28,7 +28,7 @@
|
||||
#include "gtkcssinheritvalueprivate.h"
|
||||
#include "gtkcssinitialvalueprivate.h"
|
||||
#include "gtkcssnumbervalueprivate.h"
|
||||
#include "gtkcssrgbavalueprivate.h"
|
||||
#include "gtkcsscolorvalueprivate.h"
|
||||
#include "gtkcssshorthandpropertyprivate.h"
|
||||
#include "gtkcssstringvalueprivate.h"
|
||||
#include "gtkcssfontfeaturesvalueprivate.h"
|
||||
@@ -37,7 +37,6 @@
|
||||
#include "gtkstyleanimationprivate.h"
|
||||
#include "gtkstylepropertyprivate.h"
|
||||
#include "gtkstyleproviderprivate.h"
|
||||
#include "gtksettings.h"
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (GtkCssStyle, gtk_css_style, G_TYPE_OBJECT)
|
||||
|
||||
@@ -54,18 +53,11 @@ gtk_css_style_real_is_static (GtkCssStyle *style)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static GtkCssStyle *
|
||||
gtk_css_style_real_get_static_style (GtkCssStyle *style)
|
||||
{
|
||||
return style;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_css_style_class_init (GtkCssStyleClass *klass)
|
||||
{
|
||||
klass->get_section = gtk_css_style_real_get_section;
|
||||
klass->is_static = gtk_css_style_real_is_static;
|
||||
klass->get_static_style = gtk_css_style_real_get_static_style;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -97,14 +89,6 @@ gtk_css_style_is_static (GtkCssStyle *style)
|
||||
return GTK_CSS_STYLE_GET_CLASS (style)->is_static (style);
|
||||
}
|
||||
|
||||
GtkCssStyle *
|
||||
gtk_css_style_get_static_style (GtkCssStyle *style)
|
||||
{
|
||||
gtk_internal_return_val_if_fail (GTK_IS_CSS_STYLE (style), NULL);
|
||||
|
||||
return GTK_CSS_STYLE_GET_CLASS (style)->get_static_style (style);
|
||||
}
|
||||
|
||||
/*
|
||||
* gtk_css_style_print:
|
||||
* @style: a #GtkCssStyle
|
||||
@@ -126,17 +110,11 @@ gtk_css_style_print (GtkCssStyle *style,
|
||||
gboolean skip_initial)
|
||||
{
|
||||
guint i;
|
||||
GtkCssStyle *default_style;
|
||||
gboolean retval = FALSE;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_CSS_STYLE (style), FALSE);
|
||||
g_return_val_if_fail (string != NULL, FALSE);
|
||||
|
||||
default_style = gtk_css_static_style_get_default ();
|
||||
|
||||
if (style == default_style)
|
||||
g_string_append_printf (string, "%*sDEFAULT STYLE\n", indent, "");
|
||||
|
||||
for (i = 0; i < _gtk_css_style_property_get_n_properties (); i++)
|
||||
{
|
||||
GtkCssSection *section;
|
||||
@@ -144,23 +122,13 @@ gtk_css_style_print (GtkCssStyle *style,
|
||||
GtkCssValue *value;
|
||||
const char *name;
|
||||
|
||||
value = gtk_css_style_get_value (style, i);
|
||||
prop = _gtk_css_style_property_lookup_by_id (i);
|
||||
if (skip_initial)
|
||||
{
|
||||
GtkCssValue *initial = _gtk_css_style_property_get_initial_value (prop);
|
||||
GtkCssValue *computed = _gtk_css_value_compute (initial, i,
|
||||
GTK_STYLE_PROVIDER (gtk_settings_get_default ()),
|
||||
default_style,
|
||||
default_style);
|
||||
gboolean is_initial = _gtk_css_value_equal (value, computed);
|
||||
gtk_css_value_unref (computed);
|
||||
if (is_initial)
|
||||
continue;
|
||||
}
|
||||
|
||||
section = gtk_css_style_get_section (style, i);
|
||||
if (!section && skip_initial)
|
||||
continue;
|
||||
|
||||
prop = _gtk_css_style_property_lookup_by_id (i);
|
||||
name = _gtk_style_property_get_name (GTK_STYLE_PROPERTY (prop));
|
||||
value = gtk_css_style_get_value (style, i);
|
||||
|
||||
g_string_append_printf (string, "%*s%s: ", indent, "", name);
|
||||
_gtk_css_value_print (value, string);
|
||||
@@ -251,8 +219,8 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style)
|
||||
/* text-decoration */
|
||||
decoration_line = _gtk_css_text_decoration_line_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_TEXT_DECORATION_LINE));
|
||||
decoration_style = _gtk_css_text_decoration_style_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE));
|
||||
color = _gtk_css_rgba_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_COLOR));
|
||||
decoration_color = _gtk_css_rgba_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR));
|
||||
color = gtk_css_color_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_COLOR));
|
||||
decoration_color = gtk_css_color_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR));
|
||||
|
||||
switch (decoration_line)
|
||||
{
|
||||
|
@@ -56,8 +56,6 @@ struct _GtkCssStyleClass
|
||||
guint id);
|
||||
/* TRUE if this style will require changes based on timestamp */
|
||||
gboolean (* is_static) (GtkCssStyle *style);
|
||||
|
||||
GtkCssStyle * (* get_static_style) (GtkCssStyle *style);
|
||||
};
|
||||
|
||||
GType gtk_css_style_get_type (void) G_GNUC_CONST;
|
||||
@@ -76,7 +74,6 @@ gboolean gtk_css_style_print (GtkCssStyle
|
||||
PangoAttrList * gtk_css_style_get_pango_attributes (GtkCssStyle *style);
|
||||
|
||||
PangoFontDescription * gtk_css_style_get_pango_font (GtkCssStyle *style);
|
||||
GtkCssStyle * gtk_css_style_get_static_style (GtkCssStyle *style);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@@ -372,3 +372,33 @@ _gtk_css_style_property_get_initial_value (GtkCssStyleProperty *property)
|
||||
|
||||
return property->initial_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* _gtk_css_style_property_get_mask_affecting:
|
||||
* @flags: the flags that are affected
|
||||
*
|
||||
* Computes a bitmask for all properties that have at least one of @flags
|
||||
* set.
|
||||
*
|
||||
* Returns: (transfer full): A #GtkBitmask with the bit set for every
|
||||
* property that has at least one of @flags set.
|
||||
*/
|
||||
GtkBitmask *
|
||||
_gtk_css_style_property_get_mask_affecting (GtkCssAffects affects)
|
||||
{
|
||||
GtkBitmask *result;
|
||||
guint i;
|
||||
|
||||
result = _gtk_bitmask_new ();
|
||||
|
||||
for (i = 0; i < _gtk_css_style_property_get_n_properties (); i++)
|
||||
{
|
||||
GtkCssStyleProperty *prop = _gtk_css_style_property_lookup_by_id (i);
|
||||
|
||||
if (_gtk_css_style_property_get_affects (prop) & affects)
|
||||
result = _gtk_bitmask_set (result, i, TRUE);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@@ -46,6 +46,7 @@
|
||||
#include "gtkcssfontfeaturesvalueprivate.h"
|
||||
#include "gtkcssiconthemevalueprivate.h"
|
||||
#include "gtkcssimageprivate.h"
|
||||
#include "gtkcssimagebuiltinprivate.h"
|
||||
#include "gtkcssimagevalueprivate.h"
|
||||
#include "gtkcssinitialvalueprivate.h"
|
||||
#include "gtkcssenumvalueprivate.h"
|
||||
@@ -104,7 +105,7 @@ gtk_css_style_property_register (const char * name,
|
||||
|
||||
static void
|
||||
query_length_as_int (GtkCssStyleProperty *property,
|
||||
const GtkCssValue *css_value,
|
||||
GtkCssValue *css_value,
|
||||
GValue *value)
|
||||
{
|
||||
g_value_init (value, G_TYPE_INT);
|
||||
@@ -113,7 +114,7 @@ query_length_as_int (GtkCssStyleProperty *property,
|
||||
|
||||
static void
|
||||
query_font_size (GtkCssStyleProperty *property,
|
||||
const GtkCssValue *css_value,
|
||||
GtkCssValue *css_value,
|
||||
GValue *value)
|
||||
{
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
@@ -122,7 +123,7 @@ query_font_size (GtkCssStyleProperty *property,
|
||||
|
||||
static void
|
||||
query_border (GtkCssStyleProperty *property,
|
||||
const GtkCssValue *css_value,
|
||||
GtkCssValue *css_value,
|
||||
GValue *value)
|
||||
{
|
||||
GtkBorder border;
|
||||
@@ -146,11 +147,11 @@ color_parse (GtkCssStyleProperty *property,
|
||||
|
||||
static void
|
||||
color_query (GtkCssStyleProperty *property,
|
||||
const GtkCssValue *css_value,
|
||||
GtkCssValue *css_value,
|
||||
GValue *value)
|
||||
{
|
||||
g_value_init (value, GDK_TYPE_RGBA);
|
||||
g_value_set_boxed (value, _gtk_css_rgba_value_get_rgba (css_value));
|
||||
g_value_set_boxed (value, gtk_css_color_value_get_rgba (css_value));
|
||||
}
|
||||
|
||||
static GtkCssValue *
|
||||
@@ -199,7 +200,7 @@ font_family_parse (GtkCssStyleProperty *property,
|
||||
|
||||
static void
|
||||
font_family_query (GtkCssStyleProperty *property,
|
||||
const GtkCssValue *css_value,
|
||||
GtkCssValue *css_value,
|
||||
GValue *value)
|
||||
{
|
||||
GPtrArray *array;
|
||||
@@ -233,7 +234,7 @@ font_style_parse (GtkCssStyleProperty *property,
|
||||
|
||||
static void
|
||||
font_style_query (GtkCssStyleProperty *property,
|
||||
const GtkCssValue *css_value,
|
||||
GtkCssValue *css_value,
|
||||
GValue *value)
|
||||
{
|
||||
g_value_init (value, PANGO_TYPE_STYLE);
|
||||
@@ -266,7 +267,7 @@ font_weight_parse (GtkCssStyleProperty *property,
|
||||
|
||||
static void
|
||||
font_weight_query (GtkCssStyleProperty *property,
|
||||
const GtkCssValue *css_value,
|
||||
GtkCssValue *css_value,
|
||||
GValue *value)
|
||||
{
|
||||
g_value_init (value, PANGO_TYPE_WEIGHT);
|
||||
@@ -287,7 +288,7 @@ font_stretch_parse (GtkCssStyleProperty *property,
|
||||
|
||||
static void
|
||||
font_stretch_query (GtkCssStyleProperty *property,
|
||||
const GtkCssValue *css_value,
|
||||
GtkCssValue *css_value,
|
||||
GValue *value)
|
||||
{
|
||||
g_value_init (value, PANGO_TYPE_STRETCH);
|
||||
@@ -308,7 +309,7 @@ parse_border_style (GtkCssStyleProperty *property,
|
||||
|
||||
static void
|
||||
query_border_style (GtkCssStyleProperty *property,
|
||||
const GtkCssValue *css_value,
|
||||
GtkCssValue *css_value,
|
||||
GValue *value)
|
||||
{
|
||||
g_value_init (value, GTK_TYPE_BORDER_STYLE);
|
||||
@@ -360,7 +361,7 @@ opacity_parse (GtkCssStyleProperty *property,
|
||||
|
||||
static void
|
||||
opacity_query (GtkCssStyleProperty *property,
|
||||
const GtkCssValue *css_value,
|
||||
GtkCssValue *css_value,
|
||||
GValue *value)
|
||||
{
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
@@ -676,6 +677,16 @@ css_image_value_parse (GtkCssStyleProperty *property,
|
||||
return _gtk_css_image_value_new (image);
|
||||
}
|
||||
|
||||
static GtkCssValue *
|
||||
css_image_value_parse_with_builtin (GtkCssStyleProperty *property,
|
||||
GtkCssParser *parser)
|
||||
{
|
||||
if (gtk_css_parser_try_ident (parser, "builtin"))
|
||||
return _gtk_css_image_value_new (gtk_css_image_builtin_new ());
|
||||
|
||||
return css_image_value_parse (property, parser);
|
||||
}
|
||||
|
||||
static GtkCssValue *
|
||||
background_image_value_parse_one (GtkCssParser *parser)
|
||||
{
|
||||
@@ -857,7 +868,8 @@ parse_border_width (GtkCssStyleProperty *property,
|
||||
{
|
||||
return _gtk_css_number_value_parse (parser,
|
||||
GTK_CSS_POSITIVE_ONLY
|
||||
| GTK_CSS_PARSE_LENGTH);
|
||||
| GTK_CSS_PARSE_LENGTH
|
||||
| GTK_CSS_PARSE_NON_STATIC);
|
||||
}
|
||||
|
||||
static GtkCssValue *
|
||||
@@ -936,7 +948,7 @@ _gtk_css_style_property_init_properties (void)
|
||||
GTK_CSS_AFFECTS_CONTENT | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
|
||||
color_parse,
|
||||
color_query,
|
||||
_gtk_css_rgba_value_new_white ());
|
||||
gtk_css_color_value_new_white ());
|
||||
gtk_css_style_property_register ("-gtk-dpi",
|
||||
GTK_CSS_PROPERTY_DPI,
|
||||
G_TYPE_NONE,
|
||||
@@ -980,7 +992,7 @@ _gtk_css_style_property_init_properties (void)
|
||||
GTK_CSS_AFFECTS_BACKGROUND,
|
||||
color_parse,
|
||||
color_query,
|
||||
_gtk_css_rgba_value_new_transparent ());
|
||||
gtk_css_color_value_new_transparent ());
|
||||
|
||||
gtk_css_style_property_register ("font-family",
|
||||
GTK_CSS_PROPERTY_FONT_FAMILY,
|
||||
@@ -1501,9 +1513,9 @@ _gtk_css_style_property_init_properties (void)
|
||||
G_TYPE_NONE,
|
||||
GTK_STYLE_PROPERTY_ANIMATED,
|
||||
GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
|
||||
css_image_value_parse,
|
||||
css_image_value_parse_with_builtin,
|
||||
NULL,
|
||||
_gtk_css_image_value_new (NULL));
|
||||
_gtk_css_image_value_new (gtk_css_image_builtin_new ()));
|
||||
gtk_css_style_property_register ("-gtk-icon-size",
|
||||
GTK_CSS_PROPERTY_ICON_SIZE,
|
||||
G_TYPE_NONE,
|
||||
|
@@ -37,7 +37,7 @@ typedef struct _GtkCssStylePropertyClass GtkCssStylePropertyClass;
|
||||
typedef GtkCssValue * (* GtkCssStylePropertyParseFunc) (GtkCssStyleProperty *property,
|
||||
GtkCssParser *parser);
|
||||
typedef void (* GtkCssStylePropertyQueryFunc) (GtkCssStyleProperty *property,
|
||||
const GtkCssValue *cssvalue,
|
||||
GtkCssValue *cssvalue,
|
||||
GValue *value);
|
||||
struct _GtkCssStyleProperty
|
||||
{
|
||||
@@ -80,6 +80,9 @@ void _gtk_css_style_property_print_value (GtkCssStyleProp
|
||||
GtkCssValue *value,
|
||||
GString *string);
|
||||
|
||||
GtkBitmask * _gtk_css_style_property_get_mask_affecting
|
||||
(GtkCssAffects affects);
|
||||
|
||||
/* XXX - find a better place for these */
|
||||
GtkCssValue * gtk_css_font_family_value_parse (GtkCssParser *parser);
|
||||
GtkCssValue * gtk_css_font_size_value_parse (GtkCssParser *parser);
|
||||
|
@@ -590,6 +590,7 @@ gtk_css_value_transform_transition (GtkCssValue *start,
|
||||
}
|
||||
|
||||
result = gtk_css_transform_value_alloc (MAX (start->n_transforms, end->n_transforms));
|
||||
result->is_static = start->is_static && end->is_static;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
@@ -790,6 +791,7 @@ gtk_css_value_transform_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_TRANSFORM = {
|
||||
"GtkCssTransformValue",
|
||||
gtk_css_value_transform_free,
|
||||
gtk_css_value_transform_compute,
|
||||
gtk_css_value_transform_equal,
|
||||
@@ -799,7 +801,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_TRANSFORM = {
|
||||
gtk_css_value_transform_print
|
||||
};
|
||||
|
||||
static GtkCssValue none_singleton = { >K_CSS_VALUE_TRANSFORM, 1, 0, { { GTK_CSS_TRANSFORM_NONE } } };
|
||||
static GtkCssValue none_singleton = { >K_CSS_VALUE_TRANSFORM, 1, 1, 0, { { GTK_CSS_TRANSFORM_NONE } } };
|
||||
|
||||
static GtkCssValue *
|
||||
gtk_css_transform_value_alloc (guint n_transforms)
|
||||
@@ -930,6 +932,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
GtkCssValue *value;
|
||||
GArray *array;
|
||||
guint i;
|
||||
gboolean is_static = TRUE;
|
||||
|
||||
if (gtk_css_parser_try_ident (parser, "none"))
|
||||
return _gtk_css_transform_value_new_none ();
|
||||
@@ -966,6 +969,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
goto fail;
|
||||
|
||||
transform.type = GTK_CSS_TRANSFORM_PERSPECTIVE;
|
||||
is_static = is_static && transform.perspective.depth->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "rotate") ||
|
||||
gtk_css_parser_has_function (parser, "rotateZ"))
|
||||
@@ -977,6 +981,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.rotate.x = _gtk_css_number_value_new (0, GTK_CSS_NUMBER);
|
||||
transform.rotate.y = _gtk_css_number_value_new (0, GTK_CSS_NUMBER);
|
||||
transform.rotate.z = _gtk_css_number_value_new (1, GTK_CSS_NUMBER);
|
||||
is_static = is_static && transform.rotate.angle->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "rotate3d"))
|
||||
{
|
||||
@@ -990,6 +995,10 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
}
|
||||
|
||||
transform.type = GTK_CSS_TRANSFORM_ROTATE;
|
||||
is_static = is_static && transform.rotate.angle->is_static &&
|
||||
transform.rotate.x->is_static &&
|
||||
transform.rotate.y->is_static &&
|
||||
transform.rotate.z->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "rotateX"))
|
||||
{
|
||||
@@ -1000,6 +1009,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.rotate.x = _gtk_css_number_value_new (1, GTK_CSS_NUMBER);
|
||||
transform.rotate.y = _gtk_css_number_value_new (0, GTK_CSS_NUMBER);
|
||||
transform.rotate.z = _gtk_css_number_value_new (0, GTK_CSS_NUMBER);
|
||||
is_static = is_static && transform.rotate.angle->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "rotateY"))
|
||||
{
|
||||
@@ -1010,6 +1020,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.rotate.x = _gtk_css_number_value_new (0, GTK_CSS_NUMBER);
|
||||
transform.rotate.y = _gtk_css_number_value_new (1, GTK_CSS_NUMBER);
|
||||
transform.rotate.z = _gtk_css_number_value_new (0, GTK_CSS_NUMBER);
|
||||
is_static = is_static && transform.rotate.angle->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "scale"))
|
||||
{
|
||||
@@ -1029,6 +1040,8 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
else
|
||||
transform.scale.y = gtk_css_value_ref (values[0]);
|
||||
transform.scale.z = _gtk_css_number_value_new (1, GTK_CSS_NUMBER);
|
||||
is_static = is_static && transform.scale.x->is_static &&
|
||||
transform.scale.y->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "scale3d"))
|
||||
{
|
||||
@@ -1046,6 +1059,9 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.scale.x = values[0];
|
||||
transform.scale.y = values[1];
|
||||
transform.scale.z = values[2];
|
||||
is_static = is_static && transform.scale.x->is_static &&
|
||||
transform.scale.y->is_static &&
|
||||
transform.scale.z->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "scaleX"))
|
||||
{
|
||||
@@ -1055,6 +1071,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.type = GTK_CSS_TRANSFORM_SCALE;
|
||||
transform.scale.y = _gtk_css_number_value_new (1, GTK_CSS_NUMBER);
|
||||
transform.scale.z = _gtk_css_number_value_new (1, GTK_CSS_NUMBER);
|
||||
is_static = is_static && transform.scale.x->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "scaleY"))
|
||||
{
|
||||
@@ -1064,6 +1081,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.type = GTK_CSS_TRANSFORM_SCALE;
|
||||
transform.scale.x = _gtk_css_number_value_new (1, GTK_CSS_NUMBER);
|
||||
transform.scale.z = _gtk_css_number_value_new (1, GTK_CSS_NUMBER);
|
||||
is_static = is_static && transform.scale.y->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "scaleZ"))
|
||||
{
|
||||
@@ -1073,6 +1091,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.type = GTK_CSS_TRANSFORM_SCALE;
|
||||
transform.scale.x = _gtk_css_number_value_new (1, GTK_CSS_NUMBER);
|
||||
transform.scale.y = _gtk_css_number_value_new (1, GTK_CSS_NUMBER);
|
||||
is_static = is_static && transform.scale.z->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "skew"))
|
||||
{
|
||||
@@ -1088,6 +1107,8 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.type = GTK_CSS_TRANSFORM_SKEW;
|
||||
transform.skew.x = values[0];
|
||||
transform.skew.y = values[1];
|
||||
is_static = is_static && transform.skew.x->is_static &&
|
||||
transform.skew.y->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "skewX"))
|
||||
{
|
||||
@@ -1095,6 +1116,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
goto fail;
|
||||
|
||||
transform.type = GTK_CSS_TRANSFORM_SKEW_X;
|
||||
is_static = is_static && transform.skew_x.skew->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "skewY"))
|
||||
{
|
||||
@@ -1102,6 +1124,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
goto fail;
|
||||
|
||||
transform.type = GTK_CSS_TRANSFORM_SKEW_Y;
|
||||
is_static = is_static && transform.skew_y.skew->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "translate"))
|
||||
{
|
||||
@@ -1121,6 +1144,8 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
else
|
||||
transform.translate.y = _gtk_css_number_value_new (0, GTK_CSS_PX);
|
||||
transform.translate.z = _gtk_css_number_value_new (0, GTK_CSS_PX);
|
||||
is_static = is_static && transform.translate.x->is_static &&
|
||||
transform.translate.y->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "translate3d"))
|
||||
{
|
||||
@@ -1138,6 +1163,9 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.translate.x = values[0];
|
||||
transform.translate.y = values[1];
|
||||
transform.translate.z = values[2];
|
||||
is_static = is_static && transform.translate.x->is_static &&
|
||||
transform.translate.y->is_static &&
|
||||
transform.translate.z->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "translateX"))
|
||||
{
|
||||
@@ -1147,6 +1175,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.type = GTK_CSS_TRANSFORM_TRANSLATE;
|
||||
transform.translate.y = _gtk_css_number_value_new (0, GTK_CSS_PX);
|
||||
transform.translate.z = _gtk_css_number_value_new (0, GTK_CSS_PX);
|
||||
is_static = is_static && transform.translate.x->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "translateY"))
|
||||
{
|
||||
@@ -1156,6 +1185,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.type = GTK_CSS_TRANSFORM_TRANSLATE;
|
||||
transform.translate.x = _gtk_css_number_value_new (0, GTK_CSS_PX);
|
||||
transform.translate.z = _gtk_css_number_value_new (0, GTK_CSS_PX);
|
||||
is_static = is_static && transform.translate.y->is_static;
|
||||
}
|
||||
else if (gtk_css_parser_has_function (parser, "translateZ"))
|
||||
{
|
||||
@@ -1165,6 +1195,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
transform.type = GTK_CSS_TRANSFORM_TRANSLATE;
|
||||
transform.translate.x = _gtk_css_number_value_new (0, GTK_CSS_PX);
|
||||
transform.translate.y = _gtk_css_number_value_new (0, GTK_CSS_PX);
|
||||
is_static = is_static && transform.translate.z->is_static;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1181,6 +1212,7 @@ _gtk_css_transform_value_parse (GtkCssParser *parser)
|
||||
}
|
||||
|
||||
value = gtk_css_transform_value_alloc (array->len);
|
||||
value->is_static = is_static;
|
||||
memcpy (value->transforms, array->data, sizeof (GtkCssTransform) * array->len);
|
||||
|
||||
g_array_free (array, TRUE);
|
||||
|
@@ -74,18 +74,19 @@ _gtk_css_change_for_sibling (GtkCssChange match)
|
||||
| GTK_CSS_CHANGE_LAST_CHILD \
|
||||
| GTK_CSS_CHANGE_NTH_CHILD \
|
||||
| GTK_CSS_CHANGE_NTH_LAST_CHILD \
|
||||
| GTK_CSS_CHANGE_STATE \
|
||||
| GTK_CSS_CHANGE_HOVER \
|
||||
| GTK_CSS_CHANGE_ACTIVE )
|
||||
| GTK_CSS_CHANGE_STATE )
|
||||
|
||||
#define KEEP_STATES ( ~(BASE_STATES|GTK_CSS_CHANGE_SOURCE|GTK_CSS_CHANGE_PARENT_STYLE) \
|
||||
| GTK_CSS_CHANGE_NTH_CHILD \
|
||||
| GTK_CSS_CHANGE_NTH_LAST_CHILD)
|
||||
|
||||
return (match & KEEP_STATES) | ((match & BASE_STATES) << GTK_CSS_CHANGE_SIBLING_SHIFT);
|
||||
#define SIBLING_SHIFT 8
|
||||
|
||||
return (match & KEEP_STATES) | ((match & BASE_STATES) << SIBLING_SHIFT);
|
||||
|
||||
#undef BASE_STATES
|
||||
#undef KEEP_STATES
|
||||
#undef SIBLING_SHIFT
|
||||
}
|
||||
|
||||
GtkCssChange
|
||||
@@ -99,8 +100,6 @@ _gtk_css_change_for_child (GtkCssChange match)
|
||||
| GTK_CSS_CHANGE_NTH_CHILD \
|
||||
| GTK_CSS_CHANGE_NTH_LAST_CHILD \
|
||||
| GTK_CSS_CHANGE_STATE \
|
||||
| GTK_CSS_CHANGE_HOVER \
|
||||
| GTK_CSS_CHANGE_ACTIVE \
|
||||
| GTK_CSS_CHANGE_SIBLING_CLASS \
|
||||
| GTK_CSS_CHANGE_SIBLING_NAME \
|
||||
| GTK_CSS_CHANGE_SIBLING_ID \
|
||||
@@ -108,16 +107,14 @@ _gtk_css_change_for_child (GtkCssChange match)
|
||||
| GTK_CSS_CHANGE_SIBLING_LAST_CHILD \
|
||||
| GTK_CSS_CHANGE_SIBLING_NTH_CHILD \
|
||||
| GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD \
|
||||
| GTK_CSS_CHANGE_SIBLING_STATE \
|
||||
| GTK_CSS_CHANGE_SIBLING_HOVER \
|
||||
| GTK_CSS_CHANGE_SIBLING_ACTIVE )
|
||||
| GTK_CSS_CHANGE_SIBLING_STATE )
|
||||
|
||||
#define KEEP_STATES (~(BASE_STATES|GTK_CSS_CHANGE_SOURCE|GTK_CSS_CHANGE_PARENT_STYLE))
|
||||
#define PARENT_SHIFT 16
|
||||
|
||||
return (match & KEEP_STATES) | ((match & BASE_STATES) << GTK_CSS_CHANGE_PARENT_SHIFT);
|
||||
return (match & ~(BASE_STATES|GTK_CSS_CHANGE_SOURCE|GTK_CSS_CHANGE_PARENT_STYLE)) | ((match & BASE_STATES) << PARENT_SHIFT);
|
||||
|
||||
#undef BASE_STATES
|
||||
#undef KEEP_STATES
|
||||
#undef PARENT_SHIFT
|
||||
}
|
||||
|
||||
void
|
||||
@@ -136,8 +133,6 @@ gtk_css_change_print (GtkCssChange change,
|
||||
{ GTK_CSS_CHANGE_NTH_CHILD, "nth-child" },
|
||||
{ GTK_CSS_CHANGE_NTH_LAST_CHILD, "nth-last-child" },
|
||||
{ GTK_CSS_CHANGE_STATE, "state" },
|
||||
{ GTK_CSS_CHANGE_HOVER, "hover" },
|
||||
{ GTK_CSS_CHANGE_ACTIVE, "active" },
|
||||
{ GTK_CSS_CHANGE_SIBLING_CLASS, "sibling-class" },
|
||||
{ GTK_CSS_CHANGE_SIBLING_NAME, "sibling-name" },
|
||||
{ GTK_CSS_CHANGE_SIBLING_ID, "sibling-id" },
|
||||
@@ -146,8 +141,6 @@ gtk_css_change_print (GtkCssChange change,
|
||||
{ GTK_CSS_CHANGE_SIBLING_NTH_CHILD, "sibling-nth-child" },
|
||||
{ GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD, "sibling-nth-last-child" },
|
||||
{ GTK_CSS_CHANGE_SIBLING_STATE, "sibling-state" },
|
||||
{ GTK_CSS_CHANGE_SIBLING_HOVER, "sibling-hover" },
|
||||
{ GTK_CSS_CHANGE_SIBLING_ACTIVE, "sibling-active" },
|
||||
{ GTK_CSS_CHANGE_PARENT_CLASS, "parent-class" },
|
||||
{ GTK_CSS_CHANGE_PARENT_NAME, "parent-name" },
|
||||
{ GTK_CSS_CHANGE_PARENT_ID, "parent-id" },
|
||||
@@ -156,8 +149,6 @@ gtk_css_change_print (GtkCssChange change,
|
||||
{ GTK_CSS_CHANGE_PARENT_NTH_CHILD, "parent-nth-child" },
|
||||
{ GTK_CSS_CHANGE_PARENT_NTH_LAST_CHILD, "parent-nth-last-child" },
|
||||
{ GTK_CSS_CHANGE_PARENT_STATE, "parent-state" },
|
||||
{ GTK_CSS_CHANGE_PARENT_HOVER, "parent-hover" },
|
||||
{ GTK_CSS_CHANGE_PARENT_ACTIVE, "parent-active" },
|
||||
{ GTK_CSS_CHANGE_PARENT_SIBLING_CLASS, "parent-sibling-" },
|
||||
{ GTK_CSS_CHANGE_PARENT_SIBLING_NAME, "parent-sibling-name" },
|
||||
{ GTK_CSS_CHANGE_PARENT_SIBLING_ID, "parent-sibling-id" },
|
||||
@@ -166,8 +157,6 @@ gtk_css_change_print (GtkCssChange change,
|
||||
{ GTK_CSS_CHANGE_PARENT_SIBLING_NTH_CHILD, "parent-sibling-nth-child" },
|
||||
{ GTK_CSS_CHANGE_PARENT_SIBLING_NTH_LAST_CHILD, "parent-sibling-nth-last-child" },
|
||||
{ GTK_CSS_CHANGE_PARENT_SIBLING_STATE, "parent-sibling-state" },
|
||||
{ GTK_CSS_CHANGE_PARENT_SIBLING_HOVER, "parent-sibling-hover" },
|
||||
{ GTK_CSS_CHANGE_PARENT_SIBLING_ACTIVE, "parent-sibling-active" },
|
||||
{ GTK_CSS_CHANGE_SOURCE, "source" },
|
||||
{ GTK_CSS_CHANGE_PARENT_STYLE, "parent-style" },
|
||||
{ GTK_CSS_CHANGE_TIMESTAMP, "timestamp" },
|
||||
|
@@ -36,83 +36,61 @@ typedef struct _GtkCssStyle GtkCssStyle;
|
||||
#define GTK_CSS_CHANGE_NTH_CHILD (1ULL << 5)
|
||||
#define GTK_CSS_CHANGE_NTH_LAST_CHILD (1ULL << 6)
|
||||
#define GTK_CSS_CHANGE_STATE (1ULL << 7)
|
||||
#define GTK_CSS_CHANGE_HOVER (1ULL << 8)
|
||||
#define GTK_CSS_CHANGE_ACTIVE (1ULL << 9)
|
||||
|
||||
#define GTK_CSS_CHANGE_SIBLING_SHIFT 10
|
||||
|
||||
#define GTK_CSS_CHANGE_SIBLING_CLASS (1ULL << 10)
|
||||
#define GTK_CSS_CHANGE_SIBLING_NAME (1ULL << 11)
|
||||
#define GTK_CSS_CHANGE_SIBLING_ID (1ULL << 12)
|
||||
#define GTK_CSS_CHANGE_SIBLING_FIRST_CHILD (1ULL << 13)
|
||||
#define GTK_CSS_CHANGE_SIBLING_LAST_CHILD (1ULL << 14)
|
||||
#define GTK_CSS_CHANGE_SIBLING_NTH_CHILD (1ULL << 15)
|
||||
#define GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD (1ULL << 16)
|
||||
#define GTK_CSS_CHANGE_SIBLING_STATE (1ULL << 17)
|
||||
#define GTK_CSS_CHANGE_SIBLING_HOVER (1ULL << 18)
|
||||
#define GTK_CSS_CHANGE_SIBLING_ACTIVE (1ULL << 19)
|
||||
|
||||
#define GTK_CSS_CHANGE_PARENT_SHIFT (GTK_CSS_CHANGE_SIBLING_SHIFT + GTK_CSS_CHANGE_SIBLING_SHIFT)
|
||||
|
||||
#define GTK_CSS_CHANGE_PARENT_CLASS (1ULL << 20)
|
||||
#define GTK_CSS_CHANGE_PARENT_NAME (1ULL << 21)
|
||||
#define GTK_CSS_CHANGE_PARENT_ID (1ULL << 22)
|
||||
#define GTK_CSS_CHANGE_PARENT_FIRST_CHILD (1ULL << 23)
|
||||
#define GTK_CSS_CHANGE_PARENT_LAST_CHILD (1ULL << 24)
|
||||
#define GTK_CSS_CHANGE_PARENT_NTH_CHILD (1ULL << 25)
|
||||
#define GTK_CSS_CHANGE_PARENT_NTH_LAST_CHILD (1ULL << 26)
|
||||
#define GTK_CSS_CHANGE_PARENT_STATE (1ULL << 27)
|
||||
#define GTK_CSS_CHANGE_PARENT_HOVER (1ULL << 28)
|
||||
#define GTK_CSS_CHANGE_PARENT_ACTIVE (1ULL << 29)
|
||||
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_SHIFT (GTK_CSS_CHANGE_PARENT_SHIFT + GTK_CSS_CHANGE_SIBLING_SHIFT)
|
||||
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_CLASS (1ULL << 30)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_ID (1ULL << 31)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_NAME (1ULL << 32)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_FIRST_CHILD (1ULL << 33)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_LAST_CHILD (1ULL << 34)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_CHILD (1ULL << 35)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_LAST_CHILD (1ULL << 36)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_STATE (1ULL << 37)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_HOVER (1ULL << 38)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_ACTIVE (1ULL << 39)
|
||||
#define GTK_CSS_CHANGE_SIBLING_CLASS (1ULL << 8)
|
||||
#define GTK_CSS_CHANGE_SIBLING_NAME (1ULL << 9)
|
||||
#define GTK_CSS_CHANGE_SIBLING_ID (1ULL << 10)
|
||||
#define GTK_CSS_CHANGE_SIBLING_FIRST_CHILD (1ULL << 11)
|
||||
#define GTK_CSS_CHANGE_SIBLING_LAST_CHILD (1ULL << 12)
|
||||
#define GTK_CSS_CHANGE_SIBLING_NTH_CHILD (1ULL << 13)
|
||||
#define GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD (1ULL << 14)
|
||||
#define GTK_CSS_CHANGE_SIBLING_STATE (1ULL << 15)
|
||||
#define GTK_CSS_CHANGE_PARENT_CLASS (1ULL << 16)
|
||||
#define GTK_CSS_CHANGE_PARENT_NAME (1ULL << 17)
|
||||
#define GTK_CSS_CHANGE_PARENT_ID (1ULL << 18)
|
||||
#define GTK_CSS_CHANGE_PARENT_FIRST_CHILD (1ULL << 19)
|
||||
#define GTK_CSS_CHANGE_PARENT_LAST_CHILD (1ULL << 20)
|
||||
#define GTK_CSS_CHANGE_PARENT_NTH_CHILD (1ULL << 21)
|
||||
#define GTK_CSS_CHANGE_PARENT_NTH_LAST_CHILD (1ULL << 22)
|
||||
#define GTK_CSS_CHANGE_PARENT_STATE (1ULL << 23)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_CLASS (1ULL << 24)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_ID (1ULL << 25)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_NAME (1ULL << 26)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_FIRST_CHILD (1ULL << 27)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_LAST_CHILD (1ULL << 28)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_CHILD (1ULL << 29)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_LAST_CHILD (1ULL << 30)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_STATE (1ULL << 31)
|
||||
|
||||
/* add more */
|
||||
#define GTK_CSS_CHANGE_SOURCE (1ULL << 40)
|
||||
#define GTK_CSS_CHANGE_PARENT_STYLE (1ULL << 41)
|
||||
#define GTK_CSS_CHANGE_TIMESTAMP (1ULL << 42)
|
||||
#define GTK_CSS_CHANGE_ANIMATIONS (1ULL << 43)
|
||||
#define GTK_CSS_CHANGE_SOURCE (1ULL << 32)
|
||||
#define GTK_CSS_CHANGE_PARENT_STYLE (1ULL << 33)
|
||||
#define GTK_CSS_CHANGE_TIMESTAMP (1ULL << 34)
|
||||
#define GTK_CSS_CHANGE_ANIMATIONS (1ULL << 35)
|
||||
|
||||
#define GTK_CSS_CHANGE_RESERVED_BIT (1ULL << 62) /* Used internally in gtkcssselector.c */
|
||||
|
||||
typedef guint64 GtkCssChange;
|
||||
|
||||
#define GTK_CSS_CHANGE_POSITION (GTK_CSS_CHANGE_FIRST_CHILD | \
|
||||
GTK_CSS_CHANGE_LAST_CHILD | \
|
||||
GTK_CSS_CHANGE_NTH_CHILD | \
|
||||
GTK_CSS_CHANGE_NTH_LAST_CHILD)
|
||||
#define GTK_CSS_CHANGE_SIBLING_POSITION (GTK_CSS_CHANGE_POSITION << GTK_CSS_CHANGE_SIBLING_SHIFT)
|
||||
#define GTK_CSS_CHANGE_POSITION (GTK_CSS_CHANGE_FIRST_CHILD | GTK_CSS_CHANGE_LAST_CHILD | \
|
||||
GTK_CSS_CHANGE_NTH_CHILD | GTK_CSS_CHANGE_NTH_LAST_CHILD)
|
||||
#define GTK_CSS_CHANGE_SIBLING_POSITION (GTK_CSS_CHANGE_SIBLING_FIRST_CHILD | GTK_CSS_CHANGE_SIBLING_LAST_CHILD | \
|
||||
GTK_CSS_CHANGE_SIBLING_NTH_CHILD | GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD)
|
||||
#define GTK_CSS_CHANGE_PARENT_POSITION (GTK_CSS_CHANGE_PARENT_FIRST_CHILD | GTK_CSS_CHANGE_PARENT_LAST_CHILD | \
|
||||
GTK_CSS_CHANGE_PARENT_NTH_CHILD | GTK_CSS_CHANGE_PARENT_NTH_LAST_CHILD)
|
||||
#define GTK_CSS_CHANGE_PARENT_SIBLING_POSITION (GTK_CSS_CHANGE_PARENT_SIBLING_FIRST_CHILD | GTK_CSS_CHANGE_PARENT_SIBLING_LAST_CHILD | \
|
||||
GTK_CSS_CHANGE_PARENT_SIBLING_NTH_CHILD | GTK_CSS_CHANGE_PARENT_SIBLING_NTH_LAST_CHILD)
|
||||
|
||||
#define GTK_CSS_CHANGE_ANY_SELF (GTK_CSS_CHANGE_CLASS | \
|
||||
GTK_CSS_CHANGE_NAME | \
|
||||
GTK_CSS_CHANGE_ID | \
|
||||
GTK_CSS_CHANGE_POSITION | \
|
||||
GTK_CSS_CHANGE_STATE | \
|
||||
GTK_CSS_CHANGE_HOVER | \
|
||||
GTK_CSS_CHANGE_ACTIVE)
|
||||
#define GTK_CSS_CHANGE_ANY_SIBLING (GTK_CSS_CHANGE_ANY_SELF << GTK_CSS_CHANGE_SIBLING_SHIFT)
|
||||
#define GTK_CSS_CHANGE_ANY_PARENT (GTK_CSS_CHANGE_ANY_SELF << GTK_CSS_CHANGE_PARENT_SHIFT)
|
||||
#define GTK_CSS_CHANGE_ANY_PARENT_SIBLING (GTK_CSS_CHANGE_ANY_SELF << GTK_CSS_CHANGE_PARENT_SIBLING_SHIFT)
|
||||
|
||||
#define GTK_CSS_CHANGE_ANY (GTK_CSS_CHANGE_ANY_SELF | \
|
||||
GTK_CSS_CHANGE_ANY_SIBLING | \
|
||||
GTK_CSS_CHANGE_ANY_PARENT | \
|
||||
GTK_CSS_CHANGE_ANY_PARENT_SIBLING | \
|
||||
GTK_CSS_CHANGE_SOURCE | \
|
||||
GTK_CSS_CHANGE_PARENT_STYLE | \
|
||||
GTK_CSS_CHANGE_TIMESTAMP | \
|
||||
GTK_CSS_CHANGE_ANIMATIONS)
|
||||
#define GTK_CSS_CHANGE_ANY ((1 << 19) - 1)
|
||||
#define GTK_CSS_CHANGE_ANY_SELF (GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_ID | GTK_CSS_CHANGE_POSITION | GTK_CSS_CHANGE_STATE)
|
||||
#define GTK_CSS_CHANGE_ANY_SIBLING (GTK_CSS_CHANGE_SIBLING_CLASS | GTK_CSS_CHANGE_SIBLING_NAME | \
|
||||
GTK_CSS_CHANGE_SIBLING_ID | \
|
||||
GTK_CSS_CHANGE_SIBLING_POSITION | GTK_CSS_CHANGE_SIBLING_STATE)
|
||||
#define GTK_CSS_CHANGE_ANY_PARENT (GTK_CSS_CHANGE_PARENT_CLASS | GTK_CSS_CHANGE_PARENT_SIBLING_CLASS | \
|
||||
GTK_CSS_CHANGE_PARENT_NAME | GTK_CSS_CHANGE_PARENT_SIBLING_NAME | \
|
||||
GTK_CSS_CHANGE_PARENT_ID | GTK_CSS_CHANGE_PARENT_SIBLING_ID | \
|
||||
GTK_CSS_CHANGE_PARENT_POSITION | GTK_CSS_CHANGE_PARENT_SIBLING_POSITION | \
|
||||
GTK_CSS_CHANGE_PARENT_STATE | GTK_CSS_CHANGE_PARENT_SIBLING_STATE)
|
||||
|
||||
/*
|
||||
* GtkCssAffects:
|
||||
@@ -269,6 +247,29 @@ enum { /*< skip >*/
|
||||
GTK_CSS_PROPERTY_N_PROPERTIES
|
||||
};
|
||||
|
||||
typedef enum /*< skip >*/ {
|
||||
GTK_CSS_IMAGE_BUILTIN_NONE,
|
||||
GTK_CSS_IMAGE_BUILTIN_CHECK,
|
||||
GTK_CSS_IMAGE_BUILTIN_CHECK_INCONSISTENT,
|
||||
GTK_CSS_IMAGE_BUILTIN_OPTION,
|
||||
GTK_CSS_IMAGE_BUILTIN_OPTION_INCONSISTENT,
|
||||
GTK_CSS_IMAGE_BUILTIN_ARROW_UP,
|
||||
GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN,
|
||||
GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT,
|
||||
GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT,
|
||||
GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT,
|
||||
GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_LEFT,
|
||||
GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_RIGHT,
|
||||
GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_RIGHT,
|
||||
GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT_EXPANDED,
|
||||
GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_LEFT_EXPANDED,
|
||||
GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_RIGHT_EXPANDED,
|
||||
GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_RIGHT_EXPANDED,
|
||||
GTK_CSS_IMAGE_BUILTIN_PANE_SEPARATOR,
|
||||
GTK_CSS_IMAGE_BUILTIN_HANDLE,
|
||||
GTK_CSS_IMAGE_BUILTIN_SPINNER
|
||||
} GtkCssImageBuiltinType;
|
||||
|
||||
typedef enum /*< skip >*/ {
|
||||
GTK_CSS_AREA_BORDER_BOX,
|
||||
GTK_CSS_AREA_PADDING_BOX,
|
||||
|
@@ -82,6 +82,7 @@ gtk_css_value_unset_print (const GtkCssValue *value,
|
||||
}
|
||||
|
||||
static const GtkCssValueClass GTK_CSS_VALUE_UNSET = {
|
||||
"GtkCssUnsetValue",
|
||||
gtk_css_value_unset_free,
|
||||
gtk_css_value_unset_compute,
|
||||
gtk_css_value_unset_equal,
|
||||
|
@@ -29,6 +29,47 @@ struct _GtkCssValue {
|
||||
|
||||
G_DEFINE_BOXED_TYPE (GtkCssValue, _gtk_css_value, _gtk_css_value_ref, _gtk_css_value_unref)
|
||||
|
||||
static GHashTable *counters;
|
||||
|
||||
static void
|
||||
dump_value_counts (void)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gpointer key;
|
||||
gpointer value;
|
||||
|
||||
g_hash_table_iter_init (&iter, counters);
|
||||
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||
{
|
||||
const char *class = key;
|
||||
int *c = value;
|
||||
g_print ("%d %d %s\n", c[0], c[0] - c[1], class);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
count_value (const char *class, int delta)
|
||||
{
|
||||
int *c;
|
||||
|
||||
if (!counters)
|
||||
{
|
||||
counters = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
atexit (dump_value_counts);
|
||||
}
|
||||
c = g_hash_table_lookup (counters, class);
|
||||
if (!c)
|
||||
{
|
||||
c = g_new0 (int, 2);
|
||||
g_hash_table_insert (counters, (gpointer)class, c);
|
||||
}
|
||||
|
||||
if (delta == 1)
|
||||
c[0]++;
|
||||
else
|
||||
c[1]++;
|
||||
}
|
||||
|
||||
GtkCssValue *
|
||||
_gtk_css_value_alloc (const GtkCssValueClass *klass,
|
||||
gsize size)
|
||||
@@ -39,6 +80,9 @@ _gtk_css_value_alloc (const GtkCssValueClass *klass,
|
||||
|
||||
value->class = klass;
|
||||
value->ref_count = 1;
|
||||
value->is_static = FALSE;
|
||||
|
||||
count_value (klass->type_name, 1);
|
||||
|
||||
return value;
|
||||
}
|
||||
@@ -63,6 +107,8 @@ gtk_css_value_unref (GtkCssValue *value)
|
||||
if (value->ref_count > 0)
|
||||
return;
|
||||
|
||||
count_value (value->class->type_name, -1);
|
||||
|
||||
value->class->free (value);
|
||||
}
|
||||
|
||||
@@ -88,7 +134,10 @@ _gtk_css_value_compute (GtkCssValue *value,
|
||||
GtkCssStyle *style,
|
||||
GtkCssStyle *parent_style)
|
||||
{
|
||||
return value->class->compute (value, property_id, provider, style, parent_style);
|
||||
if (value->is_static)
|
||||
return _gtk_css_value_ref (value);
|
||||
else
|
||||
return value->class->compute (value, property_id, provider, style, parent_style);
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
@@ -37,9 +37,11 @@ typedef struct _GtkCssValueClass GtkCssValueClass;
|
||||
/* using define instead of struct here so compilers get the packing right */
|
||||
#define GTK_CSS_VALUE_BASE \
|
||||
const GtkCssValueClass *class; \
|
||||
gint ref_count;
|
||||
gint ref_count; \
|
||||
gboolean is_static;
|
||||
|
||||
struct _GtkCssValueClass {
|
||||
const char *type_name;
|
||||
void (* free) (GtkCssValue *value);
|
||||
|
||||
GtkCssValue * (* compute) (GtkCssValue *value,
|
||||
|
1425
gtk/gtkdnd.c
Normal file
1425
gtk/gtkdnd.c
Normal file
File diff suppressed because it is too large
Load Diff
102
gtk/gtkdnd.h
Normal file
102
gtk/gtkdnd.h
Normal file
@@ -0,0 +1,102 @@
|
||||
/* -*- Mode: C; c-file-style: "gnu"; tab-width: 8 -*- */
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
||||
* file for a list of people on the GTK+ Team. See the ChangeLog
|
||||
* files for a list of changes. These files are distributed with
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_DND_H__
|
||||
#define __GTK_DND_H__
|
||||
|
||||
|
||||
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/gtkwidget.h>
|
||||
#include <gtk/gtkselection.h>
|
||||
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/* Destination side */
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_get_data (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GdkAtom target);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkWidget *gtk_drag_get_source_widget (GdkDrag *drag);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_highlight (GtkWidget *widget);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_unhighlight (GtkWidget *widget);
|
||||
|
||||
/* Source side */
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkDrag *gtk_drag_begin (GtkWidget *widget,
|
||||
GdkDevice *device,
|
||||
GdkContentFormats *targets,
|
||||
GdkDragAction actions,
|
||||
gint x,
|
||||
gint y);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_cancel (GdkDrag *drag);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_set_icon_widget (GdkDrag *drag,
|
||||
GtkWidget *widget,
|
||||
gint hot_x,
|
||||
gint hot_y);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_set_icon_paintable (GdkDrag *drag,
|
||||
GdkPaintable *paintable,
|
||||
int hot_x,
|
||||
int hot_y);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_set_icon_name (GdkDrag *drag,
|
||||
const gchar *icon_name,
|
||||
gint hot_x,
|
||||
gint hot_y);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_set_icon_gicon (GdkDrag *drag,
|
||||
GIcon *icon,
|
||||
gint hot_x,
|
||||
gint hot_y);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_set_icon_default (GdkDrag *drag);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_drag_check_threshold (GtkWidget *widget,
|
||||
gint start_x,
|
||||
gint start_y,
|
||||
gint current_x,
|
||||
gint current_y);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_DND_H__ */
|
59
gtk/gtkdndprivate.h
Normal file
59
gtk/gtkdndprivate.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/* -*- Mode: C; c-file-style: "gnu"; tab-width: 8 -*- */
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 2015 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/>.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_DND_PRIVATE_H__
|
||||
#define __GTK_DND_PRIVATE_H__
|
||||
|
||||
#include "gtkdnd.h"
|
||||
|
||||
#include "gtkdragdest.h"
|
||||
#include "gtkimagedefinitionprivate.h"
|
||||
#include "gtkselection.h"
|
||||
#include "gtkwidget.h"
|
||||
|
||||
typedef struct _GtkDragDestSite GtkDragDestSite;
|
||||
struct _GtkDragDestSite
|
||||
{
|
||||
GtkDestDefaults flags;
|
||||
GdkContentFormats *target_list;
|
||||
GdkDragAction actions;
|
||||
guint do_proxy : 1;
|
||||
guint proxy_coords : 1;
|
||||
guint have_drag : 1;
|
||||
guint track_motion : 1;
|
||||
};
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
GdkDrag * gtk_drag_begin_internal (GtkWidget *widget,
|
||||
GdkDevice *device,
|
||||
GtkImageDefinition *icon,
|
||||
GdkContentFormats *target_list,
|
||||
GdkDragAction actions,
|
||||
int x,
|
||||
int y);
|
||||
void gtk_drag_set_icon_definition (GdkDrag *drag,
|
||||
GtkImageDefinition *def,
|
||||
gint hot_x,
|
||||
gint hot_y);
|
||||
void _gtk_drag_dest_handle_event (GtkWidget *toplevel,
|
||||
GdkEvent *event);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_DND_PRIVATE_H__ */
|
1278
gtk/gtkdragdest.c
1278
gtk/gtkdragdest.c
File diff suppressed because it is too large
Load Diff
@@ -37,58 +37,65 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _GtkDropTarget GtkDropTarget;
|
||||
|
||||
|
||||
#define GTK_TYPE_DROP_TARGET (gtk_drop_target_get_type ())
|
||||
#define GTK_DROP_TARGET(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GTK_TYPE_DROP_TARGET, GtkDropTarget))
|
||||
#define GTK_DROP_TARGET_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GTK_TYPE_DROP_TARGET, GtkDropTargetClass))
|
||||
#define GTK_IS_DROP_TARGET(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTK_TYPE_DROP_TARGET))
|
||||
#define GTK_IS_DROP_TARGET_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GTK_TYPE_DROP_TARGET))
|
||||
#define GTK_DROP_TARGET_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GTK_TYPE_DROP_TARGET, GtkDropTargetClass))
|
||||
|
||||
typedef struct _GtkDropTargetClass GtkDropTargetClass;
|
||||
/**
|
||||
* GtkDestDefaults:
|
||||
* @GTK_DEST_DEFAULT_MOTION: If set for a widget, GTK+, during a drag over this
|
||||
* widget will check if the drag matches this widget’s list of possible formats
|
||||
* and actions.
|
||||
* GTK+ will then call gdk_drag_status() as appropriate.
|
||||
* @GTK_DEST_DEFAULT_HIGHLIGHT: If set for a widget, GTK+ will draw a highlight on
|
||||
* this widget as long as a drag is over this widget and the widget drag format
|
||||
* and action are acceptable.
|
||||
* @GTK_DEST_DEFAULT_DROP: If set for a widget, when a drop occurs, GTK+ will
|
||||
* will check if the drag matches this widget’s list of possible formats and
|
||||
* actions. If so, GTK+ will call gtk_drag_get_data() on behalf of the widget.
|
||||
* Whether or not the drop is successful, GTK+ will call gdk_drag_finish(). If
|
||||
* the action was a move, then if the drag was successful, then %TRUE will be
|
||||
* passed for the @delete parameter to gdk_drag_finish().
|
||||
* @GTK_DEST_DEFAULT_ALL: If set, specifies that all default actions should
|
||||
* be taken.
|
||||
*
|
||||
* The #GtkDestDefaults enumeration specifies the various
|
||||
* types of action that will be taken on behalf
|
||||
* of the user for a drag destination site.
|
||||
*/
|
||||
typedef enum {
|
||||
GTK_DEST_DEFAULT_MOTION = 1 << 0,
|
||||
GTK_DEST_DEFAULT_HIGHLIGHT = 1 << 1,
|
||||
GTK_DEST_DEFAULT_DROP = 1 << 2,
|
||||
GTK_DEST_DEFAULT_ALL = 0x07
|
||||
} GtkDestDefaults;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_drop_target_get_type (void) G_GNUC_CONST;
|
||||
void gtk_drag_dest_set (GtkWidget *widget,
|
||||
GtkDestDefaults flags,
|
||||
GdkContentFormats *targets,
|
||||
GdkDragAction actions);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkDropTarget *gtk_drop_target_new (GdkContentFormats *formats,
|
||||
GdkDragAction actions);
|
||||
void gtk_drag_dest_unset (GtkWidget *widget);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drop_target_set_formats (GtkDropTarget *dest,
|
||||
GdkContentFormats *formats);
|
||||
const char * gtk_drag_dest_find_target (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GdkContentFormats *target_list);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkContentFormats *gtk_drop_target_get_formats (GtkDropTarget *dest);
|
||||
GdkContentFormats* gtk_drag_dest_get_target_list (GtkWidget *widget);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_dest_set_target_list (GtkWidget *widget,
|
||||
GdkContentFormats *target_list);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_dest_add_text_targets (GtkWidget *widget);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_dest_add_image_targets (GtkWidget *widget);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_dest_add_uri_targets (GtkWidget *widget);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drop_target_set_actions (GtkDropTarget *dest,
|
||||
GdkDragAction actions);
|
||||
void gtk_drag_dest_set_track_motion (GtkWidget *widget,
|
||||
gboolean track_motion);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkDragAction gtk_drop_target_get_actions (GtkDropTarget *dest);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkDrop *gtk_drop_target_get_drop (GtkDropTarget *dest);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
const char *gtk_drop_target_find_mimetype (GtkDropTarget *dest);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drop_target_read_selection (GtkDropTarget *dest,
|
||||
GdkAtom target,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkSelectionData *gtk_drop_target_read_selection_finish
|
||||
(GtkDropTarget *dest,
|
||||
GAsyncResult *result,
|
||||
GError **error);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drop_target_deny_drop (GtkDropTarget *dest,
|
||||
GdkDrop *drop);
|
||||
gboolean gtk_drag_dest_get_track_motion (GtkWidget *widget);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
@@ -1,32 +0,0 @@
|
||||
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 2020 Matthias Clasen
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_DRAG_DEST_PRIVATE_H__
|
||||
#define __GTK_DRAG_DEST_PRIVATE_H__
|
||||
|
||||
#include "gtkdragdest.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
||||
void gtk_drag_dest_handle_event (GtkWidget *toplevel,
|
||||
GdkEvent *event);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif
|
@@ -23,25 +23,8 @@
|
||||
#include "gtkintl.h"
|
||||
#include "gtkwidgetprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
#include "gtknativeprivate.h"
|
||||
#include "gtkpicture.h"
|
||||
|
||||
|
||||
/**
|
||||
* SECTION:gtkdragicon
|
||||
* @Short_description: A toplevel to use as drag icon
|
||||
* @Title: GtkDragIcon
|
||||
*
|
||||
* GtkDragIcon is a #GtkNative implementation with the sole purpose
|
||||
* to serve as a drag icon during DND operations. A drag icon moves
|
||||
* with the pointer during a drag operation and is destroyed when
|
||||
* the drag ends.
|
||||
*
|
||||
* To set up a drag icon and associate it with an ongoing drag operation,
|
||||
* use gtk_drag_icon_set_from_paintable(). It is also possible to create
|
||||
* a GtkDragIcon with gtk_drag_icon_new_for_drag(() and populate it
|
||||
* with widgets yourself.
|
||||
*/
|
||||
struct _GtkDragIcon
|
||||
{
|
||||
GtkWidget parent_instance;
|
||||
@@ -391,63 +374,6 @@ gtk_drag_icon_new (void)
|
||||
return g_object_new (GTK_TYPE_DRAG_ICON, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_drag_icon_new_for_drag:
|
||||
* @drag: a #GtkDrag
|
||||
*
|
||||
* Creates a #GtkDragIcon and associates it with the drag operation.
|
||||
*
|
||||
* Returns: the new #GtkDragIcon
|
||||
*/
|
||||
GtkWidget *
|
||||
gtk_drag_icon_new_for_drag (GdkDrag *drag)
|
||||
{
|
||||
GtkWidget *icon;
|
||||
|
||||
g_return_val_if_fail (GDK_IS_DRAG (drag), NULL);
|
||||
|
||||
icon = g_object_new (GTK_TYPE_DRAG_ICON, NULL);
|
||||
|
||||
gtk_drag_icon_set_surface (GTK_DRAG_ICON (icon), gdk_drag_get_drag_surface (drag));
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_drag_icon_set_from_paintable:
|
||||
* @drag: a #GdkDrag
|
||||
* @paintable: a #GdkPaintable to display
|
||||
* @hot_x: X coordinate of the hotspot
|
||||
* @hot_y: Y coordinate of the hotspot
|
||||
*
|
||||
* Creates a #GtkDragIcon that shows @paintable, and associates
|
||||
* it with the drag operation. The hotspot position on the paintable
|
||||
* is aligned with the hotspot of the cursor.
|
||||
*/
|
||||
void
|
||||
gtk_drag_icon_set_from_paintable (GdkDrag *drag,
|
||||
GdkPaintable *paintable,
|
||||
int hot_x,
|
||||
int hot_y)
|
||||
{
|
||||
GtkWidget *icon;
|
||||
GtkWidget *picture;
|
||||
|
||||
gdk_drag_set_hotspot (drag, hot_x, hot_y);
|
||||
|
||||
icon = gtk_drag_icon_new_for_drag (drag);
|
||||
|
||||
picture = gtk_picture_new_for_paintable (paintable);
|
||||
gtk_picture_set_can_shrink (GTK_PICTURE (picture), FALSE);
|
||||
gtk_container_add (GTK_CONTAINER (icon), picture);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (drag),
|
||||
"icon",
|
||||
g_object_ref_sink (icon),
|
||||
(GDestroyNotify)gtk_widget_destroy);
|
||||
gtk_widget_show (icon);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_drag_icon_set_surface (GtkDragIcon *icon,
|
||||
GdkSurface *surface)
|
||||
|
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2020 Matthias Clasen
|
||||
*
|
||||
* 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: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __GTK_DRAG_ICON_H__
|
||||
#define __GTK_DRAG_ICON_H__
|
||||
|
||||
|
||||
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <gtk/gtkwidget.h>
|
||||
#include <gtk/gtkcontainer.h>
|
||||
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_DRAG_ICON (gtk_drag_icon_get_type ())
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
G_DECLARE_FINAL_TYPE (GtkDragIcon, gtk_drag_icon, GTK, DRAG_ICON, GtkContainer)
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkWidget * gtk_drag_icon_new_for_drag (GdkDrag *drag);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_icon_set_from_paintable (GdkDrag *drag,
|
||||
GdkPaintable *paintable,
|
||||
int hot_x,
|
||||
int hot_y);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
#endif /* __GTK_DRAG_ICON_H__ */
|
@@ -26,10 +26,14 @@
|
||||
#define __GTK_DRAG_ICON_PRIVATE_H__
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <gtk/gtkdragicon.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_DRAG_ICON (gtk_drag_icon_get_type ())
|
||||
|
||||
G_DECLARE_FINAL_TYPE (GtkDragIcon, gtk_drag_icon, GTK, DRAG_ICON, GtkContainer)
|
||||
|
||||
GtkWidget * gtk_drag_icon_new (void);
|
||||
|
||||
void gtk_drag_icon_set_surface (GtkDragIcon *icon,
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -37,51 +37,36 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_DRAG_SOURCE (gtk_drag_source_get_type ())
|
||||
#define GTK_DRAG_SOURCE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GTK_TYPE_DRAG_SOURCE, GtkDragSource))
|
||||
#define GTK_DRAG_SOURCE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GTK_TYPE_DRAG_SOURCE, GtkDragSourceClass))
|
||||
#define GTK_IS_DRAG_SOURCE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTK_TYPE_DRAG_SOURCE))
|
||||
#define GTK_IS_DRAG_SOURCE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GTK_TYPE_DRAG_SOURCE))
|
||||
#define GTK_DRAG_SOURCE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GTK_TYPE_DRAG_SOURCE, GtkDragSourceClass))
|
||||
|
||||
typedef struct _GtkDragSource GtkDragSource;
|
||||
typedef struct _GtkDragSourceClass GtkDragSourceClass;
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_source_set (GtkWidget *widget,
|
||||
GdkModifierType start_button_mask,
|
||||
GdkContentFormats *targets,
|
||||
GdkDragAction actions);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_drag_source_get_type (void) G_GNUC_CONST;
|
||||
void gtk_drag_source_unset (GtkWidget *widget);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkDragSource *gtk_drag_source_new (void);
|
||||
GdkContentFormats * gtk_drag_source_get_target_list (GtkWidget *widget);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_source_set_target_list (GtkWidget *widget,
|
||||
GdkContentFormats *target_list);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_source_add_text_targets (GtkWidget *widget);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_source_add_image_targets (GtkWidget *widget);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_source_add_uri_targets (GtkWidget *widget);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_source_set_content (GtkDragSource *source,
|
||||
GdkContentProvider *content);
|
||||
void gtk_drag_source_set_icon_name (GtkWidget *widget,
|
||||
const gchar *icon_name);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkContentProvider *gtk_drag_source_get_content (GtkDragSource *source);
|
||||
|
||||
void gtk_drag_source_set_icon_gicon (GtkWidget *widget,
|
||||
GIcon *icon);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_source_set_actions (GtkDragSource *source,
|
||||
GdkDragAction actions);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkDragAction gtk_drag_source_get_actions (GtkDragSource *source);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_source_set_icon (GtkDragSource *source,
|
||||
GdkPaintable *paintable,
|
||||
int hot_x,
|
||||
int hot_y);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_drag_source_drag_cancel (GtkDragSource *source);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkDrag * gtk_drag_source_get_drag (GtkDragSource *source);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_drag_check_threshold (GtkWidget *widget,
|
||||
int start_x,
|
||||
int start_y,
|
||||
int current_x,
|
||||
int current_y);
|
||||
void gtk_drag_source_set_icon_paintable (GtkWidget *widget,
|
||||
GdkPaintable *paintable);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
@@ -411,9 +411,9 @@ gtk_drawing_area_get_content_height (GtkDrawingArea *self)
|
||||
/**
|
||||
* gtk_drawing_area_set_draw_func:
|
||||
* @self: a #GtkDrawingArea
|
||||
* @draw_func: (allow-none): callback that lets you draw
|
||||
* @draw_func: (closure user_data) (allow-none): callback that lets you draw
|
||||
* the drawing area's contents
|
||||
* @user_data: (closure): user data passed to @draw_func
|
||||
* @user_data: user data passed to @draw_func
|
||||
* @destroy: destroy notifier for @user_data
|
||||
*
|
||||
* Setting a draw function is the main thing you want to do when using a drawing
|
||||
|
@@ -38,6 +38,8 @@
|
||||
#include "gtkcelllayout.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
#include "gtkdebug.h"
|
||||
#include "gtkdnd.h"
|
||||
#include "gtkdndprivate.h"
|
||||
#include "gtkeditable.h"
|
||||
#include "gtkemojichooser.h"
|
||||
#include "gtkemojicompletion.h"
|
||||
@@ -68,9 +70,6 @@
|
||||
#include "gtkwindow.h"
|
||||
#include "gtknative.h"
|
||||
#include "gtkgestureclick.h"
|
||||
#include "gtkdragsource.h"
|
||||
#include "gtkdragicon.h"
|
||||
#include "gtkwidgetpaintable.h"
|
||||
|
||||
#include "a11y/gtkentryaccessible.h"
|
||||
|
||||
@@ -173,7 +172,7 @@ struct _EntryIconInfo
|
||||
guint in_drag : 1;
|
||||
|
||||
GdkDragAction actions;
|
||||
GdkContentProvider *content;
|
||||
GdkContentFormats *target_list;
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -1321,7 +1320,8 @@ gtk_entry_finalize (GObject *object)
|
||||
if (icon_info == NULL)
|
||||
continue;
|
||||
|
||||
g_clear_object (&icon_info->content);
|
||||
if (icon_info->target_list != NULL)
|
||||
gdk_content_formats_unref (icon_info->target_list);
|
||||
|
||||
gtk_widget_unparent (icon_info->widget);
|
||||
|
||||
@@ -1462,25 +1462,17 @@ icon_drag_update_cb (GtkGestureDrag *gesture,
|
||||
pos = get_icon_position_from_controller (entry, GTK_EVENT_CONTROLLER (gesture));
|
||||
icon_info = priv->icons[pos];
|
||||
|
||||
if (icon_info->content != NULL &&
|
||||
gtk_drag_check_threshold (icon_info->widget, start_x, start_y, x, y))
|
||||
if (icon_info->target_list != NULL &&
|
||||
gtk_drag_check_threshold (icon_info->widget,
|
||||
start_x, start_y,
|
||||
x, y))
|
||||
{
|
||||
GdkPaintable *paintable;
|
||||
GdkSurface *surface;
|
||||
GdkDevice *device;
|
||||
GdkDrag *drag;
|
||||
|
||||
icon_info->in_drag = TRUE;
|
||||
|
||||
surface = gtk_native_get_surface (gtk_widget_get_native (GTK_WIDGET (entry)));
|
||||
device = gtk_gesture_get_device (GTK_GESTURE (gesture));
|
||||
|
||||
drag = gdk_drag_begin (surface, device, icon_info->content, icon_info->actions, start_x, start_y);
|
||||
paintable = gtk_widget_paintable_new (icon_info->widget);
|
||||
gtk_drag_icon_set_from_paintable (drag, paintable, -2, -2);
|
||||
g_object_unref (paintable);
|
||||
|
||||
g_object_unref (drag);
|
||||
gtk_drag_begin (GTK_WIDGET (entry),
|
||||
gtk_gesture_get_device (GTK_GESTURE (gesture)),
|
||||
icon_info->target_list,
|
||||
icon_info->actions,
|
||||
start_x, start_y);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2730,7 +2722,7 @@ gtk_entry_get_icon_at_pos (GtkEntry *entry,
|
||||
* gtk_entry_set_icon_drag_source:
|
||||
* @entry: a #GtkEntry
|
||||
* @icon_pos: icon position
|
||||
* @provider: a #GdkContentProvider
|
||||
* @formats: the targets (data formats) in which the data can be provided
|
||||
* @actions: a bitmask of the allowed drag actions
|
||||
*
|
||||
* Sets up the icon at the given position so that GTK+ will start a drag
|
||||
@@ -2750,7 +2742,7 @@ gtk_entry_get_icon_at_pos (GtkEntry *entry,
|
||||
void
|
||||
gtk_entry_set_icon_drag_source (GtkEntry *entry,
|
||||
GtkEntryIconPosition icon_pos,
|
||||
GdkContentProvider *provider,
|
||||
GdkContentFormats *formats,
|
||||
GdkDragAction actions)
|
||||
{
|
||||
GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
|
||||
@@ -2762,7 +2754,12 @@ gtk_entry_set_icon_drag_source (GtkEntry *entry,
|
||||
if ((icon_info = priv->icons[icon_pos]) == NULL)
|
||||
icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos);
|
||||
|
||||
g_set_object (&icon_info->content, provider);
|
||||
if (icon_info->target_list)
|
||||
gdk_content_formats_unref (icon_info->target_list);
|
||||
icon_info->target_list = formats;
|
||||
if (icon_info->target_list)
|
||||
gdk_content_formats_ref (icon_info->target_list);
|
||||
|
||||
icon_info->actions = actions;
|
||||
}
|
||||
|
||||
|
@@ -266,7 +266,7 @@ gchar * gtk_entry_get_icon_tooltip_markup (GtkEntry *
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_entry_set_icon_drag_source (GtkEntry *entry,
|
||||
GtkEntryIconPosition icon_pos,
|
||||
GdkContentProvider *provider,
|
||||
GdkContentFormats *formats,
|
||||
GdkDragAction actions);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gint gtk_entry_get_current_icon_drag_source (GtkEntry *entry);
|
||||
|
@@ -693,6 +693,31 @@ typedef enum
|
||||
GTK_TREE_VIEW_GRID_LINES_BOTH
|
||||
} GtkTreeViewGridLines;
|
||||
|
||||
/**
|
||||
* GtkDragResult:
|
||||
* @GTK_DRAG_RESULT_SUCCESS: The drag operation was successful.
|
||||
* @GTK_DRAG_RESULT_NO_TARGET: No suitable drag target.
|
||||
* @GTK_DRAG_RESULT_USER_CANCELLED: The user cancelled the drag operation.
|
||||
* @GTK_DRAG_RESULT_TIMEOUT_EXPIRED: The drag operation timed out.
|
||||
* @GTK_DRAG_RESULT_GRAB_BROKEN: The pointer or keyboard grab used
|
||||
* for the drag operation was broken.
|
||||
* @GTK_DRAG_RESULT_ERROR: The drag operation failed due to some
|
||||
* unspecified error.
|
||||
*
|
||||
* Gives an indication why a drag operation failed.
|
||||
* The value can by obtained by connecting to the
|
||||
* #GtkWidget::drag-failed signal.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
GTK_DRAG_RESULT_SUCCESS,
|
||||
GTK_DRAG_RESULT_NO_TARGET,
|
||||
GTK_DRAG_RESULT_USER_CANCELLED,
|
||||
GTK_DRAG_RESULT_TIMEOUT_EXPIRED,
|
||||
GTK_DRAG_RESULT_GRAB_BROKEN,
|
||||
GTK_DRAG_RESULT_ERROR
|
||||
} GtkDragResult;
|
||||
|
||||
/**
|
||||
* GtkSizeGroupMode:
|
||||
* @GTK_SIZE_GROUP_NONE: group has no effect
|
||||
|
@@ -115,6 +115,7 @@
|
||||
#include "gtkbox.h"
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkcontainerprivate.h"
|
||||
#include "gtkdnd.h"
|
||||
#include "gtkdragdest.h"
|
||||
#include "gtkiconprivate.h"
|
||||
#include "gtkgestureclick.h"
|
||||
@@ -192,12 +193,12 @@ static void gtk_expander_size_allocate (GtkWidget *widget,
|
||||
int baseline);
|
||||
static gboolean gtk_expander_focus (GtkWidget *widget,
|
||||
GtkDirectionType direction);
|
||||
static gboolean gtk_expander_drag_accept (GtkDropTarget *dest,
|
||||
static gboolean gtk_expander_drag_motion (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GtkExpander *expander);
|
||||
static void gtk_expander_drag_leave (GtkDropTarget *dest,
|
||||
GdkDrop *drop,
|
||||
GtkExpander *expander);
|
||||
gint x,
|
||||
gint y);
|
||||
static void gtk_expander_drag_leave (GtkWidget *widget,
|
||||
GdkDrop *drop);
|
||||
|
||||
static void gtk_expander_add (GtkContainer *container,
|
||||
GtkWidget *widget);
|
||||
@@ -267,6 +268,8 @@ gtk_expander_class_init (GtkExpanderClass *klass)
|
||||
widget_class->destroy = gtk_expander_destroy;
|
||||
widget_class->size_allocate = gtk_expander_size_allocate;
|
||||
widget_class->focus = gtk_expander_focus;
|
||||
widget_class->drag_motion = gtk_expander_drag_motion;
|
||||
widget_class->drag_leave = gtk_expander_drag_leave;
|
||||
widget_class->measure = gtk_expander_measure;
|
||||
|
||||
container_class->add = gtk_expander_add;
|
||||
@@ -347,8 +350,6 @@ gtk_expander_init (GtkExpander *expander)
|
||||
{
|
||||
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
|
||||
GtkGesture *gesture;
|
||||
GtkDropTarget *dest;
|
||||
GdkContentFormats *formats;
|
||||
|
||||
gtk_widget_set_can_focus (GTK_WIDGET (expander), TRUE);
|
||||
|
||||
@@ -374,12 +375,8 @@ gtk_expander_init (GtkExpander *expander)
|
||||
GTK_STYLE_CLASS_HORIZONTAL);
|
||||
gtk_container_add (GTK_CONTAINER (priv->title_widget), priv->arrow_widget);
|
||||
|
||||
formats = gdk_content_formats_new (NULL, 0);
|
||||
dest = gtk_drop_target_new (formats, 0);
|
||||
gdk_content_formats_unref (formats);
|
||||
g_signal_connect (dest, "accept", G_CALLBACK (gtk_expander_drag_accept), expander);
|
||||
g_signal_connect (dest, "drag-leave", G_CALLBACK (gtk_expander_drag_leave), expander);
|
||||
gtk_widget_add_controller (GTK_WIDGET (expander), GTK_EVENT_CONTROLLER (dest));
|
||||
gtk_drag_dest_set (GTK_WIDGET (expander), 0, NULL, 0);
|
||||
gtk_drag_dest_set_track_motion (GTK_WIDGET (expander), TRUE);
|
||||
|
||||
gesture = gtk_gesture_click_new ();
|
||||
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture),
|
||||
@@ -547,10 +544,12 @@ expand_timeout (gpointer data)
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_expander_drag_accept (GtkDropTarget *dest,
|
||||
GdkDrop *drop,
|
||||
GtkExpander *expander)
|
||||
gtk_expander_drag_motion (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
GtkExpander *expander = GTK_EXPANDER (widget);
|
||||
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
|
||||
|
||||
if (!priv->expanded && !priv->expand_timer)
|
||||
@@ -563,10 +562,10 @@ gtk_expander_drag_accept (GtkDropTarget *dest,
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_expander_drag_leave (GtkDropTarget *dest,
|
||||
GdkDrop *drop,
|
||||
GtkExpander *expander)
|
||||
gtk_expander_drag_leave (GtkWidget *widget,
|
||||
GdkDrop *drop)
|
||||
{
|
||||
GtkExpander *expander = GTK_EXPANDER (widget);
|
||||
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
|
||||
|
||||
if (priv->expand_timer)
|
||||
|
@@ -37,6 +37,7 @@
|
||||
#include "gtkcellrendererpixbuf.h"
|
||||
#include "gtkcombobox.h"
|
||||
#include "gtkcssiconthemevalueprivate.h"
|
||||
#include "gtkdnd.h"
|
||||
#include "gtkdragdest.h"
|
||||
#include "gtkicontheme.h"
|
||||
#include "gtkimage.h"
|
||||
@@ -60,7 +61,6 @@
|
||||
#include "gtksettings.h"
|
||||
#include "gtkstylecontextprivate.h"
|
||||
#include "gtkbitmaskprivate.h"
|
||||
#include "gtkeventcontroller.h"
|
||||
|
||||
/**
|
||||
* SECTION:gtkfilechooserbutton
|
||||
@@ -267,11 +267,9 @@ static void gtk_file_chooser_button_finalize (GObject *ob
|
||||
|
||||
/* GtkWidget Functions */
|
||||
static void gtk_file_chooser_button_destroy (GtkWidget *widget);
|
||||
static gboolean gtk_file_chooser_button_drag_drop (GtkDropTarget *dest,
|
||||
GdkDrop *drop,
|
||||
int x,
|
||||
int y,
|
||||
GtkWidget *widget);
|
||||
static void gtk_file_chooser_button_drag_data_received (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GtkSelectionData *data);
|
||||
static void gtk_file_chooser_button_show (GtkWidget *widget);
|
||||
static void gtk_file_chooser_button_hide (GtkWidget *widget);
|
||||
static void gtk_file_chooser_button_root (GtkWidget *widget);
|
||||
@@ -368,6 +366,7 @@ gtk_file_chooser_button_class_init (GtkFileChooserButtonClass * class)
|
||||
gobject_class->finalize = gtk_file_chooser_button_finalize;
|
||||
|
||||
widget_class->destroy = gtk_file_chooser_button_destroy;
|
||||
widget_class->drag_data_received = gtk_file_chooser_button_drag_data_received;
|
||||
widget_class->show = gtk_file_chooser_button_show;
|
||||
widget_class->hide = gtk_file_chooser_button_hide;
|
||||
widget_class->map = gtk_file_chooser_button_map;
|
||||
@@ -444,9 +443,7 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button)
|
||||
GtkFileChooserButtonPrivate *priv = gtk_file_chooser_button_get_instance_private (button);
|
||||
GtkWidget *box;
|
||||
GtkWidget *icon;
|
||||
GdkContentFormatsBuilder *builder;
|
||||
GdkContentFormats *target_list;
|
||||
GtkDropTarget *dest;
|
||||
|
||||
priv->button = gtk_button_new ();
|
||||
g_signal_connect (priv->button, "clicked", G_CALLBACK (button_clicked_cb), button);
|
||||
@@ -498,13 +495,13 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button)
|
||||
NULL, NULL);
|
||||
|
||||
/* DnD */
|
||||
builder = gdk_content_formats_builder_new ();
|
||||
gdk_content_formats_builder_add_gtype (builder, G_TYPE_STRING);
|
||||
gdk_content_formats_builder_add_gtype (builder, GDK_TYPE_FILE_LIST);
|
||||
target_list = gdk_content_formats_builder_free_to_formats (builder);
|
||||
dest = gtk_drop_target_new (target_list, GDK_ACTION_COPY);
|
||||
g_signal_connect (dest, "drag-drop", G_CALLBACK (gtk_file_chooser_button_drag_drop), button);
|
||||
gtk_widget_add_controller (GTK_WIDGET (button), GTK_EVENT_CONTROLLER (dest));
|
||||
target_list = gdk_content_formats_new (NULL, 0);
|
||||
target_list = gtk_content_formats_add_uri_targets (target_list);
|
||||
target_list = gtk_content_formats_add_text_targets (target_list);
|
||||
gtk_drag_dest_set (GTK_WIDGET (button),
|
||||
(GTK_DEST_DEFAULT_ALL),
|
||||
target_list,
|
||||
GDK_ACTION_COPY);
|
||||
gdk_content_formats_unref (target_list);
|
||||
}
|
||||
|
||||
@@ -1149,91 +1146,62 @@ dnd_select_folder_get_info_cb (GCancellable *cancellable,
|
||||
}
|
||||
|
||||
static void
|
||||
dnd_select_file (GtkFileChooserButton *button,
|
||||
GFile *file)
|
||||
gtk_file_chooser_button_drag_data_received (GtkWidget *widget,
|
||||
GdkDrop *drop,
|
||||
GtkSelectionData *data)
|
||||
{
|
||||
GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget);
|
||||
GtkFileChooserButtonPrivate *priv = gtk_file_chooser_button_get_instance_private (button);
|
||||
struct DndSelectFolderData *info;
|
||||
GFile *file;
|
||||
gchar *text;
|
||||
|
||||
info = g_new0 (struct DndSelectFolderData, 1);
|
||||
info->button = g_object_ref (button);
|
||||
info->i = 0;
|
||||
info->uris = g_new0 (char *, 2);
|
||||
info->selected = FALSE;
|
||||
info->file_system = priv->fs;
|
||||
g_object_get (priv->chooser, "action", &info->action, NULL);
|
||||
if (GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->drag_data_received != NULL)
|
||||
GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->drag_data_received (widget,
|
||||
drop,
|
||||
data);
|
||||
|
||||
info->file = g_object_ref (file);
|
||||
if (widget == NULL || gtk_selection_data_get_length (data) < 0)
|
||||
return;
|
||||
|
||||
if (priv->dnd_select_folder_cancellable)
|
||||
g_cancellable_cancel (priv->dnd_select_folder_cancellable);
|
||||
|
||||
priv->dnd_select_folder_cancellable =
|
||||
_gtk_file_system_get_info (priv->fs, info->file,
|
||||
"standard::type",
|
||||
dnd_select_folder_get_info_cb, info);
|
||||
}
|
||||
|
||||
static void
|
||||
got_file (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer data)
|
||||
{
|
||||
GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (data);
|
||||
GdkDrop *drop = GDK_DROP (source);
|
||||
const GValue *value;
|
||||
|
||||
value = gdk_drop_read_value_finish (drop, result, NULL);
|
||||
if (value)
|
||||
if (gtk_selection_data_targets_include_uri (data))
|
||||
{
|
||||
GFile *file;
|
||||
gchar **uris;
|
||||
struct DndSelectFolderData *info;
|
||||
|
||||
file = g_value_get_object (value);
|
||||
dnd_select_file (button, file);
|
||||
uris = gtk_selection_data_get_uris (data);
|
||||
|
||||
if (uris != NULL)
|
||||
{
|
||||
info = g_new0 (struct DndSelectFolderData, 1);
|
||||
info->button = g_object_ref (button);
|
||||
info->i = 0;
|
||||
info->uris = uris;
|
||||
info->selected = FALSE;
|
||||
info->file_system = priv->fs;
|
||||
g_object_get (priv->chooser, "action", &info->action, NULL);
|
||||
|
||||
info->file = g_file_new_for_uri (info->uris[info->i]);
|
||||
|
||||
if (priv->dnd_select_folder_cancellable)
|
||||
g_cancellable_cancel (priv->dnd_select_folder_cancellable);
|
||||
|
||||
priv->dnd_select_folder_cancellable =
|
||||
_gtk_file_system_get_info (priv->fs, info->file,
|
||||
"standard::type",
|
||||
dnd_select_folder_get_info_cb, info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
got_text (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer data)
|
||||
{
|
||||
GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (data);
|
||||
GdkDrop *drop = GDK_DROP (source);
|
||||
char *str;
|
||||
|
||||
str = gdk_drop_read_text_finish (drop, result, NULL);
|
||||
if (str)
|
||||
else if (gtk_selection_data_targets_include_text (data))
|
||||
{
|
||||
GFile *file;
|
||||
|
||||
file = g_file_new_for_uri (str);
|
||||
dnd_select_file (button, file);
|
||||
text = (char*) gtk_selection_data_get_text (data);
|
||||
file = g_file_new_for_uri (text);
|
||||
gtk_file_chooser_select_file (GTK_FILE_CHOOSER (priv->chooser), file, NULL);
|
||||
g_object_unref (file);
|
||||
g_free (text);
|
||||
g_signal_emit (button, file_chooser_button_signals[FILE_SET], 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_file_chooser_button_drag_drop (GtkDropTarget *dest,
|
||||
GdkDrop *drop,
|
||||
int x,
|
||||
int y,
|
||||
GtkWidget *button)
|
||||
{
|
||||
if (gdk_drop_has_value (drop, G_TYPE_FILE))
|
||||
{
|
||||
gdk_drop_read_value_async (drop, G_TYPE_FILE, G_PRIORITY_DEFAULT, NULL, got_file, button);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
gdk_drop_read_text_async (drop, NULL, got_text, button);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
||||
gdk_drop_finish (drop, GDK_ACTION_COPY);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user