blob: cd9c9b8eaec82bf4b85dc7634dcf5b60db25d456 [file] [log] [blame]
Hisham Muhammadd6231ba2006-03-04 18:16:49 +00001#ifndef HEADER_Meter
2#define HEADER_Meter
3/*
Hisham Muhammadf6e0b7d2006-06-06 20:28:42 +00004htop - Meter.h
Hisham Muhammad300caa02011-05-26 16:35:07 +00005(C) 2004-2011 Hisham H. Muhammad
Daniel Lange079c2ab2020-10-05 09:51:32 +02006Released under the GNU GPLv2, see the COPYING file
Hisham Muhammadd6231ba2006-03-04 18:16:49 +00007in the source distribution for its full text.
8*/
9
Christian Göttsche4c66eb62020-10-03 21:20:43 +020010#include "config.h" // IWYU pragma: keep
11
Benny Baumann0f526292020-09-19 13:55:23 +020012#include <stdbool.h>
mayurdahibhate1b74dfe2021-04-29 20:42:43 +053013#include <stddef.h>
Christian Göttsche7cf52772020-11-18 14:26:30 +010014#include <stdint.h>
Hisham Muhammad3383d8e2015-01-21 23:27:31 -020015#include <sys/time.h>
Hisham Muhammadd6231ba2006-03-04 18:16:49 +000016
Benny Baumanne1c96872020-09-18 19:23:04 +020017#include "ListItem.h"
Benny Baumann0f526292020-09-19 13:55:23 +020018#include "Object.h"
19#include "ProcessList.h"
20
Benny Baumanne1c96872020-09-18 19:23:04 +020021
Christian Göttsche2d1042a2020-10-06 13:13:16 +020022#define METER_TXTBUFFER_LEN 256
23#define METER_GRAPHDATA_SIZE 256
Hugo Musso Gualandi92074012020-09-12 18:25:25 -030024
Christian Göttschead764ff2020-11-24 19:34:27 +010025#define METER_BUFFER_CHECK(buffer, size, written) \
26 do { \
27 if ((written) < 0 || (size_t)(written) >= (size)) { \
28 return; \
29 } \
30 (buffer) += (written); \
31 (size) -= (size_t)(written); \
32 } while (0)
33
34#define METER_BUFFER_APPEND_CHR(buffer, size, c) \
35 do { \
36 if ((size) < 2) { \
37 return; \
38 } \
39 *(buffer)++ = c; \
40 *(buffer) = '\0'; \
41 (size)--; \
42 if ((size) == 0) { \
43 return; \
44 } \
45 } while (0)
46
47
Benny Baumann0f526292020-09-19 13:55:23 +020048struct Meter_;
Hisham Muhammadd6231ba2006-03-04 18:16:49 +000049typedef struct Meter_ Meter;
50
Hisham Muhammad00b324b2012-12-05 15:12:20 +000051typedef void(*Meter_Init)(Meter*);
52typedef void(*Meter_Done)(Meter*);
53typedef void(*Meter_UpdateMode)(Meter*, int);
Christian Göttsche2d1042a2020-10-06 13:13:16 +020054typedef void(*Meter_UpdateValues)(Meter*);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +000055typedef void(*Meter_Draw)(Meter*, int, int, int);
56
Hisham Muhammad00b324b2012-12-05 15:12:20 +000057typedef struct MeterClass_ {
Christian Göttsche08d85e62020-10-04 17:55:08 +020058 const ObjectClass super;
Hisham Muhammad00b324b2012-12-05 15:12:20 +000059 const Meter_Init init;
60 const Meter_Done done;
61 const Meter_UpdateMode updateMode;
62 const Meter_Draw draw;
Explorer099dea20e2016-05-04 13:39:26 +080063 const Meter_UpdateValues updateValues;
Hisham Muhammad00b324b2012-12-05 15:12:20 +000064 const int defaultMode;
Hisham Muhammad00b324b2012-12-05 15:12:20 +000065 const double total;
Christian Göttsche08d85e62020-10-04 17:55:08 +020066 const int* const attributes;
Christian Göttsche472f0122020-11-29 15:26:57 +010067 const char* const name; /* internal name of the meter, must not contain any space */
68 const char* const uiName; /* display name in header setup menu */
69 const char* const caption; /* prefix in the actual header */
70 const char* const description; /* optional meter description in header setup menu */
Christian Göttsche43d274a2020-10-29 23:17:12 +010071 const uint8_t maxItems;
Hisham Muhammad00b324b2012-12-05 15:12:20 +000072} MeterClass;
73
Christian Göttsche08d85e62020-10-04 17:55:08 +020074#define As_Meter(this_) ((const MeterClass*)((this_)->super.klass))
Hisham Muhammad00b324b2012-12-05 15:12:20 +000075#define Meter_initFn(this_) As_Meter(this_)->init
76#define Meter_init(this_) As_Meter(this_)->init((Meter*)(this_))
77#define Meter_done(this_) As_Meter(this_)->done((Meter*)(this_))
78#define Meter_updateModeFn(this_) As_Meter(this_)->updateMode
79#define Meter_updateMode(this_, m_) As_Meter(this_)->updateMode((Meter*)(this_), m_)
80#define Meter_drawFn(this_) As_Meter(this_)->draw
81#define Meter_doneFn(this_) As_Meter(this_)->done
Christian Göttsche2d1042a2020-10-06 13:13:16 +020082#define Meter_updateValues(this_) As_Meter(this_)->updateValues((Meter*)(this_))
Hisham Muhammad00b324b2012-12-05 15:12:20 +000083#define Meter_defaultMode(this_) As_Meter(this_)->defaultMode
Hisham Muhammad00b324b2012-12-05 15:12:20 +000084#define Meter_attributes(this_) As_Meter(this_)->attributes
85#define Meter_name(this_) As_Meter(this_)->name
86#define Meter_uiName(this_) As_Meter(this_)->uiName
Hisham Muhammadd6231ba2006-03-04 18:16:49 +000087
Christian Göttsche0b9a0012020-10-02 16:27:57 +020088typedef struct GraphData_ {
89 struct timeval time;
Christian Göttsche2d1042a2020-10-06 13:13:16 +020090 double values[METER_GRAPHDATA_SIZE];
Christian Göttsche0b9a0012020-10-02 16:27:57 +020091} GraphData;
92
Hisham Muhammadd6231ba2006-03-04 18:16:49 +000093struct Meter_ {
94 Object super;
Hisham Muhammad00b324b2012-12-05 15:12:20 +000095 Meter_Draw draw;
Daniel Flanagandd334442019-10-31 11:39:12 -050096
Hisham Muhammad33113fe2006-04-10 20:40:38 +000097 char* caption;
Hisham Muhammad33113fe2006-04-10 20:40:38 +000098 int mode;
Christian Göttschea11d0152021-02-17 17:38:35 +010099 unsigned int param;
Christian Göttsche0b9a0012020-10-02 16:27:57 +0200100 GraphData* drawData;
Hisham Muhammad33113fe2006-04-10 20:40:38 +0000101 int h;
Christian Göttsche2ec44092021-01-18 15:23:23 +0100102 int columnWidthCount; /*<< only used internally by the Header */
Christian Göttsche72103e92020-10-21 21:25:50 +0200103 const ProcessList* pl;
Christian Göttsche43d274a2020-10-29 23:17:12 +0100104 uint8_t curItems;
Christian Göttsche2c065662020-12-23 20:56:19 +0100105 const int* curAttributes;
Christian Göttsche2d1042a2020-10-06 13:13:16 +0200106 char txtBuffer[METER_TXTBUFFER_LEN];
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000107 double* values;
108 double total;
Christian Göttsche9f5b50e2020-09-23 11:58:11 +0200109 void* meterData;
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000110};
111
Hisham Muhammad00b324b2012-12-05 15:12:20 +0000112typedef struct MeterMode_ {
113 Meter_Draw draw;
114 const char* uiName;
115 int h;
116} MeterMode;
Hisham Muhammada9c0ea32011-03-22 20:37:08 +0000117
Hisham Muhammad33113fe2006-04-10 20:40:38 +0000118typedef enum {
119 CUSTOM_METERMODE = 0,
120 BAR_METERMODE,
121 TEXT_METERMODE,
Hisham Muhammad33113fe2006-04-10 20:40:38 +0000122 GRAPH_METERMODE,
123 LED_METERMODE,
Hisham Muhammad33113fe2006-04-10 20:40:38 +0000124 LAST_METERMODE
125} MeterModeId;
126
Christian Göttscheba282cf2020-10-05 13:19:50 +0200127extern const MeterClass Meter_class;
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000128
Christian Göttschea11d0152021-02-17 17:38:35 +0100129Meter* Meter_new(const ProcessList* pl, unsigned int param, const MeterClass* type);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000130
Christian Göttschee1ce1412020-11-24 18:31:03 +0100131int Meter_humanUnit(char* buffer, unsigned long int value, size_t size);
Christian Hesse6f58fbc2015-06-12 09:50:55 +0200132
Zev Weiss7b7822b2020-09-02 02:38:44 -0500133void Meter_delete(Object* cast);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000134
Zev Weiss7b7822b2020-09-02 02:38:44 -0500135void Meter_setCaption(Meter* this, const char* caption);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000136
Zev Weiss7b7822b2020-09-02 02:38:44 -0500137void Meter_setMode(Meter* this, int modeIndex);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000138
Christian Göttsched72b0a62021-01-05 23:42:55 +0100139ListItem* Meter_toListItem(const Meter* this, bool moving);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000140
Christian Göttscheba282cf2020-10-05 13:19:50 +0200141extern const MeterMode* const Meter_modes[];
Hisham Muhammadda23c8c2008-03-09 08:58:38 +0000142
Christian Göttscheba282cf2020-10-05 13:19:50 +0200143extern const MeterClass BlankMeter_class;
Hisham Muhammad6d90e582014-02-27 16:35:22 -0300144
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000145#endif