Compare commits

..

No commits in common. "master" and "v1.0.0" have entirely different histories.

53 changed files with 209 additions and 3294 deletions

4
.gitattributes vendored
View file

@ -1,4 +0,0 @@
*.cc whitespace=tab-in-indent,no-lf-at-eof,trailing-whitespace
*.h whitespace=tab-in-indent,no-lf-at-eof,trailing-whitespace
*.rst whitespace=tab-in-indent,no-lf-at-eof,trailing-whitespace
*.txt whitespace=tab-in-indent,no-lf-at-eof,trailing-whitespace

View file

@ -1,9 +0,0 @@
# Set update schedule for GitHub Actions
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
# Check for updates to GitHub Actions every weekday
interval: "daily"

View file

@ -1,22 +0,0 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '0 */8 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v11
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
exempt-issue-milestones: 'future,alpha,beta,release'
exempt-pr-milestones: 'bugfix,improvement'
exempt-all-pr-assignees: true
stale-issue-message: 'This issue is stale because it has been open 120 days with no activity. Remove stale label or comment or this will be closed in 15 days.'
stale-pr-message: 'This PR is stale because it has been open 120 days with no activity. Remove stale label or comment or this will be closed in 15 days.'
close-issue-message: 'This issue was closed because it has been stalled for 30 days with no activity.'
close-pr-message: 'This PR was closed because it has been stalled for 30 days with no activity.'
days-before-issue-stale: 120
days-before-pr-stale: 120
days-before-issue-close: 30
days-before-pr-close: 30

View file

@ -1,34 +0,0 @@
name: tmux-mem-cpu-load
on:
push:
branches:
- '*'
paths-ignore:
- '**/README.md'
- '**/README.rst'
pull_request:
branches:
- '*'
workflow_dispatch:
jobs:
image:
name: build ${{ matrix.arch_name }} ${{ matrix.build_type }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# Disable: unsupported system: android-arm, android-arm64, android-x86, android-x86_64, web-wasm,
# Disable: missing header in linux(GCC): windows-static-x64, windows-static-x64-posix, windows-static-x86, windows-shared-x64, windows-shared-x64-posix, windows-shared-x86,
# Disable: string-related vtable linker error: manylinux2014-aarch64
arch_name: [linux-arm64, linux-arm64-musl, linux-armv5, linux-armv5-musl, linux-armv6, linux-armv6-musl, linux-armv7, linux-armv7a, linux-armv7l-musl, linux-x64-clang, linux-s390x, linux-x64, linux-x86, linux-mips, linux-ppc64le, manylinux1-x64, manylinux1-x86, manylinux2010-x64, manylinux2010-x86, manylinux2014-x64, manylinux2014-x86, linux-riscv64, linux-riscv32]
build_type: [Release, Debug]
steps:
- name: "📥 Checkout Code"
uses: actions/checkout@v7
with:
submodules: 'recursive'
fetch-depth: 0
- name: "🛠️ build"
run: ./builder/cmake.sh ${{ matrix.arch_name }}:latest -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}

View file

