1 /* testtooltips.c: Test application for GTK+ >= 2.12 tooltips code
3 * Copyright (C) 2006-2007 Imendio AB
4 * Contact: Kristian Rietveld <kris@imendio.com>
6 * This work is provided "as is"; redistribution and modification
7 * in whole or in part, in any medium, physical or electronic is
8 * permitted without restriction.
10 * This work is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * In no event shall the authors or contributors be liable for any
15 * direct, indirect, incidental, special, exemplary, or consequential
16 * damages (including, but not limited to, procurement of substitute
17 * goods or services; loss of use, data, or profits; or business
18 * interruption) however caused and on any theory of liability, whether
19 * in contract, strict liability, or tort (including negligence or
20 * otherwise) arising in any way out of the use of this software, even
21 * if advised of the possibility of such damage.
27 query_tooltip_cb (GtkWidget
*widget
,
30 gboolean keyboard_tip
,
34 gtk_tooltip_set_markup (tooltip
, gtk_button_get_label (GTK_BUTTON (widget
)));
35 gtk_tooltip_set_icon_from_stock (tooltip
, GTK_STOCK_DELETE
,
42 query_tooltip_custom_cb (GtkWidget
*widget
,
45 gboolean keyboard_tip
,
49 GdkColor color
= { 0, 0, 65535 };
50 GtkWindow
*window
= gtk_widget_get_tooltip_window (widget
);
52 gtk_widget_modify_bg (GTK_WIDGET (window
), GTK_STATE_NORMAL
, &color
);
58 query_tooltip_text_view_cb (GtkWidget
*widget
,
61 gboolean keyboard_tip
,
65 GtkTextTag
*tag
= data
;
67 GtkTextView
*text_view
= GTK_TEXT_VIEW (widget
);
73 g_object_get (text_view
->buffer
, "cursor-position", &offset
, NULL
);
74 gtk_text_buffer_get_iter_at_offset (text_view
->buffer
, &iter
, offset
);
78 gint bx
, by
, trailing
;
80 gtk_text_view_window_to_buffer_coords (text_view
, GTK_TEXT_WINDOW_TEXT
,
82 gtk_text_view_get_iter_at_position (text_view
, &iter
, &trailing
, bx
, by
);
85 if (gtk_text_iter_has_tag (&iter
, tag
))
86 gtk_tooltip_set_text (tooltip
, "Tooltip on text tag");
94 query_tooltip_tree_view_cb (GtkWidget
*widget
,
97 gboolean keyboard_tip
,
102 GtkTreeView
*tree_view
= GTK_TREE_VIEW (widget
);
103 GtkTreeModel
*model
= gtk_tree_view_get_model (tree_view
);
104 GtkTreePath
*path
= NULL
;
110 if (!gtk_tree_view_get_tooltip_context (tree_view
, &x
, &y
,
112 &model
, &path
, &iter
))
115 gtk_tree_model_get (model
, &iter
, 0, &tmp
, -1);
116 pathstring
= gtk_tree_path_to_string (path
);
118 g_snprintf (buffer
, 511, "<b>Path %s:</b> %s", pathstring
, tmp
);
119 gtk_tooltip_set_markup (tooltip
, buffer
);
121 gtk_tree_view_set_tooltip_row (tree_view
, tooltip
, path
);
123 gtk_tree_path_free (path
);
130 static GtkTreeModel
*
136 store
= gtk_tree_store_new (1, G_TYPE_STRING
);
138 /* A tree store with some random words ... */
139 gtk_tree_store_insert_with_values (store
, &iter
, NULL
, 0,
140 0, "File Manager", -1);
141 gtk_tree_store_insert_with_values (store
, &iter
, NULL
, 0,
143 gtk_tree_store_insert_with_values (store
, &iter
, NULL
, 0,
144 0, "System Settings", -1);
145 gtk_tree_store_insert_with_values (store
, &iter
, NULL
, 0,
147 gtk_tree_store_insert_with_values (store
, &iter
, NULL
, 0,
149 gtk_tree_store_insert_with_values (store
, &iter
, NULL
, 0,
150 0, "Word Processor", -1);
152 return GTK_TREE_MODEL (store
);
156 selection_changed_cb (GtkTreeSelection
*selection
,
157 GtkWidget
*tree_view
)
159 gtk_widget_trigger_tooltip_query (tree_view
);
162 static struct Rectangle
173 { 10, 10, 0.0, 0.0, 0.9, "Blue box!" },
174 { 200, 170, 1.0, 0.0, 0.0, "Red thing" },
175 { 100, 50, 0.8, 0.8, 0.0, "Yellow thing" }
179 query_tooltip_drawing_area_cb (GtkWidget
*widget
,
182 gboolean keyboard_tip
,
191 for (i
= 0; i
< G_N_ELEMENTS (rectangles
); i
++)
193 struct Rectangle
*r
= &rectangles
[i
];
195 if (r
->x
< x
&& x
< r
->x
+ 50
196 && r
->y
< y
&& y
< r
->y
+ 50)
198 gtk_tooltip_set_markup (tooltip
, r
->tooltip
);
207 drawing_area_expose (GtkWidget
*drawing_area
,
208 GdkEventExpose
*event
,
214 gdk_window_get_pointer (drawing_area
->window
, NULL
, NULL
, NULL
);
216 cr
= gdk_cairo_create (drawing_area
->window
);
218 cairo_rectangle (cr
, 0, 0,
219 drawing_area
->allocation
.width
,
220 drawing_area
->allocation
.height
);
221 cairo_set_source_rgb (cr
, 1.0, 1.0, 1.0);
224 for (i
= 0; i
< G_N_ELEMENTS (rectangles
); i
++)
226 struct Rectangle
*r
= &rectangles
[i
];
228 cairo_rectangle (cr
, r
->x
, r
->y
, 50, 50);
229 cairo_set_source_rgb (cr
, r
->r
, r
->g
, r
->b
);
232 cairo_rectangle (cr
, r
->x
, r
->y
, 50, 50);
233 cairo_set_source_rgba (cr
, r
->r
, r
->g
, r
->b
, 0.5);
243 query_tooltip_label_cb (GtkWidget
*widget
,
246 gboolean keyboard_tip
,
250 GtkWidget
*custom
= data
;
252 gtk_tooltip_set_custom (tooltip
, custom
);
258 main (int argc
, char *argv
[])
262 GtkWidget
*drawing_area
;
266 GtkWidget
*tooltip_window
;
267 GtkWidget
*tooltip_button
;
269 GtkWidget
*tree_view
;
270 GtkTreeViewColumn
*column
;
272 GtkWidget
*text_view
;
273 GtkTextBuffer
*buffer
;
277 gchar
*text
, *markup
;
279 gtk_init (&argc
, &argv
);
281 window
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
282 gtk_window_set_title (GTK_WINDOW (window
), "Tooltips test");
283 gtk_container_set_border_width (GTK_CONTAINER (window
), 10);
284 g_signal_connect (window
, "delete_event",
285 G_CALLBACK (gtk_main_quit
), NULL
);
287 box
= gtk_vbox_new (FALSE
, 3);
288 gtk_container_add (GTK_CONTAINER (window
), box
);
290 /* A check button using the tooltip-markup property */
291 button
= gtk_check_button_new_with_label ("This one uses the tooltip-markup property");
292 gtk_widget_set_tooltip_text (button
, "Hello, I am a static tooltip.");
293 gtk_box_pack_start (GTK_BOX (box
), button
, FALSE
, FALSE
, 0);
295 text
= gtk_widget_get_tooltip_text (button
);
296 markup
= gtk_widget_get_tooltip_markup (button
);
297 g_assert (g_str_equal ("Hello, I am a static tooltip.", text
));
298 g_assert (g_str_equal ("Hello, I am a static tooltip.", markup
));
299 g_free (text
); g_free (markup
);
301 /* A check button using the query-tooltip signal */
302 button
= gtk_check_button_new_with_label ("I use the query-tooltip signal");
303 g_object_set (button
, "has-tooltip", TRUE
, NULL
);
304 g_signal_connect (button
, "query-tooltip",
305 G_CALLBACK (query_tooltip_cb
), NULL
);
306 gtk_box_pack_start (GTK_BOX (box
), button
, FALSE
, FALSE
, 0);
309 button
= gtk_label_new ("I am just a label");
310 gtk_label_set_selectable (GTK_LABEL (button
), FALSE
);
311 gtk_widget_set_tooltip_text (button
, "Label & and tooltip");
312 gtk_box_pack_start (GTK_BOX (box
), button
, FALSE
, FALSE
, 0);
314 text
= gtk_widget_get_tooltip_text (button
);
315 markup
= gtk_widget_get_tooltip_markup (button
);
316 g_assert (g_str_equal ("Label & and tooltip", text
));
317 g_assert (g_str_equal ("Label & and tooltip", markup
));
318 g_free (text
); g_free (markup
);
320 /* A selectable label */
321 button
= gtk_label_new ("I am a selectable label");
322 gtk_label_set_selectable (GTK_LABEL (button
), TRUE
);
323 gtk_widget_set_tooltip_markup (button
, "<b>Another</b> Label tooltip");
324 gtk_box_pack_start (GTK_BOX (box
), button
, FALSE
, FALSE
, 0);
326 text
= gtk_widget_get_tooltip_text (button
);
327 markup
= gtk_widget_get_tooltip_markup (button
);
328 g_assert (g_str_equal ("Another Label tooltip", text
));
329 g_assert (g_str_equal ("<b>Another</b> Label tooltip", markup
));
330 g_free (text
); g_free (markup
);
332 /* Another one, with a custom tooltip window */
333 button
= gtk_check_button_new_with_label ("This one has a custom tooltip window!");
334 gtk_box_pack_start (GTK_BOX (box
), button
, FALSE
, FALSE
, 0);
336 tooltip_window
= gtk_window_new (GTK_WINDOW_POPUP
);
337 tooltip_button
= gtk_label_new ("blaat!");
338 gtk_container_add (GTK_CONTAINER (tooltip_window
), tooltip_button
);
339 gtk_widget_show (tooltip_button
);
341 gtk_widget_set_tooltip_window (button
, GTK_WINDOW (tooltip_window
));
342 g_signal_connect (button
, "query-tooltip",
343 G_CALLBACK (query_tooltip_custom_cb
), NULL
);
344 g_object_set (button
, "has-tooltip", TRUE
, NULL
);
346 /* An insensitive button */
347 button
= gtk_button_new_with_label ("This one is insensitive");
348 gtk_widget_set_sensitive (button
, FALSE
);
349 g_object_set (button
, "tooltip-text", "Insensitive!", NULL
);
350 gtk_box_pack_start (GTK_BOX (box
), button
, FALSE
, FALSE
, 0);
352 /* Testcases from Kris without a tree view don't exist. */
353 tree_view
= gtk_tree_view_new_with_model (create_model ());
354 gtk_widget_set_size_request (tree_view
, 200, 240);
356 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view
),
358 gtk_cell_renderer_text_new (),
362 g_object_set (tree_view
, "has-tooltip", TRUE
, NULL
);
363 g_signal_connect (tree_view
, "query-tooltip",
364 G_CALLBACK (query_tooltip_tree_view_cb
), NULL
);
365 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view
)),
366 "changed", G_CALLBACK (selection_changed_cb
), tree_view
);
368 /* Set a tooltip on the column */
369 column
= gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view
), 0);
370 gtk_tree_view_column_set_clickable (column
, TRUE
);
371 g_object_set (column
->button
, "tooltip-text", "Header", NULL
);
373 gtk_box_pack_start (GTK_BOX (box
), tree_view
, FALSE
, FALSE
, 2);
375 /* And a text view for Matthias */
376 buffer
= gtk_text_buffer_new (NULL
);
378 gtk_text_buffer_get_end_iter (buffer
, &iter
);
379 gtk_text_buffer_insert (buffer
, &iter
, "Hello, the text ", -1);
381 tag
= gtk_text_buffer_create_tag (buffer
, "bold", NULL
);
382 g_object_set (tag
, "weight", PANGO_WEIGHT_BOLD
, NULL
);
384 gtk_text_buffer_get_end_iter (buffer
, &iter
);
385 gtk_text_buffer_insert_with_tags (buffer
, &iter
, "in bold", -1, tag
, NULL
);
387 gtk_text_buffer_get_end_iter (buffer
, &iter
);
388 gtk_text_buffer_insert (buffer
, &iter
, " has a tooltip!", -1);
390 text_view
= gtk_text_view_new_with_buffer (buffer
);
391 gtk_widget_set_size_request (text_view
, 200, 50);
393 g_object_set (text_view
, "has-tooltip", TRUE
, NULL
);
394 g_signal_connect (text_view
, "query-tooltip",
395 G_CALLBACK (query_tooltip_text_view_cb
), tag
);
397 gtk_box_pack_start (GTK_BOX (box
), text_view
, FALSE
, FALSE
, 2);
400 drawing_area
= gtk_drawing_area_new ();
401 gtk_widget_set_size_request (drawing_area
, 320, 240);
402 g_object_set (drawing_area
, "has-tooltip", TRUE
, NULL
);
403 g_signal_connect (drawing_area
, "expose_event",
404 G_CALLBACK (drawing_area_expose
), NULL
);
405 g_signal_connect (drawing_area
, "query-tooltip",
406 G_CALLBACK (query_tooltip_drawing_area_cb
), NULL
);
407 gtk_box_pack_start (GTK_BOX (box
), drawing_area
, FALSE
, FALSE
, 2);
409 button
= gtk_label_new ("Custom tooltip I");
410 label
= gtk_label_new ("See, custom");
411 g_object_ref_sink (label
);
412 g_object_set (button
, "has-tooltip", TRUE
, NULL
);
413 g_signal_connect (button
, "query-tooltip",
414 G_CALLBACK (query_tooltip_label_cb
), label
);
415 gtk_box_pack_start (GTK_BOX (box
), button
, FALSE
, FALSE
, 2);
417 button
= gtk_label_new ("Custom tooltip II");
418 label
= gtk_label_new ("See, custom, too");
419 g_object_ref_sink (label
);
420 g_object_set (button
, "has-tooltip", TRUE
, NULL
);
421 gtk_box_pack_start (GTK_BOX (box
), button
, FALSE
, FALSE
, 2);
422 g_signal_connect (button
, "query-tooltip",
423 G_CALLBACK (query_tooltip_label_cb
), label
);
426 gtk_widget_show_all (window
);