소스 검색

Added keyboard press detection

naelstrof 11 년 전
부모
커밋
752001c7bd
3개의 변경된 파일54개의 추가작업 그리고 0개의 파일을 삭제
  1. 16
    0
      main.cpp
  2. 35
    0
      x.cpp
  3. 3
    0
      x.hpp

+ 16
- 0
main.cpp 파일 보기

@@ -28,9 +28,23 @@ int main( int argc, char** argv ) {
28 28
     if ( err ) {
29 29
         return err;
30 30
     }
31
+    err = xengine->grabKeyboard();
32
+    if ( err ) {
33
+        return err;
34
+    }
31 35
     while ( running ) {
32 36
         // "ticking" the xengine makes it process all queued events.
33 37
         xengine->tick();
38
+        // If the user presses any key on the keyboard, exit the application.
39
+        if ( xengine->m_keypressed ) {
40
+            printf( "X=0\n" );
41
+            printf( "Y=0\n" );
42
+            printf( "W=0\n" );
43
+            printf( "H=0\n" );
44
+            fprintf( stderr, "User pressed key. Canceled selection.\n" );
45
+            state = -1;
46
+            running = false;
47
+        }
34 48
         if ( xengine->mouseDown( 3 ) ) {
35 49
             printf( "X=0\n" );
36 50
             printf( "Y=0\n" );
@@ -147,6 +161,8 @@ int main( int argc, char** argv ) {
147 161
         // bad computer.
148 162
         usleep( 1000 );
149 163
     }
164
+    xengine->releaseCursor();
165
+    xengine->releaseKeyboard();
150 166
     // Clean up global classes.
151 167
     delete xengine;
152 168
     delete options;

+ 35
- 0
x.cpp 파일 보기

@@ -3,6 +3,7 @@
3 3
 slrn::XEngine* xengine = new slrn::XEngine();
4 4
 
5 5
 slrn::XEngine::XEngine() {
6
+    m_keypressed = false;
6 7
     m_display = NULL;
7 8
     m_visual = NULL;
8 9
     m_screen = NULL;
@@ -65,6 +66,28 @@ int slrn::XEngine::init( std::string display ) {
65 66
     return 0;
66 67
 }
67 68
 
69
+int slrn::XEngine::grabKeyboard() {
70
+    if ( !m_good ) {
71
+        return 1;
72
+    }
73
+    int err = XGrabKeyboard( m_display, m_root, False,
74
+                             GrabModeAsync, GrabModeAsync, CurrentTime );
75
+    if ( err != GrabSuccess ) {
76
+        fprintf( stderr, "Error: Failed to grab X keyboard.\n" );
77
+        fprintf( stderr, "This can be caused by launching slrn incorrectly.\n" );
78
+        fprintf( stderr, "gnome-session launches it fine from keyboard binds.\n" );
79
+        return 1;
80
+    }
81
+}
82
+
83
+int slrn::XEngine::releaseKeyboard() {
84
+    if ( !m_good ) {
85
+        return 1;
86
+    }
87
+    XUngrabKeyboard( m_display, CurrentTime );
88
+    return 0;
89
+}
90
+
68 91
 int slrn::XEngine::grabCursor( slrn::CursorType type ) {
69 92
     if ( !m_good ) {
70 93
         return 1;
@@ -75,6 +98,8 @@ int slrn::XEngine::grabCursor( slrn::CursorType type ) {
75 98
                             GrabModeAsync, GrabModeAsync, m_root, xfontcursor, CurrentTime );
76 99
     if ( err != GrabSuccess ) {
77 100
         fprintf( stderr, "Error: Failed to grab X cursor.\n" );
101
+        fprintf( stderr, "This can be caused by launching slrn incorrectly.\n" );
102
+        fprintf( stderr, "gnome-session launches it fine from keyboard binds.\n" );
78 103
         return 1;
79 104
     }
80 105
 
@@ -130,6 +155,16 @@ void slrn::XEngine::tick() {
130 155
                 }
131 156
                 break;
132 157
             }
158
+            // For this particular utility, we only care if a key is pressed.
159
+            // I'm too lazy to implement a keyhandler for that.
160
+            case KeyPress: {
161
+                m_keypressed = true;
162
+                break;
163
+            }
164
+            case KeyRelease: {
165
+                //m_keypressed = false;
166
+                break;
167
+            }
133 168
             default: break;
134 169
         }
135 170
     }

+ 3
- 0
x.hpp 파일 보기

@@ -65,7 +65,9 @@ public:
65 65
     int                 init( std::string display );
66 66
     void                tick();
67 67
     int                 grabCursor( slrn::CursorType type );
68
+    int                 grabKeyboard();
68 69
     int                 releaseCursor();
70
+    int                 releaseKeyboard();
69 71
     void                setCursor( slrn::CursorType type );
70 72
     void                drawRect( int x, int y, unsigned int w, unsigned int h );
71 73
     void                addRect( Rectangle* rect );
@@ -81,6 +83,7 @@ public:
81 83
     bool                mouseDown( unsigned int button );
82 84
     WindowRectangle     m_hoverWindow;
83 85
     Window              m_hoverXWindow;
86
+    bool                m_keypressed;
84 87
 private:
85 88
     void                updateHoverWindow();
86 89
     void                updateHoverWindow( Window child );