keyHandling.cc 17.5 KB
Newer Older
Dirk Wilden's avatar
Dirk Wilden committed
1
2
3
4
5
#include "CoreWidget.hh"

#include <OpenFlipper/BasePlugin/KeyInterface.hh>
#include <OpenFlipper/BasePlugin/BaseInterface.hh>

6
7
#include <OpenFlipper/common/GlobalOptions.hh>

Jan Möbius's avatar
   
Jan Möbius committed
8
9
#include <OpenFlipper/BasePlugin/PluginFunctions.hh>

Dirk Wilden's avatar
Dirk Wilden committed
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//-----------------------------------------------------------------------------

KeyBinding CoreWidget::getKeyBinding(QObject* _plugin, int _keyIndex ){
  if (_plugin == 0)
    return coreKeys_[_keyIndex];

  for (uint i=0; i < plugins_.size(); i++){
    if (plugins_[i].plugin == _plugin)
      return plugins_[i].keys[_keyIndex];
  }

  std::cerr << "ERROR: could not get KeyBinding\n";
  return KeyBinding();
}

Dirk Wilden's avatar
Dirk Wilden committed
25
26
27
28
29
30
31
32
33
34
35
36
37
QString CoreWidget::getRPCName(QObject* _plugin ){
  if (_plugin == 0)
    return "";

  for (uint i=0; i < plugins_.size(); i++){
    if (plugins_[i].plugin == _plugin)
      return plugins_[i].rpcName;
  }

  std::cerr << "ERROR: could not get rpcName\n";
  return "";
}

Dirk Wilden's avatar
Dirk Wilden committed
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/// passes keyPressEvents to either the Core or a Plugin depending on who has registered the key
void CoreWidget::keyPressEvent(QKeyEvent* _e)
{
  std::pair< int,Qt::KeyboardModifiers > key = std::make_pair(_e->key(), _e->modifiers() );

  //iterate over all assigned keys
  KeyRange range = keys_.equal_range(key);

  KeyMap::iterator it;
  for (it=range.first; it != range.second; ++it){

    QObject* plugin = (*it).second.first;
    KeyBinding binding = getKeyBinding( plugin, (*it).second.second );

    //check if its a core Key
    if (plugin == 0){
Dirk Wilden's avatar
Dirk Wilden committed
54
55
56
57
58
59
60
61
62

      //the key belongs to a slot
      if (binding.slot){
        bool ok;
        emit call("core." + binding.description, ok);
        return;
      }

      //the key was specified through keyInterface
Dirk Wilden's avatar
Dirk Wilden committed
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
      QKeyEvent* mappedEvent = new QKeyEvent(_e->type(),binding.key, binding.modifiers,
                                             _e->text(), _e->isAutoRepeat(), _e->count() );

      coreKeyPressEvent(mappedEvent);

      delete mappedEvent;

      //if the key is multiUse also check other assigned keys
      if (binding.multiUse)
        continue;
      else
        return;
    }

    //it's a plugin key
Dirk Wilden's avatar
Dirk Wilden committed
78
79
80
81
82
83
84
85
86

    //the key belongs to a slot
    if (binding.slot){
      bool ok;
      emit call(getRPCName(plugin) +"."+ binding.description, ok);
      return;
    }

    //the key was specified through keyInterface
Dirk Wilden's avatar
Dirk Wilden committed
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
    KeyInterface* keyPlugin = qobject_cast< KeyInterface * >(plugin);

    if (keyPlugin){
      QKeyEvent* mappedEvent = new QKeyEvent(_e->type(),binding.key, binding.modifiers,
                                             _e->text(), _e->isAutoRepeat(), _e->count() );
      keyPlugin->slotKeyEvent(mappedEvent);
    }

    //if its not a multiUse key we are ready
    if (!binding.multiUse)
      return;
  }
}

//-----------------------------------------------------------------------------