@ -1,63 +0,0 @@
name: "tagged-release"
on:
push:
tags:
- "v[0-9]+.[0-9]+.[0-9]+*"
workflow_dispatch:
jobs:
build:
name: build ${{ matrix.arch_name }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# Disable: unsupported system: android-arm, android-arm64, android-x86, android-x86_64, web-wasm,
# Disable: missing header in linux(GCC): windows-static-x64, windows-static-x64-posix, windows-static-x86, windows-shared-x64, windows-shared-x64-posix, windows-shared-x86,
arch_name: [linux-arm64, linux-arm64-musl, linux-armv5, linux-armv5-musl, linux-armv6, linux-armv6-musl, linux-armv7, linux-armv7a, linux-armv7l-musl, linux-x64-clang, linux-s390x, linux-x64, linux-x86, linux-mips, linux-ppc64le, manylinux1-x64, manylinux1-x86, manylinux2010-x64, manylinux2010-x86, manylinux2014-x64, manylinux2014-x86, manylinux2014-aarch64, linux-riscv64, linux-riscv32]
steps:
- name: "📥 Checkout Code"
uses: actions/checkout@v7
with:
submodules: 'recursive'
fetch-depth: 0
- name: "🛠️ cmake"
run: ./builder/cmake.sh ${{ matrix.arch_name }}:latest -DCMAKE_BUILD_TYPE=Release
- name: "✅ checksum"
run: cd build-${{ matrix.arch_name }} && find . -maxdepth 1 -name "tmux-mem-cpu-load*" | xargs sha256sum > checksum.sha256
- name: "🗜️ compress"
run: cd build-${{ matrix.arch_name }} && find . -maxdepth 1 -name "tmux-mem-cpu-load*" -o -name "*.sha256" | XZ_OPT=-e9 tar -cJf tmux-mem-cpu-load-${{ matrix.arch_name }}.tar.xz -T - && mv tmux-mem-cpu-load-${{ matrix.arch_name }}.tar.xz ..
- name: "💾 save binaries"
uses: actions/upload-artifact@v7
with:
name: bin-artifact-${{ matrix.arch_name }}
path: tmux-mem-cpu-load-${{ matrix.arch_name }}.tar.xz
retention-days: 1
release:
name: release
runs-on: ubuntu-latest
needs: build
steps:
- name: "📥 Checkout Code"
uses: actions/checkout@v7
with:
submodules: 'recursive'
fetch-depth: 0
- name: get artifact
uses: actions/download-artifact@v8
with:
pattern: bin-artifact-*
merge-multiple: true
path: .
- name: "✅ checksum"
run: find . -maxdepth 1 -name "*.tar.xz" | xargs sha256sum > checksum_all.sha256
- uses: "marvinpinto/action-automatic-releases@latest"
name: "📤 upload to github"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: false
files: |
LICENSE
*.tar.xz
*.sha256

61
.gitignore vendored
View file

@ -1,61 +0,0 @@
# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
sysstat
tmux-mem-cpu-load
# CMake generated #
###################
CMakeFiles
Makefile
cmake_install.cmake
CMakeCache.txt
install_manifest.txt
version.h
config.h
CTestTestfile.cmake
DartConfiguration.tcl
# Ninja generated #
###################
.ninja_deps
.ninja_log
*.ninja
# Packages #
############
# it's better to unpack this files and commit raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.rar
*.tar
*.zip
# Logs and databases #
######################
*.log
*.sql
*.sqlite
# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
*.swp
*.swo
*~
dockcross-*
build-*

View file

@ -1,12 +0,0 @@
os:
- linux
- osx
language: cpp
compiler:
- gcc
- clang
script:
- mkdir build
- cd build
- cmake -DCMAKE_INSTALL_PREFIX:PATH=../install ..
- cmake --build . --target install

12
AUTHORS
View file

@ -1,12 +0,0 @@
Original author and maintainer:
Matthew McCormick
Contributors (in alphabetical order):
Jasper Lievisse Adriaanse <jasper@humppa.nl>
Justin Crawford <justin@pci-online.net>
krieiter <krieiter@gmail.com>
Mark Palmeri <mlp6@duke.edu>
Pawel 'l0ner' Soltys <pwslts@gmail.com>
Compilenix <Compilenix@compilenix.org>

View file

@ -1,176 +1,22 @@
# vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
#
# Copyright 2012 Matthew McCormick
# Copyright 2015 Pawel 'l0ner' Soltys
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
cmake_minimum_required(VERSION 2.6)
if(COMMAND cmake_policy)
cmake_policy(VERSION 2.6)
endif(COMMAND cmake_policy)
cmake_minimum_required(VERSION 3.5)
project(screen-cpu-mem)
### General Package stuff
project(tmux-mem-cpu-load)
set(tmux-mem-cpu-load_VERSION_MAJOR 3)
set(tmux-mem-cpu-load_VERSION_MINOR 8)
set(tmux-mem-cpu-load_VERSION_PATCH 3)
#Compute full version string
set(tmux-mem-cpu-load_VERSION
${tmux-mem-cpu-load_VERSION_MAJOR}.${tmux-mem-cpu-load_VERSION_MINOR}.${tmux-mem-cpu-load_VERSION_PATCH})
# Check whether we have support for c++11 in compiler and fail if we don't
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# generate header file to handle version
configure_file(
"${PROJECT_SOURCE_DIR}/common/version.h.in" "${PROJECT_BINARY_DIR}/version.h"
)
# set build type
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE MinSizeRel CACHE STRING
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
FORCE)
set(CMAKE_BUILD_TYPE Release CACHE STRING
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
FORCE)
endif(NOT CMAKE_BUILD_TYPE)
# detect system type
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
message(STATUS "Linux detected")
set(METER_SOURCES "linux/memory.cc" "linux/cpu.cc" "common/load.cc")
elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
message(STATUS "Darwin detected")
set(METER_SOURCES "osx/memory.cc" "osx/cpu.cc" "common/load.cc")
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
message(STATUS "FreeBSD detected")
set(METER_SOURCES "freebsd/memory.cc" "freebsd/cpu.cc" "common/load.cc")
elseif(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
message(STATUS "OpenBSD detected")
set(METER_SOURCES "openbsd/memory.cc" "openbsd/cpu.cc" "common/load.cc")
if(CMAKE_SYSTEM_VERSION VERSION_LESS 5.7)
add_definitions(-DOPENBSD_WORKAROUND=1)
endif()
elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
message(STATUS "NetBSD detected")
set(METER_SOURCES "netbsd/memory.cc" "netbsd/cpu.cc" "common/load.cc")
elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
message(STATUS "Windows detected")
set(METER_SOURCES "windows/memory.cc" "windows/cpu.cc" "windows/load.cc")
else()
message(FATAL_ERROR "${CMAKE_SYSTEM_NAME} Cannot be compiled on this system")
message(FATAL_ERROR "Cannot be compiled on this system")
endif()
add_executable(screen-cpu-usage screen-cpu-usage.cpp)
install(TARGETS screen-cpu-usage
RUNTIME
DESTINATION bin
)
# set common source files
set(COMMON_SOURCES "common/main.cc" "common/memory.cc" "common/graph.cc" "common/powerline.cc")
add_executable(tmux-mem-cpu-load ${COMMON_SOURCES} ${METER_SOURCES})
# add binary tree so we find version.h
target_include_directories(tmux-mem-cpu-load PUBLIC "${PROJECT_BINARY_DIR}")
target_include_directories(tmux-mem-cpu-load PUBLIC "${PROJECT_SOURCE_DIR}" "${PROJECT_SOURCE_DIR}/common")
if(CMAKE_SYSTEM_NAME MATCHES "Windows")
target_link_libraries(tmux-mem-cpu-load Pdh)
endif()
install(TARGETS tmux-mem-cpu-load RUNTIME DESTINATION bin)
include(CTest)
if(BUILD_TESTING)
add_test(NAME usage
COMMAND tmux-mem-cpu-load -h
)
add_test(NAME no_arguments
COMMAND tmux-mem-cpu-load
)
add_test(NAME custom_interval
COMMAND tmux-mem-cpu-load -i 3
)
add_test(NAME no_cpu_graph
COMMAND tmux-mem-cpu-load -g 0
)
add_test(NAME colors
COMMAND tmux-mem-cpu-load --colors
)
add_test(NAME colors_short
COMMAND tmux-mem-cpu-load -c
)
add_test(NAME powerline-right
COMMAND tmux-mem-cpu-load --powerline-right
)
add_test(NAME powerline-left
COMMAND tmux-mem-cpu-load --powerline-left
)
add_test(NAME invalid_status_interval
COMMAND tmux-mem-cpu-load -i -1
)
add_test(NAME invalid_graph_lines
COMMAND tmux-mem-cpu-load --graph-lines -2
)
add_test(NAME old_option_specification
COMMAND tmux-mem-cpu-load 2 8
)
add_test(NAME memory_mode_free_memory
COMMAND tmux-mem-cpu-load -m 1
)
add_test(NAME memory_mode_used_percentage
COMMAND tmux-mem-cpu-load -m 2
)
add_test(NAME averages_count_0
COMMAND tmux-mem-cpu-load -a 0
)
add_test(NAME averages_count_1
COMMAND tmux-mem-cpu-load -a 1
)
add_test(NAME averages_count_2
COMMAND tmux-mem-cpu-load -a 2
)
add_test(NAME averages_count_3
COMMAND tmux-mem-cpu-load -a 3
)
add_test(NAME cpu_mode_0
COMMAND tmux-mem-cpu-load --cpu-mode 0
)
add_test(NAME cpu_mode_1
COMMAND tmux-mem-cpu-load --cpu-mode 1
)
add_test(NAME cpu_mode_short_0
COMMAND tmux-mem-cpu-load -t 0
)
add_test(NAME cpu_mode_short_1
COMMAND tmux-mem-cpu-load -t 1
)
set_tests_properties(usage
invalid_status_interval
invalid_graph_lines
old_option_specification
PROPERTIES WILL_FAIL TRUE)
endif()
install(PROGRAMS screen-mem-usage
DESTINATION bin
)

View file

@ -1,56 +0,0 @@
============
Contributing
============
Want to improve the quality of tmux-mem-cpu-load code? Great! Here's a quick
guide:
1. Fork, then clone the repo:
git clone git@github.com:your-username/tmux-mem-cpu-load
2. Make your change. Add tests for your change.
3. See if it compiles and runs like it should.
4. Run tests to check if you didn't break anything:
make test
Push to your fork and `submit a pull request`_.
At this point you're waiting on us. We'll review your changes as soon as we can.
Before merging your changes we may request you to make some changes or
corrections.
Style guidelines
----------------
You'll need to follow the subsequent rules in order to get your code merged:
* Use Allman_ style for block braces.
* No space before `(`
* Add space after each `(` and before each `)`
* Use braces single line statements
* Don't use mixed case naming style, use underscores instead.
Bad example:
int myAwesomeVariable = 0;
doSomething( myAwesomeVariable );
Good example:
int my_awesome_variable = 0;
do_something( my_awesome_variable );
* Don't vertically align tokens on consecutive lines.
* If you break up an argument list, align the line to opening brace
* Use 2 space indentation (no tabs)
* Use spaces around operators, except for unary operators, such as `!`.
* Add LICENSE header in new files you create.
* Put vim modeline as the first line of file header
* Use the lower-case for CMake commands
* Do not add trailing whitespace
You can use this bash script to strip unnecessary whitespaces:
http://git.io/z_GA3A
.. _`submit a pull request`: https://github.com/thewtex/tmux-mem-cpu-load/compare/
.. _Allman: http://en.wikipedia.org/wiki/Indent_style#Allman_style

202
LICENSE
View file

@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View file

@ -1,68 +1,53 @@
=============================================
tmux-mem-cpu-load
=============================================
---------------------------------------------
CPU, RAM, and load monitor for use with tmux_
---------------------------------------------
====================================================
screen-cpu-mem
====================================================
----------------------------------------------------
CPU and RAM memory monitors for use with GNU Screen_
----------------------------------------------------
.. image:: https://circleci.com/gh/thewtex/tmux-mem-cpu-load.svg?style=svg
:target: https://circleci.com/gh/thewtex/tmux-mem-cpu-load
.. image:: https://github.com/thewtex/tmux-mem-cpu-load/actions/workflows/main.yml/badge.svg
:target: https://github.com/thewtex/tmux-mem-cpu-load/actions/workflows/main.yml
Description
===========
A simple, lightweight program provided for system monitoring in the *status*
line of **tmux**.
The memory monitor displays the used and available memory.
Two programs are provided for system monitoring in the *hardstatus* line of **GNU
Screen**: a CPU usage monitor and a memory usage monitor. These programs are
intended to use minimal system resources.
The CPU usage monitor outputs a percent CPU usage over all processors. It also
displays a textual bar graph of the current percent usage.
The CPU usage monitor outputs a percent CPU usage over all processors that is
updated every second. It also displays a textual bar graph of the current
percent usage where every '|' character represents 10% usage.
The system load average is also displayed.
The memory monitor is updated every three seconds and displays the used and
available memory.
Example output::
Example::
2885/7987MB [||||| ] 51.2% 2.11 2.35 2.44
Mem:2885MB/7987MB Cpu:[||||| ] 51.2%
^ ^ ^ ^ ^ ^ ^
| | | | | | |
1 2 3 4 5 6 7
1. Currently used memory.
2. Available memory.
3. CPU usage bar graph.
4. CPU usage percentage.
5. Load average for the past minute.
6. Load average for the past 5 minutes.
7. Load average for the past 15 minutes.
For `terminals with 256 color support`_, graded colors can be displayed by
passing the **--colors** flag.
Installation
============
Dependencies
------------
Currently, Linux, Mac OSX, FreeBSD, OpenBSD, and NetBSD are supported.
Building
~~~~~~~~
* >= CMake_ -3.5
* C++ compiler with C++11 support (e.g. gcc/g++ >= 4.6)
* >= cmake_ -2.6
* C++ compiler (e.g. gcc/g++)
Download
--------
There are links to the source code at the `project homepage`_.
Build
-----
@ -72,6 +57,7 @@ Build
cmake .
make
Install
-------
@ -81,147 +67,37 @@ Install
make install
logout
Build and Install Using tpm_
-----------------------------
Include the plugin in your ``.tmux.conf``, the same file you'll set the
configuration in, below.
::
Configuring GNU Screen_
=======================
set -g @plugin 'thewtex/tmux-mem-cpu-load'
Install with Package Managers
-----------------------------
The ``$HOME/.screenrc`` file must be edited to make use of the installed
programs, ``screen-cpu-usage`` and ``screen-mem-usage``.
* Gentoo: ``emerge tmux-mem-cpu-load``
* Homebrew: ``brew install tmux-mem-cpu-load``
* FreeBSD: ``pkg install tmux-mem-cpu-load``
An example configuration::
Build and Install Using Antigen_
--------------------------------
# backticks to display information in the statusbar
backtick 1 0 0 /usr/local/bin/screen-mem-usage
backtick 2 0 0 /usr/local/bin/screen-cpu-usage
Include the bundle in your ``.zshrc``
hardstatus alwayslastline
hardstatus string '%{kg}Host:%{kG}%H%{kg} %=%{kb}Mem:%{kB}%1` %{ky}Cpu:%{kY}%2`%% %{kR}Load:%{kr}%l%=%{kc} %D %m/%d %{kC}%C%a%{w}'
::
The example configuration will result in::
antigen bundle thewtex/tmux-mem-cpu-load
Host:flea Mem:2961MB/7987MB Cpu:[|| ] 25.6% Load:0.64 0.35 0.28 Fri 09/11 12:56am
Configuring tmux_
=================
Edit ``$HOME/.tmux.conf`` to display the program's output in *status-left* or
*status-right*. For example::
set -g status-interval 2
set -g status-left "#S #[fg=green,bg=black]#(tmux-mem-cpu-load --colors --interval 2)#[default]"
set -g status-left-length 60
If you installed using tpm, you must specify the full path to the
``tmux-mem-cpu-load`` script, like below::
set -g status-right "#[fg=green]#($TMUX_PLUGIN_MANAGER_PATH/tmux-mem-cpu-load/tmux-mem-cpu-load --colors --powerline-right --interval 2)#[default]"
Note that the *interval* argument to `tmux-mem-cpu-load` should be the same number
of seconds that *status-interval* is set at.
Another optional argument is the number of bars in the bar graph, which
defaults to 10. This can, for instance, be set to the number of cores in a
multi-core system.
The *colors* option will add graded colors for each of the measures.
The full usage::
Usage: tmux-mem-cpu-load [OPTIONS]
Available options:
-h, --help
Prints this help message
-c, --colors
Use tmux colors in output
-p, --powerline-left
Use powerline left symbols throughout the output, enables --colors
-q, --powerline-right
Use powerline right symbols throughout the output, enables --colors
-v, --vertical-graph
Use vertical bar chart for CPU graph
-l <value>, --segments-left <value>
Enable blending bg/fg color (depending on -p or -q use) with segment to left
Provide color to be used depending on -p or -q option for seamless segment blending
Color is an integer value which uses the standard tmux color palette values
-r <value>, --segments-right <value>
Enable blending bg/fg color (depending on -p or -q use) with segment to right
Provide color to be used depending on -p or -q option for seamless segment blending
Color is an integer value which uses the standard tmux color palette values
-i <value>, --interval <value>
Set tmux status refresh interval in seconds. Default: 1 second
-g <value>, --graph-lines <value>
Set how many lines should be drawn in a graph. Default: 10
-m <value>, --mem-mode <value>
Set memory display mode. 0: Default, 1: Free memory, 2: Usage percent.
-t <value>, --cpu-mode <value>
Set cpu % display mode. 0: Default max 100%, 1: Max 100% * number of threads.
-a <value>, --averages-count <value>
Set how many load-averages should be drawn. Default: 3
Blending Dynamic Colors Tmux Powerline Segments
===============================================
The -l and -r options when used in conjunction with a recent version of Tmux Powerline
that has the ability to selectively disable spacing and separators between segments allow
for seamless blending of tmux-mem-cpu-load output with other adjacent segments. The end
result is dynamic changing of appropriate foreground and background colors as the start
and end of the tmux-mem-cpu-load output string that is aggregated with other Tmux
Powerline output to produce a more polished status line in Tmux.
Segment Adjaceny before this feature:
.. image:: seg-adj1.png
Segment Adjaceny after this feature:
.. image:: seg-adj2.png
Note that the values for the -l and -r options will be the standard Tmux integer color
values. They set the appropriate background and foreground colors used for the separator
character when used with the poweline-left or powerline-right options so it is easy to
match coloring to adjacent segments. An example from the segment script that calls
tmux-mem-cpu-load is as follows::
tmux-mem-cpu-load -q -v -l 52 -r 33
This combines with theme options available to tmux-powerline, such as the following::
"disk_usage_cust 52 123 ${TMUX_POWERLINE_SEPARATOR_LEFT_BOLD} 52 123 right_disable" \
"tmux_mem_cpu_load_cust 52 234 ${TMUX_POWERLINE_SEPARATOR_LEFT_BOLD} 52 234 both_disable separator_disable" \
"batt_cust 33 154 ${TMUX_POWERLINE_SEPARATOR_LEFT_BOLD} 16 33 N separator_disable" \
Authors
=======
Author
======
Matt McCormick (thewtex) <matt@mmmccormick.com>
Contributions from:
* cousine <iam@cousine.me>
* Jasper Lievisse Adriaanse <jasper@humppa.nl>
* Justin Crawford <justinc@pci-online.net>
* krieiter <krieiter@gmail.com>
* Mark Palmeri <mlp6@duke.edu>
* `Pawel 'l0ner' Soltys`_ <pwslts@gmail.com>
* Travil Heller <trav.heller@gmail.com>
* Tony Narlock <tony@git-pull.com>
* Compilenix <Compilenix@compilenix.org>
* jodavies <jodavies1010@gmail.com>
* `@nhdaly`_ (Nathan Daly) <nhdaly@gmail.com>
* bensuperpc <bensuperpc@gmail.com>
.. _tmux: http://tmux.sourceforge.net/
.. _CMake: http://www.cmake.org
.. _`project homepage`: http://github.com/thewtex/tmux-mem-cpu-load
.. _`tpm`: http://github.com/tmux-plugins/tpm
.. _`Antigen`: https://github.com/zsh-users/antigen
.. _`terminals with 256 color support`: http://misc.flogisoft.com/bash/tip_colors_and_formatting#terminals_compatibility
.. _`Pawel 'l0ner' Soltys` : http://l0ner.github.io/
.. _`@nhdaly` : http://github.com/nhdaly
.. _screen: http://www.gnu.org/software/screen/
.. _cmake: http://www.cmake.org
.. _`project homepage`: http://github.com/thewtex/screen-cpu-mem

View file

@ -1,6 +0,0 @@
#!/bin/bash
set -euo pipefail
source $(dirname "$0")/functions/cmake_fn.sh
cmake_build $@

View file

@ -1,11 +0,0 @@
#!/bin/bash
set -euo pipefail
curl https://raw.githubusercontent.com/dockcross/dockcross/master/Makefile -o dockcross-Makefile
make -f dockcross-Makefile display_images
source $(dirname "$0")/functions/cmake_fn.sh
for image in $(make -f dockcross-Makefile display_images); do
cmake_build $image $@
done

View file

@ -1,19 +0,0 @@
#!/bin/bash
set -euo pipefail
cmake_build () {
local image=$1
local build_file=build-${image%:*}
shift 1
local cmake_arg=$@
echo "cmake arg: $cmake_arg"
echo "Pulling dockcross/$image"
docker pull dockcross/$image
echo "Make script dockcross-$image"
docker run --rm dockcross/$image > ./dockcross-$image
chmod +x ./dockcross-$image
echo "Build $build_file"
./dockcross-$image cmake -B$build_file -H. -GNinja $cmake_arg
./dockcross-$image ninja -C$build_file
}

View file

@ -1,15 +0,0 @@
#!/bin/bash
set -euo pipefail
makefile_build () {
local image=$1
shift 1
echo "Pulling dockcross/$image"
docker pull dockcross/$image
echo "Make script dockcross-$image"
docker run --rm dockcross/$image > ./dockcross-$image
chmod +x ./dockcross-$image
echo "Build..."
./dockcross-$image bash -c 'make CXX=$CXX CC=$CC AR=$AR AS=$AS CPP=$CPP FC=$FC'
}

View file

@ -1,6 +0,0 @@
#!/bin/bash
set -euo pipefail
source $(dirname "$0")/functions/makefile_fn.sh
makefile_build $@

View file

@ -1,11 +0,0 @@
#!/bin/bash
set -euo pipefail
curl https://raw.githubusercontent.com/dockcross/dockcross/master/Makefile -o dockcross-Makefile
make -f dockcross-Makefile display_images
source $(dirname "$0")/functions/makefile_fn.sh
for image in $(make -f dockcross-Makefile display_images); do
makefile_build $image $@
done

View file

@ -1,40 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef CONVERSIONS_H_
#define CONVERSIONS_H_
enum BYTE_UNITS
{
BYTES = 0,
KILOBYTES = 1,
MEGABYTES = 2,
GIGABYTES = 3
};
template <class T>
inline T convert_unit( T num, int to, int from = BYTES)
{
for( ; from < to; from++)
{
num /= 1024;
}
return num;
}
#endif

View file

@ -1,67 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef CPU_H_
#define CPU_H_
#include <cstdint>
#include <sys/types.h>
#if defined(__APPLE__) && defined(__MACH__)
#define CP_USER 0
#define CP_SYS 1
#define CP_IDLE 2
#define CP_NICE 3
#define CP_STATES 4
#elif defined(__OpenBSD__)
#include <sys/sched.h>
#define CP_STATES CPUSTATES
#else
#define CP_USER 0
#define CP_NICE 1
#define CP_SYS 2
#if defined(__FreeBSD__) || defined(__NetBSD__)
// *BSD or OSX
#define CP_INTR 3
#define CP_IDLE 4
#define CP_STATES 5
#else
//linux
#define CP_IDLE 3
#define CP_STATES 4
#endif
#endif
float cpu_percentage( unsigned );
uint32_t get_cpu_count();
/** CPU percentage output mode.
*
* Examples:
*
* CPU_MODE_DEFAULT: 100%
* CPU_MODE_THREADS: 800% (8 cores, fully loaded)
*/
enum CPU_MODE
{
CPU_MODE_DEFAULT,
CPU_MODE_THREADS
};
#endif

View file

@ -1,37 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef BSD_ERROR_H_
#define BSD_ERROR_H_
#include <iostream>
#include <sys/errno.h>
#include <cerrno>
#include <cstring> // strerror
#include <cstdlib> // exit()
inline void error( const char * error )
{
using std::cerr;
using std::endl;
cerr << error << ": " << strerror( errno ) << endl;
exit( EXIT_FAILURE );
}
#endif

View file

@ -1,43 +0,0 @@
#!/usr/bin/env python
"""Create the color code lookup table header."""
import matplotlib.cm
def write_table(fp, colormap_name, stat_name, first_half_foreground, second_half_foreground):
fp.write('static const char ')
fp.write(stat_name)
fp.write('_lut[][32] = {\n')
colormap = matplotlib.cm.get_cmap(colormap_name)
for ii in range(101):
fp.write('"#[fg=')
if ii < 50:
fp.write(first_half_foreground)
else:
fp.write(second_half_foreground)
fp.write(',bg=colour')
rgba = colormap(ii * 0.01)
red = int(round(rgba[0] * 5))
green = int(round(rgba[1] * 5))
blue = int(round(rgba[2] * 5))
color = 16 + 36*red + 6*green + blue;
fp.write(str(color))
fp.write(']"')
if ii != 100:
fp.write(',')
fp.write('\n')
fp.write('}; // end ')
fp.write(stat_name)
fp.write('_lut\n\n')
with open('luts.h', 'w') as fp:
fp.write('#ifndef _luts_h\n')
fp.write('#define _luts_h\n\n')
# hot colormap with white fg for the first half
# and black fg for the second half
write_table(fp, 'hot', 'cpu_percentage', 'brightwhite', 'black')
write_table(fp, 'gist_earth', 'mem', 'brightwhite', 'black')
write_table(fp, 'bone', 'load', 'brightwhite', 'black')
fp.write('#endif\n')

View file

@ -1,53 +0,0 @@
/*
* Copyright 2012 Matthew McCormick
* Copyright 2013 Justin Crawford <Justasic@gmail.com>
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Based on: github.com/freebsd/freebsd/blob/master/usr.bin/top/machine.c
// Based on: Apple.cpp for load_string/mem_string and apple's documentation
#ifndef BSD_METER_COMMON_H_
#define BSD_METER_COMMON_H_
#include <iostream>
#include <cerrno>
#include <sys/sysctl.h>
#include <sys/types.h>
#include <cstdlib> //exit()
#include <string.h> //strerror()
#define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var))
static inline void getsysctl( const char *name, void *ptr, size_t len )
{
size_t nlen = len;
if( sysctlbyname( name, ptr, &nlen, NULL, 0 ) == -1 )
{
std::cerr << "sysctl(" << name << "...) failed: " << strerror( errno )
<< std::endl;
exit( EXIT_FAILURE );
}
if( nlen != len )
{
std::cerr << "sysctl(" << name << "...) expected "
<< static_cast<unsigned long>( len ) << " bytes, got "
<< static_cast<unsigned long>( nlen ) << " bytes\n";
//exit( 23 );
}
}
#endif

View file

@ -1,80 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <string>
#include <cstring>
#include <map>
#include "graph.h"
std::string get_graph_by_percentage( unsigned value, unsigned len )
{
unsigned step = 0;
std::string bars;
unsigned bar_count = ( static_cast<float>(value) / 99.9 * len );
for( ; step < bar_count; step++ )
{
bars.append( "|" );
}
for( ; step < len; step++ )
{
bars.append( " " );
}
return bars;
}
std::string get_graph_by_value( unsigned value, unsigned max, unsigned len )
{
unsigned step = 0;
std::string bars;
unsigned bar_count = ( static_cast<float>( value / ( max - 0.1 ) ) * len );
for( ; step < bar_count; step++ )
{
bars.append( "|" );
}
for( ; step < len; step++ )
{
bars.append( " " );
}
return bars;
}
std::string get_graph_vert( unsigned value )
{
static const std::map<unsigned, std::string> graph_chars = {
{ 0, " " }, { 10, "" }, { 20, "" }, { 30, "" }, { 40, "" },
{ 50, "" }, { 60, "" }, { 70, "" }, { 80, "" }, { 90, "" }
};
for( auto it = graph_chars.rbegin(); it != graph_chars.rend(); ++it )
{
if( value >= it->first )
{
return it->second;
}
}
return " "; // default return in case value doesn't match map options
}

View file

@ -1,28 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef GRAPH_H_
#define GRAPH_H_
#include <string>
std::string get_graph_by_percentage( unsigned, unsigned len = 10 );
std::string get_graph_by_value( unsigned, unsigned, unsigned len = 10 );
std::string get_graph_vert( unsigned );
#endif

View file

@ -1,125 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2013 Justin Crawford <Justasic@gmail.com>
* Copyright 2015 Pawel 'l0ner' Soltys
* Copyright 2016 Compilenix
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Based on: github.com/freebsd/freebsd/blob/master/usr.bin/top/machine.c
// Based on: Apple.cpp for load_string/mem_string and apple's documentation
#include <sstream>
#include <string>
#include <stdlib.h> // getloadavg()
#include <cmath> // floorf()
#include <sys/types.h>
#include <stdio.h>
#include "cpu.h"
#include "load.h"
#include "luts.h"
#include "powerline.h"
// Load Averages
std::string load_string( bool use_colors,
bool use_powerline_left, bool use_powerline_right, short num_averages,
bool segments_to_right, short right_color )
{
std::ostringstream ss;
ss.setf( std::ios::fixed, std::ios::floatfield );
ss.precision( 2 );
if( num_averages <= 0 || num_averages > 3)
{
ss << (char) 0;
return ss.str();
}
double averages[3];
// based on: opensource.apple.com/source/Libc/Libc-262/gen/getloadavg.c
if( getloadavg( averages, num_averages ) < 0 )
{
ss << " 0.00 0.00 0.00"; // couldn't get averages.
}
else
{
unsigned load_percent = static_cast<unsigned int>( averages[0] /
get_cpu_count() * 0.5f * 100.0f );
if( load_percent > 100 )
{
load_percent = 100;
}
if( use_colors )
{
if( use_powerline_right )
{
powerline( ss, load_lut[load_percent], POWERLINE_RIGHT );
}
else if( use_powerline_left )
{
powerline( ss, load_lut[load_percent], POWERLINE_LEFT );
}
else
{
powerline( ss, load_lut[load_percent], NONE );
}
}
ss << ' ';
for( int i = 0; i < num_averages; ++i )
{
// Round to nearest, make sure this is only a 0.00 value not a 0.0000
float avg = floorf( static_cast<float>( averages[i] ) * 100 + 0.5 ) / 100;
// Don't print trailing whitespace for last element
if ( i == num_averages-1 )
{
ss << avg;
}
else
{
ss << avg << " ";
}
}
if( use_colors )
{
if( use_powerline_left && segments_to_right )
{
powerline( ss, load_lut[load_percent], POWERLINE_LEFT, true );
powerline_char( ss, load_lut[load_percent], right_color, POWERLINE_LEFT, true );
}
else if( use_powerline_left && !segments_to_right )
{
powerline( ss, load_lut[load_percent], POWERLINE_LEFT, true );
powerline( ss, "#[fg=default,bg=default]", POWERLINE_LEFT );
}
else if( !use_powerline_right )
{
ss << "#[fg=default,bg=default]";
}
else if ( segments_to_right && use_powerline_right )
{
powerline_char( ss, load_lut[load_percent], right_color, POWERLINE_RIGHT, true );
}
}
}
return ss.str();
}

View file

@ -1,30 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
* Copyright 2016 Compilenix
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LOAD_H_
#define LOAD_H_
#include <string>
std::string load_string( bool use_colors = false,
bool use_powerline_left = false, bool use_powerline_right = false,
short num_averages = 3, bool segments_to_right = false,
short right_color = 0 );
#endif

View file

@ -1,316 +0,0 @@
#ifndef _luts_h
#define _luts_h
static const char cpu_percentage_lut[][32] = {
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour19]",
"#[fg=brightwhite,bg=colour19]",
"#[fg=brightwhite,bg=colour19]",
"#[fg=brightwhite,bg=colour19]",
"#[fg=brightwhite,bg=colour19]",
"#[fg=brightwhite,bg=colour19]",
"#[fg=brightwhite,bg=colour20]",
"#[fg=brightwhite,bg=colour20]",
"#[fg=brightwhite,bg=colour20]",
"#[fg=brightwhite,bg=colour20]",
"#[fg=brightwhite,bg=colour20]",
"#[fg=brightwhite,bg=colour20]",
"#[fg=brightwhite,bg=colour20]",
"#[fg=brightwhite,bg=colour21]",
"#[fg=brightwhite,bg=colour21]",
"#[fg=brightwhite,bg=colour21]",
"#[fg=brightwhite,bg=colour21]",
"#[fg=brightwhite,bg=colour21]",
"#[fg=brightwhite,bg=colour21]",
"#[fg=brightwhite,bg=colour57]",
"#[fg=brightwhite,bg=colour57]",
"#[fg=brightwhite,bg=colour57]",
"#[fg=brightwhite,bg=colour57]",
"#[fg=brightwhite,bg=colour57]",
"#[fg=brightwhite,bg=colour57]",
"#[fg=brightwhite,bg=colour56]",
"#[fg=brightwhite,bg=colour56]",
"#[fg=brightwhite,bg=colour56]",
"#[fg=brightwhite,bg=colour56]",
"#[fg=brightwhite,bg=colour56]",
"#[fg=brightwhite,bg=colour56]",
"#[fg=brightwhite,bg=colour55]",
"#[fg=brightwhite,bg=colour55]",
"#[fg=brightwhite,bg=colour55]",
"#[fg=brightwhite,bg=colour55]",
"#[fg=brightwhite,bg=colour55]",
"#[fg=brightwhite,bg=colour55]",
"#[fg=brightwhite,bg=colour54]",
"#[fg=brightwhite,bg=colour54]",
"#[fg=brightwhite,bg=colour54]",
"#[fg=brightwhite,bg=colour54]",
"#[fg=brightwhite,bg=colour54]",
"#[fg=brightwhite,bg=colour54]",
"#[fg=brightwhite,bg=colour53]",
"#[fg=brightwhite,bg=colour53]",
"#[fg=brightwhite,bg=colour53]",
"#[fg=brightwhite,bg=colour53]",
"#[fg=brightwhite,bg=colour53]",
"#[fg=brightwhite,bg=colour53]",
"#[fg=brightwhite,bg=colour52]",
"#[fg=brightwhite,bg=colour52]",
"#[fg=brightwhite,bg=colour52]",
"#[fg=brightwhite,bg=colour52]",
"#[fg=brightwhite,bg=colour52]",
"#[fg=brightwhite,bg=colour52]",
"#[fg=brightwhite,bg=colour88]",
"#[fg=brightwhite,bg=colour88]",
"#[fg=brightwhite,bg=colour88]",
"#[fg=brightwhite,bg=colour88]",
"#[fg=brightwhite,bg=colour88]",
"#[fg=brightwhite,bg=colour88]",
"#[fg=brightwhite,bg=colour124]",
"#[fg=brightwhite,bg=colour124]",
"#[fg=brightwhite,bg=colour124]",
"#[fg=brightwhite,bg=colour124]",
"#[fg=brightwhite,bg=colour124]",
"#[fg=brightwhite,bg=colour124]",
"#[fg=brightwhite,bg=colour160]",
"#[fg=brightwhite,bg=colour160]",
"#[fg=brightwhite,bg=colour160]",
"#[fg=brightwhite,bg=colour160]",
"#[fg=brightwhite,bg=colour160]",
"#[fg=brightwhite,bg=colour160]",
"#[fg=brightwhite,bg=colour196]",
"#[fg=brightwhite,bg=colour196]",
"#[fg=brightwhite,bg=colour196]",
"#[fg=brightwhite,bg=colour196]",
"#[fg=brightwhite,bg=colour196]",
"#[fg=brightwhite,bg=colour196]"
}; // end cpu_percentage_lut
static const char mem_lut[][32] = {
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour18]",
"#[fg=brightwhite,bg=colour24]",
"#[fg=brightwhite,bg=colour24]",
"#[fg=brightwhite,bg=colour24]",
"#[fg=brightwhite,bg=colour24]",
"#[fg=brightwhite,bg=colour24]",
"#[fg=brightwhite,bg=colour24]",
"#[fg=brightwhite,bg=colour24]",
"#[fg=brightwhite,bg=colour24]",
"#[fg=brightwhite,bg=colour60]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour66]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour72]",
"#[fg=brightwhite,bg=colour71]",
"#[fg=brightwhite,bg=colour71]",
"#[fg=brightwhite,bg=colour71]",
"#[fg=brightwhite,bg=colour107]",
"#[fg=brightwhite,bg=colour107]",
"#[fg=black,bg=colour107]",
"#[fg=black,bg=colour107]",
"#[fg=black,bg=colour108]",
"#[fg=black,bg=colour108]",
"#[fg=black,bg=colour108]",
"#[fg=black,bg=colour108]",
"#[fg=black,bg=colour108]",
"#[fg=black,bg=colour144]",
"#[fg=black,bg=colour144]",
"#[fg=black,bg=colour144]",
"#[fg=black,bg=colour144]",
"#[fg=black,bg=colour144]",
"#[fg=black,bg=colour144]",
"#[fg=black,bg=colour144]",
"#[fg=black,bg=colour144]",
"#[fg=black,bg=colour144]",
"#[fg=black,bg=colour144]",
"#[fg=black,bg=colour150]",
"#[fg=black,bg=colour150]",
"#[fg=black,bg=colour186]",
"#[fg=black,bg=colour186]",
"#[fg=black,bg=colour186]",
"#[fg=black,bg=colour180]",
"#[fg=black,bg=colour180]",
"#[fg=black,bg=colour180]",
"#[fg=black,bg=colour180]",
"#[fg=black,bg=colour180]",
"#[fg=black,bg=colour180]",
"#[fg=black,bg=colour180]",
"#[fg=black,bg=colour180]",
"#[fg=black,bg=colour180]",
"#[fg=black,bg=colour180]",
"#[fg=black,bg=colour180]",
"#[fg=black,bg=colour181]",
"#[fg=black,bg=colour181]",
"#[fg=black,bg=colour181]",
"#[fg=black,bg=colour181]",
"#[fg=black,bg=colour187]",
"#[fg=black,bg=colour187]",
"#[fg=black,bg=colour187]",
"#[fg=black,bg=colour187]",
"#[fg=black,bg=colour188]",
"#[fg=black,bg=colour224]",
"#[fg=black,bg=colour224]",
"#[fg=black,bg=colour224]",
"#[fg=black,bg=colour224]",
"#[fg=black,bg=colour224]",
"#[fg=black,bg=colour231]",
"#[fg=black,bg=colour231]",
"#[fg=black,bg=colour231]",
"#[fg=black,bg=colour231]"
}; // end mem_lut
static const char load_lut[][32] = {
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour16]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour17]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour59]",
"#[fg=brightwhite,bg=colour60]",
"#[fg=brightwhite,bg=colour60]",
"#[fg=brightwhite,bg=colour60]",
"#[fg=brightwhite,bg=colour60]",
"#[fg=brightwhite,bg=colour60]",
"#[fg=brightwhite,bg=colour60]",
"#[fg=brightwhite,bg=colour60]",
"#[fg=brightwhite,bg=colour60]",
"#[fg=brightwhite,bg=colour60]",
"#[fg=brightwhite,bg=colour60]",
"#[fg=brightwhite,bg=colour102]",
"#[fg=brightwhite,bg=colour102]",
"#[fg=brightwhite,bg=colour102]",
"#[fg=brightwhite,bg=colour102]",
"#[fg=brightwhite,bg=colour102]",
"#[fg=brightwhite,bg=colour102]",
"#[fg=brightwhite,bg=colour102]",
"#[fg=brightwhite,bg=colour102]",
"#[fg=brightwhite,bg=colour103]",
"#[fg=brightwhite,bg=colour103]",
"#[fg=brightwhite,bg=colour103]",
"#[fg=brightwhite,bg=colour103]",
"#[fg=brightwhite,bg=colour103]",
"#[fg=brightwhite,bg=colour103]",
"#[fg=brightwhite,bg=colour103]",
"#[fg=black,bg=colour103]",
"#[fg=black,bg=colour103]",
"#[fg=black,bg=colour109]",
"#[fg=black,bg=colour109]",
"#[fg=black,bg=colour109]",
"#[fg=black,bg=colour109]",
"#[fg=black,bg=colour109]",
"#[fg=black,bg=colour109]",
"#[fg=black,bg=colour145]",
"#[fg=black,bg=colour145]",
"#[fg=black,bg=colour145]",
"#[fg=black,bg=colour145]",
"#[fg=black,bg=colour145]",
"#[fg=black,bg=colour145]",
"#[fg=black,bg=colour145]",
"#[fg=black,bg=colour145]",
"#[fg=black,bg=colour146]",
"#[fg=black,bg=colour146]",
"#[fg=black,bg=colour152]",
"#[fg=black,bg=colour152]",
"#[fg=black,bg=colour152]",
"#[fg=black,bg=colour152]",
"#[fg=black,bg=colour152]",
"#[fg=black,bg=colour152]",
"#[fg=black,bg=colour152]",
"#[fg=black,bg=colour152]",
"#[fg=black,bg=colour152]",
"#[fg=black,bg=colour152]",
"#[fg=black,bg=colour152]",
"#[fg=black,bg=colour188]",
"#[fg=black,bg=colour188]",
"#[fg=black,bg=colour188]",
"#[fg=black,bg=colour188]",
"#[fg=black,bg=colour188]",
"#[fg=black,bg=colour188]",
"#[fg=black,bg=colour188]",
"#[fg=black,bg=colour188]",
"#[fg=black,bg=colour188]",
"#[fg=black,bg=colour188]",
"#[fg=black,bg=colour195]",
"#[fg=black,bg=colour195]",
"#[fg=black,bg=colour195]",
"#[fg=black,bg=colour195]",
"#[fg=black,bg=colour231]",
"#[fg=black,bg=colour231]",
"#[fg=black,bg=colour231]",
"#[fg=black,bg=colour231]",
"#[fg=black,bg=colour231]",
"#[fg=black,bg=colour231]",
"#[fg=black,bg=colour231]",
"#[fg=black,bg=colour231]"
}; // end load_lut
#endif

View file

@ -1,302 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <cstring>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cstdlib> // EXIT_SUCCESS, atoi()
#include <getopt.h> // getopt_long
#include "version.h"
#include "graph.h"
// Tmux color lookup tables for the different metrics.
#include "luts.h"
#include "cpu.h"
#include "memory.h"
#include "load.h"
#include "powerline.h"
std::string cpu_string( CPU_MODE cpu_mode, unsigned int cpu_usage_delay, unsigned int graph_lines,
bool use_colors = false,
bool use_powerline_left = false, bool use_powerline_right = false, bool use_vert_graph = false)
{
float percentage;
float multiplier = 1.0f;
//output stuff
std::ostringstream oss;
oss.precision( 1 );
oss.setf( std::ios::fixed | std::ios::right );
// get %
percentage = cpu_percentage( cpu_usage_delay );
// set multiplier to number of threads ?
if ( cpu_mode == CPU_MODE_THREADS )
{
multiplier = get_cpu_count();
}
// if percentage*multiplier >= 100, remove decimal point to keep number short
if ( percentage*multiplier >= 100.0f )
{
oss.precision( 0 );
}
unsigned int percent = static_cast<unsigned int>( percentage );
if( use_colors )
{
if( use_powerline_right )
{
powerline( oss, cpu_percentage_lut[percent], POWERLINE_RIGHT );
}
else if( use_powerline_left )
{
powerline( oss, cpu_percentage_lut[percent], POWERLINE_LEFT );
}
else
{
powerline( oss, cpu_percentage_lut[percent], NONE );
}
}
if( use_vert_graph )
{
oss << "";
oss << get_graph_vert( unsigned( percentage ) );
oss << "";
}
else if( graph_lines > 0)
{
oss << " [";
oss << get_graph_by_percentage( unsigned( percentage ), graph_lines );
oss << "]";
}
oss.width( 6 );
oss.setf( std::ios::fixed, std::ios::floatfield );
oss.precision( 1 );
oss.fill( ' ' );
oss << std::right << percentage * multiplier;
oss << "%";
if( use_colors )
{
if( use_powerline_left )
{
powerline( oss, cpu_percentage_lut[percent], POWERLINE_LEFT, true );
}
else if( !use_powerline_right )
{
oss << "#[fg=default,bg=default]";
}
}
return oss.str();
}
void print_help()
{
using std::cout;
using std::endl;
cout << "tmux-mem-cpu-load v" << tmux_mem_cpu_load_VERSION << endl
<< "Usage: tmux-mem-cpu-load [OPTIONS]\n\n"
<< "Available options:\n"
<< "-h, --help\n"
<< "\t Prints this help message\n"
<< "-c, --colors\n"
<< "\tUse tmux colors in output\n"
<< "-p, --powerline-left\n"
<< "\tUse powerline left symbols throughout the output, enables --colors\n"
<< "-q, --powerline-right\n"
<< "\tUse powerline right symbols throughout the output, enables --colors\n"
<< "-v, --vertical-graph\n"
<< "\tUse vertical bar chart for CPU graph\n"
<< "-l <value>, --segments-left <value>\n"
<< "\tEnable blending bg/fg color (depending on -p or -q use) with segment to left\n"
<< "\tProvide color to be used depending on -p or -q option for seamless segment blending\n"
<< "\tColor is an integer value which uses the standard tmux color palette values\n"
<< "-r <value>, --segments-right <value>\n"
<< "\tEnable blending bg/fg color (depending on -p or -q use) with segment to right\n"
<< "\tProvide color to be used depending on -p or -q option for seamless segment blending\n"
<< "\tColor is an integer value which uses the standard tmux color palette values\n"
<< "-i <value>, --interval <value>\n"
<< "\tSet tmux status refresh interval in seconds. Default: 1 second\n"
<< "-g <value>, --graph-lines <value>\n"
<< "\tSet how many lines should be drawn in a graph. Default: 10\n"
<< "-m <value>, --mem-mode <value>\n"
<< "\tSet memory display mode. 0: Default, 1: Free memory, 2: Usage percent.\n"
<< "-t <value>, --cpu-mode <value>\n"
<< "\tSet cpu % display mode. 0: Default max 100%, 1: Max 100% * number of threads. \n"
<< "-a <value>, --averages-count <value>\n"
<< "\tSet how many load-averages should be drawn. Default: 3\n"
<< endl;
}
int main( int argc, char** argv )
{
unsigned cpu_usage_delay = 990000;
short averages_count = 3;
short graph_lines = 10; // max 32767 should be enough
short left_color = 0;
short right_color = 0;
bool use_colors = false;
bool use_powerline_left = false;
bool use_powerline_right = false;
bool use_vert_graph = false;
bool segments_to_left = false;
bool segments_to_right= false;
MEMORY_MODE mem_mode = MEMORY_MODE_DEFAULT;
CPU_MODE cpu_mode = CPU_MODE_DEFAULT;
static struct option long_options[] =
{
// Struct is a s follows:
// const char * name, int has_arg, int *flag, int val
// if *flag is null, val is option identifier to use in switch()
// otherwise it's a value to set the variable *flag points to
{ "help", no_argument, NULL, 'h' },
{ "colors", no_argument, NULL, 'c' },
{ "powerline-left", no_argument, NULL, 'p' },
{ "powerline-right", no_argument, NULL, 'q' },
{ "vertical-graph", no_argument, NULL, 'v' },
{ "interval", required_argument, NULL, 'i' },
{ "graph-lines", required_argument, NULL, 'g' },
{ "mem-mode", required_argument, NULL, 'm' },
{ "cpu-mode", required_argument, NULL, 't' },
{ "averages-count", required_argument, NULL, 'a' },
{ "segments-left", required_argument, NULL, 'l' },
{ "segments-right", required_argument, NULL, 'r' },
{ 0, 0, 0, 0 } // used to handle unknown long options
};
int c;
// while c != -1
while( (c = getopt_long( argc, argv, "hi:cpqvl:r:g:m:a:t:", long_options, NULL) ) != -1 )
{
switch( c )
{
case 'h': // --help, -h
print_help();
return EXIT_FAILURE;
break;
case 'c': // --colors
use_colors = true;
break;
case 'p': // --powerline-left
use_colors = true;
use_powerline_left = true;
break;
case 'q': // --powerline-right
use_colors = true;
use_powerline_right = true;
break;
case 'v': // --vertical-graph
use_vert_graph = true;
break;
case 'l': // --segments-left
segments_to_left = true;
if( atoi( optarg ) < 0 || atoi( optarg ) > 255 )
{
std::cerr << "Valid color vaues are from 0 to 255.\n";
return EXIT_FAILURE;
}
left_color = atoi( optarg ) ;
break;
case 'r': // --segments-right
segments_to_right= true;
if( atoi( optarg ) < 0 || atoi( optarg ) > 255 )
{
std::cerr << "Valid color vaues are from 0 to 255.\n";
return EXIT_FAILURE;
}
right_color = atoi( optarg ) ;
break;
case 'i': // --interval, -i
if( atoi( optarg ) < 1 )
{
std::cerr << "Status interval argument must be one or greater.\n";
return EXIT_FAILURE;
}
cpu_usage_delay = atoi( optarg ) * 1000000 - 10000;
break;
case 'g': // --graph-lines, -g
if( atoi( optarg ) < 0 )
{
std::cerr << "Graph lines argument must be zero or greater.\n";
return EXIT_FAILURE;
}
graph_lines = atoi( optarg );
break;
case 'm': // --mem-mode, -m
if( atoi( optarg ) < 0 )
{
std::cerr << "Memory mode argument must be zero or greater.\n";
return EXIT_FAILURE;
}
mem_mode = static_cast< MEMORY_MODE >( atoi( optarg ) );
break;
case 't': // --cpu-mode, -t
if( atoi( optarg ) < 0 )
{
std::cerr << "CPU mode argument must be zero or greater.\n";
return EXIT_FAILURE;
}
cpu_mode = static_cast< CPU_MODE >( atoi( optarg ) );
break;
case 'a': // --averages-count, -a
if( atoi( optarg ) < 0 || atoi( optarg ) > 3 )
{
std::cerr << "Valid averages-count arguments are: 0, 1, 2, 3\n";
return EXIT_FAILURE;
}
averages_count = atoi( optarg );
break;
case '?':
// getopt_long prints error message automatically
return EXIT_FAILURE;
break;
default:
std::cerr << "?? getopt returned character code 0 " << c << std::endl;
return EXIT_FAILURE;
}
}
// Detect old option specification and return and error message.
if( argc > optind )
{
std::cout <<
"The interval and graph lines options are now specified with flags.\n\n";
print_help();
return EXIT_FAILURE;
}
MemoryStatus memory_status;
mem_status( memory_status );
std::cout << mem_string( memory_status, mem_mode, use_colors, use_powerline_left, use_powerline_right, segments_to_left, left_color )
<< cpu_string( cpu_mode, cpu_usage_delay, graph_lines, use_colors, use_powerline_left, use_powerline_right, use_vert_graph )
<< load_string( use_colors, use_powerline_left, use_powerline_right, averages_count, segments_to_right, right_color );
std::cout << std::endl;
return EXIT_SUCCESS;
}

View file

@ -1,122 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sstream>
#include <string>
#include "memory.h"
#include "luts.h"
#include "conversions.h"
#include "powerline.h"
std::string mem_string( const MemoryStatus & mem_status,
MEMORY_MODE mode,
bool use_colors,
bool use_powerline_left,
bool use_powerline_right,
bool segments_to_left,
short left_color )
{
std::ostringstream oss;
// Change the percision for floats, for a pretty output
oss.precision( 2 );
oss.setf( std::ios::fixed | std::ios::right );
unsigned int color = static_cast< unsigned int >((100 * mem_status.used_mem) / mem_status.total_mem);
if( use_colors )
{
if( use_powerline_right && segments_to_left )
{
powerline_char( oss, mem_lut[color], left_color, POWERLINE_RIGHT, false);
oss << ' ';
}
else if( use_powerline_right && !segments_to_left )
{
oss << "#[bg=default]";
powerline( oss, mem_lut[color], POWERLINE_RIGHT );
oss << ' ';
}
else if( use_powerline_left && segments_to_left )
{
powerline_char( oss, mem_lut[color], left_color, POWERLINE_LEFT, false);
oss << ' ';
}
else if( use_powerline_left )
{
//powerline( oss, mem_lut[color], POWERLINE_LEFT );
// We do not know how to invert the default background color
powerline( oss, mem_lut[color], NONE );
oss << ' ';
}
else
{
powerline( oss, mem_lut[color], NONE );
}
}
switch( mode )
{
case MEMORY_MODE_FREE_MEMORY: // Show free memory in MB or GB
{
const float free_mem = mem_status.total_mem - mem_status.used_mem;
const float free_mem_in_gigabytes = convert_unit( free_mem, GIGABYTES, MEGABYTES );
// if free memory is less than 1 GB, use MB instead
if( free_mem_in_gigabytes < 1.0f )
{
oss << free_mem << "MB";
}
else
{
oss << free_mem_in_gigabytes << "GB";
}
break;
}
case MEMORY_MODE_USAGE_PERCENTAGE:
{
// Calculate the percentage of used memory
const float percentage_mem = mem_status.used_mem /
static_cast<float>( mem_status.total_mem ) * 100.0;
oss << percentage_mem << '%';
break;
}
default: // Default mode, just show the used/total memory in MB
if(mem_status.used_mem>10000 && mem_status.total_mem>10000)
oss<<static_cast<unsigned int>(mem_status.used_mem/1024)<<"/"<<static_cast<unsigned int>(mem_status.total_mem/1024)<<"GB";
else if(mem_status.used_mem<10000 && mem_status.total_mem>10000)
oss<<static_cast<unsigned int>(mem_status.used_mem)<<"MB/"<<static_cast<unsigned int>(mem_status.total_mem/1024)<<"GB";
else
oss<<static_cast<unsigned int>(mem_status.used_mem)<<"/"<<static_cast<unsigned int>(mem_status.total_mem)<<"MB";
}
if( use_colors )
{
if( use_powerline_left )
{
powerline( oss, mem_lut[color], POWERLINE_LEFT, true );
}
else if( !use_powerline_right )
{
oss << "#[fg=default,bg=default]";
}
}
return oss.str();
}

View file

@ -1,58 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MEMORY_H_
#define MEMORY_H_
#include <string>
/** Memory status in megabytes */
struct MemoryStatus
{
float used_mem;
float total_mem;
};
/** Get the current memory status */
void mem_status( MemoryStatus & status );
/** Memory status string output mode.
*
* Examples:
*
* MEMORY_MODE_DEFAULT: 11156/16003MB
* MEMORY_MODE_FREE_MEMORY:
* MEMORY_MODE_USAGE_PERCENTAGE:
*/
enum MEMORY_MODE
{
MEMORY_MODE_DEFAULT,
MEMORY_MODE_FREE_MEMORY,
MEMORY_MODE_USAGE_PERCENTAGE
};
std::string mem_string( const MemoryStatus & mem_status,
MEMORY_MODE mode = MEMORY_MODE_DEFAULT,
bool use_colors = false,
bool use_powerline_left = false,
bool use_powerline_right = false,
bool segments_to_left = false,
short left_color = 0 );
#endif

View file

@ -1,102 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2016 Michał Goliński
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "powerline.h"
#include <string>
#include <cstring>
#include <sstream>
#define PWL_LEFT_FILLED ""
#define PWL_RIGHT_FILLED ""
const char * bg2fg( const char s[] )
{
static char buf[40] = {0};
const char *substr = strchr(s, ',');
buf[0] = '#';
buf[1] = '[';
buf[2] = 'f';
strcpy(buf+3, substr+2);
return buf;
}
void powerline( std::ostringstream & oss, const char color[],
POWERLINE_DIRECTION direction, bool background_only )
{
switch( direction )
{
case NONE:
oss << color;
break;
case POWERLINE_LEFT:
if( background_only )
{
oss << ' ' << bg2fg( color );
}
else
{
std::string colorstr( color );
oss << "#[" << colorstr.substr( colorstr.find( "," ) + 1 )
<< PWL_LEFT_FILLED
<< color;
}
break;
case POWERLINE_RIGHT:
oss << ' '
<< bg2fg( color )
<< PWL_RIGHT_FILLED
<< color;
break;
};
}
void powerline_char( std::ostringstream & oss, const char dynamic_color[],
short static_color, POWERLINE_DIRECTION direction, bool eol )
{
char write_color[7];
sprintf(write_color, "%d", static_color);
switch( direction )
{
case NONE:
break;
case POWERLINE_LEFT:
if ( eol )
{
oss << bg2fg( dynamic_color ) << "#[bg=colour" << write_color << "]";
}
else
{
oss << dynamic_color << "#[fg=colour" << write_color << "]";
}
oss << PWL_LEFT_FILLED << dynamic_color;
break;
case POWERLINE_RIGHT:
if ( eol )
{
oss << dynamic_color << "#[fg=colour" << write_color << "] ";
}
else
{
oss << bg2fg(dynamic_color) << " #[bg=colour" << write_color << "]";
}
oss << PWL_RIGHT_FILLED << dynamic_color;
break;
}
}

View file

@ -1,40 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2016 Michał Goliński
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef POWERLINE_H
#define POWERLINE_H
#include <sstream>
enum POWERLINE_DIRECTION
{
NONE,
POWERLINE_LEFT,
POWERLINE_RIGHT
};
/** Print out a powerline left character inverted version of the given
* color. In the case of of using powerline left, the background color needs
* to be inverted to the foreground before the powerline character is printed
* in the next entr. */
void powerline( std::ostringstream & oss, const char color[],
POWERLINE_DIRECTION direction, bool background_only = false );
void powerline_char( std::ostringstream & oss, const char dynamic_color[],
short static_color, POWERLINE_DIRECTION direction, bool eol = false );
#endif // POWERLINE_H

View file

@ -1,24 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// the configured options and settings for sysstat
#define tmux_mem_cpu_load_VERSION_MAJOR @tmux-mem-cpu-load_VERSION_MAJOR@
#define tmux_mem_cpu_load_VERSION_MINOR @tmux-mem-cpu-load_VERSION_MINOR@
#define tmux_mem_cpu_load_VERSION_PATCH @tmux-mem-cpu-load_VERSION_PATCH@
#define tmux_mem_cpu_load_VERSION "@tmux-mem-cpu-load_VERSION@"

View file

@ -1,65 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2013 Justin Crawford <Justasic@gmail.com>
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Based on: github.com/freebsd/freebsd/blob/master/usr.bin/top/machine.c
// Based on: Apple.cpp for load_string/mem_string and apple's documentation
#include <sys/types.h>
#include <unistd.h> // usleep
#include "getsysctl.h"
#include "cpu.h"
uint32_t get_cpu_count()
{
int32_t cpu_count = 0;
GETSYSCTL( "hw.ncpu", cpu_count );
return static_cast<uint32_t>( cpu_count );
}
float cpu_percentage( unsigned int cpu_usage_delay )
{
u_long load1[CP_STATES];
u_long load2[CP_STATES];
GETSYSCTL( "kern.cp_time", load1 );
usleep( cpu_usage_delay );
GETSYSCTL( "kern.cp_time", load2 );
// Current load times
unsigned long long current_user = load1[CP_USER];
unsigned long long current_system = load1[CP_SYS];
unsigned long long current_nice = load1[CP_NICE];
unsigned long long current_idle = load1[CP_IDLE];
// Next load times
unsigned long long next_user = load2[CP_USER];
unsigned long long next_system = load2[CP_SYS];
unsigned long long next_nice = load2[CP_NICE];
unsigned long long next_idle = load2[CP_IDLE];
// Difference between the two
unsigned long long diff_user = next_user - current_user;
unsigned long long diff_system = next_system - current_system;
unsigned long long diff_nice = next_nice - current_nice;
unsigned long long diff_idle = next_idle - current_idle;
return static_cast<float>( diff_user + diff_system + diff_nice ) /
static_cast<float>( diff_user + diff_system + diff_nice + diff_idle ) *
100.0;
}

View file

@ -1,70 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Based on: github.com/freebsd/freebsd/blob/master/usr.bin/top/machine.c
// Based on: Apple.cpp for load_string/mem_string and apple's documentation
#include <sstream>
#include <string>
#include <sys/types.h>
#include <unistd.h>
#include "getsysctl.h"
#include "memory.h"
#include "conversions.h"
void mem_status( MemoryStatus & status )
{
// These values are in bytes
//u_int total;
//u_int free;
//u_int inactive;
//u_int cache;
u_int wired;
u_int active;
u_int page_size;
u_int page_count;
// Get total physical memory, page size, and some other needed info
// instead of using realmem which reports quantity of ram installed on
// platform, use physmem which reports ram available to system.
//GETSYSCTL( "hw.physmem", total );
page_size = getpagesize();
// page count reflects actual size of memory we have available for
// applications. it will be less than realmem or physmem, since it doesn't
// include what's been allocated for kernel, but it will be equal to
// free + inactive + cache + wired + active, and thus will reflect better
// what's actually available.
GETSYSCTL( "vm.stats.vm.v_page_count", page_count );
//GETSYSCTL( "vm.stats.vm.v_free_count", free );
//GETSYSCTL( "vm.stats.vm.v_inactive_count", inactive );
//GETSYSCTL( "vm.stats.vm.v_cache_count", cache );
GETSYSCTL( "vm.stats.vm.v_wire_count", wired ); // Buffers
GETSYSCTL( "vm.stats.vm.v_active_count", active );
// Get all memory which can be allocated, which on FreeBSD is:
// cached + inactive + free
//u_int unused = ( cache + inactive + free ) * page_size;
// Used memory on FreeBSD is active + wired.
u_int used = ( active + wired );
status.used_mem = convert_unit( static_cast< float >( used * (page_size >> 10) ), MEGABYTES, KILOBYTES );
status.total_mem = convert_unit( static_cast< float >( page_count * (page_size >> 10) ), MEGABYTES, KILOBYTES);
}

View file

@ -1,78 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <string>
#include <fstream>
#include <unistd.h> // usleep
#include "cpu.h"
#include "luts.h"
uint32_t get_cpu_count()
{
return sysconf( _SC_NPROCESSORS_ONLN );
}
float cpu_percentage( unsigned cpu_usage_delay )
{
std::string line;
size_t substr_start = 0;
size_t substr_len;
// cpu stats
// user, nice, system, idle
// in that order
unsigned long long stats[CP_STATES];
std::ifstream stat_file( "/proc/stat" );
getline( stat_file, line );
stat_file.close();
// skip "cpu"
substr_len = line.find_first_of( " ", 3 );
// parse cpu line
for( unsigned i=0; i < 4; i++ )
{
substr_start = line.find_first_not_of( " ", substr_len );
substr_len = line.find_first_of( " ", substr_start );
stats[i] = std::stoll( line.substr( substr_start, substr_len ) );
}
usleep( cpu_usage_delay );
stat_file.open( "/proc/stat" );
getline( stat_file, line );
stat_file.close();
// skip "cpu"
substr_len = line.find_first_of( " ", 3 );
// parse cpu line
for( unsigned i=0; i < 4; i++ )
{
substr_start = line.find_first_not_of( " ", substr_len );
substr_len = line.find_first_of ( " ", substr_start );
stats[i] = std::stoll( line.substr( substr_start, substr_len ) ) - stats[i];
}
return static_cast<float>(
stats[CP_USER] + stats[CP_NICE] + stats[CP_SYS]
) / static_cast<float>(
stats[CP_USER] + stats[CP_NICE] + stats[CP_SYS] + stats[CP_IDLE]
) * 100.0;
}

View file

@ -1,93 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sstream>
#include <fstream>
#include <sys/sysinfo.h>
#include "memory.h"
#include "conversions.h"
void mem_status( MemoryStatus & status )
{
std::string line;
std::string substr;
size_t substr_start;
size_t substr_len;
unsigned int total_mem;
unsigned int used_mem;
/* Since linux uses some RAM for disk caching, the actuall used ram is lower
* than what sysinfo(), top or free reports. htop reports the usage in a
* correct way. The memory used for caching doesn't count as used, since it
* can be freed in any moment. Usually it hapens automatically, when an
* application requests memory.
* In order to calculate the ram that's actually used we need to use the
* following formula:
* total_ram + shmem - free_ram - buffered_ram - cached_ram - srclaimable
*
* example data, junk removed, with comments added:
*
* MemTotal: 61768 kB old
* MemFree: 1436 kB old
* MemAvailable ????? kB ??
* MemShared: 0 kB old (now always zero; not calculated)
* Buffers: 1312 kB old
* Cached: 20932 kB old
* SwapTotal: 122580 kB old
* SwapFree: 60352 kB old
*/
std::ifstream memory_info("/proc/meminfo");
while( std::getline( memory_info, line ) )
{
substr_start = 0;
substr_len = line.find_first_of( ':' );
substr = line.substr( substr_start, substr_len );
substr_start = line.find_first_not_of( " ", substr_len + 1 );
substr_len = line.find_first_of( 'k' ) - substr_start;
if( substr.compare( "MemTotal" ) == 0 )
{
// get total memory
total_mem = stol( line.substr( substr_start, substr_len ) );
}
else if( substr.compare( "MemFree" ) == 0 )
{
used_mem = total_mem - stol( line.substr( substr_start, substr_len ) );
}
else if( substr.compare( "Shmem" ) == 0 )
{
used_mem += stol( line.substr( substr_start, substr_len ) );
}
else if( substr.compare( "Buffers" ) == 0 ||
substr.compare( "Cached" ) == 0 ||
substr.compare( "SReclaimable" ) == 0 )
{
used_mem -= stol( line.substr( substr_start, substr_len ) );
}
}
// we want megabytes on output, but since the values already come as
// kilobytes we need to divide them by 1024 only once, thus we use
// KILOBYTES
status.used_mem = convert_unit(static_cast< float >( used_mem ), MEGABYTES, KILOBYTES);
status.total_mem = convert_unit(static_cast< float >( total_mem ), MEGABYTES, KILOBYTES);
}

View file

@ -1,65 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2013 Justin Crawford <Justasic@gmail.com>
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Based on: github.com/freebsd/freebsd/blob/master/usr.bin/top/machine.c
// Based on: Apple.cpp for load_string/mem_string and apple's documentation
#include <sys/types.h>
#include <unistd.h> // usleep
#include "getsysctl.h"
#include "cpu.h"
uint32_t get_cpu_count()
{
int cpu_count = 0;
GETSYSCTL( "hw.ncpu", cpu_count );
return static_cast<uint32_t>( cpu_count );
}
float cpu_percentage( unsigned int cpu_usage_delay )
{
u_int64_t load1[CP_STATES];
u_int64_t load2[CP_STATES];
GETSYSCTL( "kern.cp_time", load1 );
usleep( cpu_usage_delay );
GETSYSCTL( "kern.cp_time", load2 );
// Current load times
unsigned long long current_user = load1[CP_USER];
unsigned long long current_system = load1[CP_SYS];
unsigned long long current_nice = load1[CP_NICE];
unsigned long long current_idle = load1[CP_IDLE];
// Next load times
unsigned long long next_user = load2[CP_USER];
unsigned long long next_system = load2[CP_SYS];
unsigned long long next_nice = load2[CP_NICE];
unsigned long long next_idle = load2[CP_IDLE];
// Difference between the two
unsigned long long diff_user = next_user - current_user;
unsigned long long diff_system = next_system - current_system;
unsigned long long diff_nice = next_nice - current_nice;
unsigned long long diff_idle = next_idle - current_idle;
return static_cast<float>( diff_user + diff_system + diff_nice ) /
static_cast<float>( diff_user + diff_system + diff_nice + diff_idle ) *
100.0;
}

View file

@ -1,48 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sstream>
#include <string>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <uvm/uvm_extern.h> // uvmexp struct
#include "error.h"
#include "conversions.h"
#include "memory.h"
void mem_status( MemoryStatus & status )
{
// get vm memory stats
static int vm_totalmem[] = { CTL_VM, VM_UVMEXP2 };
struct uvmexp_sysctl mem;
size_t size = sizeof( mem );
if( sysctl( vm_totalmem, 2, &mem, &size, NULL, 0 ) < 0 )
{
error( "memory: error getting vm memory stats" );
}
int64_t total_mem = ( mem.npages << mem.pageshift );
int64_t used_mem =
( mem.active + mem.wired - mem.filepages ) << mem.pageshift;
// add 1 to used which gets lost somewhere along conversions
status.used_mem = convert_unit(static_cast< float >( used_mem ), MEGABYTES );
status.total_mem = convert_unit(static_cast< float >( total_mem ), MEGABYTES );
}

View file

@ -1,85 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <unistd.h> // usleep
#include <sys/sysctl.h>
#include <sys/types.h>
#include "error.h"
#include "cpu.h"
uint32_t get_cpu_count()
{
int cpu_count = 1; // default to 1
int mib[2] = { CTL_HW, HW_NCPUONLINE };
size_t len = sizeof( cpu_count );
if( sysctl( mib, 2, &cpu_count, &len, NULL, 0 ) < 0 )
{
error( "sysctl: error getting cpu count" );
}
return static_cast<uint32_t>( cpu_count );
}
float cpu_percentage( unsigned int cpu_usage_delay )
{
int cpu_ctl[] = { CTL_KERN, KERN_CPTIME };
u_long load1[CP_STATES];
u_long load2[CP_STATES];
size_t size = sizeof( load1 );
// get cpu times
if( sysctl( cpu_ctl, 2, &load1, &size, NULL, 0 ) < 0 )
{
error( "sysctl: error getting initial cpu stats" );
}
usleep( cpu_usage_delay );
size = sizeof( load2 );
// update cpu times
if( sysctl( cpu_ctl, 2, &load2, &size, NULL, 0 ) < 0 )
{
error( "sysctl: error getting updated cpu stats" );
}
// Current load times
unsigned long long current_user = load1[CP_USER];
unsigned long long current_system = load1[CP_SYS];
unsigned long long current_nice = load1[CP_NICE];
unsigned long long current_idle = load1[CP_IDLE];
// Next load times
unsigned long long next_user = load2[CP_USER];
unsigned long long next_system = load2[CP_SYS];
unsigned long long next_nice = load2[CP_NICE];
unsigned long long next_idle = load2[CP_IDLE];
// Difference between the two
unsigned long long diff_user = next_user - current_user;
unsigned long long diff_system = next_system - current_system;
unsigned long long diff_nice = next_nice - current_nice;
unsigned long long diff_idle = next_idle - current_idle;
return static_cast<float>( diff_user + diff_system + diff_nice ) /
static_cast<float>( diff_user + diff_system + diff_nice + diff_idle ) *
100.0;
}

View file

@ -1,90 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sstream>
#include <string>
// Ugly fix to compilation on OpenBSD 5.6
// these need to be before include sys/mount.h
// and be in this exact order. Otherwise compiling on
// OpenBSD 5.6 will fail with missing NGROUPS define
// or missing gid_t typedefs
#ifdef OPENBSD_WORKAROUND
#include <sys/types.h> // typedefs
#include <sys/param.h> // missing NGROUPS
#include <sys/ucred.h>
#else
#include <sys/types.h>
#endif
#include <sys/mount.h> // VFS_* which we use to get cache
#include <sys/sysctl.h>
#include "error.h"
#include "memory.h"
#include "conversions.h"
void mem_status( MemoryStatus & status )
{
// These values are in bytes
int64_t total_mem = 0;
int64_t used_mem = 0;
int32_t free_mem = 0;
size_t size;
// get page size
static int hw_pagesize[] = { CTL_HW, HW_PAGESIZE };
int page_size = 0;
size = sizeof( page_size );
if( sysctl( hw_pagesize, 2, &page_size, &size, NULL, 0 ) < 0 )
{
error( "memory: error getting page size" );
}
// get vm memory stats
static int uvmexp_mib[] = { CTL_VM, VM_UVMEXP };
struct uvmexp uvmexp;
size = sizeof( uvmexp );
if( sysctl( uvmexp_mib, 2, &uvmexp, &size, NULL, 0 ) < 0 )
{
error( "memory: error getting vm memory stats" );
}
// In case we need it, this gets the cached memory (bcstats.numbufpages)
static int vm_bcstats[] = { CTL_VFS, VFS_GENERIC, VFS_BCACHESTAT };
struct bcachestats bcstats;
size = sizeof( bcstats );
if( sysctl( vm_bcstats, 3, &bcstats, &size, NULL, 0 ) < 0 )
{
error( "memory: error getting cached memory size" );
}
// calculations based on libgtop
used_mem = ( (uint64_t) uvmexp.npages - uvmexp.free ) << uvmexp.pageshift;
free_mem = ( (uint64_t) uvmexp.free ) << uvmexp.pageshift;
// from nagios-memory plugin
used_mem -= ( (uint64_t) bcstats.numbufpages ) << uvmexp.pageshift;
free_mem += ( (uint64_t) bcstats.numbufpages ) << uvmexp.pageshift;
// calculate total memory
total_mem = ( (uint64_t) uvmexp.npages ) << uvmexp.pageshift;
status.used_mem = convert_unit(static_cast< float >( used_mem ), MEGABYTES );
status.total_mem = convert_unit(static_cast< float >( total_mem ), MEGABYTES );
}

View file

@ -1,80 +0,0 @@
/*
* Copyright 2012 Matthew McCormick
* Copyright 2013 Justin Crawford <Justasic@gmail.com>
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <mach/mach.h>
#include <unistd.h> // usleep()
#include "cpu.h"
uint32_t get_cpu_count()
{
return sysconf( _SC_NPROCESSORS_ONLN );
}
// OSX or BSD based system, use BSD APIs instead
// See: http://www.opensource.apple.com/source/xnu/xnu-201/osfmk/mach/host_info.h
// and: http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/
host_cpu_load_info_data_t _get_cpu_percentage()
{
kern_return_t error;
mach_msg_type_number_t count;
host_cpu_load_info_data_t r_load;
mach_port_t mach_port;
count = HOST_CPU_LOAD_INFO_COUNT;
mach_port = mach_host_self();
error = host_statistics(mach_port, HOST_CPU_LOAD_INFO,
( host_info_t )&r_load, &count );
if ( error != KERN_SUCCESS )
{
return host_cpu_load_info_data_t();
}
return r_load;
}
float cpu_percentage( unsigned int cpu_usage_delay )
{
// Get the load times from the XNU kernel
host_cpu_load_info_data_t load1 = _get_cpu_percentage();
usleep( cpu_usage_delay );
host_cpu_load_info_data_t load2 = _get_cpu_percentage();
// Current load times
unsigned long long current_user = load1.cpu_ticks[CP_USER];
unsigned long long current_system = load1.cpu_ticks[CP_SYS];
unsigned long long current_nice = load1.cpu_ticks[CP_NICE];
unsigned long long current_idle = load1.cpu_ticks[CP_IDLE];
// Next load times
unsigned long long next_user = load2.cpu_ticks[CP_USER];
unsigned long long next_system = load2.cpu_ticks[CP_SYS];
unsigned long long next_nice = load2.cpu_ticks[CP_NICE];
unsigned long long next_idle = load2.cpu_ticks[CP_IDLE];
// Difference between the two
unsigned long long diff_user = next_user - current_user;
unsigned long long diff_system = next_system - current_system;
unsigned long long diff_nice = next_nice - current_nice;
unsigned long long diff_idle = next_idle - current_idle;
return static_cast<float>( diff_user + diff_system + diff_nice ) /
static_cast<float>( diff_user + diff_system + diff_nice + diff_idle ) *
100.0;
}

View file

@ -1,65 +0,0 @@
/*
* Copyright 2012 Matthew McCormick
* Copyright 2013 Justin Crawford <Justasic@gmail.com>
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <string>
#include <sstream>
#include <mach/mach.h>
#include <sys/sysctl.h> // for sysctl
#include "memory.h"
#include "conversions.h"
void mem_status( MemoryStatus & status )
{
// These values are in bytes
u_int64_t total_mem;
// float app_mem = 0.0f;
// float cached_file_mem = 0.0f;
float available_mem = 0.0f;
float percentage_mem;
float free_mem;
float free_mem_in_gigabytes; // used to check if free mem < 1 GB
//u_int64_t unused_mem;
vm_size_t page_size;
vm_statistics64_data_t vm_stats; // Use 64-bit VM statistics
// Get total physical memory
int mib[] = { CTL_HW, HW_MEMSIZE };
size_t length = sizeof( total_mem );
sysctl( mib, 2, &total_mem, &length, NULL, 0 );
mach_port_t mach_port = mach_host_self();
// Use HOST_VM_INFO64_COUNT as the count for vm_statistics64_data_t
mach_msg_type_number_t count = HOST_VM_INFO64_COUNT;
if( KERN_SUCCESS == host_page_size( mach_port, &page_size ) &&
KERN_SUCCESS == host_statistics64( mach_port, HOST_VM_INFO64,
( host_info_t )&vm_stats, &count )
)
{
//unused_mem = static_cast<u_int64_t>( vm_stats.free_count * page_size );
// app_mem = static_cast<float>(( vm_stats.internal_page_count - vm_stats.purgeable_count ) * page_size );
// cached_file_mem = static_cast<float>(( vm_stats.purgeable_count + vm_stats.external_page_count ) * page_size );
available_mem = static_cast<float>(( vm_stats.free_count + vm_stats.external_page_count - vm_stats.speculative_count ) * page_size );
}
status.used_mem = convert_unit(static_cast< float >(total_mem - available_mem ), MEGABYTES );
status.total_mem = convert_unit(static_cast< float >( total_mem ), MEGABYTES );
}

144
screen-cpu-usage.cpp Normal file
View file

@ -0,0 +1,144 @@
/**
* @file cpuusage.cpp
* @brief print out the percent cpu usage at a given interval
* @author Matthew McCormick (thewtex)
* @version
* @date 2009-08-12
*/
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
#include <unistd.h> // sleep
// in seconds
const static unsigned int INTERVAL=1;
class CPUPercentage
{
public:
CPUPercentage();
~CPUPercentage();
const float& get_percentage();
private:
ifstream m_stat_file;
unsigned long long m_current_user;
unsigned long long m_current_system;
unsigned long long m_current_nice;
unsigned long long m_current_idle;
unsigned long long m_next_user;
unsigned long long m_next_system;
unsigned long long m_next_nice;
unsigned long long m_next_idle;
unsigned long long m_diff_user;
unsigned long long m_diff_system;
unsigned long long m_diff_nice;
unsigned long long m_diff_idle;
string m_stat_line;
size_t m_line_start_pos;
size_t m_line_end_pos;
istringstream m_iss;
float m_percentage;
};
CPUPercentage::CPUPercentage():
m_current_user(0),
m_current_system(0),
m_current_nice(0),
m_current_idle(0),
m_next_user(0),
m_next_system(0),
m_next_nice(0),
m_next_idle(0),
m_diff_user(0),
m_diff_system(0),
m_diff_nice(0),
m_diff_idle(0)
{
m_stat_file.exceptions(ifstream::eofbit|ifstream::failbit|ifstream::badbit);
}
CPUPercentage::~CPUPercentage()
{
if(m_stat_file.is_open())
m_stat_file.close();
}
const float& CPUPercentage::get_percentage()
{
m_stat_file.open("/proc/stat");
getline(m_stat_file, m_stat_line);
m_stat_file.close();
// skip "cpu"
m_line_start_pos = m_stat_line.find_first_not_of(" ", 3);
m_line_end_pos = m_stat_line.find_first_of(' ', m_line_start_pos);
m_line_end_pos = m_stat_line.find_first_of(' ', m_line_end_pos + 1);
m_line_end_pos = m_stat_line.find_first_of(' ', m_line_end_pos + 1);
m_line_end_pos = m_stat_line.find_first_of(' ', m_line_end_pos + 1);
m_iss.str(m_stat_line.substr(m_line_start_pos, m_line_end_pos - m_line_start_pos));
m_iss >> m_next_user >> m_next_nice >> m_next_system >> m_next_idle;
m_iss.clear();
m_diff_user = m_next_user - m_current_user;
m_diff_system = m_next_system - m_current_system;
m_diff_nice = m_next_nice - m_current_nice;
m_diff_idle = m_next_idle - m_current_idle;
m_percentage = static_cast<float>(m_diff_user + m_diff_system + m_diff_nice)/static_cast<float>(m_diff_user + m_diff_system + m_diff_nice + m_diff_idle)*100.0;
m_current_user = m_next_user;
m_current_system = m_next_system;
m_current_nice = m_next_nice;
m_current_idle = m_next_idle;
return m_percentage;
}
int main(int argc, char** argv)
{
string meter = "[ ]";
int meter_count = 0;
float percentage = 0.0;
CPUPercentage cpu_per;
cout.precision(1);
cout.setf(ios::fixed | ios::right);
cout.width(5);
try
{
while(true)
{
percentage = cpu_per.get_percentage();
meter_count = 1;
while(meter_count*9.99 < percentage)
{
meter[meter_count] = '|';
meter_count++;
}
while(meter_count <= 10)
{
meter[meter_count] = ' ';
meter_count++;
}
cout << meter << ' ';
cout.width(5);
cout << percentage << endl;
sleep(1);
}
}
catch(const exception &e)
{
cerr << "Error: " << e.what() << endl;
return 1;
}
return 0;
}

9
screen-mem-usage Executable file
View file

@ -0,0 +1,9 @@
#!/bin/sh
total_mem=$(free -m | awk '$1 == "Mem:" { print $2 }')
while(true); do
current_mem=$(free -m | awk '$1 == "-/+" { print $3 }')
echo "${current_mem}MB/${total_mem}MB"
sleep 3
done

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -1,49 +0,0 @@
# vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
#
# Copyright 2012 Matthew McCormick
# Copyright 2015 Pawel 'l0ner' Soltys
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# The directory where this plugin is located.
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [ ! -f $CURRENT_DIR/tmux-mem-cpu-load ] && ! $(builtin type -P "tmux-mem-cpu-load" &> /dev/null) ; then
tmux run-shell "echo \"tmux-mem-cpu-load not found. Attempting to build.
\""
pushd $CURRENT_DIR #Pushd to the directory where this plugin is located.
# Attempt to rebuild the plugin and log any errors in the tmux display window.
if output=$(cmake . 2>&1); then
tmux run-shell "echo \"'cmake $CURRENT_DIR' completed successfully.
\""
else
tmux run-shell "echo \"'cmake $CURRENT_DIR' failed. Error logged below.
$output
\""
exit 1
fi
if output=$(cmake --build . 2>&1); then
tmux run-shell "echo \"tmux-mem-cpu-load built successfully.
\""
else
tmux run-shell "echo \"tmux-mem-cpu-load failed to build. Error logged below.
$output
\""
exit 1
fi
popd
fi

View file

@ -1,25 +0,0 @@
# vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
#
# Copyright 2012 Matthew McCormick
# Copyright 2015 Pawel 'l0ner' Soltys
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
if [ ! -s /usr/local/bin/tmux-mem-cpu-load ];
then
pushd ${0:a:h} #Pushd to the directory where this plugin is located.
cmake .
make
sudo make install
popd
fi

View file

@ -1,53 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <string>
#include <fstream>
#include <unistd.h> // usleep
#include <thread>
#include "TCHAR.h"
#include "pdh.h"
static PDH_HQUERY cpuQuery;
static PDH_HCOUNTER cpuTotal;
#include "cpu.h"
#include "luts.h"
uint32_t get_cpu_count()
{
return static_cast< uint32_t >( std::thread::hardware_concurrency() );
}
float cpu_percentage( unsigned cpu_usage_delay )
{
PdhOpenQuery(NULL, 0, &cpuQuery);
PdhAddCounter(cpuQuery, "\\Processor(_Total)\\% Processor Time", 0, &cpuTotal);
PdhCollectQueryData(cpuQuery);
usleep( cpu_usage_delay );
PDH_FMT_COUNTERVALUE counterVal;
PdhCollectQueryData(cpuQuery);
PdhGetFormattedCounterValue(cpuTotal, PDH_FMT_DOUBLE, NULL, &counterVal);
return static_cast< float >( counterVal.doubleValue );
}

View file

@ -1,44 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2013 Justin Crawford <Justasic@gmail.com>
* Copyright 2015 Pawel 'l0ner' Soltys
* Copyright 2016 Compilenix
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Based on: github.com/freebsd/freebsd/blob/master/usr.bin/top/machine.c
// Based on: Apple.cpp for load_string/mem_string and apple's documentation
#include <sstream>
#include <string>
#include <cmath> // floorf()
#include <sys/types.h>
#include "cpu.h"
#include "load.h"
#include "luts.h"
#include "powerline.h"
// Load Averages
std::string load_string( bool use_colors,
bool use_powerline_left, bool use_powerline_right,
short num_averages )
{
// Not implemented
std::ostringstream ss;
ss << (char) 0;
return ss.str();
}

View file

@ -1,40 +0,0 @@
/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap
*
* Copyright 2012 Matthew McCormick
* Copyright 2015 Pawel 'l0ner' Soltys
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sstream>
#include <fstream>
#include "windows.h"
#include "memory.h"
#include "conversions.h"
void mem_status( MemoryStatus & status )
{
MEMORYSTATUSEX memory_status;
memory_status.dwLength = sizeof(memory_status);
GlobalMemoryStatusEx(&memory_status);
// we want megabytes on output, but since the values already come as
// kilobytes we need to divide them by 1024 only once, thus we use
// KILOBYTES
status.used_mem = convert_unit(static_cast< float >( memory_status.ullAvailPhys ), MEGABYTES, BYTES);
status.total_mem = convert_unit(static_cast< float >( memory_status.ullTotalPhys ), MEGABYTES, BYTES);
}