Traduzca

Translate to EnglishÜbersetzen Sie zum Deutsch/GermanΜεταφράστε στα ελληνικά/GreekПереведите к русскому/RussianOversetter til Norsk/NorwegianÖversätta till Svensk/Swedishहिन्दी अनुवाद करने के लिए/Hindi
Tradueix al català/CatalanTulkot uz latviešu/LatvianPreložiť do slovenčiny/SlovakVertaal aan het Nederlands/Dutchترجمة الى العربية/ArabicTraduzca al Español/SpanishTraduisez au Français/French
Traduca ad Italiano/ItalianTraduza ao Português/Portuguese日本語に翻訳しなさい /Japanese한국어에게 번역하십시오/Korean中文翻译/Chinese Simplified中文翻译/Chinese TraditionalПереклад на українську/Ukrainian
La imagen de Sistemas operativos Modernos (Edición tercera)
La imagen de empezar Google Traza a API 3
La imagen del Desarrollo de Meollo de Linux (Edición tercera)
La imagen de Conceptos de Sistema operativo

Actualizar Extensiones de Esqueleto de GNOMO para Trabajar Con GNOMO 3,2

Este poste particular contendrá el conocimiento que acumulo de las próximas semanas acerca de actualizar GNOMO 3,0 Pele extensiones para que trabajen con el El GNOMO 3,2 Esqueleto. Será un documento vivo por un período de aproximadamente 2 meses tan verifican atrás con frecuencia para actualizaciones. Cuando el GNOMO 3,4 Esqueleto es soltado, será cubierto en un poste separado.

Como está probablemente enterado, Esqueleto de GNOMO viene con un creador recíproco de extensión de Esqueleto de GNOMO llamada herramienta de extensión de esqueleto de gnomo. La utilidad es realmente una escritura sencilla de Pitón. Engendra una Hola sencilla utilizar Mundial de extensión:

gnome-shell-extension-tool --create-extension


Después de preguntarle 3 preguntas, la utilidad engendra tres archivos que son colocados en $HOME/.local/share/gnome-shell/extensions/<EXTENSION_UUID>/.

-rw-rw-r--. 1 fpm fpm 1488 Oct 25 21:46 extension.js
-rw-rw-r--. 1 fpm fpm  152 Oct 26 12:30 metadata.json
-rw-rw-r--. 1 fpm fpm  172 Oct 25 21:46 stylesheet.css

Aquí está lo que es engendrado por esta utilidad para extensión.J en el Sombrero 15 que utiliza GNOMO 3,0:

const St = imports.gi.St;
const Mainloop = imports.mainloop;
const Main = imports.ui.main;

function _showHello() {
    let text = new St.Label({ style_class: 'helloworld-label', text: "Hello, world!" });
    let monitor = global.get_primary_monitor();
    global.stage.add_actor(text);
    text.set_position(Math.floor (monitor.width / 2 - text.width / 2),
                      Math.floor(monitor.height / 2 - text.height / 2));
    Mainloop.timeout_add(3000, function () { text.destroy(); });
}

// Put your extension initialization code here
function main() {
    Main.panel.actor.reactive = true;
    Main.panel.actor.connect('button-release-event', _showHello);
}


Gracias al aparentemente incansable Jasper S. Pierre, Aquí está una un versión más avanzada poco de un GNOMO 3,0 extensión de Esqueleto de HelloWorld que fue backported del código engendrado por la misma utilidad en el Sombrero 16 beta.

const St = imports.gi.St;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;

let text, button;

function _hideHello() {
    Main.uiGroup.remove_actor(text);
    text = null;
}

function _showHello() {
    if (!text) {
        text = new St.Label({ style_class: 'helloworld-label', text: "Hello, world!" });
        Main.uiGroup.add_actor(text);
    }

    text.opacity = 255;

    let monitor = Main.layout.primaryMonitor;

    text.set_position(Math.floor(monitor.width / 2 - text.width / 2),
                      Math.floor(monitor.height / 2 - text.height / 2));

    Tweener.addTween(text,
                     { opacity: 0,
                       time: 2,
                       transition: 'easeOutQuad',
                       onComplete: _hideHello });
}

function main() {
    button = new St.Bin({ style_class: 'panel-button',
                          reactive: true,
                          can_focus: true,
                          x_fill: true,
                          y_fill: false,
                          track_hover: true });
    let icon = new St.Icon({ icon_name: 'system-run',
                             icon_type: St.IconType.SYMBOLIC,
                             style_class: 'system-status-icon' });

    button.set_child(icon);
    button.connect('button-press-event', _showHello);
    Main.panel._rightBox.insert_actor(button, 0);
}