/// passes keyReleaseEvents to either the Core or a Plugin depending on who has registered the key
void CoreWidget::keyReleaseEvent(QKeyEvent* _e) {

  if (_e->isAutoRepeat()) return; //consider only "real" release events


  std::pair< int,Qt::KeyboardModifiers > key = std::make_pair(_e->key(), _e->modifiers() );

  //iterate over all assigned keys
  KeyRange range = keys_.equal_range(key);

  KeyMap::iterator it;
  for (it=range.first; it != range.second; ++it){

    QObject* plugin = (*it).second.first;
    KeyBinding binding = getKeyBinding( plugin, (*it).second.second );

    //check if its a core Key
    if (plugin == 0){
      QKeyEvent* mappedEvent = new QKeyEvent(_e->type(),binding.key, binding.modifiers,
                                             _e->text(), _e->isAutoRepeat(), _e->count() );
      coreKeyReleaseEvent(mappedEvent);

      delete mappedEvent;

      //if the key is multiUse also check other assigned keys
      if (binding.multiUse)
        continue;
      else
        return;
    }

    //it's a plugin key
    KeyInterface* keyPlugin = qobject_cast< KeyInterface * >(plugin);

    if (keyPlugin){
      QKeyEvent* mappedEvent = new QKeyEvent(_e->type(),binding.key, binding.modifiers,
                                             _e->text(), _e->isAutoRepeat(), _e->count() );
141
      keyPlugin->slotKeyReleaseEvent(mappedEvent);
Dirk Wilden's avatar
Dirk Wilden committed
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
    }

    //if its not a multiUse key we are ready
    if (!binding.multiUse)
      return;
  }
}

//-----------------------------------------------------------------------------

/// Register a key to the core or a plugin
void CoreWidget::slotRegisterKey(int _key, Qt::KeyboardModifiers _modifiers, QString _description, bool _multiUse){

  //first check if the key is already registered by the coreWidget
  bool found = false;
  bool multi = false;
158
  QString name;
Dirk Wilden's avatar
Dirk Wilden committed
159
160
161
162
  for (uint i=0; i < coreKeys_.size(); i++)
    if (coreKeys_[i].key == _key && coreKeys_[i].modifiers == _modifiers){
      found = true;
      multi = coreKeys_[i].multiUse;
163
      name = "Core";
Dirk Wilden's avatar
Dirk Wilden committed
164
165
166
167
168
169
170
171
172
173
174
      break;
    }

  //then check if the key is already registered by a different plugin
  if (!found)
    for (uint i=0; i < plugins_.size(); i++)
      for (int k=0; k < plugins_[i].keys.count(); k++)
        if (plugins_[i].keys[k].key == _key
        && plugins_[i].keys[k].modifiers == _modifiers){
          found = true;
          multi = plugins_[i].keys[k].multiUse;
175
          name = plugins_[i].name;
Dirk Wilden's avatar
Dirk Wilden committed
176
177
178
          break;
        }

179
180
  if (found && !multi)
    emit log(LOGERR, "Key already registered by '" + name + "'");
Dirk Wilden's avatar
Dirk Wilden committed
181
182
183
184
185
186
187
188

  //check if its a key for the core
  if (sender() == this){
    KeyBinding kb;
    kb.key = _key;
    kb.modifiers = _modifiers;
    kb.description = _description;
    kb.multiUse = multi || _multiUse;
Dirk Wilden's avatar
Dirk Wilden committed
189
    kb.slot = false;
Dirk Wilden's avatar
Dirk Wilden committed
190
191

    if (multi && !_multiUse)
192
      emit log(LOGERR, "Key already registered by '" + name + "'. Forced registration as multiUse key.");
Dirk Wilden's avatar
Dirk Wilden committed
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217

    coreKeys_.push_back( kb );

    keys_.insert( std::make_pair( std::make_pair(_key, _modifiers) , std::make_pair ((QObject*)0, coreKeys_.size()-1 ) )) ;
    invKeys_.insert( std::make_pair( std::make_pair ((QObject*)0, coreKeys_.size()-1 ) , std::make_pair(_key, _modifiers) ) );
    return;
  }

  //find plugin
 PluginInfo* pluginInfo = 0;

  for (uint i=0; i < plugins_.size(); i++)
    if (plugins_[i].plugin == sender())
      pluginInfo = &plugins_[i];

  if (pluginInfo == 0){
    emit log(LOGERR, "Unable to register key. Plugin not found!");
    return;
  }

  KeyBinding kb;
  kb.key = _key;
  kb.modifiers = _modifiers;
  kb.description = _description;
  kb.multiUse = multi || _multiUse;
Dirk Wilden's avatar
Dirk Wilden committed
218
  kb.slot = false;
Dirk Wilden's avatar
Dirk Wilden committed
219
220

  if (multi && !_multiUse)
221
    emit log(LOGERR, "Key already registered by '" + name + "'. Forced registration as multiUse key.");
Dirk Wilden's avatar
Dirk Wilden committed
222
223
224
225
226
227
228

  pluginInfo->keys.append( kb );

  keys_.insert( std::make_pair( std::make_pair(_key, _modifiers) , std::make_pair(pluginInfo->plugin, pluginInfo->keys.size()-1) ) );
  invKeys_.insert( std::make_pair( std::make_pair(pluginInfo->plugin, pluginInfo->keys.size()-1) , std::make_pair(_key, _modifiers) ) );
}

