Compare commits
	
		
			6 Commits
		
	
	
		
			wip/jimmac
			...
			wip/waylan
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					30898007f3 | ||
| 
						 | 
					2754a5e3a1 | ||
| 
						 | 
					da1b7f4f83 | ||
| 
						 | 
					206f036cef | ||
| 
						 | 
					e3be2237b8 | ||
| 
						 | 
					d663beab97 | 
@@ -53,7 +53,7 @@ const Magnifier = new Lang.Class({
 | 
			
		||||
        this._zoomRegions = [];
 | 
			
		||||
 | 
			
		||||
        // Create small clutter tree for the magnified mouse.
 | 
			
		||||
        let xfixesCursor = Shell.XFixesCursor.get_for_stage(global.stage);
 | 
			
		||||
        let xfixesCursor = Shell.XFixesCursor.get_for_screen(global.screen);
 | 
			
		||||
        this._mouseSprite = new Clutter.Texture();
 | 
			
		||||
        xfixesCursor.update_texture_image(this._mouseSprite);
 | 
			
		||||
        this._cursorRoot = new Clutter.Actor();
 | 
			
		||||
@@ -83,7 +83,7 @@ const Magnifier = new Lang.Class({
 | 
			
		||||
     * Show the system mouse pointer.
 | 
			
		||||
     */
 | 
			
		||||
    showSystemCursor: function() {
 | 
			
		||||
        this._xfixesCursor.show();
 | 
			
		||||
        global.stage.show_cursor();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -91,7 +91,7 @@ const Magnifier = new Lang.Class({
 | 
			
		||||
     * Hide the system mouse pointer.
 | 
			
		||||
     */
 | 
			
		||||
    hideSystemCursor: function() {
 | 
			
		||||
        this._xfixesCursor.hide();
 | 
			
		||||
        global.stage.hide_cursor();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -112,7 +112,7 @@ const Magnifier = new Lang.Class({
 | 
			
		||||
        // Make sure system mouse pointer is shown when all zoom regions are
 | 
			
		||||
        // invisible.
 | 
			
		||||
        if (!activate)
 | 
			
		||||
            this._xfixesCursor.show();
 | 
			
		||||
            global.stage.show_cursor();
 | 
			
		||||
 | 
			
		||||
        // Notify interested parties of this change
 | 
			
		||||
        this.emit('active-changed', activate);
 | 
			
		||||
 
 | 
			
		||||
@@ -314,38 +314,6 @@ gnome_shell_plugin_kill_switch_workspace (MetaPlugin         *plugin)
 | 
			
		||||
  _shell_wm_kill_switch_workspace (get_shell_wm());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
ignore_crossing_event (MetaPlugin   *plugin,
 | 
			
		||||
                       XIEnterEvent *enter_event)
 | 
			
		||||
{
 | 
			
		||||
  MetaScreen *screen = meta_plugin_get_screen (plugin);
 | 
			
		||||
  ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
 | 
			
		||||
 | 
			
		||||
  if (enter_event->event == clutter_x11_get_stage_window (stage))
 | 
			
		||||
    {
 | 
			
		||||
      /* If the pointer enters a child of the stage window (eg, a
 | 
			
		||||
       * trayicon), we want to consider it to still be in the stage,
 | 
			
		||||
       * so don't let Clutter see the event.
 | 
			
		||||
       */
 | 
			
		||||
      if (enter_event->detail == XINotifyInferior)
 | 
			
		||||
        return TRUE;
 | 
			
		||||
 | 
			
		||||
      /* If the pointer is grabbed by a window it is not currently in,
 | 
			
		||||
       * filter that out as well. In particular, if a trayicon grabs
 | 
			
		||||
       * the pointer after a click on its label, we don't want to hide
 | 
			
		||||
       * the message tray. Filtering out this event will leave Clutter
 | 
			
		||||
       * out of sync, but that happens fairly often with grabs, and we
 | 
			
		||||
       * can work around it. (Eg, shell_global_sync_pointer().)
 | 
			
		||||
       */
 | 
			
		||||
      if (enter_event->mode == XINotifyGrab &&
 | 
			
		||||
          (enter_event->detail == XINotifyNonlinear ||
 | 
			
		||||
           enter_event->detail == XINotifyNonlinearVirtual))
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
 | 
			
		||||
                                  XEvent     *xev)
 | 
			
		||||
@@ -371,25 +339,10 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Make sure that Clutter doesn't see certain focus change events,
 | 
			
		||||
   * so that when we're moving into something like a tray icon, we
 | 
			
		||||
   * don't unfocus the container. */
 | 
			
		||||
  if (xev->type == GenericEvent &&
 | 
			
		||||
      xev->xcookie.extension == meta_display_get_xinput_opcode (display))
 | 
			
		||||
    {
 | 
			
		||||
      XIEvent *input_event = (XIEvent *) xev->xcookie.data;
 | 
			
		||||
      if ((input_event->evtype == XI_Enter || input_event->evtype == XI_Leave) &&
 | 
			
		||||
          ignore_crossing_event (plugin, (XIEnterEvent *) input_event))
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Pass the event to shell-global
 | 
			
		||||
   */
 | 
			
		||||
  if (_shell_global_check_xdnd_event (shell_plugin->global, xev))
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
  return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
 | 
			
		||||
  return _shell_global_check_xdnd_event (shell_plugin->global, xev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/main.c
									
									
									
									
									
								
							@@ -22,6 +22,7 @@
 | 
			
		||||
#include <atk-bridge.h>
 | 
			
		||||
#include <telepathy-glib/debug.h>
 | 
			
		||||
#include <telepathy-glib/debug-sender.h>
 | 
			
		||||
#include <meta/util.h>
 | 
			
		||||
 | 
			
		||||
#include "shell-global.h"
 | 
			
		||||
#include "shell-global-private.h"
 | 
			
		||||
@@ -41,6 +42,7 @@ extern GType gnome_shell_plugin_get_type (void);
 | 
			
		||||
 | 
			
		||||
static gboolean is_gdm_mode = FALSE;
 | 
			
		||||
static char *session_mode = NULL;
 | 
			
		||||
static gboolean is_display_server = FALSE;
 | 
			
		||||
 | 
			
		||||
#define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1
 | 
			
		||||
#define DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4
 | 
			
		||||
@@ -347,6 +349,12 @@ print_version (const gchar    *option_name,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GOptionEntry gnome_shell_options[] = {
 | 
			
		||||
  {
 | 
			
		||||
    "display-server", 0, 0, G_OPTION_ARG_NONE,
 | 
			
		||||
    &is_display_server,
 | 
			
		||||
    N_("Run as a display server"),
 | 
			
		||||
    NULL,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
 | 
			
		||||
    print_version,
 | 
			
		||||
@@ -396,6 +404,8 @@ main (int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
  g_option_context_free (ctx);
 | 
			
		||||
 | 
			
		||||
  meta_set_is_display_server (is_display_server);
 | 
			
		||||
 | 
			
		||||
  meta_plugin_manager_set_plugin_type (gnome_shell_plugin_get_type ());
 | 
			
		||||
 | 
			
		||||
  meta_set_wm_name (WM_NAME);
 | 
			
		||||
 
 | 
			
		||||
@@ -930,9 +930,34 @@ _shell_global_set_plugin (ShellGlobal *global,
 | 
			
		||||
                                               meta_screen_get_screen_number (global->meta_screen));
 | 
			
		||||
 | 
			
		||||
  global->stage = CLUTTER_STAGE (meta_get_stage_for_screen (global->meta_screen));
 | 
			
		||||
  global->stage_xwindow = clutter_x11_get_stage_window (global->stage);
 | 
			
		||||
  global->stage_gdk_window = gdk_x11_window_foreign_new_for_display (global->gdk_display,
 | 
			
		||||
                                                                     global->stage_xwindow);
 | 
			
		||||
  if (meta_is_display_server ())
 | 
			
		||||
    {
 | 
			
		||||
      /* When Mutter is acting as its own display server then the
 | 
			
		||||
         stage does not have a window. Instead we'll just create a
 | 
			
		||||
         dummy window that might make some things blunder along but
 | 
			
		||||
         will probably just leave most things broken. It might be
 | 
			
		||||
         possible to fix this to make the fake window be the same size
 | 
			
		||||
         as the stage window would be and make it more useful. */
 | 
			
		||||
 | 
			
		||||
      GdkWindowAttr attributes;
 | 
			
		||||
 | 
			
		||||
      attributes.wclass = GDK_INPUT_OUTPUT;
 | 
			
		||||
      attributes.width = 100;
 | 
			
		||||
      attributes.height = 100;
 | 
			
		||||
      attributes.window_type = GDK_WINDOW_TOPLEVEL;
 | 
			
		||||
 | 
			
		||||
      global->stage_gdk_window = gdk_window_new (NULL,
 | 
			
		||||
                                                 &attributes,
 | 
			
		||||
                                                 0 /* attributes_mask */);
 | 
			
		||||
      global->stage_xwindow = gdk_x11_window_get_xid (global->stage_gdk_window);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      global->stage_xwindow = clutter_x11_get_stage_window (global->stage);
 | 
			
		||||
      global->stage_gdk_window =
 | 
			
		||||
        gdk_x11_window_foreign_new_for_display (global->gdk_display,
 | 
			
		||||
                                                global->stage_xwindow);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_signal_connect (global->stage, "notify::width",
 | 
			
		||||
                    G_CALLBACK (global_stage_notify_width), global);
 | 
			
		||||
@@ -1240,9 +1265,12 @@ void shell_global_init_xdnd (ShellGlobal *global)
 | 
			
		||||
                   gdk_x11_get_xatom_by_name ("XdndAware"), XA_ATOM,
 | 
			
		||||
                   32, PropModeReplace, (const unsigned char *)&xdnd_version, 1);
 | 
			
		||||
 | 
			
		||||
  XChangeProperty (global->xdisplay, output_window,
 | 
			
		||||
                   gdk_x11_get_xatom_by_name ("XdndProxy"), XA_WINDOW,
 | 
			
		||||
                   32, PropModeReplace, (const unsigned char *)&global->stage_xwindow, 1);
 | 
			
		||||
  /* There is no overlay window when running as a display server */
 | 
			
		||||
  if (output_window)
 | 
			
		||||
    XChangeProperty (global->xdisplay, output_window,
 | 
			
		||||
                     gdk_x11_get_xatom_by_name ("XdndProxy"), XA_WINDOW,
 | 
			
		||||
                     32, PropModeReplace,
 | 
			
		||||
                     (const unsigned char *)&global->stage_xwindow, 1);
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * XdndProxy is additionally set on the proxy window as verification that the
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,11 @@
 | 
			
		||||
 | 
			
		||||
#include "shell-xfixes-cursor.h"
 | 
			
		||||
 | 
			
		||||
#include <clutter/x11/clutter-x11.h>
 | 
			
		||||
#include <gdk/gdkx.h>
 | 
			
		||||
#include <X11/extensions/Xfixes.h>
 | 
			
		||||
#include <meta/display.h>
 | 
			
		||||
#include <meta/screen.h>
 | 
			
		||||
#include <meta/util.h>
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:shell-xfixes-cursor
 | 
			
		||||
@@ -24,7 +27,7 @@ struct _ShellXFixesCursorClass
 | 
			
		||||
struct _ShellXFixesCursor {
 | 
			
		||||
  GObject parent;
 | 
			
		||||
 | 
			
		||||
  ClutterStage *stage;
 | 
			
		||||
  MetaScreen *screen;
 | 
			
		||||
 | 
			
		||||
  gboolean have_xfixes;
 | 
			
		||||
  int xfixes_event_base;
 | 
			
		||||
@@ -36,17 +39,14 @@ struct _ShellXFixesCursor {
 | 
			
		||||
  int cursor_hot_y;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void xfixes_cursor_show        (ShellXFixesCursor *xfixes_cursor);
 | 
			
		||||
static void xfixes_cursor_hide        (ShellXFixesCursor *xfixes_cursor);
 | 
			
		||||
 | 
			
		||||
static void xfixes_cursor_set_stage   (ShellXFixesCursor *xfixes_cursor,
 | 
			
		||||
                                       ClutterStage  *stage);
 | 
			
		||||
static void xfixes_cursor_set_screen   (ShellXFixesCursor *xfixes_cursor,
 | 
			
		||||
                                        MetaScreen        *screen);
 | 
			
		||||
 | 
			
		||||
static void xfixes_cursor_reset_image (ShellXFixesCursor *xfixes_cursor);
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  PROP_0,
 | 
			
		||||
  PROP_STAGE,
 | 
			
		||||
  PROP_SCREEN,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE(ShellXFixesCursor, shell_xfixes_cursor, G_TYPE_OBJECT);
 | 
			
		||||
@@ -71,31 +71,22 @@ shell_xfixes_cursor_finalize (GObject  *object)
 | 
			
		||||
{
 | 
			
		||||
  ShellXFixesCursor *xfixes_cursor = SHELL_XFIXES_CURSOR (object);
 | 
			
		||||
 | 
			
		||||
  // Make sure the system cursor is showing before leaving the stage.
 | 
			
		||||
  xfixes_cursor_show (xfixes_cursor);
 | 
			
		||||
  xfixes_cursor_set_stage (xfixes_cursor, NULL);
 | 
			
		||||
  xfixes_cursor_set_screen (xfixes_cursor, NULL);
 | 
			
		||||
  if (xfixes_cursor->cursor_sprite != NULL)
 | 
			
		||||
    cogl_handle_unref (xfixes_cursor->cursor_sprite);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (shell_xfixes_cursor_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
xfixes_cursor_on_stage_destroy (ClutterActor  *actor,
 | 
			
		||||
                                ShellXFixesCursor *xfixes_cursor)
 | 
			
		||||
{
 | 
			
		||||
  xfixes_cursor_set_stage (xfixes_cursor, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterX11FilterReturn
 | 
			
		||||
xfixes_cursor_event_filter (XEvent        *xev,
 | 
			
		||||
                            ClutterEvent  *cev,
 | 
			
		||||
                            gpointer       data)
 | 
			
		||||
static GdkFilterReturn
 | 
			
		||||
xfixes_cursor_event_filter (XEvent     *xev,
 | 
			
		||||
                            GdkEvent   *ev,
 | 
			
		||||
                            gpointer    data)
 | 
			
		||||
{
 | 
			
		||||
  ShellXFixesCursor *xfixes_cursor = data;
 | 
			
		||||
 | 
			
		||||
  if (xev->xany.window != clutter_x11_get_stage_window (xfixes_cursor->stage))
 | 
			
		||||
    return CLUTTER_X11_FILTER_CONTINUE;
 | 
			
		||||
  if (xev->xany.window != meta_get_overlay_window (xfixes_cursor->screen))
 | 
			
		||||
    return GDK_FILTER_CONTINUE;
 | 
			
		||||
 | 
			
		||||
  if (xev->xany.type == xfixes_cursor->xfixes_event_base + XFixesCursorNotify)
 | 
			
		||||
    {
 | 
			
		||||
@@ -103,93 +94,43 @@ xfixes_cursor_event_filter (XEvent        *xev,
 | 
			
		||||
      if (notify_event->subtype == XFixesDisplayCursorNotify)
 | 
			
		||||
        xfixes_cursor_reset_image (xfixes_cursor);
 | 
			
		||||
    }
 | 
			
		||||
    return CLUTTER_X11_FILTER_CONTINUE;
 | 
			
		||||
 | 
			
		||||
  return GDK_FILTER_CONTINUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
xfixes_cursor_set_stage (ShellXFixesCursor *xfixes_cursor,
 | 
			
		||||
                         ClutterStage  *stage)
 | 
			
		||||
xfixes_cursor_set_screen (ShellXFixesCursor *xfixes_cursor,
 | 
			
		||||
                          MetaScreen        *screen)
 | 
			
		||||
{
 | 
			
		||||
  if (xfixes_cursor->stage == stage)
 | 
			
		||||
  if (xfixes_cursor->screen == screen)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (xfixes_cursor->stage)
 | 
			
		||||
  if (xfixes_cursor->screen)
 | 
			
		||||
    {
 | 
			
		||||
      g_signal_handlers_disconnect_by_func (xfixes_cursor->stage,
 | 
			
		||||
                                            (void *)xfixes_cursor_on_stage_destroy,
 | 
			
		||||
                                            xfixes_cursor);
 | 
			
		||||
 | 
			
		||||
      clutter_x11_remove_filter (xfixes_cursor_event_filter, xfixes_cursor);
 | 
			
		||||
      gdk_window_remove_filter (NULL, (GdkFilterFunc)xfixes_cursor_event_filter, xfixes_cursor);
 | 
			
		||||
    }
 | 
			
		||||
  xfixes_cursor->stage = stage;
 | 
			
		||||
  if (xfixes_cursor->stage)
 | 
			
		||||
 | 
			
		||||
  xfixes_cursor->screen = screen;
 | 
			
		||||
  if (xfixes_cursor->screen)
 | 
			
		||||
    {
 | 
			
		||||
      int error_base;
 | 
			
		||||
 | 
			
		||||
      xfixes_cursor->stage = stage;
 | 
			
		||||
      g_signal_connect (xfixes_cursor->stage, "destroy",
 | 
			
		||||
                        G_CALLBACK (xfixes_cursor_on_stage_destroy), xfixes_cursor);
 | 
			
		||||
      gdk_window_add_filter (NULL, (GdkFilterFunc)xfixes_cursor_event_filter, xfixes_cursor);
 | 
			
		||||
 | 
			
		||||
      clutter_x11_add_filter (xfixes_cursor_event_filter, xfixes_cursor);
 | 
			
		||||
 | 
			
		||||
      xfixes_cursor->have_xfixes = XFixesQueryExtension (clutter_x11_get_default_display (),
 | 
			
		||||
      xfixes_cursor->have_xfixes = XFixesQueryExtension (gdk_x11_get_default_xdisplay (),
 | 
			
		||||
                                                         &xfixes_cursor->xfixes_event_base,
 | 
			
		||||
                                                         &error_base);
 | 
			
		||||
      if (xfixes_cursor->have_xfixes)
 | 
			
		||||
        XFixesSelectCursorInput (clutter_x11_get_default_display (),
 | 
			
		||||
                                 clutter_x11_get_stage_window (stage),
 | 
			
		||||
 | 
			
		||||
      /* FIXME: this needs to be moved down to mutter as a whole */
 | 
			
		||||
      if (xfixes_cursor->have_xfixes && !meta_is_display_server())
 | 
			
		||||
        XFixesSelectCursorInput (gdk_x11_get_default_xdisplay (),
 | 
			
		||||
                                 meta_get_overlay_window (screen),
 | 
			
		||||
                                 XFixesDisplayCursorNotifyMask);
 | 
			
		||||
 | 
			
		||||
      xfixes_cursor_reset_image (xfixes_cursor);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
xfixes_cursor_show (ShellXFixesCursor *xfixes_cursor)
 | 
			
		||||
{
 | 
			
		||||
  int minor, major;
 | 
			
		||||
  Display *xdisplay;
 | 
			
		||||
  Window xwindow;
 | 
			
		||||
 | 
			
		||||
  if (xfixes_cursor->is_showing == TRUE)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
  if (!xfixes_cursor->have_xfixes || !xfixes_cursor->stage)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
  xdisplay = clutter_x11_get_default_display ();
 | 
			
		||||
  xwindow = clutter_x11_get_stage_window (xfixes_cursor->stage);
 | 
			
		||||
  XFixesQueryVersion (xdisplay, &major, &minor);
 | 
			
		||||
  if (major >= 4)
 | 
			
		||||
    {
 | 
			
		||||
      XFixesShowCursor (xdisplay, xwindow);
 | 
			
		||||
      xfixes_cursor->is_showing = TRUE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
xfixes_cursor_hide (ShellXFixesCursor *xfixes_cursor)
 | 
			
		||||
{
 | 
			
		||||
  int minor, major;
 | 
			
		||||
  Display *xdisplay;
 | 
			
		||||
  Window xwindow;
 | 
			
		||||
 | 
			
		||||
  if (xfixes_cursor->is_showing == FALSE)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
  if (!xfixes_cursor->have_xfixes || !xfixes_cursor->stage)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
  xdisplay = clutter_x11_get_default_display ();
 | 
			
		||||
  xwindow = clutter_x11_get_stage_window (xfixes_cursor->stage);
 | 
			
		||||
  XFixesQueryVersion (xdisplay, &major, &minor);
 | 
			
		||||
  if (major >= 4)
 | 
			
		||||
    {
 | 
			
		||||
      XFixesHideCursor (xdisplay, xwindow);
 | 
			
		||||
      xfixes_cursor->is_showing = FALSE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
xfixes_cursor_reset_image (ShellXFixesCursor *xfixes_cursor)
 | 
			
		||||
{
 | 
			
		||||
@@ -201,7 +142,7 @@ xfixes_cursor_reset_image (ShellXFixesCursor *xfixes_cursor)
 | 
			
		||||
  if (!xfixes_cursor->have_xfixes)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  cursor_image = XFixesGetCursorImage (clutter_x11_get_default_display ());
 | 
			
		||||
  cursor_image = XFixesGetCursorImage (gdk_x11_get_default_xdisplay ());
 | 
			
		||||
  if (!cursor_image)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
@@ -265,8 +206,8 @@ shell_xfixes_cursor_set_property (GObject      *object,
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_STAGE:
 | 
			
		||||
      xfixes_cursor_set_stage (xfixes_cursor, g_value_get_object (value));
 | 
			
		||||
    case PROP_SCREEN:
 | 
			
		||||
      xfixes_cursor_set_screen (xfixes_cursor, g_value_get_object (value));
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
@@ -284,8 +225,8 @@ shell_xfixes_cursor_get_property (GObject         *object,
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_STAGE:
 | 
			
		||||
      g_value_set_object (value, G_OBJECT (xfixes_cursor->stage));
 | 
			
		||||
    case PROP_SCREEN:
 | 
			
		||||
      g_value_set_object (value, G_OBJECT (xfixes_cursor->screen));
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
@@ -311,22 +252,22 @@ shell_xfixes_cursor_class_init (ShellXFixesCursorClass *klass)
 | 
			
		||||
  gobject_class->set_property = shell_xfixes_cursor_set_property;
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_property (gobject_class,
 | 
			
		||||
                                   PROP_STAGE,
 | 
			
		||||
                                   g_param_spec_object ("stage",
 | 
			
		||||
                                                        "Stage",
 | 
			
		||||
                                                        "Stage for mouse cursor",
 | 
			
		||||
                                                        CLUTTER_TYPE_STAGE,
 | 
			
		||||
                                   PROP_SCREEN,
 | 
			
		||||
                                   g_param_spec_object ("screen",
 | 
			
		||||
                                                        "Screen",
 | 
			
		||||
                                                        "Screen for mouse cursor",
 | 
			
		||||
                                                        META_TYPE_SCREEN,
 | 
			
		||||
                                                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * shell_xfixes_cursor_get_for_stage:
 | 
			
		||||
 * @stage: (transfer none): The #ClutterStage to get the cursor for
 | 
			
		||||
 * shell_xfixes_cursor_get_for_screen:
 | 
			
		||||
 * @screen: (transfer none): The #MetaScreen to get the cursor for
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer none): A #ShellXFixesCursor instance
 | 
			
		||||
 */
 | 
			
		||||
ShellXFixesCursor *
 | 
			
		||||
shell_xfixes_cursor_get_for_stage (ClutterStage *stage)
 | 
			
		||||
shell_xfixes_cursor_get_for_screen (MetaScreen *screen)
 | 
			
		||||
{
 | 
			
		||||
  ShellXFixesCursor *instance;
 | 
			
		||||
  static GQuark xfixes_cursor_quark;
 | 
			
		||||
@@ -334,47 +275,19 @@ shell_xfixes_cursor_get_for_stage (ClutterStage *stage)
 | 
			
		||||
  if (G_UNLIKELY (xfixes_cursor_quark == 0))
 | 
			
		||||
    xfixes_cursor_quark = g_quark_from_static_string ("gnome-shell-xfixes-cursor");
 | 
			
		||||
 | 
			
		||||
  instance = g_object_get_qdata (G_OBJECT (stage), xfixes_cursor_quark);
 | 
			
		||||
  instance = g_object_get_qdata (G_OBJECT (screen), xfixes_cursor_quark);
 | 
			
		||||
 | 
			
		||||
  if (instance == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      instance = g_object_new (SHELL_TYPE_XFIXES_CURSOR,
 | 
			
		||||
                               "stage", stage,
 | 
			
		||||
                               "screen", screen,
 | 
			
		||||
                               NULL);
 | 
			
		||||
      g_object_set_qdata (G_OBJECT (stage), xfixes_cursor_quark, instance);
 | 
			
		||||
      g_object_set_qdata (G_OBJECT (screen), xfixes_cursor_quark, instance);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return instance;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * shell_xfixes_cursor_hide:
 | 
			
		||||
 * @xfixes_cursor: the #ShellXFixesCursor
 | 
			
		||||
 *
 | 
			
		||||
 * Hide the system mouse cursor.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
shell_xfixes_cursor_hide (ShellXFixesCursor *xfixes_cursor)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (SHELL_IS_XFIXES_CURSOR (xfixes_cursor));
 | 
			
		||||
 | 
			
		||||
  xfixes_cursor_hide (xfixes_cursor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * shell_xfixes_cursor_show:
 | 
			
		||||
 * @xfixes_cursor: the #ShellXFixesCursor
 | 
			
		||||
 *
 | 
			
		||||
 * Show the system mouse cursor to show
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
shell_xfixes_cursor_show (ShellXFixesCursor *xfixes_cursor)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (SHELL_IS_XFIXES_CURSOR (xfixes_cursor));
 | 
			
		||||
 | 
			
		||||
  xfixes_cursor_show (xfixes_cursor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * shell_xfixes_cursor_update_texture_image:
 | 
			
		||||
 * @xfixes_cursor:  the #ShellXFixesCursor
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter.h>
 | 
			
		||||
#include <gdk-pixbuf/gdk-pixbuf.h>
 | 
			
		||||
#include <meta/screen.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
@@ -19,10 +20,8 @@ typedef struct _ShellXFixesCursorClass   ShellXFixesCursorClass;
 | 
			
		||||
 | 
			
		||||
GType               shell_xfixes_cursor_get_type     (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
ShellXFixesCursor   *shell_xfixes_cursor_get_for_stage (ClutterStage *stage);
 | 
			
		||||
ShellXFixesCursor   *shell_xfixes_cursor_get_for_screen (MetaScreen *screen);
 | 
			
		||||
 | 
			
		||||
void                shell_xfixes_cursor_show (ShellXFixesCursor *xfixes_cursor);
 | 
			
		||||
void                shell_xfixes_cursor_hide (ShellXFixesCursor *xfixes_cursor);
 | 
			
		||||
int                 shell_xfixes_cursor_get_hot_x (ShellXFixesCursor *xfixes_cursor);
 | 
			
		||||
int                 shell_xfixes_cursor_get_hot_y (ShellXFixesCursor *xfixes_cursor);
 | 
			
		||||
void                shell_xfixes_cursor_update_texture_image (ShellXFixesCursor *xfixes_cursor,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user