번역하십시오

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
인조 인간 무선 애플리케이션 개발의 심상
RHCE 빨간 모자의 심상은 증명했다 엔지니어 리눅스 학문 가이드 (시험 RH302) (증명서 압박)를
Google Maps API 3 시작의 심상
유닉스 환경에서 진보된 프로그램, 2판 (에디슨-웨슬리 전문가 계산 시리즈)의 심상

격언을 위한 이중 메뉴는 3.2 단추를 벗긴다

격언 3.2 포탄 상위 패널 단추를 가진 현재 제한의 한개는 다른 마우스 단추 누르기를 위한 분리되는 메뉴 표시를 위한 아무 지원도 없다 이다. 그렇습니다, 그렇습니다, 나는 격언 포탄 디자이너가 이 사용 케이스가 고의적이다 확신 및 완전한 권위로 말한ㄴ다는 것을 들릴 수 있다. 어떤 비판든지에 그들 응답, 건설은 또는 다르게, 그들의 디자인에 관하여 일반적으로 보다는 누군가 잘 알고 있다 이고 그들의 (결코 간행된) 유용성 학문이 그들의 디자인을 지원한다. 격언 포탄이 원래 풀어 놓일 경우의 분화한 중단 versa 힘 떨어져 메뉴 선택권 토론에 다만 보기!

어쨌든, 이 특정한 제한은 잠시 동안과 나가 최근에 문제점을 보고 제한에 간단한 실행할 수 있는 해결책을 시도하고 제공하는 것을 결정했다는 것을 저를 괴롭혔다.

상위 패널에 격언 발 단추를 활성화하기 위하여 나가 나의 마우스의 왼쪽 단추를 사용할 때 나가 뒤에 오는 메뉴를 표시되는 원했다고 가정하십시오:

그리고 나는 동일한 상위 패널 단추를 활성화하기 위하여 나가 나의 오른쪽 마우스 단추를 사용할 때 뒤에 오는 메뉴 선택권을 표시되는 원한다:

밑에 있기에서 아무것도 중얼거린다 한계가 그런 기능을 위해 지원하는 부호를. 실제로 있다 눌렀거나 풀어 놓인 마우스 단추를 대표하는 정수를 돌려보내기를 위한 명백한 지원이 중얼거리십시오. 불요반사파 ( 중얼거리는지 어느 것이에 근거한다) 문서에 따르면, 표준 일폭 쥐의 경우에, 뒤에 오는 수는 믿을 수 있다:

  • 1 = 마우스의 왼쪽 단추
  • 2 = 일폭 바퀴
  • 3 = 오른쪽 마우스 단추

단추 더를 가진 쥐를 위해, 당신은 특정 값 어느 특정한 단추가 돌려보내는지 보기 위하여 실험해야 할지도 모른다.

당신의 부호에서는, 당신은 어떻게 어느 특정한 마우스 단추가 눌러진지 결정하는가? 단순히 단추 누르 사건에 이벤트 핸들러 (AKA 되부름 또는 신호 다루개) 그리고/또는 적당한 배우의 단추 풀어 놓 사건 신호를 연결하십시오. 이벤트 핸들러에서는, 눌러지고 그리고/또는 풀어 놓인 특정한 마우스 단추를 대표하는 정수를 돌려보내는 사용 get_button (). 당신은 눌렀다 놓음 둘 다 신호를 위해 단 하나 기능을 사용할 수 있다.

   ...

   _init: function(menuAlignment) {
        PanelMenu.ButtonBox.prototype._init.call(this,
                                                 { reactive: true,
                                                   can_focus: true,
                                                   track_hover: true
                                                 });
        ...
        this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
        ...
    },

    _onButtonPress: function(actor, event) {
        let button = event.get_button();
        if (button == 1) {
            // do something
        } else if (button == 3) {
            // do something
        }
    },

    ...


단추 누르 사건은 마우스 단추가 눌러질 때 방출되고, 그러나 민감하는 배우에 반드시, 풀어 놓인다. 단추 풀어 놓 사건은 (비록 쥐가 미리 어딘가에 밟혔더라도) 마우스 단추가 민감하는 배우에 풀어 놓일 때 방출된다. 보통 당신은 명백하게 배우의 민감하는 재산을 가능하게 해야 한다. 그런데, 민감하는 배우 (불요반사파 개념)는 포인터 사건을 방출할 수 있는 배우이다.

