diff --git a/CMakeLists.txt b/CMakeLists.txt index 5757a6def..f28620b3c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -242,6 +242,7 @@ set(LIBFASTFETCH_SRC src/modules/colors.c src/modules/opengl.c src/modules/opencl.c + src/modules/users.c ) if(BSD OR APPLE) diff --git a/presets/all b/presets/all index 104f28551..6bd7c776d 100644 --- a/presets/all +++ b/presets/all @@ -1 +1 @@ ---structure Title:Separator:OS:Host:Kernel:Uptime:Processes:Packages:Shell:Resolution:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Terminal:TerminalFont:CPU:GPU:Memory:Swap:Disk:Battery:PowerAdapter:Player:Song:PublicIP:LocalIP:DateTime:Locale:Vulkan:OpenGL:OpenCL:Break:Colors +--structure Title:Separator:OS:Host:Kernel:Uptime:Processes:Packages:Shell:Resolution:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Terminal:TerminalFont:CPU:GPU:Memory:Swap:Disk:Battery:PowerAdapter:Player:Song:PublicIP:LocalIP:DateTime:Locale:Vulkan:OpenGL:OpenCL:Users:Break:Colors diff --git a/src/fastfetch.c b/src/fastfetch.c index 976235278..1f021d05e 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1436,6 +1436,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintOpenGL(instance); else if(strcasecmp(line, "opencl") == 0) ffPrintOpenCL(instance); + else if(strcasecmp(line, "users") == 0) + ffPrintUsers(instance); else ffPrintErrorString(instance, line, 0, NULL, NULL, ""); } diff --git a/src/fastfetch.h b/src/fastfetch.h index 058bd324e..6665b3bc8 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -276,5 +276,6 @@ void ffPrintColors(FFinstance* instance); void ffPrintVulkan(FFinstance* instance); void ffPrintOpenGL(FFinstance* instance); void ffPrintOpenCL(FFinstance* instance); +void ffPrintUsers(FFinstance* instance); #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index 8688b918c..296d589f0 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -52,6 +52,7 @@ int main(int argc, char** argv) //ffPrintVulkan(&instance); //ffPrintOpenGL(&instance); //ffPrintOpenCL(&instance); + //ffPrintUsers(&instance); ffPrintBreak(&instance); ffPrintColors(&instance); diff --git a/src/modules/users.c b/src/modules/users.c new file mode 100644 index 000000000..880b14c35 --- /dev/null +++ b/src/modules/users.c @@ -0,0 +1,54 @@ +#include "fastfetch.h" +#include "common/printing.h" + +#include + +#define FF_USERS_MODULE_NAME "Users" +#define FF_USERS_NUM_FORMAT_ARGS 1 + +void ffPrintUsers(FFinstance* instance) +{ + struct utmpx* n = NULL; + setutxent(); + + FFlist users; + ffListInit(&users, sizeof(n->ut_user)); + +next: + while((n = getutxent())) + { + if(n->ut_type == USER_PROCESS) + { + for(uint32_t i = 0; i < users.length; ++i) + { + if(strcmp((const char*)ffListGet(&users, i), n->ut_user) == 0) + goto next; + } + strcpy((char*)ffListAdd(&users), n->ut_user); + } + } + + FFstrbuf result; + ffStrbufInit(&result); + for(uint32_t i = 0; i < users.length; ++i) + { + if(i > 0) + ffStrbufAppendS(&result, ", "); + ffStrbufAppendS(&result, (const char*)ffListGet(&users, i)); + } + ffListDestroy(&users); + + if(instance->config.uptime.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_USERS_MODULE_NAME, 0, &instance->config.uptime.key); + puts(result.chars); + } + else + { + ffPrintFormat(instance, FF_USERS_MODULE_NAME, 0, &instance->config.uptime, FF_USERS_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &result}, + }); + } + + ffStrbufDestroy(&result); +}