when you close an app and it stops responding.. if you hit close again, it will try kill -TERM. if that fails and you close again, it will kill -9 ! (assuming the app is running on the local host and provided its PID)

This commit is contained in:
Dana Jansens 2008-01-15 22:13:16 -05:00
parent 07994cb2dc
commit e6d33facc8
4 changed files with 35 additions and 6 deletions

View file

@ -46,6 +46,10 @@
# include <unistd.h> # include <unistd.h>
#endif #endif
#ifdef HAVE_SIGNAL_H
# include <signal.h> /* for kill() */
#endif
#include <glib.h> #include <glib.h>
#include <X11/Xutil.h> #include <X11/Xutil.h>
@ -2244,6 +2248,7 @@ static void client_get_session_ids(ObClient *self)
if (got) { if (got) {
gchar localhost[128]; gchar localhost[128];
guint32 pid;
gethostname(localhost, 127); gethostname(localhost, 127);
localhost[127] = '\0'; localhost[127] = '\0';
@ -2251,6 +2256,11 @@ static void client_get_session_ids(ObClient *self)
self->client_machine = s; self->client_machine = s;
else else
g_free(s); g_free(s);
/* see if it has the PID set too (the PID requires that the
WM_CLIENT_MACHINE be set) */
if (PROP_GET32(self->window, net_wm_pid, cardinal, &pid))
self->pid = pid;
} }
} }
@ -3193,9 +3203,10 @@ void client_close(ObClient *self)
/* in the case that the client provides no means to requesting that it /* in the case that the client provides no means to requesting that it
close, we just kill it */ close, we just kill it */
if (!self->delete_window) if (!self->delete_window)
client_kill(self); /* don't use client_kill(), we should only kill based on PID in
response to a lack of PING replies */
if (self->not_responding) XKillClient(ob_display, self->window);
else if (self->not_responding)
client_kill(self); client_kill(self);
else { else {
PROP_MSG_TO(self->window, self->window, wm_protocols, PROP_MSG_TO(self->window, self->window, wm_protocols,
@ -3209,7 +3220,17 @@ void client_close(ObClient *self)
void client_kill(ObClient *self) void client_kill(ObClient *self)
{ {
XKillClient(ob_display, self->window); if (!self->client_machine && self->pid) {
/* running on the local host */
if (!self->kill_tried_term) {
kill(self->pid, SIGTERM);
self->kill_tried_term = TRUE;
}
else
kill(self->pid, SIGKILL); /* kill -9 */
}
else
XKillClient(ob_display, self->window);
} }
void client_hilite(ObClient *self, gboolean hilite) void client_hilite(ObClient *self, gboolean hilite)

View file

@ -30,6 +30,10 @@
#include <glib.h> #include <glib.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h> /* for pid_t */
#endif
struct _ObFrame; struct _ObFrame;
struct _ObGroup; struct _ObGroup;
struct _ObSessionState; struct _ObSessionState;
@ -115,6 +119,8 @@ struct _ObClient
gchar *client_machine; gchar *client_machine;
/*! The command used to run the program. Pre-XSMP window identification. */ /*! The command used to run the program. Pre-XSMP window identification. */
gchar *wm_command; gchar *wm_command;
/*! The PID of the process which owns the window */
pid_t pid;
/*! The application that created the window */ /*! The application that created the window */
gchar *name; gchar *name;
@ -225,6 +231,8 @@ struct _ObClient
/*! Indicates if the client is trying to close but has stopped responding /*! Indicates if the client is trying to close but has stopped responding
to pings */ to pings */
gboolean not_responding; gboolean not_responding;
/*! We tried to kill the client with SIGTERM */
gboolean kill_tried_term;
#ifdef SYNC #ifdef SYNC
/*! The client wants to sync during resizes */ /*! The client wants to sync during resizes */

View file

@ -91,7 +91,7 @@ void prop_startup(void)
CREATE(net_wm_strut_partial, "_NET_WM_STRUT_PARTIAL"); CREATE(net_wm_strut_partial, "_NET_WM_STRUT_PARTIAL");
CREATE(net_wm_icon, "_NET_WM_ICON"); CREATE(net_wm_icon, "_NET_WM_ICON");
CREATE(net_wm_icon_geometry, "_NET_WM_ICON_GEOMETRY"); CREATE(net_wm_icon_geometry, "_NET_WM_ICON_GEOMETRY");
/* CREATE(net_wm_pid, "_NET_WM_PID"); */ CREATE(net_wm_pid, "_NET_WM_PID");
CREATE(net_wm_allowed_actions, "_NET_WM_ALLOWED_ACTIONS"); CREATE(net_wm_allowed_actions, "_NET_WM_ALLOWED_ACTIONS");
CREATE(net_wm_user_time, "_NET_WM_USER_TIME"); CREATE(net_wm_user_time, "_NET_WM_USER_TIME");
/* CREATE(net_wm_user_time_window, "_NET_WM_USER_TIME_WINDOW"); */ /* CREATE(net_wm_user_time_window, "_NET_WM_USER_TIME_WINDOW"); */

View file

@ -129,7 +129,7 @@ typedef struct Atoms {
Atom net_wm_strut_partial; Atom net_wm_strut_partial;
Atom net_wm_icon; Atom net_wm_icon;
Atom net_wm_icon_geometry; Atom net_wm_icon_geometry;
/* Atom net_wm_pid; */ Atom net_wm_pid;
Atom net_wm_allowed_actions; Atom net_wm_allowed_actions;
Atom net_wm_user_time; Atom net_wm_user_time;
/* Atom net_wm_user_time_window; */ /* Atom net_wm_user_time_window; */