Esta extensión agrega simplemente un botón al lado del mano derecho del (parte superior) panel y demuestra una Hola mensaje Mundial por varios segundos. Asumiré que conoce Javascript y el GNOMO Pela extensiones en general si lee este poste – tan yo no explicaré el código.

El GNOMO 3,2 imagen de extensión

En el GNOMO 3,0, todas las extensiones de Esqueleto son permitidas de manera predeterminada a menos que la extensión de Esqueleto esté en una lista negra, es decir org.gnome.shell.disabled-extensions. El por-usuario y las extensiones del Esqueleto de systemwide pueden ser incapacitados con esta llave de GSettings. Así, esta extensión de Esqueleto es permitida de manera predeterminada y cargado cuando reinicia el Esqueleto que utiliza Alt+F2 R, el gnomo-esqueleto –replace o algunos otros medios.

Para ganar una comprensión de qué cambios puede ser requerida en una 3,0 extensión de Esqueleto en la orden para la extensión a trabajar en el GNOMO 3,2, examinamos el código engendrado por esta utilidad para una 3,2 extensión de Esqueleto. A propósito, con Sombrero 16 Beta usted puede conseguir el error siguiente cuando corra esta utilidad:

Uuid [example__@ultra.xfpmurphy.com]: helloworld@example.com
Created extension in '/home/fpm/.local/share/gnome-shell/extensions/helloworld@example.com'
Traceback (most recent call last):
  File "/usr/bin/gnome-shell-extension-tool", line 151, in 
    subprocess.Popen(['gnome-open', extensionjs_path])
NameError: name 'extensionjs_path' is not defined


Vea esto fastidie informe Para más información. El arreglo es sencillo que – agrega la línea denotado por el +.

     print "Created extension in %r" % (extension_path, )
+    extensionjs_path = os.path.join(extension_path, 'extension.js')
     subprocess.Popen(['xdg-open', extensionjs_path])
     sys.exit(0)


Puede advertir que yo también reemplacé gnomo-apertura con xdg-apertura en subproceso.pinchado. Eso es porque gnomo-apertura es desaprobada.

Aquí está lo que es engendrado por la herramienta de extensión de esqueleto de gnomo en el Sombrero 16 Beta:

const St = imports.gi.St;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;

let text, button;

function _hideHello() {
    Main.uiGroup.remove_actor(text);
    text = null;
}

function _showHello() {
    if (!text) {
        text = new St.Label({ style_class: 'helloworld-label', text: "Hello, world!" });
        Main.uiGroup.add_actor(text);
    }

    text.opacity = 255;

    let monitor = Main.layoutManager.primaryMonitor;

    text.set_position(Math.floor(monitor.width / 2 - text.width / 2),
                      Math.floor(monitor.height / 2 - text.height / 2));

    Tweener.addTween(text,
                     { opacity: 0,
                       time: 2,
                       transition: 'easeOutQuad',
                       onComplete: _hideHello });
}

function init() {
    button = new St.Bin({ style_class: 'panel-button',
                          reactive: true,
                          can_focus: true,
                          x_fill: true,
                          y_fill: false,
                          track_hover: true });
    let icon = new St.Icon({ icon_name: 'system-run',
                             icon_type: St.IconType.SYMBOLIC,
                             style_class: 'system-status-icon' });

    button.set_child(icon);
    button.connect('button-press-event', _showHello);
}

function enable() {
    Main.panel._rightBox.insert_actor(button, 0);
}

function disable() {
    Main.panel._rightBox.remove_actor(button);
}


Como usted le puede ver es bastante diferente del GNOMO de backported 3,0 extensión de Esqueleto de HelloWorld . La funcionalidad básica de la extensión de Esqueleto es lo mismo. Allí ya no es una principal función; ha sido reemplazado por init. También dos funciones o métodos denominados permiten e incapacitan son obligatorio. Más acerca de estos más tarde.

En el GNOMO 3,2, una extensión de Esqueleto no está disponible a usted de manera predeterminada cuando el Esqueleto es reiniciado porque, en el GNOMO 3,2, extensiones de Esqueleto ya no son permitidas de manera predeterminada. La extensión del Esqueleto es cargada pero no permitido. Espejo Mostrará la extensión de Esqueleto en el cristal de Extensiones pero demostrará como descapacitado. Cualquier error en el código de extensión de Esqueleto será demostrado en el cristal de Errores.

El GNOMO 3,2 imagen de extensión

Para llegar a ser permitido, una extensión de Esqueleto debe ser añadida específicamente a un whitelist, es decir la llave de GSettings org.gnome.shell.enabled-extensions . Entonces el permite el método o la función en la extensión de Esqueleto deben ser llamados. Típicamente esto sucede automáticamente – más acerca de este más tarde.

