Merge branch 'matthiasc/for-master' into 'master'

Matthiasc/for master

See merge request GNOME/gtk!1685
This commit is contained in:
Matthias Clasen 2020-04-14 14:07:54 +00:00
commit eb5b3083ff
5 changed files with 385 additions and 537 deletions

View File

@ -73,23 +73,10 @@
*/ */
typedef struct _GtkAppChooserWidgetClass GtkAppChooserWidgetClass; typedef struct _GtkAppChooserWidgetClass GtkAppChooserWidgetClass;
typedef struct _GtkAppChooserWidgetPrivate GtkAppChooserWidgetPrivate;
struct _GtkAppChooserWidget { struct _GtkAppChooserWidget {
GtkWidget parent_instance; GtkWidget parent_instance;
};
struct _GtkAppChooserWidgetClass {
GtkWidgetClass parent_class;
void (* application_selected) (GtkAppChooserWidget *self,
GAppInfo *app_info);
void (* application_activated) (GtkAppChooserWidget *self,
GAppInfo *app_info);
};
struct _GtkAppChooserWidgetPrivate {
GAppInfo *selected_app_info; GAppInfo *selected_app_info;
GtkWidget *overlay; GtkWidget *overlay;
@ -117,6 +104,16 @@ struct _GtkAppChooserWidgetPrivate {
GtkWidget *popup_menu; GtkWidget *popup_menu;
}; };
struct _GtkAppChooserWidgetClass {
GtkWidgetClass parent_class;
void (* application_selected) (GtkAppChooserWidget *self,
GAppInfo *app_info);
void (* application_activated) (GtkAppChooserWidget *self,
GAppInfo *app_info);
};
enum { enum {
COLUMN_APP_INFO, COLUMN_APP_INFO,
COLUMN_GICON, COLUMN_GICON,
@ -155,7 +152,6 @@ static guint signals[N_SIGNALS] = { 0, };
static void gtk_app_chooser_widget_iface_init (GtkAppChooserIface *iface); static void gtk_app_chooser_widget_iface_init (GtkAppChooserIface *iface);
G_DEFINE_TYPE_WITH_CODE (GtkAppChooserWidget, gtk_app_chooser_widget, GTK_TYPE_WIDGET, G_DEFINE_TYPE_WITH_CODE (GtkAppChooserWidget, gtk_app_chooser_widget, GTK_TYPE_WIDGET,
G_ADD_PRIVATE (GtkAppChooserWidget)
G_IMPLEMENT_INTERFACE (GTK_TYPE_APP_CHOOSER, G_IMPLEMENT_INTERFACE (GTK_TYPE_APP_CHOOSER,
gtk_app_chooser_widget_iface_init)); gtk_app_chooser_widget_iface_init));
@ -163,7 +159,6 @@ static void
refresh_and_emit_app_selected (GtkAppChooserWidget *self, refresh_and_emit_app_selected (GtkAppChooserWidget *self,
GtkTreeSelection *selection) GtkTreeSelection *selection)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
GtkTreeModel *model; GtkTreeModel *model;
GtkTreeIter iter; GtkTreeIter iter;
GAppInfo *info = NULL; GAppInfo *info = NULL;
@ -175,25 +170,25 @@ refresh_and_emit_app_selected (GtkAppChooserWidget *self,
if (info == NULL) if (info == NULL)
return; return;
if (priv->selected_app_info) if (self->selected_app_info)
{ {
if (!g_app_info_equal (priv->selected_app_info, info)) if (!g_app_info_equal (self->selected_app_info, info))
{ {
should_emit = TRUE; should_emit = TRUE;
g_set_object (&priv->selected_app_info, info); g_set_object (&self->selected_app_info, info);
} }
} }
else else
{ {
should_emit = TRUE; should_emit = TRUE;
g_set_object (&priv->selected_app_info, info); g_set_object (&self->selected_app_info, info);
} }
g_object_unref (info); g_object_unref (info);
if (should_emit) if (should_emit)
g_signal_emit (self, signals[SIGNAL_APPLICATION_SELECTED], 0, g_signal_emit (self, signals[SIGNAL_APPLICATION_SELECTED], 0,
priv->selected_app_info); self->selected_app_info);
} }
static gboolean static gboolean
@ -220,18 +215,17 @@ program_list_selection_activated (GtkTreeView *view,
gpointer user_data) gpointer user_data)
{ {
GtkAppChooserWidget *self = user_data; GtkAppChooserWidget *self = user_data;
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
GtkTreeSelection *selection; GtkTreeSelection *selection;
if (path_is_heading (view, path)) if (path_is_heading (view, path))
return; return;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->program_list)); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->program_list));
refresh_and_emit_app_selected (self, selection); refresh_and_emit_app_selected (self, selection);
g_signal_emit (self, signals[SIGNAL_APPLICATION_ACTIVATED], 0, g_signal_emit (self, signals[SIGNAL_APPLICATION_ACTIVATED], 0,
priv->selected_app_info); self->selected_app_info);
} }
static gboolean static gboolean
@ -437,7 +431,6 @@ gtk_app_chooser_widget_add_section (GtkAppChooserWidget *self,
GList *applications, GList *applications,
GList *exclude_apps) GList *exclude_apps)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
gboolean heading_added, unref_icon; gboolean heading_added, unref_icon;
GtkTreeIter iter; GtkTreeIter iter;
GAppInfo *app; GAppInfo *app;
@ -454,7 +447,7 @@ gtk_app_chooser_widget_add_section (GtkAppChooserWidget *self,
{ {
app = l->data; app = l->data;
if (priv->content_type != NULL && if (self->content_type != NULL &&
!g_app_info_supports_uris (app) && !g_app_info_supports_uris (app) &&
!g_app_info_supports_files (app)) !g_app_info_supports_files (app))
continue; continue;
@ -465,8 +458,8 @@ gtk_app_chooser_widget_add_section (GtkAppChooserWidget *self,
if (!heading_added && show_headings) if (!heading_added && show_headings)
{ {
gtk_list_store_append (priv->program_list_store, &iter); gtk_list_store_append (self->program_list_store, &iter);
gtk_list_store_set (priv->program_list_store, &iter, gtk_list_store_set (self->program_list_store, &iter,
COLUMN_HEADING_TEXT, bold_string, COLUMN_HEADING_TEXT, bold_string,
COLUMN_HEADING, TRUE, COLUMN_HEADING, TRUE,
COLUMN_RECOMMENDED, recommended, COLUMN_RECOMMENDED, recommended,
@ -488,8 +481,8 @@ gtk_app_chooser_widget_add_section (GtkAppChooserWidget *self,
unref_icon = TRUE; unref_icon = TRUE;
} }
gtk_list_store_append (priv->program_list_store, &iter); gtk_list_store_append (self->program_list_store, &iter);
gtk_list_store_set (priv->program_list_store, &iter, gtk_list_store_set (self->program_list_store, &iter,
COLUMN_APP_INFO, app, COLUMN_APP_INFO, app,
COLUMN_GICON, icon, COLUMN_GICON, icon,
COLUMN_NAME, g_app_info_get_name (app), COLUMN_NAME, g_app_info_get_name (app),
@ -517,7 +510,6 @@ static void
gtk_app_chooser_add_default (GtkAppChooserWidget *self, gtk_app_chooser_add_default (GtkAppChooserWidget *self,
GAppInfo *app) GAppInfo *app)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
GtkTreeIter iter; GtkTreeIter iter;
GIcon *icon; GIcon *icon;
gchar *string; gchar *string;
@ -526,8 +518,8 @@ gtk_app_chooser_add_default (GtkAppChooserWidget *self,
unref_icon = FALSE; unref_icon = FALSE;
string = g_strdup_printf ("<b>%s</b>", _("Default Application")); string = g_strdup_printf ("<b>%s</b>", _("Default Application"));
gtk_list_store_append (priv->program_list_store, &iter); gtk_list_store_append (self->program_list_store, &iter);
gtk_list_store_set (priv->program_list_store, &iter, gtk_list_store_set (self->program_list_store, &iter,
COLUMN_HEADING_TEXT, string, COLUMN_HEADING_TEXT, string,
COLUMN_HEADING, TRUE, COLUMN_HEADING, TRUE,
COLUMN_DEFAULT, TRUE, COLUMN_DEFAULT, TRUE,
@ -546,8 +538,8 @@ gtk_app_chooser_add_default (GtkAppChooserWidget *self,
unref_icon = TRUE; unref_icon = TRUE;
} }
gtk_list_store_append (priv->program_list_store, &iter); gtk_list_store_append (self->program_list_store, &iter);
gtk_list_store_set (priv->program_list_store, &iter, gtk_list_store_set (self->program_list_store, &iter,
COLUMN_APP_INFO, app, COLUMN_APP_INFO, app,
COLUMN_GICON, icon, COLUMN_GICON, icon,
COLUMN_NAME, g_app_info_get_name (app), COLUMN_NAME, g_app_info_get_name (app),
@ -566,24 +558,23 @@ gtk_app_chooser_add_default (GtkAppChooserWidget *self,
static void static void
update_no_applications_label (GtkAppChooserWidget *self) update_no_applications_label (GtkAppChooserWidget *self)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
gchar *text = NULL, *desc = NULL; gchar *text = NULL, *desc = NULL;
const gchar *string; const gchar *string;
if (priv->default_text == NULL) if (self->default_text == NULL)
{ {
if (priv->content_type) if (self->content_type)
desc = g_content_type_get_description (priv->content_type); desc = g_content_type_get_description (self->content_type);
string = text = g_strdup_printf (_("No applications found for “%s”."), desc); string = text = g_strdup_printf (_("No applications found for “%s”."), desc);
g_free (desc); g_free (desc);
} }
else else
{ {
string = priv->default_text; string = self->default_text;
} }
gtk_label_set_text (GTK_LABEL (priv->no_apps_label), string); gtk_label_set_text (GTK_LABEL (self->no_apps_label), string);
g_free (text); g_free (text);
} }
@ -591,12 +582,11 @@ update_no_applications_label (GtkAppChooserWidget *self)
static void static void
gtk_app_chooser_widget_select_first (GtkAppChooserWidget *self) gtk_app_chooser_widget_select_first (GtkAppChooserWidget *self)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
GtkTreeIter iter; GtkTreeIter iter;
GAppInfo *info = NULL; GAppInfo *info = NULL;
GtkTreeModel *model; GtkTreeModel *model;
model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->program_list)); model = gtk_tree_view_get_model (GTK_TREE_VIEW (self->program_list));
if (!gtk_tree_model_get_iter_first (model, &iter)) if (!gtk_tree_model_get_iter_first (model, &iter))
return; return;
@ -617,7 +607,7 @@ gtk_app_chooser_widget_select_first (GtkAppChooserWidget *self)
{ {
GtkTreeSelection *selection; GtkTreeSelection *selection;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->program_list)); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->program_list));
gtk_tree_selection_select_iter (selection, &iter); gtk_tree_selection_select_iter (selection, &iter);
g_object_unref (info); g_object_unref (info);
@ -627,7 +617,6 @@ gtk_app_chooser_widget_select_first (GtkAppChooserWidget *self)
static void static void
gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self) gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
GList *all_applications = NULL; GList *all_applications = NULL;
GList *recommended_apps = NULL; GList *recommended_apps = NULL;
GList *fallback_apps = NULL; GList *fallback_apps = NULL;
@ -639,12 +628,12 @@ gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self)
show_headings = TRUE; show_headings = TRUE;
apps_added = FALSE; apps_added = FALSE;
if (priv->show_all) if (self->show_all)
show_headings = FALSE; show_headings = FALSE;
if (priv->show_default && priv->content_type) if (self->show_default && self->content_type)
{ {
default_app = g_app_info_get_default_for_type (priv->content_type, FALSE); default_app = g_app_info_get_default_for_type (self->content_type, FALSE);
if (default_app != NULL) if (default_app != NULL)
{ {
@ -655,14 +644,14 @@ gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self)
} }
#ifndef G_OS_WIN32 #ifndef G_OS_WIN32
if ((priv->content_type && priv->show_recommended) || priv->show_all) if ((self->content_type && self->show_recommended) || self->show_all)
{ {
if (priv->content_type) if (self->content_type)
recommended_apps = g_app_info_get_recommended_for_type (priv->content_type); recommended_apps = g_app_info_get_recommended_for_type (self->content_type);
apps_added |= gtk_app_chooser_widget_add_section (self, _("Recommended Applications"), apps_added |= gtk_app_chooser_widget_add_section (self, _("Recommended Applications"),
show_headings, show_headings,
!priv->show_all, /* mark as recommended */ !self->show_all, /* mark as recommended */
FALSE, /* mark as fallback */ FALSE, /* mark as fallback */
recommended_apps, exclude_apps); recommended_apps, exclude_apps);
@ -670,22 +659,22 @@ gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self)
g_list_copy (recommended_apps)); g_list_copy (recommended_apps));
} }
if ((priv->content_type && priv->show_fallback) || priv->show_all) if ((self->content_type && self->show_fallback) || self->show_all)
{ {
if (priv->content_type) if (self->content_type)
fallback_apps = g_app_info_get_fallback_for_type (priv->content_type); fallback_apps = g_app_info_get_fallback_for_type (self->content_type);
apps_added |= gtk_app_chooser_widget_add_section (self, _("Related Applications"), apps_added |= gtk_app_chooser_widget_add_section (self, _("Related Applications"),
show_headings, show_headings,
FALSE, /* mark as recommended */ FALSE, /* mark as recommended */
!priv->show_all, /* mark as fallback */ !self->show_all, /* mark as fallback */
fallback_apps, exclude_apps); fallback_apps, exclude_apps);
exclude_apps = g_list_concat (exclude_apps, exclude_apps = g_list_concat (exclude_apps,
g_list_copy (fallback_apps)); g_list_copy (fallback_apps));
} }
#endif #endif
if (priv->show_other || priv->show_all) if (self->show_other || self->show_all)
{ {
all_applications = g_app_info_get_all (); all_applications = g_app_info_get_all ();
@ -699,7 +688,7 @@ gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self)
if (!apps_added) if (!apps_added)
update_no_applications_label (self); update_no_applications_label (self);
gtk_widget_set_visible (priv->no_apps, !apps_added); gtk_widget_set_visible (self->no_apps, !apps_added);
gtk_app_chooser_widget_select_first (self); gtk_app_chooser_widget_select_first (self);
@ -715,11 +704,9 @@ gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self)
static void static void
gtk_app_chooser_widget_initialize_items (GtkAppChooserWidget *self) gtk_app_chooser_widget_initialize_items (GtkAppChooserWidget *self)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
/* initial padding */ /* initial padding */
g_object_set (priv->padding_renderer, g_object_set (self->padding_renderer,
"xpad", priv->show_all ? 0 : 6, "xpad", self->show_all ? 0 : 6,
NULL); NULL);
/* populate the widget */ /* populate the widget */
@ -740,12 +727,11 @@ gtk_app_chooser_widget_set_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object); GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object);
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
switch (property_id) switch (property_id)
{ {
case PROP_CONTENT_TYPE: case PROP_CONTENT_TYPE:
priv->content_type = g_value_dup_string (value); self->content_type = g_value_dup_string (value);
break; break;
case PROP_SHOW_DEFAULT: case PROP_SHOW_DEFAULT:
gtk_app_chooser_widget_set_show_default (self, g_value_get_boolean (value)); gtk_app_chooser_widget_set_show_default (self, g_value_get_boolean (value));
@ -778,30 +764,29 @@ gtk_app_chooser_widget_get_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object); GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object);
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
switch (property_id) switch (property_id)
{ {
case PROP_CONTENT_TYPE: case PROP_CONTENT_TYPE:
g_value_set_string (value, priv->content_type); g_value_set_string (value, self->content_type);
break; break;
case PROP_SHOW_DEFAULT: case PROP_SHOW_DEFAULT:
g_value_set_boolean (value, priv->show_default); g_value_set_boolean (value, self->show_default);
break; break;
case PROP_SHOW_RECOMMENDED: case PROP_SHOW_RECOMMENDED:
g_value_set_boolean (value, priv->show_recommended); g_value_set_boolean (value, self->show_recommended);
break; break;
case PROP_SHOW_FALLBACK: case PROP_SHOW_FALLBACK:
g_value_set_boolean (value, priv->show_fallback); g_value_set_boolean (value, self->show_fallback);
break; break;
case PROP_SHOW_OTHER: case PROP_SHOW_OTHER:
g_value_set_boolean (value, priv->show_other); g_value_set_boolean (value, self->show_other);
break; break;
case PROP_SHOW_ALL: case PROP_SHOW_ALL:
g_value_set_boolean (value, priv->show_all); g_value_set_boolean (value, self->show_all);
break; break;
case PROP_DEFAULT_TEXT: case PROP_DEFAULT_TEXT:
g_value_set_string (value, priv->default_text); g_value_set_string (value, self->default_text);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@ -824,12 +809,11 @@ static void
gtk_app_chooser_widget_finalize (GObject *object) gtk_app_chooser_widget_finalize (GObject *object)
{ {
GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object); GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object);
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_free (priv->content_type); g_free (self->content_type);
g_free (priv->default_text); g_free (self->default_text);
g_signal_handlers_disconnect_by_func (priv->monitor, app_info_changed, self); g_signal_handlers_disconnect_by_func (self->monitor, app_info_changed, self);
g_object_unref (priv->monitor); g_object_unref (self->monitor);
G_OBJECT_CLASS (gtk_app_chooser_widget_parent_class)->finalize (object); G_OBJECT_CLASS (gtk_app_chooser_widget_parent_class)->finalize (object);
} }
@ -838,14 +822,13 @@ static void
gtk_app_chooser_widget_dispose (GObject *object) gtk_app_chooser_widget_dispose (GObject *object)
{ {
GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object); GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object);
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_clear_object (&priv->selected_app_info); g_clear_object (&self->selected_app_info);
if (priv->overlay) if (self->overlay)
{ {
gtk_widget_unparent (priv->overlay); gtk_widget_unparent (self->overlay);
priv->overlay = NULL; self->overlay = NULL;
} }
G_OBJECT_CLASS (gtk_app_chooser_widget_parent_class)->dispose (object); G_OBJECT_CLASS (gtk_app_chooser_widget_parent_class)->dispose (object);
@ -861,9 +844,8 @@ gtk_app_chooser_widget_measure (GtkWidget *widget,
int *natural_baseline) int *natural_baseline)
{ {
GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (widget); GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (widget);
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
gtk_widget_measure (priv->overlay, orientation, for_size, gtk_widget_measure (self->overlay, orientation, for_size,
minimum, natural, minimum, natural,
minimum_baseline, natural_baseline); minimum_baseline, natural_baseline);
} }
@ -873,9 +855,8 @@ gtk_app_chooser_widget_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot) GtkSnapshot *snapshot)
{ {
GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (widget); GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (widget);
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
gtk_widget_snapshot_child (widget, priv->overlay, snapshot); gtk_widget_snapshot_child (widget, self->overlay, snapshot);
} }
static void static void
@ -885,11 +866,10 @@ gtk_app_chooser_widget_size_allocate (GtkWidget *widget,
int baseline) int baseline)
{ {
GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (widget); GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (widget);
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
GTK_WIDGET_CLASS (gtk_app_chooser_widget_parent_class)->size_allocate (widget, width, height, baseline); GTK_WIDGET_CLASS (gtk_app_chooser_widget_parent_class)->size_allocate (widget, width, height, baseline);
gtk_widget_size_allocate (priv->overlay, gtk_widget_size_allocate (self->overlay,
&(GtkAllocation) { &(GtkAllocation) {
0, 0, 0, 0,
width, height width, height
@ -1048,14 +1028,14 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass)
*/ */
gtk_widget_class_set_template_from_resource (widget_class, gtk_widget_class_set_template_from_resource (widget_class,
"/org/gtk/libgtk/ui/gtkappchooserwidget.ui"); "/org/gtk/libgtk/ui/gtkappchooserwidget.ui");
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, program_list); gtk_widget_class_bind_template_child (widget_class, GtkAppChooserWidget, program_list);
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, program_list_store); gtk_widget_class_bind_template_child (widget_class, GtkAppChooserWidget, program_list_store);
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, column); gtk_widget_class_bind_template_child (widget_class, GtkAppChooserWidget, column);
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, padding_renderer); gtk_widget_class_bind_template_child (widget_class, GtkAppChooserWidget, padding_renderer);
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, secondary_padding); gtk_widget_class_bind_template_child (widget_class, GtkAppChooserWidget, secondary_padding);
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, no_apps_label); gtk_widget_class_bind_template_child (widget_class, GtkAppChooserWidget, no_apps_label);
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, no_apps); gtk_widget_class_bind_template_child (widget_class, GtkAppChooserWidget, no_apps);
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, overlay); gtk_widget_class_bind_template_child (widget_class, GtkAppChooserWidget, overlay);
gtk_widget_class_bind_template_callback (widget_class, refresh_and_emit_app_selected); gtk_widget_class_bind_template_callback (widget_class, refresh_and_emit_app_selected);
gtk_widget_class_bind_template_callback (widget_class, program_list_selection_activated); gtk_widget_class_bind_template_callback (widget_class, program_list_selection_activated);
@ -1065,7 +1045,6 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass)
static void static void
gtk_app_chooser_widget_init (GtkAppChooserWidget *self) gtk_app_chooser_widget_init (GtkAppChooserWidget *self)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
GtkTreeSelection *selection; GtkTreeSelection *selection;
GtkTreeModel *sort; GtkTreeModel *sort;
@ -1074,11 +1053,11 @@ gtk_app_chooser_widget_init (GtkAppChooserWidget *self)
/* Various parts of the GtkTreeView code need custom code to setup, mostly /* Various parts of the GtkTreeView code need custom code to setup, mostly
* because we lack signals to connect to, or properties to set. * because we lack signals to connect to, or properties to set.
*/ */
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->program_list)); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->program_list));
gtk_tree_selection_set_select_function (selection, gtk_app_chooser_selection_func, gtk_tree_selection_set_select_function (selection, gtk_app_chooser_selection_func,
self, NULL); self, NULL);
sort = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->program_list)); sort = gtk_tree_view_get_model (GTK_TREE_VIEW (self->program_list));
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort), gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort),
COLUMN_NAME, COLUMN_NAME,
GTK_SORT_ASCENDING); GTK_SORT_ASCENDING);
@ -1087,18 +1066,18 @@ gtk_app_chooser_widget_init (GtkAppChooserWidget *self)
gtk_app_chooser_sort_func, gtk_app_chooser_sort_func,
self, NULL); self, NULL);
gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->program_list), COLUMN_NAME); gtk_tree_view_set_search_column (GTK_TREE_VIEW (self->program_list), COLUMN_NAME);
gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (priv->program_list), gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (self->program_list),
gtk_app_chooser_search_equal_func, gtk_app_chooser_search_equal_func,
NULL, NULL); NULL, NULL);
gtk_tree_view_column_set_cell_data_func (priv->column, gtk_tree_view_column_set_cell_data_func (self->column,
priv->secondary_padding, self->secondary_padding,
padding_cell_renderer_func, padding_cell_renderer_func,
NULL, NULL); NULL, NULL);
priv->monitor = g_app_info_monitor_get (); self->monitor = g_app_info_monitor_get ();
g_signal_connect (priv->monitor, "changed", g_signal_connect (self->monitor, "changed",
G_CALLBACK (app_info_changed), self); G_CALLBACK (app_info_changed), self);
} }
@ -1106,27 +1085,25 @@ static GAppInfo *
gtk_app_chooser_widget_get_app_info (GtkAppChooser *object) gtk_app_chooser_widget_get_app_info (GtkAppChooser *object)
{ {
GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object); GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object);
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
if (priv->selected_app_info == NULL) if (self->selected_app_info == NULL)
return NULL; return NULL;
return g_object_ref (priv->selected_app_info); return g_object_ref (self->selected_app_info);
} }
static void static void
gtk_app_chooser_widget_refresh (GtkAppChooser *object) gtk_app_chooser_widget_refresh (GtkAppChooser *object)
{ {
GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object); GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object);
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
if (priv->program_list_store != NULL) if (self->program_list_store != NULL)
{ {
gtk_list_store_clear (priv->program_list_store); gtk_list_store_clear (self->program_list_store);
/* don't add additional xpad if we don't have headings */ /* don't add additional xpad if we don't have headings */
g_object_set (priv->padding_renderer, g_object_set (self->padding_renderer,
"visible", !priv->show_all, "visible", !self->show_all,
NULL); NULL);
gtk_app_chooser_widget_real_add_items (self); gtk_app_chooser_widget_real_add_items (self);
@ -1169,13 +1146,11 @@ void
gtk_app_chooser_widget_set_show_default (GtkAppChooserWidget *self, gtk_app_chooser_widget_set_show_default (GtkAppChooserWidget *self,
gboolean setting) gboolean setting)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self)); g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self));
if (priv->show_default != setting) if (self->show_default != setting)
{ {
priv->show_default = setting; self->show_default = setting;
g_object_notify (G_OBJECT (self), "show-default"); g_object_notify (G_OBJECT (self), "show-default");
@ -1195,11 +1170,9 @@ gtk_app_chooser_widget_set_show_default (GtkAppChooserWidget *self,
gboolean gboolean
gtk_app_chooser_widget_get_show_default (GtkAppChooserWidget *self) gtk_app_chooser_widget_get_show_default (GtkAppChooserWidget *self)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), FALSE); g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), FALSE);
return priv->show_default; return self->show_default;
} }
/** /**
@ -1214,13 +1187,11 @@ void
gtk_app_chooser_widget_set_show_recommended (GtkAppChooserWidget *self, gtk_app_chooser_widget_set_show_recommended (GtkAppChooserWidget *self,
gboolean setting) gboolean setting)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self)); g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self));
if (priv->show_recommended != setting) if (self->show_recommended != setting)
{ {
priv->show_recommended = setting; self->show_recommended = setting;
g_object_notify (G_OBJECT (self), "show-recommended"); g_object_notify (G_OBJECT (self), "show-recommended");
@ -1240,11 +1211,9 @@ gtk_app_chooser_widget_set_show_recommended (GtkAppChooserWidget *self,
gboolean gboolean
gtk_app_chooser_widget_get_show_recommended (GtkAppChooserWidget *self) gtk_app_chooser_widget_get_show_recommended (GtkAppChooserWidget *self)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), FALSE); g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), FALSE);
return priv->show_recommended; return self->show_recommended;
} }
/** /**
@ -1259,13 +1228,11 @@ void
gtk_app_chooser_widget_set_show_fallback (GtkAppChooserWidget *self, gtk_app_chooser_widget_set_show_fallback (GtkAppChooserWidget *self,
gboolean setting) gboolean setting)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self)); g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self));
if (priv->show_fallback != setting) if (self->show_fallback != setting)
{ {
priv->show_fallback = setting; self->show_fallback = setting;
g_object_notify (G_OBJECT (self), "show-fallback"); g_object_notify (G_OBJECT (self), "show-fallback");
@ -1285,11 +1252,9 @@ gtk_app_chooser_widget_set_show_fallback (GtkAppChooserWidget *self,
gboolean gboolean
gtk_app_chooser_widget_get_show_fallback (GtkAppChooserWidget *self) gtk_app_chooser_widget_get_show_fallback (GtkAppChooserWidget *self)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), FALSE); g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), FALSE);
return priv->show_fallback; return self->show_fallback;
} }
/** /**
@ -1304,13 +1269,11 @@ void
gtk_app_chooser_widget_set_show_other (GtkAppChooserWidget *self, gtk_app_chooser_widget_set_show_other (GtkAppChooserWidget *self,
gboolean setting) gboolean setting)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self)); g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self));
if (priv->show_other != setting) if (self->show_other != setting)
{ {
priv->show_other = setting; self->show_other = setting;
g_object_notify (G_OBJECT (self), "show-other"); g_object_notify (G_OBJECT (self), "show-other");
@ -1330,11 +1293,9 @@ gtk_app_chooser_widget_set_show_other (GtkAppChooserWidget *self,
gboolean gboolean
gtk_app_chooser_widget_get_show_other (GtkAppChooserWidget *self) gtk_app_chooser_widget_get_show_other (GtkAppChooserWidget *self)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), FALSE); g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), FALSE);
return priv->show_other; return self->show_other;
} }
/** /**
@ -1349,13 +1310,11 @@ void
gtk_app_chooser_widget_set_show_all (GtkAppChooserWidget *self, gtk_app_chooser_widget_set_show_all (GtkAppChooserWidget *self,
gboolean setting) gboolean setting)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self)); g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self));
if (priv->show_all != setting) if (self->show_all != setting)
{ {
priv->show_all = setting; self->show_all = setting;
g_object_notify (G_OBJECT (self), "show-all"); g_object_notify (G_OBJECT (self), "show-all");
@ -1375,11 +1334,9 @@ gtk_app_chooser_widget_set_show_all (GtkAppChooserWidget *self,
gboolean gboolean
gtk_app_chooser_widget_get_show_all (GtkAppChooserWidget *self) gtk_app_chooser_widget_get_show_all (GtkAppChooserWidget *self)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), FALSE); g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), FALSE);
return priv->show_all; return self->show_all;
} }
/** /**
@ -1394,14 +1351,12 @@ void
gtk_app_chooser_widget_set_default_text (GtkAppChooserWidget *self, gtk_app_chooser_widget_set_default_text (GtkAppChooserWidget *self,
const gchar *text) const gchar *text)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self)); g_return_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self));
if (g_strcmp0 (text, priv->default_text) != 0) if (g_strcmp0 (text, self->default_text) != 0)
{ {
g_free (priv->default_text); g_free (self->default_text);
priv->default_text = g_strdup (text); self->default_text = g_strdup (text);
g_object_notify (G_OBJECT (self), "default-text"); g_object_notify (G_OBJECT (self), "default-text");
@ -1421,22 +1376,18 @@ gtk_app_chooser_widget_set_default_text (GtkAppChooserWidget *self,
const gchar * const gchar *
gtk_app_chooser_widget_get_default_text (GtkAppChooserWidget *self) gtk_app_chooser_widget_get_default_text (GtkAppChooserWidget *self)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self);
g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), NULL); g_return_val_if_fail (GTK_IS_APP_CHOOSER_WIDGET (self), NULL);
return priv->default_text; return self->default_text;
} }
void void
_gtk_app_chooser_widget_set_search_entry (GtkAppChooserWidget *self, _gtk_app_chooser_widget_set_search_entry (GtkAppChooserWidget *self,
GtkEditable *entry) GtkEditable *entry)
{ {
GtkAppChooserWidgetPrivate *priv = gtk_app_chooser_widget_get_instance_private (self); gtk_tree_view_set_search_entry (GTK_TREE_VIEW (self->program_list), entry);
gtk_tree_view_set_search_entry (GTK_TREE_VIEW (priv->program_list), entry); g_object_bind_property (self->no_apps, "visible",
g_object_bind_property (priv->no_apps, "visible",
entry, "sensitive", entry, "sensitive",
G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN); G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN);
} }

View File

@ -53,8 +53,12 @@
* be removed for non-activatable swatches. * be removed for non-activatable swatches.
*/ */
typedef struct typedef struct _GtkColorSwatchClass GtkColorSwatchClass;
struct _GtkColorSwatch
{ {
GtkWidget parent_instance;
GdkRGBA color; GdkRGBA color;
gdouble radius[4]; gdouble radius[4];
gchar *icon; gchar *icon;
@ -67,7 +71,15 @@ typedef struct
GtkWidget *popover; GtkWidget *popover;
GtkDropTarget *dest; GtkDropTarget *dest;
} GtkColorSwatchPrivate; };
struct _GtkColorSwatchClass
{
GtkWidgetClass parent_class;
void ( * activate) (GtkColorSwatch *swatch);
void ( * customize) (GtkColorSwatch *swatch);
};
enum enum
{ {
@ -78,7 +90,7 @@ enum
PROP_CAN_DROP PROP_CAN_DROP
}; };
G_DEFINE_TYPE_WITH_PRIVATE (GtkColorSwatch, gtk_color_swatch, GTK_TYPE_WIDGET) G_DEFINE_TYPE (GtkColorSwatch, gtk_color_swatch, GTK_TYPE_WIDGET)
#define INTENSITY(r, g, b) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11) #define INTENSITY(r, g, b) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11)
static void static void
@ -86,23 +98,22 @@ swatch_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot) GtkSnapshot *snapshot)
{ {
GtkColorSwatch *swatch = GTK_COLOR_SWATCH (widget); GtkColorSwatch *swatch = GTK_COLOR_SWATCH (widget);
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
const int width = gtk_widget_get_width (widget); const int width = gtk_widget_get_width (widget);
const int height = gtk_widget_get_height (widget); const int height = gtk_widget_get_height (widget);
const GdkRGBA *color; const GdkRGBA *color;
color = &priv->color; color = &swatch->color;
if (priv->dest) if (swatch->dest)
{ {
const GValue *value = gtk_drop_target_get_value (priv->dest); const GValue *value = gtk_drop_target_get_value (swatch->dest);
if (value) if (value)
color = g_value_get_boxed (value); color = g_value_get_boxed (value);
} }
if (priv->has_color) if (swatch->has_color)
{ {
if (priv->use_alpha && !gdk_rgba_is_opaque (color)) if (swatch->use_alpha && !gdk_rgba_is_opaque (color))
{ {
_gtk_color_chooser_snapshot_checkered_pattern (snapshot, width, height); _gtk_color_chooser_snapshot_checkered_pattern (snapshot, width, height);
@ -122,7 +133,7 @@ swatch_snapshot (GtkWidget *widget,
} }
} }
gtk_widget_snapshot_child (widget, priv->overlay_widget, snapshot); gtk_widget_snapshot_child (widget, swatch->overlay_widget, snapshot);
} }
static gboolean static gboolean
@ -141,13 +152,12 @@ swatch_drag_drop (GtkDropTarget *dest,
static void static void
activate_color (GtkColorSwatch *swatch) activate_color (GtkColorSwatch *swatch)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
double red, green, blue, alpha; double red, green, blue, alpha;
red = priv->color.red; red = swatch->color.red;
green = priv->color.green; green = swatch->color.green;
blue = priv->color.blue; blue = swatch->color.blue;
alpha = priv->color.alpha; alpha = swatch->color.alpha;
gtk_widget_activate_action (GTK_WIDGET (swatch), gtk_widget_activate_action (GTK_WIDGET (swatch),
"color.select", "(dddd)", red, green, blue, alpha); "color.select", "(dddd)", red, green, blue, alpha);
@ -156,13 +166,12 @@ activate_color (GtkColorSwatch *swatch)
static void static void
customize_color (GtkColorSwatch *swatch) customize_color (GtkColorSwatch *swatch)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
double red, green, blue, alpha; double red, green, blue, alpha;
red = priv->color.red; red = swatch->color.red;
green = priv->color.green; green = swatch->color.green;
blue = priv->color.blue; blue = swatch->color.blue;
alpha = priv->color.alpha; alpha = swatch->color.alpha;
gtk_widget_activate_action (GTK_WIDGET (swatch), gtk_widget_activate_action (GTK_WIDGET (swatch),
"color.customize", "(dddd)", red, green, blue, alpha); "color.customize", "(dddd)", red, green, blue, alpha);
@ -176,7 +185,6 @@ key_controller_key_pressed (GtkEventControllerKey *controller,
GtkWidget *widget) GtkWidget *widget)
{ {
GtkColorSwatch *swatch = GTK_COLOR_SWATCH (widget); GtkColorSwatch *swatch = GTK_COLOR_SWATCH (widget);
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
if (keyval == GDK_KEY_space || if (keyval == GDK_KEY_space ||
keyval == GDK_KEY_Return || keyval == GDK_KEY_Return ||
@ -184,8 +192,8 @@ key_controller_key_pressed (GtkEventControllerKey *controller,
keyval == GDK_KEY_KP_Enter || keyval == GDK_KEY_KP_Enter ||
keyval == GDK_KEY_KP_Space) keyval == GDK_KEY_KP_Space)
{ {
if (priv->has_color && if (swatch->has_color &&
priv->selectable && swatch->selectable &&
(gtk_widget_get_state_flags (widget) & GTK_STATE_FLAG_SELECTED) == 0) (gtk_widget_get_state_flags (widget) & GTK_STATE_FLAG_SELECTED) == 0)
gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_SELECTED, FALSE); gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_SELECTED, FALSE);
else else
@ -200,17 +208,16 @@ key_controller_key_pressed (GtkEventControllerKey *controller,
static GMenuModel * static GMenuModel *
gtk_color_swatch_get_menu_model (GtkColorSwatch *swatch) gtk_color_swatch_get_menu_model (GtkColorSwatch *swatch)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
GMenu *menu, *section; GMenu *menu, *section;
GMenuItem *item; GMenuItem *item;
double red, green, blue, alpha; double red, green, blue, alpha;
menu = g_menu_new (); menu = g_menu_new ();
red = priv->color.red; red = swatch->color.red;
green = priv->color.green; green = swatch->color.green;
blue = priv->color.blue; blue = swatch->color.blue;
alpha = priv->color.alpha; alpha = swatch->color.alpha;
section = g_menu_new (); section = g_menu_new ();
item = g_menu_item_new (_("Customize"), NULL); item = g_menu_item_new (_("Customize"), NULL);
@ -228,33 +235,31 @@ gtk_color_swatch_get_menu_model (GtkColorSwatch *swatch)
static void static void
do_popup (GtkColorSwatch *swatch) do_popup (GtkColorSwatch *swatch)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
GMenuModel *model; GMenuModel *model;
g_clear_pointer (&priv->popover, gtk_widget_unparent); g_clear_pointer (&swatch->popover, gtk_widget_unparent);
model = gtk_color_swatch_get_menu_model (swatch); model = gtk_color_swatch_get_menu_model (swatch);
priv->popover = gtk_popover_menu_new_from_model (model); swatch->popover = gtk_popover_menu_new_from_model (model);
gtk_widget_set_parent (priv->popover, GTK_WIDGET (swatch)); gtk_widget_set_parent (swatch->popover, GTK_WIDGET (swatch));
g_object_unref (model); g_object_unref (model);
gtk_popover_popup (GTK_POPOVER (priv->popover)); gtk_popover_popup (GTK_POPOVER (swatch->popover));
} }
static gboolean static gboolean
swatch_primary_action (GtkColorSwatch *swatch) swatch_primary_action (GtkColorSwatch *swatch)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
GtkWidget *widget = (GtkWidget *)swatch; GtkWidget *widget = (GtkWidget *)swatch;
GtkStateFlags flags; GtkStateFlags flags;
flags = gtk_widget_get_state_flags (widget); flags = gtk_widget_get_state_flags (widget);
if (!priv->has_color) if (!swatch->has_color)
{ {
customize_color (swatch); customize_color (swatch);
return TRUE; return TRUE;
} }
else if (priv->selectable && else if (swatch->selectable &&
(flags & GTK_STATE_FLAG_SELECTED) == 0) (flags & GTK_STATE_FLAG_SELECTED) == 0)
{ {
gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_SELECTED, FALSE); gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_SELECTED, FALSE);
@ -281,7 +286,6 @@ tap_action (GtkGestureClick *gesture,
gdouble y, gdouble y,
GtkColorSwatch *swatch) GtkColorSwatch *swatch)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
guint button; guint button;
button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)); button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
@ -295,7 +299,7 @@ tap_action (GtkGestureClick *gesture,
} }
else if (button == GDK_BUTTON_SECONDARY) else if (button == GDK_BUTTON_SECONDARY)
{ {
if (priv->has_color && priv->has_menu) if (swatch->has_color && swatch->has_menu)
do_popup (swatch); do_popup (swatch);
} }
} }
@ -307,16 +311,15 @@ swatch_size_allocate (GtkWidget *widget,
int baseline) int baseline)
{ {
GtkColorSwatch *swatch = GTK_COLOR_SWATCH (widget); GtkColorSwatch *swatch = GTK_COLOR_SWATCH (widget);
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
gtk_widget_size_allocate (priv->overlay_widget, gtk_widget_size_allocate (swatch->overlay_widget,
&(GtkAllocation) { &(GtkAllocation) {
0, 0, 0, 0,
width, height width, height
}, -1); }, -1);
if (priv->popover) if (swatch->popover)
gtk_native_check_resize (GTK_NATIVE (priv->popover)); gtk_native_check_resize (GTK_NATIVE (swatch->popover));
} }
static void static void
@ -329,10 +332,9 @@ gtk_color_swatch_measure (GtkWidget *widget,
int *natural_baseline) int *natural_baseline)
{ {
GtkColorSwatch *swatch = GTK_COLOR_SWATCH (widget); GtkColorSwatch *swatch = GTK_COLOR_SWATCH (widget);
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
gint w, h, min; gint w, h, min;
gtk_widget_measure (priv->overlay_widget, gtk_widget_measure (swatch->overlay_widget,
orientation, orientation,
-1, -1,
minimum, natural, minimum, natural,
@ -359,11 +361,10 @@ swatch_popup_menu (GtkWidget *widget,
static void static void
update_icon (GtkColorSwatch *swatch) update_icon (GtkColorSwatch *swatch)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); GtkImage *image = GTK_IMAGE (swatch->overlay_widget);
GtkImage *image = GTK_IMAGE (priv->overlay_widget);
if (priv->icon) if (swatch->icon)
gtk_image_set_from_icon_name (image, priv->icon); gtk_image_set_from_icon_name (image, swatch->icon);
else if (gtk_widget_get_state_flags (GTK_WIDGET (swatch)) & GTK_STATE_FLAG_SELECTED) else if (gtk_widget_get_state_flags (GTK_WIDGET (swatch)) & GTK_STATE_FLAG_SELECTED)
gtk_image_set_from_icon_name (image, "object-select-symbolic"); gtk_image_set_from_icon_name (image, "object-select-symbolic");
else else
@ -390,7 +391,6 @@ swatch_get_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
GtkColorSwatch *swatch = GTK_COLOR_SWATCH (object); GtkColorSwatch *swatch = GTK_COLOR_SWATCH (object);
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
GdkRGBA color; GdkRGBA color;
switch (prop_id) switch (prop_id)
@ -403,10 +403,10 @@ swatch_get_property (GObject *object,
g_value_set_boolean (value, gtk_color_swatch_get_selectable (swatch)); g_value_set_boolean (value, gtk_color_swatch_get_selectable (swatch));
break; break;
case PROP_HAS_MENU: case PROP_HAS_MENU:
g_value_set_boolean (value, priv->has_menu); g_value_set_boolean (value, swatch->has_menu);
break; break;
case PROP_CAN_DROP: case PROP_CAN_DROP:
g_value_set_boolean (value, priv->dest != NULL); g_value_set_boolean (value, swatch->dest != NULL);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -421,7 +421,6 @@ swatch_set_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
GtkColorSwatch *swatch = GTK_COLOR_SWATCH (object); GtkColorSwatch *swatch = GTK_COLOR_SWATCH (object);
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
switch (prop_id) switch (prop_id)
{ {
@ -432,7 +431,7 @@ swatch_set_property (GObject *object,
gtk_color_swatch_set_selectable (swatch, g_value_get_boolean (value)); gtk_color_swatch_set_selectable (swatch, g_value_get_boolean (value));
break; break;
case PROP_HAS_MENU: case PROP_HAS_MENU:
priv->has_menu = g_value_get_boolean (value); swatch->has_menu = g_value_get_boolean (value);
break; break;
case PROP_CAN_DROP: case PROP_CAN_DROP:
gtk_color_swatch_set_can_drop (swatch, g_value_get_boolean (value)); gtk_color_swatch_set_can_drop (swatch, g_value_get_boolean (value));
@ -447,10 +446,9 @@ static void
swatch_finalize (GObject *object) swatch_finalize (GObject *object)
{ {
GtkColorSwatch *swatch = GTK_COLOR_SWATCH (object); GtkColorSwatch *swatch = GTK_COLOR_SWATCH (object);
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
g_free (priv->icon); g_free (swatch->icon);
gtk_widget_unparent (priv->overlay_widget); gtk_widget_unparent (swatch->overlay_widget);
G_OBJECT_CLASS (gtk_color_swatch_parent_class)->finalize (object); G_OBJECT_CLASS (gtk_color_swatch_parent_class)->finalize (object);
} }
@ -459,9 +457,8 @@ static void
swatch_dispose (GObject *object) swatch_dispose (GObject *object)
{ {
GtkColorSwatch *swatch = GTK_COLOR_SWATCH (object); GtkColorSwatch *swatch = GTK_COLOR_SWATCH (object);
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
g_clear_pointer (&priv->popover, gtk_widget_unparent); g_clear_pointer (&swatch->popover, gtk_widget_unparent);
G_OBJECT_CLASS (gtk_color_swatch_parent_class)->dispose (object); G_OBJECT_CLASS (gtk_color_swatch_parent_class)->dispose (object);
} }
@ -520,17 +517,16 @@ gtk_color_swatch_class_init (GtkColorSwatchClass *class)
static void static void
gtk_color_swatch_init (GtkColorSwatch *swatch) gtk_color_swatch_init (GtkColorSwatch *swatch)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
GtkEventController *controller; GtkEventController *controller;
GtkGesture *gesture; GtkGesture *gesture;
priv->use_alpha = TRUE; swatch->use_alpha = TRUE;
priv->selectable = TRUE; swatch->selectable = TRUE;
priv->has_menu = TRUE; swatch->has_menu = TRUE;
priv->color.red = 0.75; swatch->color.red = 0.75;
priv->color.green = 0.25; swatch->color.green = 0.25;
priv->color.blue = 0.25; swatch->color.blue = 0.25;
priv->color.alpha = 1.0; swatch->color.alpha = 1.0;
gtk_widget_set_can_focus (GTK_WIDGET (swatch), TRUE); gtk_widget_set_can_focus (GTK_WIDGET (swatch), TRUE);
gtk_widget_set_overflow (GTK_WIDGET (swatch), GTK_OVERFLOW_HIDDEN); gtk_widget_set_overflow (GTK_WIDGET (swatch), GTK_OVERFLOW_HIDDEN);
@ -555,10 +551,10 @@ gtk_color_swatch_init (GtkColorSwatch *swatch)
gtk_widget_add_css_class (GTK_WIDGET (swatch), "activatable"); gtk_widget_add_css_class (GTK_WIDGET (swatch), "activatable");
priv->overlay_widget = g_object_new (GTK_TYPE_IMAGE, swatch->overlay_widget = g_object_new (GTK_TYPE_IMAGE,
"css-name", "overlay", "css-name", "overlay",
NULL); NULL);
gtk_widget_set_parent (priv->overlay_widget, GTK_WIDGET (swatch)); gtk_widget_set_parent (swatch->overlay_widget, GTK_WIDGET (swatch));
} }
/* Public API {{{1 */ /* Public API {{{1 */
@ -575,18 +571,14 @@ gtk_color_swatch_drag_prepare (GtkDragSource *source,
double y, double y,
GtkColorSwatch *swatch) GtkColorSwatch *swatch)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); return gdk_content_provider_new_typed (GDK_TYPE_RGBA, &swatch->color);
return gdk_content_provider_new_typed (GDK_TYPE_RGBA, &priv->color);
} }
void void
gtk_color_swatch_set_rgba (GtkColorSwatch *swatch, gtk_color_swatch_set_rgba (GtkColorSwatch *swatch,
const GdkRGBA *color) const GdkRGBA *color)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); if (!swatch->has_color)
if (!priv->has_color)
{ {
GtkDragSource *source; GtkDragSource *source;
@ -596,10 +588,10 @@ gtk_color_swatch_set_rgba (GtkColorSwatch *swatch,
gtk_widget_add_controller (GTK_WIDGET (swatch), GTK_EVENT_CONTROLLER (source)); gtk_widget_add_controller (GTK_WIDGET (swatch), GTK_EVENT_CONTROLLER (source));
} }
priv->has_color = TRUE; swatch->has_color = TRUE;
priv->color = *color; swatch->color = *color;
if (INTENSITY (priv->color.red, priv->color.green, priv->color.blue) > 0.5) if (INTENSITY (swatch->color.red, swatch->color.green, swatch->color.blue) > 0.5)
{ {
gtk_widget_add_css_class (GTK_WIDGET (swatch), "light"); gtk_widget_add_css_class (GTK_WIDGET (swatch), "light");
gtk_widget_remove_css_class (GTK_WIDGET (swatch), "dark"); gtk_widget_remove_css_class (GTK_WIDGET (swatch), "dark");
@ -618,14 +610,12 @@ gboolean
gtk_color_swatch_get_rgba (GtkColorSwatch *swatch, gtk_color_swatch_get_rgba (GtkColorSwatch *swatch,
GdkRGBA *color) GdkRGBA *color)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); if (swatch->has_color)
if (priv->has_color)
{ {
color->red = priv->color.red; color->red = swatch->color.red;
color->green = priv->color.green; color->green = swatch->color.green;
color->blue = priv->color.blue; color->blue = swatch->color.blue;
color->alpha = priv->color.alpha; color->alpha = swatch->color.alpha;
return TRUE; return TRUE;
} }
else else
@ -642,9 +632,7 @@ void
gtk_color_swatch_set_icon (GtkColorSwatch *swatch, gtk_color_swatch_set_icon (GtkColorSwatch *swatch,
const gchar *icon) const gchar *icon)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); swatch->icon = g_strdup (icon);
priv->icon = g_strdup (icon);
update_icon (swatch); update_icon (swatch);
gtk_widget_queue_draw (GTK_WIDGET (swatch)); gtk_widget_queue_draw (GTK_WIDGET (swatch));
} }
@ -653,23 +641,21 @@ void
gtk_color_swatch_set_can_drop (GtkColorSwatch *swatch, gtk_color_swatch_set_can_drop (GtkColorSwatch *swatch,
gboolean can_drop) gboolean can_drop)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); if (can_drop == (swatch->dest != NULL))
if (can_drop == (priv->dest != NULL))
return; return;
if (can_drop && !priv->dest) if (can_drop && !swatch->dest)
{ {
priv->dest = gtk_drop_target_new (GDK_TYPE_RGBA, GDK_ACTION_COPY); swatch->dest = gtk_drop_target_new (GDK_TYPE_RGBA, GDK_ACTION_COPY);
gtk_drop_target_set_preload (priv->dest, TRUE); gtk_drop_target_set_preload (swatch->dest, TRUE);
g_signal_connect (priv->dest, "drop", G_CALLBACK (swatch_drag_drop), swatch); g_signal_connect (swatch->dest, "drop", G_CALLBACK (swatch_drag_drop), swatch);
g_signal_connect_swapped (priv->dest, "notify::value", G_CALLBACK (gtk_widget_queue_draw), swatch); g_signal_connect_swapped (swatch->dest, "notify::value", G_CALLBACK (gtk_widget_queue_draw), swatch);
gtk_widget_add_controller (GTK_WIDGET (swatch), GTK_EVENT_CONTROLLER (priv->dest)); gtk_widget_add_controller (GTK_WIDGET (swatch), GTK_EVENT_CONTROLLER (swatch->dest));
} }
if (!can_drop && priv->dest) if (!can_drop && swatch->dest)
{ {
gtk_widget_remove_controller (GTK_WIDGET (swatch), GTK_EVENT_CONTROLLER (priv->dest)); gtk_widget_remove_controller (GTK_WIDGET (swatch), GTK_EVENT_CONTROLLER (swatch->dest));
priv->dest = NULL; swatch->dest = NULL;
} }
g_object_notify (G_OBJECT (swatch), "can-drop"); g_object_notify (G_OBJECT (swatch), "can-drop");
@ -679,9 +665,7 @@ void
gtk_color_swatch_set_use_alpha (GtkColorSwatch *swatch, gtk_color_swatch_set_use_alpha (GtkColorSwatch *swatch,
gboolean use_alpha) gboolean use_alpha)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); swatch->use_alpha = use_alpha;
priv->use_alpha = use_alpha;
gtk_widget_queue_draw (GTK_WIDGET (swatch)); gtk_widget_queue_draw (GTK_WIDGET (swatch));
} }
@ -689,21 +673,17 @@ void
gtk_color_swatch_set_selectable (GtkColorSwatch *swatch, gtk_color_swatch_set_selectable (GtkColorSwatch *swatch,
gboolean selectable) gboolean selectable)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); if (selectable == swatch->selectable)
if (selectable == priv->selectable)
return; return;
priv->selectable = selectable; swatch->selectable = selectable;
g_object_notify (G_OBJECT (swatch), "selectable"); g_object_notify (G_OBJECT (swatch), "selectable");
} }
gboolean gboolean
gtk_color_swatch_get_selectable (GtkColorSwatch *swatch) gtk_color_swatch_get_selectable (GtkColorSwatch *swatch)
{ {
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); return swatch->selectable;
return priv->selectable;
} }
/* vim:set foldmethod=marker: */ /* vim:set foldmethod=marker: */

