কোনও এক্স সেশনের মধ্যে থেকে মূল অ্যাক্সেস ছাড়াই কীবোর্ডের নেতৃত্বের স্থিতি পরিবর্তন করুন


10

আমি ক্যাপসলকের নেতৃত্বে জোর করার চেষ্টা করছি। xsetআমার জন্য কাজ করে না, তাই আমি ব্যবহার করার চেষ্টা করছি setleds

একটি গ্রাফিকাল কনসোলে, এই কমান্ডটি ফিরে আসে:

> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?

ভার্চুয়াল টার্মিনালে এটি কাজ করে, তবে প্রভাবটি ভার্চুয়াল টার্মিনালের স্থানীয়। যা বুঝি, তা থেকে দৌড়াতে

> setleds -L +caps < /dev/tty1

ভার্চুয়াল টার্মিনাল থেকে (আমার এক্স সার্ভার tty1 এ বসে আছে) কাজ করা উচিত। তবে এর জন্য রুট অ্যাক্সেস দরকার।

এক্স সার্ভারের অন্তর্নিহিত কনসোলে একটি কমান্ড প্রেরণের কোনও উপায় আছে কি না তা বলা xserver থেকে বা অন্য ভিটি থেকে, মূল ছাড়াই হোক?

সম্পাদনা করুন: মার্ক প্লটনিকের একটি পরামর্শ থেকে এবং এখানে পাওয়া কোডের ভিত্তিতে আমি নিম্নলিখিতগুলি লিখেছি এবং সংকলন করেছি:

#include <X11/Xlib.h>
#include <X11/XKBlib.h>

#define SCROLLLOCK 1
#define CAPSLOCK 2
#define NUMLOCK 16

void setLeds(int leds) {
   Display *dpy = XOpenDisplay(0);
   XKeyboardControl values;
   values.led_mode = leds & SCROLLLOCK ? LedModeOn : LedModeOff;
   values.led = 3;
   XChangeKeyboardControl(dpy, KBLedMode, &values);
   XkbLockModifiers(dpy, XkbUseCoreKbd, CAPSLOCK | NUMLOCK,
                    leds & (CAPSLOCK | NUMLOCK) );
   XFlush(dpy);
   XCloseDisplay(dpy);
}

int main() {
   setLeds(CAPSLOCK);
   return 0;
}

গিলস যা লিখেছেন তা থেকে xset, আমি এটি কাজ করার আশা করিনি, তবে এটি কিছুটা অর্থে: এটি নেতৃত্ব নির্ধারণ করে, তবে এটি ক্যাপস্লকের স্থিতিও নির্ধারণ করে। আমি উপরের সমস্ত কোড পুরোপুরি বুঝতে পারি না, তাই আমি সম্ভবত একটি নির্লিপ্ত ভুল করেছি। স্পষ্টতই, লাইনটি XChangeKeyboardControl...প্রোগ্রামের আচরণ পরিবর্তন করে না এবং XkbLockModifiersএটিই নেতৃত্বাধীন এবং ক্যাপস্লক স্থিতি নির্ধারণ করে।


আপনি xdotool key Caps_Lockঅনুমোদিত এক্স ক্লায়েন্টের কাছ থেকে এমন কিছু করতে পারেন , যদিও এটি আসলে ক্যাপস লকটি চালু করবে।
মার্ক প্লটনিক 18

@ মার্কপ্লটনিক পয়েন্টটি আসলে ক্যাপসলক চালু না করা। নেতৃত্ব স্পর্শ না করে ক্যাপসলক বন্ধ করার কোনও উপায় আছে?
টি ভেররন

আমি উত্সটির দিকে তাকিয়েছি xterm, এবং এটি ক্যাপস লক ইত্যাদির স্থিতি ইত্যাদির প্রভাব ছাড়াই এলইডি সেট বা আনসেট করার জন্য এক্সচেঞ্জকিবোর্ডকন্ট্রোল () এ একটি কল ব্যবহার করে So
15:44

@ মার্কপ্লটনিক লিডস xtermপ্রভাবিত করে? এটি একটি ভাল ধারণা বলে মনে হচ্ছে, আমি আমার ফলাফলগুলি দিয়ে প্রশ্নটি সম্পাদনা করব।
টি ভেরন