Suponga que una extensión de Esqueleto es denominada example32@example.com. De un solo sentido para permitir el Esqueleto que extensión es de utilizar la utilidad de gsettings :

% gsettings get org.gnome.shell enabled-extensions[]
% gsettings set org.gnome.shell enabled-extensions "['example32@example.com']"
% gsettings get org.gnome.shell enabled-extensions
['example@example.com']


Otra manera de permitir o incapacitar el Esqueleto que extensión es de utilizar John Stower‘s excelente herramienta de pío pío de gnomo O la utilidad de dconf-redactor .

dconf-redactor

Otra manera es de utilizar una futura versión de herramienta de extensión de esqueleto de gnomo, todavía no soltado al la fecha de este blog, que tiene opciones para permitir o incapacitar extensiones.

$ ./gnome-shell-extension-tool --help
Usage: gnome-shell-extension-tool [options]

Options:
  -h, --help            show this help message and exit
  -d DISABLE, --disable-extension=DISABLE
                        Disable a GNOME Shell extension
  -e ENABLE, --enable-extension=ENABLE
                        Enable a GNOME Shell extension
  -c, --create-extension
                        Create a new GNOME Shell extension

$ gnome-shell-extension-tool -e example32@example.com
'example32@example.com' is now enabled.
$ gnome-shell-extension-tool -d example32@example.com
'example32@example.com' is now disabled.


Una copia de esta nueva versión de herramienta de extensión de esqueleto de gnomo está disponible aquí. ¡Note que no verifica la validez de nombres de extensión!

A propósito, mientras no es indicado específicamente en el GNOMO 3,2 Notas de la Liberación, de mirar el GNOMO 3,2 código fuente de Esqueleto, parecería que la llave org.gnome.shell.disabled-extensions ya no es ponía en la lista negra extensiones de Esqueleto.

Si compara el 3,0 y 3,2 versiones del código de extensión de Esqueleto, la principal función en 3,0 es reemplazada por tres funciones en 3,2, es decir init, permite e incapacita. La función de init es obligatoria como principal estuvo en 3,0. Hace todo la principal función hace generalmente, pero no puede cambiar cualquier estado de Esqueleto. Su propósito está al arreglo lo que debe ser arreglo, como etiquetas, el texto, los iconos o los actores, antes de permitir la extensión. Sólo es llamado una vez por sesión de esqueleto. El permite e incapacita funciones son obligatorio y son pensados ser utilizado para hacer una extensión de Esqueleto&UI #8217;s visible (permita) o invisible (incapacite) al usuario.

Note que mientras permite e incapacita puede ser funciones y init vacías puede contener el código para permitir el UI, va en contra de lo que los reveladores de Esqueleto de GNOMO tratan de lograr, es decir proporciona una manera de permitir o incapacitar una extensión de Esqueleto sin tener que recargar el Esqueleto de GNOMO. Recuerde, en el Esqueleto de GNOMO 3,0, cada vez usted deseó hacer algo con una extensión que tuvo que recargar el Esqueleto de GNOMO.

Este diseño no es impuesto; no puede ser. Toda la función de loadExtension de Esqueleto, que fue modificada extensamente en 3,2 (vea extensionSystem.J), puede hacer es de verificar para la existencia de init, permitir e incapacitar. Esto es todo el Esqueleto puede hacer para apoyar la intención del nuevo diseño sin código extenso ser añadida al Esqueleto. Está hasta escritores de extensiones de Esqueleto de conformarse con el espíritu y la intención del diseño. Cuando las extensiones propuestos. gnomo. la org se realiza, una herramienta probablemente podría ser escrita para verificar eso permite e incapacita permite realmente o incapacita la extensión de Esqueleto UI como parte de los criterios aceptables para el depósito.

    if (!extensionModule.init) {
        logExtensionError(uuid, 'missing \'init\' function');
        return;
    }

    try {
        extensionState = extensionModule.init(meta);
    } catch (e) {
        if (stylesheetPath != null)
            theme.unload_stylesheet(stylesheetPath);
        logExtensionError(uuid, 'Failed to evaluate init function:' + e);
        return;
    }

    if (!extensionState)
        extensionState = extensionModule;
    extensionStateObjs[uuid] = extensionState;

    if (!extensionState.enable) {
        logExtensionError(uuid, 'missing \'enable\' function');
        return;
    }
    if (!extensionState.disable) {
        logExtensionError(uuid, 'missing \'disable\' function');
        return;
    }


El Esqueleto escucha para un GSettings La señalcambiada que la llave org.gnome.shell.enabled_extensions ha cambiado e invoca onEnabledExtensionsChanged que consigue la lista de extensiones permitidas de Esqueleto, lo compara a la lista de la en-memoria de la corriente y permite o incapacita extensiones de Esqueleto llamando por consiguiente init siguió por permite para nueva extensión de Esqueleto añadió al whitelist, permite para extensiones de Esqueleto inicializó anteriormente pero descapacitado, e incapacita para extensiones de Esqueleto que ya no está en el whitelist.

