widget_value *xmalloc_widget_value(void) { widget_value *tmp = malloc_widget_value(); if (!tmp) memory_full(); return tmp; }
static void smc_save_yourself_CB (SmcConn smcConn, SmPointer clientData, int saveType, Bool shutdown, int interactStyle, Bool fast) { #define NR_PROPS 5 SmProp *props[NR_PROPS]; SmProp prop_ptr[NR_PROPS]; SmPropValue values[20], *vp; int val_idx = 0, vp_idx = 0; int props_idx = 0; int i; char *smid_opt, *chdir_opt = NULL; Lisp_Object user_login_name = Fuser_login_name (Qnil); /* Must have these. */ if (! STRINGP (Vinvocation_name) || ! STRINGP (user_login_name)) return; /* How to start a new instance of Emacs. */ props[props_idx] = &prop_ptr[props_idx]; props[props_idx]->name = xstrdup (SmCloneCommand); props[props_idx]->type = xstrdup (SmLISTofARRAY8); props[props_idx]->num_vals = 1; props[props_idx]->vals = &values[val_idx++]; props[props_idx]->vals[0].length = strlen (emacs_program); props[props_idx]->vals[0].value = emacs_program; ++props_idx; /* The name of the program. */ props[props_idx] = &prop_ptr[props_idx]; props[props_idx]->name = xstrdup (SmProgram); props[props_idx]->type = xstrdup (SmARRAY8); props[props_idx]->num_vals = 1; props[props_idx]->vals = &values[val_idx++]; props[props_idx]->vals[0].length = SBYTES (Vinvocation_name); props[props_idx]->vals[0].value = SDATA (Vinvocation_name); ++props_idx; /* User id. */ props[props_idx] = &prop_ptr[props_idx]; props[props_idx]->name = xstrdup (SmUserID); props[props_idx]->type = xstrdup (SmARRAY8); props[props_idx]->num_vals = 1; props[props_idx]->vals = &values[val_idx++]; props[props_idx]->vals[0].length = SBYTES (user_login_name); props[props_idx]->vals[0].value = SDATA (user_login_name); ++props_idx; char *cwd = get_current_dir_name (); if (cwd) { props[props_idx] = &prop_ptr[props_idx]; props[props_idx]->name = xstrdup (SmCurrentDirectory); props[props_idx]->type = xstrdup (SmARRAY8); props[props_idx]->num_vals = 1; props[props_idx]->vals = &values[val_idx++]; props[props_idx]->vals[0].length = strlen (cwd); props[props_idx]->vals[0].value = cwd; ++props_idx; } /* How to restart Emacs. */ props[props_idx] = &prop_ptr[props_idx]; props[props_idx]->name = xstrdup (SmRestartCommand); props[props_idx]->type = xstrdup (SmLISTofARRAY8); /* /path/to/emacs, --smid=xxx --no-splash --chdir=dir ... */ if (INT_ADD_WRAPV (initial_argc, 3, &i)) memory_full (SIZE_MAX); props[props_idx]->num_vals = i; vp = xnmalloc (i, sizeof *vp); props[props_idx]->vals = vp; props[props_idx]->vals[vp_idx].length = strlen (emacs_program); props[props_idx]->vals[vp_idx++].value = emacs_program; smid_opt = xmalloc (strlen (SMID_OPT) + strlen (client_id) + 1); strcpy (stpcpy (smid_opt, SMID_OPT), client_id); props[props_idx]->vals[vp_idx].length = strlen (smid_opt); props[props_idx]->vals[vp_idx++].value = smid_opt; props[props_idx]->vals[vp_idx].length = strlen (NOSPLASH_OPT); props[props_idx]->vals[vp_idx++].value = NOSPLASH_OPT; if (cwd) { chdir_opt = xmalloc (strlen (CHDIR_OPT) + strlen (cwd) + 1); strcpy (stpcpy (chdir_opt, CHDIR_OPT), cwd); props[props_idx]->vals[vp_idx].length = strlen (chdir_opt); props[props_idx]->vals[vp_idx++].value = chdir_opt; } for (i = 1; i < initial_argc; ++i) { props[props_idx]->vals[vp_idx].length = strlen (initial_argv[i]); props[props_idx]->vals[vp_idx++].value = initial_argv[i]; } ++props_idx; SmcSetProperties (smcConn, props_idx, props); xfree (smid_opt); xfree (chdir_opt); xfree (cwd); xfree (vp); for (i = 0; i < props_idx; ++i) { xfree (props[i]->type); xfree (props[i]->name); } /* See if we maybe shall interact with the user. */ if (interactStyle != SmInteractStyleAny || ! shutdown || saveType == SmSaveLocal || ! SmcInteractRequest (smcConn, SmDialogNormal, smc_interact_CB, 0)) { /* No interaction, we are done saving ourself. */ SmcSaveYourselfDone (smcConn, True); } }