আমি পেয়েছিলাম xtermপালাবার ক্রম চট্টগ্রাম সিটি কর্পোরেশন [ফাইল অনুযায়ী 3 কুই, পাঠিয়ে আপ প্রযোজ্য LED আলোর করার ctlseqs.txtউৎস সাথে আসে, কিন্তু পরামিতি 1 এবং 2 সঙ্গে হালকা পর্যন্ত গণনা বা যদি CapsLock এলইডি পাই নি হয়তো আমি প্রয়োজন উত্তরে উল্লিখিত এক্সকেবি কনফিগারেশনটি করুন। xtermকল XChangeKeyboardControlমধ্যে xtermShowLEDএবং xtermClearLEDsকিন্তু কল না XkbLockModifiersএ সব যে কোন জায়গায়।
প্লটনিক

উত্তর:


7

নীতিগতভাবে, আপনি সম্মানজনক xsetকমান্ড দিয়ে এটি করতে সক্ষম হওয়া উচিত ।

xset led named 'Caps Lock'

বা xset led 4এলইডি 4 নম্বর সেট করতে যদি আপনার সিস্টেমটি নাম দ্বারা নেতৃত্বগুলি স্বীকৃতি দেয় না।

তবে এটি নির্ভরযোগ্যভাবে কাজ করছে বলে মনে হয় না। আমার মেশিনে, আমি কেবল এইভাবে স্ক্রোল লক সেট করতে পারি, এবং আমি একমাত্র নই । এটি এক্সকেবি কনফিগারেশনের বিষয় বলে মনে হচ্ছে

নিম্নলিখিত ব্যবহারকারী-স্তরের কাজের আশপাশে কাজ করা উচিত (বেশিরভাগ অংশের জন্য):

  1. আপনার বর্তমান xkb কনফিগারেশন এক্সট্রাক্ট করুন:

    xkbcomp $DISPLAY myconf.xkb
    
  2. সংশ্লিষ্ট ব্লকগুলির সাথে myconf.xkbপ্রতিস্থাপন করে ফাইলটি সম্পাদনা করুন :!allowExplicitallowExplicit

    indicator "Caps Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= Lock;
    };
    indicator "Num Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= NumLock;
    };
    
  3. নতুন ফাইলটি লোড করুন

    xkbcomp myconf.xkb $DISPLAY
    

এখন নেতৃত্বগুলি চালু এবং বন্ধ করে দিয়ে xsetকাজ করা উচিত। বাগ প্রতিবেদন অনুসারে, নেতৃত্বগুলি চালু হওয়ার কথা থাকলে আপনি স্যুইচ অফ করতে পারবেন না (উদাহরণস্বরূপ ক্যাপসলক সক্ষম থাকলে)।


ধন্যবাদ! আমি আগে চেষ্টা করেছি xset, এবং এটি কার্যকর হয় না। যদিও আমি এই বাগ রিপোর্টটি দেখিনি। যাইহোক, "স্থিতি: সমাধান করা ওন্টফিক্স" সত্যিই উত্সাহজনক নয় ... allowExplicitকাজের আশেপাশে সম্ভবত আমার কাজ হবে (আমার নেতৃত্ব বন্ধ করার দরকার নেই), তবে এটির পরিবর্তনে এখনও মূলের প্রয়োজন।
টি ভেরন

@ টি.ভাইরন, এক্সকেবি কনফিগারেশন পরিবর্তন করতে আপনাকে রুট হওয়ার দরকার নেই। আপনি xkbcompযে কোনও সময় কল করতে পারেন । আপনাকে কী পরিবর্তন করতে হবে তা সঠিকভাবে জানাতে আমি XKB- এর সাথে যথেষ্ট পরিচিত নই (এক্সকেবি দিয়ে সম্পূর্ণ পূর্বনির্ধারিত মানচিত্রের চেয়ে নির্দিষ্ট দিক নির্ধারণ করা কিছুটা ব্যথা), তবে ইউনিক্স.স্ট্যাকেক্সেঞ্জিং / প্রশ্ন / 166844/ ম্যাপিং -কে-বাঁধাই /… এর কয়েকটি পয়েন্টার থাকা উচিত।
গিলস'স'-দুষ্ট হওয়া বন্ধ করুন '

ওহ, ভাল পয়েন্ট। ওয়েল, একটি প্রথম প্রচেষ্টা হিসেবে আমি চেষ্টা: xkbcomp $DISPLAY output.xkbতারপর, প্রতিস্থাপন !allowExplicitদ্বারা allowExplicitমধ্যে indicator "Caps Lock"অধ্যায়, তারপর ফাইলটি পুনরায় লোড xkbcomp output.xkb। প্রচুর সতর্কতা রয়েছে এবং এর পরে xset এর থেকে ভাল আর কাজ করে না। আমি এক্সকেবি সম্পর্কে আরও কিছু পড়ব।
টি ভেরোন

