summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/callbacks.cpp41
-rw-r--r--src/callbacks.h2
-rw-r--r--src/interface.cpp47
-rw-r--r--src/procman.h9
4 files changed, 90 insertions, 9 deletions
diff --git a/src/callbacks.cpp b/src/callbacks.cpp
index 8916c2e..ffded13 100644
--- a/src/callbacks.cpp
+++ b/src/callbacks.cpp
@@ -30,6 +30,7 @@
#include "proctable.h"
#include "util.h"
#include "procactions.h"
+#include "procman.h"
#include "procdialogs.h"
#include "memmaps.h"
#include "openfiles.h"
@@ -82,11 +83,26 @@ cb_edit_preferences (GtkAction *action, gpointer data)
void
-cb_renice (GtkAction *action, gpointer data)
+cb_renice (GtkAction *action, GtkRadioAction *current, gpointer data)
{
ProcData * const procdata = static_cast<ProcData*>(data);
- procdialog_create_renice_dialog (procdata);
+ gint selected = gtk_radio_action_get_current_value(current);
+
+ if (selected == CUSTOM_PRIORITY)
+ {
+ procdialog_create_renice_dialog (procdata);
+ } else {
+ gint new_nice_value = 0;
+ switch (selected) {
+ case VERY_HIGH_PRIORITY: new_nice_value = -20; break;
+ case HIGH_PRIORITY: new_nice_value = -5; break;
+ case NORMAL_PRIORITY: new_nice_value = 0; break;
+ case LOW_PRIORITY: new_nice_value = 5; break;
+ case VERY_LOW_PRIORITY: new_nice_value = 19; break;
+ }
+ renice(procdata, new_nice_value);
+ }
}
@@ -300,8 +316,25 @@ cb_row_selected (GtkTreeSelection *selection, gpointer data)
*/
gtk_tree_selection_selected_foreach (procdata->selection, get_last_selected,
&procdata->selected_process);
-
- update_sensitivity(procdata);
+ if (procdata->selected_process) {
+ gint value;
+ gint nice = procdata->selected_process->nice;
+ if (nice < -7)
+ value = VERY_HIGH_PRIORITY;
+ else if (nice < -2)
+ value = HIGH_PRIORITY;
+ else if (nice < 3)
+ value = NORMAL_PRIORITY;
+ else if (nice < 7)
+ value = LOW_PRIORITY;
+ else
+ value = VERY_LOW_PRIORITY;
+
+ GtkRadioAction* normal = GTK_RADIO_ACTION(gtk_action_group_get_action(procdata->action_group, "Normal"));
+
+ gtk_radio_action_set_current_value(normal, value);
+ }
+ update_sensitivity(procdata);
}
diff --git a/src/callbacks.h b/src/callbacks.h
index 35e8016..5dfc134 100644
--- a/src/callbacks.h
+++ b/src/callbacks.h
@@ -29,7 +29,7 @@
void cb_show_memory_maps (GtkAction *action, gpointer data);
void cb_show_open_files (GtkAction *action, gpointer data);
void cb_show_lsof(GtkAction *action, gpointer data);
-void cb_renice (GtkAction *action, gpointer data);
+void cb_renice (GtkAction *action, GtkRadioAction *current, gpointer data);
void cb_end_process (GtkAction *action, gpointer data);
void cb_kill_process (GtkAction *action, gpointer data);
void cb_edit_preferences (GtkAction *action, gpointer data);
diff --git a/src/interface.cpp b/src/interface.cpp
index 3561ea2..302be6b 100644
--- a/src/interface.cpp
+++ b/src/interface.cpp
@@ -68,8 +68,8 @@ static const GtkActionEntry menu_entries[] =
N_("Force process to finish normally"), G_CALLBACK (cb_end_process) },
{ "KillProcess", NULL, N_("_Kill Process"), "<control>K",
N_("Force process to finish immediately"), G_CALLBACK (cb_kill_process) },
- { "ChangePriority", NULL, N_("_Change Priority…"), "<control>N",
- N_("Change the order of priority of process"), G_CALLBACK (cb_renice) },
+ { "ChangePriority", NULL, N_("_Change Priority"), NULL,
+ N_("Change the order of priority of process"), NULL },
{ "Preferences", GTK_STOCK_PREFERENCES, NULL, NULL,
N_("Configure the application"), G_CALLBACK (cb_edit_preferences) },
@@ -106,6 +106,22 @@ static const GtkRadioActionEntry radio_menu_entries[] =
N_("Show only user-owned processes"), MY_PROCESSES }
};
+static const GtkRadioActionEntry priority_menu_entries[] =
+{
+ { "VeryHigh", NULL, N_("Very High"), NULL,
+ N_("Set process priority to very high"), VERY_HIGH_PRIORITY },
+ { "High", NULL, N_("High"), NULL,
+ N_("Set process priority to high"), HIGH_PRIORITY },
+ { "Normal", NULL, N_("Normal"), NULL,
+ N_("Set process priority to normal"), NORMAL_PRIORITY },
+ { "Low", NULL, N_("Low"), NULL,
+ N_("Set process priority to low"), LOW_PRIORITY },
+ { "VeryLow", NULL, N_("Very Low"), NULL,
+ N_("Set process priority to very low"), VERY_LOW_PRIORITY },
+ { "Custom", NULL, N_("Custom"), NULL,
+ N_("Set process priority manually"), CUSTOM_PRIORITY }
+};
+
static const char ui_info[] =
" <menubar name=\"MenuBar\">"
@@ -120,7 +136,15 @@ static const char ui_info[] =
" <menuitem name=\"EditEndProcessMenu\" action=\"EndProcess\" />"
" <menuitem name=\"EditKillProcessMenu\" action=\"KillProcess\" />"
" <separator />"
-" <menuitem name=\"EditChangePriorityMenu\" action=\"ChangePriority\" />"
+" <menu name=\"EditChangePriorityMenu\" action=\"ChangePriority\" >"
+" <menuitem action=\"VeryHigh\" />"
+" <menuitem action=\"High\" />"
+" <menuitem action=\"Normal\" />"
+" <menuitem action=\"Low\" />"
+" <menuitem action=\"VeryLow\" />"
+" <separator />"
+" <menuitem action=\"Custom\"/>"
+" </menu>"
" <separator />"
" <menuitem name=\"EditPreferencesMenu\" action=\"Preferences\" />"
" </menu>"
@@ -148,7 +172,15 @@ static const char ui_info[] =
" <menuitem action=\"EndProcess\" />"
" <menuitem action=\"KillProcess\" />"
" <separator />"
-" <menuitem action=\"ChangePriority\" />"
+" <menu name=\"ChangePriorityMenu\" action=\"ChangePriority\" >"
+" <menuitem action=\"VeryHigh\" />"
+" <menuitem action=\"High\" />"
+" <menuitem action=\"Normal\" />"
+" <menuitem action=\"Low\" />"
+" <menuitem action=\"VeryLow\" />"
+" <separator />"
+" <menuitem action=\"Custom\"/>"
+" </menu>"
" <separator />"
" <menuitem action=\"MemoryMaps\" />"
" <menuitem action=\"OpenFiles\" />"
@@ -710,6 +742,13 @@ create_main_window (ProcData *procdata)
G_CALLBACK(cb_radio_processes),
procdata);
+ gtk_action_group_add_radio_actions (procdata->action_group,
+ priority_menu_entries,
+ G_N_ELEMENTS (priority_menu_entries),
+ NORMAL_PRIORITY,
+ G_CALLBACK(cb_renice),
+ procdata);
+
gtk_ui_manager_insert_action_group (procdata->uimanager,
procdata->action_group,
0);
diff --git a/src/procman.h b/src/procman.h
index 2adfb7d..5bfb7b8 100644
--- a/src/procman.h
+++ b/src/procman.h
@@ -49,6 +49,15 @@ enum
ACTIVE_PROCESSES
};
+enum
+{
+ VERY_HIGH_PRIORITY,
+ HIGH_PRIORITY,
+ NORMAL_PRIORITY,
+ LOW_PRIORITY,
+ VERY_LOW_PRIORITY,
+ CUSTOM_PRIORITY
+};
static const unsigned MIN_UPDATE_INTERVAL = 1 * 1000;
static const unsigned MAX_UPDATE_INTERVAL = 100 * 1000;