양자 택일 접근은 Clutter.ClickAction를 사용하기 위한 것이다.


   ...

   let clickAction = new Clutter.ClickAction();
   clickAction.connect('clicked', Lang.bind(this, function(button)  {
       this._onButtonPress(button);
   }));
   this.actor.add_action(clickAction);

   ...

    _onButtonPress: function(button) {
        if (button == 1) {
            // do something
        } else if (button == 3) {
            // do something
        }
    },

    ...


Clutter.ClickAction가 /usr/share/gnome-shell/js/ui/shellEntry.js에 있는 격언 포탄 3.2 부호, 보기 및 눌러진 방안 사용되는 /usr/share/gnome-shell/js/ui/workspace.js에서 사용되는지 방법과 장소의 예를 들면 그리고 사건 취급을 길 누르십시오.

바로 가까이에 문제 등을 맞댄. 그것은 격언 포탄 3.2에 있는 이중 활동 메뉴 실행에 중요한 방해물이 단추 목표를 실행하는 부호에서 속인다 끈다. /usr/share/gnome-shell/js/ui/panelMenu.js를 보십시오. 관련된 부호는 여기 있다:

function Button(menuAlignment) {
    this._init(menuAlignment);
}

Button.prototype = {
    __proto__: ButtonBox.prototype,

    _init: function(menuAlignment) {
        ButtonBox.prototype._init.call(this, { reactive: true,
                                               can_focus: true,
                                               track_hover: true });

        this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
        this.actor.connect('key-press-event', Lang.bind(this, this._onSourceKeyPress));
        this.menu = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP);
        this.menu.actor.add_style_class_name('panel-menu');
        this.menu.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
        this.menu.actor.connect('key-press-event', Lang.bind(this, this._onMenuKeyPress));
        Main.uiGroup.add_actor(this.menu.actor);
        this.menu.actor.hide();
    },

function Button(menuAlignment) {
    this._init(menuAlignment);
}

Button.prototype = {
    __proto__: ButtonBox.prototype,

    _init: function(menuAlignment) {
        ButtonBox.prototype._init.call(this, { reactive: true,
                                               can_focus: true,
                                               track_hover: true });

        this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
        this.actor.connect('key-press-event', Lang.bind(this, this._onSourceKeyPress));
        this.menu = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP);
        this.menu.actor.add_style_class_name('panel-menu');
        this.menu.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
        this.menu.actor.connect('key-press-event', Lang.bind(this, this._onMenuKeyPress));
        Main.uiGroup.add_actor(this.menu.actor);
        this.menu.actor.hide();
    },

   _onButtonPress: function(actor, event) {
        if (!this.menu.isOpen) {
            // Setting the max-height won't do any good if the minimum height of the
            // menu is higher then the screen; it's useful if part of the menu is
            // scrollable so the minimum height is smaller than the natural height
            let monitor = Main.layoutManager.primaryMonitor;
            this.menu.actor.style = ('max-height: ' +
                                     Math.round(monitor.height - Main.panel.actor.height) +
                                     'px;');
        }
        this.menu.toggle();
    },

    _onSourceKeyPress: function(actor, event) {
        let symbol = event.get_key_symbol();
        if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
            this.menu.toggle();
            return true;
        } else if (symbol == Clutter.KEY_Escape && this.menu.isOpen) {
            this.menu.close();
            return true;
        } else if (symbol == Clutter.KEY_Down) {
            if (!this.menu.isOpen)
                this.menu.toggle();
            this.menu.actor.navigate_focus(this.actor, Gtk.DirectionType.DOWN, false);
            return true;
        } else
            return false;
    },

   _onMenuKeyPress: function(actor, event) {
        let symbol = event.get_key_symbol();
        if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) {
            let focusManager = St.FocusManager.get_for_stage(global.stage);
            let group = focusManager.get_group(this.actor);
            if (group) {
                let direction = (symbol == Clutter.KEY_Left) ? Gtk.DirectionType.LEFT : Gtk.DirectionType.RIGHT;
                group.navigate_focus(this.actor, direction, false);
                return true;
            }
        }
        return false;
    },

    _onOpenStateChanged: function(menu, open) {
        if (open)
            this.actor.add_style_pseudo_class('active');
        else
            this.actor.remove_style_pseudo_class('active');
    },

    destroy: function() {
        this.actor._delegate = null;

        this.menu.destroy();
        this.actor.destroy();

        this.emit('destroy');
    }
};
Signals.addSignalMethods(Button.prototype);