1
এই ধরনের আমার জন্য কাজ। পরিবর্তিত ফাইলটি আমদানির পরে আমি কিছু ত্রুটি বার্তা পেয়েছি এবং আমি এলইডি জ্বলতে পারি তবে অন্য জিনিসগুলি গণ্ডগোল পেয়ে যায়, তবুও এটি পুনরায় চালু হতে পারে না। সুতরাং আমি একটি সম্পাদিত /usr/share/X11/xkb/compat/ledcapsএবং ... / নেতৃত্বের সামনে এগিয়ে গিয়েছিলাম এবং এটি এটিকে স্থায়ী করে তুলেছে।
jtgd

0

ব্যবহার sed

$ sudo sed -i 's|\!allowExplicit|allowExplicit|g' /usr/share/X11/xkb/compat/ledcaps

লগ আউট এবং আবার প্রবেশ করার পরে, কমান্ডগুলি ব্যবহার করে Caps Lockএখন কোনও rootসুযোগ ছাড়াই এলইডি নিয়ন্ত্রণ করা যাবে :

$ xset led named 'Caps Lock'
$ xset -led named 'Caps Lock'

তবে এর জন্য মূল প্রয়োজন।
টি। ভেরন

@ টি.ভাইরন কেবল একবারই কনফিগারেশন ফাইল পরিবর্তন করতে হবে sudoএবং তারপরে আর কখনও হবে না। এটি নির্দিষ্ট ব্যবহারকারীদের পক্ষে কেন এত গুরুত্বপূর্ণ হতে পারে তা বোঝার জন্য, এই vimঅ্যাপ্লিকেশনটি দেখুন
সার্জ Stroobandt

যে প্রশ্নটি 3 বছর আগে প্রশ্ন করেছিল, আমি অবশ্যই তা বুঝতে পেরেছি কেন এটি কিছু ব্যবহারকারীর পক্ষে গুরুত্বপূর্ণ হতে পারে (আমার ক্ষেত্রে, ক্যাপস্লকটি সক্রিয় করার সময় ক্যাপস্লকটি সক্রিয় করার সময়, মূ delay় বিলম্বিত অ্যাপল কীবোর্ডগুলির চারপাশে কাজ করা ছিল) ক্যাপস্লকটিকে নিয়ন্ত্রণের পরে রিম্যাপ করার পরে)। তবে তারপরে, আমার বিশেষভাবে কোনও রুট অ্যাক্সেস ছাড়াই সমাধানের প্রয়োজন ছিল, কারণ এটি একটি ওয়ার্ক কম্পিউটারের জন্য। গৃহীত উত্তরে আরও কয়েকটি পদক্ষেপ জড়িত তবে এটি sudo ছাড়া কাজ করে।
টি ভেরন

@ টি.ভেরন আমি বুঝতে পারি ভাগ করা সিস্টেমগুলি এমন আরও একটি ক্ষেত্রে যেখানে এটি কাজ করবে না। তবুও, আমি গৃহীত উত্তরের উপর শেষ মন্তব্যকারীর সোজাসাপ্টা পছন্দ করেছিলাম এবং sedএটি থেকে একটি লাইন তৈরি করেছি।
সার্জ Stroobandt

0

@ সার্জ_সেট্রোব্যান্ড দ্বারা সম্পূর্ণ অটোমেশনের ধারণার সাথে @ গিলস দ্বারা মূল-কম পদ্ধতির সংমিশ্রণ।

ক্যাপস লক , নম লক এবং শিফট লক এলইডি নিয়ন্ত্রণ নিয়ন্ত্রণ করতে :

#!/bin/bash
# Enables to control keyboard LEDs that are not available for control by default
xkbcomp $DISPLAY /tmp/my_conf.xkb
cat /tmp/my_conf.xkb | awk -e '
    BEGIN {
        change = 0
    }

    {
        if (change == 1) {
            if ($1 == "!allowExplicit;") {
                gsub("!", "", $0)
            }
            change = 0
        }
        print $0

    }

    /indicator "Caps Lock"/ {
        change = 1
    }
    /indicator "Num Lock"/ {
        change = 1
    }
    /indicator "Shift Lock"/ {
        change = 1
    }
    ' > /tmp/my_conf_modified.xkb
xkbcomp /tmp/my_conf_modified.xkb $DISPLAY

একটি LED চালু এবং বন্ধ করতে:

# Turns the LED on
xset led named 'Caps Lock'

# wait 1s
sleep 1

# Resets the LED to the actual state,
# so it might still be on, if Caps Lock is activated.
xset -led named 'Caps Lock'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.