@@ -33,8 +33,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33
33
Part of the code comes from the scrot.c file and maintains its authorship.
34
34
*/
35
35
36
- #include <sys/select.h>
37
-
38
36
#include <assert.h>
39
37
#include <err.h>
40
38
#include <errno.h>
@@ -239,20 +237,14 @@ void scrotSelectionSetDefaultColorLine(void)
239
237
240
238
bool scrotSelectionGetUserSel (struct SelectionRect * selectionRect )
241
239
{
242
- static int xfd = 0 ;
243
- static int fdSize = 0 ;
244
240
XEvent ev ;
245
- fd_set fdSet ;
246
- int count = 0 , done = 0 ;
241
+ enum { WAIT , DONE , ABORT } done = WAIT ;
247
242
int rx = 0 , ry = 0 , rw = 0 , rh = 0 , isButtonPressed = 0 ;
248
243
Window target = None ;
249
244
Status ret ;
250
245
251
246
scrotSelectionCreate ();
252
247
253
- xfd = ConnectionNumber (disp );
254
- fdSize = xfd + 1 ;
255
-
256
248
ret = XGrabKeyboard (disp , root , False , GrabModeAsync , GrabModeAsync , CurrentTime );
257
249
if (ret == AlreadyGrabbed ) {
258
250
int attempts = 20 ;
@@ -267,89 +259,74 @@ bool scrotSelectionGetUserSel(struct SelectionRect *selectionRect)
267
259
errx (EXIT_FAILURE , "failed to grab keyboard" );
268
260
}
269
261
270
- while (1 ) {
271
- /* Handle events here */
272
- while (!done && XPending (disp )) {
273
- XNextEvent (disp , & ev );
274
- switch (ev .type ) {
275
- case MotionNotify :
276
- if (isButtonPressed )
277
- scrotSelectionMotionDraw (rx , ry , ev .xbutton .x , ev .xbutton .y );
278
- break ;
279
- case ButtonPress :
280
- isButtonPressed = 1 ;
281
- rx = ev .xbutton .x ;
282
- ry = ev .xbutton .y ;
283
- target = scrotGetWindow (disp , ev .xbutton .subwindow , ev .xbutton .x , ev .xbutton .y );
284
- if (target == None )
285
- target = root ;
286
- break ;
287
- case ButtonRelease :
288
- done = 1 ;
262
+ while (done == WAIT ) {
263
+ XNextEvent (disp , & ev );
264
+ switch (ev .type ) {
265
+ case MotionNotify :
266
+ if (isButtonPressed )
267
+ scrotSelectionMotionDraw (rx , ry , ev .xbutton .x , ev .xbutton .y );
268
+ break ;
269
+ case ButtonPress :
270
+ isButtonPressed = 1 ;
271
+ rx = ev .xbutton .x ;
272
+ ry = ev .xbutton .y ;
273
+ target = scrotGetWindow (disp , ev .xbutton .subwindow , ev .xbutton .x , ev .xbutton .y );
274
+ if (target == None )
275
+ target = root ;
276
+ break ;
277
+ case ButtonRelease :
278
+ done = DONE ;
279
+ break ;
280
+ case KeyPress :
281
+ {
282
+ KeySym * keysym = NULL ;
283
+ int keycode ; /*dummy*/
284
+
285
+ keysym = XGetKeyboardMapping (disp , ev .xkey .keycode , 1 , & keycode );
286
+
287
+ if (!keysym )
289
288
break ;
290
- case KeyPress :
291
- {
292
- KeySym * keysym = NULL ;
293
- int keycode ; /*dummy*/
294
-
295
- keysym = XGetKeyboardMapping (disp , ev .xkey .keycode , 1 , & keycode );
296
-
297
- if (!keysym )
298
- break ;
299
-
300
- if (!isButtonPressed ) {
301
- key_abort_shot :
302
- if (!opt .ignoreKeyboard || * keysym == XK_Escape ) {
303
- warnx ("Key was pressed, aborting shot" );
304
- done = 2 ;
305
- }
306
- XFree (keysym );
307
- break ;
308
- }
309
289
310
- switch (* keysym ) {
311
- case XK_Right :
312
- if (++ rx > scr -> width )
313
- rx = scr -> width ;
314
- break ;
315
- case XK_Left :
316
- if (-- rx < 0 )
317
- rx = 0 ;
318
- break ;
319
- case XK_Down :
320
- if (++ ry > scr -> height )
321
- ry = scr -> height ;
322
- break ;
323
- case XK_Up :
324
- if (-- ry < 0 )
325
- ry = 0 ;
326
- break ;
327
- default :
328
- goto key_abort_shot ;
290
+ if (!isButtonPressed ) {
291
+ key_abort_shot :
292
+ if (!opt .ignoreKeyboard || * keysym == XK_Escape ) {
293
+ warnx ("Key was pressed, aborting shot" );
294
+ done = ABORT ;
329
295
}
330
296
XFree (keysym );
331
- scrotSelectionMotionDraw (rx , ry , ev .xbutton .x , ev .xbutton .y );
332
297
break ;
333
298
}
334
- case KeyRelease :
335
- /* ignore */
299
+
300
+ switch (* keysym ) {
301
+ case XK_Right :
302
+ if (++ rx > scr -> width )
303
+ rx = scr -> width ;
336
304
break ;
337
- default :
305
+ case XK_Left :
306
+ if (-- rx < 0 )
307
+ rx = 0 ;
308
+ break ;
309
+ case XK_Down :
310
+ if (++ ry > scr -> height )
311
+ ry = scr -> height ;
338
312
break ;
313
+ case XK_Up :
314
+ if (-- ry < 0 )
315
+ ry = 0 ;
316
+ break ;
317
+ default :
318
+ goto key_abort_shot ;
339
319
}
320
+ XFree (keysym );
321
+ scrotSelectionMotionDraw (rx , ry , ev .xbutton .x , ev .xbutton .y );
322
+ break ;
340
323
}
341
- if (done )
324
+ case DestroyNotify :
325
+ errx (EXIT_FAILURE , "received DestroyNotify event" );
326
+ break ;
327
+ default :
328
+ /* ignore */
342
329
break ;
343
-
344
- /* now block some */
345
- FD_ZERO (& fdSet );
346
- FD_SET (xfd , & fdSet );
347
- errno = 0 ;
348
- count = select (fdSize , & fdSet , NULL , NULL , NULL );
349
- if ((count < 0 )
350
- && ((errno == ENOMEM ) || (errno == EINVAL ) || (errno == EBADF ))) {
351
- scrotSelectionDestroy ();
352
- errx (EXIT_FAILURE , "Connection to X display lost" );
353
330
}
354
331
}
355
332
scrotSelectionDraw ();
@@ -360,7 +337,7 @@ bool scrotSelectionGetUserSel(struct SelectionRect *selectionRect)
360
337
361
338
scrotSelectionDestroy ();
362
339
363
- if (done == 2 )
340
+ if (done == ABORT )
364
341
return false;
365
342
366
343
if (isAreaSelect ) {
0 commit comments