コード例 #1
0
ファイル: gdkdevice-broadway.c プロジェクト: simokivimaki/gtk
static void
gdk_broadway_device_ungrab (GdkDevice *device,
			    guint32    time_)
{
  GdkDisplay *display;
  GdkBroadwayDisplay *broadway_display;
  GdkDeviceGrabInfo *grab;
  guint32 serial;

  display = gdk_device_get_display (device);
  broadway_display = GDK_BROADWAY_DISPLAY (display);

  if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
    {
      /* Device is a keyboard */
    }
  else
    {
      /* Device is a pointer */

      if (broadway_display->output)
	{
	  serial = broadway_output_ungrab_pointer (broadway_display->output, time_);

	  gdk_display_flush (display);

	  grab = _gdk_display_get_last_device_grab (display, device);
	  if (grab &&
	      (time_ == GDK_CURRENT_TIME ||
	       grab->time == GDK_CURRENT_TIME ||
	       !TIME_IS_LATER (grab->time, time_)))
	    grab->serial_end = serial;
	}
    }
}
コード例 #2
0
static GdkGrabStatus
gdk_broadway_device_grab (GdkDevice    *device,
                          GdkWindow    *window,
                          gboolean      owner_events,
                          GdkEventMask  event_mask,
                          GdkWindow    *confine_to,
                          GdkCursor    *cursor,
                          guint32       time_)
{
    GdkDisplay *display;
    GdkBroadwayDisplay *broadway_display;

    display = gdk_device_get_display (device);
    broadway_display = GDK_BROADWAY_DISPLAY (display);

    if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
    {
        /* Device is a keyboard */
        return GDK_GRAB_SUCCESS;
    }
    else
    {
        /* Device is a pointer */
        return _gdk_broadway_server_grab_pointer (broadway_display->server,
                GDK_WINDOW_IMPL_BROADWAY (window->impl)->id,
                owner_events,
                event_mask,
                time_);
    }
}
コード例 #3
0
ファイル: gdkdevice-broadway.c プロジェクト: simokivimaki/gtk
static GdkGrabStatus
gdk_broadway_device_grab (GdkDevice    *device,
			  GdkWindow    *window,
			  gboolean      owner_events,
			  GdkEventMask  event_mask,
			  GdkWindow    *confine_to,
			  GdkCursor    *cursor,
			  guint32       time_)
{
  GdkDisplay *display;
  GdkBroadwayDisplay *broadway_display;
  GdkWindowImplBroadway *impl;
  guint32 serial;
  char *reply;

  display = gdk_device_get_display (device);
  broadway_display = GDK_BROADWAY_DISPLAY (display);

  if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
    {
      /* Device is a keyboard */
      return GDK_GRAB_SUCCESS;
    }
  else
    {
      /* Device is a pointer */

      if (broadway_display->output)
	{
	  impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);

	  serial = broadway_output_grab_pointer (broadway_display->output,
						 impl->id, owner_events, time_);
	  reply = _gdk_broadway_display_block_for_input (display, 'g', serial, FALSE);
	  if (reply != NULL)
	    {
	      char *p;
	      char cmd;
	      guint32 reply_serial;
	      int res;

	      p = reply;

	      cmd = *p++;
	      reply_serial = (guint32)strtol(p, &p, 10);
	      p++; /* Skip , */

	      res = strtol(p, &p, 10);

	      return res;
	    }
	}

      return GDK_GRAB_NOT_VIEWABLE;
    }
}
コード例 #4
0
ファイル: gdkdevice-win32.c プロジェクト: nacho/gtk-
static void
gdk_device_win32_ungrab (GdkDevice *device,
                         guint32    time_)
{
    GdkDeviceGrabInfo *info;
    GdkDisplay *display;

    display = gdk_device_get_display (device);
    info = _gdk_display_get_last_device_grab (display, device);

    if (info)
        info->serial_end = 0;

    if (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD)
        ReleaseCapture ();

    _gdk_display_device_grab_update (display, device, NULL, 0);
}
コード例 #5
0
static GdkWindow *
gdk_broadway_device_window_at_position (GdkDevice       *device,
                                        gdouble         *win_x,
                                        gdouble         *win_y,
                                        GdkModifierType *mask,
                                        gboolean         get_toplevel)
{
    GdkScreen *screen;
    GdkWindow *root_window;
    GdkWindow *window;

    screen = gdk_display_get_default_screen (gdk_device_get_display (device));
    root_window = gdk_screen_get_root_window (screen);

    gdk_broadway_device_query_state (device, root_window, NULL, &window, NULL, NULL, win_x, win_y, mask);

    return window;
}
コード例 #6
0
ファイル: gdkdevice-broadway.c プロジェクト: simokivimaki/gtk
static gboolean
gdk_broadway_device_query_state (GdkDevice        *device,
				 GdkWindow        *window,
				 GdkWindow       **root_window,
				 GdkWindow       **child_window,
				 gint             *root_x,
				 gint             *root_y,
				 gint             *win_x,
				 gint             *win_y,
				 GdkModifierType  *mask)
{
  GdkDisplay *display;
  GdkBroadwayDisplay *broadway_display;
  GdkWindowImplBroadway *impl;
  guint32 serial;
  GdkScreen *screen;
  char *reply;
  gint device_root_x, device_root_y, device_win_x, device_win_y, id;

  if (gdk_device_get_source (device) != GDK_SOURCE_MOUSE)
    return FALSE;

  display = gdk_device_get_display (device);
  broadway_display = GDK_BROADWAY_DISPLAY (display);

  if (root_window)
    {
      screen = gdk_window_get_screen (window);
      *root_window = gdk_screen_get_root_window (screen);
    }

  if (mask)
    *mask = 0; /* TODO */

  if (broadway_display->output)
    {
      impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);

      serial = broadway_output_query_pointer (broadway_display->output, impl->id);

      reply = _gdk_broadway_display_block_for_input (display, 'q', serial, TRUE);

      if (reply != NULL)
	{
	  char *p;
	  char cmd;
	  guint32 reply_serial;

	  p = reply;

	  cmd = *p++;
	  reply_serial = (guint32)strtol(p, &p, 10);
	  p++; /* Skip , */

	  device_root_x = strtol(p, &p, 10);
	  p++; /* Skip , */
	  device_root_y = strtol(p, &p, 10);
	  p++; /* Skip , */
	  device_win_x = strtol(p, &p, 10);
	  p++; /* Skip , */
	  device_win_y = strtol(p, &p, 10);
	  p++; /* Skip , */
	  id = strtol(p, &p, 10);

	  if (root_x)
	    *root_x = device_root_x;
	  if (root_y)
	    *root_y = device_root_y;
	  if (win_x)
	    *win_x = device_win_x;
	  if (win_y)
	    *win_y = device_win_y;
	  if (child_window)
	    {
	      if (gdk_window_get_window_type (window) == GDK_WINDOW_ROOT)
		*child_window = g_hash_table_lookup (broadway_display->id_ht, GINT_TO_POINTER (id));
	      else
		*child_window = window; /* No native children */
	    }
	  g_free (reply);
	  return TRUE;
	}
    }

  /* Fallback when unconnected */

  device_root_x = broadway_display->last_x;
  device_root_y = broadway_display->last_y;

  if (root_x)
    *root_x = device_root_x;
  if (root_y)
    *root_y = device_root_y;
  if (win_x)
    *win_x = device_root_y - window->x;
  if (win_y)
    *win_y = device_root_y - window->y;
  if (child_window)
    {
      if (gdk_window_get_window_type (window) == GDK_WINDOW_ROOT)
	{
	  *child_window = broadway_display->mouse_in_toplevel;
	  if (*child_window == NULL)
	    *child_window = window;
	}
      else
	{
	  /* No native children */
	  *child_window = window;
	}
    }

  return TRUE;
}
コード例 #7
0
ファイル: gdkdevice-wintab.c プロジェクト: GNOME/gtk
static void
gdk_device_wintab_query_state (GdkDevice        *device,
                               GdkSurface        *window,
                               GdkSurface       **child_window,
                               gdouble          *root_x,
                               gdouble          *root_y,
                               gdouble          *win_x,
                               gdouble          *win_y,
                               GdkModifierType  *mask)
{
  GdkDeviceWintab *device_wintab;
  POINT point;
  HWND hwnd, hwndc;
  int scale;

  device_wintab = GDK_DEVICE_WINTAB (device);
  if (window)
    {
      scale = GDK_SURFACE_IMPL_WIN32 (window->impl)->surface_scale;
      hwnd = GDK_SURFACE_HWND (window);
    }
  else
    {
      GdkDisplay *display = gdk_device_get_display (device);

      scale = GDK_WIN32_DISPLAY (display)->surface_scale;
      hwnd = NULL;
    }

  GetCursorPos (&point);

  if (root_x)
    *root_x = point.x / scale;

  if (root_y)
    *root_y = point.y / scale;

  if (hwnd)
    ScreenToClient (hwnd, &point);

  if (win_x)
    *win_x = point.x / scale;

  if (win_y)
    *win_y = point.y / scale;

  if (!window)
    {
      if (win_x)
        *win_x += _gdk_offset_x;

      if (win_y)
        *win_y += _gdk_offset_y;
    }

  if (hwnd && child_window)
    {
      hwndc = ChildWindowFromPoint (hwnd, point);

      if (hwndc && hwndc != hwnd)
        *child_window = gdk_win32_handle_table_lookup (hwndc);
      else
        *child_window = NULL; /* Direct child unknown to gdk */
    }

  if (mask)
    {
      *mask = get_current_mask ();
      *mask &= 0xFF; /* Mask away core pointer buttons */
      *mask |= ((device_wintab->button_state << 8)
                & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK
                   | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK
                   | GDK_BUTTON5_MASK));

    }
}
コード例 #8
0
static void
gdk_broadway_device_query_state (GdkDevice        *device,
                                 GdkWindow        *window,
                                 GdkWindow       **root_window,
                                 GdkWindow       **child_window,
                                 gdouble          *root_x,
                                 gdouble          *root_y,
                                 gdouble          *win_x,
                                 gdouble          *win_y,
                                 GdkModifierType  *mask)
{
    GdkWindow *toplevel;
    GdkWindowImplBroadway *impl;
    GdkDisplay *display;
    GdkBroadwayDisplay *broadway_display;
    GdkScreen *screen;
    gint32 device_root_x, device_root_y;
    guint32 mouse_toplevel_id;
    GdkWindow *mouse_toplevel;
    guint32 mask32;

    if (gdk_device_get_source (device) != GDK_SOURCE_MOUSE)
        return;

    display = gdk_device_get_display (device);
    broadway_display = GDK_BROADWAY_DISPLAY (display);

    impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
    toplevel = impl->wrapper;

    if (root_window)
    {
        screen = gdk_window_get_screen (window);
        *root_window = gdk_screen_get_root_window (screen);
    }

    _gdk_broadway_server_query_mouse (broadway_display->server,
                                      &mouse_toplevel_id,
                                      &device_root_x,
                                      &device_root_y,
                                      &mask32);
    mouse_toplevel = g_hash_table_lookup (broadway_display->id_ht, GUINT_TO_POINTER (mouse_toplevel_id));

    if (root_x)
        *root_x = device_root_x;
    if (root_y)
        *root_y = device_root_y;
    if (win_x)
        *win_x = device_root_x - toplevel->x;
    if (win_y)
        *win_y = device_root_y - toplevel->y;
    if (mask)
        *mask = mask32;
    if (child_window)
    {
        if (gdk_window_get_window_type (toplevel) == GDK_WINDOW_ROOT)
        {
            *child_window = mouse_toplevel;
            if (*child_window == NULL)
                *child_window = toplevel;
        }
        else
        {
            /* No native children */
            *child_window = toplevel;
        }
    }

    return;
}