SLIST_ENTRY(Ignore_Event) ignore_events;
};
+/**
+ * Stores internal information about a startup sequence, like the workspace it
+ * was initiated on.
+ *
+ */
+struct Startup_Sequence {
+ /** startup ID for this sequence, generated by libstartup-notification */
+ char *id;
+ /** workspace on which this startup was initiated */
+ char *workspace;
+
+ TAILQ_ENTRY(Startup_Sequence) sequences;
+};
+
/**
* Regular expression wrapper. It contains the pattern itself as a string (like
* ^foo[0-9]$) as well as a pointer to the compiled PCRE expression and the
#include "all.h"
+static TAILQ_HEAD(startup_sequence_head, Startup_Sequence) startup_sequences =
+ TAILQ_HEAD_INITIALIZER(startup_sequences);
+
/*
* Starts the given application by passing it through a shell. We use double fork
* to avoid zombie processes. As the started application’s parent exits (immediately),
LOG("startup id = %s\n", sn_launcher_context_get_startup_id(context));
+ /* Save the ID and current workspace in our internal list of startup
+ * sequences */
+ Con *ws = con_get_workspace(focused);
+ struct Startup_Sequence *sequence = scalloc(sizeof(struct Startup_Sequence));
+ sequence->id = sstrdup(sn_launcher_context_get_startup_id(context));
+ sequence->workspace = sstrdup(ws->name);
+ TAILQ_INSERT_TAIL(&startup_sequences, sequence, sequences);
+
LOG("executing: %s\n", command);
if (fork() == 0) {
/* Child process */
*
*/
void startup_monitor_event(SnMonitorEvent *event, void *userdata) {
- SnStartupSequence *sequence;
+ SnStartupSequence *snsequence;
+
+ snsequence = sn_monitor_event_get_startup_sequence(event);
+
+ /* Get the corresponding internal startup sequence */
+ const char *id = sn_startup_sequence_get_id(snsequence);
+ struct Startup_Sequence *current, *sequence = NULL;
+ TAILQ_FOREACH(current, &startup_sequences, sequences) {
+ if (strcmp(current->id, id) != 0)
+ continue;
- DLOG("something happened\n");
- sequence = sn_monitor_event_get_startup_sequence(event);
+ sequence = current;
+ break;
+ }
+
+ if (!sequence) {
+ DLOG("Got event for startup sequence that we did not initiate (ID = %s). Ignoring.\n", id);
+ return;
+ }
switch (sn_monitor_event_get_type(event)) {
case SN_MONITOR_EVENT_COMPLETED:
- DLOG("startup sequence %s completed\n", sn_startup_sequence_get_id(sequence));
+ DLOG("startup sequence %s completed\n", sn_startup_sequence_get_id(snsequence));
break;
default:
/* ignore */