एकता पैनल में कीबोर्ड संशोधक राज्य एप्लेट कैसे जोड़ें?


18

मैं एक केडीई उपयोगकर्ता हूं जो एकता की ओर बढ़ने के बारे में सोच रहा है। मैनुअल विकलांगता के कारण, मैं चिपचिपी कुंजी का उपयोग करता हूं और केडीई में मेरे पास सिस्टम पैनल में एक एप्लेट है जो दिखाता है कि कौन सी संशोधक कुंजियां सक्रिय हैं। मुझे याद है कि गनोम के पास भी यह सुविधा थी, इसलिए विंडोज और ओएस एक्स करें।

एकता में पैनल के लिए कीबोर्ड संशोधक राज्य एप्लेट कैसे एक विज्ञापन करता है?

स्पष्टता: मैंने पहले ही चिपचिपी चाबियों को सक्षम किया है। मैं पूछ रहा हूं कि एक एप्लेट कैसे जोड़ा जाए जो संशोधक कुंजियों की स्थिति को इंगित करता है । यह संकेतक दिखाएगा कि जब Shift कुंजी उदास है, जब Alt कुंजी उदास है, जब Tux कुंजी उदास है, और जब Ctrl कुंजी उदास है। यह एप्लेट सभी प्रमुख डेस्कटॉप वातावरण (KDE, Windows, Mac OSX और Gnome) में मौजूद है। यह डेस्कटॉप की पहुंच के लिए आवश्यक है।

यहां कीबोर्ड लेआउट इंडिकेटर एप्लेट के बगल में कीबोर्ड संशोधक राज्य एप्लेट की एक छवि दी गई है। संशोधक का प्रतिनिधित्व किया, कर रहे हैं बाएं से दाएं, Shift, Ctrl, Alt, I-dont-know-this-one, Tux/Win, NumLock, और CapsLock। यह देखा जा सकता है कि NumLock कुंजी सक्रिय है।

यहाँ छवि विवरण दर्ज करें


इर्रर ... ऐसा होने पर एक बड़ा अंतर प्रतीत होता है ... एक संशोधन कुंजी दबाए जाने के बावजूद बीप करने की बात है।
विल्फ

@wilf अगर मुझे गलत नहीं लगता है तो एकता में एक एक्सेसिबिलिटी आइकन है (वही Gnome 3 के रूप में) लेकिन स्टेटस के बारे में उपयोगकर्ता को सूचित करने के लिए "अतिरिक्त" आइकन नहीं।
ब्रिअम

4
@ तक्कत: सुझाव के लिए धन्यवाद। indicator-keylockकेवल उन कुंजियों को जो परंपरागत रूप से कुंजीपटल पर ही राज्य संकेतक है राज्य प्रदर्शित करता है: CapsLock, ScrollLock, NumLock। मैं एक संकेतक जो मानक संशोधक कुंजियों की स्थिति को दर्शाता है की जरूरत है: Shift, Ctrl, Tux, Alt। सभी प्रमुख डेस्कटॉप (केडीई, विंडोज, मैक ओएसएक्स) में यह संकेतक एपलेट उपलब्ध है।
डॉटनचेन

1
मुझे विश्वास है कि जिस केडीई टूल का आप उल्लेख कर रहे हैं, उसका पैकेट नाम है plasma-widget-kbstateऔर सॉफ्टवेयर सेंटर में एक त्वरित खोज वास्तव में किसी भी समकक्ष परिणाम पर ध्यान नहीं देती है
डैनियल डब्ल्यू।

2
@ शेंग्गी: मैं केबी स्टेट प्लेसमॉइड का उपयोग कर रहा हूं। यदि आप कुबंटु पर हैं, तो इसे स्थापित करें sudo apt-get install plasma-widget-kbstate
डॉटनचेन

जवाबों:


7

यह एकता में एक उत्कृष्ट मुद्दा है:

नीचे दिए गए कोड को अपडेट कर दिया गया है, अब यह स्टेट्स दिखाने के लिए आइकन का उपयोग कर सकता है। लेकिन यह कुछ समय धीमा हो सकता है क्योंकि मुझे हार्ड ड्राइव पर आइकन फ़ाइल को अपडेट करना होगा फिर इसे फिर से लोड करना होगा। (इस मुद्दे / सीमा के बारे में नोट्स देखें libappindicator)

एक अच्छी तरह से पैक की गई रिलीज़ को वेबडैप 8 ppa पर उपलब्ध कराया गया (धन्यवाद एलिन आंद्रेई / एंड्रयू / को जाता है)

sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install indicator-xkbmod

संदर्भ: उबंटू के लिए कीबोर्ड संशोधक राज्य सूचक: Xkbmod संकेतक


मूल उत्तर:

