LINUX.ORG.RU

Ткните носом плиз в ошибку. Яваскрипт, апплет для Cinnamon.

 , , ,


0

0

в общем апплет был написан без знаний явы методом тыка по аналогии. Документация использовалась при написании только из /usr/share/cinnamon/applets/ ну и немного логики и школьных знаний.

Написалось вот это:

const Cinnamon = imports.gi.Cinnamon;
const Applet = imports.ui.applet;
const Main = imports.ui.main;
const Lang = imports.lang;
const St = imports.gi.St;
const PopupMenu = imports.ui.popupMenu;
const Util = imports.misc.util;
const GLib = imports.gi.GLib;
const ModalDialog = imports.ui.modalDialog;
var pict = "r-button";

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

function MyApplet(orientation) {
    this._init(orientation);
}

MyApplet.prototype = {
    __proto__: Applet.IconApplet.prototype,

    _init: function(orientation) {
        Applet.IconApplet.prototype._init.call(this, orientation);

        try {
            if (GLib.file_test("/usr/share/cinnamon/applets/FireWallApplet@antares127/marker", GLib.FileTest.EXISTS))
            {pict = "g-button";}
            else
            {pict = "r-button";}
            this.set_applet_icon_name(pict);
            this.set_applet_tooltip(_("Кнопка управления Файерволом."));
            this.menuManager = new PopupMenu.PopupMenuManager(this);
            this.menu = new Applet.AppletPopupMenu(this, orientation);
            this.menuManager.addMenu(this.menu);
            this._contentSection = new PopupMenu.PopupMenuSection();
            this.menu.addMenuItem(this._contentSection);

            this.menu.addAction(_("Отключить файервол"), function(event) {
                Util.spawnCommandLine("sudo /usr/share/cinnamon/applets/FireWallApplet@antares127/fw_off.sh");
                pict = "r-button";
                this.set_applet_icon_name(pict);
            });

            this.menu.addAction(_("Включить файервол"), function(event) {
                Util.spawnCommandLine("sudo /usr/share/cinnamon/applets/FireWallApplet@antares127/fw_on.sh");
                pict = "g-button";
                this.set_applet_icon_name(pict);
            });

            this.menu.addAction(_("Включить файервол и ICMP"), function(event) {
                Util.spawnCommandLine("sudo /usr/share/cinnamon/applets/FireWallApplet@antares127/fw_icmp_all.sh");
                pict = "g-button";
                this.set_applet_icon_name(pict);
            });
        }
        catch (e) {
            global.logError(e);
        }
    },
    on_applet_clicked: function(event) {
        this.set_applet_icon_name(pict);
        this.menu.toggle();
    },
};
function main(metadata, orientation) {
    let myApplet = new MyApplet(orientation);
    return myApplet;
}

Для отображения значка в трее, как видно, используются два картинко. И в зависимости от того в каком состоянии находится апплет иконка должна меняться. Но иконка мне упорно гадит. Перерисовывание иконки происходит только в тот момент когда после клика по меню и исполнения команды, повторно кликаешь по иконке. С моим уровнем знания явы и гугла заставить иконку перерисовываться вовремя мне не удалось. Прошу помощи.



Последнее исправление: AfterWork (всего исправлений: 1)

Ответ на: комментарий от EXL

Это JavaScript, а не Java. Измени теги и название темы.

Спасибо, изменил. Вот такие глубокие у меня познания. :)

AfterWork
() автор топика
Ответ на: комментарий от tyamur

Я головой-то понимаю что исправление надо внести какое-то элементарное, знать бы еще какое.

AfterWork
() автор топика
Ответ на: комментарий от EXL

Один фиг джавистов он уже скастовал к себе.

Deleted
()

Блин, хотел бы помочь, но я плохо знаком с прототипным ООП, т.е. не могу понять, куда указывает внутренний this в случае с:

this.menu.addAction(_("Включить файервол и ICMP"), function(
    Util.spawnCommandLine("sudo /usr/share/cinnamon/applets/FireWallApplet@antares127/fw_icmp_all.sh");
    pict = "g-button";
    this.set_applet_icon_name(pict);
});

