क्या मैं OS X में मध्य-बटन-ड्रैग के साथ स्क्रॉलिंग सक्षम कर सकता हूं?


16

मेरे पास तीन बटन वाला एक माउस है लेकिन कोई पहिया नहीं है।

ओएस एक्स में, क्या कोई तरीका है (शायद एडऑन सॉफ्टवेयर के साथ) जो मुझे अपने तीसरे बटन का उपयोग करके स्क्रॉल करने और माउस को हिलाने की अनुमति देगा?

जवाबों:


10

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

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


3

मैंने हैमरस्पून के साथ इस थ्रेड से प्रेरित निम्नलिखित विन्यास स्क्रिप्ट के साथ किया: https://github.com/tekezo/Karabiner/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.newScrollEvent ({- dd * स्क्रॉलमूल," डीवाई * scrollmult} {}, 'पिक्सेल') "नकारात्मक करने के लिए (इसलिए यह होगा" -dy * scrollmult ")
im_chc

2

स्मूज वह करता है, जो अन्य चीजों के बीच है। (मैं डेवलपर हूं)

उदाहरण के लिए, लिंक की पहचान करते समय हर मैक ऐप में इसका उपयोग करने की क्षमता अन्य सुझावों से अलग है। (यदि आप अपने मध्य बटन को खींचने और फेंकने के लिए खींचें, लेकिन फिर भी चाहते हैं कि एक मध्य बटन क्लिक मध्य बटन के रूप में कार्य करेगा)

स्मूज के साथ ग्रैब-ड्रैग-थ्रो से ज्यादा ग्रैब-ड्रैग की तरह है। रिलीज़, स्क्रॉल और आईफोन स्क्रॉल के समान एनीमेशन को प्रभावित करता है।

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


2

Karabiner नाम का एक बहुत अच्छा ओपन सोर्स ऐप है जो ऐसा करेगा और पूरे बहुत अधिक (कीबोर्ड और माउस रीमैपिंग आदि)। इस प्रश्न को कुछ उदाहरणों के लिए देखें । इसके अलावा कुछ निर्माताओं के लिए वे कस्टम नियंत्रण सॉफ्टवेयर की आपूर्ति करते हैं जो बेहतर / संशोधित कार्यक्षमता (जैसे Logitech कंट्रोल सेंटर) के लिए अनुमति दे सकते हैं।

जैसा कि नीचे टिप्पणियों में उल्लेख किया गया है कि 'कारबिनियर एलिमेंट्स' का एक नया संस्करण मैकओएस सिएरा (10.12) के लिए जारी किया गया है, इसके बाद यह केवल कीबोर्ड आधारित रीमैपिंग के लिए प्रदान करता है - इसलिए वर्तमान में इसके साथ माउस रीमैपिंग नहीं की जा सकती है।

हालांकि हैमरस्पून एक अन्य मुक्त खुला स्रोत उपकरण है जिसका उपयोग कई अन्य चीजों के अलावा, माउस (और / या कीबोर्ड) की चाबियों को अलग-अलग कार्यों के लिए किया जा सकता है। आपको टूल को इंस्टॉल करना होगा और इसे कुछ उपयुक्त कॉन्फिग के साथ प्रदान करना होगा - माउस रीमैपिंग के लिए यहां उदाहरण देखें ।

यह जांचने के लिए कि आपके डिवाइस द्वारा कौन से ईवेंट प्रकार और माउसइवेंटबटन नट उत्पन्न किए जा रहे हैं, आप इसे (हैमर में 4 लाइनों को कॉपी / पेस्ट कर सकते हैं) हैमरस्पून कंसोल ( reload configइसे रोकने के लिए उपयोग करें ):

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

नोट: यदि आपने Logitech Control Center (LCC) उपकरण स्थापित किए हैं - यह सीधे Logitech उपकरणों से घटनाओं को उनके स्थापित कर्नेल मॉड्यूल का उपयोग करके पकड़ लेता है ताकि Hammerspoon उन्हें नहीं देख सके। यदि आप हैमरस्पून का उपयोग करके माउस बटन को रीमैप करना चाहते हैं तो आपको LCC की स्थापना रद्द करनी होगी।


1
दुर्भाग्य से Karabiner अब आधुनिक OSX के साथ काम नहीं करता है। अब एक 'कारबिनियर एलिमेंट्स' है, लेकिन इसमें मूल की आधी कार्यक्षमता है, और यह उन चीजों में से एक है जो आप नहीं कर सकते हैं।
नाथन हॉर्बी

1
हां यह वर्तमान में सीमित है इसलिए मैंने एक और समाधान जोड़ने के लिए अपना उत्तर अपडेट कर दिया है।
पियरज

हम्मरपून वह समाधान है जो मैं कल पर उतरा, इतना अच्छा सुझाव! :) किसी कारण से मैं इसे माउस बटन में से एक से बांधने के लिए नहीं मिला, लेकिन ctrl + cmd को मैप करने से यह ठीक काम करने लगा।
नाथन हॉर्बी

1
जब मैंने LCC लगाई थी, तब मैंने एक और संपादन जोड़ा था, लेकिन जब मैंने LCC स्थापित किया था, तो इसे ठीक कर दिया था (एक बार काम करने के बाद मैंने कौन से बटन उत्पन्न किए, कौन-सा माउस-माउस ब्यूटेन - मेरे संगमरमर के माउस के बाईं ओर का बटन 3 है और दायां 4 है) ।
पियरज

मुझे संदेह था कि यह मुद्दा हो सकता है! पुष्टि के लिए धन्यवाद, मैं मौका मिलने पर उसे सुलझा लूंगा।
नाथन हॉर्बी

1

यह सॉफ्टवेयर पर निर्भर करता है - उदाहरण के लिए, फ़ायरफ़ॉक्स इसका समर्थन करता है, जबकि Google Chrome नहीं करता है।

वर्तमान में OS X में इस तरह की सुविधा प्रणाली को व्यापक रूप से सक्षम करने के लिए कोई सॉफ्टवेयर नहीं है।


शायद यह 2011 में क्रोम तरीके से संगत नहीं था, लेकिन निश्चित रूप से 2014 में काफी कुछ संशोधनों के बाद, स्मार्ट स्क्रॉल के 'ग्रैब स्क्रॉल' क्रोम और ओपेरा के साथ आसानी से काम करता है, मैं पुष्टि कर सकता हूं। मुझे लगता है कि यह ओएस-वाइड है क्योंकि यह फाइंडर, एडोब फोटोशॉप और यहां तक ​​कि टर्मिनल में भी काम करता है। इसलिए मुझे लगता है कि आपका डेटा पुराना है! :)

1

मैंने Ctrl + मध्य-क्लिक करने के लिए PgUp, और विकल्प + मध्य-क्लिक करने के लिए 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क्योंकि मैं एक्स अक्ष को उल्टा नहीं चाहता था।
टायलर

टाइपो को खोलने के लिए धन्यवाद। मैंने इसे फिर से लिखा और ऊर्ध्वाधर स्क्रॉल को केवल रिवर्स करने के विकल्प को बदल दिया
TIM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.