/*  This program is free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*  You should have received a copy of the GNU General Public License
*  along with this program; if not, write to the Free Software
*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
// (C) PicoPeta Simputers Pvt. Ltd. 
// Author: Santhosh N

/* 

   Copyright 2003 (c) PicoPeta Simputers Pvt. Ltd.

*/

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <tk.h>
#include <acctrl.h>


int alchemy_interface(ClientData cd, Tcl_Interp *interp,
            int objc, Tcl_Obj *CONST objv[])
{
    char *command,*parameter;
    Display *dpy;
    Window appwin;
    Window *child;
    Window root;
    Window parent;
    int num=0;

    if(objc!=3 && objc!=4) {
        Tcl_WrongNumArgs(interp,1,objv,"<command> <parameter> [target_window]");
        return TCL_ERROR;
    }
    if(!(command=Tcl_GetStringFromObj(objv[1],NULL)))
    {
	    Tcl_SetResult(interp, "Command not found", TCL_VOLATILE);
            return TCL_ERROR;
    }
    if(!(parameter=Tcl_GetStringFromObj(objv[2],NULL)))
    {
	    Tcl_SetResult(interp, "Paramter not found", TCL_VOLATILE);
            return TCL_ERROR;
    }

    dpy=Tk_Display(Tk_MainWindow(interp));
    /* Tk's toplevel is reparented -- what we want is parent of toplevel*/
    if(objc==4) {
        char *target_windowid;

        if(!(target_windowid=Tcl_GetStringFromObj(objv[3],NULL)))
	{
	    	Tcl_SetResult(interp, "Could not get target window", TCL_VOLATILE);
		return TCL_ERROR;
	}

        appwin = (Window) strtoul(target_windowid, NULL, 16);
        XQueryTree(dpy, appwin, &root, &parent, &child, &num);
        if(num) {
            XFree(child);
        }
        appwin=parent;
    } else {
        appwin=Tk_WindowId(Tk_MainWindow(interp));
        XQueryTree(dpy, appwin, &root, &parent, &child, &num);
        if(num) {
            XFree(child);
        }
        appwin=parent;
    }

    if(!strcmp(command,"theme")) {
        ac_control_win(AC_CMD_SET_THEME, parameter, dpy, appwin);
    } else if(!strcmp(command,"do")) {
        if(!strcmp(parameter,"exit"))
            ac_control_win(AC_CMD_EXIT, NULL, dpy, appwin);
        else if(!strcmp(parameter,"swapcloseup"))
            ac_control_win(AC_CMD_SWAP_CLOSE_UP, NULL, dpy, appwin);
        else if(!strcmp(parameter,"showup"))
            ac_control_win(AC_CMD_SHOW_UP, NULL, dpy, appwin);
        else if(!strcmp(parameter,"showclose"))
            ac_control_win(AC_CMD_SHOW_CLOSE, NULL, dpy, appwin);
        else if(!strcmp(parameter,"showtick"))
            ac_control_win(AC_CMD_SHOW_TICK, NULL, dpy, appwin);
	
    } else if(!strcmp(command,"delete_annotate")) {
            ac_control_win(AC_CMD_DEL_ANNOTATION, parameter, dpy, appwin);
    } else if(!strcmp(command,"window")) {
        
        if(!strcmp(parameter,"next"))
            ac_control_win(AC_CMD_NEXT, NULL, dpy, appwin);
        else if(!strcmp(parameter,"prev"))
            ac_control_win(AC_CMD_PREV, NULL, dpy, appwin);
        else if(!strcmp(parameter,"togglefullscreen"))
            ewmh_command_win("_NET_WM_STATE_FULLSCREEN", _NET_WM_STATE_TOGGLE, dpy, appwin);
    } else if(!strcmp(command,"status_msg")) {
        ac_control_win(AC_CMD_SET_STATUS_MSG, parameter, dpy, appwin);
    } else if(!strcmp(command,"pagenum")) {
        ac_control_win(AC_CMD_SET_PAGE_NUM, parameter, dpy, appwin);
    } else if(!strcmp(command,"pagenum_font")) {
        ac_control_win(AC_CMD_SET_PAGE_NUM_FONT, parameter, dpy, appwin);
    } else if(!strcmp(command,"pagenum_justify")) {
        ac_control_win(AC_CMD_SET_PAGE_NUM_JUSTIFY, parameter, dpy, appwin);
    } else if(!strcmp(command,"printer")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_SHOW_PRINTER;
        else
            cmd = AC_CMD_HIDE_PRINTER;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"grab")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_GRAB_ON;
        else
            cmd = AC_CMD_GRAB_OFF;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"keyboard")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_SHOW_KEYBOARD;
        else
            cmd = AC_CMD_HIDE_KEYBOARD;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"pagenav")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_SHOW_PAGE_NAV;
        else
            cmd = AC_CMD_HIDE_PAGE_NAV;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"email")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_SHOW_EMAIL;
        else
            cmd = AC_CMD_HIDE_EMAIL;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"voice")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_SHOW_VOICE;
        else
            cmd = AC_CMD_HIDE_VOICE;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"speaker")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_SHOW_SPEAKER;
        else if(!strcmp(parameter,"off"))
            cmd = AC_CMD_HIDE_SPEAKER;
        else if(!strcmp(parameter,"application"))
            cmd = AC_CMD_APP_SPEAKS;
        else if(!strcmp(parameter,"alchemy"))
            cmd = AC_CMD_AC_SPEAKS;

        ac_control_win(cmd, NULL, dpy, appwin);

    } else if(!strcmp(command,"help")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_SHOW_HELP;
        else if(!strcmp(parameter,"off"))
            cmd = AC_CMD_HIDE_HELP;

        ac_control_win(cmd, NULL, dpy, appwin);

    } else if(!strcmp(command,"enable")) {
        int cmd;
        if(!strcmp(parameter,"pagenext"))
            cmd = AC_CMD_ENABLE_PAGE_NEXT;
        else if(!strcmp(parameter,"pageprev"))
            cmd = AC_CMD_ENABLE_PAGE_PREV;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"disable")) {
        int cmd;
        if(!strcmp(parameter,"pagenext"))
            cmd = AC_CMD_DISABLE_PAGE_NEXT;
        else if(!strcmp(parameter,"pageprev"))
            cmd = AC_CMD_DISABLE_PAGE_PREV;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"input")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_SHOW_INPUT;
        else
            cmd = AC_CMD_HIDE_INPUT;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"retractbar")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_SHOW_RETRACTBAR;
        else
            cmd = AC_CMD_HIDE_RETRACTBAR;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"annotate")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_SHOW_ANNOTATE;
        else
            cmd = AC_CMD_HIDE_ANNOTATE;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"status")) {
        int cmd;
        if(!strcmp(parameter,"on"))
            cmd = AC_CMD_SHOW_STATUS;
        else
            cmd = AC_CMD_HIDE_STATUS;

        ac_control_win(cmd, NULL, dpy, appwin);
    } else if(!strcmp(command,"annotatekey")) {
        ac_control_win(AC_CMD_SET_ANNOTATE_KEY, parameter, dpy, appwin);
    } else if(!strcmp(command,"helpkey")) {
        ac_control_win(AC_CMD_SET_HELP_KEY, parameter, dpy, appwin);
    } else if(!strcmp(command,"status_justify")) {
        ac_control_win(AC_CMD_SET_STATUS_JUSTIFY, parameter, dpy, appwin);
    } else if(!strcmp(command,"status_font")) {
        ac_control_win(AC_CMD_SET_STATUS_FONT, parameter, dpy, appwin);
    } else if(!strcmp(command,"title_font")) {
        ac_control_win(AC_CMD_SET_TITLE_FONT, parameter, dpy, appwin);
    } else if(!strcmp(command,"title_justify")) {
        ac_control_win(AC_CMD_SET_TITLE_JUSTIFY, parameter, dpy, appwin);
    } else if(!strcmp(command,"launch")) {
        ac_control_win(AC_CMD_LAUNCH_APP, parameter, dpy, appwin);
    } else if(!strcmp(command,"emailfile")) {
        ac_control_win(AC_CMD_SET_EMAIL_FILE, parameter, dpy, appwin);
    } else if(!strcmp(command,"getappid")) {
        Window win, root=0, parent=0, *children=NULL;
        unsigned int num_children;
        unsigned long appid;
        Tcl_Obj *optr;

        win = (Window) strtoul(parameter, NULL, 16);
        XQueryTree(dpy, win, &root, &parent, &children, &num_children);
        if(children)
            XFree((char *) children);
        appid = getWindowAppid(parent, dpy);
        optr = Tcl_GetObjResult(interp);
        Tcl_SetIntObj(optr, appid);
    } else if (!strcmp(command, "change_keyboard")) {
	    ac_control_win(AC_CMD_SET_KEYBOARD_CATEGORY, parameter, dpy, appwin);
    } else if (!strcmp(command, "change_layout")) {
	    ac_control_win(AC_CMD_SET_KEYBOARD_LAYOUT, parameter, dpy, appwin);
    } else if (!strcmp(command, "layer")) {
	    if (!strcmp(parameter, "application")) {
			char *envvar;
			char command[512];

			ac_control_win(AC_CMD_LAYER_NEXT_APP, NULL, dpy, appwin);
			envvar = getenv("_NET_WM_NAME");
			sprintf(command,"global env; set env(_NET_WM_NAME) %s", envvar);
			Tcl_Eval(interp, command);
			sprintf(command,"global env; set env(_AC_W_LAYER_WINDOWID) %lu", appwin);
			Tcl_Eval(interp, command);
		} else
			ac_control_win(AC_CMD_LAYER_THIS_WIN, parameter, dpy, appwin);
    } else {
		Tcl_SetResult(interp, "Undefined command", TCL_VOLATILE);
		return TCL_ERROR;
    }

    return TCL_OK;
}
