Meter.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #ifndef HEADER_Meter
  2. #define HEADER_Meter
  3. /*
  4. htop - Meter.h
  5. (C) 2004-2011 Hisham H. Muhammad
  6. Released under the GNU GPLv2+, see the COPYING file
  7. in the source distribution for its full text.
  8. */
  9. #include <stdbool.h>
  10. #include <stddef.h>
  11. #include <stdint.h>
  12. #include <sys/time.h>
  13. #include "ListItem.h"
  14. #include "Machine.h"
  15. #include "Macros.h"
  16. #include "MeterMode.h"
  17. #include "Object.h"
  18. #define METER_TXTBUFFER_LEN 256
  19. #define MAX_METER_GRAPHDATA_VALUES 32768
  20. #define METER_BUFFER_CHECK(buffer, size, written) \
  21. do { \
  22. if ((written) < 0 || (size_t)(written) >= (size)) { \
  23. return; \
  24. } \
  25. (buffer) += (written); \
  26. (size) -= (size_t)(written); \
  27. } while (0)
  28. #define METER_BUFFER_APPEND_CHR(buffer, size, c) \
  29. do { \
  30. if ((size) < 2) { \
  31. return; \
  32. } \
  33. *(buffer)++ = c; \
  34. *(buffer) = '\0'; \
  35. (size)--; \
  36. if ((size) == 0) { \
  37. return; \
  38. } \
  39. } while (0)
  40. struct Meter_;
  41. typedef struct Meter_ Meter;
  42. typedef ATTR_NONNULL void (*Meter_Init)(Meter*);
  43. typedef ATTR_NONNULL void (*Meter_Done)(Meter*);
  44. typedef ATTR_NONNULL void (*Meter_UpdateMode)(Meter*, MeterModeId);
  45. typedef ATTR_NONNULL void (*Meter_UpdateValues)(Meter*);
  46. typedef ATTR_NONNULL void (*Meter_Draw)(Meter*, int, int, int);
  47. typedef ATTR_NONNULL const char* (*Meter_GetCaption)(const Meter*);
  48. typedef ATTR_NONNULL ATTR_ACCESS3_W(2, 3) void (*Meter_GetUiName)(const Meter*, char*, size_t);
  49. typedef struct MeterClass_ {
  50. const ObjectClass super;
  51. const Meter_Init init;
  52. const Meter_Done done;
  53. const Meter_UpdateMode updateMode;
  54. const Meter_UpdateValues updateValues;
  55. const Meter_Draw draw;
  56. const Meter_GetCaption getCaption;
  57. const Meter_GetUiName getUiName;
  58. const MeterModeId defaultMode;
  59. const uint32_t supportedModes; /* bitset of supported modes, 1<<mode_id */
  60. const double total;
  61. const int* const attributes;
  62. const char* const name; /* internal name of the meter, must not contain any space */
  63. const char* const uiName; /* display name in header setup menu */
  64. const char* const caption; /* prefix in the actual header */
  65. const char* const description; /* optional meter description in header setup menu */
  66. const uint8_t maxItems;
  67. const bool isMultiColumn; /* whether the meter draws multiple sub-columns (defaults to false) */
  68. } MeterClass;
  69. #define As_Meter(this_) ((const MeterClass*)((this_)->super.klass))
  70. #define Meter_initFn(this_) As_Meter(this_)->init
  71. #define Meter_init(this_) As_Meter(this_)->init((Meter*)(this_))
  72. #define Meter_done(this_) As_Meter(this_)->done((Meter*)(this_))
  73. #define Meter_updateModeFn(this_) As_Meter(this_)->updateMode
  74. #define Meter_updateMode(this_, m_) As_Meter(this_)->updateMode((Meter*)(this_), m_)
  75. #define Meter_drawFn(this_) As_Meter(this_)->draw
  76. #define Meter_doneFn(this_) As_Meter(this_)->done
  77. #define Meter_updateValues(this_) As_Meter(this_)->updateValues((Meter*)(this_))
  78. #define Meter_getUiNameFn(this_) As_Meter(this_)->getUiName
  79. #define Meter_getUiName(this_,n_,l_) As_Meter(this_)->getUiName((const Meter*)(this_),n_,l_)
  80. #define Meter_getCaptionFn(this_) As_Meter(this_)->getCaption
  81. #define Meter_getCaption(this_) (Meter_getCaptionFn(this_) ? As_Meter(this_)->getCaption((const Meter*)(this_)) : (this_)->caption)
  82. #define Meter_supportedModes(this_) As_Meter(this_)->supportedModes
  83. #define Meter_attributes(this_) As_Meter(this_)->attributes
  84. #define Meter_name(this_) As_Meter(this_)->name
  85. #define Meter_uiName(this_) As_Meter(this_)->uiName
  86. #define Meter_isMultiColumn(this_) As_Meter(this_)->isMultiColumn
  87. typedef struct GraphData_ {
  88. struct timeval time;
  89. size_t nValues;
  90. double* values;
  91. } GraphData;
  92. struct Meter_ {
  93. Object super;
  94. Meter_Draw draw;
  95. const Machine* host;
  96. char* caption;
  97. MeterModeId mode;
  98. unsigned int param;
  99. GraphData drawData;
  100. int h;
  101. int columnWidthCount; /**< only used internally by the Header */
  102. uint8_t curItems;
  103. const int* curAttributes;
  104. char txtBuffer[METER_TXTBUFFER_LEN];
  105. double* values;
  106. double total;
  107. void* meterData;
  108. };
  109. typedef enum {
  110. RATESTATUS_DATA,
  111. RATESTATUS_INIT,
  112. RATESTATUS_NODATA,
  113. RATESTATUS_STALE
  114. } MeterRateStatus;
  115. extern const MeterClass Meter_class;
  116. Meter* Meter_new(const Machine* host, unsigned int param, const MeterClass* type);
  117. /* Converts 'value' in kibibytes into a human readable string.
  118. Example output strings: "0K", "1023K", "98.7M" and "1.23G" */
  119. int Meter_humanUnit(char* buffer, double value, size_t size);
  120. void Meter_delete(Object* cast);
  121. void Meter_setCaption(Meter* this, const char* caption);
  122. void Meter_setMode(Meter* this, MeterModeId modeIndex);
  123. MeterModeId Meter_nextSupportedMode(const Meter* this);
  124. ListItem* Meter_toListItem(const Meter* this, bool moving);
  125. extern const MeterClass BlankMeter_class;
  126. #endif