function disableExtension(uuid) {
    let meta = extensionMeta[uuid];
    if (!meta)
        return;

    if (meta.state != ExtensionState.ENABLED)
        return;

    let extensionState = extensionStateObjs[uuid];

    // "Rebase" the extension order by disabling and then enabling extensions
    // in order to help prevent conflicts.

    // Example:
    //   order = [A, B, C, D, E]
    //   user disables C
    //   this should: disable E, disable D, disable C, enable D, enable E

    let orderIdx = extensionOrder.indexOf(uuid);
    let order = extensionOrder.slice(orderIdx + 1);
    let orderReversed = order.slice().reverse();

    for (let i = 0; i < orderReversed.length; i++) {
        let uuid = orderReversed[i];
        try {
            extensionStateObjs[uuid].disable();
        } catch(e) {
            logExtensionError(uuid, e.toString());
        }
    }

    try {
        extensionState.disable();
    } catch(e) {
        logExtensionError(uuid, e.toString());
        return;
    }

    for (let i = 0; i < order.length; i++) {
        let uuid = order[i];
        try {
            extensionStateObjs[uuid].enable();
        } catch(e) {
            logExtensionError(uuid, e.toString());
        }
    }

    extensionOrder.splice(orderIdx, 1);

    meta.state = ExtensionState.DISABLED;
    _signals.emit('extension-state-changed', meta);
}

function enableExtension(uuid) {
    let meta = extensionMeta[uuid];
    if (!meta)
        return;

    if (meta.state == ExtensionState.INITIALIZED) {
        loadExtension(meta.dir, meta.type, true);
        return;
    }

    if (meta.state != ExtensionState.DISABLED)
        return;

    let extensionState = extensionStateObjs[uuid];

    extensionOrder.push(uuid);

    try {
        extensionState.enable();
    } catch(e) {
        logExtensionError(uuid, e.toString());
        return;
    }

    meta.state = ExtensionState.ENABLED;
    _signals.emit('extension-state-changed', meta);
}

function onEnabledExtensionsChanged() {
    let newEnabledExtensions = global.settings.get_strv(ENABLED_EXTENSIONS_KEY);

    // Find and enable all the newly enabled extensions: UUIDs found in the
    // new setting, but not in the old one.
    newEnabledExtensions.filter(function(uuid) {
        return enabledExtensions.indexOf(uuid) == -1;
    }).forEach(function(uuid) {
        enableExtension(uuid);
    });

    // Find and disable all the newly disabled extensions: UUIDs found in the
    // old setting, but not in the new one.
    enabledExtensions.filter(function(item) {
        return newEnabledExtensions.indexOf(item) == -1;
    }).forEach(function(uuid) {
        disableExtension(uuid);
    });

    enabledExtensions = newEnabledExtensions;
}


Los cambios al Esqueleto UI por una extensión de Esqueleto son controlados por lo que codifica está en la extensión de Esqueleto’s permite e incapacita los métodos o las funciones. Típicamente, el Esqueleto llamará init, y entonces permitirá si la extensión de Esqueleto es permitida, es decir está en el whitelist de extensión de Esqueleto cuando el Esqueleto empieza. El Esqueleto puede llamar incapacita y permite otra vez durante la misma sesión. Sin embargo, el Esqueleto no llama permite o incapacita si una extensión de Esqueleto es incapacitada en inicio. Actualmente, el Esqueleto llama init para toda la extensión de Esqueleto inclusive extensiones descapacitadas de Esqueleto en inicio.

Puede codificar su extensión de Esqueleto para que init vuelva un objeto de Javascript con dos métodos llamado permite e incapacita. El tipo objetivo vuelto no importa. El Esqueleto no toca que se opone pero invocar o el permite o incapacita los métodos. Si init no vuelve nada ni vuelve un falsey (algo que evalúa a FALSO) objeto, el Esqueleto entonces asume que eso permite e incapacita son funciones definidas dentro de extensión.J y actos por consiguiente.

Aquí está una versión modificada de las extensión.J engendró por la 3,2 versión de herramienta de extensión de esqueleto de gnomo en la que init vuelve un objeto sencillo con permite e incapacita los métodos.

const Lang = imports.lang;
const St = imports.gi.St;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;

function HelloWorldExtension() {
    this._init();
}

