summaryrefslogtreecommitdiff
path: root/gnome-settings-daemon/gnome-settings-locate-pointer.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnome-settings-daemon/gnome-settings-locate-pointer.c')
-rw-r--r--gnome-settings-daemon/gnome-settings-locate-pointer.c227
1 files changed, 0 insertions, 227 deletions
diff --git a/gnome-settings-daemon/gnome-settings-locate-pointer.c b/gnome-settings-daemon/gnome-settings-locate-pointer.c
deleted file mode 100644
index 0ae80eb99..000000000
--- a/gnome-settings-daemon/gnome-settings-locate-pointer.c
+++ /dev/null
@@ -1,227 +0,0 @@
-#include <gtk/gtk.h>
-
-#include "gnome-settings-locate-pointer.h"
-#include "gnome-settings-daemon.h"
-
-#define LARGE_SIZE 101
-#define SMALL_SIZE 51
-
-typedef enum {
- STAGE_ONE,
- STAGE_TWO,
- STAGE_THREE,
- STAGE_FOUR,
- STAGE_DONE
-} LocatePointerStage;
-
-static LocatePointerStage stage;
-static GdkWindow *window = NULL;
-static gint cursor_x, cursor_y;
-static guint locate_pointer_id = 0;
-
-static gint
-locate_pointer_expose (GtkWidget *widget,
- GdkEventExpose *event,
- gpointer data)
-{
- gint size;
- GdkPoint points[4];
-
- if (event->window != window)
- return FALSE;
-
- switch (stage)
- {
- case STAGE_ONE:
- case STAGE_TWO:
- size = LARGE_SIZE;
- break;
- case STAGE_THREE:
- case STAGE_FOUR:
- size = SMALL_SIZE;
- break;
- default:
- return FALSE;
- }
-
- gdk_draw_rectangle (event->window,
- widget->style->black_gc,
- TRUE,
- 0, 0, size, size);
- switch (stage)
- {
- case STAGE_ONE:
- case STAGE_THREE:
- gdk_draw_rectangle (event->window,
- widget->style->white_gc,
- FALSE,
- 1, 1, size - 3, size - 3);
- break;
- case STAGE_TWO:
- case STAGE_FOUR:
- points[0].x = size/2;
- points[0].y = 0 + 1;
- points[1].x = size - 2;
- points[1].y = size/2;
- points[2].x = size/2;
- points[2].y = size - 2;
- points[3].x = 0 + 1;
- points[3].y = size/2;
- gdk_draw_polygon (event->window,
- widget->style->white_gc,
- FALSE, points, 4);
- break;
- default:
- g_assert_not_reached ();
- }
-
- return TRUE;
-}
-
-static void
-setup_window (void)
-{
- gint size;
- GdkBitmap *mask;
- GdkGC *gc;
- GdkColor col;
- GdkPoint points[4];
-
- gdk_window_hide (window);
- switch (stage)
- {
- case STAGE_ONE:
- case STAGE_TWO:
- size = LARGE_SIZE;
- break;
- case STAGE_THREE:
- case STAGE_FOUR:
- size = SMALL_SIZE;
- break;
- default:
- return;
- }
-
- gdk_window_move_resize (window,
- cursor_x - size/2,
- cursor_y - size/2,
- size, size);
- mask = gdk_pixmap_new (window, size, size, 1);
- gc = gdk_gc_new (mask);
- switch (stage)
- {
- case STAGE_ONE:
- case STAGE_THREE:
- col.pixel = 1;
- gdk_gc_set_foreground (gc, &col);
- gdk_draw_rectangle (mask, gc, TRUE, 0, 0, size, size);
- col.pixel = 0;
- gdk_gc_set_foreground (gc, &col);
- gdk_draw_rectangle (mask, gc, TRUE, 3, 3, size - 6, size - 6);
- break;
- case STAGE_TWO:
- case STAGE_FOUR:
- col.pixel = 0;
- gdk_gc_set_foreground (gc, &col);
- gdk_draw_rectangle (mask, gc, TRUE, 0, 0, size, size);
- col.pixel = 1;
- gdk_gc_set_foreground (gc, &col);
- points[0].x = size/2;
- points[0].y = 0;
- points[1].x = size - 1;
- points[1].y = size/2;
- points[2].x = size/2;
- points[2].y = size - 1;
- points[3].x = 0;
- points[3].y = size/2;
- gdk_draw_polygon (mask, gc, FALSE, points, 4);
- points[0].x = size/2;
- points[0].y = 0 + 1;
- points[1].x = size - 2;
- points[1].y = size/2;
- points[2].x = size/2;
- points[2].y = size - 2;
- points[3].x = 0 + 1;
- points[3].y = size/2;
- gdk_draw_polygon (mask, gc, FALSE, points, 4);
- points[0].x = size/2;
- points[0].y = 0 + 2;
- points[1].x = size - 3;
- points[1].y = size/2;
- points[2].x = size/2;
- points[2].y = size - 3;
- points[3].x = 0 + 2;
- points[3].y = size/2;
- gdk_draw_polygon (mask, gc, FALSE, points, 4);
- break;
- default:
- g_assert_not_reached ();
- }
-
- gdk_window_shape_combine_mask (window, mask, 0, 0);
- g_object_unref (G_OBJECT (gc));
- g_object_unref (G_OBJECT (mask));
- gdk_window_show (window);
-}
-
-static void
-create_window (GdkScreen *screen)
-{
- GdkWindowAttr attributes;
- GtkWidget *invisible;
-
- invisible = gtk_invisible_new_for_screen (screen);
-
- attributes.window_type = GDK_WINDOW_TEMP;
- attributes.wclass = GDK_INPUT_OUTPUT;
- attributes.visual = gtk_widget_get_visual (invisible);
- attributes.colormap = gtk_widget_get_colormap (invisible);
- attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK;
- attributes.width = 1;
- attributes.height = 1;
- window = gdk_window_new (gdk_screen_get_root_window (screen),
- &attributes,
- GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
- gdk_window_set_user_data (window, invisible);
- g_signal_connect (G_OBJECT (invisible),
- "expose_event",
- (GCallback) locate_pointer_expose,
- NULL);
-}
-
-static gboolean
-locate_pointer_timeout (gpointer data)
-{
- stage++;
- if (stage == STAGE_DONE)
- {
- gdk_window_hide (window);
- locate_pointer_id = 0;
- return FALSE;
- }
- setup_window ();
- return TRUE;
-}
-
-void
-gnome_settings_locate_pointer (GdkScreen *screen)
-{
- gdk_window_get_pointer (gdk_screen_get_root_window (screen), &cursor_x, &cursor_y, NULL);
-
- if (locate_pointer_id)
- gtk_timeout_remove (locate_pointer_id);
-
- /* Create the window if it is not created OR if it is not for the
- * current screen.
- */
-
- if (window == NULL)
- create_window (screen);
- else if( gdk_screen_get_number (screen) != gdk_screen_get_number (gdk_drawable_get_screen (window)))
- create_window (screen);
-
- stage = STAGE_ONE;
- setup_window ();
- gdk_window_show (window);
- locate_pointer_id = gtk_timeout_add (100, locate_pointer_timeout, NULL);
-}