당신이 위 부호를 시험하는 경우에, 당신은 아무 시도도 다른 마우스 단추 사이에서 분화하는 하지 않는다는 것을 볼 것이다. 위 부호가 면, 1개의 마우스 단추는 다른 마우스 단추와 동일하. 아마 격언 포탄의 디자이너는 단추 Apple 단 하나 쥐 또는 자랐다, 만큼 해설자는 건의했다, 격언 포탄을 사용하여 진짜로 정제와 아무 쥐도 일반적으로 사용되는 유효하지 않은 palmhelds를 위해 디자인되었다.

마우스 단추를 사용하여 이중 메뉴 기능 실행에 해결책은 상기 단추 부호에 있는 buttom 누르 사건 신호 다루개를 어느 마우스 단추가와 행위 그러므로 눌러진지 결정하기 위하여 변경하기 위한 것이었다.

나가 시제품에 이중 메뉴 기능의 작동 실시를 사용한 간단한 격언 포탄 연장을 위한 원시 코드는 여기 있다:

const St = imports.gi.St;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Lang = imports.lang;

const Clutter = imports.gi.Clutter;
const Shell = imports.gi.Shell;
const Signals = imports.signals;

function DualActionButton(menuAlignment) {
    this._init(menuAlignment);
}

DualActionButton.prototype = {
    __proto__: PanelMenu.ButtonBox.prototype,

    _init: function(menuAlignment) {
        PanelMenu.ButtonBox.prototype._init.call(this, { reactive: true,
                                               can_focus: true,
                                               track_hover: true });

        this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
        this.actor.connect('key-press-event', Lang.bind(this, this._onSourceKeyPress));

        this.menuL = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP);
        this.menuL.actor.add_style_class_name('panel-menu');
        this.menuL.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
        this.menuL.actor.connect('key-press-event', Lang.bind(this, this._onMenuKeyPress));
        Main.uiGroup.add_actor(this.menuL.actor);
        this.menuL.actor.hide();

        this.menuR = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP);
        this.menuR.actor.add_style_class_name('panel-menu');
        this.menuR.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
        this.menuR.actor.connect('key-press-event', Lang.bind(this, this._onMenuKeyPress));
        Main.uiGroup.add_actor(this.menuR.actor);
        this.menuR.actor.hide();
    },

    _onButtonPress: function(actor, event) {
        let button = event.get_button();
        if (button == 1) {
            if (this.menuL.isOpen) {
                this.menuL.close();
            } else {
                if (this.menuR.isOpen)
                    this.menuR.close();
                this.menuL.open();
            }
        } else if (button == 3) {
            if (this.menuR.isOpen) {
                this.menuR.close();
            } else {
                if (this.menuL.isOpen)
                    this.menuL.close();
                this.menuR.open();
            }
        }
    },

    _onButtonPress: function(actor, event) {
        let button = event.get_button();
        if (button == 1) {
            if (this.menuL.isOpen) {
                this.menuL.close();
            } else {
                if (this.menuR.isOpen)
                    this.menuR.close();
                this.menuL.open();
            }
        } else if (button == 3) {
            if (this.menuR.isOpen) {
                this.menuR.close();
            } else {
                if (this.menuL.isOpen)
                    this.menuL.close();
                this.menuR.open();
            }
        }
    },

    _onSourceKeyPress: function(actor, event) {
        let symbol = event.get_key_symbol();
        if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
            if (this.menuL.isOpen) {
                this.menuL.close();
            } else if (this.menuR.isOpen) {
                this.menuR.close();
            }
            return true;
        } else if (symbol == Clutter.KEY_Escape) {
            if (this.menuL.isOpen)
                this.menuL.close();
            if (this.menuR.isOpen)
                this.menuR.close();
            return true;
        } else
            return false;
    },

    _onMenuKeyPress: function(actor, event) {
        let symbol = event.get_key_symbol();
        if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) {
            let focusManager = St.FocusManager.get_for_stage(global.stage);
            let group = focusManager.get_group(this.actor);
            if (group) {
                let direction = (symbol == Clutter.KEY_Left) ? Gtk.DirectionType.LEFT : Gtk.DirectionType.RIGHT;
                group.navigate_focus(this.actor, direction, false);
                return true;
            }
        }
        return false;
    },

    _onOpenStateChanged: function(menu, open) {
        if (open)
            this.actor.add_style_pseudo_class('active');
        else
            this.actor.remove_style_pseudo_class('active');
    },

    destroy: function() {
        this.actor._delegate = null;
        this.menuL.destroy();
        this.menuR.destroy();
        this.actor.destroy();
        this.emit('destroy');
    },

};
Signals.addSignalMethods(DualActionButton.prototype);

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

DemoDualActionButton.prototype = {
    __proto__: DualActionButton.prototype,

    _init: function() {
        DualActionButton.prototype._init.call(this, 0.0);

        this._iconActor = new St.Icon({ icon_name: 'start-here',
                                        icon_type: St.IconType.SYMBOLIC,
                                        style_class: 'system-status-icon' });
        this.actor.add_actor(this._iconActor);
        this.actor.add_style_class_name('panel-status-button');

        let item = new PopupMenu.PopupMenuItem(_("Left Menu Item 1"));
        this.menuL.addMenuItem(item);
        item = new PopupMenu.PopupMenuItem(_("Left Menu Item 2"));
        this.menuL.addMenuItem(item);

        item = new PopupMenu.PopupMenuItem(_("Right Menu Item 1"));
        this.menuR.addMenuItem(item);
        item = new PopupMenu.PopupMenuItem(_("Right Menu Item 2"));
        this.menuR.addMenuItem(item);
        item = new PopupMenu.PopupMenuItem(_("Right Menu Item 3"));
        this.menuR.addMenuItem(item);
        item = new PopupMenu.PopupMenuItem(_("Right Menu Item 4"));
        this.menuR.addMenuItem(item);
    },

    enable: function() {
        Main.panel._centerBox.add(this.actor, { y_fill: true });
        Main.panel._menus.addMenu(this.menuL);
        Main.panel._menus.addMenu(this.menuR);
    },

    disable: function() {
        Main.panel._centerBox.remove_actor(this.actor);
        Main.panel._menus.removeMenu(this.menuL);
        Main.panel._menus.removeMenu(this.menuR);
    }
};

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


DualActionButton 목적 코드는 단순히 단추 부호의 변경한 버전이다. 중심 마우스 단추 메뉴를 위한 지원을 추가하는 것은 하찮다; 나는 하기 위하여 당신이 그것을 필요로 하는 경우에 당신을 위해 그것을 남겨둘 것이다.

나가 성 또는 가치 쌍 후에 쉼표를 포함하지 않는다는 것을 유의하십시오. Mozilla JavaScript 문서에 따르면, 더글러스 Crockford 와 다른 사람은 의 이것 정확한 통어론이다. 불행히도, 많은 포탄 연장 개발자는 목표 오자를 위한 정확한 통어론을 모르는 것처럼 보이고 Mozilla SpiderMonkey JavaScript 엔진 및 GObject 내성 기구 근거를 두는, gjs 부터 쉼표를 포함하기 위하여 이 특정한 구문 오류에 관하여 넋두리하지 않는다.

격언 포탄 연장을 캡슐에 넣고 싶지 않는 그 독자를 위해 방법을 가능하게 하고 무능하게 하거든, 코멘트에 따라 당신의 상당수가 있고 나가 받는 전자 우편은, 여기 위 연장의 기능에 근거한 초기 설정, 가능하게 하고는 및 무능하게 하기를 위한 원시 코드 있다.

let button;

function init() {
    button = new DemoDualActionButton();
}

function enable() {
    Main.panel._centerBox.add(button.actor, { y_fill: true });
    Main.panel._menus.addMenu(button.menuL);
    Main.panel._menus.addMenu(button.menuR);
}