Предполагаю, что у тебя this даёт не тот объект, что ты хочешь внутри addAction.

Либо надо искать что-то вроде refresh/redraw/update.

Deleted
()
Последнее исправление: merhalak (всего исправлений: 1)

Мнение дилетанта

const Cinnamon = imports.gi.Cinnamon;
const Applet = imports.ui.applet;
const Main = imports.ui.main;
const Lang = imports.lang;
const St = imports.gi.St;
const PopupMenu = imports.ui.popupMenu;
const Util = imports.misc.util;
const GLib = imports.gi.GLib;
const ModalDialog = imports.ui.modalDialog;
var pict = "r-button";

// что за дичь? где сам _init()? ты ни как не наследуешься что бы иметь его
function ConfirmDialog(){
    this._init();
}

function MyApplet(orientation) {
    this._init(orientation);
}

MyApplet.prototype = {
    __proto__: Applet.IconApplet.prototype,

    _init: function(orientation) {
        Applet.IconApplet.prototype._init.call(this, orientation);
        const self = this; // <-- сюда смотри и читай про области видимости в JS

        try {
            if (GLib.file_test("/usr/share/cinnamon/applets/FireWallApplet@antares127/marker", GLib.FileTest.EXISTS))
            {pict = "g-button";}
            else
            {pict = "r-button";}
            this.set_applet_icon_name(pict);
            this.set_applet_tooltip(_("Кнопка управления Файерволом."));
            this.menuManager = new PopupMenu.PopupMenuManager(this);
            this.menu = new Applet.AppletPopupMenu(this, orientation);
            this.menuManager.addMenu(this.menu);
            this._contentSection = new PopupMenu.PopupMenuSection();
            this.menu.addMenuItem(this._contentSection);

            this.menu.addAction(_("Отключить файервол"), function(event) {
                Util.spawnCommandLine("sudo /usr/share/cinnamon/applets/FireWallApplet@antares127/fw_off.sh");
                pict = "r-button";
                self.set_applet_icon_name(pict); // fix 1
            });

            this.menu.addAction(_("Включить файервол"), function(event) {
                Util.spawnCommandLine("sudo /usr/share/cinnamon/applets/FireWallApplet@antares127/fw_on.sh");
                pict = "g-button";
                self.set_applet_icon_name(pict); // fix 2
            });

            this.menu.addAction(_("Включить файервол и ICMP"), function(event) {
                Util.spawnCommandLine("sudo /usr/share/cinnamon/applets/FireWallApplet@antares127/fw_icmp_all.sh");
                pict = "g-button";
                self.set_applet_icon_name(pict); // fix 3
            });
        }
        catch (e) {
            global.logError(e);
        }
    },
    on_applet_clicked: function(event) {
        this.set_applet_icon_name(pict);
        this.menu.toggle();
    },
};
function main(metadata, orientation) {
    let myApplet = new MyApplet(orientation);
    return myApplet;
}
Noob_Linux ★★★★
()
Последнее исправление: Noob_Linux (всего исправлений: 1)

Одни наклепают плагинов на жопаскрипте, другие жалуются что софт стал тормозный.

Deleted
()
const Cinnamon = imports.gi.Cinnamon
const Applet = imports.ui.applet
const Main = imports.ui.main
const Lang = imports.lang
const St = imports.gi.St
const PopupMenu = imports.ui.popupMenu
const Util = imports.misc.util
const GLib = imports.gi.GLib
const ModalDialog = imports.ui.modalDialog

let pict = "r-button"

class MyApplet extends Applet.IconApplet {
	constructor(orientation){
	  super()
	  try {
	    this._init(orientation)
	  } catch (e) {
	    global.logError(e)
	  }
	}

