Browse Source

Added keyboard press detection

naelstrof 11 years ago
parent
commit
752001c7bd
3 changed files with 54 additions and 0 deletions
  1. 16
    0
      main.cpp
  2. 35
    0
      x.cpp
  3. 3
    0
      x.hpp

+ 16
- 0
main.cpp View File

28
     if ( err ) {
28
     if ( err ) {
29
         return err;
29
         return err;
30
     }
30
     }
31
+    err = xengine->grabKeyboard();
32
+    if ( err ) {
33
+        return err;
34
+    }
31
     while ( running ) {
35
     while ( running ) {
32
         // "ticking" the xengine makes it process all queued events.
36
         // "ticking" the xengine makes it process all queued events.
33
         xengine->tick();
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
         if ( xengine->mouseDown( 3 ) ) {
48
         if ( xengine->mouseDown( 3 ) ) {
35
             printf( "X=0\n" );
49
             printf( "X=0\n" );
36
             printf( "Y=0\n" );
50
             printf( "Y=0\n" );
147
         // bad computer.
161
         // bad computer.
148
         usleep( 1000 );
162
         usleep( 1000 );
149
     }
163
     }
164
+    xengine->releaseCursor();
165
+    xengine->releaseKeyboard();
150
     // Clean up global classes.
166
     // Clean up global classes.
151
     delete xengine;
167
     delete xengine;
152
     delete options;
168
     delete options;

+ 35
- 0
x.cpp View File

3
 slrn::XEngine* xengine = new slrn::XEngine();
3
 slrn::XEngine* xengine = new slrn::XEngine();
4
 
4
 
5
 slrn::XEngine::XEngine() {
5
 slrn::XEngine::XEngine() {
6
+    m_keypressed = false;
6
     m_display = NULL;
7
     m_display = NULL;
7
     m_visual = NULL;
8
     m_visual = NULL;
8
     m_screen = NULL;
9
     m_screen = NULL;
65
     return 0;
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
 int slrn::XEngine::grabCursor( slrn::CursorType type ) {
91
 int slrn::XEngine::grabCursor( slrn::CursorType type ) {
69
     if ( !m_good ) {
92
     if ( !m_good ) {
70
         return 1;
93
         return 1;
75
                             GrabModeAsync, GrabModeAsync, m_root, xfontcursor, CurrentTime );
98
                             GrabModeAsync, GrabModeAsync, m_root, xfontcursor, CurrentTime );
76
     if ( err != GrabSuccess ) {
99
     if ( err != GrabSuccess ) {
77
         fprintf( stderr, "Error: Failed to grab X cursor.\n" );
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
         return 1;
103
         return 1;
79
     }
104
     }
80
 
105
 
130
                 }
155
                 }
131
                 break;
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
             default: break;
168
             default: break;
134
         }
169
         }
135
     }
170
     }

+ 3
- 0
x.hpp View File

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