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; } /////////////////////////////////////////////////////////////////////////////// |