コード例 #1
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_);
    }
}
コード例 #2
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;
    }
}
コード例 #3
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;
}
コード例 #4
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;
}