پرش به محتوا
✓ محتوای ویکی بازبینی‌شده توسط ویراستارانمتوسطدسکتاپ، Wayland و گرافیک

قوانین پنجره، قوانین ورک‌اسپیس و دیسپچرها در Hyprland

در مقالات قبلی از آرچی ها نصب، پیکربندی پایه و ابزارهای اکوسیستم Hyprland را بررسی کردیم. اکنون به قلب انعطاف‌پذیری این کامپوزیتور می‌رسیم: سیستم قوانین (Rules).

آخرین به‌روزرسانی: ۲۲ آبان ۱۴۰۵ · نسخهٔ ۱ · ۳ بازدید

این مقاله مستندات رسمی Arch Linux نیست؛ برای موارد حساس به ArchWiki مراجعه کنید.


قوانین پنجره، قوانین ورک‌اسپیس و دیسپچرها در Hyprland

نمای پنجره‌های سازمان‌دهی‌شده با قوانین Hyprland

در مقالات قبلی از آرچی ها نصب، پیکربندی پایه و ابزارهای اکوسیستم Hyprland را بررسی کردیم. اکنون به قلب انعطاف‌پذیری این کامپوزیتور می‌رسیم: سیستم قوانین (Rules). قوانین پنجره و ورک‌اسپیس به شما اجازه می‌دهند بدون دخالت دستی، رفتار و ظاهر پنجره‌ها را بر اساس ویژگی‌هایشان کنترل کنید. در کنار آن، دیسپچرها (Dispatchers) بلوک‌های سازندهٔ اصلی‌ترین ابزار تعامل کاربر، یعنی کلیدهای میانبر، هستند.

---

قوانین پنجره (Window Rules)

قوانین پنجره از تابع hl.window_rule() استفاده می‌کنند و از دو بخش تشکیل می‌شوند: props (معیارهای تطبیق) و effects (اقداماتی که اعمال می‌شوند).

نکتهٔ کلیدی: قوانین از بالا به پایین ارزیابی می‌شوند؛ بنابراین ترتیب نوشتن آن‌ها اهمیت دارد.

ساختار پایه

hl.window_rule({
    name = "my-rule",          -- نام اختیاری (برای کنترل در زمان اجرا)
    match = {
        class = "^(firefox)$", -- معیار تطبیق (RegEx)
    },
    effect = "float",          -- اقدام موردنظر
})

پرکاربردترین معیارهای تطبیق (match)

Hyprland از موتور Google RE2 برای تطبیق عبارات منظم استفاده می‌کند. برای نفی یک تطبیق، پیشوند negative: را اضافه کنید (مثلاً class = "negative:kitty").

| معیار | توضیح | نوع |
| :--- | :--- | :--- |
| class | تطبیق با کلاس پنجره | RegEx |
| ***** | تطبیق با عنوان پنجره | RegEx |
| initial_class | کلاس پنجره در لحظهٔ ایجاد | RegEx |
| initial_title | عنوان پنجره در لحظهٔ ایجاد | RegEx |
| xwayland | پنجره‌های XWayland | bool |
| float | پنجره‌های شناور | bool |
| fullscreen | پنجره‌های تمام‌صفحه | bool |
| pin | پنجره‌های پین‌شده | bool |
| focus | پنجرهٔ فعال | bool |
| workspace | تطبیق با ورک‌اسپیس (ID، نام یا انتخابگر) | string |
| tag | تطبیق بر اساس برچسب (tag) | string |
| content | نوع محتوا: none، photo، video، game | string |

پرکاربردترین اثرات (effect)

اثرات ایستا (Static) فقط یک‌بار در لحظهٔ باز شدن پنجره ارزیابی می‌شوند و از initialClass و initialTitle برای تطبیق استفاده می‌کنند.

