|
@@ -1,15 +1,101 @@
|
1
|
1
|
#include <unistd.h>
|
|
2
|
+#include <cstdio>
|
2
|
3
|
#include "x.hpp"
|
3
|
4
|
|
|
5
|
+int borderSize = 10;
|
|
6
|
+int padding = 0;
|
|
7
|
+std::string xserver = ":0";
|
|
8
|
+
|
|
9
|
+void printHelp() {
|
|
10
|
+ printf( "Usage: slrn [options]\n" );
|
|
11
|
+ printf( "Print user selected region to stdout.\n" );
|
|
12
|
+ printf( "\n" );
|
|
13
|
+ printf( "options\n" );
|
|
14
|
+ printf( " -h, --help show this message.\n" );
|
|
15
|
+ printf( " -b=INT, --bordersize=INT set selection rectangle border size.\n" );
|
|
16
|
+ printf( " -p=INT, --padding=INT set padding size for selection.\n" );
|
|
17
|
+ printf( " -x=STRING, --xdisplay=STRING set x display (STRING must be hostname:number.screen_number format)\n" );
|
|
18
|
+ printf( "examples\n" );
|
|
19
|
+ printf( " slrn -b=10 -x=:0 -p=-30\n" );
|
|
20
|
+}
|
|
21
|
+
|
|
22
|
+int parseOptions( int argc, char** argv ) {
|
|
23
|
+ for ( int i=0; i<argc; i++ ) {
|
|
24
|
+ std::string arg = argv[i];
|
|
25
|
+ if ( arg.substr( 0, 3 ) == "-b=" || arg.substr( 0, 13 ) == "--bordersize=" ) {
|
|
26
|
+ int find = arg.find( "=" );
|
|
27
|
+ if ( find != arg.npos ) {
|
|
28
|
+ arg.at( find ) = ' ';
|
|
29
|
+ }
|
|
30
|
+ int num = sscanf( arg.c_str(), "%*s %i", &borderSize );
|
|
31
|
+ if ( num != 1 ) {
|
|
32
|
+ printf( "Error parsing command arguments near %s\n", argv[i] );
|
|
33
|
+ printf( "Usage: -b=INT or --bordersize=INT\n" );
|
|
34
|
+ printf( "Example: -b=10 or --bordersize=12\n" );
|
|
35
|
+ return 1;
|
|
36
|
+ }
|
|
37
|
+ } else if ( arg.substr( 0, 3 ) == "-p=" || arg.substr( 0, 10 ) == "--padding=" ) {
|
|
38
|
+ int find = arg.find( "=" );
|
|
39
|
+ if ( find != arg.npos ) {
|
|
40
|
+ arg.at( find ) = ' ';
|
|
41
|
+ }
|
|
42
|
+ int num = sscanf( arg.c_str(), "%*s %i", &padding );
|
|
43
|
+ if ( num != 1 ) {
|
|
44
|
+ printf( "Error parsing command arguments near %s\n", argv[i] );
|
|
45
|
+ printf( "Usage: -p=INT or --padding=INT\n" );
|
|
46
|
+ printf( "Example: -p=0 or --padding=-12\n" );
|
|
47
|
+ return 1;
|
|
48
|
+ }
|
|
49
|
+ } else if ( arg.substr( 0, 3 ) == "-x=" || arg.substr( 0, 11 ) == "--xdisplay=" ) {
|
|
50
|
+ int find = arg.find( "=" );
|
|
51
|
+ if ( find != arg.npos ) {
|
|
52
|
+ arg.at( find ) = ' ';
|
|
53
|
+ }
|
|
54
|
+ char* x = new char[ arg.size() ];
|
|
55
|
+ int num = sscanf( arg.c_str(), "%*s %s", x );
|
|
56
|
+ if ( num != 1 ) {
|
|
57
|
+ printf( "Error parsing command arguments near %s\n", argv[i] );
|
|
58
|
+ printf( "Usage: -x=STRING or --xserver=STRING.\n" );
|
|
59
|
+ printf( "Example: -x=:0 or --xserver=winston:1.3\n" );
|
|
60
|
+ delete[] x;
|
|
61
|
+ return 1;
|
|
62
|
+ }
|
|
63
|
+ xserver = x;
|
|
64
|
+ delete[] x;
|
|
65
|
+ } else if ( arg == "-h" || arg == "--help" ) {
|
|
66
|
+ printHelp();
|
|
67
|
+ return 2;
|
|
68
|
+ } else {
|
|
69
|
+ if ( i == 0 ) {
|
|
70
|
+ continue;
|
|
71
|
+ }
|
|
72
|
+ printf( "Error: Unknown argument %s\n", argv[i] );
|
|
73
|
+ printf( "Try -h or --help for help.\n" );
|
|
74
|
+ return 1;
|
|
75
|
+ }
|
|
76
|
+ }
|
|
77
|
+ return 0;
|
|
78
|
+}
|
|
79
|
+
|
4
|
80
|
int main( int argc, char** argv ) {
|
|
81
|
+ int err = parseOptions( argc, argv );
|
|
82
|
+ if ( err ) {
|
|
83
|
+ return err;
|
|
84
|
+ }
|
5
|
85
|
int state = 0;
|
6
|
86
|
bool running = true;
|
7
|
87
|
is::Rectangle* selection;
|
8
|
88
|
is::Rectangle* windowselection = NULL;
|
9
|
89
|
Window window = None;
|
10
|
90
|
|
11
|
|
- xengine->init( ":0" );
|
12
|
|
- xengine->grabCursor( is::Cross );
|
|
91
|
+ err = xengine->init( xserver.c_str() );
|
|
92
|
+ if ( err ) {
|
|
93
|
+ return err;
|
|
94
|
+ }
|
|
95
|
+ err = xengine->grabCursor( is::Cross );
|
|
96
|
+ if ( err ) {
|
|
97
|
+ return err;
|
|
98
|
+ }
|
13
|
99
|
while ( running ) {
|
14
|
100
|
xengine->tick();
|
15
|
101
|
if ( xengine->mouseDown( 3 ) ) {
|
|
@@ -31,11 +117,11 @@ int main( int argc, char** argv ) {
|
31
|
117
|
xengine->removeRect( windowselection );
|
32
|
118
|
}
|
33
|
119
|
is::WindowRectangle t = xengine->m_hoverWindow;
|
34
|
|
- windowselection = new is::Rectangle( t.m_x,
|
35
|
|
- t.m_y,
|
36
|
|
- t.m_width,
|
37
|
|
- t.m_height,
|
38
|
|
- 10, 0 );
|
|
120
|
+ windowselection = new is::Rectangle( t.m_x - padding - t.m_border,
|
|
121
|
+ t.m_y - padding - t.m_border,
|
|
122
|
+ t.m_width + padding*2 + t.m_border,
|
|
123
|
+ t.m_height + padding*2 + t.m_border,
|
|
124
|
+ borderSize, 0 );
|
39
|
125
|
xengine->addRect( windowselection );
|
40
|
126
|
window = xengine->m_hoverXWindow;
|
41
|
127
|
}
|
|
@@ -48,8 +134,8 @@ int main( int argc, char** argv ) {
|
48
|
134
|
break;
|
49
|
135
|
}
|
50
|
136
|
case 1: {
|
51
|
|
- selection = new is::Rectangle( xengine->m_mousex, xengine->m_mousey, 0, 0, 10, 0 );
|
52
|
|
- selection->setPos( xengine->m_mousex, xengine->m_mousey );
|
|
137
|
+ selection = new is::Rectangle( xengine->m_mousex - padding, xengine->m_mousey - padding, padding, padding, borderSize, 0 );
|
|
138
|
+ selection->setPos( xengine->m_mousex - padding, xengine->m_mousey - padding );
|
53
|
139
|
xengine->addRect( selection );
|
54
|
140
|
state++;
|
55
|
141
|
break;
|
|
@@ -59,7 +145,7 @@ int main( int argc, char** argv ) {
|
59
|
145
|
state++;
|
60
|
146
|
break;
|
61
|
147
|
}
|
62
|
|
- selection->setDim( xengine->m_mousex - selection->m_x, xengine->m_mousey - selection->m_y );
|
|
148
|
+ selection->setDim( xengine->m_mousex - selection->m_x + padding, xengine->m_mousey - selection->m_y + padding );
|
63
|
149
|
// x and y offsets can indicate if the selection is inside-out, which lets us know which kind of cursor we need.
|
64
|
150
|
int x = selection->m_xoffset;
|
65
|
151
|
int y = selection->m_yoffset;
|
|
@@ -90,10 +176,10 @@ int main( int argc, char** argv ) {
|
90
|
176
|
break;
|
91
|
177
|
}
|
92
|
178
|
is::WindowRectangle t = xengine->m_hoverWindow;
|
93
|
|
- x = t.m_x;
|
94
|
|
- y = t.m_y;
|
95
|
|
- w = t.m_width + t.m_border;
|
96
|
|
- h = t.m_height + t.m_border;
|
|
179
|
+ x = t.m_x - padding - t.m_border;
|
|
180
|
+ y = t.m_y - padding - t.m_border;
|
|
181
|
+ w = t.m_width + t.m_border + padding*2;
|
|
182
|
+ h = t.m_height + t.m_border + padding*2;
|
97
|
183
|
printf( "X: %i\n", x );
|
98
|
184
|
printf( "Y: %i\n", y );
|
99
|
185
|
printf( "W: %i\n", w );
|