View File

@ -24,34 +24,10 @@ G_BEGIN_DECLS
#define GTK_TYPE_COLOR_SWATCH (gtk_color_swatch_get_type ()) #define GTK_TYPE_COLOR_SWATCH (gtk_color_swatch_get_type ())
#define GTK_COLOR_SWATCH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_COLOR_SWATCH, GtkColorSwatch)) #define GTK_COLOR_SWATCH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_COLOR_SWATCH, GtkColorSwatch))
#define GTK_COLOR_SWATCH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_COLOR_SWATCH, GtkColorSwatchClass))
#define GTK_IS_COLOR_SWATCH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_COLOR_SWATCH)) #define GTK_IS_COLOR_SWATCH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_COLOR_SWATCH))
#define GTK_IS_COLOR_SWATCH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_COLOR_SWATCH))
#define GTK_COLOR_SWATCH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_COLOR_SWATCH, GtkColorSwatchClass))
typedef struct _GtkColorSwatch GtkColorSwatch; typedef struct _GtkColorSwatch GtkColorSwatch;
typedef struct _GtkColorSwatchClass GtkColorSwatchClass;
struct _GtkColorSwatch
{
GtkWidget parent_instance;
};
struct _GtkColorSwatchClass
{
GtkWidgetClass parent_class;
void ( * activate) (GtkColorSwatch *swatch);
void ( * customize) (GtkColorSwatch *swatch);
/* Padding for future expansion */
void (*_gtk_reserved1) (void);
void (*_gtk_reserved2) (void);
void (*_gtk_reserved3) (void);
void (*_gtk_reserved4) (void);
};
GType gtk_color_swatch_get_type (void) G_GNUC_CONST; GType gtk_color_swatch_get_type (void) G_GNUC_CONST;
GtkWidget * gtk_color_swatch_new (void); GtkWidget * gtk_color_swatch_new (void);

