void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state) { if (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL && self->entry->data.normal.enabled) { /* grab all this shizzle, cuz when the menu gets hidden, 'self' gets freed */ ObMenuEntry *entry = self->entry; ObMenuExecuteFunc func = self->frame->menu->execute_func; gpointer data = self->frame->menu->data; GSList *acts = self->entry->data.normal.actions; ObClient *client = self->frame->client; ObMenuFrame *frame = self->frame; guint mods = obt_keyboard_only_modmasks(state); /* release grabs before executing the shit */ if (!(mods & ControlMask)) { event_cancel_all_key_grabs(); frame = NULL; } if (func) func(entry, frame, client, state, data); else actions_run_acts(acts, OB_USER_ACTION_MENU_SELECTION, state, -1, -1, 0, OB_FRAME_CONTEXT_NONE, client); } }
/* Always return FALSE because its not interactive */ static gboolean run_func(ObActionsData *data, gpointer options) { GError *e; gchar **argv = NULL; gchar *cmd; Options *o = options; if (!o->cmd) return FALSE; if (o->prompt) { ObPrompt *p; Options *ocp; ObPromptAnswer answers[] = { { _("No"), 0 }, { _("Yes"), 1 } }; ocp = dup_options(options, data); p = prompt_new(o->prompt, _("Execute"), answers, 2, 0, 0, prompt_cb, prompt_cleanup, ocp); prompt_show(p, NULL, FALSE); return FALSE; } cmd = g_filename_from_utf8(o->cmd, -1, NULL, NULL, NULL); if (!cmd) { g_message(_("Failed to convert the path \"%s\" from utf8"), o->cmd); return FALSE; } if (data->client) { gchar *c, *before, *expand; /* replace occurrences of $pid and $wid */ expand = NULL; before = cmd; while ((c = strchr(before, '$'))) { if ((c[1] == 'p' || c[1] == 'P') && (c[2] == 'i' || c[2] == 'I') && (c[3] == 'd' || c[3] == 'D') && !g_ascii_isalnum(c[4])) { /* found $pid */ gchar *tmp; *c = '\0'; tmp = expand; expand = g_strdup_printf("%s%s%u", (expand ? expand : ""), before, data->client->pid); g_free(tmp); before = c + 4; /* 4 = strlen("$pid") */ } else if ((c[1] == 'w' || c[1] == 'W') && (c[2] == 'i' || c[2] == 'I') && (c[3] == 'd' || c[3] == 'D') && !g_ascii_isalnum(c[4])) { /* found $wid */ gchar *tmp; *c = '\0'; tmp = expand; expand = g_strdup_printf("%s%s%lu", (expand ? expand : ""), before, data->client->window); g_free(tmp); before = c + 4; /* 4 = strlen("$wid") */ } else before = c + 1; /* no infinite loops plz */ } if (expand) { gchar *tmp; /* add on the end of the string after the last replacement */ tmp = expand; expand = g_strconcat(expand, before, NULL); g_free(tmp); /* replace the command with the expanded one */ g_free(cmd); cmd = expand; } } /* If there is a keyboard grab going on then we need to cancel it so the application can grab things */ if (data->uact != OB_USER_ACTION_MENU_SELECTION) event_cancel_all_key_grabs(); e = NULL; if (!g_shell_parse_argv(cmd, NULL, &argv, &e)) { g_message("%s", e->message); g_error_free(e); } else { gchar *program = NULL; gboolean ok; if (o->sn) { program = g_path_get_basename(argv[0]); /* sets up the environment */ sn_setup_spawn_environment(program, o->sn_name, o->sn_icon, o->sn_wmclass, /* launch it on the current desktop */ screen_desktop); } e = NULL; ok = g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, NULL, &e); if (!ok) { g_message("%s", e->message); g_error_free(e); } if (o->sn) { if (!ok) sn_spawn_cancel(); g_unsetenv("DESKTOP_STARTUP_ID"); } g_free(program); g_strfreev(argv); } g_free(cmd); return FALSE; }