function disable() {
    Main.panel._centerBox.remove_actor(button.actor);
    Main.panel._menus.removeMenu(button.menuL);
    Main.panel._menus.removeMenu(button.menuR);
}


포탄 연장 취급을 위한 위 부호는 이해해기 나가 일반으로 사용하는 목표 문자 코딩 작풍 보다는 쉽고 쉽다는 것을 어떤 사람들 주장한다. 나 응답은 기능 접근이 당신이 더 복잡한 포탄 연장에 있는 연장 범위 그리고 있는 적어도 1개의 가변, 수시로 시간, 많은 그런 가변에는 사용할 것을 요구한다 이다. Mozilla 지금 비표준 JavaScript는 가변이 정의되는 구획에 키워드 한계를 가변의 사전 범위 뿐 아니라 어떤 안 구획든지 포함했다 안을 시켰다 구획 자체를 시켰다. 그러나, var 키워드가 대신에 시키면 키워드를 사용되거나 아무 키워드도 사용되지 않는 경우에, 가변의 범위는 세계에 궐석한다. JavaScript에 있는 전역 변수는 소개해서 좋은 과실 및 잠재적인 부작용 때문에 가능한 장소에서 피해야 한다. 범위 지정 과실의 이 유형은 찾아내기 어렵 그래서 나는 문제점을 완전히 피하는 것을 선택한다. 더글러스 Crockford 정액 책 JavaScript의 부록 A (지독한 부속)를 읽으십시오: 왜 세계적인 범위 를 가진 JavaScript 가변이 나쁜 지 당신이 이해하지 않는 경우에 좋은 부분.

그런데, 나는 패러다임은 Microsoft Windows에서 일반적다는 것을 이중 활동 메뉴 단추의 개념이 격언 포탄을 위한 컴퓨터 접근가능성 (a11y) 지침서를 위반한 경우에 그러나 주어, 나가 아닙니다 의심하면 확실하지 않다.

나는 당신이 나의 격언 포탄 연장 웹사이트에서 다운로드할 수 있는 위 부호에 근거하여 간단한 격언 포탄 연장 , demodualmenubutton를, 창조했다.

즐기십시오!

격언을 위한 이중으로 할 것이다 4개의 코멘트는 메뉴 3.2 단추를 벗긴다

  • 나는 아주 무뚝뚝한 미워한다. 그러나 당신은 왜 그 이 연장 전부에 당신의 시간을 낭비하고 있는가 (나는 일간신문을 그런데 사용하는가)? 나는 그물의 맞은편에 당신의 이름 그리고 이 웹사이트를 항상 본다 - 나는 당신이 배치하는 페이지에서 배운다, 그러나 1개의 질문은 남아 있다: 당신은 왜 격언을 위한 코딩을 지도하고 있지 않는가?

    • 실제로, 나는 격언 연장에 약간의 시간 또는 에너지를 쓴다. 단순히 시간 또는 성향이 없. "격언을 위한 코딩" 지도에 관해서는 나가 격언 포탄 중핵 팀의 디자인 그리고 실행 철학에 동의하지 않는 때, 일어나기 위하여 려고 하고 있지 않다.

  • LONNIEFUTURE

    나는 당신의 저작권에 관하여 흥미로웠다. 저작권은 당신의 일을 재분배될 수 없는가 의미하는가? 왜 저작권 FOSS?

    • 면허와 저작권은 FOSS 세계에서 수시로 혼동되는 2개의 다른 개념이다. 나의 일은 그것에 GPL 당 제공했다 당신에게 허가를 나의 저작권 표시 재분배될 수 있다. 당신은 당신이 나의 일을 변경하는 경우에 그러나 당신이 나의 저작권 표시를 그 자리에 남겨두어야 하면 당신의 자신의 저작권 표시를 추가할 수 있다.

      에서 미국 그리고 대부분의 국가, 당신은 어떤 간행한 일든지에 자동적으로 저작권이 있다. 그것은 일이 간행되자마자 디폴트로 일어난다. 실제로, 당신은 공개 소프트웨어에서 당신이 일을 판권을 얻는 원하지 않는 경우에 당신의 일을 명백하게 두어야 한다.

      http://www.gnu.org/licenses/gpl-faq.html#RequiredToClaimCopyright를 추가 정보를 위하여 보십시오.

대답 취소