আমি ওএস এক্স-এর মধ্য-বোতাম-টেনে নিয়ে স্ক্রোলিং সক্ষম করতে পারি?


16

আমার কাছে তিনটি বোতামযুক্ত একটি মাউস রয়েছে তবে চাকা নেই।

ওএস এক্সে, এমন কোনও উপায় আছে (সম্ভবত অ্যাডন সফ্টওয়্যার সহ) যা আমার তৃতীয় বোতামটি ধরে রেখে এবং মাউসটি সরিয়ে রেখে স্ক্রোলিংয়ের জন্য আমাকে ব্যবহার করতে দেয়?

উত্তর:


10

স্মার্ট স্ক্রোল এর 'গ্র্যাব স্ক্রোল' বৈশিষ্ট্য সহ আপনি যা খুঁজছেন তা করে। এটিকে 'বোতাম 3 (মাঝারি)' এ নিয়োগ করুন এবং উভয় অক্ষকে টেনে আনলে ব্রাউজার (ক্রোম), টার্মিনাল, অ্যাডোব ফটোশপ এবং ফাইন্ডারের মতো অ্যাপ্লিকেশন কাজ করবে - আমি চেষ্টা করেছি এমন কোনও অ্যাপ্লিকেশন এটি নিয়ে কাজ করে নি (4.0 ব্যবহার করে) বিটা আপ এবং আপ)। এটি একটি নিখরচায় পরীক্ষা আছে।

এখানে চিত্র বর্ণনা লিখুন


3

আমি এই থ্রেড দ্বারা অনুপ্রাণিত নিম্নলিখিত কনফিগারেশন স্ক্রিপ্ট দিয়ে হ্যামারস্পুন দিয়ে এটি করেছি: https://github.com/tekezo/ কারাবাইনার/issues/814#issuecomment-337643019

পদক্ষেপ:

  • হামারস্পুন ইনস্টল করুন
  • এর মেনু আইকনটি ক্লিক করুন এবং নির্বাচন করুন Open Config
  • নিম্নলিখিত luaস্ক্রিপ্টটি কনফিগারেশনে আটকান :

    -- HANDLE SCROLLING WITH MOUSE BUTTON PRESSED
    local scrollMouseButton = 2
    local deferred = false
    
    overrideOtherMouseDown = hs.eventtap.new({ hs.eventtap.event.types.otherMouseDown }, function(e)
        -- print("down")
        local pressedMouseButton = e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber'])
        if scrollMouseButton == pressedMouseButton 
            then 
                deferred = true
                return true
            end
    end)
    
    overrideOtherMouseUp = hs.eventtap.new({ hs.eventtap.event.types.otherMouseUp }, function(e)
        -- print("up")
        local pressedMouseButton = e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber'])
        if scrollMouseButton == pressedMouseButton 
            then 
                if (deferred) then
                    overrideOtherMouseDown:stop()
                    overrideOtherMouseUp:stop()
                    hs.eventtap.otherClick(e:location(), pressedMouseButton)
                    overrideOtherMouseDown:start()
                    overrideOtherMouseUp:start()
                    return true
                end
                return false
            end
            return false
    end)
    
    local oldmousepos = {}
    local scrollmult = -4   -- negative multiplier makes mouse work like traditional scrollwheel
    
    dragOtherToScroll = hs.eventtap.new({ hs.eventtap.event.types.otherMouseDragged }, function(e)
        local pressedMouseButton = e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber'])
        -- print ("pressed mouse " .. pressedMouseButton)
        if scrollMouseButton == pressedMouseButton 
            then 
                -- print("scroll");
                deferred = false
                oldmousepos = hs.mouse.getAbsolutePosition()    
                local dx = e:getProperty(hs.eventtap.event.properties['mouseEventDeltaX'])
                local dy = e:getProperty(hs.eventtap.event.properties['mouseEventDeltaY'])
                local scroll = hs.eventtap.event.newScrollEvent({-dx * scrollmult, dy * scrollmult},{},'pixel')
                -- put the mouse back
                hs.mouse.setAbsolutePosition(oldmousepos)
                return true, {scroll}
            else 
                return false, {}
            end 
    end)
    
    overrideOtherMouseDown:start()
    overrideOtherMouseUp:start()
    dragOtherToScroll:start()
    

