diff options
Diffstat (limited to 'hacks/xlockmore.c')
-rw-r--r-- | hacks/xlockmore.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/hacks/xlockmore.c b/hacks/xlockmore.c index addfd4c..5ddf175 100644 --- a/hacks/xlockmore.c +++ b/hacks/xlockmore.c @@ -263,6 +263,13 @@ xlockmore_release_screens (ModeInfo *mi) } +static Bool +xlockmore_got_init (ModeInfo *mi) +{ + return mi->xlmft->got_init & (1ul << mi->screen_number); +} + + static void xlockmore_free_screens (ModeInfo *mi) { @@ -279,7 +286,8 @@ xlockmore_free_screens (ModeInfo *mi) int old_screen = mi->screen_number; for (mi->screen_number = 0; mi->screen_number < XLOCKMORE_NUM_SCREENS; ++mi->screen_number) { - xlmft->hack_free (mi); + if (xlockmore_got_init(mi)) + xlmft->hack_free (mi); /* got_init is reset in xlockmore_release_screens. */ } mi->screen_number = old_screen; } @@ -401,7 +409,7 @@ xlockmore_init (Display *dpy, Window window, const int size = XLOCKMORE_NUM_SCREENS; int i; for (i = 0; i < size; i++) { - if (! (xlmft->live_displays & (1 << i))) + if (! (xlmft->live_displays & (1ul << i))) break; } if (i >= size) abort(); @@ -571,16 +579,11 @@ xlockmore_clear (ModeInfo *mi) static void xlockmore_do_init (ModeInfo *mi) { - mi->xlmft->got_init |= 1 << mi->screen_number; xlockmore_clear (mi); mi->xlmft->hack_init (mi); -} - -static Bool -xlockmore_got_init (ModeInfo *mi) -{ - return mi->xlmft->got_init & (1 << mi->screen_number); + /* Do this last, so MI_INIT gets the old got_init. */ + mi->xlmft->got_init |= 1ul << mi->screen_number; } @@ -682,10 +685,13 @@ xlockmore_event (Display *dpy, Window window, void *closure, XEvent *event) if (screenhack_event_helper (mi->dpy, mi->window, event)) { /* If a clear is in progress, don't interrupt or restart it. */ - if (mi->needs_clear) + if (mi->needs_clear) { + if (mi->xlmft->hack_free) + mi->xlmft->hack_free (mi); mi->xlmft->got_init &= ~(1ul << mi->screen_number); - else + } else { mi->xlmft->hack_init (mi); + } return True; } } @@ -714,8 +720,10 @@ xlockmore_free (Display *dpy, Window window, void *closure) xlockmore_free returns. Thus, hack_free has to happen now, rather than after the final screen has been released. */ - if (mi->xlmft->hack_free) + if (mi->xlmft->hack_free && xlockmore_got_init(mi)) { mi->xlmft->hack_free (mi); + mi->xlmft->got_init &= ~(1ul << mi->screen_number); + } /* Find us in live_displays and clear that slot. */ assert (mi->xlmft->live_displays & (1ul << mi->screen_number)); @@ -761,8 +769,8 @@ xlockmore_mi_init (ModeInfo *mi, size_t state_size, void **state_array) /* Find the appropriate state object, clear it, and we're done. */ { - if (xlmft->hack_free) - xlmft->hack_free (mi); + if (xlmft->hack_free && xlockmore_got_init(mi)) + xlmft->hack_free (mi); /* Don't reset the got_init bit from MI_INIT. */ memset ((char *)(*xlmft->state_array) + mi->screen_number * state_size, 0, state_size); } |