ff4ff35918
Red Bear OS is a full fork. All sources must be available from git clone with zero network access. Removed gitignore rules that excluded fetched source trees under recipes/*/source/, local/recipes/kde/*/source/, local/recipes/qt/*/source/, and vendor source trees. Build artifacts (target/, build/, source.tar, *.o, *.so) remain excluded. 127291 files added — kernel, relibc, base, bootloader, pkgar, all KDE/Qt frameworks, mesa, wayland, DRM drivers, and every other recipe source.
89 lines
2.2 KiB
C
89 lines
2.2 KiB
C
/*
|
|
htop - CommandScreen.c
|
|
(C) 2017,2020 ryenus
|
|
(C) 2020,2021 htop dev team
|
|
Released under the GNU GPLv2+, see the COPYING file
|
|
in the source distribution for its full text.
|
|
*/
|
|
|
|
#include "config.h" // IWYU pragma: keep
|
|
|
|
#include "CommandScreen.h"
|
|
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "Macros.h"
|
|
#include "Panel.h"
|
|
#include "ProvideCurses.h"
|
|
|
|
|
|
static void CommandScreen_scan(InfoScreen* this) {
|
|
Panel* panel = this->display;
|
|
int idx = MAXIMUM(Panel_getSelectedIndex(panel), 0);
|
|
Panel_prune(panel);
|
|
|
|
const char* p = Process_getCommand(this->process);
|
|
|
|
size_t line_maxlen = COLS < 40 ? 40 : COLS;
|
|
size_t line_offset = 0;
|
|
size_t last_space = 0;
|
|
char* line = xCalloc(line_maxlen + 1, sizeof(char));
|
|
|
|
for (; *p != '\0'; p++) {
|
|
if (line_offset >= line_maxlen) {
|
|
assert(line_offset <= line_maxlen);
|
|
assert(last_space <= line_maxlen);
|
|
|
|
size_t line_len = last_space <= 0 ? line_offset : last_space;
|
|
char tmp = line[line_len];
|
|
line[line_len] = '\0';
|
|
InfoScreen_addLine(this, line);
|
|
line[line_len] = tmp;
|
|
|
|
assert(line_len <= line_offset);
|
|
line_offset -= line_len;
|
|
memmove(line, line + line_len, line_offset);
|
|
|
|
last_space = 0;
|
|
}
|
|
|
|
line[line_offset++] = *p;
|
|
if (*p == ' ') {
|
|
last_space = line_offset;
|
|
}
|
|
}
|
|
|
|
if (line_offset > 0) {
|
|
line[line_offset] = '\0';
|
|
InfoScreen_addLine(this, line);
|
|
}
|
|
|
|
free(line);
|
|
|
|
Panel_setSelected(panel, idx);
|
|
}
|
|
|
|
static void CommandScreen_draw(InfoScreen* this) {
|
|
InfoScreen_drawTitled(this, "Command of process %d - %s", Process_getPid(this->process), Process_getCommand(this->process));
|
|
}
|
|
|
|
const InfoScreenClass CommandScreen_class = {
|
|
.super = {
|
|
.extends = Class(Object),
|
|
.delete = CommandScreen_delete
|
|
},
|
|
.scan = CommandScreen_scan,
|
|
.draw = CommandScreen_draw
|
|
};
|
|
|
|
CommandScreen* CommandScreen_new(Process* process) {
|
|
CommandScreen* this = AllocThis(CommandScreen);
|
|
return (CommandScreen*) InfoScreen_init(&this->super, process, NULL, LINES - 2, " ");
|
|
}
|
|
|
|
void CommandScreen_delete(Object* this) {
|
|
free(InfoScreen_done((InfoScreen*)this));
|
|
}
|