aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--emu/port/devdraw.c7
-rw-r--r--emu/port/devgui.c416
-rw-r--r--libmemdraw/draw.c4
-rw-r--r--mkconfig4
4 files changed, 269 insertions, 162 deletions
diff --git a/emu/port/devdraw.c b/emu/port/devdraw.c
index 161c36a..012e02e 100644
--- a/emu/port/devdraw.c
+++ b/emu/port/devdraw.c
@@ -12,13 +12,18 @@
#include "interp.h"
+#ifdef ANDROID_NO_DEF
#include <android/log.h>
-
#define LOG_TAG "inferno D-DRW"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+#else
+#define LOGI(...) //print(__VA_ARGS__)
+#define LOGW(...) //print(__VA_ARGS__)
+#define LOGE(...) //print(__VA_ARGS__)
+#endif
diff --git a/emu/port/devgui.c b/emu/port/devgui.c
index ce58aa8..696c9bf 100644
--- a/emu/port/devgui.c
+++ b/emu/port/devgui.c
@@ -118,209 +118,159 @@ tk2idx(TkTop *t, Tk *tk){
return i;
}
+
+// VV dinamic names-tree helper VV
+
+/* go to lower dir (..) */
static int
-guigen(Chan *c, char *name, Dirtab *tab, int ntab, int s, Dir *dp)
+guigen_folder_back(Chan *c, Prog *p, Dir *dp)
{
Qid qid;
- Prog *p;
- char *e;
- Osenv *o;
- ulong pid, path, perm, len;
+ // Tk pointers, counters
TkTop *t;
- Tk *tk=nil, *tk2=nil, *tkr=nil;
- int i, j, n;
+ Tk *tk=nil, *tkr=nil;
+ int n;
+ Osenv *o;
- USED(ntab);
+ t = p->tktop;
+
+ if(!t){
+ mkqid(&qid, Qdir, 0, QTDIR);
+ devdir(c, qid, "#G", 0, eve, DMDIR|0555, dp);
+ return 1;
+ }
- if(s == DEVDOTDOT){
- n = QID(c->qid);
+ tkr = t->root;
- p = progpid(PID(c->qid));
- if(p == nil){
- error(Enonexist);
- }
+ tk = qid2tk(&c->qid, t);
+ if(tk == nil){
+ error(Enonexist);
+ }
+ if(tk)
+ tk = tk->master;
- t = p->tktop;
-
- if(!t){
- mkqid(&qid, Qdir, 0, QTDIR);
- devdir(c, qid, "#G", 0, eve, DMDIR|0555, dp);
- return 1;
- }
+ if( !tk /*|| tk == tkr*/){
+ mkqid(&qid, Qdir, 0, QTDIR);
+ devdir(c, qid, "#G", 0, eve, DMDIR|0555, dp);
+ return 1;
+ }
- tkr = t->root;
+ n = tk2idx(t, tk);
+ if(n == -1){
+ error(Enonexist);
+ }
- tk = qid2tk(&c->qid, t);
- if(tk == nil){
- error(Enonexist);
- }
- if(tk)
- tk = tk->master;
+ snprint(up->genbuf, 127, "%s",
+ tk->name_tail
+ ? tk->name_tail
+ : tkname(tk)
+ );
+ mkqid(&qid, (ulong)n | PATH(c->qid), c->qid.vers, QTDIR);
+ o = p->osenv;
+ devdir(c, qid, up->genbuf, 0, o->user, DMDIR|0777, dp);
+ return 1;
+}
- if( !tk /*|| tk == tkr*/){
- mkqid(&qid, Qdir, 0, QTDIR);
- devdir(c, qid, "#G", 0, eve, DMDIR|0555, dp);
- return 1;
- }
- n = tk2idx(t, tk);
- if(n == -1){
- error(Enonexist);
- }
+/* ignore s and use name to find pid */
+static int
+guigen_by_name(Chan *c, Prog *p, char *name, Dir *dp)
+{
+ Qid qid;
+ ulong pid, path;
- snprint(up->genbuf, 127, "%s",
- tk->name_tail
- ? tk->name_tail
- : tkname(tk)
- );
- mkqid(&qid, (ulong)n | PATH(c->qid), c->qid.vers, QTDIR);
- o = p->osenv;
- devdir(c, qid, up->genbuf, 0, o->user, DMDIR|0777, dp);
- return 1;
- }
+ TkTop *t;
+ Tk *tk=nil, *tk2=nil, *tkr=nil;
+ int n;
+
+ Osenv *o;
+
+ char *e;
+ /* if it is the Top dir of the device */
if((ulong)c->qid.path == Qdir) {
- if(name != nil){
- /* ignore s and use name to find pid */
- pid = strtoul(name, &e, 0);
- if(pid == 0 || *e != '\0')
- return -1;
- acquire();
- p = progpid(pid);
- if(p == nil){
- release();
- return -1;
- }
- }else{
- acquire();
- p = progn(s);
- if(p == nil) {
- release();
- return -1;
- }
- pid = p->pid;
+ pid = strtoul(name, &e, 0); // Top dir of devgui is a list of numbers of gui-procs. test this
+ if(pid == 0 || *e != '\0')
+ return -1;
+ p = progpid(pid);
+ if(p == nil){
+ return -1;
}
o = p->osenv;
- sprint(up->genbuf, "%lud", pid);
+
+ // common part
+ snprint(up->genbuf, 127, "%lud", pid); // up->genbuf is a small (127 bytes) per-process character buffer
if(name != nil && strcmp(name, up->genbuf) != 0){
- release();
return -1;
}
- mkqid(&qid, pid << QSHIFT, pid, QTDIR);
+ mkqid(&qid, pid << QSHIFT, pid, QTDIR); // in the Top dir of devgui all the entryes are folders
devdir(c, qid, up->genbuf, 0, o->user, DMDIR|0777, dp);
- release();
return 1;
}
-
path = QID(c->qid); //PATH(c->qid) >> QSHIFT;
- acquire();
- p = progpid(PID(c->qid));
- if(p == nil) {
- release();
- return -1;
- }
- o = p->osenv;
-
-
if(p->tktop == nil) {
- release();
return -1;
}
else{
- if(name != nil){
- t = p->tktop;
+ t = p->tktop;
- tkr = t->root;
- n = path;
+ tkr = t->root;
+ n = path;
- tk = qid2tk(&c->qid, t);
- if(tk == nil){
- release();
- return -1;
- }
+ tk = qid2tk(&c->qid, t);
+ if(tk == nil){
+ return -1;
+ }
- if( strcmp(name, ".self") ){
- char *p, *pr = nil;
-
- for(p = name; *p != '\0'; p++){
- if(*p == '.'){
- pr = p;
- *p = '\0';
- break;
- }
+ /* .self file controls the folder (widget-container) properties. it has n==0 */
+ if( strcmp(name, ".self") ){
+ char *p, *pr = nil;
+
+ for(p = name; *p != '\0'; p++){
+ if(*p == '.'){
+ pr = p;
+ *p = '\0';
+ break;
}
+ }
- for( tk2 = tk->slave; tk2; tk2 = tk2->next){
- if( !strcmp(name,
- tk2->name_tail
- ? tk2->name_tail
- : tkname(tk2) )
- ){
- break;
- }
+ for( tk2 = tk->slave; tk2; tk2 = tk2->next){
+ if( !strcmp(name,
+ tk2->name_tail
+ ? tk2->name_tail
+ : tkname(tk2) )
+ ){
+ break;
}
- if(pr != nil)
- *pr = '.';
- if(tk2 == nil){
- release();
- return -1;
- }
-
- n = tk2idx(t, tk2);
- if(n == -1){
- release();
- return -1;
- }
- }else{
- n = 0;
}
-
- }
- else{
- t = p->tktop;
-
- tkr = t->root;
- n = path;
-
- tk = qid2tk(&c->qid, t);
- if(tk == nil){
- release();
+ if(pr != nil)
+ *pr = '.';
+ if(tk2 == nil){
return -1;
}
-
- if(s > 0){
- for( i = 1, tk2 = tk->slave; tk2 && i < s; i++, tk2 = tk2->next);
- if(tk2 == nil){
- release();
- return -1;
- }
-
- n = tk2idx(t, tk2);
- if(n == -1){
- release();
- return -1;
- }
- }else{
- n = 0;
- }
+ n = tk2idx(t, tk2);
+ if(n == -1){
+ return -1;
+ }
+ }else{
+ n = 0;
}
}
if(n == 0){
strcpy(up->genbuf, ".self");
if(name != nil && strcmp(name, up->genbuf) != 0){
- release();
return -1;
}
mkqid(&qid, (ulong)path | PATH(c->qid) | QCTL_NAME, c->qid.vers, QTFILE);
+ o = p->osenv;
devdir(c, qid, up->genbuf, 0, o->user, 0664, dp);
- release();
return 1;
}else if(tk2){
@@ -331,20 +281,167 @@ guigen(Chan *c, char *name, Dirtab *tab, int ntab, int s, Dir *dp)
tkmethod[tk2->type]->name
);
if(name != nil && strcmp(name, up->genbuf) != 0){
- release();
return -1;
}
if(tk2->slave)
tk2->is_container = 1;
mkqid(&qid, (ulong)n | PATH(c->qid), c->qid.vers, (tk2->is_container) ? QTDIR : QTFILE);
+ o = p->osenv;
devdir(c, qid, up->genbuf, 0, o->user, (tk2->is_container) ? DMDIR|0777 : 0664, dp);
- release();
return 1;
}else{
+ return -1;
+ }
+
+}
+
+
+/* ignore name and use s to find pid */
+static int
+guigen_by_number(Chan *c, Prog *p, int s, Dir *dp)
+{
+ Qid qid;
+ ulong pid, path;
+
+ TkTop *t;
+ Tk *tk=nil, *tk2=nil, *tkr=nil;
+ int i, n;
+
+ Osenv *o;
+
+
+ /* if it is the Top dir of the device */
+ if((ulong)c->qid.path == Qdir) {
+ p = progn(s);
+ if(p == nil) {
+ return -1;
+ }
+ pid = p->pid;
+ o = p->osenv;
+
+ // common part
+ snprint(up->genbuf, 127, "%lud", pid); // up->genbuf is a small (127 bytes) per-process character buffer
+//printf("%s: %d > %s\n", __func__, __LINE__, up->genbuf);
+ mkqid(&qid, pid << QSHIFT, pid, QTDIR); // in the Top dir of devgui all the entryes are folders
+ devdir(c, qid, up->genbuf, 0, o->user, DMDIR|0777, dp);
+ return 1;
+ }
+
+ path = QID(c->qid); //PATH(c->qid) >> QSHIFT;
+
+ if(p->tktop == nil) {
+ return -1;
+ }
+ else{
+ t = p->tktop;
+
+ tkr = t->root;
+ n = path;
+
+ tk = qid2tk(&c->qid, t);
+ if(tk == nil){
+ return -1;
+ }
+
+ if(s > 0){
+ for( i = 1, tk2 = tk->slave; tk2 && i < s; i++, tk2 = tk2->next);
+ if(tk2 == nil){
+ return -1;
+ }
+
+ n = tk2idx(t, tk2);
+ if(n == -1){
+ return -1;
+ }
+ }else{
+ n = 0;
+ }
+ }
+
+ /* .self file controls the folder (widget-container) properties. n==0 */
+ if(n == 0){
+ strcpy(up->genbuf, ".self");
+ mkqid(&qid, (ulong)path | PATH(c->qid) | QCTL_NAME, c->qid.vers, QTFILE);
+ o = p->osenv;
+ devdir(c, qid, up->genbuf, 0, o->user, 0664, dp);
+ return 1;
+
+ }else if(tk2){
+ snprint(up->genbuf, 127, "%s.%s",
+ tk2->name_tail
+ ? tk2->name_tail
+ : tkname(tk2),
+ tkmethod[tk2->type]->name
+ );
+//printf("%s: %d > %s\n", __func__, __LINE__, up->genbuf);
+ if(tk2->slave)
+ tk2->is_container = 1;
+ mkqid(&qid, (ulong)n | PATH(c->qid), c->qid.vers, (tk2->is_container) ? QTDIR : QTFILE);
+ o = p->osenv;
+ devdir(c, qid, up->genbuf, 0, o->user, (tk2->is_container) ? DMDIR|0777 : 0664, dp);
+ return 1;
+ }else{
+ return -1;
+ }
+
+}
+
+
+static int
+guigen(Chan *c, char *name, Dirtab *tab, int ntab, int s, Dir *dp)
+{
+ Prog *p;
+ char *e;
+ ulong pid, path;
+
+ int n;
+
+
+ USED(ntab);
+
+ if(s == DEVDOTDOT){
+ p = progpid(PID(c->qid));
+ if(p == nil){
+ error(Enonexist);
+ }
+
+ return guigen_folder_back(/*Chan **/c, /*Prog **/p, /*Dir **/dp);
+ }
+
+ path = QID(c->qid); //PATH(c->qid) >> QSHIFT;
+
+ acquire();
+
+ if((ulong)c->qid.path == Qdir){
+ if(name == nil){
+ /* ignore s and use name to find pid */
+ p = progn(s);
+ }else{
+ pid = strtoul(name, &e, 0);
+ if(pid == 0 || *e != '\0'){
+ release();
+ return -1;
+ }
+ p = progpid(pid);
+ }
+
+ }else{
+ p = progpid(PID(c->qid));
+ }
+ if(p == nil) {
release();
return -1;
}
+ if(name != nil)
+ n = guigen_by_name(/*Chan **/c, /*Prog **/p, /*char **/name, /*Dir **/dp);
+ else
+ n = guigen_by_number(/*Chan **/c, /*Prog **/p, /*int*/ s, /*Dir **/dp);
+
+ release();
+
+ return n;
+
#if 0
perm = tab->perm;
if((perm & 7) == 0)
@@ -358,6 +455,7 @@ guigen(Chan *c, char *name, Dirtab *tab, int ntab, int s, Dir *dp)
#endif
}
+// AA dinamic names-tree helper AA
@@ -747,9 +845,9 @@ guiremove(Chan *c)
TkTop *t;
Tk *tk;
- Tk *tk2 = nil;
+// Tk *tk2 = nil;
- char *rt;
+// char *rt;
char *name = c->name->s;
if(strcmp(name, ".") == 0 || strcmp(name, "..") == 0)
@@ -797,12 +895,12 @@ static long
guiread(Chan *c, void *va, long count, vlong offset)
{
Prog *p;
- char *buf;
- int n;
+// char *buf;
+// int n;
int len = 0;
- Osenv *o;
+// Osenv *o;
rslt_string *r, *or;
@@ -1067,8 +1165,8 @@ guiwrite(Chan *c, void *va, long count, vlong offset)
}
{
- TkOption **opts = tkmethod[tk->type]->opts;
- TkCmdtab *cmd = tkmethod[tk->type]->cmd;
+// TkOption **opts = tkmethod[tk->type]->opts;
+// TkCmdtab *cmd = tkmethod[tk->type]->cmd;
rslt_string *r = nil;
int rl = 0;
diff --git a/libmemdraw/draw.c b/libmemdraw/draw.c
index cc7a9c7..640516b 100644
--- a/libmemdraw/draw.c
+++ b/libmemdraw/draw.c
@@ -12,6 +12,10 @@
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+#else
+#define LOGI(...) print(__VA_ARGS__)
+#define LOGW(...) print(__VA_ARGS__)
+#define LOGE(...) print(__VA_ARGS__)
#endif
diff --git a/mkconfig b/mkconfig
index 791bea2..9f5365d 100644
--- a/mkconfig
+++ b/mkconfig
@@ -17,13 +17,13 @@ WINDOW_BACKEND=clutter # andr, clutter
# Except for building kernels, SYSTARG must always be the same as SYSHOST
#
SYSHOST=Linux #Nt #Plan9 # build system OS type (Hp, Inferno, Irix, Linux, MacOSX, Nt, Plan9, Solaris)
-SYSTARG=Android #Linux #$SYSHOST # target system OS type (Hp, Inferno, Irix, Linux, Nt, Plan9, Solaris)
+SYSTARG=Linux #Android #Linux #$SYSHOST # target system OS type (Hp, Inferno, Irix, Linux, Nt, Plan9, Solaris)
#
# specify the architecture of the target system - Plan 9 imports it from the
# environment; for other systems it is usually just hard-coded
#
-OBJTYPE=arm #386 # target system object type (eg, 386, arm, mips, power, s800, sparc)
+OBJTYPE=386 #arm #386 # target system object type (eg, 386, arm, mips, power, s800, sparc)
#OBJTYPE=$objtype
#