यह प्रश्न का विहित उत्तर देने के लिए उपस्थित नहीं है। इसे एक काम के रूप में गिना जा सकता है। किसी को रोकना उसके लिए परिष्कृत समाधान लिखता है।

यह एकता के लिए एक सरल प्रोटोटाइप कीबोर्ड संशोधक संकेतक है।

बाईं ओर से शुरू होने वाली छवि: चिह्न, पारी, बंद कैप्स, Ctrl, Alt, सुपर, बंद AltGr (लॉक राज्य को इंगित करने के लिए छोटा वृत्त)

एकता- xkbmod प्रोटोटाइप का स्क्रीनशॉट

स्रोत फ़ाइल unity-xkbmod.c:

/*
 * unity-xkbmod.c
 *
 * Copyright 2014 Sneetsher <sneetsher@localhost>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301, USA.
 *
 *
 */

#include <string.h>

#include <X11/XKBlib.h>

#include <glib/gprintf.h>
#include <gtk/gtk.h>
#include <libappindicator/app-indicator.h>

//callback data structure
typedef struct _AppData {
  Display *_display;
  int *_deviceId;
  AppIndicator *indicator;
} AppData;

//menu ui
static GtkActionEntry entries[] = {
  { "Quit",     "application-exit", "_Quit", "<control>Q",
    "Exit the application", G_CALLBACK (gtk_main_quit) },
};

static guint n_entries = G_N_ELEMENTS (entries);

static const gchar *ui_info =
"<ui>"
"  <popup name='IndicatorPopup'>"
"    <menuitem action='Quit' />"
"  </popup>"
"</ui>";

//callback function, get xkb state, update indicator label (icon have limitation)
static gboolean update_xkb_state (gpointer data)
{
  //get xkb state
  XkbStateRec xkbState;
  XkbGetState(((AppData*) data)->_display, *(((AppData*) data)->_deviceId), &xkbState);

  //construct label
  GString *label = g_string_new("");

  register int i;
  unsigned bit;

  //loop taken from xkbwatch source
  for (i = XkbNumModifiers - 1, bit = 0x80; i >= 0; i--, bit >>= 1)
  {
    //printf("base%d %s  ", i, (xkbState.base_mods & bit) ? "on " : "off");
    //printf("latched%d %s  ", i, (xkbState.latched_mods & bit) ? "on " : "off");
    //printf("locked%d %s  ", i, (xkbState.locked_mods & bit) ? "on " : "off");
    //printf("effective%d %s  ", i, (xkbState.mods & bit) ? "on " : "off");
    //printf("compat%d %s\n", i, (xkbState.compat_state & bit) ? "on " : "off");

    //todo: change constant with xkb modifier constant (defined in the headers)
    // show effective modifier stat
    switch (i)
    {
      case 7:
        g_string_prepend (label,  ((xkbState.mods & bit) ? "⎇" : ""));
        break;
      case 6:
        g_string_prepend (label,  ((xkbState.mods & bit) ? "⌘" : ""));
        break;
      case 5:
        g_string_prepend (label,  ((xkbState.mods & bit) ? "5" : ""));
        break;
      case 4:
        g_string_prepend (label,  ((xkbState.mods & bit) ? "①" : ""));
        break;
      case 3:
        g_string_prepend (label,  ((xkbState.mods & bit) ? "⌥" : ""));
        break;
      case 2:
        g_string_prepend (label,  ((xkbState.mods & bit) ? "⋀" : ""));
        break;
      case 1:
        g_string_prepend (label,  ((xkbState.mods & bit) ? "⇬" : ""));
        break;
      case 0:
        g_string_prepend (label,  ((xkbState.mods & bit) ? "⇧" : ""));
        break;
      default:
        break;
    };

    // show if modifier is locked
    g_string_prepend (label,  ((xkbState.locked_mods & bit) ? " ˳" : " "));
  }

  //g_string_prepend (label,  "");
  app_indicator_set_label (((AppData*) data)->indicator, label->str, NULL);

  //g_free(label);
  return TRUE;
}


