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:
parent
07994cb2dc
commit
e6d33facc8
4 changed files with 35 additions and 6 deletions
|
@ -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)
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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"); */
|
||||||
|
|
|
@ -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; */
|
||||||
|
|
Loading…
Reference in a new issue