/* Copyright (c) 2005 Russ Cox, see README for licence details */
#include <stdio.h>
#include <stdlib.h>
#include <X11/X.h>
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/extensions/shape.h>
#include "dat.h"
#include "fns.h"
#include "patchlevel.h"

enum
{
	GrabAltTab,
	GrabAltAny,
};

static int tabcode = 0x17;
static int altcode = 0x40;
static int pgupcode = 0x63;
static int pgdowncode = 0x69;

static void altpress(void);
static void altrelease(void);
static void alttab(int shift);

void
keysetup(void)
{
	int i;

	for(i=0; i<num_screens; i++){
		XGrabKey(dpy, tabcode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync);
		XGrabKey(dpy, tabcode, Mod1Mask|ShiftMask, screens[i].root, 0, GrabModeSync, GrabModeAsync);
	//	XGrabKey(dpy, pgupcode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync);
	//	XGrabKey(dpy, pgdowncode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync);
	//	XGrabKey(dpy, altcode, 0, screens[i].root, 0, GrabModeSync, GrabModeAsync);
	}
}

void
keypress(XKeyEvent *e)
{
	/*
	 * process key press here
	 */
	if(e->keycode == tabcode)
		alttab(e->state&ShiftMask);
	XAllowEvents(dpy, SyncKeyboard, e->time);
}

void
keyrelease(XKeyEvent *e)
{
	XAllowEvents(dpy, SyncKeyboard, e->time);
}

static void
alttab(int shift)
{
	shuffle(shift);
//	fprintf(stderr, "%sTab\n", shift ? "Back" : "");
}