HelloWorldExtension.prototype = {
    _init: function() {
        this.button = new St.Bin({ style_class: 'panel-button',
                                   reactive: true,
                                   can_focus: true,
                                   x_fill: true,
                                   y_fill: false,
                                   track_hover: true });
        this.text = null;
        let icon = new St.Icon({ icon_name: 'system-run',
                                 icon_type: St.IconType.SYMBOLIC,
                                 style_class: 'system-status-icon' });

        this.button.set_child(icon);
        this.button.connect('button-press-event', Lang.bind(this, this._showHello));
    },

    _hideHello: function() {
        Main.uiGroup.remove_actor(this.text);
        this.text = null;
    },

    _showHello: function() {
        if (!this.text) {
            this.text = new St.Label({ style_class: 'helloworld-label', text: "Hello, world!" });
            Main.uiGroup.add_actor(this.text);
        }

        this.text.opacity = 255;

	let monitor = Main.layout.primaryMonitor;

        this.text.set_position(Math.floor(monitor.width / 2 - this.text.width / 2),
                               Math.floor(monitor.height / 2 - this.text.height / 2));

        Tweener.addTween(this.text,
                         { opacity: 0,
                           time: 2,
                           transition: 'easeOutQuad',
                           onComplete: Lang.bind(this, this._hideHello) });
    },

    enable: function() {
        Main.panel._rightBox.insert_actor(this.button, 0);
    },

    disable: function() {
        Main.panel._rightBox.remove_actor(this.button);
    }
};

function init() {
    return new HelloWorldExtension();
}


La línea clave es regreso nuevo HelloWorldExtension. Esto es el objeto inicializado que es pasado atrás al Esqueleto. Contiene el permite el método que inserta el botón en el panel y el incapacita el método que quita el botón del panel.

Del arriba, debe ser obvio que puede modificar su 3,0 extensión de Esqueleto en uno de tres maneras de permitirlo trabajar con Esqueleto de GNOMO 3,2.

  • MALO – Usted puede reagrupar la principal función al init, y agregar vacío permite e incapacita funciones. El UI es demostrado cuando la extensión es cargada y no puede ser permitida ni puede ser incapacitada.
  • BUENO – Usted puede reagrupar la principal función al init, y mover cualquier código que agrega a actores, u otros componentes de UI, al Esqueleto en un nuevo permiten función y agregan un nuevo incapacita función que quita tales componentes de UI.
  • MEJOR – Usted puede reagrupar la principal función al init y modificar el código en el init para volver un objeto que tiene permite e incapacita funciones.

Teóricamente, si desea que su extensión de Esqueleto trabaje con ambos GNOMO 3,2 y el GNOMO 3,0, podría agregar una principal función sencilla que llama init siguió por permite. En la práctica, yo no he encontrado que esto ser maleable a menos que la extensión de Esqueleto sea muy sencilla a causa de las muchas diferencias en los nombres de variables internas y los trabajos de funciones entre GNOMO 3,0 y el GNOMO 3,2.

Por ejemplo, aquí está el GNOMO 3,0 versión de extensión.J para mi extensión de Esqueleto noa11y . El propósito de esa extensión es de quitar la accesibilidad (ALIAS a11y) botón del lado derecho del panel.

const Panel = imports.ui.panel;

function main() {

    let index = Panel.STANDARD_TRAY_ICON_ORDER.indexOf('a11y');
    if (index >= 0) {
        Panel.STANDARD_TRAY_ICON_ORDER.splice(index, 1);
    }
    delete Panel.STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION['a11y'];

}


Como usted le puede ver fue una extensión muy sencilla. Sopló simplemente lejos el código asociado con a11y.

Aquí está el código para el GNOMO 3,2 versión de la misma extensión de Esqueleto:

const Main = imports.ui.main;

function NoA11y() {
    this._init()
}

NoA11y.prototype = {
    _init: function() {
        this._removed = null;
    },

    enable: function() {
        if (this._removed == true) return;

        let _a11y = Main.panel._statusArea['a11y'];

        let children = Main.panel._rightBox.get_children();
        for (let i = 0; i < children.length; i++) {
            if (children[i]._delegate == _a11y) {
                children[i].destroy();
                this._removed = true;
                Main.panel._statusArea['a11y'] = null;
                break;
            }
        }
    },

    disable: function() {
          if (this._removed == false) return;

          let _index = 0;
          let _volume = Main.panel._statusArea['volume'];

          let children = Main.panel._rightBox.get_children();
          for (let i = 0; i < children.length; i++) {
              if (children[i]._delegate == _volume) {
                  _index = i;
                  break;
              }
          }
          if (_index > 0) _index--;

          let indicator = new Main.panel._status_area_shell_implementation['a11y'];
          Main.panel.addToStatusArea('a11y', indicator, _index);
          this._removed = false;
    }

};

function init() {
    return new NoA11y();
}