| اثر | توضیح | نوع |
| :--- | :--- | :--- |
| float | شناور کردن پنجره | bool |
| tile | کاشی‌کاری پنجره | bool |
| fullscreen | تمام‌صفحه کردن | bool |
| maximize | بزرگ‌کردن (maximize) | bool |
| center | وسط‌چین کردن پنجرهٔ شناور | bool |
| monitor | انتقال به یک مانیتور خاص | string |
| workspace | انتقال به یک ورک‌اسپیس خاص | string |
| move | جابه‌جایی پنجرهٔ شناور | string |
| size | تغییر اندازهٔ پنجرهٔ شناور | string |
| opacity | تنظیم شفافیت پنجره | float |
| no_blur | غیرفعال کردن شفافیت (blur) برای پنجره | bool |
| no_anim | غیرفعال کردن انیمیشن برای پنجره | bool |
| no_initial_focus | جلوگیری از فوکوس اولیه | bool |
| pin | پین کردن پنجره (در همهٔ ورک‌اسپیس‌ها) | bool |
| group | افزودن پنجره به گروه فعلی | bool |

مثال‌های عملی

شناور کردن pavucontrol و وسط‌چین کردن آن:

hl.window_rule({
    match = { class = "^(pavucontrol)$" },
    effect = "float center",
})

باز کردن spotify روی مانیتور DP-1:

hl.window_rule({
    match = { class = "^(spotify)$" },
    effect = "monitor DP-1",
})

شفاف‌تر کردن ترمینال و غیرفعال کردن blur برای آن:

hl.window_rule({
    match = { class = "^(kitty)$" },
    effect = "opacity 0.85 no_blur",
})

پین کردن پنجرهٔ btop (نمایش در همهٔ ورک‌اسپیس‌ها):

hl.window_rule({
    match = { class = "^(btop)$" },
    effect = "float pin",
})

نمونهٔ پنجرهٔ شناور (Floating) در Hyprland

---

قوانین ورک‌اسپیس (Workspace Rules)

قوانین ورک‌اسپیس به شما امکان می‌دهند رفتارهای مخصوص یک ورک‌اسپیس خاص را تعریف کنید؛ مثلاً ورک‌اسپیس بدون حاشیه برای تمرکز بیشتر، یا ورک‌اسپیس مقید به یک مانیتور مشخص.

ساختار پایه

hl.workspace_rule({
    workspace = "3",       -- شناسهٔ ورک‌اسپیس (شماره، name:xxx یا special:xxx)
    rule1 = value1,
    rule2 = value2,
})

قوانین پرکاربرد

| قانون | توضیح | نوع |
| :--- | :--- | :--- |
| monitor | مقید کردن ورک‌اسپیس به یک مانیتور | string |
| default | ورک‌اسپیس پیش‌فرض آن مانیتور باشد | bool |
| gaps_in | فاصلهٔ بین پنجره‌ها | int |
| gaps_out | فاصلهٔ پنجره‌ها از لبه‌های مانیتور | int |
| border_size | اندازهٔ حاشیه | int |
| no_border | رسم حاشیه یا خیر | bool |
| no_shadow | رسم سایه یا خیر | bool |
| no_rounding | گوشه‌های گرد یا خیر | bool |
| decorate | کل تزئینات (حاشیه + سایه + گردی) | bool |
| persistent | زنده نگه داشتن ورک‌اسپیس حتی در صورت خالی بودن | bool |
| on_created_empty | اجرای دستور در زمان ایجاد ورک‌اسپیس خالی | string |

مثال‌های عملی

ورک‌اسپیس بدون حاشیه و تزئینات (حالت تمرکز):

hl.workspace_rule({
    workspace = "3",
    no_rounding = true,
    decorate = false,
})

(بر اساس مثال رسمی ویکی)

ورک‌اسپیس کدنویسی با فاصلهٔ صفر و مقید به مانیتور DP-1:

hl.workspace_rule({
    workspace = "name:coding",
    gaps_in = 0,
    gaps_out = 0,
    no_border = true,
    no_rounding = true,
    decorate = false,
    monitor = "DP-1",
})

ورک‌اسپیس 5 که به‌طور خودکار firefox را در حالت شناور اجرا می‌کند:

