static gint motion_notify_event (GtkWidget *widget, GdkEventMotion *event) { GdkTimeCoord **events; int n_events; int i; current_device = event->device; cursor_proximity = TRUE; if (event->state & GDK_BUTTON1_MASK && pixmap != NULL) { if (gdk_device_get_history (event->device, event->window, motion_time, event->time, &events, &n_events)) { for (i=0; i<n_events; i++) { double x = 0, y = 0, pressure = 0.5; gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_X, &x); gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_Y, &y); gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_PRESSURE, &pressure); draw_brush (widget, event->device->source, x, y, pressure); print_axes (event->device, events[i]->axes); } gdk_device_free_history (events, n_events); } else { double pressure = 0.5; gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure); draw_brush (widget, event->device->source, event->x, event->y, pressure); } motion_time = event->time; } if (event->is_hint) gdk_device_get_state (event->device, event->window, NULL, NULL); print_axes (event->device, event->axes); update_cursor (widget, event->x, event->y); return TRUE; }
static VALUE device_get_history(VALUE self, VALUE window, VALUE start, VALUE stop) { gboolean ret; GdkTimeCoord** events; gint i, n_events; VALUE ary = Qnil; ret = gdk_device_get_history(_SELF(self), GDK_WINDOW(RVAL2GOBJ(window)), NUM2UINT(start), NUM2UINT(stop), &events, &n_events); if (ret){ ary = rb_ary_new(); for (i = 0; i < n_events; i++){ rb_ary_push(ary, BOXED2RVAL(events, GDK_TYPE_TIME_COORD)); } gdk_device_free_history(events, n_events); } return ary; }
static gboolean motion_notify_event (GtkWidget *widget, GdkEventMotion *event, ColorselWater *water) { GtkAllocation allocation; GdkTimeCoord **coords; gint nevents; gint i; gboolean erase; gtk_widget_get_allocation (widget, &allocation); if (event->state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK)) { guint32 last_motion_time = event->time; erase = ((event->state & (GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK)) || FALSE); /* FIXME: (event->source == GDK_SOURCE_ERASER) */ if (event->state & GDK_SHIFT_MASK) erase = !erase; water->motion_time = event->time; if (gdk_device_get_history (event->device, event->window, last_motion_time, event->time, &coords, &nevents)) { for (i = 0; i < nevents; i++) { gdouble x = 0.0; gdouble y = 0.0; gdouble pressure = 0.5; gdk_device_get_axis (event->device, coords[i]->axes, GDK_AXIS_X, &x); gdk_device_get_axis (event->device, coords[i]->axes, GDK_AXIS_Y, &y); gdk_device_get_axis (event->device, coords[i]->axes, GDK_AXIS_PRESSURE, &pressure); draw_brush (water, widget, erase, x / allocation.width, y / allocation.height, pressure); } g_free (coords); } else { gdouble pressure = 0.5; gdk_event_get_axis ((GdkEvent *) event, GDK_AXIS_PRESSURE, &pressure); draw_brush (water, widget, erase, event->x / allocation.width, event->y / allocation.height, pressure); } } /* Ask for more motion events in case the event was a hint */ gdk_event_request_motions (event); return TRUE; }
gboolean on_motion (GtkWidget *win, GdkEventMotion *ev, gpointer user_data) { GromitData *data = (GromitData *) user_data; GdkTimeCoord **coords = NULL; gint nevents; int i; gdouble pressure = 0.5; /* get the data for this device */ GdkDevice *master = ev->device; GromitDeviceData *masterdata = g_hash_table_lookup(data->devdatatable, master); if (!masterdata->is_grabbed) return FALSE; GdkDevice *slave = gdk_event_get_source_device ((GdkEvent *) ev); GromitDeviceData *slavedata = g_hash_table_lookup(data->devdatatable, slave); if (ev->state != masterdata->state || ev->state != slavedata->state || masterdata->lastslave != slave) select_tool (data, master, slave, ev->state); if(!(ev->state & (GDK_BUTTON1_MASK| GDK_BUTTON2_MASK| GDK_BUTTON3_MASK| GDK_BUTTON4_MASK| GDK_BUTTON5_MASK))) return TRUE; gdk_device_get_history (slave, ev->window, slavedata->motion_time, ev->time, &coords, &nevents); if(!data->xinerama && nevents > 0) { for (i=0; i < nevents; i++) { gdouble x, y; gdk_device_get_axis (slave, coords[i]->axes, GDK_AXIS_PRESSURE, &pressure); if (pressure > 0) { if (gdk_device_get_source(slave) == GDK_SOURCE_MOUSE) data->maxwidth = slavedata->cur_context->width; else data->maxwidth = (CLAMP (pressure + line_thickener, 0, 1) * (double) (slavedata->cur_context->width - slavedata->cur_context->minwidth) + slavedata->cur_context->minwidth); gdk_device_get_axis(slave, coords[i]->axes, GDK_AXIS_X, &x); gdk_device_get_axis(slave, coords[i]->axes, GDK_AXIS_Y, &y); draw_line (data, slave, slavedata->lastx, slavedata->lasty, x, y); coord_list_prepend (data, slave, x, y, data->maxwidth); slavedata->lastx = x; slavedata->lasty = y; } } slavedata->motion_time = coords[nevents-1]->time; g_free (coords); } /* always paint to the current event coordinate. */ gdk_event_get_axis ((GdkEvent *) ev, GDK_AXIS_PRESSURE, &pressure); if (pressure > 0) { if (gdk_device_get_source(slave) == GDK_SOURCE_MOUSE) data->maxwidth = slavedata->cur_context->width; else data->maxwidth = (CLAMP (pressure + line_thickener, 0, 1) * (double) (slavedata->cur_context->width - slavedata->cur_context->minwidth) + slavedata->cur_context->minwidth); if(slavedata->motion_time > 0) { draw_line (data, slave, slavedata->lastx, slavedata->lasty, ev->x, ev->y); coord_list_prepend (data, slave, ev->x, ev->y, data->maxwidth); } } slavedata->lastx = ev->x; slavedata->lasty = ev->y; slavedata->motion_time = ev->time; return TRUE; }