/***************************************************************************
                          kbswitchapp.h  -  description
                             -------------------
    begin                : Sun Jul 1 2001
    copyright            : (C) 2001 by Leonid Zeitlin
    email                : lz@europe.com
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef KBSWITCHAPP_H
#define KBSWITCHAPP_H

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <tdeversion.h>
#include <kuniqueapplication.h>

//#include <tqmap.h>

#include "kbgroup.h"
#include "kbswitchtrayicon.h"
#include "kbconfig.h"
#include "xkeyboard.h"
#include "kbswitchintf.h"
#include "windowwatcher.h"

/*class KWinModule;

typedef struct _KBWinInfo {
  int groupno;
  int next_groupno;
} KBWinInfo;

typedef TQMap<WId, KBWinInfo> KBWindowMap;*/

/**
  *@author Leonid Zeitlin
  */

class KBSwitchApp : public KUniqueApplication {
  TQ_OBJECT
public: 
  KBSwitchApp();
  ~KBSwitchApp();
protected: // Protected methods
  /** No descriptions */
  bool x11EventFilter(XEvent *e);
private: // Private attributes
  /**  */
  bool m_force_group_setting;
  int m_cur_groupno;
  int m_next_groupno;
  XKeyboard m_xkb;
  /**  */
  KBSwitchTrayIcon * m_trayicon;
  /** No descriptions */
  KBConfig m_kbconf;
  KBSwitchIntf *m_intf;
#ifndef HAVE_LIBXKLAVIER  
  /** Window manager interface */
  //KWinModule *m_twin_module;
  /** Maps Window IDs to their keyboard groups */
  //KBWindowMap m_window_map;
  //KBWindowMap::iterator m_active_window;
  WindowWatcher *m_watcher;
  KBConfig::GroupScope m_watcher_type;
#endif  
private: // Private methods
  /** Update the tray icon to show the flag corresponding to the current keyboard group */
  void updateIcon(int groupno);
  /** No descriptions */
  void internalToggleGroups();
  /** No descriptions */
  void forceSetGroup(int groupno);
  /** No descriptions */
  /*int getNextGroup(int groupno) {
    return groupno >= m_kbconf.groupCount() - 1 ? 0 : groupno + 1;
  }*/
  /** No descriptions */
  void setStartGroup(int start_group);
  void adaptToGroup(int groupno);
#ifndef HAVE_LIBXKLAVIER  
  /** initialize Window groups map */
  //void resetWindowMap();
  /** Disable window manager notifications */
  //void disableKWinModule();
  /** Enable window manager notifications */
  //void enableKWinModule();
  /** adds a new window to the internal window map */
  //void addWindowToMap(WId window_id);
  void enableWatcher();
  void disableWatcher();
#endif  
  /** Set the current and next groups */
  void setGroups(int group, int next_group);
private slots: // Private slots
  /** No descriptions */
  void slotGroupSelected(int groupno);
  /** Select the next keyboard layout (wraps around) */
  void slotSelectNextGroup();
  /** Select the previous keyboard layout (wraps around) */
  void slotSelectPrevGroup();
  /** No descriptions */
  void slotPreferences();
  /** No descriptions */
  void reconfigure();
  /** Respond to XKB changing the current group */
  void slotXkbGroupChanged(int groupno);
  /** Respond to changing of active window - active it's kb group */
  //void slotWindowChanged(WId activeWindow);
  /** Respond to removal of a window - remote it from Window groups map */
  //void slotWindowRemoved(WId window);
  void slotWindowChanged(int groupno, int next_groupno);
  /** React to a change in KKBSwitch's user preferences,
    * made by user in Configure dialog */
  void slotPrefChanged();
};

#endif