এটি চেষ্টা করে দেখুন এবং এটি সুন্দরভাবে কাজ করে।
im_chc

যেহেতু আমি ওয়াই-স্ক্রোলকে অন্য উপায়ে গোল করতে পছন্দ করি, তাই আমি লুয়া কোডটি কিছুটা পরিবর্তন করেছি: "স্থানীয় স্ক্রোল = hs.eventtap.event.newScrolEvent ({- dx * স্ক্রোলমল্ট," লাইনে "ডাই" পরিবর্তন করুন ডায় * স্ক্রোলমল্ট}, {}, 'পিক্সেল') "থেকে নেগেটিভ (তাই এটি" -ডি * স্ক্রোলমল্ট "হবে)
im_chc

2

অন্যান্য জিনিসগুলির সাথে স্মুজ এটি করে। (আমি বিকাশকারী)

এটি অন্যান্য পরামর্শ থেকে কী আলাদা করে তা হ'ল লিংকগুলি সনাক্ত করার সময় প্রতিটি ম্যাক অ্যাপে এটি ব্যবহার করার ক্ষমতা to (যদি আপনি আপনার মাঝের বোতামটি টানতে এবং ছুঁড়ে ফেলার জন্য ব্যবহার করেন তবে এখনও চান যে একটি মিডল বোতাম ক্লিক একটি মধ্য বোতাম হিসাবে কাজ করবে)

স্মুজের সাথে গ্রাব-ড্রাগের চেয়ে গ্র্যাব-ড্রাগ-থ্রোয়ের মতো is রিলিজ আইফোন স্ক্রোলের অনুরূপ স্ক্রোলটির গতি এবং অ্যানিমেশনকে প্রভাবিত করে।

এখানে চিত্র বর্ণনা লিখুন


2

কারাবাইনার নামে একটি খুব সুন্দর ওপেন সোর্স অ্যাপ্লিকেশন রয়েছে যা এটি এবং আরও অনেক কিছু করবে (কীবোর্ড এবং মাউস রিম্যাপিং ইত্যাদি)। কিছু উদাহরণের জন্য এই প্রশ্নটি দেখুন । এছাড়াও নির্দিষ্ট নির্মাতাদের জন্য তারা কাস্টম নিয়ন্ত্রণ সফ্টওয়্যার সরবরাহ করে যা উন্নত / পরিবর্তিত কার্যকারিতা (যেমন লজিটেক নিয়ন্ত্রণ কেন্দ্র) এর জন্য মঞ্জুরি দেয়।

নীচের মন্তব্যে যেমন উল্লেখ করা হয়েছে যে ম্যাকস সিয়েরার জন্য 'কারাবাইনার এলিমেন্টস' এর একটি নতুন সংস্করণ প্রকাশিত হয়েছে (10.12) এর পরে এটি কেবল এখন পর্যন্ত কীবোর্ড ভিত্তিক রিম্যাপিংয়ের জন্য সরবরাহ করে - সুতরাং বর্তমানে এটির সাথে মাউস রিম্যাপিং করা যাবে না।

তবে হ্যামারস্পুন হ'ল আরেকটি মুক্ত ওপেন সোর্স সরঞ্জাম যা অন্য অনেক জিনিসগুলির মধ্যে মাউসের কী (এবং / বা কীবোর্ড) কীগুলি বিভিন্ন ফাংশনে পুনরায় তৈরি করতে ব্যবহৃত হতে পারে। আপনাকে সরঞ্জামটি ইনস্টল করতে হবে এবং এটি কিছু উপযুক্ত কনফিগারেশনের সাথে সরবরাহ করতে হবে - মাউস রিম্যাপিংয়ের জন্য উদাহরণগুলি এখানে দেখুন ।

আপনার ডিভাইসের মাধ্যমে কোন ইভেন্টের ধরন এবং মাউসএভেন্টবটন নম্বরগুলি উত্পন্ন হচ্ছে তা যাচাই করতে আপনি হামারস্পুন কনসোলে এটি চালিয়ে (কেবল কনসোলটিতে 4 টি লাইন অনুলিপি / আটকে reload configদিতে পারেন) ( এটি বন্ধ করার জন্য ব্যবহার করুন ):

