[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    PATCH: kshortcutdialog
From:       Ellis Whitehead <kde () ellisw ! net>
Date:       2002-01-30 17:57:07
[Download RAW message or body]

This is a patch for the shortcut dialog to release the keyboard when the focus 
is moved to another program.  That much works now, but when you press a key 
which has a conflicting shortcut, a dialog pops up telling you this, but it 
doesn't receive any keyboard input.  I don't why yet, since releaseKeyboard() 
is called.

Ciao,
Ellis
["kdeui.diff" (text/x-diff)]

Index: kshortcutdialog.cpp
===================================================================
RCS file: /home/kde/kdelibs/kdeui/kshortcutdialog.cpp,v
retrieving revision 1.4
diff -u -3 -d -p -b -B -r1.4 kshortcutdialog.cpp
--- kshortcutdialog.cpp	2002/01/28 00:46:57	1.4
+++ kshortcutdialog.cpp	2002/01/30 17:48:13
@@ -53,6 +53,7 @@ KShortcutDialog::KShortcutDialog( const
 :	KDialog( parent, name ),
 	m_cut( cut )
 {
+	m_bGrabKeyboardOnFocusIn = true;
 	m_bKeyboardGrabbed = false;
 	m_iSeq = 0;
 	m_iKey = 0;
@@ -65,8 +66,10 @@ KShortcutDialog::KShortcutDialog( const

 KShortcutDialog::~KShortcutDialog()
 {
+	if( m_bKeyboardGrabbed ) {
+		kdWarning(125) << "KShortcutDialog::~KShortcutDialog(): m_bKeyboardGrabbed still true." << endl;
 	releaseKeyboard();
-	//releaseMouse();
+	}
 }

 void KShortcutDialog::initGUI()
@@ -148,36 +151,11 @@ void KShortcutDialog::clearSeq( uint i )
 	m_peditSeq[i]->setSeq( KKeySequence::null() );
 	m_cut.setSeq( i, KKeySequence::null() );
 	selectSeq( i );
-}
-
-void KShortcutDialog::focusInEvent( QFocusEvent* )
-{
-	kdDebug(125) << "KShortcutDialog::focusInEvent()" << endl;
-	setFocus();
-	grabKeyboard();
-	//grabMouse();
-}

-void KShortcutDialog::focusOutEvent( QFocusEvent* )
-{
-	kdDebug(125) << "KShortcutDialog::focusOutEvent()" << endl;
-	releaseKeyboard();
-	//releaseMouse();
-}
-
-void KShortcutDialog::paintEvent( QPaintEvent* pEvent )
-{
-	kdDebug(125) << "KShortcutDialog::paintEvent( QPaintEvent* )" << endl;
-	kdDebug(125) << "m_bKeyboardGrabbed = " << m_bKeyboardGrabbed << endl;
-	kdDebug(125) << "hasFocus() = " << hasFocus() << endl;
-	if( !m_bKeyboardGrabbed ) {
-	kdDebug(125) << "KShortcutDialog::2paintEvent( QPaintEvent* )" << endl;
-		m_bKeyboardGrabbed = true;
-		setFocus();
-		grabKeyboard();
-		//grabMouse();
-	}
-	KDialog::paintEvent( pEvent );
+	// If we're clearing the alternate, then we need to set m_cut.count()
+	//  back to 1 if there is a primary sequence.
+	if( i == 1 && m_cut.count() > 0 )
+		m_cut = m_cut.seq(0);
 }
 
 void KShortcutDialog::slotSeq0Selected() { selectSeq( 0 ); }
@@ -185,6 +163,13 @@ void KShortcutDialog::slotSeq1Selected()
 void KShortcutDialog::slotClearSeq0()    { clearSeq( 0 ); }
 void KShortcutDialog::slotClearSeq1()    { clearSeq( 1 ); }
 
+void KShortcutDialog::accept()
+{
+	kdDebug(125) << "KShortcutDialog::accept()" << endl;
+	m_bGrabKeyboardOnFocusIn = false;
+	KDialog::accept();
+}
+
 #ifdef Q_WS_X11
 bool KShortcutDialog::x11Event( XEvent *pEvent )
 {
@@ -195,6 +180,26 @@ bool KShortcutDialog::x11Event( XEvent *
 			return true;
 		case ButtonPress:
 			m_iKey = 0;
+			break;
+		case XFocusIn:
+			kdDebug(125) << "FocusIn" << endl;
+			if( m_bGrabKeyboardOnFocusIn ) {
+				kdDebug(125) << "\tkeyboard grabbed." << endl;
+				m_bKeyboardGrabbed = true;
+				grabKeyboard();
+			}
+			break;
+		case XFocusOut:
+			kdDebug(125) << "FocusOut" << endl;
+			if( m_bKeyboardGrabbed ) {
+				kdDebug(125) << "\tkeyboard released." << endl;
+				m_bKeyboardGrabbed = false;
+				releaseKeyboard();
+			}
+			break;
+		default:
+			//kdDebug(125) << "x11Event->type = " << pEvent->type << endl;
+			break;
 	}
 	return QWidget::x11Event( pEvent );
 }
@@ -214,8 +219,9 @@ void KShortcutDialog::x11EventKeyPress( 
 		case XK_Shift_L:   case XK_Shift_R:   keyModX = KKeyNative::modX(KKey::SHIFT); break;
 		case XK_Control_L: case XK_Control_R: keyModX = KKeyNative::modX(KKey::CTRL); break;
 		case XK_Alt_L:     case XK_Alt_R:     keyModX = KKeyNative::modX(KKey::ALT); break;
-		case XK_Meta_L:    case XK_Meta_R:    keyModX = KKeyNative::modX(KKey::WIN); break;
-		case XK_Super_L:   case XK_Super_R:
+		// FIXME: check whether the Meta or Super key are for the Win modifier
+		case XK_Meta_L:    case XK_Meta_R:
+		case XK_Super_L:   case XK_Super_R:   keyModX = KKeyNative::modX(KKey::WIN); break;
 		case XK_Hyper_L:   case XK_Hyper_R:
 		case XK_Mode_switch:
 			break;
@@ -224,8 +230,6 @@ void KShortcutDialog::x11EventKeyPress( 
 				// If RETURN was pressed and we are recording a
 				//  multi-key shortcut, then we are done.
 				if( keyNative.sym() == XK_Return && m_iKey > 0 ) {
-					// HACK: releaseKeyboard should be called from accept()
-					releaseKeyboard();
 					accept();
 					return;
 				}
@@ -249,11 +253,9 @@ void KShortcutDialog::x11EventKeyPress( 
 				//  key, and if so, call setShortcut(uint) with the new value.
 				//emit capturedShortcut( KShortcut(KKey(keyNative)) );
 				kdDebug(125) << "m_cut = " << m_cut.toString() << endl;
-				if( m_pcbAutoClose->isEnabled() && m_pcbAutoClose->isChecked() ) {
-					releaseKeyboard();
+				if( m_pcbAutoClose->isEnabled() && m_pcbAutoClose->isChecked() )
 					accept();
 				}
-			}
 			return;
 	}
 
@@ -266,11 +268,10 @@ void KShortcutDialog::x11EventKeyPress( 
 			keyModX = pEvent->xkey.state & ~keyModX;
 
 		QString keyModStr;
-		// FIXME: use KKey::modFlagLabel(KKey::xxx)
-		if( keyModX & KKeyNative::modX(KKey::WIN) )	keyModStr += i18n("Win") + "+";
-		if( keyModX & KKeyNative::modX(KKey::ALT) )	keyModStr += i18n("Alt") + "+";
-		if( keyModX & KKeyNative::modX(KKey::CTRL) )	keyModStr += i18n("Ctrl") + "+";
-		if( keyModX & KKeyNative::modX(KKey::SHIFT) )	keyModStr += i18n("Shift") + "+";
+		if( keyModX & KKeyNative::modX(KKey::WIN) )	keyModStr += KKey::modFlagLabel(KKey::WIN) + "+";
+		if( keyModX & KKeyNative::modX(KKey::ALT) )	keyModStr += KKey::modFlagLabel(KKey::ALT) + "+";
+		if( keyModX & KKeyNative::modX(KKey::CTRL) )	keyModStr += KKey::modFlagLabel(KKey::CTRL) + "+";
+		if( keyModX & KKeyNative::modX(KKey::SHIFT) )	keyModStr += KKey::modFlagLabel(KKey::SHIFT) + "+";
 
 		// Display currently selected modifiers, or redisplay old key.
 		if( !keyModStr.isEmpty() )
Index: kshortcutdialog.h
===================================================================
RCS file: /home/kde/kdelibs/kdeui/kshortcutdialog.h,v
retrieving revision 1.3
diff -u -3 -d -p -b -B -r1.3 kshortcutdialog.h
--- kshortcutdialog.h	2002/01/19 03:35:49	1.3
+++ kshortcutdialog.h	2002/01/30 17:48:13
@@ -31,6 +31,7 @@ class KShortcutDialog : public KDialog
 	const KShortcut& cut() const { return m_cut; }
 
  protected:
+	bool          m_bGrabKeyboardOnFocusIn;
 	bool          m_bKeyboardGrabbed;
 	KShortcut     m_cut;
 	QRadioButton* m_prbSeq[2];
@@ -45,15 +46,13 @@ class KShortcutDialog : public KDialog
 	void selectSeq( uint );
 	void clearSeq( uint );
 
-	virtual void focusInEvent( QFocusEvent* );
-	virtual void focusOutEvent( QFocusEvent* );
-	virtual void paintEvent( QPaintEvent* );
-
  protected slots:
 	void slotSeq0Selected();
 	void slotSeq1Selected();
 	void slotClearSeq0();
 	void slotClearSeq1();
+
+	virtual void accept();	// override parent's accept()
 
  private:
 	void initGUI();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic