Skip to content

Commit 75664ef

Browse files
authored
Merge pull request #267 from N-R-K/selection_cleanup
scrotSelectionGetUserSel() cleanup
2 parents a961b88 + aa7e463 commit 75664ef

File tree

2 files changed

+60
-83
lines changed

2 files changed

+60
-83
lines changed

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ AC_SUBST([CPPFLAGS], ["$X11_CFLAGS $XCOMPOSITE_CFLAGS $XEXT_CFLAGS \
6969
AC_CHECK_HEADERS([stdint.h sys/time.h unistd.h])
7070

7171
# Required: Checks for library functions.
72-
AC_CHECK_FUNCS([getopt_long getsubopt gethostname select strdup strerror strndup strtol],,
72+
AC_CHECK_FUNCS([getopt_long getsubopt gethostname strdup strerror strndup strtol],,
7373
AC_MSG_ERROR([required functions are not present.]))
7474

7575
AC_CONFIG_FILES([Makefile src/Makefile])

src/scrot_selection.c

Lines changed: 59 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3333
Part of the code comes from the scrot.c file and maintains its authorship.
3434
*/
3535

36-
#include <sys/select.h>
37-
3836
#include <assert.h>
3937
#include <err.h>
4038
#include <errno.h>
@@ -239,20 +237,14 @@ void scrotSelectionSetDefaultColorLine(void)
239237

240238
bool scrotSelectionGetUserSel(struct SelectionRect *selectionRect)
241239
{
242-
static int xfd = 0;
243-
static int fdSize = 0;
244240
XEvent ev;
245-
fd_set fdSet;
246-
int count = 0, done = 0;
241+
enum { WAIT, DONE, ABORT } done = WAIT;
247242
int rx = 0, ry = 0, rw = 0, rh = 0, isButtonPressed = 0;
248243
Window target = None;
249244
Status ret;
250245

251246
scrotSelectionCreate();
252247

253-
xfd = ConnectionNumber(disp);
254-
fdSize = xfd + 1;
255-
256248
ret = XGrabKeyboard(disp, root, False, GrabModeAsync, GrabModeAsync, CurrentTime);
257249
if (ret == AlreadyGrabbed) {
258250
int attempts = 20;
@@ -267,89 +259,74 @@ bool scrotSelectionGetUserSel(struct SelectionRect *selectionRect)
267259
errx(EXIT_FAILURE, "failed to grab keyboard");
268260
}
269261

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)
289288
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-
}
309289

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;
329295
}
330296
XFree(keysym);
331-
scrotSelectionMotionDraw(rx, ry, ev.xbutton.x, ev.xbutton.y);
332297
break;
333298
}
334-
case KeyRelease:
335-
/* ignore */
299+
300+
switch (*keysym) {
301+
case XK_Right:
302+
if (++rx > scr->width)
303+
rx = scr->width;
336304
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;
338312
break;
313+
case XK_Up:
314+
if (--ry < 0)
315+
ry = 0;
316+
break;
317+
default:
318+
goto key_abort_shot;
339319
}
320+
XFree(keysym);
321+
scrotSelectionMotionDraw(rx, ry, ev.xbutton.x, ev.xbutton.y);
322+
break;
340323
}
341-
if (done)
324+
case DestroyNotify:
325+
errx(EXIT_FAILURE, "received DestroyNotify event");
326+
break;
327+
default:
328+
/* ignore */
342329
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");
353330
}
354331
}
355332
scrotSelectionDraw();
@@ -360,7 +337,7 @@ bool scrotSelectionGetUserSel(struct SelectionRect *selectionRect)
360337

361338
scrotSelectionDestroy();
362339

363-
if (done == 2)
340+
if (done == ABORT)
364341
return false;
365342

366343
if (isAreaSelect) {

0 commit comments

Comments
 (0)