/* deal with pointers */
if (a->func == action_execute || a->func == action_restart)
g_free(a->data.execute.path);
+ else if (a->func == action_debug)
+ g_free(a->data.debug.string);
else if (a->func == action_showmenu)
g_free(a->data.showmenu.name);
/* deal with pointers */
if (a->func == action_execute || a->func == action_restart)
a->data.execute.path = g_strdup(a->data.execute.path);
+ else if (a->func == action_debug)
+ a->data.debug.string = g_strdup(a->data.debug.string);
else if (a->func == action_showmenu)
a->data.showmenu.name = g_strdup(a->data.showmenu.name);
ActionString actionstrings[] =
{
+ {
+ "debug",
+ action_debug,
+ NULL
+ },
{
"execute",
- action_execute,
+ action_execute,
NULL
},
{
if ((m = parse_find_node("icon", n->xmlChildrenNode)))
act->data.execute.icon_name = parse_string(doc, m);
}
+ } else if (act->func == action_debug) {
+ if ((n = parse_find_node("string", node->xmlChildrenNode)))
+ act->data.debug.string = parse_string(doc, n);
} else if (act->func == action_showmenu) {
if ((n = parse_find_node("menu", node->xmlChildrenNode)))
act->data.showmenu.name = parse_string(doc, n);
action_run(l, c, 0, time);
}
+void action_debug(union ActionData *data)
+{
+ if (data->debug.string)
+ g_print("%s\n", data->debug.string);
+}
+
void action_execute(union ActionData *data)
{
GError *e = NULL;
gboolean hang;
};
+struct Debug {
+ gchar *string;
+};
+
struct Execute {
struct AnyAction any;
gchar *path;
struct InteractiveAction inter;
struct InterDirectionalAction interdiraction;
struct DirectionalAction diraction;
+ struct Debug debug;
struct Execute execute;
struct ClientAction client;
struct Activate activate;
/* Creates a new Action from the name of the action
A few action types need data set after making this call still. Check if
the returned action's "func" is one of these.
+ action_debug - the string to print should be set
action_execute - the path needs to be set
action_restart - the path can optionally be set
action_desktop - the destination desktop needs to be set
void action_run_string(const gchar *name, struct _ObClient *c, Time time);
+/* Debug */
+void action_debug(union ActionData *data);
/* Execute */
void action_execute(union ActionData *data);
/* ActivateAction */
if (!(self->can_focus || self->focus_notify))
return FALSE;
- /* do a check to see if the window has already been unmapped or destroyed
- do this intelligently while watching out for unmaps we've generated
- (ignore_unmaps > 0) */
- if (XCheckTypedWindowEvent(ob_display, self->window,
- DestroyNotify, &ev)) {
- XPutBackEvent(ob_display, &ev);
- return FALSE;
- }
- while (XCheckTypedWindowEvent(ob_display, self->window,
- UnmapNotify, &ev)) {
- if (self->ignore_unmaps) {
- self->ignore_unmaps--;
- } else {
- XPutBackEvent(ob_display, &ev);
- return FALSE;
- }
- }
-
return TRUE;
}
case NotifyDetailNone: detailstr="NotifyDetailNone"; break;
}
+ if (mode == NotifyGrab || mode == NotifyUngrab)
+ return;
+
g_assert(modestr);
g_assert(detailstr);
ob_debug_type(OB_DEBUG_FOCUS, "Focus%s 0x%x mode=%s detail=%s\n",
focus_tried = NULL; /* focus isn't "trying" to go anywhere now */
+ ob_debug_type(OB_DEBUG_FOCUS, "focus tried = NULL\n");
}
static ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old)
client_focus(new);
/* remember that we tried to send focus here */
focus_tried = new;
+
+ ob_debug_type(OB_DEBUG_FOCUS, "focus tried = %s\n", new->title);
}
return new;
*/
focus_tried = NULL; /* focus isn't "trying" to go anywhere now */
+ ob_debug_type(OB_DEBUG_FOCUS, "focus tried = NULL\n");
/* if there is a grab going on, then we need to cancel it. if we move
focus during the grab, applications will get NotifyWhileGrabbed events
{
XEvent ce;
+ ob_debug_type(OB_DEBUG_FOCUS, "checking focus tried (%s) against %s\n",
+ (focus_tried?focus_tried->title:"(null)"), client->title);
+
if (client == focus_tried) {
/* we were trying to focus this window but it's gone */