Added bitrate_format options to wireless configuration block
Patch status: needinfo
Patch by Enrico Carlesso
To apply this patch, use:
curl http://cr.i3wm.org/patch/677/raw.patch | git am
b/i3status.c
| 16 |
@@ -292,6 +292,7 @@ int main(int argc, char *argv[]) {
|
| 17 |
cfg_opt_t wireless_opts[] = {
|
| 18 |
CFG_STR("format_up", "W: (%quality at %essid, %bitrate) %ip", CFGF_NONE),
|
| 19 |
CFG_STR("format_down", "W: down", CFGF_NONE),
|
| 20 |
+ CFG_STR("bitrate_format", "%g %c/s", CFGF_NONE),
|
| 21 |
CFG_CUSTOM_ALIGN_OPT, |
| 22 |
CFG_CUSTOM_COLOR_OPTS, |
| 23 |
CFG_CUSTOM_MIN_WIDTH_OPT, |
| 24 |
@@ -576,7 +577,7 @@ int main(int argc, char *argv[]) {
|
| 25 |
|
| 26 |
CASE_SEC_TITLE("wireless") {
|
| 27 |
SEC_OPEN_MAP("wireless");
|
| 28 |
- print_wireless_info(json_gen, buffer, title, cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down")); |
| 29 |
+ print_wireless_info(json_gen, buffer, title, cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down"), cfg_getstr(sec, "bitrate_format")); |
| 30 |
SEC_CLOSE_MAP; |
| 31 |
} |
| 32 |
|
b/include/i3status.h
| 37 |
@@ -142,6 +142,11 @@ enum { O_DZEN2, O_XMOBAR, O_I3BAR, O_TERM, O_NONE } output_format;
|
| 38 |
} \ |
| 39 |
} while (0) |
| 40 |
|
| 41 |
+#define KILO 1e3 |
| 42 |
+#define MEGA 1e6 |
| 43 |
+#define GIGA 1e9 |
| 44 |
+ |
| 45 |
+ |
| 46 |
|
| 47 |
typedef enum { CS_DISCHARGING, CS_CHARGING, CS_FULL } charging_status_t;
|
| 48 |
|
| 49 |
@@ -176,7 +181,7 @@ void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char |
| 50 |
void print_time(yajl_gen json_gen, char *buffer, const char *format, const char *tz, time_t t); |
| 51 |
void print_ddate(yajl_gen json_gen, char *buffer, const char *format, time_t t); |
| 52 |
const char *get_ip_addr(); |
| 53 |
-void print_wireless_info(yajl_gen json_gen, char *buffer, const char *interface, const char *format_up, const char *format_down); |
| 54 |
+void print_wireless_info(yajl_gen json_gen, char *buffer, const char *interface, const char *format_up, const char *format_down, const char *bitrate_format); |
| 55 |
void print_run_watch(yajl_gen json_gen, char *buffer, const char *title, const char *pidfile, const char *format); |
| 56 |
void print_path_exists(yajl_gen json_gen, char *buffer, const char *title, const char *path, const char *format); |
| 57 |
void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const char *path, const char *format, int); |
b/man/i3status.man
| 62 |
@@ -63,6 +63,7 @@ order += "tztime berlin" |
| 63 |
wireless wlan0 {
|
| 64 |
format_up = "W: (%quality at %essid, %bitrate) %ip" |
| 65 |
format_down = "W: down" |
| 66 |
+ bitrate_format = "%g %cb/s" |
| 67 |
} |
| 68 |
|
| 69 |
ethernet eth0 {
|
| 70 |
@@ -272,12 +273,19 @@ something is active, like for example a VPN tunnel managed by NetworkManager. |
| 71 |
|
| 72 |
Gets the link quality and ESSID of the given wireless network interface. You |
| 73 |
can specify different format strings for the network being connected or not |
| 74 |
-connected. |
| 75 |
+connected. You can also provide a printf-like format string for bitrate. This |
| 76 |
+can be especially useful if you have a dual band access point and the default |
| 77 |
+format displays values such as 96, 130, 158.6 changing the width of the text. |
| 78 |
+Setting bitrate format to "%5.1f %cb/s" will always take the same amount of |
| 79 |
+characters. The first argument is a float number indicating the scaled speed, |
| 80 |
+the second is a character for the scale, K for Kilo, M for Mega and G for Giga. |
| 81 |
|
| 82 |
*Example order*: +wireless wlan0+ |
| 83 |
|
| 84 |
*Example format*: +W: (%quality at %essid, %bitrate) %ip+ |
| 85 |
|
| 86 |
+*Example bitrate format*: +%g %cb/s+ |
| 87 |
+ |
| 88 |
=== Ethernet |
| 89 |
|
| 90 |
Gets the IP address and (if possible) the link speed of the given ethernet |
b/src/print_wireless_info.c
| 95 |
@@ -71,6 +71,40 @@ typedef struct {
|
| 96 |
int bitrate; |
| 97 |
} wireless_info_t; |
| 98 |
|
| 99 |
+/* |
| 100 |
+ * Format bitrate with provided formatter. |
| 101 |
+ * |
| 102 |
+ * Basically, a clone of iw_print_bitrate, but accepting a format instead of forcing "%g %cb/s" |
| 103 |
+ * see http://sourcecodebrowser.com/wireless-tools/28/iwlib_8c.html#ad1674f1115db41e1f3405f915c772783 |
| 104 |
+ * |
| 105 |
+ */ |
| 106 |
+static void i3_iw_print_bitrate(char *buffer, int buflen, int bitrate, const char *bitrate_format) |
| 107 |
+{
|
| 108 |
+ double rate = bitrate; |
| 109 |
+ char scale; |
| 110 |
+ int divisor; |
| 111 |
+ |
| 112 |
+ if(rate >= GIGA) |
| 113 |
+ {
|
| 114 |
+ scale = 'G'; |
| 115 |
+ divisor = GIGA; |
| 116 |
+ } |
| 117 |
+ else |
| 118 |
+ {
|
| 119 |
+ if(rate >= MEGA) |
| 120 |
+ {
|
| 121 |
+ scale = 'M'; |
| 122 |
+ divisor = MEGA; |
| 123 |
+ } |
| 124 |
+ else |
| 125 |
+ {
|
| 126 |
+ scale = 'k'; |
| 127 |
+ divisor = KILO; |
| 128 |
+ } |
| 129 |
+ } |
| 130 |
+ snprintf(buffer, buflen, bitrate_format, rate / divisor, scale); |
| 131 |
+} |
| 132 |
+ |
| 133 |
static int get_wireless_info(const char *interface, wireless_info_t *info) {
|
| 134 |
memset(info, 0, sizeof(wireless_info_t)); |
| 135 |
|
| 136 |
@@ -320,7 +354,7 @@ static int get_wireless_info(const char *interface, wireless_info_t *info) {
|
| 137 |
return 0; |
| 138 |
} |
| 139 |
|
| 140 |
-void print_wireless_info(yajl_gen json_gen, char *buffer, const char *interface, const char *format_up, const char *format_down) {
|
| 141 |
+void print_wireless_info(yajl_gen json_gen, char *buffer, const char *interface, const char *format_up, const char *format_down, const char *bitrate_format) {
|
| 142 |
const char *walk; |
| 143 |
char *outwalk = buffer; |
| 144 |
wireless_info_t info; |
| 145 |
@@ -404,7 +438,7 @@ void print_wireless_info(yajl_gen json_gen, char *buffer, const char *interface, |
| 146 |
if (BEGINS_WITH(walk+1, "bitrate")) {
|
| 147 |
char br_buffer[128]; |
| 148 |
|
| 149 |
- iw_print_bitrate(br_buffer, sizeof(br_buffer), info.bitrate); |
| 150 |
+ i3_iw_print_bitrate(br_buffer, sizeof(br_buffer), info.bitrate, bitrate_format); |
| 151 |
|
| 152 |
outwalk += sprintf(outwalk, "%s", br_buffer); |
| 153 |
walk += strlen("bitrate");
|