diff options
-rw-r--r-- | configure.ac | 12 | ||||
-rw-r--r-- | src/Makefile.am | 5 | ||||
-rw-r--r-- | src/org.mate.system-monitor.gschema.xml.in.in | 34 | ||||
-rw-r--r-- | src/procdialogs.cpp | 15 | ||||
-rw-r--r-- | src/procman.h | 7 | ||||
-rw-r--r-- | src/proctable.cpp | 88 | ||||
-rw-r--r-- | src/proctable.h | 4 |
7 files changed, 149 insertions, 16 deletions
diff --git a/configure.ac b/configure.ac index 10ce372..0edfd3b 100644 --- a/configure.ac +++ b/configure.ac @@ -64,6 +64,17 @@ AC_ARG_WITH([gtk], PKG_CHECK_MODULES(GMODULE,gmodule-2.0,[GMODULE_ADD="gmodule-2.0"],[GMODULE_ADD=""]) PKG_CHECK_MODULES(PROCMAN,$GMODULE_ADD glib-2.0 >= $GLIB_REQUIRED libgtop-2.0 >= $LIBGTOP_REQUIRED libwnck-$LIBWNCK_API_VERSION >= $LIBWNCK_REQUIRED gtk+-$GTK_API_VERSION >= $GTK_REQUIRED mate-icon-theme >= $MATE_ICON_THEME_REQUIRED gtkmm-$GTKMM_API_VERSION >= $GTKMM_REQUIRED libxml-2.0 >= $LIBXML_REQUIRED librsvg-2.0 >= $RSVG_REQUIRED glibmm-2.4 >= $GLIBMM_REQUIRED giomm-2.4 >= $GIOMM_REQUIRED) +have_systemd=no +AC_ARG_ENABLE(systemd, AS_HELP_STRING([--disable-systemd], [disable systemd support])) +if test "x$enable_systemd" != "xno"; then + PKG_CHECK_MODULES(SYSTEMD, [ libsystemd-daemon libsystemd-login ], + [AC_DEFINE(HAVE_SYSTEMD, 1, [Define if systemd is available]) have_systemd=yes], have_systemd=no) + if test "x$have_systemd" = xno -a "x$enable_systemd" = xyes; then + AC_MSG_ERROR([*** systemd support requested but libraries not found]) + fi +fi +AM_CONDITIONAL(HAVE_SYSTEMD, [test "$have_systemd" = "yes"]) + # Compiler warnings MATE_COMPILE_WARNINGS([maximum]) @@ -126,4 +137,5 @@ Configuration: CXXFLAGS: ${CXXFLAGS} Gtk+ Version: ${GTK_API_VERSION} Maintainer mode: ${USE_MAINTAINER_MODE} + Systemd support: ${have_systemd} " diff --git a/src/Makefile.am b/src/Makefile.am index 286594f..3c350bb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -4,7 +4,8 @@ AM_CPPFLAGS = \ -DPROCMAN_DATADIR=\""$(datadir)/procman/"\" \ -DMATELOCALEDIR=\""$(datadir)/locale"\" \ -DDATADIR=\""$(datadir)"\" \ - @PROCMAN_CFLAGS@ + @PROCMAN_CFLAGS@ \ + @SYSTEMD_CFLAGS@ bin_PROGRAMS = mate-system-monitor @@ -47,7 +48,7 @@ mate_system_monitor_SOURCES = \ $(mate_system_monitor_cpp_files) \ $(mate_system_monitor_c_files) -mate_system_monitor_LDADD = @PROCMAN_LIBS@ libbacon.la +mate_system_monitor_LDADD = @PROCMAN_LIBS@ @SYSTEMD_LIBS@ libbacon.la noinst_LTLIBRARIES = libbacon.la diff --git a/src/org.mate.system-monitor.gschema.xml.in.in b/src/org.mate.system-monitor.gschema.xml.in.in index c27c4a8..4a3c9e9 100644 --- a/src/org.mate.system-monitor.gschema.xml.in.in +++ b/src/org.mate.system-monitor.gschema.xml.in.in @@ -296,10 +296,42 @@ <_summary>Show process 'Control Group' column on startup</_summary> </key> <key name="col-18-width" type="i"> + <default>70</default> + <_summary>Width of process 'Unit' column</_summary> + </key> + <key name="col-18-visible" type="b"> + <default>true</default> + <_summary>Show process 'Unit' column on startup</_summary> + </key> + <key name="col-19-width" type="i"> + <default>41</default> + <_summary>Width of process 'Session' column</_summary> + </key> + <key name="col-19-visible" type="b"> + <default>false</default> + <_summary>Show process 'Session' column on startup</_summary> + </key> + <key name="col-20-width" type="i"> + <default>59</default> + <_summary>Width of process 'Seat' column</_summary> + </key> + <key name="col-20-visible" type="b"> + <default>false</default> + <_summary>Show process 'Seat' column on startup</_summary> + </key> + <key name="col-21-width" type="i"> + <default>59</default> + <_summary>Width of process 'Owner' column</_summary> + </key> + <key name="col-21-visible" type="b"> + <default>false</default> + <_summary>Show process 'Owner' column on startup</_summary> + </key> + <key name="col-22-width" type="i"> <default>100</default> <_summary>Width of process 'Priority' column</_summary> </key> - <key name="col-18-visible" type="b"> + <key name="col-22-visible" type="b"> <default>true</default> <_summary>Show process 'Priority' column on startup</_summary> </key> diff --git a/src/procdialogs.cpp b/src/procdialogs.cpp index c51a769..7d7aace 100644 --- a/src/procdialogs.cpp +++ b/src/procdialogs.cpp @@ -24,6 +24,11 @@ #include <signal.h> #include <string.h> + +#ifdef HAVE_SYSTEMD +#include <systemd/sd-daemon.h> +#endif + #include "procdialogs.h" #include "proctable.h" #include "callbacks.h" @@ -469,6 +474,16 @@ create_field_page(GtkWidget *tree, const char* text) if ((column_id == COL_CGROUP) && (!cgroups_enabled())) continue; + if ((column_id == COL_UNIT || + column_id == COL_SESSION || + column_id == COL_SEAT || + column_id == COL_OWNER) +#ifdef HAVE_SYSTEMD + && sd_booted() <= 0 +#endif + ) + continue; + visible = gtk_tree_view_column_get_visible (column); gtk_list_store_append (model, &iter); diff --git a/src/procman.h b/src/procman.h index 91f7ea4..55fea88 100644 --- a/src/procman.h +++ b/src/procman.h @@ -139,6 +139,12 @@ MutableProcInfo() guint pcpu; gint nice; gchar *cgroup_name; + + gchar *unit; + gchar *session; + gchar *seat; + + std::string owner; }; @@ -173,6 +179,7 @@ class ProcInfo // adds one more ref to icon void set_icon(Glib::RefPtr<Gdk::Pixbuf> icon); void set_user(guint uid); + std::string lookup_user(guint uid); GtkTreeIter node; Glib::RefPtr<Gdk::Pixbuf> pixbuf; diff --git a/src/proctable.cpp b/src/proctable.cpp index 8f993d0..25b1f36 100644 --- a/src/proctable.cpp +++ b/src/proctable.cpp @@ -44,6 +44,11 @@ #include <set> #include <list> +#ifdef HAVE_SYSTEMD +#include <systemd/sd-daemon.h> +#include <systemd/sd-login.h> +#endif + #include "procman.h" #include "selection.h" #include "proctable.h" @@ -259,6 +264,10 @@ proctable_new (ProcData * const procdata) /* xgettext: combined noun, the function the process is waiting in, see wchan ps(1) */ N_("Waiting Channel"), N_("Control Group"), + N_("Unit"), + N_("Session"), + N_("Seat"), + N_("Owner"), N_("Priority"), NULL, "POINTER" @@ -290,6 +299,10 @@ proctable_new (ProcData * const procdata) G_TYPE_ULONG, /* Memory */ G_TYPE_STRING, /* wchan */ G_TYPE_STRING, /* Cgroup */ + G_TYPE_STRING, /* Unit */ + G_TYPE_STRING, /* Session */ + G_TYPE_STRING, /* Seat */ + G_TYPE_STRING, /* Owner */ G_TYPE_STRING, /* Priority */ GDK_TYPE_PIXBUF, /* Icon */ G_TYPE_POINTER, /* ProcInfo */ @@ -474,6 +487,17 @@ proctable_new (ProcData * const procdata) gtk_tree_view_column_set_visible(column, FALSE); } +#ifdef HAVE_SYSTEMD + if (sd_booted() <= 0) +#endif + { + GtkTreeViewColumn *column; + + for (i = COL_UNIT; i <= COL_OWNER; i++) { + column = my_gtk_tree_view_get_column_with_sort_column_id(GTK_TREE_VIEW(proctree), i); + gtk_tree_view_column_set_visible(column, FALSE); + } + } g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (proctree))), "changed", @@ -500,6 +524,9 @@ ProcInfo::~ProcInfo() g_free(this->arguments); g_free(this->security_context); g_free(this->cgroup_name); + g_free(this->unit); + g_free(this->session); + g_free(this->seat); } @@ -527,16 +554,9 @@ get_process_name (ProcInfo *info, info->name = g_strdup (cmd); } - - -void -ProcInfo::set_user(guint uid) +std::string +ProcInfo::lookup_user(guint uid) { - if (G_LIKELY(this->uid == uid)) - return; - - this->uid = uid; - typedef std::pair<ProcInfo::UserMap::iterator, bool> Pair; ProcInfo::UserMap::value_type hint(uid, ""); Pair p(ProcInfo::users.insert(hint)); @@ -556,10 +576,18 @@ ProcInfo::set_user(guint uid) } } - this->user = p.first->second; + return p.first->second; } +void +ProcInfo::set_user(guint uid) +{ + if (G_LIKELY(this->uid == uid)) + return; + this->uid = uid; + this->user = lookup_user(uid); +} static void get_process_memory_writable(ProcInfo *info) { @@ -634,6 +662,10 @@ update_info_mutable_cols(ProcInfo *info) tree_store_update(model, &info->node, COL_MEM, info->mem); tree_store_update(model, &info->node, COL_WCHAN, info->wchan); tree_store_update(model, &info->node, COL_CGROUP, info->cgroup_name); + tree_store_update(model, &info->node, COL_UNIT, info->unit); + tree_store_update(model, &info->node, COL_SESSION, info->session); + tree_store_update(model, &info->node, COL_SEAT, info->seat); + tree_store_update(model, &info->node, COL_OWNER, info->owner.c_str()); } @@ -718,7 +750,35 @@ remove_info_from_tree (ProcData *procdata, GtkTreeModel *model, procman::poison(current->node, 0x69); } +static void +get_process_systemd_info(ProcInfo *info) +{ +#ifdef HAVE_SYSTEMD + uid_t uid; + + if (sd_booted() <= 0) + return; + + free(info->unit); + info->unit = NULL; + sd_pid_get_unit(info->pid, &info->unit); + + free(info->session); + info->session = NULL; + sd_pid_get_session(info->pid, &info->session); + free(info->seat); + info->seat = NULL; + + if (info->session != NULL) + sd_session_get_seat(info->session, &info->seat); + + if (sd_pid_get_owner_uid(info->pid, &uid) >= 0) + info->owner = info->lookup_user(uid); + else + info->owner = ""; +#endif +} static void update_info (ProcData *procdata, ProcInfo *info) @@ -753,6 +813,8 @@ update_info (ProcData *procdata, ProcInfo *info) /* get cgroup data */ get_process_cgroup_info(info); + + get_process_systemd_info(info); } @@ -799,10 +861,10 @@ ProcInfo::ProcInfo(pid_t pid) get_process_selinux_context (info); info->cgroup_name = NULL; get_process_cgroup_info(info); -} - - + info->unit = info->session = info->seat = NULL; + get_process_systemd_info(info); +} static void refresh_list (ProcData *procdata, const pid_t* pid_list, const guint n) diff --git a/src/proctable.h b/src/proctable.h index 5a24803..71df77e 100644 --- a/src/proctable.h +++ b/src/proctable.h @@ -44,6 +44,10 @@ enum COL_MEM, COL_WCHAN, COL_CGROUP, + COL_UNIT, + COL_SESSION, + COL_SEAT, + COL_OWNER, COL_PRIORITY, COL_PIXBUF, COL_POINTER, |