	_init(orientation){
	  super._init(orientation)

	  let f = GLib.file_test("/usr/share/cinnamon/applets/FireWallApplet@antares127/marker", GLib.FileTest.EXISTS)
		
	  pict = f ? "g-button" : "r-button"

	  this.set_applet_icon_name(pict)
          this.set_applet_tooltip(_("Кнопка управления Файерволом."))
          this.menuManager = new PopupMenu.PopupMenuManager(this)
          this.menu = new Applet.AppletPopupMenu(this, orientation)
          this.menuManager.addMenu(this.menu)
          this._contentSection = new PopupMenu.PopupMenuSection()
          this.menu.addMenuItem(this._contentSection)

          this.menu.addAction(_("Отключить файервол"), event => {
                Util.spawnCommandLine("sudo /usr/share/cinnamon/applets/FireWallApplet@antares127/fw_off.sh")
                pict = "r-button"
                this.set_applet_icon_name(pict)
            })

          this.menu.addAction(_("Включить файервол"), event => {
                Util.spawnCommandLine("sudo /usr/share/cinnamon/applets/FireWallApplet@antares127/fw_on.sh")
                pict = "g-button"
                this.set_applet_icon_name(pict)
            })

          this.menu.addAction(_("Включить файервол и ICMP"), event => {
                Util.spawnCommandLine("sudo /usr/share/cinnamon/applets/FireWallApplet@antares127/fw_icmp_all.sh")
                pict = "g-button"
                this.set_applet_icon_name(pict)
            })

	}

	on_applet_clicked(event) {
          this.set_applet_icon_name(pict)
          this.menu.toggle()
    }
}

function main(metadata, orientation) {
    let myApplet = new MyApplet(orientation)
    return myApplet
}
int64
()
Ответ на: комментарий от int64

На том, на чем написано само DE, например на Cи, C++, Qt, GTK (без вставок на жопаскрипте). Я понимаю, что на скриптовом клиентском проще говнокодить, но не надо так. Ведь из-за таких как вы, приходится покупать новый процессор, чтобы какой-то кусок жопаскрипта мог быстро отработать свою задачу. То есть, не ради каких-то серьезных задач нынче пора обновляться, не ради рендеринга, например, а чтобы чертово DE, напичканное апплетами (написанными на непредназначенном для этого языке) не тормозило.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Ткните носом плиз в ошибку

javascript

this

Virtuos86 ★★★★★
()
Ответ на: комментарий от Deleted

Я правильно понимаю, что из-за того, что ТС напишет себе какой-то там плагин, тебе приходится покупать новый процессор? Или ты расскажешь, кто заставляет тебя использовать плагины\программы\что-угодно на тех языках и технологиях, которые лично тебе не по душе?

int64
()
Ответ на: комментарий от Deleted

Или же ы хочешь, чтобы было так, что если тебе какой-то язык\технология не нравятся, для использования в чем-либо, то этой возможности не было ни у кого, лишь потому что это не нравится тебе?

int64
()
Ответ на: комментарий от int64

Осиль уже нормальные языки. И не пиши на скриптовом то, что критично в плане производительности.

Deleted
()
Ответ на: комментарий от int64

Такие как ты пишут, узколобые. Мне это мешает, ибо дурной пример заразен. Сегодня одна обезьяна написала, а завтра уже толпа таких же начнет клепать свои поделия на жопаскрипте.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от int64

тебе какой-то язык\технология не нравятся

Не знаю, чем ты читаешь, но дело не просто в том, что нравится, а что нет. Жопаскрипту не место среди десктопного софта. Его место в вебе.

Deleted
()
Ответ на: комментарий от Deleted

Осиль уже нормальные языки

Теперь расскажи мне, какие же языки у нас нормальные.
А так же посвяти меня в то, откуда ты знаешь какими языками владею я?

Складывается ощущение, что ты дегенерат.

int64
()
Ответ на: комментарий от int64

Теперь расскажи мне, какие же языки у нас нормальные.

Что тебе рассказывать, даже читать и осмысливать не умеешь вышенаписанное.

Deleted
()
Ответ на: комментарий от Deleted

Осиль уже нормальные языки. И не пиши на скриптовом то, что критично в плане производительности.

1. Язык на котором я сайчас пишу - bash. Это самодостаточный скрипт язык для решения моих задач.