hs.eventtap.new({"all"},function(e)
print(e,"mouseEventButtonNumber:",
e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber']))
end):start()

দ্রষ্টব্য: আপনি যদি লজিটেক কন্ট্রোল সেন্টার (এলসিসি) সরঞ্জামগুলি ইনস্টল করেছেন - এটি লগিটেক ডিভাইসগুলি থেকে তাদের ইনস্টল করা কার্নেল মডিউলটি ব্যবহার করে সরাসরি ইভেন্টগুলি আটকায় যাতে হামারস্পুন সেগুলি দেখতে না পারে। আপনি যদি হ্যামারস্পুন ব্যবহার করে মাউস বোতামগুলি পুনরায় তৈরি করতে চান তবে আপনাকে এলসিসি আনইনস্টল করতে হবে।


1
দুর্ভাগ্যক্রমে কারাবাইনার আর আধুনিক ওএসএক্সের সাথে কাজ করে না। এখন একটি 'কারাবাইনার এলিমেন্টস' রয়েছে যা এটি করে তবে এটিতে মূলটির অর্ধেক কার্যকারিতা রয়েছে এবং এটি এটি করতে পারে না এমন একটি জিনিস।
নাথান হর্নবি

1
হ্যাঁ এটি বর্তমানে সীমাবদ্ধ তাই আমি আরও একটি সমাধান যুক্ত করতে আমার উত্তর আপডেট করেছি।
Pierz

গতকাল আমি যে সমাধানটি অবতরণ করেছি হ্যামারস্পুন, তাই ভাল পরামর্শ! :) কোনও কারণে আমি এটিকে মাউসের বোতামগুলির একটিতে আবদ্ধ করতে পারি না, তবে এটি সিআরটিএল + সেন্টিমিডি ম্যাপিংয়ের কাজটি বেশ ভাল মনে হয়েছে।
নাথান হর্নবি

1
আমি যখন এলসিসি ইনস্টল করেছিলাম তখন আমার এই সমস্যাটি হওয়ায় আমি অন্য একটি সম্পাদনা যুক্ত করেছি তবে এটি আনইনস্টল করার পরে এটি ঠিক হয়ে যায় (একবার আমি মার্বেল মাউসের বামে মিনি-বোতামটি 3 এবং ডানদিকটি 4) কোন মাউস-এভেন্টবটন নাম্বারে কোন বাটনগুলি উত্পন্ন করে কাজ করেছি) ।
পিয়ার্স

আমার সন্দেহ হয়েছিল যে বিষয়টি হতে পারে! নিশ্চিতকরণের জন্য ধন্যবাদ, আমি যখন সুযোগ পাব তখন আমি তা সরিয়ে রাখব।
নাথান হর্নবি

1

এটি সফ্টওয়্যারটির উপর নির্ভর করে - উদাহরণস্বরূপ, ফায়ারফক্স এটিকে সমর্থন করে, যখন গুগল ক্রোম তা সমর্থন করে না।

দুঃখজনকভাবে ওএস এক্স-তে এই জাতীয় বৈশিষ্ট্য ব্যবস্থা সক্ষম করার জন্য বর্তমানে কোনও সফ্টওয়্যার নেই।


সম্ভবত এটি ২০১১ সালে ক্রোমের সাথে সামঞ্জস্যপূর্ণ ছিল না, তবে অবশ্যই 2014 সালে বেশ কয়েকটি সংশোধনীর পরে, স্মার্ট স্ক্রোলের 'গ্র্যাব স্ক্রোল' ক্রোম এবং অপেরার সাথে সুচারুভাবে কাজ করে, আমি নিশ্চিত করতে পারি। আমি এটি ওএস-প্রশস্ত বলে মনে করি কারণ এটি ফাইন্ডার, অ্যাডোব ফটোশপ এবং এমনকি টার্মিনালের কাজ করে। সুতরাং আমি আপনার ডেটা পুরানো মনে হয়! :)

1

আমি পিজইউতে Ctrl + মিডল ক্লিক এবং PgDown এ অপশন + মিডল ক্লিক ক্লিক করার জন্য বেটার টাচ সরঞ্জাম ব্যবহার করেছি। এটি নিখরচায়, দুর্দান্ত সফ্টওয়্যার এবং ভালভাবে কাজ করে।


1

হ্যামারস্পুন এবং স্ক্রিপ্টের জন্য +1, একটি সাধারণ মাউস / ট্র্যাকবল আমাকে ম্যাকের জন্য উন্মাদ করে তোলে।

মাঝের মাউস বোতামটি টিপানোর সময় আমি স্ক্রোল করতে একটি লিখেছিলাম - আরও আপনি মাউসটিকে তত দ্রুত সরান এটি স্ক্রোল করবে।

ক্লিক এখনও 5 পিক্সেলের ডেড-জোন সহ সাধারণ ক্লিকের মতো কাজ করে যাতে চাকাটি টিপতে এবং ছেড়ে দেওয়ার মধ্যে আপনাকে মাউসটিকে পুরোপুরি এখনও রাখতে হবে না।

------------------------------------------------------------------------------------------
-- AUTOSCROLL WITH MOUSE WHEEL BUTTON
-- timginter @ GitHub
------------------------------------------------------------------------------------------

-- id of mouse wheel button
local mouseScrollButtonId = 2

-- scroll speed and direction config
local scrollSpeedMultiplier = 0.1
local scrollSpeedSquareAcceleration = true
local reverseVerticalScrollDirection = false
local mouseScrollTimerDelay = 0.01

-- circle config
local mouseScrollCircleRad = 10
local mouseScrollCircleDeadZone = 5

------------------------------------------------------------------------------------------

local mouseScrollCircle = nil
local mouseScrollTimer = nil
local mouseScrollStartPos = 0
local mouseScrollDragPosX = nil
local mouseScrollDragPosY = nil

overrideScrollMouseDown = hs.eventtap.new({ hs.eventtap.event.types.otherMouseDown }, function(e)
    -- uncomment line below to see the ID of pressed button
    --print(e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber']))

    if e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber']) == mouseScrollButtonId then
        -- remove circle if exists
        if mouseScrollCircle then
            mouseScrollCircle:delete()
            mouseScrollCircle = nil
        end

        -- stop timer if running
        if mouseScrollTimer then
            mouseScrollTimer:stop()
            mouseScrollTimer = nil
        end

        -- save mouse coordinates
        mouseScrollStartPos = hs.mouse.getAbsolutePosition()
        mouseScrollDragPosX = mouseScrollStartPos.x
        mouseScrollDragPosY = mouseScrollStartPos.y

        -- start scroll timer
        mouseScrollTimer = hs.timer.doAfter(mouseScrollTimerDelay, mouseScrollTimerFunction)

        -- don't send scroll button down event
        return true
    end
end)

overrideScrollMouseUp = hs.eventtap.new({ hs.eventtap.event.types.otherMouseUp }, function(e)
    if e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber']) == mouseScrollButtonId then
        -- send original button up event if released within 'mouseScrollCircleDeadZone' pixels of original position and scroll circle doesn't exist
        mouseScrollPos = hs.mouse.getAbsolutePosition()
        xDiff = math.abs(mouseScrollPos.x - mouseScrollStartPos.x)
        yDiff = math.abs(mouseScrollPos.y - mouseScrollStartPos.y)
        if (xDiff < mouseScrollCircleDeadZone and yDiff < mouseScrollCircleDeadZone) and not mouseScrollCircle then
            -- disable scroll mouse override
            overrideScrollMouseDown:stop()
            overrideScrollMouseUp:stop()

            -- send scroll mouse click
            hs.eventtap.otherClick(e:location(), mouseScrollButtonId)

            -- re-enable scroll mouse override
            overrideScrollMouseDown:start()
            overrideScrollMouseUp:start()
        end

        -- remove circle if exists
        if mouseScrollCircle then
            mouseScrollCircle:delete()
            mouseScrollCircle = nil
        end

        -- stop timer if running
        if mouseScrollTimer then
            mouseScrollTimer:stop()
            mouseScrollTimer = nil
        end

        -- don't send scroll button up event
        return true
    end
end)

overrideScrollMouseDrag = hs.eventtap.new({ hs.eventtap.event.types.otherMouseDragged }, function(e)
    -- sanity check
    if mouseScrollDragPosX == nil or mouseScrollDragPosY == nil then
        return true
    end

    -- update mouse coordinates
    mouseScrollDragPosX = mouseScrollDragPosX + e:getProperty(hs.eventtap.event.properties['mouseEventDeltaX'])
    mouseScrollDragPosY = mouseScrollDragPosY + e:getProperty(hs.eventtap.event.properties['mouseEventDeltaY'])

    -- don't send scroll button drag event
    return true
end)

function mouseScrollTimerFunction()
    -- sanity check
    if mouseScrollDragPosX ~= nil and mouseScrollDragPosY ~= nil then
        -- get cursor position difference from original click
        xDiff = math.abs(mouseScrollDragPosX - mouseScrollStartPos.x)
        yDiff = math.abs(mouseScrollDragPosY - mouseScrollStartPos.y)

        -- draw circle if not yet drawn and cursor moved more than 'mouseScrollCircleDeadZone' pixels
        if mouseScrollCircle == nil and (xDiff > mouseScrollCircleDeadZone or yDiff > mouseScrollCircleDeadZone) then
            mouseScrollCircle = hs.drawing.circle(hs.geometry.rect(mouseScrollStartPos.x - mouseScrollCircleRad, mouseScrollStartPos.y - mouseScrollCircleRad, mouseScrollCircleRad * 2, mouseScrollCircleRad * 2))
            mouseScrollCircle:setStrokeColor({["red"]=0.3, ["green"]=0.3, ["blue"]=0.3, ["alpha"]=1})
            mouseScrollCircle:setFill(false)
            mouseScrollCircle:setStrokeWidth(1)
            mouseScrollCircle:show()
        end

        -- send scroll event if cursor moved more than circle's radius
        if xDiff > mouseScrollCircleRad or yDiff > mouseScrollCircleRad then
            -- get real xDiff and yDiff
            deltaX = mouseScrollDragPosX - mouseScrollStartPos.x
            deltaY = mouseScrollDragPosY - mouseScrollStartPos.y

            -- use 'scrollSpeedMultiplier'
            deltaX = deltaX * scrollSpeedMultiplier
            deltaY = deltaY * scrollSpeedMultiplier

            -- square for better scroll acceleration
            if scrollSpeedSquareAcceleration then
                -- mod to keep negative values
                deltaXDirMod = 1
                deltaYDirMod = 1

                if deltaX < 0 then
                    deltaXDirMod = -1
                end
                if deltaY < 0 then
                    deltaYDirMod = -1
                end

                deltaX = deltaX * deltaX * deltaXDirMod
                deltaY = deltaY * deltaY * deltaYDirMod
            end

            -- math.floor - scroll event accepts only integers
            deltaX = math.floor(deltaX)
            deltaY = math.floor(deltaY)

            -- reverse Y scroll if 'reverseVerticalScrollDirection' set to true
            if reverseVerticalScrollDirection then
                deltaY = deltaY * -1
            end

            -- send scroll event
            hs.eventtap.event.newScrollEvent({-deltaX, deltaY}, {}, 'pixel'):post()
        end
    end

    -- restart timer
    mouseScrollTimer = hs.timer.doAfter(mouseScrollTimerDelay, mouseScrollTimerFunction)
end

-- start override functions
overrideScrollMouseDown:start()
overrideScrollMouseUp:start()
overrideScrollMouseDrag:start()

------------------------------------------------------------------------------------------
-- END OF AUTOSCROLL WITH MOUSE WHEEL BUTTON
------------------------------------------------------------------------------------------

খুনির বৈশিষ্ট্য! অনেক ধন্যবাদ, ঠিক আমি যা খুঁজছিলাম। তবে deltaX = deltaY * -1একটি বাগ হওয়া উচিত deltaY = deltaY * -1এবং আমি মন্তব্য deltaX = deltaX * -1করলাম কারণ আমি এক্স অক্ষটি উল্টাতে চাইনি।
টাইলার

টাইপ টাইপ করার জন্য ধন্যবাদ। আমি এটিকে কিছুটা আবার লিখেছি এবং কেবল উল্লম্ব স্ক্রোলিংয়ের বিপরীতে বিকল্পটি পরিবর্তন করেছি
টিএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.