La mayor parte del nuevo código es a favor del permite e incapacita funcionalidad de extensión UI. Como puede ver, apoyando tal funcionalidad aumenta apreciablemente el número de líneas de código y complejidad de la extensión. Podría hacer fácilmente un argumento válido que usted necesita el conocimiento aún más detallado del interno del 3,2 Esqueleto que necesitó para el 3,0 Esqueleto para escribir Esqueleto extensiones que apoyan permiten e incapacitan funcionalidad.

Aquí está cómo el Linux Nuevo los reveladores aplicaron su extensión de Esqueleto noa11y :

const Main = imports.ui.main;
const Panel = imports.ui.panel;

let indicator;
let idx = null;

function init(extensionMeta) {
    indicator = new Panel.STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION["a11y"];
}

function enable() {
    // Remove A11Y menu
    for (let i = 0; i < Main.panel._rightBox.get_children().length; i++) {
        if (Main.panel._statusArea['a11y'] == Main.panel._rightBox.get_children()[i]._delegate) {
            Main.panel._rightBox.get_children()[i].destroy();
            break;
        }
    }
    // addToStatusArea would throw an error on disable if we don't set this to null
    Main.panel._statusArea['a11y'] = null;
}

function disable() {
   Main.panel.addToStatusArea("a11y", indicator, idx);
}


A propósito, su MGSE (Extensiones nuevas de Esqueleto de GNOMO) depósito es bien valor que averigua.

Haga tonterías remendar no trabaja el mismo en el 3,2 Esqueleto como hizo en el 3,0 Esqueleto. ¡Considere las diferencias entre la 3,0 versión de mi extensión de Esqueleto que reemplaza los iconos SIMBOLICOS en el panel lado derecho con iconos de FULLCOLOR (mucho más agradable)!

Aquí está el contenido de las 3,0 extensión.J:

const St = imports.gi.St;
const Shell = imports.gi.Shell;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;

function main() {

    // monkey patch
    PanelMenu.SystemStatusButton.prototype._init = function(iconName, tooltipText) {
        PanelMenu.Button.prototype._init.call(this, 0.0);
        this._iconActor = new St.Icon({ icon_name: iconName,
                                        icon_type: St.IconType.FULLCOLOR,
                                        style_class: 'system-status-icon' });
        this.actor.set_child(this._iconActor);
        this.actor.set_style_class_name('panel-status-button');
        this.setTooltip(tooltipText);
    };

}


y aquí está lo que las 3,2 extensión.J contienen:

const Main = imports.ui.main;
const St = imports.gi.St;

function ColorStatusButtonsExtension() {
    this._init()
}

ColorStatusButtonsExtension.prototype = {
    _init: function() {
        this._fullcolor = null;
    },

    disable: function() {
        let children = Main.panel._rightBox.get_children();
        for (let i = 0; i < children.length; i++) {
            if (children[i] && children[i]._delegate._iconActor) {
                children[i]._delegate._iconActor.icon_type = St.IconType.SYMBOLIC;
                children[i]._delegate._iconActor.style_class = 'system-status-icon';
            }
        }
    },

    enable: function() {
        let children = Main.panel._rightBox.get_children();
        for (let i = 0; i < children.length; i++) {
            if (children[i] && children[i]._delegate._iconActor) {
                children[i]._delegate._iconActor.icon_type = St.IconType.FULLCOLOR;
                children[i]._delegate._iconActor.style_class = 'color-status-button';
            }
        }
    }
};

function init() {
    return new ColorStatusButtonsExtension();
}


No todo el trabajo que usted debe hacer para permitir su Extensión de Esqueleto a trabajar con GNOMO 3,2 está en extensión.J. Usted también debe modificar metadata.json para emparejar la versión necesaria del Esqueleto de GNOMO (esqueleto-versión) y posiblemente también la versión de GJS (J-versión). Vea la función de versionCheck en extensionSystem.J. Para averiguar la versión de Esqueleto de GNOMO que usted corre, entre gnomo-esqueleto –version, o el gato /usr/share/gnome-shell/js/misc/config.js. Actualmente, puse la esqueleto-versión a 3,2 en el metadata.json.

A propósito, si choca con problemas que consiguen su extensión para trabajar, prueba el orden siguiente invocar el Esqueleto de GNOMO en depura un programa el modo:

env GJS_DEBUG_OUTPUT=stderr  gnome-shell --replace


También recuerde que Espejo es su amigo. Consiga familiarizado con Espejo y usted lo puede utilizar para resolver muchos un error de codificación. Note sin embargo que sólo las propiedades y métodos de objetos de introspected que han sido utilizados antes que LG sea invocado aparecerá.

Es agradable ver que las extensiones de Esqueleto consiguieron una cantidad mínima del amor verdadero en el GNOMO 3,2. ¡Recuerde que es no hace mucho que algunas personas estuvieron inexorables esas extensiones de Esqueleto y los temas fueron una aberración mala, quitaban la pureza de la una experiencia única de Esqueleto de GNOMO de transversal-distribución, y deben ser totalmente no apoyado! Con la liberación de GNOMO 3,2, esto ya no es el caso. La base del usuario ganó la batalla. Cientos de extensiones, algunos útil, algunos caprichoso, había sido desarrollado desde la liberación de GNOMO 3,0 más temprano este año.

26 comentarios a Actualizar Extensiones de Esqueleto de GNOMO para Trabajar Con GNOMO 3,2

  • Arquero de Charles

    Muy informativo como de costumbre.

    Gracias finlandés.

  • wnfu12nb

    ¿Cómo puedo modificar yo la extensión de autohidetopbar para mostrar el topbar sólo en modo de vista general?

  • Albert

    Gran poste: -). ¿BTW, por qué dice usted que volviendo un objeto con permite e incapacita los métodos son mejor?

    También, vale notar que un parche ya ha sido cometido para hacerlo tan incapacitó extenstions&los métodos de init #8217; no son llamados, así que podemos esperar eso para 3,4: -).

    • Quiero encapsular permite () e incapacita () simplemente porque creo que es una mejor manera de codificar Javascript.

      Sí soy consciente de ese cambio particular en la S G 3,4 y he estado experimentando consigo. El gran cantidad romperá más en extensiones cuando 3,4 son soltados.

  • Arquero de Charles

    Advertido algo ayer interesante.

    Mi esperanza es que extensiones descapacitadas se ponen’t realiza las otras extensiones pero al averiguar la extensión de movehotcorner con las extensiones de MGSE el rincón caliente correcto es activo & conjunto incapacitó. Si lo permito que consigo un icono “button” de vista general & tengo que hacer clic enlo, disaled yo consigo ese choque agradable que el rincón para mostrar vista general conducta.

    Durante el probar temprano yo extensiones de activa/desactiva comprimiendolos & borrando la guía. Esta experiencia reciente indica que si la extensión lo existe carga (como indicado por lg) & a veces todavía afecta el escritorio aún cuando descapacitado.

  • Por favor. Necesito el autohidetopbar de extensión, yo’m de Sudamérica, mi inglés no es muy bueno. Deseo que expreso a la extensión sea el más importante para mí porque mi monitor es realmente pequeño, gracias por escuchar y notifica a mí la realización.

  • Steven Webb

    Gracias por todo su gran trabajo Finnbarr.

    Para cualquiera interesó, yo’ve hizo algunas pequeñas modificaciones y las mejoras al movimiento extensión caliente de rincón (https://github.com/swebb/Move-Hot-Corner).

    Sería agradable tener una solución más completa que puede agregar lugares de peligro en múltiples monitores; sin embargo, yo refugio’t pudo encontrar cualquier documentación acerca de api disponible’s.

  • robytrevi

    Hola.
    Yo’m que utiliza la extensión de colorstatusbutton en Ubuntu Oneiric (comenzó de una instalación mínima).
    Cuando lo activo que el tamaño de los iconos es enorme.
    ¿Cómo lo puedo fijar yo?
    La simplemente modificación de “icon-size: 1.34em;” en el doesn de archivo de stylesheet.css&el trabajo #8217;t (nada sucede también después de que el refresque del esqueleto).

  • Slawek

    Gran, ahora tengo que aprender Escritura de Java.

  • Hola, las Actividades Abotonan doesn&el trabajo #8217;t con Faience de Gnomo-Esqueleto (http://tiheum.deviantart.com/art/Gnome-Shell-Faience-255097456)
    Si permito la extensión, cambiará mi tema de esqueleto para Dejar de pagar
    Pueda lo fija, por favor: -)

    Gracias.

  • robytrevi

    Hay alguna incompatibilidad gráfica entre extensión de activitiesbutton, extensión de colorsbutton y el menú de mgse del grupo webupd8: http://www.webupd8.org/2011/11/try-new-mint-gnome-shell-extensions.html (Mire mi poste al fin).

    • robytrevi

      El problema es la interacción entre línea 19 de archivo extensión.J de extnsion de activitiesbutton:
      esto. _themeContext = St.ThemeContext.get_for_stage(global.stage);
      y el mismo archivo de extensión de mgse en línea 221 222:
      permita focusManager = St.FocusManager.get_for_stage(global.stage);
      permita el grupo = focusManager.get_group(this.actor);
      Pero me pongo realmente’t comprende javascript todavía.

    • Arquero de Charles

      No sorprendido, el MGSE puso es un paquete agradable pero no había pensamiento ni probando con otras extensiones ni temas del vistazo de cosas.

  • BanjoKU

    Hola,

    En su Mundo de Hola, el icono de estatus que usted añade al panel es espaciado inexactamente, Si mira el espacio entre otros iconos, suyo es demasiado cercano a su vecino.

    Asumo que esto puede ser alterado agregando su propio CSS, pero está allí otra manera de conseguir espaciamiento correcto como hardcoding en un por base de icono no es ideal si quiere ser compatible con todos los temas de esqueleto.

  • ¡Gracias! Tengo (ab) utilizó su idea para hacer una extensión pequeña (vea en mi blog) cambiar el tamaño del tipo de letra y acolchando en el principal panel. ’s una copia descarada: -), así que yo refugio’t lo publicó en extensiones. gnomo. la org — a menos que el autor original lo autorice.

  • Weakmutation

    Hola, la información sobre theming GTK3 es bastante escasa tan pensé de preguntar aquí:
    1
    ¿Por qué se pone’t temas personalizados que utilizan colores de carga de unico apropiadamente, variaciones especialmente oscuras? El síntoma común está color equivocado de selección o tipo de letra gris con temas oscuros. El único remedio que trabaja para mí apunta fuera de gnomo y atrás en
    2
    ¿Es limitado realmente el motor de adwaita en sus capacidades gráficas comparadas al unico? ¿O es el menor de diferencias?
    3
    ¿Está la prueba del tema disponible en depósitos de defecto Ubuntu Oneiric?

  • Marshall Neill

    Hola,
    Permítame introducirme, yo soy Marshall Neill y recientemente le instalé extensión. Gran, fantástico, sólo lo que buscaba. Lo utilizo a menudo y lo encuentro bastante bueno.
    ¿ Tengo una pregunta, “How le hace o puede cambiar usted el popup de los artículos diferentes de menú? ”?
    Al mover de una categoría al próximo, si mueve el ratón sobre otra categoría abre inmediatamente. He estado buscando su código y encontré no demora de tiempo ni función de tiempo muerto. Si tuvo casi igual 1/2 segunda demora para mostrar la próxima categoría que sería excelente. La manera que es ahora tengo constantemente que volver y asegurar que muevo el ratón horizontalmente al artículo del menú que deseo.
    Otra vez, su extensión es gran y gracias por todo el trabajo usted ha puesto en ello.
    Comienzo a ver cada vez más extensiones y parezco kinda graciosos a mí que lo que yo herida de sorta arriba con fue un Gnomo 2 vistazo dentro de un Gnomo 3 ambiente. Las extensiones hacen Gnomo 3 que mejor y, a mí, mucho más utilizable.
    Gracias otra vez.
    Marshall Neill

  • didou

    Hola,

    ¡Yo’m nuevo al desarrollo de extensiones, y yo encuentran que se calma tedioso comenzar! Gracias por este poste de blog que ayuda mucho.
    ¿Yo’ve comenzó mi primera extensión, y querría saber si allí’s cualquier otra manera de actualizarlo que recargando todo el gnomo-esqueleto cada vez? (gnomo-esqueleto –replace)

    ¡Gracias!

  • Isaac

    Hola,

    ¡Ante todo, gracias por estas guías! Yo’ve quiso escribir una extensión desde que yo comencé utilizando Gnomo 3 pero allí didn’t parece ser alguna documentación buena en ello.

    Yo’m confundió en cuanto a por qué usted quiere tener init vuelve un objeto de Javascript en comparación con utilizar simplemente tres funciones separadas. Para una cosa, ’s más confuso y menos sinceramente entonces el código estándar engendró. También, doesn&el trabajo #8217;t en mi Sombrero 16 (Gnomo 3,2,1) sistema. El mundo “Hello,! caja ” parece arriba en la parte superior rincón dejado, me haciendo creo que la línea “this.text.set_position” falla. La caja también doesn&fundido #8217;t. Yo’ve trató fisgonear pero doesn’t parece trabajar no importa lo que haga.

    Gracias,
    Isaac

    • De cualquier manera de codificación los trabajos. Escojo codificar en una manera objeto-orientado. Hace no – y eso son finos. Si lee el sourcecode de Javascript para el Esqueleto de GNOMO, verá que es escrito en su mayor parte como código objeto-orientado. Para más información en el Javascript de OO, yo sugiero que lee “JavaScript: Las Partes Buenas” por Douglas Crockford.

      ¿En cuanto a usted problemas con su ejemplo de helloworld, cuál ejemplo de helloworld utiliza usted? Acabo de verificar el exention de helloworld en http://fpmurphy.com/gnome-shell-extensions Y trabaja como se esperaba. El mensaje parece en medio de mi pantalla y fundidos como se esperaba. Sin más detalles, no hay mucho puedo hacer para ayudarle.

Deje una Respuesta