2. Если бы Вы обратили внимание на вот это:

Документация использовалась при написании только из /usr/share/cinnamon/applets/ ну и немного логики и школьных знаний.

То вероятно не стали бы пафосно рассуждать о вопросах моего выбора языка скриптов для написания этого апплета. Взятый мной язык, рекомендован производителем оболочки и особого выбора у меня не было.

3. Нормальные языки я осили в своё время. Начиная с программ с глубокой рекурсией на спектрум бэйсике (Кто на нем писал поймет о чем это я. Написано было ради доказать что это возможно.) и заканчивая крупными проектами на дельфи. Но всё это было в прошлой жизни и слишком давно.

То есть, не ради каких-то серьезных задач нынче пора обновляться, не ради рендеринга, например, а чтобы чертово DE, напичканное апплетами (написанными на непредназначенном для этого языке) не тормозило.

4. Этот плагин я пишу для СЕБЯ. И вероятность Вам с ним столкнуться крайне минимальна. Его функционал спокойно решает написанная на нормальном Qt gufw. Но я предпочитаю реализовывать функционал нормально без всяких костылей в виде раздутых говнопрограмм с собственным скриптовым интерпретатором. А если для этого надо написать трехстрочный плагин на яваскрипте который специально задуман производителем оболочки для написания подобных плагинов, так тому и быть.

AfterWork
() автор топика
Ответ на: комментарий от Deleted

Что тебе рассказывать, даже читать и осмысливать не умеешь вышенаписанное.

Вы видимо тоже не преуспели в этом действе. Пояснение чуть выше.

AfterWork
() автор топика
Ответ на: комментарий от Deleted

Учитывая то, что оскорблять начал ты, это странное заявление.

Но да ладно, не обратил внимание на то, что ты инвалид. Видимо это оставило свои отпечатки на твоем интеллекте.
Какой с тебя спрос.

int64
()
Ответ на: комментарий от mos

Так только ты остался. Ждем, когда сдохнешь.

anonymous
()
Ответ на: Мнение дилетанта от Noob_Linux

Мнение дилетанта помогло решить задачу. Спасибо.

// что за дичь? где сам _init()? ты ни как не наследуешься что бы иметь его

Это не я. Я этого не делал. :) На самом деле всё скопировано из соседних примеров и не более того. Я головой то понимал что или с областью действия или еще с чем-то таким-же проблема. Но не зная конструкций языка и его правил найти подобную ошибку крайне сложно. В любом случае спасибо.

AfterWork
() автор топика
Ответ на: комментарий от Deleted

Предполагаю, что у тебя this даёт не тот объект, что ты хочешь внутри addAction.

Ты прав.

AfterWork
() автор топика
Ответ на: комментарий от Deleted

Смена иконки - критична к производительности? Силён.

Говнокод на два десятка строк для смены иконки? Сильно.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от int64

Видимо это оставило свои отпечатки на твоем интеллекте.

Ты не отвлекайся на интеллектах тебе незнакомых, пописывай свой жопаскрипт или на чем ты там.

Deleted
()
Ответ на: комментарий от AfterWork

Взятый мной язык, рекомендован производителем оболочки

И сертифицирован. Ну что ж, не будем оспаривать тогда решение «производителя оболочки» :D

Deleted
()
Ответ на: комментарий от AfterWork

Вы видимо тоже не преуспели в этом действе.

И слава б-гу. Чтоб обязательно городить апплеты на жопаскрипте, клиентском скриптовом языке? Нет уж, сами ешьте этот ваш Cinnamon.

Deleted
()
Ответ на: комментарий от Deleted

Вообще-то я говорил про умение читать и понимать написанное. Как раз про то, в чем Вы обвинили int64. :)

AfterWork
() автор топика
Ответ на: комментарий от LjubaSherif

В первом сообщение полностью код апплета. Я ума не приложу как именно он работает и почему написано именно так, а не иначе, но факт есть факт, ОН работает.

В общем, задача решена.

AfterWork
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.