Dirk Wilden's avatar
Dirk Wilden committed
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
///scripting slots will automatically registered to be assigned  to an invalid key(-1)
void CoreWidget::slotRegisterSlotKeyBindings(){

  //check the core slots
  for (int i=0; i < coreSlots_.count(); i++){

    //only consider functions without arguments
    if ( !coreSlots_.at(i).slotName.contains( "()" ) )
      continue;

    KeyBinding kb;
    kb.key = -1;
    kb.modifiers = 0;
    kb.description = coreSlots_.at(i).slotName;
    kb.multiUse = true;
    kb.slot = true;

    coreKeys_.push_back( kb );

    keys_.insert( std::make_pair( std::make_pair(-1, 0) , std::make_pair ((QObject*)0, coreKeys_.size()-1 ) )) ;
    invKeys_.insert( std::make_pair( std::make_pair ((QObject*)0, coreKeys_.size()-1 ) , std::make_pair(-1, 0) ) );
  }

  //check all plugins
  for (uint i=0; i < plugins_.size(); i++)

    for (int j=0; j < plugins_[i].rpcFunctions.count(); j++){

      //only consider functions without arguments
      if ( !plugins_[i].rpcFunctions[j].contains( "()" )
         || plugins_[i].rpcFunctions[j] == "version()")
        continue;

      KeyBinding kb;
      kb.key = -1;
      kb.modifiers = 0;
      kb.description = plugins_[i].rpcFunctions[j];
      kb.multiUse = true;
      kb.slot = true;
Jan Möbius's avatar
   
Jan Möbius committed
268

Dirk Wilden's avatar
Dirk Wilden committed
269
      plugins_[i].keys.append( kb );
Jan Möbius's avatar
   
Jan Möbius committed
270

Dirk Wilden's avatar
Dirk Wilden committed
271
272
273
274
275
      keys_.insert( std::make_pair( std::make_pair(-1, 0) , std::make_pair(plugins_[i].plugin, plugins_[i].keys.size()-1) ) );
      invKeys_.insert( std::make_pair( std::make_pair(plugins_[i].plugin, plugins_[i].keys.size()-1) , std::make_pair(-1, 0) ) );
    }
}

