123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- #ifndef HEADER_Meter
- #define HEADER_Meter
- /*
- htop - Meter.h
- (C) 2004-2011 Hisham H. Muhammad
- Released under the GNU GPLv2+, see the COPYING file
- in the source distribution for its full text.
- */
- #include <stdbool.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <sys/time.h>
- #include "ListItem.h"
- #include "Machine.h"
- #include "Macros.h"
- #include "MeterMode.h"
- #include "Object.h"
- #define METER_TXTBUFFER_LEN 256
- #define MAX_METER_GRAPHDATA_VALUES 32768
- #define METER_BUFFER_CHECK(buffer, size, written) \
- do { \
- if ((written) < 0 || (size_t)(written) >= (size)) { \
- return; \
- } \
- (buffer) += (written); \
- (size) -= (size_t)(written); \
- } while (0)
- #define METER_BUFFER_APPEND_CHR(buffer, size, c) \
- do { \
- if ((size) < 2) { \
- return; \
- } \
- *(buffer)++ = c; \
- *(buffer) = '\0'; \
- (size)--; \
- if ((size) == 0) { \
- return; \
- } \
- } while (0)
- struct Meter_;
- typedef struct Meter_ Meter;
- typedef ATTR_NONNULL void (*Meter_Init)(Meter*);
- typedef ATTR_NONNULL void (*Meter_Done)(Meter*);
- typedef ATTR_NONNULL void (*Meter_UpdateMode)(Meter*, MeterModeId);
- typedef ATTR_NONNULL void (*Meter_UpdateValues)(Meter*);
- typedef ATTR_NONNULL void (*Meter_Draw)(Meter*, int, int, int);
- typedef ATTR_NONNULL const char* (*Meter_GetCaption)(const Meter*);
- typedef ATTR_NONNULL ATTR_ACCESS3_W(2, 3) void (*Meter_GetUiName)(const Meter*, char*, size_t);
- typedef struct MeterClass_ {
- const ObjectClass super;
- const Meter_Init init;
- const Meter_Done done;
- const Meter_UpdateMode updateMode;
- const Meter_UpdateValues updateValues;
- const Meter_Draw draw;
- const Meter_GetCaption getCaption;
- const Meter_GetUiName getUiName;
- const MeterModeId defaultMode;
- const uint32_t supportedModes; /* bitset of supported modes, 1<<mode_id */
- const double total;
- const int* const attributes;
- const char* const name; /* internal name of the meter, must not contain any space */
- const char* const uiName; /* display name in header setup menu */
- const char* const caption; /* prefix in the actual header */
- const char* const description; /* optional meter description in header setup menu */
- const uint8_t maxItems;
- const bool isMultiColumn; /* whether the meter draws multiple sub-columns (defaults to false) */
- } MeterClass;
- #define As_Meter(this_) ((const MeterClass*)((this_)->super.klass))
- #define Meter_initFn(this_) As_Meter(this_)->init
- #define Meter_init(this_) As_Meter(this_)->init((Meter*)(this_))
- #define Meter_done(this_) As_Meter(this_)->done((Meter*)(this_))
- #define Meter_updateModeFn(this_) As_Meter(this_)->updateMode
- #define Meter_updateMode(this_, m_) As_Meter(this_)->updateMode((Meter*)(this_), m_)
- #define Meter_drawFn(this_) As_Meter(this_)->draw
- #define Meter_doneFn(this_) As_Meter(this_)->done
- #define Meter_updateValues(this_) As_Meter(this_)->updateValues((Meter*)(this_))
- #define Meter_getUiNameFn(this_) As_Meter(this_)->getUiName
- #define Meter_getUiName(this_,n_,l_) As_Meter(this_)->getUiName((const Meter*)(this_),n_,l_)
- #define Meter_getCaptionFn(this_) As_Meter(this_)->getCaption
- #define Meter_getCaption(this_) (Meter_getCaptionFn(this_) ? As_Meter(this_)->getCaption((const Meter*)(this_)) : (this_)->caption)
- #define Meter_supportedModes(this_) As_Meter(this_)->supportedModes
- #define Meter_attributes(this_) As_Meter(this_)->attributes
- #define Meter_name(this_) As_Meter(this_)->name
- #define Meter_uiName(this_) As_Meter(this_)->uiName
- #define Meter_isMultiColumn(this_) As_Meter(this_)->isMultiColumn
- typedef struct GraphData_ {
- struct timeval time;
- size_t nValues;
- double* values;
- } GraphData;
- struct Meter_ {
- Object super;
- Meter_Draw draw;
- const Machine* host;
- char* caption;
- MeterModeId mode;
- unsigned int param;
- GraphData drawData;
- int h;
- int columnWidthCount; /**< only used internally by the Header */
- uint8_t curItems;
- const int* curAttributes;
- char txtBuffer[METER_TXTBUFFER_LEN];
- double* values;
- double total;
- void* meterData;
- };
- typedef enum {
- RATESTATUS_DATA,
- RATESTATUS_INIT,
- RATESTATUS_NODATA,
- RATESTATUS_STALE
- } MeterRateStatus;
- extern const MeterClass Meter_class;
- Meter* Meter_new(const Machine* host, unsigned int param, const MeterClass* type);
- /* Converts 'value' in kibibytes into a human readable string.
- Example output strings: "0K", "1023K", "98.7M" and "1.23G" */
- int Meter_humanUnit(char* buffer, double value, size_t size);
- void Meter_delete(Object* cast);
- void Meter_setCaption(Meter* this, const char* caption);
- void Meter_setMode(Meter* this, MeterModeId modeIndex);
- MeterModeId Meter_nextSupportedMode(const Meter* this);
- ListItem* Meter_toListItem(const Meter* this, bool moving);
- extern const MeterClass BlankMeter_class;
- #endif
|