aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/calcurse.h18
-rw-r--r--src/calendar.c32
-rw-r--r--src/notify.c12
-rw-r--r--src/wins.c42
4 files changed, 72 insertions, 32 deletions
diff --git a/src/calcurse.h b/src/calcurse.h
index 7a7f4f2..d7b5093 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -456,6 +456,22 @@ enum win {
#define FLAG_STA (1 << STA)
#define FLAG_ALL ((1 << NBWINS) - 1)
+#define WINS_NBAR_LOCK \
+ pthread_cleanup_push(wins_nbar_cleanup, NULL); \
+ wins_nbar_lock();
+
+#define WINS_NBAR_UNLOCK \
+ wins_nbar_unlock(); \
+ pthread_cleanup_pop(0);
+
+#define WINS_CALENDAR_LOCK \
+ pthread_cleanup_push(wins_calendar_cleanup, NULL); \
+ wins_calendar_lock();
+
+#define WINS_CALENDAR_UNLOCK \
+ wins_calendar_unlock(); \
+ pthread_cleanup_pop(0);
+
enum ui_mode {
UI_CURSES,
UI_CMDLINE,
@@ -977,8 +993,10 @@ void vars_init(void);
extern struct window win[NBWINS];
unsigned wins_nbar_lock(void);
void wins_nbar_unlock(void);
+void wins_nbar_cleanup(void *);
unsigned wins_calendar_lock(void);
void wins_calendar_unlock(void);
+void wins_calendar_cleanup(void *);
int wins_refresh(void);
int wins_wrefresh(WINDOW *);
int wins_doupdate(void);
diff --git a/src/calendar.c b/src/calendar.c
index 42ee449..df247df 100644
--- a/src/calendar.c
+++ b/src/calendar.c
@@ -297,7 +297,7 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
c_day_1 = (int)((ymd_to_scalar(yr, mo, 1 + sunday_first) - (long)1) % 7L);
/* Write the current month and year on top of the calendar */
- wins_calendar_lock();
+ WINS_CALENDAR_LOCK;
custom_apply_attr(cwin->p, ATTR_HIGHEST);
mvwprintw(cwin->p, ofs_y,
(SBAR_WIDTH - (strlen(_(monthnames[mo - 1])) + 5)) / 2,
@@ -311,7 +311,7 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
mvwaddstr(cwin->p, ofs_y, ofs_x + 4 * j, _(daynames[1 + j - sunday_first]));
}
custom_remove_attr(cwin->p, ATTR_HIGHEST);
- wins_calendar_unlock();
+ WINS_CALENDAR_UNLOCK;
day_1_sav = (c_day_1 + 1) * 3 + c_day_1 - 7;
@@ -329,7 +329,7 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
ofs_x = OFFX - day_1_sav - 4 * c_day;
}
- wins_calendar_lock();
+ WINS_CALENDAR_LOCK;
if (c_day == current_day->dd
&& current_day->mm == slctd_day.mm
&& current_day->yyyy == slctd_day.yyyy
@@ -355,7 +355,7 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
mvwprintw(cwin->p, ofs_y + 1,
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day);
}
- wins_calendar_unlock();
+ WINS_CALENDAR_UNLOCK;
}
}
@@ -459,11 +459,11 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
/* Print the week number. */
weeknum = ISO8601weeknum(&t);
- wins_calendar_lock();
+ WINS_CALENDAR_LOCK;
custom_apply_attr(cwin->p, ATTR_HIGHEST);
mvwprintw(cwin->p, 2, cwin->w - 9, "(# %02d)", weeknum);
custom_remove_attr(cwin->p, ATTR_HIGHEST);
- wins_calendar_unlock();
+ WINS_CALENDAR_UNLOCK;
/* Now draw calendar view. */
for (j = 0; j < WEEKINDAYS; j++) {
@@ -495,28 +495,28 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
else
attr = 0;
- wins_calendar_lock();
+ WINS_CALENDAR_LOCK;
if (attr)
custom_apply_attr(cwin->p, attr);
mvwprintw(cwin->p, OFFY + 1, OFFX + 1 + 4 * j, "%02d", t.tm_mday);
if (attr)
custom_remove_attr(cwin->p, attr);
- wins_calendar_unlock();
+ WINS_CALENDAR_UNLOCK;
/* Draw slices indicating appointment times. */
memset(slices, 0, DAYSLICESNO * sizeof *slices);
if (day_chk_busy_slices(date, DAYSLICESNO, slices)) {
for (i = 0; i < DAYSLICESNO; i++) {
if (j != WEEKINDAYS - 1 && i != DAYSLICESNO - 1) {
- wins_calendar_lock();
+ WINS_CALENDAR_LOCK;
mvwhline(cwin->p, OFFY + 2 + i, OFFX + 3 + 4 * j, ACS_S9, 2);
- wins_calendar_unlock();
+ WINS_CALENDAR_UNLOCK;
}
if (slices[i]) {
int highlight;
highlight = (t.tm_mday == slctd_day.dd) ? 1 : 0;
- wins_calendar_lock();
+ WINS_CALENDAR_LOCK;
if (highlight)
custom_apply_attr(cwin->p, attr);
wattron(cwin->p, A_REVERSE);
@@ -525,7 +525,7 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
wattroff(cwin->p, A_REVERSE);
if (highlight)
custom_remove_attr(cwin->p, attr);
- wins_calendar_unlock();
+ WINS_CALENDAR_UNLOCK;
}
}
}
@@ -535,13 +535,13 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
}
/* Draw marks to indicate midday on the sides of the calendar. */
- wins_calendar_lock();
+ WINS_CALENDAR_LOCK;
custom_apply_attr(cwin->p, ATTR_HIGHEST);
mvwhline(cwin->p, OFFY + 1 + DAYSLICESNO / 2, OFFX, ACS_S9, 1);
mvwhline(cwin->p, OFFY + 1 + DAYSLICESNO / 2,
OFFX + WCALWIDTH - 3, ACS_S9, 1);
custom_remove_attr(cwin->p, ATTR_HIGHEST);
- wins_calendar_unlock();
+ WINS_CALENDAR_UNLOCK;
#undef DAYSLICESNO
}
@@ -554,10 +554,10 @@ void calendar_update_panel(struct window *cwin)
calendar_store_current_date(&current_day);
- wins_calendar_lock();
+ WINS_CALENDAR_LOCK;
erase_window_part(cwin->p, 1, 3, cwin->w - 2, cwin->h - 2);
mvwhline(cwin->p, 2, 1, ACS_HLINE, cwin->w - 2);
- wins_calendar_unlock();
+ WINS_CALENDAR_UNLOCK;
sunday_first = calendar_week_begins_on_monday()? 0 : 1;
diff --git a/src/notify.c b/src/notify.c
index 6ac94b9..ebc9728 100644
--- a/src/notify.c
+++ b/src/notify.c
@@ -240,13 +240,13 @@ void notify_update_bar(void)
app_pos = file_pos + strlen(notify.apts_file) + 2 + space;
txt_max_len = col - (app_pos + 12 + space);
- wins_nbar_lock();
+ WINS_NBAR_LOCK;
custom_apply_attr(notify.win, ATTR_HIGHEST);
wattron(notify.win, A_UNDERLINE | A_REVERSE);
mvwhline(notify.win, 0, 0, ACS_HLINE, col);
mvwprintw(notify.win, 0, date_pos, "[ %s | %s ]", notify.date, notify.time);
mvwprintw(notify.win, 0, file_pos, "(%s)", notify.apts_file);
- wins_nbar_unlock();
+ WINS_NBAR_UNLOCK;
pthread_mutex_lock(&notify_app.mutex);
if (notify_app.got_app) {
@@ -273,7 +273,7 @@ void notify_update_bar(void)
else
blinking = 0;
- wins_nbar_lock();
+ WINS_NBAR_LOCK;
if (blinking)
wattron(notify.win, A_BLINK);
if (too_long)
@@ -284,7 +284,7 @@ void notify_update_bar(void)
hours_left, minutes_left, notify_app.txt);
if (blinking)
wattroff(notify.win, A_BLINK);
- wins_nbar_unlock();
+ WINS_NBAR_UNLOCK;
if (blinking)
notify_launch_cmd();
@@ -299,10 +299,10 @@ void notify_update_bar(void)
}
pthread_mutex_unlock(&notify_app.mutex);
- wins_nbar_lock();
+ WINS_NBAR_LOCK;
wattroff(notify.win, A_UNDERLINE | A_REVERSE);
custom_remove_attr(notify.win, ATTR_HIGHEST);
- wins_nbar_unlock();
+ WINS_NBAR_UNLOCK;
wins_wrefresh(notify.win);
pthread_mutex_unlock(&notify.mutex);
diff --git a/src/wins.c b/src/wins.c
index 64dd962..249610c 100644
--- a/src/wins.c
+++ b/src/wins.c
@@ -40,6 +40,14 @@
#include "calcurse.h"
+#define SCREEN_ACQUIRE \
+ pthread_cleanup_push(screen_cleanup, (void *)NULL); \
+ screen_acquire();
+
+#define SCREEN_RELEASE \
+ screen_release(); \
+ pthread_cleanup_pop(0);
+
/* Variables to handle calcurse windows. */
struct window win[NBWINS];
@@ -76,6 +84,11 @@ static void screen_release(void)
pthread_mutex_unlock(&screen_mutex);
}
+static void screen_cleanup(void *arg)
+{
+ screen_release();
+}
+
/*
* FIXME: The following functions currently lock the whole screen. Use both
* window-level and screen-level mutexes (or use use_screen() and use_window(),
@@ -92,6 +105,11 @@ void wins_nbar_unlock(void)
screen_release();
}
+void wins_nbar_cleanup(void *arg)
+{
+ wins_nbar_unlock();
+}
+
unsigned wins_calendar_lock(void)
{
return screen_acquire();
@@ -102,14 +120,18 @@ void wins_calendar_unlock(void)
screen_release();
}
+void wins_calendar_cleanup(void *arg)
+{
+ wins_calendar_unlock();
+}
+
int wins_refresh(void)
{
int rc;
- if (!screen_acquire())
- return ERR;
+ SCREEN_ACQUIRE;
rc = refresh();
- screen_release();
+ SCREEN_RELEASE;
return rc;
}
@@ -118,10 +140,11 @@ int wins_wrefresh(WINDOW * win)
{
int rc;
- if (!win || !screen_acquire())
+ if (!win)
return ERR;
+ SCREEN_ACQUIRE;
rc = wrefresh(win);
- screen_release();
+ SCREEN_RELEASE;
return rc;
}
@@ -130,10 +153,9 @@ int wins_doupdate(void)
{
int rc;
- if (!screen_acquire())
- return ERR;
+ SCREEN_ACQUIRE;
rc = doupdate();
- screen_release();
+ SCREEN_RELEASE;
return rc;
}
@@ -502,12 +524,12 @@ static void border_nocolor(WINDOW * window)
void wins_update_border(int flags)
{
if (flags & FLAG_CAL) {
- wins_calendar_lock();
+ WINS_CALENDAR_LOCK;
if (slctd_win == CAL)
border_color(win[CAL].p);
else
border_nocolor(win[CAL].p);
- wins_calendar_unlock();
+ WINS_CALENDAR_UNLOCK;
}
if (flags & FLAG_APP) {
if (slctd_win == APP)