int main (int argc, char **argv)
{
  AppData appdata;
  Display *_display;
  int _deviceId;

  char* displayName = strdup("");
  int eventCode;
  int errorReturn;
  int major = XkbMajorVersion;
  int minor = XkbMinorVersion;;
  int reasonReturn;


  AppIndicator *indicator;
  GtkWidget *indicator_menu;
  GtkUIManager *uim;
  GtkActionGroup *action_group;
  GError *error = NULL;

  gtk_init (&argc, &argv);


  XkbIgnoreExtension(False);

  g_printf("Xkb client lib ver: %d.%d\n" , major , minor );
  _display = XkbOpenDisplay(displayName, &eventCode, &errorReturn,
                            &major, &minor, &reasonReturn);
  g_printf("Xkb server lib ver: %d.%d\n" , major , minor );

  if (reasonReturn != XkbOD_Success)
  {
    g_printf("Unable to open display!\n");
    return 1;
  }

  XkbDescRec* kbdDescPtr = XkbAllocKeyboard();
  if (kbdDescPtr == NULL)
  {
    g_printf ("Failed to get keyboard description.\n");
    return 2;
  }
  kbdDescPtr->dpy = _display;
  _deviceId = kbdDescPtr->device_spec;

  /*
  //no need for event listener, used gtk_timeout timer
  XkbSelectEventDetails(_display, XkbUseCoreKbd, XkbStateNotify,
                     XkbAllStateComponentsMask, XkbGroupStateMask);
  */


  action_group = gtk_action_group_new ("AppActions");
  gtk_action_group_add_actions (action_group, entries, n_entries, NULL);

  indicator = app_indicator_new_with_path (
                                        "Simple XKB Modifier Indicator",
                                        "icon",
                                        APP_INDICATOR_CATEGORY_HARDWARE,
                                        g_get_current_dir());

  uim = gtk_ui_manager_new ();
  gtk_ui_manager_insert_action_group (uim, action_group, 0);
  if (!gtk_ui_manager_add_ui_from_string (uim, ui_info, -1, &error))
  {
    g_printf ("Failed to build menus: %s\n", error->message);
    g_error_free (error);
    error = NULL;
    return 3;
  }

  indicator_menu = gtk_ui_manager_get_widget (uim, "/ui/IndicatorPopup");
  app_indicator_set_menu (indicator, GTK_MENU (indicator_menu));
  app_indicator_set_status (indicator, APP_INDICATOR_STATUS_ACTIVE);

  //app_indicator_set_label (indicator, " ⇧ ⋀ ⌥ ⎇  ⌘ ", NULL);
  //symbols: shift U21E7 ctrl U22C0 alt/altgr U2325 U2387  cmd U2318
  //from font: DejaVu Sans

  appdata._display = _display;
  appdata._deviceId = &_deviceId;
  appdata.indicator = indicator;
  gtk_timeout_add (120, (GtkFunction) update_xkb_state, &appdata);
  //nice for realtime tasks, to replace gtk_timeout
  //gtk_idle_add ((GtkFunction) idle_func, &appdata);

  gtk_main ();

  XCloseDisplay (_display);
  return 0;
}
  1. आवश्यक हेडर / लिबास स्थापित करना: (निश्चित रूप से यदि मुझे कोई याद हो तो)

    sudo apt-get install libx11-dev libappindicator-dev libgtk2.0-dev
    
  2. संकलन:

    gcc -Wall unity-xkbmod.c -o unity-xkbmod `pkg-config --cflags --libs appindicator-0.1` -lX11
    
  3. Daud:

    ./unity-xkbmod
    

ध्यान दें:

  • libappindicatorयूनिटी संकेतकों के लिए उपयोग की जाने वाली एक महत्वपूर्ण विशेषता का अभाव है जो अन्य डेस्कटॉप संकेतकों को पोर्ट करने में आसान बनाता है। बग # 812067 API की आवश्यकता देखें: Pixbuf आइकन सेटिंग समर्थन

    इस सुविधा के बिना, मान लें कि हमें चिपचिपा कुंजियों के साथ (Shift, Ctrl, Alt, AltGr, Super) की आवश्यकता है; हम प्रत्येक के लिए 3 मुख्य स्थिति है (बंद, पर / बंद, बंद)। तो 3 ^ 5 संयुक्त प्रतीक उत्पन्न किया जाना चाहिए। (जहां सामान्य मामला सिर्फ 3x5 एकल आइकन)

    यही कारण है कि मैंने DejaVu Sans फ़ॉन्ट से प्रतीकों के साथ संकेतक लेबल का उपयोग किया ।

  • आइकन डालने के लिए, इसे उसी फ़ोल्डर में रखें और नाम दें icon.*। स्वीकृत प्रारूप: png, svg, ico, xpm ...

    यदि आपको कोई आइकन पसंद नहीं है, तो इसके बजाय केवल 1x1 px छवि बनाएं।

संदर्भ:


अच्छा आपका धन्यवाद! मैं इसे आजमाऊंगा और आपके पास वापस आऊंगा। महान काम, स्नेतशेर!
5


हाँ, आपको @dotancohen धन्यवाद। तो कम से कम आप एकता का उपयोग कर सकते हैं, यह निश्चित स्थिति आइकन के बिना बदसूरत हो सकता है?
user.dz

1
मैं बदसूरत नहीं हूँ, आपको मेरी एक तस्वीर देखनी चाहिए! मैंने उबंटू बगट्रैकर पर इस मुद्दे का उल्लेख किया है ।
dotancohen