Dirk Wilden's avatar
Dirk Wilden committed
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
/// add a new keyMapping (keyBindingID is the id of the keyBinding in the pluginInfo of _plugin :)
void CoreWidget::slotAddKeyMapping(int _key, Qt::KeyboardModifiers _modifiers, QObject* _plugin, int _keyBindingID){

  std::pair< int,Qt::KeyboardModifiers > keyCombi = std::make_pair(_key, _modifiers );
  std::pair< int,Qt::KeyboardModifiers > oldCombi;
  std::pair< QObject*, int > oldTarget;

  bool replace = false;

  //and check if the key is already assigned without multiUse
  KeyMap::iterator it;
  for (it=keys_.begin(); it != keys_.end(); ++it){

    int key = (*it).first.first;
    Qt::KeyboardModifiers modifiers = (*it).first.second;
    QObject* plugin = (*it).second.first;
    int bindingID = (*it).second.second;
    KeyBinding binding = getKeyBinding(plugin, bindingID);

    //check if its the keyBinding we want to map/replace
    if (plugin == _plugin && bindingID == _keyBindingID){
      replace = true;
      oldCombi = (*it).first;
      oldTarget = (*it).second;
      continue;
    }

    //check if the mapping is conflicting with other mappings
    if (_key == key && _modifiers == modifiers ){

      if (!binding.multiUse){
        if (plugin == 0)
          emit log(LOGERR, "Could not add key mapping. Key already assigned to the core.");
        else{
          BaseInterface* basePlugin = qobject_cast< BaseInterface * >(plugin);
311

Dirk Wilden's avatar
Dirk Wilden committed
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
          if (basePlugin)
            emit log(LOGERR, "Could not add key mapping. Key already assigned to " + basePlugin->name() );
          else
            emit log(LOGERR, "Could not add key mapping. Key already assigned to an unknown plugin.");
        }
        return;
      }
    }
  }

  KeyBinding keyBinding = getKeyBinding(_plugin, _keyBindingID);

  //check if new binding doesn't allow multiUse but other assignments for the key exist
  if (!keyBinding.multiUse)
    if ( (replace && keys_.count(keyCombi) > 1)  || (!replace && keys_.count(keyCombi) > 0) ){
      emit log(LOGERR, "Could not add (single usage) key mapping. Key already assigned.");
      return;
    }

  if (replace){
    keys_.erase(oldCombi);
    invKeys_.erase(oldTarget);
  }

336
337
338
339
  //now we can add the mapping
  keys_.insert   ( std::make_pair( keyCombi , std::make_pair(_plugin, _keyBindingID) ));
  invKeys_.insert( std::make_pair( std::make_pair(_plugin, _keyBindingID),  keyCombi ));

Dirk Wilden's avatar
Dirk Wilden committed
340
341
}

342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
///Load key assignments from a given INI file
void CoreWidget::loadKeyBindings(INIFile& _ini){

  QVector< int > keys;
  QVector< int > modifiers;
  QStringList pluginNames;
  QVector< int > bindingIDs;

  //first load everything from INI file
  if ( !_ini.section_exists("KeyBindings") )
     return;

  int keyCount;
  if (_ini.get_entry(keyCount,"KeyBindings","KeyCount") ){

    int key;
    int mod;
    QString name;
    int binding;

    for (int i=0; i < keyCount; i++){

      if (!_ini.get_entry(key,     "KeyBindings","Key" + QString::number(i) ) ) continue;
      if (!_ini.get_entry(mod,     "KeyBindings","KeyModifiers" + QString::number(i) ) )  continue;
      if (!_ini.get_entry(name,    "KeyBindings","KeyTarget" + QString::number(i) ) )  continue;
      if (!_ini.get_entry(binding, "KeyBindings","KeyBinding" + QString::number(i) ) ) continue;

      keys.push_back( key );
      modifiers.push_back( mod );
      pluginNames.push_back( name );
      bindingIDs.push_back( binding );
    }
  }

  //add the keyMapping
  for (int i=0; i < keys.count(); i++){

    //first we need the plugin
    QObject* plugin = 0;

    if (pluginNames[i] != "Core" ){
      //search for the plugin
      for (uint i=0; i < plugins_.size(); i++)
        if (plugins_[i].rpcName == pluginNames[i] ){
          plugin = plugins_[i].plugin;
          break;
        }

      if (plugin == 0)
        continue; //because plugin was not found
    }

    slotAddKeyMapping( keys[i], (Qt::KeyboardModifiers) modifiers[i], plugin, bindingIDs[i] );
  }

}