hl.workspace_rule({
    workspace = "5",
    on_created_empty = "exec [float] firefox",
})
نکته: در on_created_empty، می‌توانید از سینتکس [float] یا سایر قوانین پنجره درون براکت استفاده کنید تا پنجرهٔ اجراشده با آن ویژگی‌ها باز شود.

---

دیسپچرها (Dispatchers)

دیسپچرها «توصیف‌کننده‌های اقدام» هستند. آن‌ها خودشان کاری انجام نمی‌دهند، بلکه یک جدول (table) برمی‌گردانند که به hl.bind() یا hl.dispatch() داده می‌شود تا اجرا شود.

نکتهٔ حیاتی: اگر دیسپچر را داخل یک تابع Lua فراخوانی می‌کنید، حتماً آن را در hl.dispatch() بپیچید. نوشتن hl.dsp.window.close() به‌تنهایی هیچ کاری نمی‌کند.

ساختار پایه در بایند

hl.bind("SUPER + Q", hl.dsp.exec_cmd("kitty"))

دیسپچرهای عمومی پرکاربرد

| دیسپچر | توضیح |
| :--- | :--- |
| hl.dsp.exec_cmd(cmd) | اجرای یک دستور شل |
| hl.dsp.focus({ direction = "l" }) | تغییر فوکوس در جهت مشخص (l، r، u، d) |
| hl.dsp.focus({ workspace = "2" }) | انتقال فوکوس به یک ورک‌اسپیس |
| hl.dsp.focus({ monitor = "DP-1" }) | انتقال فوکوس به یک مانیتور |
| hl.dsp.global("shortcut-name") | فعال‌سازی یک میانبر D-Bus سراسری |
| hl.dsp.layout("message") | ارسال پیام به موتور چیدمان |
| hl.dsp.pass({ window = "class:kitty" }) | ارسال میانبر به یک پنجرهٔ خاص |
| hl.dsp.reload_config() | بارگذاری مجدد پیکربندی |
| hl.dsp.submap("resize") | ورود به یک زیرنقشه (submap) |
| hl.dsp.exit() | خروج از Hyprland (استفاده از hyprshutdown توصیه می‌شود) |

دیسپچرهای پنجره (hl.dsp.window.*)

| دیسپچر | توضیح |
| :--- | :--- |
| hl.dsp.window.close() | بستن پنجرهٔ فعال |
| hl.dsp.window.float({ action = "toggle" }) | تغییر حالت شناور/کاشی |
| hl.dsp.window.fullscreen({ action = "toggle" }) | تغییر حالت تمام‌صفحه |
| hl.dsp.window.pin() | پین کردن پنجره |
| hl.dsp.window.center() | وسط‌چین کردن پنجرهٔ شناور |
| hl.dsp.window.cycle_next() | رفتن به پنجرهٔ بعدی |
| hl.dsp.window.alter_zorder({ mode = "top" }) | آوردن پنجره به بالا |
| hl.dsp.window.move({ workspace = "2" }) | انتقال پنجره به ورک‌اسپیس دیگر |
| hl.dsp.window.drag() | فعال‌سازی حالت کشیدن پنجره (برای بایند ماوس) |
| hl.dsp.window.resize() | فعال‌سازی حالت تغییر اندازه (برای بایند ماوس) |

دیسپچرهای ورک‌اسپیس (hl.dsp.workspace.*)

| دیسپچر | توضیح |
| :--- | :--- |
| hl.dsp.workspace.move({ workspace = "2" }) | رفتن به ورک‌اسپیس 2 |
| hl.dsp.workspace.move({ workspace = "e+1" }) | رفتن به ورک‌اسپیس بعدی |
| hl.dsp.workspace.move({ workspace = "e-1" }) | رفتن به ورک‌اسپیس قبلی |
| hl.dsp.workspace.move({ workspace = "special:scratchpad" }) | باز/بسته کردن ورک‌اسپیس ویژه |

---

ترکیب دیسپچرها با بایندها (Binds)

بایندها قلب تعامل شما با Hyprland هستند. تابع hl.bind() یک ترکیب کلید را به یک دیسپچر (یا یک تابع Lua) متصل می‌کند.

بایندهای پایه

-- باز کردن ترمینال
hl.bind("SUPER + Q", hl.dsp.exec_cmd("kitty"))

-- بستن پنجره
hl.bind("SUPER + C", hl.dsp.window.close())

-- تغییر فوکوس
hl.bind("SUPER + H", hl.dsp.focus({ direction = "l" }))
hl.bind("SUPER + L", hl.dsp.focus({ direction = "r" }))

-- رفتن به ورک‌اسپیس بعدی/قبلی
hl.bind("SUPER + Tab", hl.dsp.workspace.move({ workspace = "e+1" }))

اجرای چند اقدام با یک بایند (Lambda)

اگر می‌خواهید یک کلید چند کار انجام دهد، از یک تابع Lua استفاده کنید. به یاد داشته باشید که هر دیسپچر را در hl.dispatch() بپیچید.

hl.bind("ALT + Tab", function()
    hl.dispatch(hl.dsp.window.cycle_next())
    hl.dispatch(hl.dsp.window.alter_zorder({ mode = "top" }))
end)

فلگ‌های بایند (Bind Flags)

hl.bind() از فلگ‌های اختیاری پشتیبانی می‌کند که رفتار بایند را تغییر می‌دهند.

| فلگ | توضیح |
| :--- | :--- |
| release | فعال‌سازی در زمان رها کردن کلید |
| repeating | تکرار در صورت نگه داشتن کلید (مثل کلید صدا) |
| locked | فعال‌سازی حتی در زمان فعال بودن قفل صفحه |
| mouse | بایند مخصوص ماوس |
| non_consuming | رویداد کلید علاوه بر اجرای دیسپچر، به پنجرهٔ فعال هم ارسال شود |
| ignore_mods | نادیده گرفتن مودیفایرها |
| description | افزودن توضیح برای بایند |

مثال: بایند کلید صدا با قابلیت تکرار:

hl.bind("XF86AudioRaiseVolume",
    hl.dsp.exec_cmd("wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"),
    { repeating = true }
)

مثال: بایند کشیدن پنجره با ماوس:

hl.bind("SUPER + mouse:272", hl.dsp.window.drag(), { mouse = true })

---

زیرنقشه‌ها (Submaps): حالت‌های تعاملی

زیرنقشه‌ها به شما اجازه می‌دهند یک «حالت» موقت ایجاد کنید که در آن کلیدها معانی متفاوتی پیدا کنند؛ مثلاً حالت تغییر اندازهٔ پنجره، حالت جابه‌جایی پنجره، یا حالت انتخاب سریع.

تعریف یک زیرنقشه

-- ورود به زیرنقشهٔ resize با SUPER + R
hl.bind("SUPER + R", hl.dsp.submap("resize"))

-- تعریف بایندهای داخل زیرنقشه
hl.bind("L", hl.dsp.window.resize({ x = 10, y = 0 }), { submap = "resize" })
hl.bind("H", hl.dsp.window.resize({ x = -10, y = 0 }), { submap = "resize" })
hl.bind("K", hl.dsp.window.resize({ x = 0, y = -10 }), { submap = "resize" })
hl.bind("J", hl.dsp.window.resize({ x = 0, y = 10 }), { submap = "resize" })

-- خروج از زیرنقشه با Escape یا هر کلید دلخواه
hl.bind("Escape", hl.dsp.submap("reset"), { submap = "reset" })
نکته: برای خروج از هر زیرنقشه، از hl.dsp.submap("reset") استفاده کنید.

---

منابع و لینک‌های مرتبط

مطالب مرتبط در سایت آرچی ها

---

این مقاله بر اساس مستندات رسمی Hyprland (نسخه‌های 0.54 تا 0.57) گردآوری شده و برای جامعهٔ ARCHIHA تهیه شده است. آخرین به‌روزرسانی: نوامبر 2026.

این مقاله مفید بود؟برای ثبت بازخورد وارد شوید۰ مفید · ۰ نامفیدپیشنهاد ویرایشتاریخچه