1
स्नेत्शेर, मैं फिर से शुक्रिया कहना चाहता था। मैं अब यूनिटी में स्थानांतरित हो गया हूं और इस शानदार एप्लिकेशन के बिना यह कदम असंभव हो जाएगा। मैंने कोड से भी काफी कुछ सीखा है। धन्यवाद!
डॉटनकोहेन

2

एक और समाधान जो सही नहीं है, लेकिन कुछ इसे उपयोगी साबित कर सकते हैं क्योंकि केडीई में पूर्ण कार्यक्षमता होना संभव है जैसे एक क्लिक के साथ एक मॉड को सक्रिय करना।

  1. kbstateएप्लेट स्थापित करें

    sudo apt-get install plasma-widget-kbstate kde-workspace-bin
    
  2. इसे plasma-windowedप्लेयर में चलाएं

    • नियमित खिड़की

      plasma-windowed kbstate
      

      Xubuntu में प्लाज्मा-विजेट-केबीस्टेट का स्क्रीनशॉट

    • सीमा रहित खिड़की

      plasma-windowed --noborder kbstate
      

      एकता में सीमा-रहित प्लाज्मा-विजेट-केबीस्टेट का स्क्रीनशॉट

मेरे पास खेलने के लिए अधिक समय नहीं था, लेकिन wmctrlइसे लॉन्च करने में शीर्ष पर स्थित होने, आकार बदलने और बनाने में मदद मिल सकती है।

संदर्भ: kde plasmoid और किकस्टार्ट मेनू को लॉन्च करने के लिए क्या कमांड है


1

मैंने उबंटू चिपचिपी चाबियों की निगरानी के लिए एक खोज की और कुछ ऐसा पाया जो यहां मददगार हो सकता है: http://code.google.com/p/key-mon/

मामला स्क्रीनशॉट दिखाएं

दौड़ने की कोशिश करो

key-mon --sticky चिपचिपा चाबियाँ के लिए समर्थन के लिए।

संदर्भ: http://code.google.com/p/key-mon/

ध्यान दें कि सॉफ़्टवेयर केंद्र के माध्यम से उपलब्ध संस्करण 1.6-0ubuntu1 है। 2011 के जून का विमोचन किया जो - thesticky स्विच का समर्थन नहीं करता है। यदि संकेतक बिल्कुल ऊपर जैसा दिखता है, तो आपके पास पुराना संस्करण है। http://code.google.com/p/key-mon/ पर नवीनतम संस्करण आज़माएं, इस लेखन के अनुसार यह keymon_1.17-1_all.deb 229 KB है। 3 जनवरी 2014. परीक्षण और पुष्टि के लिए - स्टिक स्विच का समर्थन।


1
अच्छा लगता है, हालांकि key-monदिखाता है कि कौन सा बटन दबाया गया था और संशोधक कुंजियों की स्थिति नहीं थी । भेद यह है कि बटन दबाए जाने के बादkey-mon डिस्प्ले 1-सेकंड में संयुक्त राष्ट्र में वापस आ जाता है । एक कीबोर्ड संशोधक राज्य एप्लेट अगले कीपर के होने पर अप्रकाशित स्थिति में डिस्प्ले लौटाएगा और इसलिए 'प्रेस' स्थिति को निष्क्रिय कर देगा
बिंदुचेन

पुनः संपादित उत्तर।
एल्डर गीक

गलतफहमी के लिए खेद है। मैंने उत्तर (फिर से) संपादित किया है कि आपको क्या चाहिए।
एल्डर गीक

1
थैंक यू एल्डर गीक। --stickyविकल्प राज्य अन्य कुंजियों देख, के बजाय उचित इंटरफ़ेस से क्वेरी के रूप में उचित कुंजीपटल संशोधक राज्य एप्लेट करना द्वारा संशोधक कुंजियों की स्थिति लगता है कि लगता है। इसे दो बार एक संशोधक कुंजी दबाकर देखा जा सकता है: पहली बार एप्लेट में संकेतक को सक्षम करता है, लेकिन दूसरी बार इसे जारी नहीं करता है। इस प्रकार, यह गलत है कि जब यह नहीं है तो सक्रिय होने की सूचना दी जाती है। यह संबंधित बग समस्या को आंशिक रूप से संबोधित करता है, मैं वहां और अतिरिक्त बगों में विवरण भर दूंगा। धन्यवाद।
डॉटनचेन

1
@dotancohen मैंने आपके कथन के आधार पर परीक्षण किया कि "एक कीबोर्ड संशोधक राज्य एप्लेट अप्रकाशित स्थिति में प्रदर्शन लौटाएगा जब अगला की-बोर्ड होगा और इसलिए 'दबाया गया' राज्य को निष्क्रिय कर देगा।" और यह मेरे ऊपर कभी नहीं आया कि कोई भी उद्देश्य पर उत्तराधिकारी कुंजी को दो बार मार देगा। निरीक्षण के लिए मेरी क्षमा याचना।
एल्डर गीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.