///Store current key assignments to a given INI file
void CoreWidget::saveKeyBindings(INIFile& _ini){

  QVector< int > keys;
  QVector< int > modifiers;
  QStringList pluginNames;
  QVector< int > bindingIDs;

  //first get all keys with custom assignments
  KeyMap::iterator it;
  for (it=keys_.begin(); it != keys_.end(); ++it){

    int key = (*it).first.first;
    Qt::KeyboardModifiers mod = (*it).first.second;
    QObject* plugin = (*it).second.first;
    int bindingID = (*it).second.second;
    KeyBinding binding = getKeyBinding(plugin, bindingID);

    //check if current key assignment and original assignment differ
    if (key != binding.key || mod != binding.modifiers){

      //get the pluginName
      QString name;

      if (plugin == 0)
        name = "Core";
      else
        name = getRPCName(plugin);

      //store key assignment
      keys.push_back( key );
      modifiers.push_back( mod );
      pluginNames.push_back( name );
      bindingIDs.push_back( bindingID );
    }
  }

  //finally store everything to INI file
  if ( !_ini.section_exists("KeyBindings") )
    _ini.add_section("KeyBindings");

  _ini.add_entry("KeyBindings","KeyCount", keys.count());

  for (int i=0; i < keys.count(); i++){

    _ini.add_entry("KeyBindings","Key" + QString::number(i)         , keys[i] );
    _ini.add_entry("KeyBindings","KeyModifiers" + QString::number(i), modifiers[i] );
    _ini.add_entry("KeyBindings","KeyTarget" + QString::number(i)   , pluginNames[i] );
    _ini.add_entry("KeyBindings","KeyBinding" + QString::number(i)  , bindingIDs[i] );
  }
}

451
/// if a keyPressEvent belongs to the core this functions is called
Jan Möbius's avatar
Jan Möbius committed
452
void CoreWidget::registerCoreKeys() {
453
454

  //register keys for coreWidget
Jan Möbius's avatar
Jan Möbius committed
455
456
  connect(this , SIGNAL( registerKey(int, Qt::KeyboardModifiers, QString, bool) ),
          this , SLOT(slotRegisterKey(int, Qt::KeyboardModifiers, QString, bool)) );
457

Jan Möbius's avatar
Jan Möbius committed
458
  emit registerKey(Qt::Key_Print  , Qt::NoModifier, "Create Snapshot");
459
460
  emit registerKey(Qt::Key_S      , Qt::ControlModifier, "Save Object");
  emit registerKey(Qt::Key_O      , Qt::ControlModifier, "Open Object");
Jan Möbius's avatar
Jan Möbius committed
461
462
463
  emit registerKey(Qt::Key_L      , Qt::ControlModifier, "Show/Hide Logger");
  emit registerKey(Qt::Key_T      , Qt::ControlModifier, "Show/Hide Toolbox");
  emit registerKey(Qt::Key_F      , Qt::ControlModifier, "Toggle Fullscreen");
464
  emit registerKey(Qt::Key_Escape , Qt::NoModifier, "Switch to last action mode ( Move,Picking,Light or Info Mode)");
465
  emit registerKey(Qt::Key_Space  , Qt::NoModifier, "Toggle between multiview and single view");
466

467
468
469
470
471
472
473
  if ( OpenFlipper::Options::isLinux() ) {
    emit registerKey(Qt::Key_Meta , Qt::MetaModifier, "Use Navigation mode while key is pressed");
    emit registerKey(Qt::Key_Meta , Qt::NoModifier, "Use Navigation mode while key is pressed");
  } else {
    emit registerKey(Qt::Key_Alt , Qt::AltModifier, "Use Navigation mode while key is pressed");
  }

Dirk Wilden's avatar
Dirk Wilden committed
474
475
  emit registerKey(Qt::Key_Shift  , Qt::ShiftModifier, "Apply context menu action to all Viewers", true);
  emit registerKey(Qt::Key_Shift  , Qt::NoModifier, "Apply context menu action to all Viewers", true);
476
477
}

