void meta_cursor_tracker_get_pointer (MetaCursorTracker *tracker, int *x, int *y, ClutterModifierType *mods) { GdkDeviceManager *gmanager; GdkDevice *gdevice; GdkScreen *gscreen; gmanager = gdk_display_get_device_manager (gdk_display_get_default ()); gdevice = gdk_device_manager_get_client_pointer (gmanager); gdk_device_get_position (gdevice, &gscreen, x, y); gdk_device_get_state (gdevice, gdk_screen_get_root_window (gscreen), NULL, (GdkModifierType*)mods); }
static void get_pointer_position_gdk (int *x, int *y, int *mods) { GdkDeviceManager *gmanager; GdkDevice *gdevice; GdkScreen *gscreen; gmanager = gdk_display_get_device_manager (gdk_display_get_default ()); gdevice = gdk_x11_device_manager_lookup (gmanager, META_VIRTUAL_CORE_POINTER_ID); gdk_device_get_position (gdevice, &gscreen, x, y); if (mods) gdk_device_get_state (gdevice, gdk_screen_get_root_window (gscreen), NULL, (GdkModifierType*)mods); }
static gint tablet_preview_motion(GtkWidget *widget, GdkEventMotion *event) { gdouble pressure = 0.0; GdkModifierType state; #if GTK_MAJOR_VERSION == 1 if (event->is_hint) { gdk_input_window_get_pointer (event->window, event->deviceid, NULL, NULL, &pressure, NULL, NULL, &state); } else { pressure = event->pressure; state = event->state; } #endif #if GTK_MAJOR_VERSION == 2 if (event->is_hint) gdk_device_get_state (event->device, event->window, NULL, &state); else state = event->state; gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure); #endif if (state & GDK_BUTTON1_MASK) tablet_update_pressure( pressure ); return TRUE; }
void gimp_device_info_get_device_state (GimpDeviceInfo *info, GdkWindow *window, GdkModifierType *state) { gdk_device_get_state (info->device, window, NULL, state); }
static gboolean motion_notify_event (GtkWidget *widget, GdkEventMotion *event) { gdouble x, y; gdouble pressure; GdkModifierType state; if (event->is_hint) { gdk_device_get_state (event->device, event->window, NULL, &state); gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_X, &x); gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_Y, &y); gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure); } else { x = event->x; y = event->y; gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure); state = event->state; } if (state & GDK_BUTTON1_MASK && pixmap != NULL) draw_brush (widget, event->device->source, x, y, pressure); return TRUE; }
/** * Check if input is still running, or if there an event was missed * * @return true if input is stopped now */ bool InputSequence::checkStillRunning() { if (!inputRunning) { // Already stopped return true; } GdkModifierType mask = (GdkModifierType) 0; GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(inputHandler->getXournal())); gdk_device_get_state(device, window, NULL, &mask); if ((GDK_BUTTON1_MASK & mask) || (GDK_BUTTON2_MASK & mask) || (GDK_BUTTON3_MASK & mask) || (GDK_BUTTON4_MASK & mask) || (GDK_BUTTON5_MASK & mask)) { // Button still down // Input is still running, probably everything OK return false; } // Button is not down, stop input now! // So the new input can start actionEnd(__UINT32_MAX__); return true; }
void gimp_device_info_get_device_coords (GimpDeviceInfo *info, GdkWindow *window, GimpCoords *coords) { gdouble axes[GDK_AXIS_LAST] = { 0, }; *coords = default_coords; gdk_device_get_state (info->device, window, axes, NULL); gdk_device_get_axis (info->device, axes, GDK_AXIS_X, &coords->x); gdk_device_get_axis (info->device, axes, GDK_AXIS_Y, &coords->y); if (gdk_device_get_axis (info->device, axes, GDK_AXIS_PRESSURE, &coords->pressure)) { coords->pressure = gimp_device_info_map_axis (info, GDK_AXIS_PRESSURE, coords->pressure); } if (gdk_device_get_axis (info->device, axes, GDK_AXIS_XTILT, &coords->xtilt)) { coords->xtilt = gimp_device_info_map_axis (info, GDK_AXIS_XTILT, coords->xtilt); } if (gdk_device_get_axis (info->device, axes, GDK_AXIS_YTILT, &coords->ytilt)) { coords->ytilt = gimp_device_info_map_axis (info, GDK_AXIS_YTILT, coords->ytilt); } if (gdk_device_get_axis (info->device, axes, GDK_AXIS_WHEEL, &coords->wheel)) { coords->wheel = gimp_device_info_map_axis (info, GDK_AXIS_WHEEL, coords->wheel); } if (gimp_device_info_get_mode (info) != GDK_MODE_DISABLED && gdk_device_get_source (info->device) != GDK_SOURCE_MOUSE) { /* The event was generated by an enabled extended non-mouse device */ coords->extended = TRUE; } else { /* The event was generated by a not extended enabled device */ coords->extended = FALSE; } }
static VALUE device_get_state(VALUE self, VALUE window) { gdouble axes[2]; GdkModifierType mask; gdk_device_get_state(_SELF(self), GDK_WINDOW(RVAL2GOBJ(window)), axes, &mask); return rb_ary_new3(3, rb_float_new(axes[0]), rb_float_new(axes[1]), GFLAGS2RVAL(mask, GDK_TYPE_MODIFIER_TYPE)); }
/** * gdk_event_request_motions: * @event: a valid #GdkEvent * * Request more motion notifies if @event is a motion notify hint event. * This function should be used instead of gdk_window_get_pointer() to * request further motion notifies, because it also works for extension * events where motion notifies are provided for devices other than the * core pointer. Coordinate extraction, processing and requesting more * motion events from a %GDK_MOTION_NOTIFY event usually works like this: * * |[ * { * /* motion_event handler */ * x = motion_event->x; * y = motion_event->y; * /* handle (x,y) motion */ * gdk_event_request_motions (motion_event); /* handles is_hint events */ * } * ]| * * Since: 2.12 **/ void gdk_event_request_motions (const GdkEventMotion *event) { GdkDisplay *display; g_return_if_fail (event != NULL); if (event->type == GDK_MOTION_NOTIFY && event->is_hint) { gdk_device_get_state (event->device, event->window, NULL, NULL); display = gdk_drawable_get_display (event->window); _gdk_display_enable_motion_hints (display); } }
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; }
JNIEXPORT void JNICALL Java_org_gnome_gdk_GdkDevice_gdk_1device_1get_1state ( JNIEnv* env, jclass cls, jlong _self, jlong _window, jdoubleArray _axes, jintArray _mask ) { GdkDevice* self; GdkWindow* window; gdouble* axes; GdkModifierType* mask; // convert parameter self self = (GdkDevice*) _self; // convert parameter window window = (GdkWindow*) _window; // convert parameter axes axes = (gdouble*) (*env)->GetDoubleArrayElements(env, _axes, NULL); if (axes == NULL) { return; // Java Exception already thrown } // convert parameter mask mask = (GdkModifierType*) (*env)->GetIntArrayElements(env, _mask, NULL); if (mask == NULL) { return; // Java Exception already thrown } // call function gdk_device_get_state(self, window, axes, mask); // cleanup parameter self // cleanup parameter window // cleanup parameter axes (*env)->ReleaseDoubleArrayElements(env, _axes, (jdouble*)axes, 0); // cleanup parameter mask (*env)->ReleaseIntArrayElements(env, _mask, (jint*)mask, 0); }
void gimp_device_info_get_device_coords (GimpDeviceInfo *info, GdkWindow *window, GimpCoords *coords) { gdouble axes[GDK_AXIS_LAST]; *coords = default_coords; gdk_device_get_state (info->device, window, axes, NULL); gdk_device_get_axis (info->device, axes, GDK_AXIS_X, &coords->x); gdk_device_get_axis (info->device, axes, GDK_AXIS_Y, &coords->y); if (gdk_device_get_axis (info->device, axes, GDK_AXIS_PRESSURE, &coords->pressure)) { coords->pressure = gimp_device_info_map_axis (info, GDK_AXIS_PRESSURE, coords->pressure); } if (gdk_device_get_axis (info->device, axes, GDK_AXIS_XTILT, &coords->xtilt)) { coords->xtilt = gimp_device_info_map_axis (info, GDK_AXIS_XTILT, coords->xtilt); } if (gdk_device_get_axis (info->device, axes, GDK_AXIS_YTILT, &coords->ytilt)) { coords->ytilt = gimp_device_info_map_axis (info, GDK_AXIS_YTILT, coords->ytilt); } if (gdk_device_get_axis (info->device, axes, GDK_AXIS_WHEEL, &coords->wheel)) { coords->wheel = gimp_device_info_map_axis (info, GDK_AXIS_WHEEL, coords->wheel); } }
static void get_pointer_position_gdk (int *x, int *y, int *mods) { GdkSeat *gseat; GdkDevice *gdevice; GdkScreen *gscreen; gseat = gdk_display_get_default_seat (gdk_display_get_default ()); gdevice = gdk_seat_get_pointer (gseat); gdk_device_get_position (gdevice, &gscreen, x, y); if (mods) gdk_device_get_state (gdevice, gdk_screen_get_root_window (gscreen), NULL, (GdkModifierType*)mods); }
static gboolean on_motion_notify_desklet(GtkWidget *pWidget, GdkEventMotion* pMotion, CairoDesklet *pDesklet) { if (pMotion->state & GDK_BUTTON1_MASK && ! pDesklet->bPositionLocked) { cd_debug ("root : %d;%d", (int) pMotion->x_root, (int) pMotion->y_root); pDesklet->moving = TRUE; gtk_window_move (GTK_WINDOW (pWidget), pMotion->x_root + pDesklet->diff_x, pMotion->y_root + pDesklet->diff_y); } else // le 'press-button' est local au sous-widget clique, alors que le 'motion-notify' est global a la fenetre; c'est donc par lui qu'on peut avoir a coup sur les coordonnees du curseur (juste avant le clic). { pDesklet->diff_x = -pMotion->x; pDesklet->diff_y = -pMotion->y; } gdk_device_get_state (pMotion->device, pMotion->window, NULL, NULL); // pour recevoir d'autres MotionNotify. return FALSE; }
static gboolean on_motion_notify_desklet (GtkWidget *pWidget, GdkEventMotion* pMotion, CairoDesklet *pDesklet) { /*if (pMotion->state & GDK_BUTTON1_MASK && cairo_dock_desklet_is_free (pDesklet)) { cd_debug ("root : %d;%d", (int) pMotion->x_root, (int) pMotion->y_root); } else*/ // le 'press-button' est local au sous-widget clique, alors que le 'motion-notify' est global a la fenetre; c'est donc par lui qu'on peut avoir a coup sur les coordonnees du curseur (juste avant le clic). { pDesklet->container.iMouseX = pMotion->x; pDesklet->container.iMouseY = pMotion->y; gboolean bStartAnimation = FALSE; gldi_object_notify (pDesklet, NOTIFICATION_MOUSE_MOVED, pDesklet, &bStartAnimation); if (bStartAnimation) cairo_dock_launch_animation (CAIRO_CONTAINER (pDesklet)); } if (pDesklet->rotating && cairo_dock_desklet_is_free (pDesklet)) { double alpha = atan2 (pDesklet->container.iHeight, - pDesklet->container.iWidth); pDesklet->fRotation = alpha - atan2 (.5*pDesklet->container.iHeight - pMotion->y, pMotion->x - .5*pDesklet->container.iWidth); while (pDesklet->fRotation > G_PI) pDesklet->fRotation -= 2 * G_PI; while (pDesklet->fRotation <= - G_PI) pDesklet->fRotation += 2 * G_PI; gtk_widget_queue_draw(pDesklet->container.pWidget); } else if (pDesklet->rotatingY && cairo_dock_desklet_is_free (pDesklet)) { pDesklet->fDepthRotationY = G_PI * (pMotion->x - .5*pDesklet->container.iWidth) / pDesklet->container.iWidth; gtk_widget_queue_draw(pDesklet->container.pWidget); } else if (pDesklet->rotatingX && cairo_dock_desklet_is_free (pDesklet)) { pDesklet->fDepthRotationX = G_PI * (pMotion->y - .5*pDesklet->container.iHeight) / pDesklet->container.iHeight; gtk_widget_queue_draw(pDesklet->container.pWidget); } else if (pMotion->state & GDK_BUTTON1_MASK && cairo_dock_desklet_is_free (pDesklet) && ! pDesklet->moving) { gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (pWidget)), 1/*pButton->button*/, pMotion->x_root/*pButton->x_root*/, pMotion->y_root/*pButton->y_root*/, pDesklet->time/*pButton->time*/); pDesklet->moving = TRUE; } else { gboolean bStartAnimation = FALSE; Icon *pIcon = gldi_desklet_find_clicked_icon (pDesklet); if (pIcon != NULL) { if (! pIcon->bPointed) { Icon *pPointedIcon = cairo_dock_get_pointed_icon (pDesklet->icons); if (pPointedIcon != NULL) pPointedIcon->bPointed = FALSE; pIcon->bPointed = TRUE; //g_print ("on survole %s\n", pIcon->cName); gldi_object_notify (pDesklet, NOTIFICATION_ENTER_ICON, pIcon, pDesklet, &bStartAnimation); } } else { Icon *pPointedIcon = cairo_dock_get_pointed_icon (pDesklet->icons); if (pPointedIcon != NULL) { pPointedIcon->bPointed = FALSE; //g_print ("kedal\n"); //gldi_object_notify (pDesklet, NOTIFICATION_ENTER_ICON, pPointedIcon, pDesklet, &bStartAnimation); } } if (bStartAnimation) { cairo_dock_launch_animation (CAIRO_CONTAINER (pDesklet)); } } gdk_device_get_state (pMotion->device, pMotion->window, NULL, NULL); // pour recevoir d'autres MotionNotify. return FALSE; }
gboolean on_title_pressed(GtkWidget *title, GdkEventButton *event, WindowckPlugin *wckp) { if (!wckp->win->controlwindow) return FALSE; if (event->button == 1 && (wnck_window_get_window_type (wckp->win->controlwindow) != WNCK_WINDOW_DESKTOP)) { /* double/tripple click */ if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) { toggle_maximize(wckp->win->controlwindow); } else /* left-click */ { wnck_window_activate(wckp->win->controlwindow, gtk_get_current_event_time()); // WnckScreen *screen = wnck_screen_get_default (); // wnck_screen_force_update (screen); WnckWindow *active_window = wckp->win->controlwindow; if (!wnck_window_is_maximized(active_window)) return TRUE; GdkDisplay *gdkdisp = gdk_display_get_default (); // Gdk 3 // GdkDevice *mouse = gdk_device_manager_get_client_pointer(gdk_display_get_device_manager(gdkdisp)); GdkDevice *mouse = gdk_device_get_core_pointer(); Display *d = gdk_x11_display_get_xdisplay(gdkdisp); XEvent xev; Atom netMoveResize = XInternAtom(d, "_NET_WM_MOVERESIZE", FALSE); xev.xclient.type = ClientMessage; xev.xclient.message_type = netMoveResize; xev.xclient.display = d; xev.xclient.window = wnck_window_get_xid(active_window); xev.xclient.format = 32; // Gdk 3 // int x, y; // gdk_device_get_position(mouse, NULL, &x, &y); // TODO: Provide a second argument to gdk_device_get_state gdouble xy[2]; gdk_device_get_state(mouse, NULL, xy, NULL); xev.xclient.data.l[0] = xy[0]; xev.xclient.data.l[1] = xy[1]; xev.xclient.data.l[2] = 8; // _NET_WM_MOVERESIZE_MOVE xev.xclient.data.l[3] = Button1; xev.xclient.data.l[4] = 0; XUngrabPointer(d, CurrentTime); XSendEvent(d, RootWindow(d, 0), FALSE, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } return TRUE; } if (event->button == 3) { /* right-click */ wnck_window_activate(wckp->win->controlwindow, gtk_get_current_event_time()); /* let the panel show the menu */ return TRUE; } return FALSE; }
void ImGui_ImplGtk3Cogl_NewFrame() { if (!g_ColorPipeline) ImGui_ImplGtk3Cogl_CreateDeviceObjects(); bool next_redraw = false; if (g_NumRedraws > 0) { GdkFrameClock *clock = gdk_window_get_frame_clock(g_GdkWindow); gdk_frame_clock_request_phase(clock, GDK_FRAME_CLOCK_PHASE_PAINT); g_NumRedraws--; next_redraw = true; } ImGuiIO& io = ImGui::GetIO(); // Setup display size (every frame to accommodate for window resizing) int w, h; gdk_window_get_geometry(g_GdkWindow, NULL, NULL, &w, &h); io.DisplaySize = ImVec2((float)w, (float)h); io.DisplayFramebufferScale = g_Callbacks->get_scale(g_GdkWindow); // Setup time step guint64 current_time = g_get_monotonic_time(); io.DeltaTime = g_Time > 0 ? ((float)(current_time - g_Time) / 1000000) : (float)(1.0f/60.0f); g_Time = current_time; // Setup inputs if (gdk_window_get_state(g_GdkWindow) & GDK_WINDOW_STATE_FOCUSED) { io.MousePos = g_MousePosition; // Mouse position in screen coordinates (set to -1,-1 if no mouse / on another screen, etc.) } else { io.MousePos = ImVec2(-1,-1); } GdkDevice *pointer = gdk_device_manager_get_client_pointer(gdk_display_get_device_manager(gdk_display_get_default())); GdkModifierType modifiers; gdk_device_get_state(pointer, g_GdkWindow, NULL, &modifiers); for (int i = 0; i < 3; i++) { io.MouseDown[i] = g_MousePressed[i] || (modifiers & (GDK_BUTTON1_MASK << i)) != 0; g_MousePressed[i] = false; } io.MouseWheel = g_MouseWheel; g_MouseWheel = 0.0f; // Hide OS mouse cursor if ImGui is drawing it GdkDisplay *display = gdk_window_get_display(g_GdkWindow); GdkCursor *cursor = gdk_cursor_new_from_name(display, io.MouseDrawCursor ? "none" : "default"); gdk_window_set_cursor(g_GdkWindow, cursor); g_object_unref(cursor); // Start the frame ImGui::NewFrame(); if (!next_redraw && io.WantTextInput) kick_timeout_redraw(0.2); }