diff --git a/README.md b/README.md index 5cc3fd37328a5a03ba2c52b2eae2ed5ce188965f..f384b1f1766696602fc98a223af8998cbdf77569 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ # RWS Wayland + +`这是一个Wayland混成器的简单实现,用于BiliOS项目的图形环境` diff --git a/RWLserver/server.cc b/RWLserver/server.cc index c28d1a2e34587ff1010f079769a5c35cb7a22caf..33a134154b44eb3d64ac79bba8f42f2aef08f41e 100644 --- a/RWLserver/server.cc +++ b/RWLserver/server.cc @@ -2,19 +2,5 @@ int main(int argc, char **argv) { - switch_to_daemon(); - fbinfo.bufferfile = open("/dev/fb0", O_RDWR); - if(!fbinfo.bufferfile) - { - rwl::err("cannot open device /dev/fb0 ."); - rwl::rwl_exit(-2); - } - rwl::log("succeeded open device /dev/fb0 ."); - - fb_var_screeninfo vinfo; - fb_fix_screeninfo finfo; - ioctl(fbinfo.bufferfile, FBIOGET_FSCREENINFO, &finfo); - ioctl(fbinfo.bufferfile, FBIOGET_VSCREENINFO, &vinfo); - - mapbuffer(&vinfo, &finfo); + switch_to_daemon(); //切换到守护进程 } diff --git a/RWLserver/server.hh b/RWLserver/server.hh index 01de8eff2f4598da84384a485f49d0d40e6ce5cf..43f8a4a890372a73283f05f5e6ba81618369c243 100644 --- a/RWLserver/server.hh +++ b/RWLserver/server.hh @@ -1,29 +1,14 @@ -#ifndef SERVER_HH -#define SERVER_HH +#ifndef __server_hh_ +#define __server_hh_ #include #include -#include #include -#include #include -#include -#include -#include #include "../dbg/logs.hh" -struct framebuffer_info -{ - int bufferfile; - - long long size; - long long width, height; - - char *buffer; - char **coordination; -} fbinfo; /** * @brief 切换为守护进程 @@ -40,22 +25,4 @@ void switch_to_daemon() freopen("./.rwl/rwl-err", "w", stderr); } -/** - * @brief 映射缓冲区 - * - * @param vinfo - * @param finfo - */ -void mapbuffer(fb_var_screeninfo *vinfo, fb_fix_screeninfo *finfo) -{ - fbinfo.size = vinfo->xres * vinfo->yres * vinfo->bits_per_pixel / 8; - fbinfo.width = vinfo->xres; - fbinfo.height = vinfo->yres; - - fbinfo.buffer = (char *)mmap(0, fbinfo.size, PROT_READ | PROT_WRITE, MAP_SHARED, fbinfo.bufferfile, 0); - fbinfo.coordination = new char *[fbinfo.height]; - for (int i = 0; i < fbinfo.height; i++) - fbinfo.coordination[i] = fbinfo.buffer + i * finfo->line_length + vinfo->xoffset; -} - #endif diff --git a/dbg/logs.hh b/dbg/logs.hh index b2ae8a9d240a265ed53c66cae8010594422affa8..ce37f438685ae270f71075b8ce248ac703e4e3f3 100644 --- a/dbg/logs.hh +++ b/dbg/logs.hh @@ -1,5 +1,5 @@ -#ifndef LOGS_HH -#define LOGS_HH +#ifndef __logs_hh_ +#define __logs_hh_ #include diff --git a/includes/rwl.hh b/includes/rwl.hh new file mode 100644 index 0000000000000000000000000000000000000000..55e754b61545ee6b380e1089e469d8a647f13791 --- /dev/null +++ b/includes/rwl.hh @@ -0,0 +1,150 @@ +#ifndef __rwl_hh_ +#define __rwl_hh_ + +#include "types.hh" + +namespace rwl +{ + + class Frame + { + private: + id_t fid; //窗口id + pid_t pid; //进程id + std::string name; //窗口名 + + void *mbuf; //主缓冲 + int64_t pos[2]; //窗口位置 + uint64_t size[2]; //窗口大小 + + void *userbuf; //用户缓冲 + int64_t ofset[2]; //用户缓冲位置 + uint64_t usersize[2]; //用户缓冲大小 + public: + Frame(); + Frame(std::string name); + Frame(uint64_t size[2]); + Frame(int64_t position[2], uint64_t size[2]); + Frame(std::string name, uint64_t size[2]); + Frame(std::string name, int64_t position[2], uint64_t size[2]); + ~Frame(); + + void setName(std::string name); + std::string getName(); + + /** + * 一系列getter函数 + * + * 这组函数获取的位置是主缓冲的位置 + * 大小是用户缓冲的大小 + */ + int64_t getX(); + int64_t getY(); + int64_t getWidth(); + int64_t getHeight(); + + /** + * @brief 获取主缓冲信息 + * + * @param buffer 缓冲区 + * @param position 位置 + * @param size 大小 + * @return int 错误码 + */ + int getMainBufferInfo(void *&buffer, int64_t *&position, uint64_t *&size); + /** + * @brief 获取用户缓冲信息 + * + * @param buffer 缓冲区 + * @param position 位置 + * @param size 大小 + * @return int 错误码 + */ + int getUserBufferInfo(void *&buffer, int64_t *&position, uint64_t *&size); + + /** + * 一系列setter函数 + * + * 这组函数设置的位置是主缓冲的位置 + * 大小是用户缓冲的大小 + */ + void setX(int64_t x); + void setY(int64_t y); + int setWidth(uint64_t width); + int setHeight(uint64_t height); + + /** + * @brief 设置主缓冲信息 + * + * @param buffer 缓冲区 + * @param position 窗口位置 + * @param size 大小 + * @return int 错误码 + */ + int setMainBufferInfo(void *buffer, int64_t position[2], uint64_t size[2]); + /** + * @brief 设置用户缓冲信息 + * + * @param buffer 缓冲区 + * @param position 用户缓冲位置 + * @param size 用户缓冲大小 + * @return int 错误码 + */ + int setUserBufferInfo(void *buffer, int64_t position[2], uint64_t size[2]); + + /** + * @brief 根据路径移动窗口 + * + * @param path 路径 + * @param freq 频率 + * @return int 错误码 + */ + int moveByPath(std::vector path, uint64_t freq); + }; + + class Page + { + private: + id_t pgid; //页id + + std::vector owners; //所属进程 + + void *layerbg; //背景层 + std::vector layer0; // 0层 + std::vector layer1; // 1层 + public: + Page(); + ~Page(); + + /** + * @brief 添加窗口 + * + * @param frame 窗口id + */ + void addFrame(id_t frame); + /** + * @brief 添加窗口 + * + * @param frame 窗口 + */ + void addFrame(Frame *frame); + + /** + * @brief 将窗口提前 + * + * @param frame 提前的窗口id + * @return bool 页中是否存在 + */ + bool pushFrame(id_t frame); + /** + * @brief 将窗口提前 + * + * @param frame 提前的窗口 + * @return bool 页中是否存在 + */ + bool pushFrame(Frame *frame); + }; + +}; + +#endif diff --git a/includes/types.hh b/includes/types.hh new file mode 100644 index 0000000000000000000000000000000000000000..32402f20cb4e75b84474b7a6bc74b1394664869a --- /dev/null +++ b/includes/types.hh @@ -0,0 +1,9 @@ +#ifndef __types_hh_ +#define __types_hh_ + +#include +#include + +typedef unsigned long long id_t; + +#endif \ No newline at end of file diff --git a/libs/rwl.cc b/libs/rwl.cc new file mode 100644 index 0000000000000000000000000000000000000000..52ef1b6fa90a63df5e62823ca3eeb13de790cf99 --- /dev/null +++ b/libs/rwl.cc @@ -0,0 +1,5 @@ +#include "../includes/rwl.hh" + +namespace rwl{ + +};