static gboolean query_unlock_tooltip (GtkWidget *widget, gint x, gint y, gboolean keyboard_tooltip, GtkTooltip *tooltip, gpointer user_data) { GtkWidget *label; PangoLayout *layout; PangoAttrList *attrs; IconShapeData *data; data = g_object_get_data (G_OBJECT (widget), "icon-shape-data"); label = g_object_get_data (G_OBJECT (widget), "tooltip-label"); if (label == NULL) { label = gtk_label_new (data->text); g_object_ref_sink (label); g_object_set_data_full (G_OBJECT (widget), "tooltip-label", label, g_object_unref); } layout = gtk_label_get_layout (GTK_LABEL (label)); pango_cairo_context_set_shape_renderer (pango_layout_get_context (layout), icon_shape_renderer, data, NULL); attrs = create_shape_attr_list_for_layout (layout, data); gtk_label_set_attributes (GTK_LABEL (label), attrs); pango_attr_list_unref (attrs); gtk_tooltip_set_custom (tooltip, label); return TRUE; }
void getTooltipColors_TooltipSetCustom() { // Create a temporary tooltip GType typeTooltip = gtk_tooltip_get_type(); GtkTooltip* tooltip = (GtkTooltip*)g_object_new(typeTooltip, NULL); // Add temporary label as custom control into tooltip GtkWidget* customLabel = (GtkWidget*)g_object_new(GTK_TYPE_LABEL, NULL); gtk_tooltip_set_custom(tooltip, customLabel); // Find tooltip window, using custom widget as entry point GtkWidget* tooltipBox = gtk_widget_get_parent(customLabel); GtkWidget* tooltipWindow = gtk_widget_get_parent(tooltipBox); // Obtain style contexts // For label, just use temporary label; this is easier then finding the original label GtkStyleContext* styleContextLabel = gtk_widget_get_style_context(customLabel); GtkStyleContext* styleContextTooltip = gtk_widget_get_style_context(tooltipWindow); // Print printTooltipColors(styleContextLabel, styleContextTooltip, "TooltipSetCustom"); // Cleanup // customLabel is owned by tooltip and will be destroyed automatically g_object_unref(tooltip); }
static void gtk_tooltip_dispose (GObject *object) { GtkTooltip *tooltip = GTK_TOOLTIP (object); if (tooltip->timeout_id) { g_source_remove (tooltip->timeout_id); tooltip->timeout_id = 0; } if (tooltip->browse_mode_timeout_id) { g_source_remove (tooltip->browse_mode_timeout_id); tooltip->browse_mode_timeout_id = 0; } gtk_tooltip_set_custom (tooltip, NULL); gtk_tooltip_set_last_window (tooltip, NULL); if (tooltip->window) { GdkDisplay *display; display = gtk_widget_get_display (tooltip->window); g_signal_handlers_disconnect_by_func (display, gtk_tooltip_display_closed, tooltip); gtk_widget_destroy (tooltip->window); tooltip->window = NULL; } G_OBJECT_CLASS (gtk_tooltip_parent_class)->dispose (object); }
static void gtk_tooltip_window_hide (GtkWidget *widget, gpointer user_data) { GtkTooltip *tooltip = GTK_TOOLTIP (user_data); gtk_tooltip_set_custom (tooltip, NULL); }
static gboolean contact_list_view_query_tooltip_cb (EmpathyContactListView *view, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data) { EmpathyContactListViewPriv *priv = GET_PRIV (view); EmpathyContact *contact; GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *path; /* FIXME: We need GTK version >= 2.12.10. See GNOME bug #504087 */ if (gtk_check_version (2, 12, 10)) { return FALSE; } if (!gtk_tree_view_get_tooltip_context (GTK_TREE_VIEW (view), &x, &y, keyboard_mode, &model, &path, &iter)) { return FALSE; } gtk_tree_view_set_tooltip_row (GTK_TREE_VIEW (view), tooltip, path); gtk_tree_path_free (path); gtk_tree_model_get (model, &iter, EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact, -1); if (!contact) { return FALSE; } if (!priv->tooltip_widget) { priv->tooltip_widget = empathy_contact_widget_new (contact, EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP); g_object_ref (priv->tooltip_widget); g_signal_connect (priv->tooltip_widget, "destroy", G_CALLBACK (contact_list_view_tooltip_destroy_cb), view); } else { empathy_contact_widget_set_contact (priv->tooltip_widget, contact); } gtk_tooltip_set_custom (tooltip, priv->tooltip_widget); g_object_unref (contact); return TRUE; }
static gboolean contact_list_view_query_tooltip_cb (EmpathyContactListView *view, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data) { EmpathyContactListViewPriv *priv = GET_PRIV (view); EmpathyContact *contact; GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *path; /* FIXME: We need GTK version >= 2.12.10. See GNOME bug #504087 */ if (100 * gtk_minor_version + gtk_micro_version < 1210) { return FALSE; } if (!gtk_tree_view_get_tooltip_context (GTK_TREE_VIEW (view), &x, &y, keyboard_mode, &model, &path, &iter)) { return FALSE; } gtk_tree_view_set_tooltip_row (GTK_TREE_VIEW (view), tooltip, path); gtk_tree_path_free (path); gtk_tree_model_get (model, &iter, EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact, -1); if (!contact) { return FALSE; } if (!priv->tooltip_widget) { priv->tooltip_widget = empathy_contact_widget_new (contact, EMPATHY_CONTACT_WIDGET_EDIT_NONE); g_object_add_weak_pointer (G_OBJECT (priv->tooltip_widget), (gpointer) &priv->tooltip_widget); } else { empathy_contact_widget_set_contact (priv->tooltip_widget, contact); } gtk_tooltip_set_custom (tooltip, priv->tooltip_widget); g_object_unref (contact); return TRUE; }
static gboolean query_tooltip_label_cb (GtkWidget *widget, gint x, gint y, gboolean keyboard_tip, GtkTooltip *tooltip, gpointer data) { GtkWidget *custom = data; gtk_tooltip_set_custom (tooltip, custom); return TRUE; }
static void ide_omni_bar__build_button__query_tooltip (IdeOmniBar *self, gint x, gint y, gboolean keyboard, GtkTooltip *tooltip, GtkButton *button) { g_assert (IDE_IS_OMNI_BAR (self)); g_assert (GTK_IS_TOOLTIP (tooltip)); g_assert (GTK_IS_BUTTON (button)); gtk_tooltip_set_custom (tooltip, GTK_WIDGET (self->build_button_shortcut)); }
static gboolean gimp_help_menu_item_query_tooltip (GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip) { GtkWidget *vbox; GtkWidget *label; gchar *text; gboolean use_markup = TRUE; text = gtk_widget_get_tooltip_markup (widget); if (! text) { text = gtk_widget_get_tooltip_text (widget); use_markup = FALSE; } if (! text) return FALSE; vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); label = gtk_label_new (text); gtk_label_set_use_markup (GTK_LABEL (label), use_markup); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_label_set_xalign (GTK_LABEL (label), 0.0); gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0); gtk_widget_show (label); g_free (text); label = gtk_label_new (_("Press F1 for more help")); gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_STYLE, PANGO_STYLE_ITALIC, PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, -1); gtk_label_set_xalign (GTK_LABEL (label), 1.0); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); gtk_tooltip_set_custom (tooltip, vbox); return TRUE; }
static gboolean gtk_tooltip_run_requery (GtkWidget **widget, GtkTooltip *tooltip, gint *x, gint *y) { gboolean has_tooltip = FALSE; gboolean return_value = FALSE; gtk_tooltip_reset (tooltip); do { g_object_get (*widget, "has-tooltip", &has_tooltip, NULL); if (has_tooltip) g_signal_emit_by_name (*widget, "query-tooltip", *x, *y, tooltip->keyboard_mode_enabled, tooltip, &return_value); if (!return_value) { GtkWidget *parent = gtk_widget_get_parent (*widget); if (parent) gtk_widget_translate_coordinates (*widget, parent, *x, *y, x, y); *widget = parent; } else break; } while (*widget); /* If the custom widget was not reset in the query-tooltip * callback, we clear it here. */ if (!tooltip->custom_was_reset) gtk_tooltip_set_custom (tooltip, NULL); return return_value; }
static gboolean set_tooltip_widget_from_marks (GtkSourceView *view, GtkTooltip *tooltip, GSList *marks) { GtkGrid *grid = NULL; gint row_num = 0; gint icon_size; gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, NULL, &icon_size); for (; marks; marks = g_slist_next (marks)) { const gchar *category; GtkSourceMark *mark; GtkSourceMarkAttributes *attrs; gchar *text; gboolean ismarkup = FALSE; GtkWidget *label; const GdkPixbuf *pixbuf; mark = marks->data; category = gtk_source_mark_get_category (mark); attrs = gtk_source_view_get_mark_attributes (view, category, NULL); if (attrs == NULL) { continue; } text = gtk_source_mark_attributes_get_tooltip_markup (attrs, mark); if (text == NULL) { text = gtk_source_mark_attributes_get_tooltip_text (attrs, mark); } else { ismarkup = TRUE; } if (text == NULL) { continue; } if (grid == NULL) { grid = GTK_GRID (gtk_grid_new ()); gtk_grid_set_column_spacing (grid, 4); gtk_widget_show (GTK_WIDGET (grid)); } label = gtk_label_new (NULL); if (ismarkup) { gtk_label_set_markup (GTK_LABEL (label), text); } else { gtk_label_set_text (GTK_LABEL (label), text); } gtk_widget_set_halign (label, GTK_ALIGN_START); gtk_widget_set_valign (label, GTK_ALIGN_START); gtk_widget_show (label); pixbuf = gtk_source_mark_attributes_render_icon (attrs, GTK_WIDGET (view), icon_size); if (pixbuf == NULL) { gtk_grid_attach (grid, label, 0, row_num, 2, 1); } else { GtkWidget *image; GdkPixbuf *copy; /* FIXME why a copy is needed? */ copy = gdk_pixbuf_copy (pixbuf); image = gtk_image_new_from_pixbuf (copy); g_object_unref (copy); gtk_widget_set_halign (image, GTK_ALIGN_START); gtk_widget_set_valign (image, GTK_ALIGN_START); gtk_widget_show (image); gtk_grid_attach (grid, image, 0, row_num, 1, 1); gtk_grid_attach (grid, label, 1, row_num, 1, 1); } row_num++; if (marks->next != NULL) { GtkWidget *separator; separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); gtk_widget_show (separator); gtk_grid_attach (grid, separator, 0, row_num, 2, 1); row_num++; } g_free (text); } if (grid == NULL) { return FALSE; } gtk_tooltip_set_custom (tooltip, GTK_WIDGET (grid)); return TRUE; }
/** * gva_main_search_query_tooltip_cb: * @widget: the object which received the signal * @x: the x coordinate of the cursor position where the request has been * emitted, relative to @widget->window * @y: the y coordinate of the cursor position where the request has been * emitted, relative to @widget->window * @keyboard_mode: @TRUE if the tooltip was triggerd using the keyboard * @tooltip: a #GtkTooltip * * Handler for #GtkWidget::query-tooltip signals to the search interface. * * Displays some tips for searching. * * Returns: always %TRUE (show the tooltip) **/ gboolean gva_main_search_query_tooltip_cb (GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip) { GtkWidget *custom; gchar *text; custom = gtk_table_new (5, 2, FALSE); gtk_table_set_col_spacings (GTK_TABLE (custom), 12); gtk_table_set_row_spacing (GTK_TABLE (custom), 0, 6); gtk_tooltip_set_custom (tooltip, custom); widget = gtk_label_new (_("Search for any of the following:")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (custom), widget, 0, 2, 0, 1); gtk_widget_show (widget); /* The labels begin with a UTF-8 encoded bullet character. */ text = g_strdup_printf ("• %s", _("Game Title")); widget = gtk_label_new (text); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (custom), widget, 0, 1, 1, 2); gtk_widget_show (widget); g_free (text); text = g_strdup_printf ("• %s", _("Manufacturer")); widget = gtk_label_new (text); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (custom), widget, 0, 1, 2, 3); gtk_widget_show (widget); g_free (text); text = g_strdup_printf ("• %s", _("Copyright Year")); widget = gtk_label_new (text); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (custom), widget, 0, 1, 3, 4); gtk_widget_show (widget); g_free (text); text = g_strdup_printf ("• %s", _("Category")); widget = gtk_label_new (text); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (custom), widget, 0, 1, 4, 5); gtk_widget_show (widget); g_free (text); text = g_strdup_printf ("• %s", _("ROM Name")); widget = gtk_label_new (text); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (custom), widget, 1, 2, 1, 2); gtk_widget_show (widget); g_free (text); text = g_strdup_printf ("• %s", _("BIOS Name")); widget = gtk_label_new (text); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (custom), widget, 1, 2, 2, 3); gtk_widget_show (widget); g_free (text); text = g_strdup_printf ("• %s", _("Driver Name")); widget = gtk_label_new (text); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (custom), widget, 1, 2, 3, 4); gtk_widget_show (widget); g_free (text); return TRUE; }
static gboolean set_tooltip_widget_from_marks (GtkSourceView *view, GtkTooltip *tooltip, GSList *marks) { GtkWidget *vbox = NULL; for (; marks; marks = g_slist_next (marks)) { const gchar *category; GtkSourceMark *mark; GtkSourceMarkAttributes *attrs; gchar *text; gboolean ismarkup = FALSE; GtkWidget *label; GtkWidget *hbox; const GdkPixbuf *pixbuf; gint size; mark = marks->data; category = gtk_source_mark_get_category (mark); attrs = gtk_source_view_get_mark_attributes (view, category, NULL); if (attrs == NULL) { continue; } text = gtk_source_mark_attributes_get_tooltip_markup (attrs, mark); if (text == NULL) { text = gtk_source_mark_attributes_get_tooltip_text (attrs, mark); } else { ismarkup = TRUE; } if (text == NULL) { continue; } if (vbox == NULL) { vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_widget_show (vbox); } hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new (NULL); if (ismarkup) { gtk_label_set_markup (GTK_LABEL (label), text); } else { gtk_label_set_text (GTK_LABEL (label), text); } gtk_misc_set_alignment (GTK_MISC (label), 0, 0); gtk_widget_show (label); gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, NULL, &size); pixbuf = gtk_source_mark_attributes_render_icon (attrs, GTK_WIDGET (view), size); if (pixbuf != NULL) { GtkWidget *image; PangoLayoutLine *line; PangoRectangle rect; GtkWidget *align; GdkPixbuf *copy; align = gtk_alignment_new (0, 0, 0, 0); gtk_widget_show (align); copy = gdk_pixbuf_copy (pixbuf); image = gtk_image_new_from_pixbuf (copy); g_object_unref (copy); gtk_misc_set_alignment (GTK_MISC (image), 0, 0); gtk_widget_show (image); /* Measure up to align exact */ line = pango_layout_get_line (gtk_label_get_layout (GTK_LABEL (label)), 0); pango_layout_line_get_pixel_extents (line, NULL, &rect); gtk_alignment_set_padding (GTK_ALIGNMENT (align), (rect.height > size ? rect.height - size : size - rect.height) - 1, 0, 0, 0); if (rect.height > size) { gtk_container_add (GTK_CONTAINER (align), image); image = align; } else if (size > rect.height) { gtk_container_add (GTK_CONTAINER (align), label); label = align; } else { gtk_widget_destroy (align); } gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0); } gtk_box_pack_end (GTK_BOX (hbox), label, TRUE, TRUE, 0); if (g_slist_length (marks) != 1) { GtkWidget *separator; separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); gtk_widget_show (separator); gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0); } g_free (text); } if (vbox == NULL) { return FALSE; } gtk_tooltip_set_custom (tooltip, vbox); return TRUE; }
static gboolean contact_list_view_query_tooltip_cb (EmpathyContactListView *view, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data) { EmpathyContactListViewPriv *priv = GET_PRIV (view); EmpathyContact *contact; GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *path; static gint running = 0; gboolean ret = FALSE; /* Avoid an infinite loop. See GNOME bug #574377 */ if (running > 0) { return FALSE; } running++; if (!gtk_tree_view_get_tooltip_context (GTK_TREE_VIEW (view), &x, &y, keyboard_mode, &model, &path, &iter)) { goto OUT; } gtk_tree_view_set_tooltip_row (GTK_TREE_VIEW (view), tooltip, path); gtk_tree_path_free (path); gtk_tree_model_get (model, &iter, EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact, -1); if (!contact) { goto OUT; } if (!priv->tooltip_widget) { priv->tooltip_widget = empathy_contact_widget_new (contact, EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP | EMPATHY_CONTACT_WIDGET_SHOW_LOCATION); g_object_ref (priv->tooltip_widget); g_signal_connect (priv->tooltip_widget, "destroy", G_CALLBACK (contact_list_view_tooltip_destroy_cb), view); gtk_widget_show (priv->tooltip_widget); } else { empathy_contact_widget_set_contact (priv->tooltip_widget, contact); } gtk_tooltip_set_custom (tooltip, priv->tooltip_widget); ret = TRUE; g_object_unref (contact); OUT: running--; return ret; }
static gboolean query_tooltip_cb (EmpathyPersonaView *self, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data) { EmpathyPersonaViewPriv *priv = GET_PRIV (self); FolksPersona *persona; TpContact *tp_contact; EmpathyContact *contact; GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *path; static gint running = 0; gboolean ret = FALSE; /* Avoid an infinite loop. See GNOME bug #574377 */ if (running > 0) return FALSE; running++; if (!gtk_tree_view_get_tooltip_context (GTK_TREE_VIEW (self), &x, &y, keyboard_mode, &model, &path, &iter)) { goto OUT; } gtk_tree_view_set_tooltip_row (GTK_TREE_VIEW (self), tooltip, path); gtk_tree_path_free (path); gtk_tree_model_get (model, &iter, EMPATHY_PERSONA_STORE_COL_PERSONA, &persona, -1); if (persona == NULL) goto OUT; tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona)); if (tp_contact == NULL) { g_clear_object (&persona); goto OUT; } contact = empathy_contact_dup_from_tp_contact (tp_contact); if (priv->tooltip_widget == NULL) { priv->tooltip_widget = empathy_contact_widget_new (contact, EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP | EMPATHY_CONTACT_WIDGET_SHOW_LOCATION); gtk_container_set_border_width (GTK_CONTAINER (priv->tooltip_widget), 8); g_object_ref (priv->tooltip_widget); g_signal_connect (priv->tooltip_widget, "destroy", (GCallback) tooltip_destroy_cb, self); gtk_widget_show (priv->tooltip_widget); } else { empathy_contact_widget_set_contact (priv->tooltip_widget, contact); } gtk_tooltip_set_custom (tooltip, priv->tooltip_widget); ret = TRUE; g_object_unref (contact); g_object_unref (persona); OUT: running--; return ret; }