gnome-shell under Seed (not)



Just for fun, I tried making gnome-shell work with Seed instead of
gjs... (Well, for fun, and with an eye towards eventually sucking
epiphany into the window-manager-panel-megaprocess as well, for deep
shell/web integration...)

It turns out to not really be possible (currently?), but I figure
someone else is going to have this idea at some point, so I should send
mail with my findings.

gnome-shell doesn't really depend on anything specific to *gjs*; it
depends on some of gjs's custom javascript modules (signals, tweener,
lang, etc), but those are just javascript and we could copy them into
gnome-shell for Seed to use. It also depends on some Mozilla javascript
extensions; we could just add the new Array methods (filter, etc) to
Array's prototype ourselves. For the syntactic things like "const" and
"let", we could probably change almost all of them to "var" and it would
all still work. (We'd be unhappy about doing that, but...)

The real trick turns out to be the fact that you can't import a
javascript file *into a namespace* in Seed the way you can in gjs. That
is, given a file bar.js that does "var x = 5;", in gjs you can do:

    var x = 3;
    const Bar = imports.bar;

and then x is still 3, and Bar.x is 5. But with "Seed.include('bar.js')"
in Seed, bar.js's x would just overwrite the other x, and there's no way
to make it work any other way. In fact, I think it's not possible to do
this at all with JavaScriptCore; JSEvaluateScript() only lets you
evaluate code in the scope of the global object, and while you could do
something like:

  (function() { Seed.include('bar.js'); })()

and thereby execute the code in its own scope, there's no way to get
access to that scope and assign it to a variable.

So to make gnome-shell work in Seed, we'd either have to rewrite
everything to get rid of per-js-file namespaces, or else we'd have to
rewrite everything to namespace the functions and variables by hand when
defining them.

That was the point where I gave up. (Well, actually, I tried for a while
to write a perl script to rewrite the js files to manually namespace
everything, and maybe that would have eventually worked, but by this
point it was getting too messy for a quick hack...)

-- Dan


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]