Hi,
I used to have a plenty of perl scripts to fill the status line, but find
the native way of doing this considerably faster => better.
When I found sswriter on this thread in May I was missing the ability to
get the content of a file at particular place in the output. After this
feature have been implemented a month later the main thing I was missing
was the ability to limit the number of chars in particular areas of the
output.
I need this, because I like to have the more important part on the right
(battery, network ifaces, load, etc.) and the less important on the left,
near the wmii/dwm tags. The less important part tends to have unpredictable
size, e.g. incoming instant messages, and sometimes eats the space for the
important part.
I have implemented the areas concept some weeks after that. Please find
below the patch for 0.3.1. If it gets corrupted by the mail transfer, I can
provided it through http, too. Just drop a line, if needed. The code is far
from good quality -- suggestions are welcome.
You can start an area in the format string with ``['' and close it with
(surprise :o) ) ``]''. With ``--area max1 max2 max3'' on the command line,
the maximal width of the first, second, and third opened area can be
specified.
The perl script I used before implements an extended version of the areas
concept: If the content of the area is larger than the given maximum, it
scrolls the content with configurable speed (chars/sec). (No status has to
be kept by the algorithm, it is based on the current time). I would like to
have this implemented in sswriter too. This is on the top of my todo for
sswriter when I have more time to spend (and this is not going to be soon,
I am afraid). Next thing is wide chars support. Often, the files I print
have non-ascii (Cyrillic) chars -- would be nice to handle them correctly.
If somebody has already implemented this feature, please let me know.
But for now I am comfortable with this version, too.
Hope this helps to somebody.
:o)
--
cheers
stanio_
-=-=-=-=-= patch -=-=-=
Index: src/formating.c
===================================================================
RCS file: /home/stanio/CVS/sswriter/src/formating.c,v
retrieving revision 1.1
retrieving revision 1.3
diff -u -r1.1 -r1.3
--- src/formating.c 25 Jun 2008 17:43:50 -0000 1.1
+++ src/formating.c 25 Jun 2008 23:22:27 -0000 1.3
@@ -48,6 +48,7 @@
free(data->files);
free(data->net_devices);
free(data->sensors);
+ free(data->areas);
free(data->lm_sensors);
#ifdef __WITH_ALSA__
free(data->mixers_data);
@@ -70,6 +71,12 @@
/* Groups */
stack_t *groups = NULL;
int cgroup = 0;
+ /* Areas */
+ stack_t *areas = NULL; // area types (later)
+ stack_t *area_widths = NULL; // well, ... widths
+ stack_t *area_starts = NULL; // start (relative to line, in order to avoid long to int cast)
+ char * area_start;
+ int nb_area = 0;
/* Cpufreq cache */
int fcached = -1;
@@ -355,7 +362,6 @@
break;
-
/* Groups are handled in the second pass */
case '(':
it++;
@@ -365,6 +371,16 @@
len = snprintf(line_it, line_left, "%%)");
break;
+
+ /* Scroll areas handled later */
+ case ']':
+ it++;
+ len = snprintf(line_it, line_left, "%%]%c", *it);
+ break;
+ case '[':
+ len = snprintf(line_it, line_left, "%%[");
+ break;
+
default:
slog("Invalid format sequence: %%%c.", next);
return EXIT_FAILURE;
@@ -454,13 +470,67 @@
}
}
*line_it = '\0';
-
- printf("%s", line);
if (!stack_is_empty(groups))
slog("Warning: there is one or more groups not closed.");
stack_delete(groups);
+ /* Do a third pass on the line to handle the scroll areas */
+ areas = stack_create(4);
+ area_widths = stack_create(4);
+ area_starts = stack_create(4);
+ nb_area = 0;
+
+ line_it = line;
+ for (it = line; *it != '\0'; it++) {
+ char c = *it;
+
+ /* Close the current area */
+ if (c == '%' && it[1] == ']') {
+ if (stack_is_empty(areas)) {
+ slog("Too many close braces `]'!");
+ stack_delete(areas);
+ stack_delete(area_starts);
+ stack_delete(area_widths);
+ return EXIT_FAILURE;
+ }
+ stack_pop(areas);
+ stack_pop(area_widths);
+ stack_pop(area_starts);
+ it++;
+ continue;
+ }
+
+ if(
+ stack_peek(areas) &&
+ stack_peek(area_widths) &&
+ ((line_it - (line + stack_peek(area_starts)) ) >= stack_peek(area_widths))){
+ continue;
+ }
+
+ /* Match area opening */
+ if (c == '%' && it[1] == '[') {
+ it += 2;
+ stack_push(areas, AREA);
+ stack_push(area_starts, line_it - line);
+ stack_push(area_widths, data->areas[nb_area]);
+ ++nb_area;
+ } else {
+ *line_it = c;
+ line_it++;
+ }
+ }
+ *line_it = '\0';
+
+ printf("%s", line);
+
+ if (!stack_is_empty(areas))
+ slog("Warning: there is one or more areas not closed.");
+
+ stack_delete(areas);
+ stack_delete(area_widths);
+ stack_delete(area_widths);
+
return EXIT_SUCCESS;
}
Index: src/formating.h
===================================================================
RCS file: /home/stanio/CVS/sswriter/src/formating.h,v
retrieving revision 1.1
retrieving revision 1.3
diff -u -r1.1 -r1.3
--- src/formating.h 25 Jun 2008 17:43:50 -0000 1.1
+++ src/formating.h 25 Jun 2008 23:22:27 -0000 1.3
@@ -26,6 +26,9 @@
#define GRP_BAT_WARN (1 << 1)
#define GRP_BAT_NORM (1 << 2)
+/* Area types */
+#define AREA (1 << 3)
+
#include "acpi_parsing.h"
/* Data type */
@@ -55,6 +58,10 @@
const char **files;
unsigned int nb_files;
+ /* List of area specs */
+ unsigned int *areas;
+ unsigned int nb_areas;
+
#ifdef __WITH_ALSA__
/* List of mixers names */
const char **mixers;
Index: src/main.c
===================================================================
RCS file: /home/stanio/CVS/sswriter/src/main.c,v
retrieving revision 1.1
retrieving revision 1.3
diff -u -r1.1 -r1.3
--- src/main.c 25 Jun 2008 17:43:50 -0000 1.1
+++ src/main.c 25 Jun 2008 23:22:27 -0000 1.3
@@ -73,6 +73,30 @@
i = store_args_strings(argc, argv, i, &data->net_devices,
&data->nb_net_devices);
+ /* Scroll areas */
+ } else if (data->areas == NULL && (!strcmp(argv[i], "-a")
+ || !strcmp(argv[i], "--areas"))) {
+ int j = i + 1;
+ while (j < (argc - 1) && argv[j][0] != '-') {
+ data->nb_areas++;
+ j++;
+ }
+
+ if (data->nb_areas > 0) {
+ data->areas = calloc(2 * data->nb_areas,
+ sizeof(unsigned int));
+ for (j = 0; j < data->nb_areas; j++) {
+ unsigned int v1;
+ if (sscanf(argv[i + j + 1], "%u", &v1 ) == 1) {
+ data->areas[j] = v1;
+ } else {
+ print_usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ }
+ i += j;
+ }
+
/* Temperature sensors */
} else if (data->sensors == NULL && (!strcmp(argv[i], "-t")
|| !strcmp(argv[i], "--tsensors"))) {
@@ -181,6 +205,8 @@
printf("\tspecify differents couples of hwmon-num/temp-num (see README)\n\n");
printf("-w --warnlimit <number>\n");
printf("\tset the limit of the battery warning (by default 10%%)\n\n");
+ printf("-a --areas <maxwidth ... >\n");
+ printf("\tset the limit of the battery warning (by default 10%%)\n\n");
printf("For more informations and examples, see the README\n");
}
-=-=-=-=-= patch end -=
Received on Tue Sep 16 2008 - 14:58:34 UTC
This archive was generated by hypermail 2.2.0 : Tue Sep 16 2008 - 15:12:06 UTC