From cc77e839d86fda9871f5fde89350d51465ec208b Mon Sep 17 00:00:00 2001 From: Frederic Culot Date: Sun, 21 Mar 2010 09:21:06 +0000 Subject: More work on sidebar customization. --- ChangeLog | 8 +++++ src/calcurse.h | 13 ++++++-- src/calendar.c | 9 ++--- src/custom.c | 20 +++++++---- src/io.c | 7 +++- src/wins.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++---------- 6 files changed, 131 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index 80dacdf..8d10c5a 100755 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,14 @@ * src/wins.c (wins_update_border, wins_update_panels): new functions extracted from wins_update() + + * src/wins.c (wins_sbar_width, wins_sbar_wperc) + (wins_set_sbar_width, wins_sbar_winc, wins_sbar_wdec) + (wins_reinit_panels): new functions to handle side bar width + customization + + * src/custom.c + * src/io.c: sidebar width added to the configuration file 2010-03-19 Frederic Culot diff --git a/src/calcurse.h b/src/calcurse.h index ce335eb..fa18b56 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -1,4 +1,4 @@ -/* $Id: calcurse.h,v 1.2 2010/03/20 13:29:47 culot Exp $ */ +/* $Id: calcurse.h,v 1.3 2010/03/21 09:21:07 culot Exp $ */ /* * Calcurse - text-based organizer @@ -133,6 +133,10 @@ /* Maximum number of colors available. */ #define NBUSERCOLORS 6 +/* Side bar width acceptable boundaries. */ +#define SBARMINWIDTH 32 +#define SBARMAXWIDTHPERC 50 + /* Related to date manipulation. */ #define DAYINSEC 86400 #define HOURINSEC 3600 @@ -893,9 +897,13 @@ void vars_init (struct conf *); /* wins.c */ extern struct window win[NBWINS]; -extern unsigned sbarwidth; int wins_layout (void); void wins_set_layout (int); +unsigned wins_sbar_width (void); +unsigned wins_sbar_wperc (void); +void wins_set_sbar_width (unsigned); +void wins_sbar_winc (void); +void wins_sbar_wdec (void); void wins_slctd_init (void); enum win wins_slctd (void); void wins_slctd_set (enum win); @@ -907,6 +915,7 @@ void wins_scrollwin_display (struct scrollwin *); void wins_scrollwin_up (struct scrollwin *, int); void wins_scrollwin_down (struct scrollwin *, int); void wins_reinit (void); +void wins_reinit_panels (void); void wins_show (WINDOW *, char *); void wins_get_config (void); void wins_update_border (void); diff --git a/src/calendar.c b/src/calendar.c index ae3f4ac..c129ec5 100755 --- a/src/calendar.c +++ b/src/calendar.c @@ -1,4 +1,4 @@ -/* $calcurse: calendar.c,v 1.34 2010/03/20 13:29:48 culot Exp $ */ +/* $calcurse: calendar.c,v 1.35 2010/03/21 09:21:07 culot Exp $ */ /* * Calcurse - text-based organizer @@ -306,17 +306,18 @@ draw_monthly_view (struct window *cwin, struct date *current_day, unsigned sunday_first) { const int OFFY = 2 + (CALHEIGHT - 9) / 2; - const int OFFX = (sbarwidth - 27) / 2; struct date check_day; int c_day, c_day_1, day_1_sav, numdays, j; unsigned yr, mo; - int ofs_x, ofs_y; + int OFFX, SBAR_WIDTH, ofs_x, ofs_y; int item_this_day = 0; mo = slctd_day.mm; yr = slctd_day.yyyy; /* offset for centering calendar in window */ + SBAR_WIDTH = wins_sbar_width (); + OFFX = (SBAR_WIDTH - 27) / 2; ofs_y = OFFY; ofs_x = OFFX; @@ -334,7 +335,7 @@ draw_monthly_view (struct window *cwin, struct date *current_day, /* Write the current month and year on top of the calendar */ custom_apply_attr (cwin->p, ATTR_HIGHEST); mvwprintw (cwin->p, ofs_y, - (sbarwidth - (strlen (_(monthnames[mo - 1])) + 5)) / 2, + (SBAR_WIDTH - (strlen (_(monthnames[mo - 1])) + 5)) / 2, "%s %d", _(monthnames[mo - 1]), slctd_day.yyyy); custom_remove_attr (cwin->p, ATTR_HIGHEST); ++ofs_y; diff --git a/src/custom.c b/src/custom.c index 053d30f..007c71b 100755 --- a/src/custom.c +++ b/src/custom.c @@ -1,4 +1,4 @@ -/* $calcurse: custom.c,v 1.47 2010/03/20 13:29:48 culot Exp $ */ +/* $calcurse: custom.c,v 1.48 2010/03/21 09:21:07 culot Exp $ */ /* * Calcurse - text-based organizer @@ -43,7 +43,7 @@ #include "calcurse.h" /* Available configuration variables. */ -enum { +enum conf_var { CUSTOM_CONF_NOVARIABLE, CUSTOM_CONF_AUTOSAVE, CUSTOM_CONF_PERIODICSAVE, @@ -55,6 +55,7 @@ enum { CUSTOM_CONF_WEEKBEGINSONMONDAY, CUSTOM_CONF_COLORTHEME, CUSTOM_CONF_LAYOUT, + CUSTOM_CONF_SBAR_WIDTH, CUSTOM_CONF_NOTIFYBARSHOW, CUSTOM_CONF_NOTIFYBARDATE, CUSTOM_CONF_NOTIFYBARCLOCK, @@ -242,7 +243,7 @@ custom_load_conf (struct conf *conf, int background) char *mesg_line1 = _("Failed to open config file"); char *mesg_line2 = _("Press [ENTER] to continue"); char buf[BUFSIZ], e_conf[BUFSIZ]; - int var; + enum conf_var var; data_file = fopen (path_conf, "r"); if (data_file == NULL) @@ -311,6 +312,10 @@ custom_load_conf (struct conf *conf, int background) wins_set_layout (atoi (e_conf)); var = 0; break; + case CUSTOM_CONF_SBAR_WIDTH: + wins_set_sbar_width (atoi (e_conf)); + var = 0; + break; case CUSTOM_CONF_NOTIFYBARSHOW: nbar.show = fill_config_var (e_conf); var = 0; @@ -375,6 +380,8 @@ custom_load_conf (struct conf *conf, int background) var = CUSTOM_CONF_COLORTHEME; else if (strncmp (e_conf, "layout=", 7) == 0) var = CUSTOM_CONF_LAYOUT; + else if (strncmp (e_conf, "side-bar_width=", 15) == 0) + var = CUSTOM_CONF_SBAR_WIDTH; else if (strncmp (e_conf, "notify-bar_show=", 16) == 0) var = CUSTOM_CONF_NOTIFYBARSHOW; else if (strncmp (e_conf, "notify-bar_date=", 16) == 0) @@ -605,6 +612,7 @@ custom_sidebar_config (void) keys_display_bindings_bar (win[STA].p, binding, 0, binding_size); doupdate (); + while ((ch = keys_getch (win[STA].p)) != KEY_GENERIC_QUIT) { unsigned need_update; @@ -613,11 +621,11 @@ custom_sidebar_config (void) switch (ch) { case KEY_MOVE_UP: - sbarwidth++; + wins_sbar_winc (); need_update = 1; break; case KEY_MOVE_DOWN: - sbarwidth--; + wins_sbar_wdec (); need_update = 1; break; case KEY_GENERIC_HELP: @@ -629,7 +637,7 @@ custom_sidebar_config (void) if (need_update) { - wins_reinit (); + wins_reinit_panels (); wins_update_border (); wins_update_panels (); keys_display_bindings_bar (win[STA].p, binding, 0, binding_size); diff --git a/src/io.c b/src/io.c index 28b6bdb..79ca3c0 100755 --- a/src/io.c +++ b/src/io.c @@ -1,4 +1,4 @@ -/* $calcurse: io.c,v 1.81 2010/03/20 10:54:46 culot Exp $ */ +/* $calcurse: io.c,v 1.82 2010/03/21 09:21:07 culot Exp $ */ /* * Calcurse - text-based organizer @@ -887,6 +887,11 @@ io_save_conf (struct conf *conf) (void)fprintf (fp, "\n# This is the layout of the calendar :\n"); (void)fprintf (fp, "layout=\n"); (void)fprintf (fp, "%d\n", wins_layout ()); + + (void)fprintf (fp, "\n# Width (in percentage, 0 being minimun width) " + "of the side bar :\n"); + (void)fprintf (fp, "side-bar_width=\n"); + (void)fprintf (fp, "%d\n", wins_sbar_wperc ()); if (ui_mode == UI_CURSES) pthread_mutex_lock (&nbar.mutex); diff --git a/src/wins.c b/src/wins.c index 91a7640..8cdd9da 100755 --- a/src/wins.c +++ b/src/wins.c @@ -1,4 +1,4 @@ -/* $calcurse: wins.c,v 1.30 2010/03/20 13:29:48 culot Exp $ */ +/* $calcurse: wins.c,v 1.31 2010/03/21 09:21:07 culot Exp $ */ /* * Calcurse - text-based organizer @@ -46,7 +46,7 @@ struct window win[NBWINS]; /* User-configurable side bar width. */ -unsigned sbarwidth = 30; +static unsigned sbarwidth; static enum win slctd_win; static int layout; @@ -55,7 +55,7 @@ static int layout; int wins_layout (void) { - return (layout); + return layout; } /* Set the current layout. */ @@ -65,6 +65,63 @@ wins_set_layout (int nb) layout = nb; } +/* Get the current side bar width. */ +unsigned +wins_sbar_width (void) +{ + return sbarwidth ? sbarwidth : SBARMINWIDTH; +} + +/* + * Return the side bar width in percentage of the total number of columns + * available in calcurse's screen. + */ +unsigned +wins_sbar_wperc (void) +{ + unsigned perc; + + perc = col ? (unsigned)(100 * sbarwidth / col + 1): 0; + + return perc > SBARMAXWIDTHPERC ? SBARMAXWIDTHPERC : perc; +} + +/* + * Set side bar width (unit: number of characters) given a width in percentage + * of calcurse's screen total width. + * The side bar could not have a width representing more than 50% of the screen, + * and could not be less than SBARMINWIDTH characters. + */ +void +wins_set_sbar_width (unsigned perc) +{ + if (perc > SBARMAXWIDTHPERC) + sbarwidth = col * SBARMAXWIDTHPERC / 100; + else if (perc <= 0) + sbarwidth = SBARMINWIDTH; + else + { + sbarwidth = (unsigned)(col * perc / 100); + if (sbarwidth < SBARMINWIDTH) + sbarwidth = SBARMINWIDTH; + } +} + +/* Change the width of the side bar within acceptable boundaries. */ +void +wins_sbar_winc (void) +{ + if (sbarwidth < SBARMAXWIDTHPERC * col / 100) + sbarwidth++; +} + +void +wins_sbar_wdec (void) +{ + if (sbarwidth > SBARMINWIDTH) + sbarwidth--; +} + /* Initialize the selected window in calcurse's interface. */ void wins_slctd_init (void) @@ -96,17 +153,12 @@ wins_slctd_next (void) slctd_win++; } -/* Create all the windows. */ -void -wins_init (void) +static void +wins_init_panels (void) { char label[BUFSIZ]; - - /* - * Create the three main windows plus the status bar and the pad used to - * display appointments and event. - */ - win[CAL].p = newwin (CALHEIGHT, sbarwidth, win[CAL].y, win[CAL].x); + + win[CAL].p = newwin (CALHEIGHT, wins_sbar_width (), win[CAL].y, win[CAL].x); (void)snprintf (label, BUFSIZ, _("Calendar")); wins_show (win[CAL].p, label); @@ -120,12 +172,19 @@ wins_init (void) (void)snprintf (label, BUFSIZ, _("ToDo")); wins_show (win[TOD].p, label); - win[STA].p = newwin (win[STA].h, win[STA].w, win[STA].y, win[STA].x); - - /* Enable function keys (i.e. arrow keys) in those windows */ + /* Enable function keys (i.e. arrow keys) in those windows */ keypad (win[CAL].p, TRUE); keypad (win[APP].p, TRUE); keypad (win[TOD].p, TRUE); +} + +/* Create all the windows. */ +void +wins_init (void) +{ + wins_init_panels (); + win[STA].p = newwin (win[STA].h, win[STA].w, win[STA].y, win[STA].x); + keypad (win[STA].p, TRUE); /* Notify that the curses mode is now launched. */ @@ -195,6 +254,17 @@ wins_scrollwin_down (struct scrollwin *sw, int amount) sw->first_visible_line += amount; } +void +wins_reinit_panels (void) +{ + delwin (win[CAL].p); + delwin (win[APP].p); + delwin (apad.ptrwin); + delwin (win[TOD].p); + wins_get_config (); + wins_init_panels (); +} + /* * Delete the existing windows and recreate them with their new * size and placement. @@ -202,11 +272,11 @@ wins_scrollwin_down (struct scrollwin *sw, int amount) void wins_reinit (void) { - delwin (win[STA].p); delwin (win[CAL].p); delwin (win[APP].p); delwin (apad.ptrwin); delwin (win[TOD].p); + delwin (win[STA].p); wins_get_config (); wins_init (); if (notify_bar ()) @@ -260,7 +330,7 @@ wins_get_config (void) win[NOT].x = 0; } - win[CAL].w = sbarwidth; + win[CAL].w = wins_sbar_width (); win[CAL].h = CALHEIGHT; if (layout <= 4) -- cgit v1.2.3