-
Notifications
You must be signed in to change notification settings - Fork 0
/
xzoe.c
128 lines (99 loc) · 2.54 KB
/
xzoe.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <unistd.h>
#include <pthread.h>
#include <X11/Xlib.h>
#include <X11/extensions/XTest.h>
#include <X11/extensions/Xdamage.h>
#include "xzoe.h"
#include "pru.h"
Display* xzoe_display;
Screen* xzoe_screen;
Window xzoe_root_window;
static int xzoe_xtest_event_base;
static int xzoe_xtest_error_base;
static int xzoe_xtest_major_version;
static int xzoe_xtest_minor_version;
static int xzoe_xdamage_event_base;
static int xzoe_xdamage_error_base;
static void* xzoe_xevent_thread_start( void* arg );
int main( void )
{
pthread_t xevent_thread;
pthread_t kb_thread;
if( pru_init( ) )
{
fprintf( stderr, "pru_init failed\n" );
return -1;
}
if( !XInitThreads( ) )
{
fprintf( stderr, "XInitThreads failed\n" );
}
xzoe_display = XOpenDisplay( NULL );
if( xzoe_display == NULL )
{
fprintf( stderr, "XOpenDisplay failed\n" );
return -1;
}
xzoe_screen = XDefaultScreenOfDisplay( xzoe_display );
if( xzoe_screen == NULL )
{
fprintf( stderr, "XDefaultScreenOfDisplay failed\n" );
return -1;
}
xzoe_root_window = XDefaultRootWindow( xzoe_display );
if( !XTestQueryExtension( xzoe_display, &xzoe_xtest_event_base, &xzoe_xtest_error_base, &xzoe_xtest_major_version, &xzoe_xtest_minor_version ) )
{
fprintf( stderr, "XTestQueryExtension failed\n" );
}
if( !XDamageQueryExtension( xzoe_display, &xzoe_xdamage_event_base, &xzoe_xdamage_error_base ) )
{
fprintf( stderr, "XDamageQueryExtension failed\n" );
return -1;
}
XDamageCreate( xzoe_display, xzoe_root_window, XDamageReportRawRectangles );
if( pthread_create( &kb_thread, NULL, xzoe_kb_thread_start, NULL ) )
{
fprintf( stderr, "pthread_create failed\n" );
return -1;
}
if( pthread_create( &xevent_thread, NULL, xzoe_xevent_thread_start, NULL ) )
{
fprintf( stderr, "pthread_create failed\n" );
return -1;
}
pthread_exit( NULL );
return 0;
}
static void* xzoe_xevent_thread_start( void* arg )
{
bool damaged;
XEvent event;
do
{
damaged = false;
XLockDisplay( xzoe_display );
while( XPending( xzoe_display ) > 0 )
{
XNextEvent( xzoe_display, &event );
if( event.type == xzoe_xdamage_event_base + XDamageNotify )
{
damaged = true;
}
}
if( damaged )
{
if( xzoe_update_pru_lcd( ) )
{
fprintf( stderr, "xzoe_update_pru_lcd failed\n" );
return NULL;
}
}
XUnlockDisplay( xzoe_display );
usleep( 20000 );
}
while( true );
return NULL;
}