summaryrefslogtreecommitdiff
path: root/src/callbacks.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/callbacks.cpp')
-rw-r--r--src/callbacks.cpp436
1 files changed, 436 insertions, 0 deletions
diff --git a/src/callbacks.cpp b/src/callbacks.cpp
new file mode 100644
index 0000000..2acaff2
--- /dev/null
+++ b/src/callbacks.cpp
@@ -0,0 +1,436 @@
+/* Procman - callbacks
+ * Copyright (C) 2001 Kevin Vandersloot
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <config.h>
+
+#include <giomm.h>
+
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+#include <signal.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "proctable.h"
+#include "util.h"
+#include "procactions.h"
+#include "procdialogs.h"
+#include "memmaps.h"
+#include "openfiles.h"
+#include "load-graph.h"
+#include "disks.h"
+#include "lsof.h"
+#include "sysinfo.h"
+
+void
+cb_kill_sigstop(GtkAction *action, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ /* no confirmation */
+ kill_process (procdata, SIGSTOP);
+}
+
+
+
+
+void
+cb_kill_sigcont(GtkAction *action, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ /* no confirmation */
+ kill_process (procdata, SIGCONT);
+}
+
+
+
+
+static void
+kill_process_helper(ProcData *procdata, int sig)
+{
+ if (procdata->config.show_kill_warning)
+ procdialog_create_kill_dialog (procdata, sig);
+ else
+ kill_process (procdata, sig);
+}
+
+
+void
+cb_edit_preferences (GtkAction *action, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ procdialog_create_preferences_dialog (procdata);
+}
+
+
+void
+cb_renice (GtkAction *action, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ procdialog_create_renice_dialog (procdata);
+}
+
+
+void
+cb_end_process (GtkAction *action, gpointer data)
+{
+ kill_process_helper(static_cast<ProcData*>(data), SIGTERM);
+}
+
+
+void
+cb_kill_process (GtkAction *action, gpointer data)
+{
+ kill_process_helper(static_cast<ProcData*>(data), SIGKILL);
+}
+
+
+void
+cb_show_memory_maps (GtkAction *action, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ create_memmaps_dialog (procdata);
+}
+
+void
+cb_show_open_files (GtkAction *action, gpointer data)
+{
+ ProcData *procdata = static_cast<ProcData*>(data);
+
+ create_openfiles_dialog (procdata);
+}
+
+void
+cb_show_lsof(GtkAction *action, gpointer data)
+{
+ ProcData *procdata = static_cast<ProcData*>(data);
+ procman_lsof(procdata);
+}
+
+
+void
+cb_about (GtkAction *action, gpointer data)
+{
+ const gchar * const authors[] = {
+ "Kevin Vandersloot",
+ "Erik Johnsson",
+ "Jorgen Scheibengruber",
+ "Benoît Dejean",
+ "Paolo Borelli",
+ "Karl Lattimer",
+ NULL
+ };
+
+ const gchar * const documenters[] = {
+ "Bill Day",
+ "Sun Microsystems",
+ NULL
+ };
+
+ const gchar * const artists[] = {
+ "Baptiste Mille-Mathias",
+ NULL
+ };
+
+ gtk_show_about_dialog (
+ NULL,
+ "name", _("System Monitor"),
+ "comments", _("View current processes and monitor "
+ "system state"),
+ "version", VERSION,
+ "copyright", "Copyright \xc2\xa9 2001-2004 Kevin Vandersloot\n"
+ "Copyright \xc2\xa9 2005-2007 Benoît Dejean",
+ "logo-icon-name", "utilities-system-monitor",
+ "authors", authors,
+ "artists", artists,
+ "documenters", documenters,
+ "translator-credits", _("translator-credits"),
+ "license", "GPL 2+",
+ "wrap-license", TRUE,
+ NULL
+ );
+}
+
+
+void
+cb_help_contents (GtkAction *action, gpointer data)
+{
+ GError* error = 0;
+ if (!g_app_info_launch_default_for_uri("ghelp:mate-system-monitor", NULL, &error)) {
+ g_warning("Could not display help : %s", error->message);
+ g_error_free(error);
+ }
+}
+
+
+void
+cb_app_exit (GtkAction *action, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ cb_app_delete (NULL, NULL, procdata);
+}
+
+
+gboolean
+cb_app_delete (GtkWidget *window, GdkEventAny *event, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ procman_save_config (procdata);
+ if (procdata->timeout)
+ g_source_remove (procdata->timeout);
+ if (procdata->disk_timeout)
+ g_source_remove (procdata->disk_timeout);
+
+ gtk_main_quit ();
+
+ return TRUE;
+}
+
+
+
+void
+cb_end_process_button_pressed (GtkButton *button, gpointer data)
+{
+ kill_process_helper(static_cast<ProcData*>(data), SIGTERM);
+}
+
+
+static void change_mateconf_color(MateConfClient *client, const char *key,
+ GSMColorButton *cp)
+{
+ GdkColor c;
+ char color[24]; /* color should be 1 + 3*4 + 1 = 15 chars -> 24 */
+
+ gsm_color_button_get_color(cp, &c);
+ g_snprintf(color, sizeof color, "#%04x%04x%04x", c.red, c.green, c.blue);
+ mateconf_client_set_string (client, key, color, NULL);
+}
+
+
+void
+cb_cpu_color_changed (GSMColorButton *cp, gpointer data)
+{
+ char key[80];
+ gint i = GPOINTER_TO_INT (data);
+ MateConfClient *client = mateconf_client_get_default ();
+
+ g_snprintf(key, sizeof key, "/apps/procman/cpu_color%d", i);
+
+ change_mateconf_color(client, key, cp);
+}
+
+void
+cb_mem_color_changed (GSMColorButton *cp, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+ change_mateconf_color(procdata->client, "/apps/procman/mem_color", cp);
+}
+
+
+void
+cb_swap_color_changed (GSMColorButton *cp, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+ change_mateconf_color(procdata->client, "/apps/procman/swap_color", cp);
+}
+
+void
+cb_net_in_color_changed (GSMColorButton *cp, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+ change_mateconf_color(procdata->client, "/apps/procman/net_in_color", cp);
+}
+
+void
+cb_net_out_color_changed (GSMColorButton *cp, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+ change_mateconf_color(procdata->client, "/apps/procman/net_out_color", cp);
+}
+
+static void
+get_last_selected (GtkTreeModel *model, GtkTreePath *path,
+ GtkTreeIter *iter, gpointer data)
+{
+ ProcInfo **info = static_cast<ProcInfo**>(data);
+
+ gtk_tree_model_get (model, iter, COL_POINTER, info, -1);
+}
+
+
+void
+cb_row_selected (GtkTreeSelection *selection, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ procdata->selection = selection;
+
+ /* get the most recent selected process and determine if there are
+ ** no selected processes
+ */
+ gtk_tree_selection_selected_foreach (procdata->selection, get_last_selected,
+ &procdata->selected_process);
+
+ update_sensitivity(procdata);
+}
+
+
+gboolean
+cb_tree_button_pressed (GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
+ do_popup_menu (procdata, event);
+
+ return FALSE;
+}
+
+
+gboolean
+cb_tree_popup_menu (GtkWidget *widget, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ do_popup_menu (procdata, NULL);
+
+ return TRUE;
+}
+
+
+void
+cb_switch_page (GtkNotebook *nb, GtkNotebookPage *page,
+ gint num, gpointer data)
+{
+ cb_change_current_page (nb, num, data);
+}
+
+void
+cb_change_current_page (GtkNotebook *nb, gint num, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ procdata->config.current_tab = num;
+
+
+ if (num == PROCMAN_TAB_PROCESSES) {
+
+ cb_timeout (procdata);
+
+ if (!procdata->timeout)
+ procdata->timeout = g_timeout_add (
+ procdata->config.update_interval,
+ cb_timeout, procdata);
+
+ update_sensitivity(procdata);
+ }
+ else {
+ if (procdata->timeout) {
+ g_source_remove (procdata->timeout);
+ procdata->timeout = 0;
+ }
+
+ update_sensitivity(procdata);
+ }
+
+
+ if (num == PROCMAN_TAB_RESOURCES) {
+ load_graph_start (procdata->cpu_graph);
+ load_graph_start (procdata->mem_graph);
+ load_graph_start (procdata->net_graph);
+ }
+ else {
+ load_graph_stop (procdata->cpu_graph);
+ load_graph_stop (procdata->mem_graph);
+ load_graph_stop (procdata->net_graph);
+ }
+
+
+ if (num == PROCMAN_TAB_DISKS) {
+
+ cb_update_disks (procdata);
+
+ if(!procdata->disk_timeout) {
+ procdata->disk_timeout =
+ g_timeout_add (procdata->config.disks_update_interval,
+ cb_update_disks,
+ procdata);
+ }
+ }
+ else {
+ if(procdata->disk_timeout) {
+ g_source_remove (procdata->disk_timeout);
+ procdata->disk_timeout = 0;
+ }
+ }
+
+ if (num == PROCMAN_TAB_SYSINFO) {
+ procman::build_sysinfo_ui();
+ }
+}
+
+
+
+gint
+cb_user_refresh (GtkAction*, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+ proctable_update_all(procdata);
+ return FALSE;
+}
+
+
+gint
+cb_timeout (gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+ guint new_interval;
+
+ proctable_update_all (procdata);
+
+ if (procdata->smooth_refresh->get(new_interval))
+ {
+ procdata->timeout = g_timeout_add(new_interval,
+ cb_timeout,
+ procdata);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+void
+cb_radio_processes(GtkAction *action, GtkRadioAction *current, gpointer data)
+{
+ ProcData * const procdata = static_cast<ProcData*>(data);
+
+ procdata->config.whose_process = gtk_radio_action_get_current_value(current);
+
+ mateconf_client_set_int (procdata->client, "/apps/procman/view_as",
+ procdata->config.whose_process, NULL);
+}