Source Code (Use browser search to find items of interest.)

Class Index

kikbd'KeyMap (./kdebase/kikbd/keymap.h:61)

class KeyMap: public QObject {
  Q_OBJECT
 protected:
  static  bool isToggleCaps;
  QString name, label, comment;
  bool    altKeys, compose;
  KeySyms keySyms[4], capsKeySyms[4];
 public:
  KeyMap(KiKbdMapConfig&, KeySyms& initSyms);
  bool  changeKeySym(const char*, const char*, int, unsigned);
  const QString getName()    const { return name;    }
  const QString getLabel()   const { return label;   }
  const QString getComment() const { return comment; }
  bool  hasAltKeys() const {return altKeys;}
  bool  hasCompose() const {return compose;}
  void  toggle(unsigned);
  void  toggleCaps(bool, unsigned);
 signals:
  void infoChanged(QString, QString);
};

kikbd'KeyMap::KeyMap() (./kdebase/kikbd/keymap.cpp:40)

KeyMap::KeyMap(KiKbdMapConfig& config, KeySyms& initSyms)
{
  /**
     language information
  */
  name    = config.getName();
  label   = config.getLabel();
  comment = config.getGoodLabel();
  altKeys = config.getHasAltKeys();
  compose = config.getHasCompose();

  unsigned g;
  
  for(g=0; g<4; g++) {
    /**
       new main symbols
    */
    keySyms[g] = initSyms;

    /**
       load symbols from symbols(k==0) and codes(k==1)
    */
    unsigned count = keySyms[g].kcodes + 1;
    unsigned i;
    for(unsigned k=0; k<2; k++) {
      QList<QStrList> &symmap = k==0?config.getKeysyms(g):config.getKeycodes(g);

      for(i=0; i<symmap.count(); i++) {
        QStrList list = *(symmap.at(i));
        /**
	   entry with less then 2 symbols are bad
        */
        if(list.count() < 2) continue;
        /**
	   change symbols
        */
        int index = k==0?initSyms.findSym(list.at(0))
	  :initSyms.findCode(list.at(0));
        if(index == -1)  continue;
        
        unsigned j;for(j=list.count()<=count?list.count():count; j-->1;)
          keySyms[g].change(index, list.at(j), j-1);
      }
    }

    /**
       create capslocked symbols
    */
    QStrList &capssyms = config.getCapssyms(g);
    capsKeySyms[g] = keySyms[g];
    if(capssyms.count() > 0) {
      /**
	  special capsed symbols
      */
      for(i=0; i<capssyms.count(); i++) {
	KeySym test = KeyTranslate::stringToSym(capssyms.at(i));
	if(test == NoSymbol) continue;
	/**
	   look for capsed symbol
	*/
	unsigned j;for(j=0; j<(initSyms.maxKeyCode-initSyms.minKeyCode-1)*
		         initSyms.kcodes; j+=initSyms.kcodes) {
	  if(KeyTranslate::tolower(initSyms.syms[j]) 
	     == KeyTranslate::tolower(test)) {
	    capsKeySyms[g].syms[j]   = keySyms[g].syms[j+1];
	    capsKeySyms[g].syms[j+1] = keySyms[g].syms[j];
	  }
	  if(capsKeySyms[g].kcodes >=4) {
	    if(KeyTranslate::tolower(keySyms[g].syms[j+2]) 
	       == KeyTranslate::tolower(test)) {
	      capsKeySyms[g].syms[j+2] = keySyms[g].syms[j+3];
	      capsKeySyms[g].syms[j+3] = keySyms[g].syms[j+2];
	    }
	  }
	}
      }
    } else {
      /**
	  default capsed symbols
      */
      for(i=0; i<(initSyms.maxKeyCode-initSyms.minKeyCode-1)*
	    initSyms.kcodes; i+=initSyms.kcodes) {
	if(KeyTranslate::tolower(initSyms.syms[i]) >= 'a' 
	   && KeyTranslate::tolower(initSyms.syms[i]) <= 'z') {
	  capsKeySyms[g].syms[i]   = keySyms[g].syms[i+1];
	  capsKeySyms[g].syms[i+1] = keySyms[g].syms[i];
	}
	if(capsKeySyms[g].kcodes >=4) {
	  if(KeyTranslate::tolower(keySyms[g].syms[i+2]) >= 'a' 
	     && KeyTranslate::tolower(initSyms.syms[i+2]) <= 'z') {
	    capsKeySyms[g].syms[i+2] = keySyms[g].syms[i+3];
	    capsKeySyms[g].syms[i+3] = keySyms[g].syms[i+2];
	  }
	}
      }
    }
  }
}
/**
   change symbol by symbol in both normal and caps map
   return true if Ok
*/

kikbd'KeyMap::changeKeySym() (./kdebase/kikbd/keymap.cpp:142)

bool KeyMap::changeKeySym(const char* from, const char* to, int index, unsigned g)
{
  int i = keySyms[g].findSym(from);
  if(i == -1) return FALSE;
  keySyms[g].change(i, to, index);
  capsKeySyms[g].change(i, to, index);
  return TRUE;
}

/**
   change X window keyboard mapping to this one
*/

kikbd'KeyMap::toggle() (./kdebase/kikbd/keymap.cpp:154)

void KeyMap::toggle(unsigned g)
{
  if(isToggleCaps && !capsKeySyms[g].isNull()) capsKeySyms[g].write();
  else keySyms[g].write();
}
/**
   activate capslocked keys
*/

kikbd'KeyMap::toggleCaps() (./kdebase/kikbd/keymap.cpp:162)

void KeyMap::toggleCaps(bool on, unsigned g)
{
  if(isToggleCaps == on) return;
  isToggleCaps = on;
  if(isToggleCaps) {
    if(!capsKeySyms[g].isNull()) capsKeySyms[g].write();
  } else {
    keySyms[g].write();
  }
}

//=========================================================
//  KeySyms members
//=========================================================