gtk_widget_set_events in gtk+-3.0
- From: czk <czongke gmail com>
- To: gtk-app-devel-list gnome org
- Subject: gtk_widget_set_events in gtk+-3.0
- Date: Fri, 25 Mar 2011 23:47:03 +0800
I need a GtkProgressBar that can be drag by mouse. So I write the following
code and it work well in gtk+-2.x:
1. #include <gtk/gtk.h>
2.
3. gboolean progress_button_release (GtkWidget *progress, GdkEvent
*event, gpointer data);
4. gboolean progress_button_press (GtkWidget *progress, GdkEvent *event,
gpointer data);
5. gboolean progress_motion_notify (GtkWidget *progress, GdkEvent *event,
gpointer data);
6.
7. int main (int argc, char* argv[])
8. {
9. GtkWidget *window;
10. GtkWidget *label;
11. GtkWidget *progress;
12. GtkWidget *vbox;
13.
14. gtk_init (&argc, &argv);
15.
16. window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
17. gtk_widget_set_size_request (window, 400, 300);
18.
19. label = gtk_label_new ("mouse progress bar");
20. gtk_widget_show (label);
21.
22. progress = gtk_progress_bar_new ();
23. gtk_widget_show (progress);
24. gtk_widget_set_size_request (progress, -1, 30);
25. gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), 0.2);
26.
27. gtk_widget_add_events (progress, GDK_BUTTON_RELEASE_MASK |
28. GDK_BUTTON_PRESS_MASK |
29.
GDK_POINTER_MOTION_MASK );
30. g_signal_connect (progress, "button-release-event",
31. G_CALLBACK (progress_button_release), NULL);
32. g_signal_connect (progress, "button-press-event",
33. G_CALLBACK (progress_button_press), NULL);
34. g_signal_connect (progress, "motion-notify-event",
35. G_CALLBACK (progress_motion_notify), NULL);
36.
37.
38. vbox = gtk_vbox_new (FALSE, 5);
39. gtk_widget_show (vbox);
40.
41. gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 5);
42. gtk_box_pack_start (GTK_BOX(vbox), progress, TRUE, FALSE, 5);
43.
44. gtk_container_add (GTK_CONTAINER(window), vbox);
45.
46. gtk_widget_show (window);
47.
48. gtk_main ();
49.
50. return 0;
51. }
52.
53. gboolean
54. progress_button_release (GtkWidget *progress, GdkEvent *event,
gpointer data)
55. {
56. GdkEventButton *eb = (GdkEventButton *)event;
57. GtkAllocation allocation;
58. gint pressed;
59.
60. pressed = (gint)g_object_get_data (G_OBJECT(progress), "pressed");
61. #if GTK_MINOR_VERSION >= 18
62. gtk_widget_get_allocation (progress, &allocation);
63. #else
64. allocation = progress->allocation;
65. #endif
66. if (pressed)
67. gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), eb->x
/ (allocation.width * 1.0));
68.
69. g_object_set_data (G_OBJECT(progress), "pressed", (gpointer)0);
70. return FALSE;
71. }
72.
73. gboolean
74. progress_button_press (GtkWidget *progress, GdkEvent *event, gpointer
data)
75. {
76. g_object_set_data (G_OBJECT(progress), "pressed", (gpointer)1);
77. return FALSE;
78. }
79.
80. gboolean
81. progress_motion_notify (GtkWidget *progress, GdkEvent *event,
gpointer data)
82. {
83. GdkEventMotion *em = (GdkEventMotion *)event;
84. gint pressed;
85. GtkAllocation allocation;
86.
87. pressed = (gint)g_object_get_data (G_OBJECT(progress), "pressed");
88. #if GTK_MINOR_VERSION >= 18
89. gtk_widget_get_allocation (progress, &allocation);
90. #else
91. allocation = progress->allocation;
92. #endif
93. if (pressed)
94. {
95. gdouble fraction = em->x / (allocation.width * 1.0);
96. if (fraction > 1.0)
97. fraction = 1.0;
98. if (fraction < 0.0)
99. fraction = 0.0;
100. gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress),
fraction);
101. }
102.
103. return FALSE;
104. }
But it cannot work in Gtk+-3.0, I read the souce code in gtk+-3.0 tar.bz2
($GTK_SOURCE_ROOT/tests/testinput.c), and modify my code after testinput.c:
#include <gtk/gtk.h>
gboolean progress_button_release (GtkWidget *progress, GdkEvent *event,
gpointer data);
gboolean progress_button_press (GtkWidget *progress, GdkEvent *event,
gpointer data);
gboolean progress_motion_notify (GtkWidget *progress, GdkEvent *event,
gpointer data);
int main (int argc, char* argv[])
{
GtkWidget *window;
GtkWidget *label;
GtkWidget *progress;
GtkWidget *vbox;
GList *devices, *walk;
GdkDeviceManager *device_manager;
GdkEventMask event_mask;
gtk_init (&argc, &argv);
device_manager = gdk_display_get_device_manager (gdk_display_get_default
());
devices = gdk_device_manager_list_devices (device_manager,
GDK_DEVICE_TYPE_FLOATING);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (window, 400, 300);
label = gtk_label_new ("mouse progress bar");
gtk_widget_show (label);
progress = gtk_progress_bar_new ();
gtk_widget_show (progress);
gtk_widget_set_size_request (progress, -1, 20);
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), 0.2);
event_mask = GDK_EXPOSURE_MASK |
GDK_LEAVE_NOTIFY_MASK |
GDK_BUTTON_PRESS_MASK |
GDK_KEY_PRESS_MASK |
GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK |
GDK_PROXIMITY_OUT_MASK;
gtk_widget_set_events (progress, event_mask);
for (walk = devices; walk; walk = walk->next)
{
gtk_widget_set_device_events (progress, walk->data, event_mask);
gdk_device_set_mode (walk->data, GDK_MODE_SCREEN);
}
gtk_widget_set_can_focus (progress, TRUE);
gtk_widget_grab_focus (progress);
g_signal_connect (progress, "button-release-event",
G_CALLBACK (progress_button_release), NULL);
g_signal_connect (progress, "button-press-event",
G_CALLBACK (progress_button_press), NULL);
g_signal_connect (progress, "motion-notify-event",
G_CALLBACK (progress_motion_notify), NULL);
vbox = gtk_vbox_new (FALSE, 5);
gtk_widget_show (vbox);
gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 5);
gtk_box_pack_start (GTK_BOX(vbox), progress, TRUE, FALSE, 5);
gtk_container_add (GTK_CONTAINER(window), vbox);
gtk_widget_show (window);
gtk_main ();
return 0;
}
gboolean
progress_button_release (GtkWidget *progress, GdkEvent *event, gpointer
data)
{
GdkEventButton *eb = (GdkEventButton *)event;
GtkAllocation allocation;
gint pressed;
pressed = (gint)g_object_get_data (G_OBJECT(progress), "pressed");
#if GTK_MINOR_VERSION >= 18 || GTK_MAJOR_VERSION >= 3
gtk_widget_get_allocation (progress, &allocation);
#else
allocation = progress->allocation;
#endif
if (pressed)
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), eb->x /
(allocation.width * 1.0));
g_object_set_data (G_OBJECT(progress), "pressed", (gpointer)0);
return FALSE;
}
gboolean
progress_button_press (GtkWidget *progress, GdkEvent *event, gpointer data)
{
g_object_set_data (G_OBJECT(progress), "pressed", (gpointer)1);
g_print ("%s\n", __func__);
return FALSE;
}
gboolean
progress_motion_notify (GtkWidget *progress, GdkEvent *event, gpointer data)
{
GdkEventMotion *em = (GdkEventMotion *)event;
gint pressed;
GtkAllocation allocation;
pressed = (gint)g_object_get_data (G_OBJECT(progress), "pressed");
#if GTK_MINOR_VERSION >= 18 || GTK_MAJOR_VERSION >= 3
gtk_widget_get_allocation (progress, &allocation);
#else
allocation = progress->allocation;
#endif
if (pressed)
{
gdouble fraction = em->x / (allocation.width * 1.0);
if (fraction > 1.0)
fraction = 1.0;
if (fraction < 0.0)
fraction = 0.0;
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), fraction);
}
return FALSE;
}
But it cannot work as before. Any one know why? Thinks.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]