Dirk Wilden's avatar
Dirk Wilden committed
478
479
480
/// if a keyPressEvent belongs to the core this functions is called
void CoreWidget::coreKeyPressEvent  (QKeyEvent* _e){

481
482
483
484
485
486
487
488
489
490
491
492
493
  if ( ( _e->key() == Qt::Key_Meta ) && OpenFlipper::Options::isLinux() ) {
    if ( _e->type() == QEvent::KeyPress ) {
      setActionMode( Viewer::ExamineMode );
    }
  }

  if ( ( _e->key() == Qt::Key_Alt ) && ! OpenFlipper::Options::isLinux() ) {
    if ( _e->type() == QEvent::KeyPress ) {
      setActionMode( Viewer::ExamineMode );
    }
  }


Jan Möbius's avatar
Jan Möbius committed
494
  if (_e->modifiers() & Qt::ControlModifier ) {
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
495
496
497
498
    switch (_e->key()) {
      case Qt::Key_F :
          toggleFullscreen();
        return;
Dirk Wilden's avatar
Dirk Wilden committed
499

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
500
501
502
      case Qt::Key_L :
          toggleLogger();
        return;
Dirk Wilden's avatar
Dirk Wilden committed
503

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
504
505
506
      case Qt::Key_T :
          toggleToolbox();
        return;
Dirk Wilden's avatar
Dirk Wilden committed
507

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
508
509
      case Qt::Key_O :
        loadMenu();
Dirk Wilden's avatar
Dirk Wilden committed
510

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
511
512
      case Qt::Key_S :
        saveMenu();
Dirk Wilden's avatar
Dirk Wilden committed
513

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
514
515
516
      default:
        return;
    }
517

Dirk Wilden's avatar
Dirk Wilden committed
518
519
  }

Jan Möbius's avatar
Jan Möbius committed
520
521
  switch (_e->key()) {
    case Qt::Key_Escape:
522
        setActionMode( lastActionMode() );
Jan Möbius's avatar
Jan Möbius committed
523
      break;
Dirk Wilden's avatar
Dirk Wilden committed
524

Jan Möbius's avatar
Jan Möbius committed
525
526
527
528
    case Qt::Key_Print:
      std::cerr << "Todo : On Print Screen, create a snapshot for all viewers" << std::endl;
      break;

529
530
    case Qt::Key_Space:
      if ( OpenFlipper::Options::multiView() ) {
Jan Möbius's avatar
Jan Möbius committed
531
        emit log( "Switch MultiView mode");
Dirk Wilden's avatar
Dirk Wilden committed
532
533
534
535
536
537
538
539
540
541
542
543
544
545

        switch (baseLayout_->mode())
        {
          case QtMultiViewLayout::SingleView:
            baseLayout_->setMode (QtMultiViewLayout::Grid);
            break;
          case QtMultiViewLayout::Grid:
            baseLayout_->setMode (QtMultiViewLayout::HSplit);
            break;
          case QtMultiViewLayout::HSplit:
            baseLayout_->setMode (QtMultiViewLayout::SingleView);
            PluginFunctions::setActiveExaminer (0);
            break;
        }
546
      }
Dirk Wilden's avatar
Dirk Wilden committed
547
      break;
548

Dirk Wilden's avatar
Dirk Wilden committed
549
550
    case Qt::Key_Shift :
      shiftPressed_ = true;
551
552
      break;

Jan Möbius's avatar
Jan Möbius committed
553
    default:
Dirk Wilden's avatar
Dirk Wilden committed
554
      shiftPressed_ = false;
Jan Möbius's avatar
Jan Möbius committed
555
      return;
Dirk Wilden's avatar
Dirk Wilden committed
556
557
558
559
  }
}

/// if a keyReleaseEvent belongs to the core this functions is called
Dirk Wilden's avatar
Dirk Wilden committed
560
void CoreWidget::coreKeyReleaseEvent(QKeyEvent* _e){
Dirk Wilden's avatar
Dirk Wilden committed
561

562
563
564
565
566
567
568
569
570
571
572
573
574
575

  if ( ( _e->key() == Qt::Key_Meta ) && OpenFlipper::Options::isLinux() ) {
    if ( _e->type() == QEvent::KeyRelease ) {
      setActionMode( lastActionMode() );
    }
  }

  if ( ( _e->key() == Qt::Key_Alt ) && ! OpenFlipper::Options::isLinux() ) {
    if ( _e->type() == QEvent::KeyRelease ) {
      setActionMode( lastActionMode() );
    }
  }


Dirk Wilden's avatar
Dirk Wilden committed
576
577
578
579
580
581
582
  switch (_e->key()) {
    case Qt::Key_Shift :
      shiftPressed_ = false;
      break;
    default:
      return;
  }
Dirk Wilden's avatar
Dirk Wilden committed
583
}