From: <n0...@us...> - 2008-03-30 20:58:49
|
Revision: 1086 http://conky.svn.sourceforge.net/conky/?rev=1086&view=rev Author: n0-1 Date: 2008-03-30 13:58:42 -0700 (Sun, 30 Mar 2008) Log Message: ----------- proof of concept code for the awaiting redesign * changes to conky.h were just hacked in, so they need another review (or two) * this is just the first step (as visible through the unused struct object_methods * when functions exist for all objects, step two can start, i.e. to rewrite construct_text_object() & Co. to just call the appropriate function automatically Modified Paths: -------------- branches/conky1-mod/src/conky.c branches/conky1-mod/src/conky.h branches/conky1-mod/src/smapi.c branches/conky1-mod/src/smapi.h Modified: branches/conky1-mod/src/conky.c =================================================================== --- branches/conky1-mod/src/conky.c 2008-03-30 20:53:00 UTC (rev 1085) +++ branches/conky1-mod/src/conky.c 2008-03-30 20:58:42 UTC (rev 1086) @@ -69,7 +69,6 @@ #define CONFIG_FILE "$HOME/.conkyrc" #define MAIL_FILE "$MAIL" -#define MAX_IF_BLOCK_DEPTH 5 #define MAX_TAIL_LINES 100 /* #define SIGNAL_BLOCKING */ @@ -318,6 +317,15 @@ #endif /* X11 */ +/* if-blocks */ +#define MAX_IF_BLOCK_DEPTH 5 +int blockdepth = 0; +int if_jumped = 0; +int blockstart[MAX_IF_BLOCK_DEPTH]; + +/* pad percentages to decimals? */ +int pad_percents = 0; + /* default config file */ static char *current_config; @@ -427,9 +435,6 @@ /* no buffers in used memory? */ int no_buffers; -/* pad percentages to decimals? */ -static int pad_percents = 0; - #ifdef TCP_PORT_MONITOR tcp_port_monitor_args_t tcp_port_monitor_args; #endif @@ -439,11 +444,6 @@ static int total_updates; -/* if-blocks */ -static int blockdepth = 0; -static int if_jumped = 0; -static int blockstart[MAX_IF_BLOCK_DEPTH]; - int check_contains(char *f, char *s) { int ret = 0; @@ -645,7 +645,7 @@ #undef BUFSZ } -static void new_bar(char *buf, int w, int h, int usage) +void new_bar(char *buf, int w, int h, int usage) { struct special_t *s = new_special(buf, BAR); @@ -654,7 +654,7 @@ s->height = h; } -static const char *scan_bar(const char *args, int *w, int *h) +const char *scan_bar(const char *args, int *w, int *h) { /* zero width means all space that is available */ *w = 0; @@ -969,10 +969,10 @@ /* Prints anything normally printed with snprintf according to the current value * of use_spacer. Actually slightly more flexible than snprintf, as you can * safely specify the destination buffer as one of your inputs. */ -static int spaced_print(char *, int, const char *, int, const char *, ...) +int spaced_print(char *, int, const char *, int, const char *, ...) __attribute__((format(printf, 3, 6))); -static int spaced_print(char *buf, int size, const char *format, int width, +int spaced_print(char *buf, int size, const char *format, int width, const char *func_name, ...) { int len; va_list argp; @@ -1052,407 +1052,6 @@ /* text handling */ -enum text_object_type { - OBJ_addr, -#if defined(__linux__) - OBJ_addrs, -#endif /* __linux__ */ -#ifndef __OpenBSD__ - OBJ_acpiacadapter, - OBJ_adt746xcpu, - OBJ_adt746xfan, - OBJ_acpifan, - OBJ_acpitemp, - OBJ_acpitempf, - OBJ_battery, - OBJ_battery_time, - OBJ_battery_percent, - OBJ_battery_bar, -#endif /* !__OpenBSD__ */ - OBJ_buffers, - OBJ_cached, - OBJ_color, - OBJ_color0, - OBJ_color1, - OBJ_color2, - OBJ_color3, - OBJ_color4, - OBJ_color5, - OBJ_color6, - OBJ_color7, - OBJ_color8, - OBJ_color9, - OBJ_conky_version, - OBJ_conky_build_date, - OBJ_conky_build_arch, - OBJ_font, - OBJ_cpu, - OBJ_cpubar, - OBJ_cpugraph, - OBJ_diskio, - OBJ_diskio_read, - OBJ_diskio_write, - OBJ_diskiograph, - OBJ_diskiograph_read, - OBJ_diskiograph_write, - OBJ_downspeed, - OBJ_downspeedf, - OBJ_downspeedgraph, - OBJ_else, - OBJ_endif, - OBJ_image, - OBJ_exec, - OBJ_execi, - OBJ_texeci, - OBJ_execbar, - OBJ_execgraph, - OBJ_execibar, - OBJ_execigraph, - OBJ_execp, - OBJ_execpi, - OBJ_freq, - OBJ_freq_g, - OBJ_freq_dyn, - OBJ_freq_dyn_g, - OBJ_fs_bar, - OBJ_fs_bar_free, - OBJ_fs_free, - OBJ_fs_free_perc, - OBJ_fs_size, - OBJ_fs_type, - OBJ_fs_used, - OBJ_fs_used_perc, - OBJ_goto, - OBJ_tab, - OBJ_hr, - OBJ_offset, - OBJ_voffset, - OBJ_alignr, - OBJ_alignc, - OBJ_i2c, - OBJ_platform, - OBJ_hwmon, -#if defined(__linux__) - OBJ_disk_protect, - OBJ_i8k_version, - OBJ_i8k_bios, - OBJ_i8k_serial, - OBJ_i8k_cpu_temp, - OBJ_i8k_cpu_tempf, - OBJ_i8k_left_fan_status, - OBJ_i8k_right_fan_status, - OBJ_i8k_left_fan_rpm, - OBJ_i8k_right_fan_rpm, - OBJ_i8k_ac_status, - OBJ_i8k_buttons_status, - OBJ_ibm_fan, - OBJ_ibm_temps, - OBJ_ibm_volume, - OBJ_ibm_brightness, - OBJ_if_up, - OBJ_if_gw, - OBJ_ioscheduler, - OBJ_gw_iface, - OBJ_gw_ip, - OBJ_laptop_mode, - OBJ_pb_battery, - OBJ_voltage_mv, - OBJ_voltage_v, - OBJ_wireless_essid, - OBJ_wireless_mode, - OBJ_wireless_bitrate, - OBJ_wireless_ap, - OBJ_wireless_link_qual, - OBJ_wireless_link_qual_max, - OBJ_wireless_link_qual_perc, - OBJ_wireless_link_bar, -#endif /* __linux__ */ - OBJ_if_empty, - OBJ_if_existing, - OBJ_if_mounted, - OBJ_if_running, - OBJ_top, - OBJ_top_mem, - OBJ_tail, - OBJ_head, - OBJ_kernel, - OBJ_loadavg, - OBJ_machine, - OBJ_mails, - OBJ_mboxscan, - OBJ_mem, - OBJ_membar, - OBJ_memgraph, - OBJ_memmax, - OBJ_memperc, - OBJ_mem_res, - OBJ_mem_vsize, - OBJ_mixer, - OBJ_mixerl, - OBJ_mixerr, - OBJ_mixerbar, - OBJ_mixerlbar, - OBJ_mixerrbar, - OBJ_nameserver, - OBJ_new_mails, - OBJ_nodename, - OBJ_pre_exec, - OBJ_processes, - OBJ_running_processes, - OBJ_shadecolor, - OBJ_outlinecolor, - OBJ_stippled_hr, - OBJ_swap, - OBJ_swapbar, - OBJ_swapmax, - OBJ_swapperc, - OBJ_sysname, - OBJ_temp1, /* i2c is used instead in these */ - OBJ_temp2, - OBJ_text, - OBJ_time, - OBJ_utime, - OBJ_tztime, - OBJ_totaldown, - OBJ_totalup, - OBJ_updates, - OBJ_upspeed, - OBJ_upspeedf, - OBJ_upspeedgraph, - OBJ_uptime, - OBJ_uptime_short, - OBJ_user_names, - OBJ_user_terms, - OBJ_user_times, - OBJ_user_number, - OBJ_imap, - OBJ_imap_messages, - OBJ_imap_unseen, - OBJ_pop3, - OBJ_pop3_unseen, - OBJ_pop3_used, -#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \ - || defined(__OpenBSD__)) && (defined(i386) || defined(__i386__)) - OBJ_apm_adapter, - OBJ_apm_battery_time, - OBJ_apm_battery_life, -#endif /* __FreeBSD__ __OpenBSD__ */ -#ifdef __OpenBSD__ - OBJ_obsd_sensors_temp, - OBJ_obsd_sensors_fan, - OBJ_obsd_sensors_volt, - OBJ_obsd_vendor, - OBJ_obsd_product, -#endif /* __OpenBSD__ */ -#ifdef MPD - OBJ_mpd_title, - OBJ_mpd_artist, - OBJ_mpd_album, - OBJ_mpd_random, - OBJ_mpd_repeat, - OBJ_mpd_vol, - OBJ_mpd_bitrate, - OBJ_mpd_status, - OBJ_mpd_host, - OBJ_mpd_port, - OBJ_mpd_password, - OBJ_mpd_bar, - OBJ_mpd_elapsed, - OBJ_mpd_length, - OBJ_mpd_track, - OBJ_mpd_name, - OBJ_mpd_file, - OBJ_mpd_percent, - OBJ_mpd_smart, -#endif - OBJ_music_player_interval, -#ifdef XMMS2 - OBJ_xmms2_artist, - OBJ_xmms2_album, - OBJ_xmms2_title, - OBJ_xmms2_genre, - OBJ_xmms2_comment, - OBJ_xmms2_url, - OBJ_xmms2_date, - OBJ_xmms2_tracknr, - OBJ_xmms2_bitrate, - OBJ_xmms2_id, - OBJ_xmms2_duration, - OBJ_xmms2_elapsed, - OBJ_xmms2_size, - OBJ_xmms2_percent, - OBJ_xmms2_status, - OBJ_xmms2_bar, - OBJ_xmms2_smart, - OBJ_xmms2_playlist, - OBJ_xmms2_timesplayed, -#endif -#ifdef AUDACIOUS - OBJ_audacious_status, - OBJ_audacious_title, - OBJ_audacious_length, - OBJ_audacious_length_seconds, - OBJ_audacious_position, - OBJ_audacious_position_seconds, - OBJ_audacious_bitrate, - OBJ_audacious_frequency, - OBJ_audacious_channels, - OBJ_audacious_filename, - OBJ_audacious_playlist_length, - OBJ_audacious_playlist_position, - OBJ_audacious_bar, -#endif -#ifdef BMPX - OBJ_bmpx_title, - OBJ_bmpx_artist, - OBJ_bmpx_album, - OBJ_bmpx_track, - OBJ_bmpx_uri, - OBJ_bmpx_bitrate, -#endif -#ifdef RSS - OBJ_rss, -#endif -#ifdef TCP_PORT_MONITOR - OBJ_tcp_portmon, -#endif -#ifdef HAVE_ICONV - OBJ_iconv_start, - OBJ_iconv_stop, -#endif -#ifdef HDDTEMP - OBJ_hddtemp, -#endif -#ifdef SMAPI - OBJ_smapi, - OBJ_smapi_bat_bar, - OBJ_smapi_bat_perc, - OBJ_if_smapi_bat_installed, -#endif - OBJ_entropy_avail, - OBJ_entropy_poolsize, - OBJ_entropy_bar -}; - -struct text_object { - union { - char *s; /* some string */ - int i; /* some integer */ - long l; /* some other integer */ - unsigned int sensor; - struct net_stat *net; - struct fs_stat *fs; - struct diskio_stat *diskio; - unsigned char loadavg[3]; - unsigned int cpu_index; - struct mail_s *mail; - - struct { - char *args; - char *output; - } mboxscan; - - struct { - char *tz; /* timezone variable */ - char *fmt; /* time display formatting */ - } tztime; - - struct { - struct fs_stat *fs; - int w, h; - } fsbar; /* 3 */ - - struct { - int l; - int w, h; - } mixerbar; /* 3 */ - - struct { - int fd; - int arg; - char devtype[256]; - char type[64]; - } sysfs; /* 2 */ - - struct { - int pos; - char *s; - char *str; - } ifblock; - - struct { - int num; - int type; - } top; - - struct { - int wantedlines; - int readlines; - char *logfile; - double last_update; - float interval; - char *buffer; - /* If not -1, a file descriptor to read from when - * logfile is a FIFO. */ - int fd; - } tail; - - struct { - double last_update; - float interval; - char *cmd; - char *buffer; - double data; - } execi; /* 5 */ - - struct { - float interval; - char *cmd; - char *buffer; - double data; - timed_thread *p_timed_thread; - } texeci; - - struct { - int a, b; - } pair; /* 2 */ -#ifdef TCP_PORT_MONITOR - struct { - /* starting port to monitor */ - in_port_t port_range_begin; - /* ending port to monitor */ - in_port_t port_range_end; - /* enum from libtcp-portmon.h, e.g. COUNT, etc. */ - int item; - /* 0 to n-1 connections. */ - int connection_index; - } tcp_port_monitor; -#endif -#ifdef HDDTEMP - struct { - char *addr; - int port; - char *dev; - } hddtemp; /* 2 */ -#endif -#ifdef RSS - struct { - char *uri; - char *action; - int act_par; - int delay; - } rss; -#endif - struct local_mail_s local_mail; - } data; - int type; - int a, b; - long line; - unsigned int c, d, e; - float f; - char global_mode; -}; - struct text_object_list { unsigned int text_object_count; struct text_object *text_objects; @@ -2233,11 +1832,8 @@ #ifdef SMAPI case OBJ_smapi: case OBJ_smapi_bat_perc: - free(objs[i].data.s); - break; case OBJ_if_smapi_bat_installed: - free(objs[i].data.ifblock.s); - free(objs[i].data.ifblock.str); + smapi_exit(objs[i].type, objs[i]); break; #endif #ifdef MPD @@ -3573,39 +3169,13 @@ } #ifdef SMAPI END OBJ(smapi, 0) - if (arg) - obj->data.s = strdup(arg); - else - ERR("smapi needs an argument"); + smapi_init(OBJ_smapi, arg, obj, object_count); END OBJ(if_smapi_bat_installed, 0) - if (blockdepth >= MAX_IF_BLOCK_DEPTH) { - CRIT_ERR("MAX_IF_BLOCK_DEPTH exceeded"); - } - if (!arg) { - ERR("if_smapi_bat_installed needs an argument"); - obj->data.ifblock.s = 0; - } else - obj->data.ifblock.s = strdup(arg); - blockstart[blockdepth] = object_count; - obj->data.ifblock.pos = object_count + 2; - blockdepth++; + smapi_init(OBJ_if_smapi_bat_installed, arg, obj, object_count); END OBJ(smapi_bat_perc, 0) - if (arg) - obj->data.s = strdup(arg); - else - ERR("smapi_bat_perc needs an argument"); + smapi_init(OBJ_smapi_bat_perc, arg, obj, object_count); END OBJ(smapi_bat_bar, 0) - if(arg) { - int cnt; - if(sscanf(arg, "%i %n", &obj->data.i, &cnt) <= 0) { - ERR("first argument to smapi_bat_bar must be an integer value"); - obj->data.i = -1; - } else { - obj->b = 4; - arg = scan_bar(arg + cnt, &obj->a, &obj->b); - } - } else - ERR("if_smapi_bat_bar needs an argument"); + smapi_init(OBJ_smapi_bat_bar, arg, obj, object_count); #endif /* SMAPI */ #ifdef MPD END OBJ(mpd_artist, INFO_MPD) @@ -6123,39 +5693,16 @@ } #ifdef SMAPI OBJ(smapi) { - char *s; - if(obj->data.s) { - s = smapi_get_val(obj->data.s); - snprintf(p, p_max_size, "%s", s); - free(s); - } + smapi_print(OBJ_smapi, p, p_max_size, obj, &i); } OBJ(if_smapi_bat_installed) { - int idx; - if(obj->data.ifblock.s && sscanf(obj->data.ifblock.s, "%i", &idx) == 1) { - if(!smapi_bat_installed(idx)) { - i = obj->data.ifblock.pos; - if_jumped = 1; - } else - if_jumped = 0; - } else - ERR("argument to if_smapi_bat_installed must be an integer"); + smapi_print(OBJ_if_smapi_bat_installed, p, p_max_size, obj, &i); } OBJ(smapi_bat_perc) { - int idx, val; - if(obj->data.s && sscanf(obj->data.s, "%i", &idx) == 1) { - val = smapi_bat_installed(idx) ? - smapi_get_bat_int(idx, "remaining_percent") : 0; - spaced_print(p, p_max_size, "%*d", 4, "smapi_bat_perc", pad_percents, val); - } else - ERR("argument to smapi_bat_perc must be an integer"); + smapi_print(OBJ_smapi_bat_perc, p, p_max_size, obj, &i); } OBJ(smapi_bat_bar) { - if(obj->data.i >= 0 && smapi_bat_installed(obj->data.i)) - new_bar(p, obj->a, obj->b, (int) - (255 * smapi_get_bat_int(obj->data.i, "remaining_percent") / 100)); - else - new_bar(p, obj->a, obj->b, 0); + smapi_print(OBJ_smapi_bat_bar, p, p_max_size, obj, &i); } #endif /* SMAPI */ Modified: branches/conky1-mod/src/conky.h =================================================================== --- branches/conky1-mod/src/conky.h 2008-03-30 20:53:00 UTC (rev 1085) +++ branches/conky1-mod/src/conky.h 2008-03-30 20:58:42 UTC (rev 1086) @@ -35,6 +35,7 @@ #endif /* HAS_MCHECK_H */ #include "config.h" +#include "timed_thread.h" #include <sys/utsname.h> #include <stdio.h> #include <stdlib.h> @@ -64,7 +65,432 @@ #include <machine/apmvar.h> #endif /* __OpenBSD__ */ +enum text_object_type { + OBJ_addr, +#if defined(__linux__) + OBJ_addrs, +#endif /* __linux__ */ +#ifndef __OpenBSD__ + OBJ_acpiacadapter, + OBJ_adt746xcpu, + OBJ_adt746xfan, + OBJ_acpifan, + OBJ_acpitemp, + OBJ_acpitempf, + OBJ_battery, + OBJ_battery_time, + OBJ_battery_percent, + OBJ_battery_bar, +#endif /* !__OpenBSD__ */ + OBJ_buffers, + OBJ_cached, + OBJ_color, + OBJ_color0, + OBJ_color1, + OBJ_color2, + OBJ_color3, + OBJ_color4, + OBJ_color5, + OBJ_color6, + OBJ_color7, + OBJ_color8, + OBJ_color9, + OBJ_conky_version, + OBJ_conky_build_date, + OBJ_conky_build_arch, + OBJ_font, + OBJ_cpu, + OBJ_cpubar, + OBJ_cpugraph, + OBJ_diskio, + OBJ_diskio_read, + OBJ_diskio_write, + OBJ_diskiograph, + OBJ_diskiograph_read, + OBJ_diskiograph_write, + OBJ_downspeed, + OBJ_downspeedf, + OBJ_downspeedgraph, + OBJ_else, + OBJ_endif, + OBJ_image, + OBJ_exec, + OBJ_execi, + OBJ_texeci, + OBJ_execbar, + OBJ_execgraph, + OBJ_execibar, + OBJ_execigraph, + OBJ_execp, + OBJ_execpi, + OBJ_freq, + OBJ_freq_g, + OBJ_freq_dyn, + OBJ_freq_dyn_g, + OBJ_fs_bar, + OBJ_fs_bar_free, + OBJ_fs_free, + OBJ_fs_free_perc, + OBJ_fs_size, + OBJ_fs_type, + OBJ_fs_used, + OBJ_fs_used_perc, + OBJ_goto, + OBJ_tab, + OBJ_hr, + OBJ_offset, + OBJ_voffset, + OBJ_alignr, + OBJ_alignc, + OBJ_i2c, + OBJ_platform, + OBJ_hwmon, +#if defined(__linux__) + OBJ_disk_protect, + OBJ_i8k_version, + OBJ_i8k_bios, + OBJ_i8k_serial, + OBJ_i8k_cpu_temp, + OBJ_i8k_cpu_tempf, + OBJ_i8k_left_fan_status, + OBJ_i8k_right_fan_status, + OBJ_i8k_left_fan_rpm, + OBJ_i8k_right_fan_rpm, + OBJ_i8k_ac_status, + OBJ_i8k_buttons_status, + OBJ_ibm_fan, + OBJ_ibm_temps, + OBJ_ibm_volume, + OBJ_ibm_brightness, + OBJ_if_up, + OBJ_if_gw, + OBJ_ioscheduler, + OBJ_gw_iface, + OBJ_gw_ip, + OBJ_laptop_mode, + OBJ_pb_battery, + OBJ_voltage_mv, + OBJ_voltage_v, + OBJ_wireless_essid, + OBJ_wireless_mode, + OBJ_wireless_bitrate, + OBJ_wireless_ap, + OBJ_wireless_link_qual, + OBJ_wireless_link_qual_max, + OBJ_wireless_link_qual_perc, + OBJ_wireless_link_bar, +#endif /* __linux__ */ + OBJ_if_empty, + OBJ_if_existing, + OBJ_if_mounted, + OBJ_if_running, + OBJ_top, + OBJ_top_mem, + OBJ_tail, + OBJ_head, + OBJ_kernel, + OBJ_loadavg, + OBJ_machine, + OBJ_mails, + OBJ_mboxscan, + OBJ_mem, + OBJ_membar, + OBJ_memgraph, + OBJ_memmax, + OBJ_memperc, + OBJ_mem_res, + OBJ_mem_vsize, + OBJ_mixer, + OBJ_mixerl, + OBJ_mixerr, + OBJ_mixerbar, + OBJ_mixerlbar, + OBJ_mixerrbar, + OBJ_nameserver, + OBJ_new_mails, + OBJ_nodename, + OBJ_pre_exec, + OBJ_processes, + OBJ_running_processes, + OBJ_shadecolor, + OBJ_outlinecolor, + OBJ_stippled_hr, + OBJ_swap, + OBJ_swapbar, + OBJ_swapmax, + OBJ_swapperc, + OBJ_sysname, + OBJ_temp1, /* i2c is used instead in these */ + OBJ_temp2, + OBJ_text, + OBJ_time, + OBJ_utime, + OBJ_tztime, + OBJ_totaldown, + OBJ_totalup, + OBJ_updates, + OBJ_upspeed, + OBJ_upspeedf, + OBJ_upspeedgraph, + OBJ_uptime, + OBJ_uptime_short, + OBJ_user_names, + OBJ_user_terms, + OBJ_user_times, + OBJ_user_number, + OBJ_imap, + OBJ_imap_messages, + OBJ_imap_unseen, + OBJ_pop3, + OBJ_pop3_unseen, + OBJ_pop3_used, +#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \ + || defined(__OpenBSD__)) && (defined(i386) || defined(__i386__)) + OBJ_apm_adapter, + OBJ_apm_battery_time, + OBJ_apm_battery_life, +#endif /* __FreeBSD__ __OpenBSD__ */ +#ifdef __OpenBSD__ + OBJ_obsd_sensors_temp, + OBJ_obsd_sensors_fan, + OBJ_obsd_sensors_volt, + OBJ_obsd_vendor, + OBJ_obsd_product, +#endif /* __OpenBSD__ */ +#ifdef MPD + OBJ_mpd_title, + OBJ_mpd_artist, + OBJ_mpd_album, + OBJ_mpd_random, + OBJ_mpd_repeat, + OBJ_mpd_vol, + OBJ_mpd_bitrate, + OBJ_mpd_status, + OBJ_mpd_host, + OBJ_mpd_port, + OBJ_mpd_password, + OBJ_mpd_bar, + OBJ_mpd_elapsed, + OBJ_mpd_length, + OBJ_mpd_track, + OBJ_mpd_name, + OBJ_mpd_file, + OBJ_mpd_percent, + OBJ_mpd_smart, +#endif + OBJ_music_player_interval, +#ifdef XMMS2 + OBJ_xmms2_artist, + OBJ_xmms2_album, + OBJ_xmms2_title, + OBJ_xmms2_genre, + OBJ_xmms2_comment, + OBJ_xmms2_url, + OBJ_xmms2_date, + OBJ_xmms2_tracknr, + OBJ_xmms2_bitrate, + OBJ_xmms2_id, + OBJ_xmms2_duration, + OBJ_xmms2_elapsed, + OBJ_xmms2_size, + OBJ_xmms2_percent, + OBJ_xmms2_status, + OBJ_xmms2_bar, + OBJ_xmms2_smart, + OBJ_xmms2_playlist, + OBJ_xmms2_timesplayed, +#endif #ifdef AUDACIOUS + OBJ_audacious_status, + OBJ_audacious_title, + OBJ_audacious_length, + OBJ_audacious_length_seconds, + OBJ_audacious_position, + OBJ_audacious_position_seconds, + OBJ_audacious_bitrate, + OBJ_audacious_frequency, + OBJ_audacious_channels, + OBJ_audacious_filename, + OBJ_audacious_playlist_length, + OBJ_audacious_playlist_position, + OBJ_audacious_bar, +#endif +#ifdef BMPX + OBJ_bmpx_title, + OBJ_bmpx_artist, + OBJ_bmpx_album, + OBJ_bmpx_track, + OBJ_bmpx_uri, + OBJ_bmpx_bitrate, +#endif +#ifdef RSS + OBJ_rss, +#endif +#ifdef TCP_PORT_MONITOR + OBJ_tcp_portmon, +#endif +#ifdef HAVE_ICONV + OBJ_iconv_start, + OBJ_iconv_stop, +#endif +#ifdef HDDTEMP + OBJ_hddtemp, +#endif +#ifdef SMAPI + OBJ_smapi, + OBJ_smapi_bat_bar, + OBJ_smapi_bat_perc, + OBJ_if_smapi_bat_installed, +#endif + OBJ_entropy_avail, + OBJ_entropy_poolsize, + OBJ_entropy_bar +}; + +struct local_mail_s { + char *box; + int mail_count; + int new_mail_count; + float interval; + time_t last_mtime; + double last_update; +}; + +struct text_object { + union { + char *s; /* some string */ + int i; /* some integer */ + long l; /* some other integer */ + unsigned int sensor; + struct net_stat *net; + struct fs_stat *fs; + struct diskio_stat *diskio; + unsigned char loadavg[3]; + unsigned int cpu_index; + struct mail_s *mail; + + struct { + char *args; + char *output; + } mboxscan; + + struct { + char *tz; /* timezone variable */ + char *fmt; /* time display formatting */ + } tztime; + + struct { + struct fs_stat *fs; + int w, h; + } fsbar; /* 3 */ + + struct { + int l; + int w, h; + } mixerbar; /* 3 */ + + struct { + int fd; + int arg; + char devtype[256]; + char type[64]; + } sysfs; /* 2 */ + + struct { + int pos; + char *s; + char *str; + } ifblock; + + struct { + int num; + int type; + } top; + + struct { + int wantedlines; + int readlines; + char *logfile; + double last_update; + float interval; + char *buffer; + /* If not -1, a file descriptor to read from when + * logfile is a FIFO. */ + int fd; + } tail; + + struct { + double last_update; + float interval; + char *cmd; + char *buffer; + double data; + } execi; /* 5 */ + + struct { + float interval; + char *cmd; + char *buffer; + double data; + timed_thread *p_timed_thread; + } texeci; + + struct { + int a, b; + } pair; /* 2 */ +#ifdef TCP_PORT_MONITOR + struct { + /* starting port to monitor */ + in_port_t port_range_begin; + /* ending port to monitor */ + in_port_t port_range_end; + /* enum from libtcp-portmon.h, e.g. COUNT, etc. */ + int item; + /* 0 to n-1 connections. */ + int connection_index; + } tcp_port_monitor; +#endif +#ifdef HDDTEMP + struct { + char *addr; + int port; + char *dev; + } hddtemp; /* 2 */ +#endif +#ifdef RSS + struct { + char *uri; + char *action; + int act_par; + int delay; + } rss; +#endif + struct local_mail_s local_mail; + } data; + int type; + int a, b; + long line; + unsigned int c, d, e; + float f; + char global_mode; +}; + +struct object_methods { + void (*init_func)(enum text_object_type type, const char *arg, struct text_object *obj, unsigned int object_count); + void (*exit_func)(enum text_object_type type, struct text_object obj); + void (*print_func)(enum text_object_type type, char *p, unsigned int p_max, struct text_object *obj, unsigned int *i); +}; + +/* if-blocks */ +#define MAX_IF_BLOCK_DEPTH 5 +extern int blockdepth; +extern int if_jumped; +extern int blockstart[]; + +/* pad percentages to decimals? */ +extern int pad_percents; + +#ifdef AUDACIOUS #include "audacious.h" #endif @@ -517,7 +943,10 @@ int cpu_separate; int short_units; -/* in common.c */ +/* in conky.c */ +int spaced_print(char *, int, const char *, int, const char *, ...); +const char *scan_bar(const char *, int *, int *); +void new_bar(char *, int, int, int); /* struct that has all info */ struct information info; @@ -644,15 +1073,6 @@ float totalmem; }; -struct local_mail_s { - char *box; - int mail_count; - int new_mail_count; - float interval; - time_t last_mtime; - double last_update; -}; - void update_top(void); void free_all_processes(void); struct process *get_first_process(void); Modified: branches/conky1-mod/src/smapi.c =================================================================== --- branches/conky1-mod/src/smapi.c 2008-03-30 20:53:00 UTC (rev 1085) +++ branches/conky1-mod/src/smapi.c 2008-03-30 20:58:42 UTC (rev 1086) @@ -27,6 +27,12 @@ #define SYS_SMAPI_PATH "/sys/devices/platform/smapi" +struct object_methods smapi_methods = { + .init_func = &smapi_init, + .exit_func = &smapi_exit, + .print_func = &smapi_print, +}; + int smapi_bat_installed(int idx) { char path[128]; @@ -118,3 +124,110 @@ return smapi_get_str(str); } + +void smapi_init(enum text_object_type type, const char *arg, struct text_object *obj, unsigned int object_count) +{ + switch(type) { + case OBJ_smapi: + if (arg) + obj->data.s = strdup(arg); + else + ERR("smapi needs an argument"); + break; + case OBJ_if_smapi_bat_installed: + if (blockdepth >= MAX_IF_BLOCK_DEPTH) { + CRIT_ERR("MAX_IF_BLOCK_DEPTH exceeded"); + } + if (!arg) { + ERR("if_smapi_bat_installed needs an argument"); + obj->data.ifblock.s = 0; + } else + obj->data.ifblock.s = strdup(arg); + blockstart[blockdepth] = object_count; + obj->data.ifblock.pos = object_count + 2; + blockdepth++; + break; + case OBJ_smapi_bat_perc: + if (arg) + obj->data.s = strdup(arg); + else + ERR("smapi_bat_perc needs an argument"); + break; + case OBJ_smapi_bat_bar: + if(arg) { + int cnt; + if(sscanf(arg, "%i %n", &obj->data.i, &cnt) <= 0) { + ERR("first argument to smapi_bat_bar must be an integer value"); + obj->data.i = -1; + } else { + obj->b = 4; + arg = scan_bar(arg + cnt, &obj->a, &obj->b); + } + } else + ERR("if_smapi_bat_bar needs an argument"); + break; + default: + CRIT_ERR("called smapi_init with unknown object type"); + break; + } +} + +void smapi_exit(enum text_object_type type, struct text_object obj) +{ + switch(type) { + case OBJ_smapi: + case OBJ_smapi_bat_perc: + free(obj.data.s); + break; + case OBJ_if_smapi_bat_installed: + free(obj.data.ifblock.s); + free(obj.data.ifblock.str); + break; + default: + CRIT_ERR("called smapi_exit with unknown object type"); + break; + } +} + +void smapi_print(enum text_object_type type, char *p, unsigned int p_max_size, struct text_object *obj, unsigned int *i) +{ + char *s; + int idx, val; + + switch(type) { + case OBJ_smapi: + if(obj->data.s) { + s = smapi_get_val(obj->data.s); + snprintf(p, p_max_size, "%s", s); + free(s); + } + break; + case OBJ_if_smapi_bat_installed: + if(obj->data.ifblock.s && sscanf(obj->data.ifblock.s, "%i", &idx) == 1) { + if(!smapi_bat_installed(idx)) { + *i = obj->data.ifblock.pos; + if_jumped = 1; + } else + if_jumped = 0; + } else + ERR("argument to if_smapi_bat_installed must be an integer"); + break; + case OBJ_smapi_bat_perc: + if(obj->data.s && sscanf(obj->data.s, "%i", &idx) == 1) { + val = smapi_bat_installed(idx) ? + smapi_get_bat_int(idx, "remaining_percent") : 0; + spaced_print(p, p_max_size, "%*d", 4, "smapi_bat_perc", pad_percents, val); + } else + ERR("argument to smapi_bat_perc must be an integer"); + break; + case OBJ_smapi_bat_bar: + if(obj->data.i >= 0 && smapi_bat_installed(obj->data.i)) + new_bar(p, obj->a, obj->b, (int) + (255 * smapi_get_bat_int(obj->data.i, "remaining_percent") / 100)); + else + new_bar(p, obj->a, obj->b, 0); + break; + default: + CRIT_ERR("called smapi_print with unknown object type"); + } +} Modified: branches/conky1-mod/src/smapi.h =================================================================== --- branches/conky1-mod/src/smapi.h 2008-03-30 20:53:00 UTC (rev 1085) +++ branches/conky1-mod/src/smapi.h 2008-03-30 20:58:42 UTC (rev 1086) @@ -24,6 +24,8 @@ #ifndef SMAPI_H #define SMAPI_H +#include "smapi.h" + int smapi_bat_installed(int); char *smapi_read_str(const char *); @@ -36,4 +38,8 @@ int smapi_get_bat_int(int, const char *); char *smapi_get_bat_val(const char *); +void smapi_init(enum text_object_type, const char *, struct text_object *, unsigned int); +void smapi_exit(enum text_object_type, struct text_object); +void smapi_print(enum text_object_type, char *, unsigned int, struct text_object *, unsigned int *); + #endif /* SMAPI_H */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |