Hi all
I am looking for an example of program with the new functions in gtk3.0, for zooming with the mouse inside a window containing a plot of data (XY type): when pressing the left button of mouse: a rectangular box appears in the window, that we can enlarge or decrease with the mouse.
I have already made theses function in GTK2.0 that work well, but the passage to GTK3.0 with the cairo functions is not evident for me. In fact I have some difficulties to replace the old functions by the new ones in GTK3.0.
Here are below the 3 functions to update into GTK3.0:
press_event(), selection_event() and release_event()
thank you for any help
Dominique
///////////////////////////////////////////////////////////////////////
/* press_event, event that occurs when the user click on the drawing area
* left button == zoom
* middle button == function intercepts
* right button == axes intercepts
*/
gboolean press_event(GtkWidget *widget, GdkEventButton *event, NZE *ps)
{
GdkGC *gc;
static gulong id2;
switch(event->button)
{
case 1: // zoom to the selection
printf(" in press_event\n");
// remove the motion event signal
g_signal_handlers_disconnect_by_func(G_OBJECT(widget),
G_CALLBACK(motion_event), (gpointer)ps);
// store the press coordinates
Curseur.X_down = (gint)event->x;
Curseur.Y_down = (gint)event->y;
//default gc of the window
gc = gdk_gc_new(widget->window);
if(ps->pixmap_zoom) g_object_unref(ps->pixmap_zoom);
// create a new pixmap of a size equal to the drawing area
ps->pixmap_zoom = gdk_pixmap_new(widget->window,
widget->allocation.width,
widget->allocation.height,
-1);
// deprecated
gdk_draw_drawable(
ps->pixmap_zoom,
gc,
widget->window,
0, 0,
0, 0,
widget->allocation.width ,
widget->allocation.height);
/*
// new code with cairo
cairo_t *cr = gdk_cairo_create (widget->window);
gdk_cairo_set_source_pixmap (cr,
ps->pixmap_zoom,
0,
0);
cairo_paint(cr);
moveto3(cr,Curseur.X_down, 0);
lineto3(cr,Curseur.X_down,widget->allocation.height);
cairo_stroke(cr);
*/
// connect the motion signal so we see a rectangle
id2 = g_signal_connect( widget,
"motion_notify_event",
G_CALLBACK(selection_event),
ps);
// gdk_window_set_cursor(widget->window, cursors[event->button]);
g_signal_connect(G_OBJECT(widget),
"button_release_event",
G_CALLBACK(release_event),
(gpointer)ps);
break;
case 2: // not yet in function
break;
case 3: // not yet in function
break;
default:
// g_assert_not_reached();
break;
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
/* selection_event, this callback is registered after a mouse button has been
* pressed in the drawing area, it erases the ?last? rectangle and draws
* another to represent the area the user has selected. the callback is
* unregistered when the user releases the mouse button
*/
gboolean selection_event(GtkWidget *widget, GdkEventMotion *event, NZE *ps)
{
GdkGC *gc;
GdkModifierType state;
int x,y;
gc = gdk_gc_new(widget->window);
gdk_window_get_pointer (event->window, &x, &y, &state);
if (state & GDK_BUTTON1_MASK)
{
Curseur.X_end = (gint) event->x;
Curseur.Y_end = (gint) event->y;
// warning deprecated
gdk_draw_drawable( widget->window,
gc,
ps->pixmap_zoom,
0, 0,
0, 0,
widget->allocation.width,
widget->allocation.height);
// set_color(gc,colormap,60,60,60);
// deprecated function
gdk_draw_rectangle(
widget->window,
gc,
FALSE,
get_startx(Curseur), 0,
abs(Curseur.X_down - Curseur.X_end),
widget->allocation.height);
g_object_unref(gc);
/*
// new code cairo: doesn't work
cairo_t *cr = gdk_cairo_create (widget->window);
// cairo_translate(cr, Curseur.X_down - Curseur.X_end,0);
gdk_cairo_set_source_pixmap(cr, widget->window,0,0);
cairo_fill(cr);
// cairo_paint (cr);
// cairo_stroke(cr);
moveto3(cr,Curseur.X_end, 0);
lineto3(cr,Curseur.X_end,widget->allocation.height);
*/
/*
// gdk_cairo_set_source_window(cr,widget->window,0,0);
gdk_cairo_set_source_pixmap(cr,
widget->window,
0,0);
// new code with cairo
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_set_line_width(cr, 1);
cairo_rectangle(
cr,
get_startx(Curseur), 0,
abs(Curseur.X_down - Curseur.X_end),
widget->allocation.height);
// cairo_stroke(cr);
*/
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////
/* release_event, event that occurs when the user releases button on the
* drawing area
*/
gboolean release_event(GtkWidget *widget, GdkEventButton *event, NZE *ps)
{
gint x_up, y_up;
gdouble x1, x2;
switch(event->button)
{
case 1: // zoom to the selection
/* remove the selection callback, and this callback */
g_signal_handlers_disconnect_by_func(widget,
G_CALLBACK(release_event), (gpointer)ps);
g_signal_handlers_disconnect_by_func(widget,
G_CALLBACK(selection_event),(gpointer)ps);
// put the normal cursor back
// gdk_window_set_cursor(widget->window, cursors[0]);
x_up = (gint)event->x;
y_up = (gint)event->y;
// check for zero width or zero height
if(x_up == Curseur.X_down)
{
g_signal_connect( widget,
"motion_notify_event",
G_CALLBACK(motion_event),
ps);
return TRUE;
}
x1 = (Curseur.X_down < x_up) ? real_x(Curseur.X_down,ps->ideb,ps->ifin,widget->allocation.width ):
real_x(x_up,ps->ideb,ps->ifin,widget->allocation.width);
x2 = (Curseur.X_down > x_up) ? real_x(Curseur.X_down,ps->ideb,ps->ifin,widget->allocation.width ):
real_x(x_up,ps->ideb,ps->ifin,widget->allocation.width);
// y1 = (Curseur.Y_down > y_up) ? real_y(Curseur.Y_down) : real_y(y_up);
// y2 = (Curseur.Y_down < y_up) ? real_y(Curseur.Y_down) : real_y(y_up);
reDrawSingleChan(ps->zone_signal, ps);
// g_signal_handler_unblock(widget,id_motion_event);
g_signal_connect( widget,
"motion_notify_event",
G_CALLBACK(motion_event),
ps);
break;
case 2: // not yet in function
break;
case 3: // not yet in function
break;
default:
g_assert_not_reached();
break;
}
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////
_______________________________________________
gtk-list mailing list
gtk-list gnome org
https://mail.gnome.org/mailman/listinfo/gtk-list