Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37847912
en ru br
ALT Linux repos
S:3.4.2-alt1
5.0: 1.2.36-alt2.1
4.1: 1.2.35-alt2.1
4.0: 1.2.32-alt2.1
3.0: 1.2.23-alt1
+backports:1.2.30-alt1.M30.1

Group :: Graphical desktop/Icewm
RPM: icewm

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs and FR  Repocop 

Patch: icewm-alt-env.patch
Download


 icewm/src/Makefile.in |    2 +-
 icewm/src/env.cc      |   61 +++++++++++++++++++++++++++++++++++++++++++++++++
 icewm/src/env.h       |   17 +++++++++++++
 icewm/src/wmprog.cc   |    3 ++
 icewm/src/yconfig.cc  |    2 +
 5 files changed, 84 insertions(+), 1 deletions(-)
diff --git a/icewm/src/Makefile.in b/icewm/src/Makefile.in
index 1b7b07b..302d7cd 100644
--- a/icewm/src/Makefile.in
+++ b/icewm/src/Makefile.in
@@ -52,7 +52,7 @@ libice_OBJS = ref.o \
         yapp.o yxapp.o ytimer.o ywindow.o ypaint.o ypopup.o \
         misc.o ycursor.o ysocket.o \
         ypaths.o ypixbuf.o ylocale.o yarray.o ypipereader.o \
-        yxembed.o yconfig.o yprefs.o \
+        yxembed.o yconfig.o yprefs.o env.o \
         yfont.o yfontcore.o yfontxft.o \
 	yimage.o \
         ytooltip.o  # FIXME
diff --git a/icewm/src/env.cc b/icewm/src/env.cc
new file mode 100644
index 0000000..45da985
--- /dev/null
+++ b/icewm/src/env.cc
@@ -0,0 +1,61 @@
+/* Clinton Work - November 29, 1999 - Expand environment variables. */
+
+#include "env.h"
+#include <string.h>
+
+/*
+int main(int argc, char **argv)
+  {
+  char cmd[256];
+
+  if (argc < 2)
+    {
+    fprintf(stderr,"Syntax: env prog\n");
+    exit(1);
+    } 
+  strcpy(cmd,argv[1]);
+
+  printf("Before: %s\n",cmd);
+  printf("After: %s\n", envExpand(cmd) );
+  }
+*/
+
+/* 
+This function takes the given strings and expands any environment variables
+within it.
+*/
+char * envExpand(char *str)
+  {
+  char var[64], result[1024] = ""; 
+  char *cur = str, *name, *env, *add = result;
+  while (cur && *cur)
+   {
+   /* Start of environment variable. */
+   if ( (*cur == '$') && (*(cur+1) != '$') )
+     { 
+     name = var;
+     cur++;
+     /* Name must have alpha-num characters. */
+     while(*cur && isalpha(*cur))
+       { *name++ = *cur++; }
+     *name = '\0'; 
+/*     printf("name = %s\n",name); */
+     env = getenv(var);
+     /* If the env variable exists. */
+     if (env != NULL)
+       {
+       strcat(result,env);
+       add += strlen(env);
+       }
+     }
+   else if ( (*cur == '$') && (*(cur+1) == '$') )
+     { *add++ = '$'; cur +=2; continue; }
+
+   *add++ = *cur++;
+   }
+
+  *add = '\0';
+/*  printf("Result: %s\n",result); */
+  strcpy(str,result);
+  return(str);
+  }
diff --git a/icewm/src/env.h b/icewm/src/env.h
new file mode 100644
index 0000000..b448b49
--- /dev/null
+++ b/icewm/src/env.h
@@ -0,0 +1,17 @@
+
+#ifndef FIX_ENV_H
+#define FIX_ENV_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <strings.h>
+
+extern "C" {
+
+char * envExpand(char *str);
+
+}
+
+#endif
+
diff --git a/icewm/src/wmprog.cc b/icewm/src/wmprog.cc
index 4f115f0..9840984 100644
--- a/icewm/src/wmprog.cc
+++ b/icewm/src/wmprog.cc
@@ -29,6 +29,7 @@
 #include "wmtaskbar.h"
 #include "yicon.h"
 #include "intl.h"
+#include "env.h"
 
 extern bool parseKey(const char *arg, KeySym *key, unsigned int *mod);
 
@@ -282,6 +283,8 @@ char *parseMenus(char *data, ObjectContainer *container) {
 #ifndef LITE
                 if (icons[0] != '-') icon = YIcon::getIcon(icons);
 #endif
+		envExpand(command);
+
                 DProgram * prog =
                     DProgram::newProgram(name, icon,
                                          word[1] == 'e', word[1] == 'u' ? wmclass : 0,
diff --git a/icewm/src/yconfig.cc b/icewm/src/yconfig.cc
index 5537742..9d00280 100644
--- a/icewm/src/yconfig.cc
+++ b/icewm/src/yconfig.cc
@@ -7,6 +7,7 @@
 #include "sysdep.h"
 #include "binascii.h"
 #include "intl.h"
+#include "env.h"
 
 char * findPath(const char *path, int mode, const char *name, bool /*path_relative*/) {
 /// TODO #warning "fix limited path length"
@@ -329,6 +330,7 @@ char *parseOption(cfoption *options, char *str) {
         if (p == 0)
             break;
 
+	envExpand(argument);
         p = setOption(options, name, argument, append, p);
 
         delete[] argument;
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin