วิธีเปลี่ยนแอปพลิเคชันจากเวิร์กสเปซ 1 เป็น 2 โดยใช้คำสั่ง


12

มีวิธีใดบ้างที่ฉันจะสามารถสลับแอปพลิเคชันที่ทำงานในพื้นที่ทำงานหนึ่งไปยังอีกที่หนึ่งบนบรรทัดคำสั่งได้ ฉันใช้ Ubuntu 10.04

UPDATE1
ตามคำแนะนำด้านล่าง

 wmctrl -l
0x02200003 -1 bond Bottom Expanded Edge Panel
0x02200049 -1 bond Top Expanded Edge Panel
0x02000020  0 bond x-nautilus-desktop
0x04e00004  0 bond bond@bond: ~
0x0482a380  0 bond OMG! Ubuntu! | wmctrl - Chromium
0x05000072  0 bond how to shift applications from workspace 1 to 2 using command - Ask Ubuntu - Stack Exchange - Google Chrome

ตอนนี้เมื่อฉันพิมพ์

wmctrl -r :OMG! Ubuntu! | wmctrl - Chromium: -t 2 No window was specified.

ดังนั้นวิธีการใช้อย่างถูกต้องผิดพลาดในข้างต้นคืออะไร?

UPDATE2
ฉันลองแล้ว

wmctrl -r 0x05000072 -t 2

แต่หน้าต่างไม่มีผลและพวกเขายังคงอยู่ในพื้นที่ทำงานเดียวกัน


ฉันได้อัพเดตคำตอบของฉันพร้อมกับข้อมูลที่ดีขึ้นเกี่ยวกับการใช้ -r และ -i อาร์กิวเมนต์สำหรับ -r ควรอยู่ใน "เครื่องหมายคำพูด" หากมีช่องว่าง หากอาร์กิวเมนต์ to -r เป็น id หน้าต่างคุณต้องระบุ -i บนบรรทัดคำสั่งด้วย

คำตอบ:


14

หากคุณใช้ตัวจัดการหน้าต่างที่เข้ากันได้กับ Metacity (Unity 2-d) คุณสามารถใช้ wmctrl เพื่อสลับหน้าต่างไปยังเดสก์ท็อปอื่น wmctrl -r :ACTIVE: -t <DESKTOP>ไวยากรณ์ wmctrl -s <DESKTOP>นอกจากนี้คุณยังสามารถเปลี่ยนสก์ท็อปในปัจจุบันของคุณโดยใช้ หมายเลขเดสก์ท็อปเริ่มต้นที่ 0 ในหนึ่งบรรทัดนี่จะเป็น:

wmctrl -r :ACTIVE: -t 1; wmctrl -s 1

หากคุณต้องการสลับหน้าต่างอื่นที่ไม่ใช่หน้าต่างที่ใช้งานอยู่เป็นเดสก์ท็อปอื่นให้ใช้ข้อความจากชื่อเรื่องเป็นอาร์กิวเมนต์เป็น -r ตัวอย่างเช่น:

wmctrl -r "Chromium" -t 1

หรือคุณสามารถใช้wmctrl -lเพื่อแสดงรายการหน้าต่างที่มีอยู่และหมายเลขรหัสผ่านเพื่อ -R :ACTIVE:แทนสตริงพิเศษ เมื่อส่งรหัสคุณต้องเพิ่ม -i ด้วย ตัวอย่างเช่น:

$ wmctrl -l
0x03e00189  0 hostname Ask Ubuntu - Chromium
$ wmctrl -i -r 0x03e00189 -t 2

(wmctrl สามารถติดตั้งบน Ubuntu ด้วยsudo apt-get install wmctrl) ในปัจจุบันดูเหมือนว่าจะไม่สามารถทำงานกับ Unity มาตรฐานได้


@skyblue ข้อมูลที่ยอดเยี่ยมฉันเห็นสิ่งหนึ่งที่ฉันไม่ชัดเจนคือฉันจะรู้ได้อย่างไรว่าหน้าต่างเดสก์ท็อปไม่ใช่และสิ่งที่ฉันกำลังมองหาคือว่า Chrome กำลังทำงานและฉันต้องการให้ Chrome เปลี่ยนจากเดสก์ท็อปปัจจุบันไปเป็นอีกอันหนึ่ง สำหรับสิ่งนี้.
สมาชิกที่ลงทะเบียน

หากคุณกำลังใช้เบราว์เซอร์ Chrome (ซึ่งมี "Chromium" อยู่ในชื่อเรื่องคุณควรจะสามารถใช้wmctrl -r "Chromium" -t 1เป็นสีฟ้ากล่าวถึงในคำตอบของเขาตราบใดที่คุณใช้ตัวจัดการหน้าต่างที่สอดคล้องเช่น Unity-2d
John S Gruber

3

นี่คือสคริปต์ของฉันที่ใช้สิ่งที่คุณถาม: https://github.com/norswap/wmov/blob/master/wmov.sh

ในรูปแบบปัจจุบันมันสามารถส่งหน้าต่าง (เลือกโดยการจับคู่สตริงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่กับชื่อสตริงย่อยเช่นสำหรับwmctrl -rตัวเลือก) ไปยังเดสก์ท็อปอื่นไม่ว่าจะโดยการเลือกหมายเลขเดสก์ท็อปที่ชัดเจนหรือโดยระบุทิศทางของเดสก์ท็อป เดสก์ทอป.

ตัวอย่างเช่น

./wmov.sh mov "Google Chrome" 3 # sends Chrome to desktop 3 (bottom left)
./mov.sh mov Skype right # sends Skype to the desktop to the right of
                         # the current desktop (if any)

มันใช้งานได้จริงตามที่อธิบายไว้ในโพสต์ของ desgua นอกจากนี้ยังมีความสามารถในการส่งหน้าต่างไปยังพื้นที่ทำงานอื่น ๆ


ฉันชอบโซลูชันนี้เนื่องจากสามารถระบุหน้าต่างที่มีการจับคู่บางส่วนของชื่อหน้าต่างโดยเฉพาะอย่างยิ่งมีประโยชน์เมื่อโปรแกรมแก้ไขส่วนของชื่อขึ้นอยู่กับบริบท การเรียกหน้าต่างด้วยชื่อนั้นง่ายกว่าการค้นหา PID ข้อเสียคือถ้ามีหลาย windows ที่มีสตริงเดียวกันในชื่อหนึ่งไม่สามารถทำนายได้ว่า wmov.sh หนึ่งจะคว้า
Andrew P.

3

มันเป็นไปได้ที่จะทำเช่นนี้กับxdotool, แต่ถ้าคุณกำลังใช้compizวิธีการแก้ปัญหานี้อาจจะไม่บังคับดังนั้นโปรดเก็บไว้ในใจ

ในการสลับหน้าต่างเฉพาะ (หน้าต่างที่ใช้งานอยู่) ไปยังพื้นที่ทำงานอื่นคุณสามารถใช้

xdotool getactivewindow set_desktop_for_window 1

หรือสำหรับสคริปต์คุณอาจต้องการสลับหน้าต่างของโปรแกรมเฉพาะไปเป็นพื้นที่ทำงานที่กำหนดด้วย:

xdotool search --class firefox set_desktop_for_window %@ 1

คำสั่งนี้ค้นหาและค้นหาfirefoxหน้าต่าง (s) และถ่ายโอนไปยังเวิร์กสเปซ 1 ซึ่งจะลดลง ในการกลับมาfirefoxไปที่เดสก์ท็อปเริ่มต้นให้แทนที่ 1 ด้วย 0 ที่ท้ายคำสั่ง หากต้องการส่งหน้าต่างอื่นไปยังพื้นที่ทำงานอื่นให้แทนที่firefoxด้วยชื่อโปรแกรมอื่น

มันเป็นสิ่งสำคัญที่คุณใช้ %@เพื่อแสดงหน้าต่างที่ส่งผ่านจาก--searchพารามิเตอร์ราวกับว่าคุณไม่มีหน้าต่างใดที่จะถูกถ่ายโอน

สำหรับข้อมูลเพิ่มเติมให้ดูman xdotoolที่Ubuntuและการจัดการออนไลน์


2

หากคุณกำลังใช้งาน compiz ให้ดูที่วิกิ compizที่นี่นี่ คุณพบตัวอย่างหลายอย่าง ดูปลั๊กอิน "ใส่"

ตัวอย่าง

./compiz-dbus-send.py put put_viewport_right_key

1

ประการแรกลำไส้ใหญ่เป็นส่วนหนึ่งของ :ACTIVE:โทเค็นเวทมนต์เพื่อระบุหน้าต่างที่ใช้งานอยู่ คุณไม่ต้องการมันตามปกติ ประการที่สองคุณต้องพูดสตริงด้วยช่องว่าง

คุณยังสามารถรับ ID หน้าต่าง ( 0x...ที่จุดเริ่มต้นของแต่ละบรรทัด) และใช้สิ่งนั้นแทนการพยายามทำให้ชื่อเรื่องทำงาน

$ wmctrl -r 'OMG! Ubuntu! | wmctrl - Chromium' -t 2 # wherever it is, move it to 2
$ wmctrl -r 0x0482a380 -t 2 # same thing

อีกวิธีหนึ่งในการรับ ID หน้าต่างคือการเปิดใช้งานxwininfoจากนั้นคลิกที่หน้าต่างที่มี ID ที่คุณต้องการ
geekosaur

ฉันลองใช้วิธีการของคุณแล้ว แต่ไม่มีผลใด ๆ ต่อหน้าต่างที่เป็นปัญหา
สมาชิกที่ลงทะเบียน

@ ผู้ใช้ที่ลงทะเบียน: ตัวจัดการหน้าต่างคืออะไร ( wmctrl -m)
geekosaur

ขออภัยสำหรับความล่าช้าตอบกลับ wmctrl -m ชื่อ: compiz Class: N / A PID: N / A โหมดผู้จัดการหน้าต่าง "แสดงเดสก์ท็อป" ของโหมด: ปิด
ผู้ใช้ที่ลงทะเบียน

การบริหารทรัพยากรมนุษย์ ฉันจะเดาตามคำแนะนำในการใช้ปลั๊กอิน Compiz ซึ่ง Compiz ไม่ได้ใช้ข้อมูลจำเพาะ EWMH แบบเต็มดังนั้นจึงwmctrlไม่สามารถใช้งานได้ (โดยเฉพาะจะต้องฟังPropertyChangeเหตุการณ์ในหน้าต่างรูทสำหรับคุณสมบัติเฉพาะแล้วดำเนินการกับเนื้อหาของคุณสมบัติเหล่านั้น)
geekosaur

0

ด้วยการปรับเปลี่ยนสคริปต์ที่ให้ไว้เพื่อแก้ไขปัญหานี้บิตต่อไปนี้จะ "นำ" หน้าต่างที่กำหนดไปยังพื้นที่ทำงานปัจจุบัน (ในคอมบิซ):

#!/bin/bash

SCREEN_W=$(xwininfo -root | sed -n 's/^  Width: \(.*\)$/\1/p')
SCREEN_H=$(xwininfo -root | sed -n 's/^  Height: \(.*\)$/\1/p')

NAME="$1"

wmctrl -xlG | awk -v NAME="$NAME" '$7==NAME {print $1}' | while read WINS; do wmctrl -ir "$WINS" -e "0,0,0,$SCREEN_W,$SCREEN_H"; done

exit 0

หากต้องการพื้นที่ทำงานตามอำเภอใจก็เป็นเรื่องของการเพิ่ม / ลบล้าง / ที่เกี่ยวข้อง$SCREEN_W/ $SCREEN_Hหลายครั้งตามที่เวิร์กสเปซมีหน้าต่างอยู่ห่างจากเป้าหมายหนึ่ง


0

ลอง:

wmctrl -r “window name(or any string in the title)” -t `wmctrl -d | grep “workspace name” | cut -d" " -f1`

ให้ฉันอธิบาย: ในความช่วยเหลือของ wmctrl แสดงให้เห็น

    -r <WIN> -t <DESK>   Move the window to the specified desktop.
    <DESK>               A desktop number. Desktops are counted from zero.
    <WIN>          This argument specifies the window. By default it's
                   interpreted as a string. The string is matched
                   against the window titles and the first matching
                   window is used. The matching isn't case sensitive
                   and the string may appear in any position
                   of the title.

                   The -i option may be used to interpret the argument
                   as a numerical window ID represented as a decimal
                   number. If it starts with "0x", then
                   it will be interpreted as a hexadecimal number.

wmctrl -d สามารถแสดงรายการพื้นที่ทำงานทั้งหมดในคอมพิวเตอร์ของฉันจะแสดงดังต่อไปนี้:

0 - DG: 1600x900 VP: N / A WA: รหัส 0,0 1600x868
1 * DG: 1600x900 VP: 0,0 WA: เล่น 0,0 1600x868 
2 - DG: 1600x900 VP: N / A WA: การวิจัย 0,01600x868

* หมายถึงพื้นที่ทำงานปัจจุบัน

BTW wmctrl -lคือการแสดงรายการหน้าต่างทั้งหมด (ซึ่งคุณรู้จักอยู่แล้ว) ในคอมพิวเตอร์ของฉันตอนนี้มันคือ:

0x05400008 1 user-LinuxMint Terminal
0x03a0008e ผู้ใช้ 0 คน LinuxMint Mozilla Firefox


เนื่องจาก "DESK" ต้องเป็นตัวเลขฉันจึงใช้grep “workspace name” | cut -d" " -f1เพื่อรับมัน

ตัวอย่างเช่นถ้าฉันต้องการย้าย Firefox ไปยังพื้นที่ทำงาน "รหัส" ฉันสามารถใช้:

wmctrl -r "firefox" -t 0 

หรือ

wmctrl -r "moz" -t `wmctrl -d | grep "code" | cut -d" " -f1`

แต่

wmctrl -r -i 0x03a0008e -t `wmctrl -d | grep "code" | cut -d" " -f1`

แค่ทำงานฉันสักครั้งแล้วก็ไม่รู้ว่าทำไม!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.