Skip to content

Latest commit

 

History

History
106 lines (79 loc) · 4.63 KB

4.7.md

File metadata and controls

106 lines (79 loc) · 4.63 KB

窗口管理器

窗口管理器(Window Manager)是操作系统的重要组成部分,负责管理用户界面(User Interface)的显示和操作。窗口管理器的主要功能包括:

  • 窗口的管理:窗口管理器负责创建、显示、移动、关闭窗口,并提供窗口之间的切换、调整大小、最大化、最小化等操作。
  • 工作区的管理:窗口管理器负责划分工作区,并提供窗口的移动、调整大小、最大化、最小化等操作。
  • 任务切换:窗口管理器提供任务切换功能,允许用户在多个窗口之间快速切换。
  • 屏幕保护:窗口管理器可以防止用户意外关闭显示器,并提供多种屏幕保护模式,如超时、关机、锁屏等。
  • 窗口动画:窗口管理器可以提供窗口切换、最大化、最小化等操作时的动画效果。
  • 窗口管理器的配置:窗口管理器的配置可以让用户自定义窗口管理器的行为,如窗口的尺寸、位置、透明度、主题等。

窗口管理器的种类繁多,如开源的窗口管理器有:

  • GNOME
  • KDE
  • XFCE
  • i3
  • Awesome
  • Cinnamon
  • MATE
  • LXDE
  • Fluxbox
  • Openbox
  • AwesomeWM
  • WindowMaker
  • Awesome TWM
  • Blackbox
  • Xmonad
  • Awesome Window Manager
  • Awesome WM
  • i3 Window Manager
  • Compiz
  • Metacity

窗口管理器基本原理

一个基本的窗口管理器的工作原理可以分为以下几个步骤:

  1. 窗口管理器接收到用户的操作,如鼠标点击、键盘输入等。
  2. 窗口管理器根据用户的操作,确定需要操作的窗口。
  3. 窗口管理器根据窗口的状态,确定需要执行的操作。如窗口是否可见、是否最小化、是否最大化、是否置顶、是否移动、是否调整大小等。
  4. 窗口管理器执行相应的操作,如显示、隐藏、最小化、最大化、移动、调整大小等。
  5. 窗口管理器将执行的操作反馈给用户。

在此,窗口管理器看似拥有一系列特权,但实际上它只是提供了一个统一的接口,让各个应用程序按照统一的规则来显示、操作窗口。他仍然只是一个普通的X client,它只是按照窗口管理器的要求来显示窗口,并接收用户的操作。并不位于操作系统内核之上,而是在用户空间中运行。


窗口管理器的作用

窗口管理器的作用主要有以下几点:

  1. 统一窗口管理:窗口管理器的出现使得各个应用程序的窗口管理变得统一,用户可以更加方便地管理应用程序的窗口。
  2. 节省资源:窗口管理器可以节省系统资源,如内存、CPU等。
  3. 提高用户体验:窗口管理器可以提高用户的工作效率,如窗口的切换、窗口的移动、窗口的调整大小等。
  4. 增强用户能力:窗口管理器可以增强用户的能力,如可以实现窗口的拖拽、窗口的透明度调整、窗口的置顶、窗口的全屏显示等。
  5. 改善用户的视觉效果:窗口管理器可以改善用户的视觉效果,如可以实现窗口的平滑过渡、窗口的透明度调整、窗口的主题切换等。

窗口管理器管理窗口的方法

在一个屏幕中,同时存在多个窗口,但是只能存在一个窗口管理器来管理这些窗口。也就是说,当一个屏幕上已经注册了一个窗口管理器后,其他的窗口管理器就无法管理这个屏幕上的窗口。

窗口管理器注册

当用户登录到操作系统时,窗口管理器会自动启动,并尝试注册到操作系统。注册的过程包括:

  1. 窗口管理器向操作系统注册自己。
  2. 窗口管理器向操作系统请求一个空闲的屏幕区。
  3. 窗口管理器将自己注册到这个空闲的屏幕区。

以下是使用c语言来注册窗口管理器的示例代码:

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <iostream>

int main() {
    Display *display = XOpenDisplay(NULL);
    if (display == NULL) {
        fprintf(stderr, "Cannot open display\n");
        return 1;
    }
    Window root = DefaultRootWindow(display);
    XSelectInput(display,root,SubsrtcstructureNotifyMask | SubstructureRedirectMask);
    while (1) {
        XEvent event;
        XNextEvent(display,&event);
        if (event.type == MapNotify) {
            std::cout<<"Window created"<<std::endl;
        }
    }
    XCloseDisplay(display);
    return 0;
}

以上代码通过XOpenDisplay函数打开显示器,并获取默认的根窗口。然后,它通过XSelectInput函数设置监听事件,并在事件队列中等待MapNotify事件。当窗口被创建时,窗口管理器会收到MapNotify事件,并打印出Window created信息。