View File

@ -149,18 +149,7 @@ typedef struct _GtkExpanderClass GtkExpanderClass;
struct _GtkExpander struct _GtkExpander
{ {
GtkContainer parent_instance; GtkContainer parent_instance;
};
struct _GtkExpanderClass
{
GtkContainerClass parent_class;
void (* activate) (GtkExpander *expander);
};
typedef struct _GtkExpanderPrivate GtkExpanderPrivate;
struct _GtkExpanderPrivate
{
GtkWidget *label_widget; GtkWidget *label_widget;
GtkWidget *box; GtkWidget *box;
@ -176,6 +165,13 @@ struct _GtkExpanderPrivate
guint resize_toplevel : 1; guint resize_toplevel : 1;
}; };
struct _GtkExpanderClass
{
GtkContainerClass parent_class;
void (* activate) (GtkExpander *expander);
};
static void gtk_expander_set_property (GObject *object, static void gtk_expander_set_property (GObject *object,
guint prop_id, guint prop_id,
const GValue *value, const GValue *value,
@ -226,7 +222,6 @@ static void gesture_click_released_cb (GtkGestureClick *gesture,
GtkExpander *expander); GtkExpander *expander);
G_DEFINE_TYPE_WITH_CODE (GtkExpander, gtk_expander, GTK_TYPE_CONTAINER, G_DEFINE_TYPE_WITH_CODE (GtkExpander, gtk_expander, GTK_TYPE_CONTAINER,
G_ADD_PRIVATE (GtkExpander)
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
gtk_expander_buildable_init)) gtk_expander_buildable_init))
@ -234,9 +229,8 @@ static gboolean
expand_timeout (gpointer data) expand_timeout (gpointer data)
{ {
GtkExpander *expander = GTK_EXPANDER (data); GtkExpander *expander = GTK_EXPANDER (data);
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
priv->expand_timer = 0; expander->expand_timer = 0;
gtk_expander_set_expanded (expander, TRUE); gtk_expander_set_expanded (expander, TRUE);
return FALSE; return FALSE;
@ -248,12 +242,10 @@ gtk_expander_drag_enter (GtkDropControllerMotion *motion,
double y, double y,
GtkExpander *expander) GtkExpander *expander)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander); if (!expander->expanded && !expander->expand_timer)
if (!priv->expanded && !priv->expand_timer)
{ {
priv->expand_timer = g_timeout_add (TIMEOUT_EXPAND, (GSourceFunc) expand_timeout, expander); expander->expand_timer = g_timeout_add (TIMEOUT_EXPAND, (GSourceFunc) expand_timeout, expander);
g_source_set_name_by_id (priv->expand_timer, "[gtk] expand_timeout"); g_source_set_name_by_id (expander->expand_timer, "[gtk] expand_timeout");
} }
return TRUE; return TRUE;
@ -263,12 +255,10 @@ static void
gtk_expander_drag_leave (GtkDropControllerMotion *motion, gtk_expander_drag_leave (GtkDropControllerMotion *motion,
GtkExpander *expander) GtkExpander *expander)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander); if (expander->expand_timer)
if (priv->expand_timer)
{ {
g_source_remove (priv->expand_timer); g_source_remove (expander->expand_timer);
priv->expand_timer = 0; expander->expand_timer = 0;
} }
} }
@ -277,13 +267,13 @@ gtk_expander_forall (GtkContainer *container,
GtkCallback callback, GtkCallback callback,
gpointer user_data) gpointer user_data)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (GTK_EXPANDER (container)); GtkExpander *expander = GTK_EXPANDER (container);
if (priv->child) if (expander->child)
(*callback) (priv->child, user_data); (*callback) (expander->child, user_data);
if (priv->label_widget) if (expander->label_widget)
(*callback) (priv->label_widget, user_data); (*callback) (expander->label_widget, user_data);
} }
static void static void
@ -382,30 +372,29 @@ gtk_expander_class_init (GtkExpanderClass *klass)
static void static void
gtk_expander_init (GtkExpander *expander) gtk_expander_init (GtkExpander *expander)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
GtkGesture *gesture; GtkGesture *gesture;
GtkEventController *controller; GtkEventController *controller;
priv->label_widget = NULL; expander->label_widget = NULL;
priv->child = NULL; expander->child = NULL;
priv->expanded = FALSE; expander->expanded = FALSE;
priv->use_underline = FALSE; expander->use_underline = FALSE;
priv->use_markup = FALSE; expander->use_markup = FALSE;
priv->expand_timer = 0; expander->expand_timer = 0;
priv->resize_toplevel = 0; expander->resize_toplevel = 0;
priv->box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); expander->box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_parent (priv->box, GTK_WIDGET (expander)); gtk_widget_set_parent (expander->box, GTK_WIDGET (expander));
priv->title_widget = g_object_new (GTK_TYPE_BOX, expander->title_widget = g_object_new (GTK_TYPE_BOX,
"css-name", "title", "css-name", "title",
NULL); NULL);
gtk_container_add (GTK_CONTAINER (priv->box), priv->title_widget); gtk_container_add (GTK_CONTAINER (expander->box), expander->title_widget);
priv->arrow_widget = gtk_builtin_icon_new ("expander"); expander->arrow_widget = gtk_builtin_icon_new ("expander");
gtk_widget_add_css_class (priv->arrow_widget, GTK_STYLE_CLASS_HORIZONTAL); gtk_widget_add_css_class (expander->arrow_widget, GTK_STYLE_CLASS_HORIZONTAL);
gtk_container_add (GTK_CONTAINER (priv->title_widget), priv->arrow_widget); gtk_container_add (GTK_CONTAINER (expander->title_widget), expander->arrow_widget);
controller = gtk_drop_controller_motion_new (); controller = gtk_drop_controller_motion_new ();
g_signal_connect (controller, "enter", G_CALLBACK (gtk_expander_drag_enter), expander); g_signal_connect (controller, "enter", G_CALLBACK (gtk_expander_drag_enter), expander);
@ -421,7 +410,7 @@ gtk_expander_init (GtkExpander *expander)
G_CALLBACK (gesture_click_released_cb), expander); G_CALLBACK (gesture_click_released_cb), expander);
gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (gesture), gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (gesture),
GTK_PHASE_BUBBLE); GTK_PHASE_BUBBLE);
gtk_widget_add_controller (GTK_WIDGET (priv->title_widget), GTK_EVENT_CONTROLLER (gesture)); gtk_widget_add_controller (GTK_WIDGET (expander->title_widget), GTK_EVENT_CONTROLLER (gesture));
} }
static GtkBuildableIface *parent_buildable_iface; static GtkBuildableIface *parent_buildable_iface;
@ -487,26 +476,25 @@ gtk_expander_get_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
GtkExpander *expander = GTK_EXPANDER (object); GtkExpander *expander = GTK_EXPANDER (object);
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
switch (prop_id) switch (prop_id)
{ {
case PROP_EXPANDED: case PROP_EXPANDED:
g_value_set_boolean (value, priv->expanded); g_value_set_boolean (value, expander->expanded);
break; break;
case PROP_LABEL: case PROP_LABEL:
g_value_set_string (value, gtk_expander_get_label (expander)); g_value_set_string (value, gtk_expander_get_label (expander));
break; break;
case PROP_USE_UNDERLINE: case PROP_USE_UNDERLINE:
g_value_set_boolean (value, priv->use_underline); g_value_set_boolean (value, expander->use_underline);
break; break;
case PROP_USE_MARKUP: case PROP_USE_MARKUP:
g_value_set_boolean (value, priv->use_markup); g_value_set_boolean (value, expander->use_markup);
break; break;
case PROP_LABEL_WIDGET: case PROP_LABEL_WIDGET:
g_value_set_object (value, g_value_set_object (value,
priv->label_widget ? expander->label_widget ?
G_OBJECT (priv->label_widget) : NULL); G_OBJECT (expander->label_widget) : NULL);
break; break;
case PROP_RESIZE_TOPLEVEL: case PROP_RESIZE_TOPLEVEL:
g_value_set_boolean (value, gtk_expander_get_resize_toplevel (expander)); g_value_set_boolean (value, gtk_expander_get_resize_toplevel (expander));
@ -520,21 +508,21 @@ gtk_expander_get_property (GObject *object,
static void static void
gtk_expander_destroy (GtkWidget *widget) gtk_expander_destroy (GtkWidget *widget)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (GTK_EXPANDER (widget)); GtkExpander *expander = GTK_EXPANDER (widget);
if (priv->expand_timer) if (expander->expand_timer)
{ {
g_source_remove (priv->expand_timer); g_source_remove (expander->expand_timer);
priv->expand_timer = 0; expander->expand_timer = 0;
} }
if (priv->box) if (expander->box)
{ {
gtk_widget_unparent (priv->box); gtk_widget_unparent (expander->box);
priv->box = NULL; expander->box = NULL;
priv->child = NULL; expander->child = NULL;
priv->label_widget = NULL; expander->label_widget = NULL;
priv->arrow_widget = NULL; expander->arrow_widget = NULL;
} }
GTK_WIDGET_CLASS (gtk_expander_parent_class)->destroy (widget); GTK_WIDGET_CLASS (gtk_expander_parent_class)->destroy (widget);
@ -546,9 +534,9 @@ gtk_expander_size_allocate (GtkWidget *widget,
int height, int height,
int baseline) int baseline)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (GTK_EXPANDER (widget)); GtkExpander *expander = GTK_EXPANDER (widget);
gtk_widget_size_allocate (priv->box, gtk_widget_size_allocate (expander->box,
&(GtkAllocation) { &(GtkAllocation) {
0, 0, 0, 0,
width, height width, height
@ -592,21 +580,19 @@ focus_in_site (GtkExpander *expander,
FocusSite site, FocusSite site,
GtkDirectionType direction) GtkDirectionType direction)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
switch (site) switch (site)
{ {
case FOCUS_WIDGET: case FOCUS_WIDGET:
gtk_widget_grab_focus (GTK_WIDGET (expander)); gtk_widget_grab_focus (GTK_WIDGET (expander));
return TRUE; return TRUE;
case FOCUS_LABEL: case FOCUS_LABEL:
if (priv->label_widget) if (expander->label_widget)
return gtk_widget_child_focus (priv->label_widget, direction); return gtk_widget_child_focus (expander->label_widget, direction);
else else
return FALSE; return FALSE;
case FOCUS_CHILD: case FOCUS_CHILD:
{ {
GtkWidget *child = priv->child; GtkWidget *child = expander->child;
if (child && gtk_widget_get_child_visible (child)) if (child && gtk_widget_get_child_visible (child))
return gtk_widget_child_focus (child, direction); return gtk_widget_child_focus (child, direction);
@ -704,10 +690,9 @@ get_next_site (GtkExpander *expander,
static void static void
gtk_expander_resize_toplevel (GtkExpander *expander) gtk_expander_resize_toplevel (GtkExpander *expander)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander); GtkWidget *child = expander->child;
GtkWidget *child = priv->child;
if (child && priv->resize_toplevel && if (child && expander->resize_toplevel &&
gtk_widget_get_realized (GTK_WIDGET (expander))) gtk_widget_get_realized (GTK_WIDGET (expander)))
{ {
GtkWidget *toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (expander))); GtkWidget *toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (expander)));
@ -722,7 +707,7 @@ gtk_expander_resize_toplevel (GtkExpander *expander)
&child_height, NULL, NULL, NULL); &child_height, NULL, NULL, NULL);
gtk_window_get_size (GTK_WINDOW (toplevel), &toplevel_width, &toplevel_height); gtk_window_get_size (GTK_WINDOW (toplevel), &toplevel_width, &toplevel_height);
if (priv->expanded) if (expander->expanded)
toplevel_height += child_height; toplevel_height += child_height;
else else
toplevel_height -= child_height; toplevel_height -= child_height;
@ -739,7 +724,6 @@ gtk_expander_focus (GtkWidget *widget,
GtkDirectionType direction) GtkDirectionType direction)
{ {
GtkExpander *expander = GTK_EXPANDER (widget); GtkExpander *expander = GTK_EXPANDER (widget);
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
if (!focus_current_site (expander, direction)) if (!focus_current_site (expander, direction))
{ {
@ -750,7 +734,7 @@ gtk_expander_focus (GtkWidget *widget,
widget_is_focus = gtk_widget_is_focus (widget); widget_is_focus = gtk_widget_is_focus (widget);
old_focus_child = gtk_widget_get_focus_child (GTK_WIDGET (widget)); old_focus_child = gtk_widget_get_focus_child (GTK_WIDGET (widget));
if (old_focus_child && old_focus_child == priv->label_widget) if (old_focus_child && old_focus_child == expander->label_widget)
site = FOCUS_LABEL; site = FOCUS_LABEL;
else if (old_focus_child) else if (old_focus_child)
site = FOCUS_CHILD; site = FOCUS_CHILD;
@ -774,9 +758,8 @@ gtk_expander_add (GtkContainer *container,
GtkWidget *widget) GtkWidget *widget)
{ {
GtkExpander *expander = GTK_EXPANDER (container); GtkExpander *expander = GTK_EXPANDER (container);
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
if (priv->child != NULL) if (expander->child != NULL)
{ {
g_warning ("Attempting to add a widget with type %s to a %s, " g_warning ("Attempting to add a widget with type %s to a %s, "
"but a %s can only contain one widget at a time; " "but a %s can only contain one widget at a time; "
@ -784,13 +767,13 @@ gtk_expander_add (GtkContainer *container,
g_type_name (G_OBJECT_TYPE (widget)), g_type_name (G_OBJECT_TYPE (widget)),
g_type_name (G_OBJECT_TYPE (container)), g_type_name (G_OBJECT_TYPE (container)),
g_type_name (G_OBJECT_TYPE (container)), g_type_name (G_OBJECT_TYPE (container)),
g_type_name (G_OBJECT_TYPE (priv->child))); g_type_name (G_OBJECT_TYPE (expander->child)));
return; return;
} }
if (priv->expanded) if (expander->expanded)
{ {
gtk_container_add (GTK_CONTAINER (priv->box), widget); gtk_container_add (GTK_CONTAINER (expander->box), widget);
} }
else else
{ {
@ -800,7 +783,7 @@ gtk_expander_add (GtkContainer *container,
g_object_ref (widget); g_object_ref (widget);
} }
priv->child = widget; expander->child = widget;
} }
static void static void
@ -808,14 +791,13 @@ gtk_expander_remove (GtkContainer *container,
GtkWidget *widget) GtkWidget *widget)
{ {
GtkExpander *expander = GTK_EXPANDER (container); GtkExpander *expander = GTK_EXPANDER (container);
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
if (priv->label_widget == widget) if (expander->label_widget == widget)
gtk_expander_set_label_widget (expander, NULL); gtk_expander_set_label_widget (expander, NULL);
else else
{ {
gtk_container_remove (GTK_CONTAINER (priv->box), widget); gtk_container_remove (GTK_CONTAINER (expander->box), widget);
if (!priv->expanded) if (!expander->expanded)
{ {
/* We hold an extra ref */ /* We hold an extra ref */
g_object_unref (widget); g_object_unref (widget);
@ -827,9 +809,7 @@ gtk_expander_remove (GtkContainer *container,
static void static void
gtk_expander_activate (GtkExpander *expander) gtk_expander_activate (GtkExpander *expander)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander); gtk_expander_set_expanded (expander, !expander->expanded);
gtk_expander_set_expanded (expander, !priv->expanded);
} }
static void static void
@ -842,9 +822,8 @@ gtk_expander_measure (GtkWidget *widget,
int *natural_baseline) int *natural_baseline)
{ {
GtkExpander *expander = GTK_EXPANDER (widget); GtkExpander *expander = GTK_EXPANDER (widget);
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
gtk_widget_measure (priv->box, gtk_widget_measure (expander->box,
orientation, orientation,
for_size, for_size,
minimum, natural, minimum, natural,
@ -901,36 +880,35 @@ void
gtk_expander_set_expanded (GtkExpander *expander, gtk_expander_set_expanded (GtkExpander *expander,
gboolean expanded) gboolean expanded)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
GtkWidget *child; GtkWidget *child;
g_return_if_fail (GTK_IS_EXPANDER (expander)); g_return_if_fail (GTK_IS_EXPANDER (expander));
expanded = expanded != FALSE; expanded = expanded != FALSE;
if (priv->expanded == expanded) if (expander->expanded == expanded)
return; return;
priv->expanded = expanded; expander->expanded = expanded;
if (priv->expanded) if (expander->expanded)
gtk_widget_set_state_flags (priv->arrow_widget, GTK_STATE_FLAG_CHECKED, FALSE); gtk_widget_set_state_flags (expander->arrow_widget, GTK_STATE_FLAG_CHECKED, FALSE);
else else
gtk_widget_unset_state_flags (priv->arrow_widget, GTK_STATE_FLAG_CHECKED); gtk_widget_unset_state_flags (expander->arrow_widget, GTK_STATE_FLAG_CHECKED);
child = priv->child; child = expander->child;
if (child) if (child)
{ {
if (priv->expanded) if (expander->expanded)
{ {
gtk_container_add (GTK_CONTAINER (priv->box), child); gtk_container_add (GTK_CONTAINER (expander->box), child);
g_object_unref (priv->child); g_object_unref (expander->child);
} }
else else
{ {
g_object_ref (priv->child); g_object_ref (expander->child);
gtk_container_remove (GTK_CONTAINER (priv->box), child); gtk_container_remove (GTK_CONTAINER (expander->box), child);
} }
gtk_expander_resize_toplevel (expander); gtk_expander_resize_toplevel (expander);
} }
@ -952,11 +930,9 @@ gtk_expander_set_expanded (GtkExpander *expander,
gboolean gboolean
gtk_expander_get_expanded (GtkExpander *expander) gtk_expander_get_expanded (GtkExpander *expander)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
g_return_val_if_fail (GTK_IS_EXPANDER (expander), FALSE); g_return_val_if_fail (GTK_IS_EXPANDER (expander), FALSE);
return priv->expanded; return expander->expanded;
} }
/** /**
@ -972,8 +948,6 @@ void
gtk_expander_set_label (GtkExpander *expander, gtk_expander_set_label (GtkExpander *expander,
const gchar *label) const gchar *label)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
g_return_if_fail (GTK_IS_EXPANDER (expander)); g_return_if_fail (GTK_IS_EXPANDER (expander));
if (!label) if (!label)
@ -985,8 +959,8 @@ gtk_expander_set_label (GtkExpander *expander,
GtkWidget *child; GtkWidget *child;
child = gtk_label_new (label); child = gtk_label_new (label);
gtk_label_set_use_underline (GTK_LABEL (child), priv->use_underline); gtk_label_set_use_underline (GTK_LABEL (child), expander->use_underline);
gtk_label_set_use_markup (GTK_LABEL (child), priv->use_markup); gtk_label_set_use_markup (GTK_LABEL (child), expander->use_markup);
gtk_widget_show (child); gtk_widget_show (child);
gtk_expander_set_label_widget (expander, child); gtk_expander_set_label_widget (expander, child);
@ -1017,12 +991,10 @@ gtk_expander_set_label (GtkExpander *expander,
const gchar * const gchar *
gtk_expander_get_label (GtkExpander *expander) gtk_expander_get_label (GtkExpander *expander)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
g_return_val_if_fail (GTK_IS_EXPANDER (expander), NULL); g_return_val_if_fail (GTK_IS_EXPANDER (expander), NULL);
if (GTK_IS_LABEL (priv->label_widget)) if (GTK_IS_LABEL (expander->label_widget))
return gtk_label_get_label (GTK_LABEL (priv->label_widget)); return gtk_label_get_label (GTK_LABEL (expander->label_widget));
else else
return NULL; return NULL;
} }
@ -1039,18 +1011,16 @@ void
gtk_expander_set_use_underline (GtkExpander *expander, gtk_expander_set_use_underline (GtkExpander *expander,
gboolean use_underline) gboolean use_underline)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
g_return_if_fail (GTK_IS_EXPANDER (expander)); g_return_if_fail (GTK_IS_EXPANDER (expander));
use_underline = use_underline != FALSE; use_underline = use_underline != FALSE;
if (priv->use_underline != use_underline) if (expander->use_underline != use_underline)
{ {
priv->use_underline = use_underline; expander->use_underline = use_underline;
if (GTK_IS_LABEL (priv->label_widget)) if (GTK_IS_LABEL (expander->label_widget))
gtk_label_set_use_underline (GTK_LABEL (priv->label_widget), use_underline); gtk_label_set_use_underline (GTK_LABEL (expander->label_widget), use_underline);
g_object_notify (G_OBJECT (expander), "use-underline"); g_object_notify (G_OBJECT (expander), "use-underline");
} }
@ -1069,11 +1039,9 @@ gtk_expander_set_use_underline (GtkExpander *expander,
gboolean gboolean
gtk_expander_get_use_underline (GtkExpander *expander) gtk_expander_get_use_underline (GtkExpander *expander)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
g_return_val_if_fail (GTK_IS_EXPANDER (expander), FALSE); g_return_val_if_fail (GTK_IS_EXPANDER (expander), FALSE);
return priv->use_underline; return expander->use_underline;
} }
/** /**
@ -1089,18 +1057,16 @@ void
gtk_expander_set_use_markup (GtkExpander *expander, gtk_expander_set_use_markup (GtkExpander *expander,
gboolean use_markup) gboolean use_markup)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
g_return_if_fail (GTK_IS_EXPANDER (expander)); g_return_if_fail (GTK_IS_EXPANDER (expander));
use_markup = use_markup != FALSE; use_markup = use_markup != FALSE;
if (priv->use_markup != use_markup) if (expander->use_markup != use_markup)
{ {
priv->use_markup = use_markup; expander->use_markup = use_markup;
if (GTK_IS_LABEL (priv->label_widget)) if (GTK_IS_LABEL (expander->label_widget))
gtk_label_set_use_markup (GTK_LABEL (priv->label_widget), use_markup); gtk_label_set_use_markup (GTK_LABEL (expander->label_widget), use_markup);
g_object_notify (G_OBJECT (expander), "use-markup"); g_object_notify (G_OBJECT (expander), "use-markup");
} }
@ -1119,11 +1085,9 @@ gtk_expander_set_use_markup (GtkExpander *expander,
gboolean gboolean
gtk_expander_get_use_markup (GtkExpander *expander) gtk_expander_get_use_markup (GtkExpander *expander)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
g_return_val_if_fail (GTK_IS_EXPANDER (expander), FALSE); g_return_val_if_fail (GTK_IS_EXPANDER (expander), FALSE);
return priv->use_markup; return expander->use_markup;
} }
/** /**
@ -1138,29 +1102,28 @@ void
gtk_expander_set_label_widget (GtkExpander *expander, gtk_expander_set_label_widget (GtkExpander *expander,
GtkWidget *label_widget) GtkWidget *label_widget)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
GtkWidget *widget; GtkWidget *widget;
g_return_if_fail (GTK_IS_EXPANDER (expander)); g_return_if_fail (GTK_IS_EXPANDER (expander));
g_return_if_fail (label_widget == NULL || GTK_IS_WIDGET (label_widget)); g_return_if_fail (label_widget == NULL || GTK_IS_WIDGET (label_widget));
g_return_if_fail (label_widget == NULL || gtk_widget_get_parent (label_widget) == NULL); g_return_if_fail (label_widget == NULL || gtk_widget_get_parent (label_widget) == NULL);
if (priv->label_widget == label_widget) if (expander->label_widget == label_widget)
return; return;
if (priv->label_widget) if (expander->label_widget)
{ {
gtk_container_remove (GTK_CONTAINER (priv->title_widget), priv->label_widget); gtk_container_remove (GTK_CONTAINER (expander->title_widget), expander->label_widget);
} }
priv->label_widget = label_widget; expander->label_widget = label_widget;
widget = GTK_WIDGET (expander); widget = GTK_WIDGET (expander);
if (label_widget) if (label_widget)
{ {
priv->label_widget = label_widget; expander->label_widget = label_widget;
gtk_container_add (GTK_CONTAINER (priv->title_widget), label_widget); gtk_container_add (GTK_CONTAINER (expander->title_widget), label_widget);
} }
if (gtk_widget_get_visible (widget)) if (gtk_widget_get_visible (widget))
@ -1185,11 +1148,9 @@ gtk_expander_set_label_widget (GtkExpander *expander,
GtkWidget * GtkWidget *
gtk_expander_get_label_widget (GtkExpander *expander) gtk_expander_get_label_widget (GtkExpander *expander)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
g_return_val_if_fail (GTK_IS_EXPANDER (expander), NULL); g_return_val_if_fail (GTK_IS_EXPANDER (expander), NULL);
return priv->label_widget; return expander->label_widget;
} }
/** /**
@ -1204,13 +1165,11 @@ void
gtk_expander_set_resize_toplevel (GtkExpander *expander, gtk_expander_set_resize_toplevel (GtkExpander *expander,
gboolean resize_toplevel) gboolean resize_toplevel)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
g_return_if_fail (GTK_IS_EXPANDER (expander)); g_return_if_fail (GTK_IS_EXPANDER (expander));
if (priv->resize_toplevel != resize_toplevel) if (expander->resize_toplevel != resize_toplevel)
{ {
priv->resize_toplevel = resize_toplevel ? TRUE : FALSE; expander->resize_toplevel = resize_toplevel ? TRUE : FALSE;
g_object_notify (G_OBJECT (expander), "resize-toplevel"); g_object_notify (G_OBJECT (expander), "resize-toplevel");
} }
} }
@ -1227,9 +1186,7 @@ gtk_expander_set_resize_toplevel (GtkExpander *expander,
gboolean gboolean
gtk_expander_get_resize_toplevel (GtkExpander *expander) gtk_expander_get_resize_toplevel (GtkExpander *expander)
{ {
GtkExpanderPrivate *priv = gtk_expander_get_instance_private (expander);
g_return_val_if_fail (GTK_IS_EXPANDER (expander), FALSE); g_return_val_if_fail (GTK_IS_EXPANDER (expander), FALSE);
return priv->resize_toplevel; return expander->resize_toplevel;
} }

View File

@ -70,17 +70,7 @@
struct _GtkLockButton struct _GtkLockButton
{ {
GtkButton parent_instance; GtkButton parent_instance;
};
typedef struct _GtkLockButtonClass GtkLockButtonClass;
struct _GtkLockButtonClass
{
GtkButtonClass parent_class;
};
typedef struct _GtkLockButtonPrivate GtkLockButtonPrivate;
struct _GtkLockButtonPrivate
{
GPermission *permission; GPermission *permission;
GCancellable *cancellable; GCancellable *cancellable;
@ -97,6 +87,12 @@ struct _GtkLockButtonPrivate
GtkWidget *label_unlock; GtkWidget *label_unlock;
}; };
typedef struct _GtkLockButtonClass GtkLockButtonClass;
struct _GtkLockButtonClass
{
GtkButtonClass parent_class;
};
enum enum
{ {
PROP_0, PROP_0,
@ -115,33 +111,32 @@ static void on_permission_changed (GPermission *permission,
GParamSpec *pspec, GParamSpec *pspec,
gpointer user_data); gpointer user_data);
G_DEFINE_TYPE_WITH_PRIVATE (GtkLockButton, gtk_lock_button, GTK_TYPE_BUTTON) G_DEFINE_TYPE (GtkLockButton, gtk_lock_button, GTK_TYPE_BUTTON)
static void static void
gtk_lock_button_finalize (GObject *object) gtk_lock_button_finalize (GObject *object)
{ {
GtkLockButton *button = GTK_LOCK_BUTTON (object); GtkLockButton *button = GTK_LOCK_BUTTON (object);
GtkLockButtonPrivate *priv = gtk_lock_button_get_instance_private (button);
g_free (priv->tooltip_lock); g_free (button->tooltip_lock);
g_free (priv->tooltip_unlock); g_free (button->tooltip_unlock);
g_free (priv->tooltip_not_authorized); g_free (button->tooltip_not_authorized);
g_object_unref (priv->icon_lock); g_object_unref (button->icon_lock);
g_object_unref (priv->icon_unlock); g_object_unref (button->icon_unlock);
if (priv->cancellable != NULL) if (button->cancellable != NULL)
{ {
g_cancellable_cancel (priv->cancellable); g_cancellable_cancel (button->cancellable);
g_object_unref (priv->cancellable); g_object_unref (button->cancellable);
} }
if (priv->permission) if (button->permission)
{ {
g_signal_handlers_disconnect_by_func (priv->permission, g_signal_handlers_disconnect_by_func (button->permission,
on_permission_changed, on_permission_changed,
button); button);
g_object_unref (priv->permission); g_object_unref (button->permission);
} }
G_OBJECT_CLASS (gtk_lock_button_parent_class)->finalize (object); G_OBJECT_CLASS (gtk_lock_button_parent_class)->finalize (object);
@ -154,32 +149,31 @@ gtk_lock_button_get_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
GtkLockButton *button = GTK_LOCK_BUTTON (object); GtkLockButton *button = GTK_LOCK_BUTTON (object);
GtkLockButtonPrivate *priv = gtk_lock_button_get_instance_private (button);
switch (property_id) switch (property_id)
{ {
case PROP_PERMISSION: case PROP_PERMISSION:
g_value_set_object (value, priv->permission); g_value_set_object (value, button->permission);
break; break;
case PROP_TEXT_LOCK: case PROP_TEXT_LOCK:
g_value_set_string (value, gtk_label_get_text (GTK_LABEL (priv->label_lock))); g_value_set_string (value, gtk_label_get_text (GTK_LABEL (button->label_lock)));
break; break;
case PROP_TEXT_UNLOCK: case PROP_TEXT_UNLOCK:
g_value_set_string (value, gtk_label_get_text (GTK_LABEL (priv->label_unlock))); g_value_set_string (value, gtk_label_get_text (GTK_LABEL (button->label_unlock)));
break; break;
case PROP_TOOLTIP_LOCK: case PROP_TOOLTIP_LOCK:
g_value_set_string (value, priv->tooltip_lock); g_value_set_string (value, button->tooltip_lock);
break; break;
case PROP_TOOLTIP_UNLOCK: case PROP_TOOLTIP_UNLOCK:
g_value_set_string (value, priv->tooltip_unlock); g_value_set_string (value, button->tooltip_unlock);
break; break;
case PROP_TOOLTIP_NOT_AUTHORIZED: case PROP_TOOLTIP_NOT_AUTHORIZED:
g_value_set_string (value, priv->tooltip_not_authorized); g_value_set_string (value, button->tooltip_not_authorized);
break; break;
default: default:
@ -195,7 +189,6 @@ gtk_lock_button_set_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
GtkLockButton *button = GTK_LOCK_BUTTON (object); GtkLockButton *button = GTK_LOCK_BUTTON (object);
GtkLockButtonPrivate *priv = gtk_lock_button_get_instance_private (button);
switch (property_id) switch (property_id)
{ {
@ -204,28 +197,28 @@ gtk_lock_button_set_property (GObject *object,
break; break;
case PROP_TEXT_LOCK: case PROP_TEXT_LOCK:
gtk_label_set_text (GTK_LABEL (priv->label_lock), g_value_get_string (value)); gtk_label_set_text (GTK_LABEL (button->label_lock), g_value_get_string (value));
_gtk_lock_button_accessible_name_changed (button); _gtk_lock_button_accessible_name_changed (button);
break; break;
case PROP_TEXT_UNLOCK: case PROP_TEXT_UNLOCK:
gtk_label_set_text (GTK_LABEL (priv->label_unlock), g_value_get_string (value)); gtk_label_set_text (GTK_LABEL (button->label_unlock), g_value_get_string (value));
_gtk_lock_button_accessible_name_changed (button); _gtk_lock_button_accessible_name_changed (button);
break; break;
case PROP_TOOLTIP_LOCK: case PROP_TOOLTIP_LOCK:
g_free (priv->tooltip_lock); g_free (button->tooltip_lock);
priv->tooltip_lock = g_value_dup_string (value); button->tooltip_lock = g_value_dup_string (value);
break; break;
case PROP_TOOLTIP_UNLOCK: case PROP_TOOLTIP_UNLOCK:
g_free (priv->tooltip_unlock); g_free (button->tooltip_unlock);
priv->tooltip_unlock = g_value_dup_string (value); button->tooltip_unlock = g_value_dup_string (value);
break; break;
case PROP_TOOLTIP_NOT_AUTHORIZED: case PROP_TOOLTIP_NOT_AUTHORIZED:
g_free (priv->tooltip_not_authorized); g_free (button->tooltip_not_authorized);
priv->tooltip_not_authorized = g_value_dup_string (value); button->tooltip_not_authorized = g_value_dup_string (value);
break; break;
default: default:
@ -239,7 +232,6 @@ gtk_lock_button_set_property (GObject *object,
static void static void
gtk_lock_button_init (GtkLockButton *button) gtk_lock_button_init (GtkLockButton *button)
{ {
GtkLockButtonPrivate *priv = gtk_lock_button_get_instance_private (button);
const char *names[3]; const char *names[3];
gtk_widget_init_template (GTK_WIDGET (button)); gtk_widget_init_template (GTK_WIDGET (button));
@ -247,12 +239,12 @@ gtk_lock_button_init (GtkLockButton *button)
names[0] = "changes-allow-symbolic"; names[0] = "changes-allow-symbolic";
names[1] = "changes-allow"; names[1] = "changes-allow";
names[2] = NULL; names[2] = NULL;
priv->icon_unlock = g_themed_icon_new_from_names ((char **) names, -1); button->icon_unlock = g_themed_icon_new_from_names ((char **) names, -1);
names[0] = "changes-prevent-symbolic"; names[0] = "changes-prevent-symbolic";
names[1] = "changes-prevent"; names[1] = "changes-prevent";
names[2] = NULL; names[2] = NULL;
priv->icon_lock = g_themed_icon_new_from_names ((char **) names, -1); button->icon_lock = g_themed_icon_new_from_names ((char **) names, -1);
update_state (button); update_state (button);
@ -328,11 +320,11 @@ gtk_lock_button_class_init (GtkLockButtonClass *klass)
/* Bind class to template /* Bind class to template
*/ */
gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/ui/gtklockbutton.ui"); gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/ui/gtklockbutton.ui");
gtk_widget_class_bind_template_child_private (widget_class, GtkLockButton, box); gtk_widget_class_bind_template_child (widget_class, GtkLockButton, box);
gtk_widget_class_bind_template_child_private (widget_class, GtkLockButton, image); gtk_widget_class_bind_template_child (widget_class, GtkLockButton, image);
gtk_widget_class_bind_template_child_private (widget_class, GtkLockButton, label_lock); gtk_widget_class_bind_template_child (widget_class, GtkLockButton, label_lock);
gtk_widget_class_bind_template_child_private (widget_class, GtkLockButton, label_unlock); gtk_widget_class_bind_template_child (widget_class, GtkLockButton, label_unlock);
gtk_widget_class_bind_template_child_private (widget_class, GtkLockButton, stack); gtk_widget_class_bind_template_child (widget_class, GtkLockButton, stack);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LOCK_BUTTON_ACCESSIBLE); gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LOCK_BUTTON_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("button")); gtk_widget_class_set_css_name (widget_class, I_("button"));
@ -341,7 +333,6 @@ gtk_lock_button_class_init (GtkLockButtonClass *klass)
static void static void
update_state (GtkLockButton *button) update_state (GtkLockButton *button)
{ {
GtkLockButtonPrivate *priv = gtk_lock_button_get_instance_private (button);
gboolean allowed; gboolean allowed;
gboolean can_acquire; gboolean can_acquire;
gboolean can_release; gboolean can_release;
@ -350,11 +341,11 @@ update_state (GtkLockButton *button)
GIcon *icon; GIcon *icon;
const gchar *tooltip; const gchar *tooltip;
if (priv->permission) if (button->permission)
{ {
allowed = g_permission_get_allowed (priv->permission); allowed = g_permission_get_allowed (button->permission);
can_acquire = g_permission_get_can_acquire (priv->permission); can_acquire = g_permission_get_can_acquire (button->permission);
can_release = g_permission_get_can_release (priv->permission); can_release = g_permission_get_can_release (button->permission);
} }
else else
{ {
@ -367,38 +358,38 @@ update_state (GtkLockButton *button)
{ {
visible = TRUE; visible = TRUE;
sensitive = TRUE; sensitive = TRUE;
icon = priv->icon_lock; icon = button->icon_lock;
tooltip = priv->tooltip_lock; tooltip = button->tooltip_lock;
} }
else if (allowed && !can_release) else if (allowed && !can_release)
{ {
visible = FALSE; visible = FALSE;
sensitive = TRUE; sensitive = TRUE;
icon = priv->icon_lock; icon = button->icon_lock;
tooltip = priv->tooltip_lock; tooltip = button->tooltip_lock;
} }
else if (!allowed && can_acquire) else if (!allowed && can_acquire)
{ {
visible = TRUE; visible = TRUE;
sensitive = TRUE; sensitive = TRUE;
icon = priv->icon_unlock; icon = button->icon_unlock;
tooltip = priv->tooltip_unlock; tooltip = button->tooltip_unlock;
} }
else if (!allowed && !can_acquire) else if (!allowed && !can_acquire)
{ {
visible = TRUE; visible = TRUE;
sensitive = FALSE; sensitive = FALSE;
icon = priv->icon_unlock; icon = button->icon_unlock;
tooltip = priv->tooltip_not_authorized; tooltip = button->tooltip_not_authorized;
} }
else else
{ {
g_assert_not_reached (); g_assert_not_reached ();
} }
gtk_image_set_from_gicon (GTK_IMAGE (priv->image), icon); gtk_image_set_from_gicon (GTK_IMAGE (button->image), icon);
gtk_stack_set_visible_child (GTK_STACK (priv->stack), gtk_stack_set_visible_child (GTK_STACK (button->stack),
allowed ? priv->label_lock : priv->label_unlock); allowed ? button->label_lock : button->label_unlock);
_gtk_lock_button_accessible_name_changed (button); _gtk_lock_button_accessible_name_changed (button);
gtk_widget_set_tooltip_markup (GTK_WIDGET (button), tooltip); gtk_widget_set_tooltip_markup (GTK_WIDGET (button), tooltip);
gtk_widget_set_sensitive (GTK_WIDGET (button), sensitive); gtk_widget_set_sensitive (GTK_WIDGET (button), sensitive);
@ -421,18 +412,17 @@ acquire_cb (GObject *source,
gpointer user_data) gpointer user_data)
{ {
GtkLockButton *button = GTK_LOCK_BUTTON (user_data); GtkLockButton *button = GTK_LOCK_BUTTON (user_data);
GtkLockButtonPrivate *priv = gtk_lock_button_get_instance_private (button);
GError *error; GError *error;
error = NULL; error = NULL;
if (!g_permission_acquire_finish (priv->permission, result, &error)) if (!g_permission_acquire_finish (button->permission, result, &error))
{ {
g_warning ("Error acquiring permission: %s", error->message); g_warning ("Error acquiring permission: %s", error->message);
g_error_free (error); g_error_free (error);
} }
g_object_unref (priv->cancellable); g_object_unref (button->cancellable);
priv->cancellable = NULL; button->cancellable = NULL;
update_state (button); update_state (button);
} }
@ -443,53 +433,52 @@ release_cb (GObject *source,
gpointer user_data) gpointer user_data)
{ {
GtkLockButton *button = GTK_LOCK_BUTTON (user_data); GtkLockButton *button = GTK_LOCK_BUTTON (user_data);
GtkLockButtonPrivate *priv = gtk_lock_button_get_instance_private (button);
GError *error; GError *error;
error = NULL; error = NULL;
if (!g_permission_release_finish (priv->permission, result, &error)) if (!g_permission_release_finish (button->permission, result, &error))
{ {
g_warning ("Error releasing permission: %s", error->message); g_warning ("Error releasing permission: %s", error->message);
g_error_free (error); g_error_free (error);
} }
g_object_unref (priv->cancellable); g_object_unref (button->cancellable);
priv->cancellable = NULL; button->cancellable = NULL;
update_state (button); update_state (button);
} }
static void static void
gtk_lock_button_clicked (GtkButton *button) gtk_lock_button_clicked (GtkButton *widget)
{ {
GtkLockButtonPrivate *priv = gtk_lock_button_get_instance_private (GTK_LOCK_BUTTON (button)); GtkLockButton *button = GTK_LOCK_BUTTON (widget);
/* if we already have a pending interactive check or permission is not set, /* if we already have a pending interactive check or permission is not set,
* then do nothing * then do nothing
*/ */
if (priv->cancellable != NULL || priv->permission == NULL) if (button->cancellable != NULL || button->permission == NULL)
return; return;
if (g_permission_get_allowed (priv->permission)) if (g_permission_get_allowed (button->permission))
{ {
if (g_permission_get_can_release (priv->permission)) if (g_permission_get_can_release (button->permission))
{ {
priv->cancellable = g_cancellable_new (); button->cancellable = g_cancellable_new ();
g_permission_release_async (priv->permission, g_permission_release_async (button->permission,
priv->cancellable, button->cancellable,
release_cb, release_cb,
button); button);
} }
} }
else else
{ {
if (g_permission_get_can_acquire (priv->permission)) if (g_permission_get_can_acquire (button->permission))
{ {
priv->cancellable = g_cancellable_new (); button->cancellable = g_cancellable_new ();
g_permission_acquire_async (priv->permission, g_permission_acquire_async (button->permission,
priv->cancellable, button->cancellable,
acquire_cb, acquire_cb,
button); button);
} }
@ -523,11 +512,9 @@ gtk_lock_button_new (GPermission *permission)
GPermission * GPermission *
gtk_lock_button_get_permission (GtkLockButton *button) gtk_lock_button_get_permission (GtkLockButton *button)
{ {
GtkLockButtonPrivate *priv = gtk_lock_button_get_instance_private (button);
g_return_val_if_fail (GTK_IS_LOCK_BUTTON (button), NULL); g_return_val_if_fail (GTK_IS_LOCK_BUTTON (button), NULL);
return priv->permission; return button->permission;
} }
/** /**
@ -541,27 +528,25 @@ void
gtk_lock_button_set_permission (GtkLockButton *button, gtk_lock_button_set_permission (GtkLockButton *button,
GPermission *permission) GPermission *permission)
{ {
GtkLockButtonPrivate *priv = gtk_lock_button_get_instance_private (button);
g_return_if_fail (GTK_IS_LOCK_BUTTON (button)); g_return_if_fail (GTK_IS_LOCK_BUTTON (button));
g_return_if_fail (permission == NULL || G_IS_PERMISSION (permission)); g_return_if_fail (permission == NULL || G_IS_PERMISSION (permission));
if (priv->permission != permission) if (button->permission != permission)
{ {
if (priv->permission) if (button->permission)
{ {
g_signal_handlers_disconnect_by_func (priv->permission, g_signal_handlers_disconnect_by_func (button->permission,
on_permission_changed, on_permission_changed,
button); button);
g_object_unref (priv->permission); g_object_unref (button->permission);
} }
priv->permission = permission; button->permission = permission;
if (priv->permission) if (button->permission)
{ {
g_object_ref (priv->permission); g_object_ref (button->permission);
g_signal_connect (priv->permission, "notify", g_signal_connect (button->permission, "notify",
G_CALLBACK (on_permission_changed), button); G_CALLBACK (on_permission_changed), button);
} }
@ -574,12 +559,11 @@ gtk_lock_button_set_permission (GtkLockButton *button,
const char * const char *
_gtk_lock_button_get_current_text (GtkLockButton *button) _gtk_lock_button_get_current_text (GtkLockButton *button)
{ {
GtkLockButtonPrivate *priv = gtk_lock_button_get_instance_private (button);
GtkWidget *label; GtkWidget *label;
g_return_val_if_fail (GTK_IS_LOCK_BUTTON (button), NULL); g_return_val_if_fail (GTK_IS_LOCK_BUTTON (button), NULL);
label = gtk_stack_get_visible_child (GTK_STACK (priv->stack)); label = gtk_stack_get_visible_child (GTK_STACK (button->stack));
return gtk_label_get_text (GTK_LABEL (label)); return gtk_label_get_text (GTK_LABEL (label));
} }