* 發布第1.8.8版;

* 修復某些情況下窗口尺寸和位置異常的缺陷;
        * 修復handle_event函數在某些情況下越界訪問數組event_handlers的缺陷;
        * 修復clear_wm函數未檢查xic和xim是否爲空指針的缺陷;
        * 修復定位器無法打開運行輸入框的缺陷;
        * dock類型的窗口不再加窗口裝飾;
        * 修改尺寸調整步進值;
        * 修改默認的窗口間距;
        * 修改所新打開的網絡瀏覽器的網址;
        * 代碼重構。
This commit is contained in:
gsm 2023-02-12 17:48:15 +08:00
parent 95831e2ffa
commit 9c8c9965b6
48 changed files with 324 additions and 221 deletions

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* AUTHORS開發者列表。
* 版權 (C) 2020-2022 gsm <406643764@qq.com>
* 版權 (C) 2020-2023 gsm <406643764@qq.com>
* 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
* GNU通用公共許可證重新發布、修改本程序。
* 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* ChangeLog面向開發者的變更日志。
* 版權 (C) 2020-2022 gsm <406643764@qq.com>
* 版權 (C) 2020-2023 gsm <406643764@qq.com>
* 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
* GNU通用公共許可證重新發布、修改本程序。
* 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特
@ -9,6 +9,18 @@
* <http://www.gnu.org/licenses/>。
* ************************************************************************/
2023年 02月 12日 星期日 17:39:55 CST gsm <406643764@qq.com>
* 發布第1.8.8版;
* 修復某些情況下窗口尺寸和位置異常的缺陷;
* 修復handle_event函數在某些情況下越界訪問數組event_handlers的缺陷
* 修復clear_wm函數未檢查xic和xim是否爲空指針的缺陷
* 修復定位器無法打開運行輸入框的缺陷;
* dock類型的窗口不再加窗口裝飾
* 修改尺寸調整步進值;
* 修改默認的窗口間距;
* 修改所新打開的網絡瀏覽器的網址;
* 代碼重構。
2022年 12月 08日 星期四 18:03:56 CST gsm <406643764@qq.com>
* 發布第1.8.7版;
* 修復未初始化wm_hint的缺陷

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* INSTALL安裝和卸載指南。
* 版權 (C) 2020-2022 gsm <406643764@qq.com>
* 版權 (C) 2020-2023 gsm <406643764@qq.com>
* 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
* GNU通用公共許可證重新發布、修改本程序。
* 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特

View File

@ -1,6 +1,6 @@
# *************************************************************************
# Makefile軟件包根目錄下的總控Makefile文件。
# 版權 (C) 2020-2022 gsm <406643764@qq.com>
# 版權 (C) 2020-2023 gsm <406643764@qq.com>
# 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
# GNU通用公共許可證重新發布、修改本程序。
# 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特

11
NEWS
View File

@ -1,6 +1,6 @@
/* *************************************************************************
* NEWS面向用戶的開發新聞。
* 版權 (C) 2020-2022 gsm <406643764@qq.com>
* 版權 (C) 2020-2023 gsm <406643764@qq.com>
* 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
* GNU通用公共許可證重新發布、修改本程序。
* 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特
@ -9,6 +9,15 @@
* <http://www.gnu.org/licenses/>。
* ************************************************************************/
第1.8.8版:
* 修復某些情況下窗口尺寸和位置異常的缺陷;
* 修復某些情況下崩潰的缺陷;
* 修復定位器無法打開運行輸入框的缺陷;
* dock類型的窗口不再加窗口裝飾
* 修改尺寸調整步進值;
* 修改默認的窗口間距;
* 修改所新打開的網絡瀏覽器的網址。
第1.8.7版:
* 修復離開某些窗口時出現錯誤提示的缺陷;
* 修復某些情況下光標形狀異常的缺陷;

4
README
View File

@ -1,6 +1,6 @@
/* *************************************************************************
* README說明文件。
* 版權 (C) 2020-2022 gsm <406643764@qq.com>
* 版權 (C) 2020-2023 gsm <406643764@qq.com>
* 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
* GNU通用公共許可證重新發布、修改本程序。
* 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特
@ -12,7 +12,7 @@
配置方法修改config.h文件。
安裝方法請參閱INSTALL。
使用方法詳見gwm(1)。安裝之後用man gwm命令來查看手冊。
軟件首頁https://sourceforge.net/projects/gsmwm/。
軟件首頁https://sourceforge.net/projects/gsmwm/
漏洞報告406643764@qq.com。
作者詳見AUTHORS。
捐助提交gwm的缺陷反饋、功能建議、補丁就是對gwm最大的捐助當然對於捐款這

2
THANKS
View File

@ -1,6 +1,6 @@
/* *************************************************************************
* THANKS鳴謝。
* 版權 (C) 2020-2022 gsm <406643764@qq.com>
* 版權 (C) 2020-2023 gsm <406643764@qq.com>
* 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
* GNU通用公共許可證重新發布、修改本程序。
* 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特

7
TODO
View File

@ -1,6 +1,6 @@
/* *************************************************************************
* TODO開發計劃。
* 版權 (C) 2020-2022 gsm <406643764@qq.com>
* 版權 (C) 2020-2023 gsm <406643764@qq.com>
* 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
* GNU通用公共許可證重新發布、修改本程序。
* 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特
@ -9,6 +9,11 @@
* <http://www.gnu.org/licenses/>。
* ************************************************************************/
第1.8.8版的下一步的開發計劃:
* 繼續完善臨時窗口相關功能;
* 修改響應聚焦請求的邏輯;
* 手冊頁改爲按功能分類。
第1.8.7版的下一步的開發計劃:
* 繼續完善臨時窗口相關功能。

View File

@ -1,6 +1,6 @@
# *************************************************************************
# Makefile調用當前子目錄下的Makefile文件。
# 版權 (C) 2020-2022 gsm <406643764@qq.com>
# 版權 (C) 2020-2023 gsm <406643764@qq.com>
# 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
# GNU通用公共許可證重新發布、修改本程序。
# 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特

View File

@ -1,6 +1,6 @@
# *************************************************************************
# Makefile調用當前子目錄下的Makefile文件。
# 版權 (C) 2020-2022 gsm <406643764@qq.com>
# 版權 (C) 2020-2023 gsm <406643764@qq.com>
# 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
# GNU通用公共許可證重新發布、修改本程序。
# 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特

View File

@ -1,6 +1,6 @@
# *************************************************************************
# Makefile執行當前目錄下與man1手冊頁相關的任務。
# 版權 (C) 2020-2022 gsm <406643764@qq.com>
# 版權 (C) 2020-2023 gsm <406643764@qq.com>
# 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
# GNU通用公共許可證重新發布、修改本程序。
# 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特

View File

@ -1,6 +1,6 @@
./" *************************************************************************
./" gwm.1gwm(1)手冊頁。
./" 版權 (C) 2020-2022 gsm <406643764@qq.com>
./" 版權 (C) 2020-2023 gsm <406643764@qq.com>
./" 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
./" GNU通用公共許可證重新發布、修改本程序。
./" 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特
@ -8,7 +8,7 @@
./" 你應該已經收到一份附隨此程序的GNU通用公共許可證副本。否則請參閱
./" <http://www.gnu.org/licenses/>。
./" ************************************************************************/
.TH gwm 1 2022年12月 "gwm 1.8.7" gwm
.TH gwm 1 2023年2月 "gwm 1.8.8" gwm
.
.SH 名稱
gwm \- gwmgsm's window manager是一個用C語言編寫的基於X11的動態窗口管理器。
@ -508,6 +508,6 @@ gwm啓動後會立即嘗試執行~/.config/gwm/autostart.sh。
.
.SH 版權
.
版權 \(co 2020-2022 gsm <406643764@qq.com>。
版權 \(co 2020-2023 gsm <406643764@qq.com>。
.br
本程序為自由軟件你可以依據自由軟件基金會所發布的第三版或更高版本的GNU通用公共許可證重新發布、修改本程序。

View File

@ -1,6 +1,6 @@
# *************************************************************************
# Makefile執行與源代碼相關的任務。
# 版權 (C) 2020-2022 gsm <406643764@qq.com>
# 版權 (C) 2020-2023 gsm <406643764@qq.com>
# 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
# GNU通用公共許可證重新發布、修改本程序。
# 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* client.cX client相關功能
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使
@ -22,9 +22,13 @@
static void apply_rules(WM *wm, Client *c);
static bool have_rule(Rule *r, Client *c);
static void set_default_pos(WM *wm, Client *c, XWindowAttributes *a);
static void set_default_size(WM *wm, Client *c, XWindowAttributes *a);
static void fix_size_by_hint(Client *c);
void set_win_rect_by_attr(WM *wm, Client *c);
static void fix_win_pos(WM *wm, Client *c);
static bool fix_win_pos_by_hint(Client *c);
static void fix_win_pos_by_prop(WM *wm, Client *c);
static void fix_win_pos_by_screen(WM *wm, Client *c);
static void fix_win_size(WM *wm, Client *c);
static void fix_win_size_by_screen(WM *wm, Client *c);
static void frame_client(WM *wm, Client *c);
static Rect get_button_rect(Client *c, size_t index);
static Rect get_frame_rect(Client *c);
@ -47,7 +51,7 @@ void add_client(WM *wm, Window win)
apply_rules(wm, c);
add_client_node(get_area_head(wm, c->area_type), c);
fix_area_type(wm);
set_default_rect(wm, c);
set_default_win_rect(wm, c);
frame_client(wm, c);
if(c->area_type == ICONIFY_AREA)
iconify(wm, c);
@ -69,8 +73,11 @@ static void apply_rules(WM *wm, Client *c)
|| type != wm->ewmh_atom[_NET_WM_WINDOW_TYPE_NORMAL]
|| state == wm->ewmh_atom[_NET_WM_STATE_MODAL])
c->area_type=FLOATING_AREA;
c->border_w=BORDER_WIDTH;
c->title_bar_h=TITLE_BAR_HEIGHT;
if(type != wm->ewmh_atom[_NET_WM_WINDOW_TYPE_DOCK])
{
c->border_w=BORDER_WIDTH;
c->title_bar_h=TITLE_BAR_HEIGHT;
}
c->desktop_mask=get_desktop_mask(wm->cur_desktop);
c->class_hint.res_class=c->class_hint.res_name=NULL, c->class_name="?";
if(XGetClassHint(wm->display, c->win, &c->class_hint))
@ -124,32 +131,51 @@ void fix_area_type(WM *wm)
}
}
void set_default_rect(WM *wm, Client *c)
void set_default_win_rect(WM *wm, Client *c)
{
set_win_rect_by_attr(wm, c);
fix_win_size(wm, c);
fix_win_pos(wm, c);
}
void set_win_rect_by_attr(WM *wm, Client *c)
{
XWindowAttributes a={0, 0, wm->screen_width/4, wm->screen_height/4};
XGetWindowAttributes(wm->display, c->win, &a);
set_default_size(wm, c, &a);
set_default_pos(wm, c, &a);
c->x=a.x, c->y=a.y, c->w=a.width, c->h=a.height;
}
static void set_default_pos(WM *wm, Client *c, XWindowAttributes *a)
static void fix_win_pos(WM *wm, Client *c)
{
if(!fix_win_pos_by_hint(c))
fix_win_pos_by_prop(wm, c), fix_win_pos_by_screen(wm, c);
}
static bool fix_win_pos_by_hint(Client *c)
{
XSizeHints *p=&c->size_hint;
c->x=p->x, c->y=p->y;
if((p->flags & USPosition))
return;
c->x=p->x, c->y=p->y;
return (p->flags & USPosition);
}
static void fix_win_pos_by_prop(WM *wm, Client *c)
{
Client *oc;
// 爲了避免有符號整數與無符號整數之間的運算帶來符號問題
long w=c->w, h=c->h, bw=c->border_w, bh=c->title_bar_h,
sw=wm->screen_width, sh=wm->screen_height, th=wm->taskbar.h;
if(!(p->flags & PPosition))
c->x=a->x, c->y=a->y;
int w=c->w, h=c->h, bh=c->title_bar_h, sw=wm->screen_width, sh=wm->screen_height;
if((oc=win_to_client(wm, get_transient_for(wm, c->win))))
c->x=oc->x+(oc->w-w)/2, c->y=oc->y+(oc->h-h)/2;
if( get_atom_prop(wm, c->win, wm->ewmh_atom[_NET_WM_WINDOW_TYPE])
== wm->ewmh_atom[_NET_WM_WINDOW_TYPE_DIALOG])
c->x=(sw-w)/2, c->y=(sh-h-bh)/2+bh;
}
static void fix_win_pos_by_screen(WM *wm, Client *c)
{
// 爲了避免有符號整數與無符號整數之間的運算帶來符號問題
int w=c->w, h=c->h, bw=c->border_w, bh=c->title_bar_h,
sw=wm->screen_width, sh=wm->screen_height, th=wm->taskbar.h;
if(c->x >= sw-w-bw)
c->x=sw-w-bw;
if(c->x < bw)
@ -160,45 +186,19 @@ static void set_default_pos(WM *wm, Client *c, XWindowAttributes *a)
c->y=bw+bh;
}
static void set_default_size(WM *wm, Client *c, XWindowAttributes *a)
static void fix_win_size(WM *wm, Client *c)
{
fix_win_size_by_hint(c);
fix_win_size_by_screen(wm, c);
}
static void fix_win_size_by_screen(WM *wm, Client *c)
{
unsigned int sw=wm->screen_width, sh=wm->screen_height, th=wm->taskbar.h;
XSizeHints *p=&c->size_hint;
if(p->width && p->height)
c->w=p->width, c->h=p->height;
else
c->w=a->width, c->h=a->height;
if(c->w+2*c->border_w > sw)
c->w=sw-2*c->border_w;
if(c->h+c->title_bar_h+2*c->border_w > sh-th)
c->h=sh-th-c->title_bar_h-2*c->border_w;
c->w=p->base_width+get_client_col(wm, c)*p->width_inc;
c->h=p->base_height+get_client_row(wm, c)*p->height_inc;
fix_size_by_hint(c);
}
static void fix_size_by_hint(Client *c)
{
XSizeHints *p=&c->size_hint;
if(p->min_width && c->w<p->min_width)
c->w=p->min_width;
if(p->min_height && c->h<p->min_height)
c->h=p->min_height;
if(p->max_width && c->w>p->max_width)
c->w=p->max_width;
if(p->max_height && c->h>p->max_height)
c->h=p->max_height;
if(p->min_aspect.x && p->min_aspect.y)
{
float mina=(float)p->min_aspect.x/p->min_aspect.y,
maxa=(float)p->max_aspect.x/p->max_aspect.y;
if((float)c->w/c->h < mina)
c->h=c->w*mina+0.5;
else if((float)c->w/c->h > maxa)
c->w=c->h*maxa+0.5;
}
}
static void frame_client(WM *wm, Client *c)

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* client.hclient.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使
@ -15,7 +15,7 @@
void add_client(WM *wm, Window win);
void add_client_node(Client *head, Client *c);
void fix_area_type(WM *wm);
void set_default_rect(WM *wm, Client *c);
void set_default_win_rect(WM *wm, Client *c);
void create_title_bar(WM *wm, Client *c);
Rect get_title_area_rect(WM *wm, Client *c);
unsigned int get_typed_clients_n(WM *wm, Area_type type);

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* color.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* color.hcolor.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* config.hgwm的配置文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使
@ -45,7 +45,6 @@
#define DEFAULT_N_MAIN_MAX 1 // 默認的主區域最大窗口數量
#define AUTOSTART "~/.config/gwm/autostart.sh" // 在gwm剛啓動時執行的腳本
#define CMD_CENTER_COL 4 // 操作中心按鈕列數
#define MOVE_RESIZE_INC 8 // 移動窗口、調整窗口尺寸的步進值,單位爲像素。僅當窗口未有效設置尺寸特性時才使用它。
#define DEFAULT_FONT_PIXEL_SIZE 24 // 默認字體大小,單位爲像素
#define TITLE_FONT_PIXEL_SIZE DEFAULT_FONT_PIXEL_SIZE // 標題欄的字體大小,單位爲像素
@ -59,7 +58,7 @@
#define TITLE_BAR_HEIGHT ROUND(TITLE_FONT_PIXEL_SIZE*4/3.0) // 窗口標題欄的高度,單位爲像素
#define TITLE_BUTTON_WIDTH TITLE_BAR_HEIGHT // 窗口按鈕的寬度,單位爲像素
#define TITLE_BUTTON_HEIGHT TITLE_BUTTON_WIDTH // 窗口按鈕的高度,單位爲像素
#define WIN_GAP BORDER_WIDTH // 窗口間隔,單位爲像素
#define WIN_GAP (BORDER_WIDTH*2) // 窗口間隔,單位爲像素
#define STATUS_AREA_WIDTH_MAX TASKBAR_FONT_PIXEL_SIZE*30 // 任務欄狀態區域的最大寬度
#define TASKBAR_HEIGHT ROUND(TASKBAR_FONT_PIXEL_SIZE*4/3.0) // 狀態欄的高度,單位爲像素
#define TASKBAR_BUTTON_WIDTH TASKBAR_FONT_PIXEL_SIZE*2 // 任務欄按鈕的寬度,單位爲像素
@ -74,6 +73,7 @@
#define RUN_CMD_ENTRY_WIDTH (ENTRY_FONT_PIXEL_SIZE*15+ENTRY_TEXT_INDENT*2) // 運行命令的輸入構件的寬度,單位爲像素
#define RUN_CMD_ENTRY_HEIGHT ROUND(ENTRY_FONT_PIXEL_SIZE*4/3.0) // 運行命令的輸入構件的寬度,單位爲像素
#define HINT_WIN_LINE_HEIGHT ROUND(HINT_FONT_PIXEL_SIZE*4/3.0) // 提示窗口的行高度,單位爲像素
#define RESIZE_INC DEFAULT_FONT_PIXEL_SIZE // 調整尺寸的步進值,單位爲像素。當應用於窗口時,僅當窗口未有效設置尺寸特性時才使用它。
#define RUN_CMD_ENTRY_HINT L"請輸入命令,然後按回車執行"
#define DEFAULT_FONT_NAME "monospace:pixelsize="TO_STR(DEFAULT_FONT_PIXEL_SIZE) // 默認字體名
@ -178,7 +178,7 @@
#define HELP "lxterminal -e 'man gwm' || xfce4-terminal -e 'man gwm' || xterm -e 'man gwm'"
#define FILE_MANAGER "xdg-open ~"
#define BROWSER "xdg-open http:"
#define BROWSER "xdg-open http://bing.com"
#define TERMINAL "lxterminal || xfce4-terminal || gnome-terminal || konsole5 || xterm"
#define VOLUME_DOWN "amixer -q sset Master 10%-"
#define VOLUME_UP "amixer -q sset Master 10%+"

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* desktop.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* desktop.hdesktop.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* drawable.cX可畫物相關功能
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* drawable.hdrawable.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* entry.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* entry.hentry.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* font.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* font.hfont.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* func.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使
@ -29,9 +29,13 @@
static bool is_match_button_release(WM *wm, XEvent *oe, XEvent *ne);
static bool is_valid_click(WM *wm, XEvent *oe, XEvent *ne);
static Delta_rect get_key_delta_rect(Client *c, Direction dir);
static bool is_prefer_move_resize(WM *wm, Client *c, Delta_rect *d);
static bool fix_move_resize(WM *wm, Client *c, Delta_rect *d);
static void do_valid_pointer_move_resize(WM *wm, Client *c, Move_info *m, Pointer_act act, bool is_resize);
static void do_valid_pointer_move_resize(WM *wm, Client *c, Move_info *m, Pointer_act act);
static bool fix_move_resize_delta_rect(WM *wm, Client *c, Delta_rect *d, bool is_move);
static bool is_prefer_move(WM *wm, Client *c, Delta_rect *d, bool is_move);
static bool fix_delta_rect_for_nonprefer_size(Client *c, XSizeHints *hint, Delta_rect *d);
static void fix_dw_by_width_hint(int w, XSizeHints *hint, int *dw);
static void fix_dh_by_height_hint(int h, XSizeHints *hint, int *dh);
static bool fix_delta_rect_for_prefer_size(Client *c, XSizeHints *hint, int dw, int dh, Delta_rect *d);
static void update_hint_win_for_resize(WM *wm, Client *c);
static Delta_rect get_pointer_delta_rect(const Move_info *m, Pointer_act act);
@ -101,11 +105,13 @@ void key_move_resize_client(WM *wm, XEvent *e, Func_arg arg)
{
if(DESKTOP(wm).cur_layout==TILE || DESKTOP(wm).cur_layout==STACK)
{
Direction dir=arg.direction;
bool is_move = (dir==UP || dir==DOWN || dir==LEFT || dir==RIGHT);
Client *c=DESKTOP(wm).cur_focus_client;
Delta_rect d=get_key_delta_rect(c, arg.direction);
Delta_rect d=get_key_delta_rect(c, dir);
if(c->area_type!=FLOATING_AREA && DESKTOP(wm).cur_layout==TILE)
move_client(wm, c, get_area_head(wm, FLOATING_AREA), FLOATING_AREA);
if(is_prefer_move_resize(wm, c, &d) || fix_move_resize(wm, c, &d))
if(fix_move_resize_delta_rect(wm, c, &d, is_move))
{
move_resize_client(wm, c, &d);
update_hint_win_for_resize(wm, c);
@ -147,43 +153,6 @@ static Delta_rect get_key_delta_rect(Client *c, Direction dir)
return dr[dir];
}
static bool is_prefer_move_resize(WM *wm, Client *c, Delta_rect *d)
{
return ( ((!d->dw && !d->dh)
&& is_on_screen(wm, c->x+d->dx, c->y+d->dy, c->w+d->dw, c->h+d->dh))
|| is_prefer_resize(wm, c, d));
}
static bool fix_move_resize(WM *wm, Client *c, Delta_rect *d)
{
XSizeHints *p=&c->size_hint;
long w=c->w, h=c->h, cw=w, ch=h, dw=d->dw, dh=d->dh;
if((dw || dh) && (!is_prefer_size(w, h, p) || !is_prefer_aspect(w, h, p)))
{
if(p->min_width)
w=cw=MAX(cw, p->min_width);
if(p->min_height)
h=ch=MAX(ch, p->min_height);
if(p->max_width)
w=cw=MIN(cw, p->max_width);
if(p->max_height)
h=ch=MIN(ch, p->max_height);
if(dw)
for(w=p->base_width; ;w+=p->width_inc)
if(is_prefer_size(w, ch, p) && is_prefer_aspect(w, ch, p))
break;
if(dh)
for(h=p->base_height; ;h+=p->height_inc)
if(is_prefer_size(w, h, p) && is_prefer_aspect(w, h, p))
break;
d->dw=w-cw, d->dh=h-ch;
// 修正尺寸時,應確保尺寸變化方向上鄰近光標的邊與光標的間距基本不變
d->dx = d->dx ? d->dx : -d->dw, d->dy = d->dy ? d->dy : -d->dh;
return true;
}
return false;
}
void quit_wm(WM *wm, XEvent *e, Func_arg arg)
{
clear_wm(wm);
@ -238,7 +207,7 @@ void adjust_main_area_ratio(WM *wm, XEvent *e, Func_arg arg)
Desktop *d=&DESKTOP(wm);
double mr=d->main_area_ratio+arg.change_ratio, fr=d->fixed_area_ratio;
int mw=mr*wm->screen_width, sw=wm->screen_width*(1-fr)-mw;
if(sw>=MOVE_RESIZE_INC && mw>=MOVE_RESIZE_INC)
if(sw>=RESIZE_INC && mw>=RESIZE_INC)
{
d->main_area_ratio=mr;
update_layout(wm);
@ -254,7 +223,7 @@ void adjust_fixed_area_ratio(WM *wm, XEvent *e, Func_arg arg)
Desktop *d=&DESKTOP(wm);
double fr=d->fixed_area_ratio+arg.change_ratio, mr=d->main_area_ratio;
int mw=wm->screen_width*(mr-arg.change_ratio), fw=wm->screen_width*fr;
if(mw>=MOVE_RESIZE_INC && fw>=MOVE_RESIZE_INC)
if(mw>=RESIZE_INC && fw>=RESIZE_INC)
{
d->main_area_ratio-=arg.change_ratio, d->fixed_area_ratio=fr;
update_layout(wm);
@ -326,7 +295,7 @@ void pointer_move_resize_client(WM *wm, XEvent *e, Func_arg arg)
move_client(wm, c, get_area_head(wm, FLOATING_AREA), FLOATING_AREA);
/* 因X事件是異步的故xmotion.x和ev.xmotion.y可能不是連續變化 */
m.nx=ev.xmotion.x, m.ny=ev.xmotion.y;
do_valid_pointer_move_resize(wm, c, &m, act, arg.resize);
do_valid_pointer_move_resize(wm, c, &m, act);
}
else
handle_event(wm, &ev);
@ -335,19 +304,18 @@ void pointer_move_resize_client(WM *wm, XEvent *e, Func_arg arg)
XUnmapWindow(wm->display, wm->hint_win);
}
static void do_valid_pointer_move_resize(WM *wm, Client *c, Move_info *m, Pointer_act act, bool is_resize)
static void do_valid_pointer_move_resize(WM *wm, Client *c, Move_info *m, Pointer_act act)
{
bool fix;
Delta_rect d=get_pointer_delta_rect(m, act);
if(is_prefer_move_resize(wm, c, &d) || (fix=fix_move_resize(wm, c, &d)))
if(fix_move_resize_delta_rect(wm, c, &d, act==MOVE))
{
move_resize_client(wm, c, &d);
update_hint_win_for_resize(wm, c);
if(is_resize)
if(act != MOVE)
{
if(!fix && d.dw) // dx爲0表示定位器從窗口右邊調整尺寸非0則表示左邊調整
if(d.dw) // dx爲0表示定位器從窗口右邊調整尺寸非0則表示左邊調整
m->ox = d.dx ? m->ox-d.dw : m->ox+d.dw;
if(!fix && d.dh) // dy爲0表示定位器從窗口下邊調整尺寸非0則表示上邊調整
if(d.dh) // dy爲0表示定位器從窗口下邊調整尺寸非0則表示上邊調整
m->oy = d.dy ? m->oy-d.dh : m->oy+d.dh;
}
else
@ -355,10 +323,80 @@ static void do_valid_pointer_move_resize(WM *wm, Client *c, Move_info *m, Pointe
}
}
static bool fix_move_resize_delta_rect(WM *wm, Client *c, Delta_rect *d, bool is_move)
{
if( is_prefer_move(wm, c, d, is_move)
|| fix_delta_rect_for_nonprefer_size(c, &c->size_hint, d))
return true;
int dw=d->dw, dh=d->dh;
fix_dw_by_width_hint(c->w, &c->size_hint, &dw);
fix_dh_by_height_hint(c->w, &c->size_hint, &dh);
return fix_delta_rect_for_prefer_size(c, &c->size_hint, dw, dh, d);
}
static bool is_prefer_move(WM *wm, Client *c, Delta_rect *d, bool is_move)
{
return (is_move && is_on_screen(wm, c->x+d->dx, c->y+d->dy, c->w, c->h));
}
static bool fix_delta_rect_for_nonprefer_size(Client *c, XSizeHints *hint, Delta_rect *d)
{
if((d->dw || d->dh) && !is_prefer_size(c->w, c->h, hint)) // 首次調整尺寸時才要考慮爲偏好而修正尺寸
{
int ox=c->x, oy=c->y, ow=c->w, oh=c->h;
fix_win_size_by_hint(c);
d->dx=c->x-ox, d->dy=c->y-oy, d->dw=(int)c->w-ow, d->dh=(int)c->h-oh;
c->x=ox, c->y=oy, c->w=ow, c->h=oh;
return true;
}
return false;
}
static void fix_dw_by_width_hint(int w, XSizeHints *hint, int *dw)
{
if(*dw/hint->width_inc)
{
int max=MAX(hint->width_inc, hint->min_width);
*dw=base_n_floor(*dw, hint->width_inc);
if(w+*dw < max)
*dw=max-w;
}
else
*dw=0;
}
static void fix_dh_by_height_hint(int h, XSizeHints *hint, int *dh)
{
if(*dh/hint->height_inc)
{
int max=MAX(hint->height_inc, hint->min_height);
*dh=base_n_floor(*dh, hint->height_inc);
if(h+*dh < max)
*dh=max-h;
}
else
*dh=0;
}
static bool fix_delta_rect_for_prefer_size(Client *c, XSizeHints *hint, int dw, int dh, Delta_rect *d)
{
if((dw || dh) && is_prefer_size(c->w+dw, c->h+dh, hint))
{
d->dw=dw, d->dh=dh;
if(d->dx)
d->dx=-dw;
if(d->dy)
d->dy=-dh;
return true;
}
return false;
}
static void update_hint_win_for_resize(WM *wm, Client *c)
{
char str[BUFSIZ];
unsigned int w=get_client_col(wm, c), h=get_client_row(wm, c);
unsigned int w=get_client_col(c), h=get_client_row(c);
sprintf(str, "(%d, %d) %ux%u", c->x, c->y, w, h);
get_string_size(wm, wm->font[HINT_FONT], str, &w, NULL);
int x=(wm->screen_width-w)/2, y=(wm->screen_height-HINT_WIN_LINE_HEIGHT)/2;
@ -430,7 +468,7 @@ void adjust_layout_ratio(WM *wm, XEvent *e, Func_arg arg)
if(ev.type == MotionNotify)
{
nx=ev.xmotion.x, dx=nx-ox;
if(abs(dx)>=MOVE_RESIZE_INC && change_layout_ratio(wm, ox, nx))
if(abs(dx)>=RESIZE_INC && change_layout_ratio(wm, ox, nx))
update_layout(wm), ox=nx;
}
else

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* func.hfunc.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* grab.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* grab.hgrab.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* gwm.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* gwm.hgwm.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使
@ -23,7 +23,7 @@
#include "config.h"
#define ICCCM_NAMES (const char *[]) {"WM_PROTOCOLS", "WM_DELETE_WINDOW", "WM_TAKE_FOCUS"}
#define EWMH_NAME (const char *[]) {"_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_NORMAL", "_NET_WM_WINDOW_TYPE_DIALOG", "_NET_WM_STATE", "_NET_WM_STATE_MODAL", "_NET_WM_ICON"}
#define EWMH_NAME (const char *[]) {"_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_NORMAL", "_NET_WM_WINDOW_TYPE_DIALOG", "_NET_WM_WINDOW_TYPE_DOCK", "_NET_WM_STATE", "_NET_WM_STATE_MODAL", "_NET_WM_ICON"}
#define MIN(a, b) ((a)<(b) ? (a) : (b))
#define MAX(a, b) ((a)>(b) ? (a) : (b))
@ -195,6 +195,7 @@ typedef enum icccm_atom_tag Icccm_atom;
enum ewmh_atom_tag // EWMH規範的標識符
{
_NET_WM_WINDOW_TYPE, _NET_WM_WINDOW_TYPE_NORMAL, _NET_WM_WINDOW_TYPE_DIALOG,
_NET_WM_WINDOW_TYPE_DOCK,
_NET_WM_STATE, _NET_WM_STATE_MODAL, _NET_WM_ICON, EWMH_ATOM_N
};
typedef enum ewmh_atom_tag Ewmh_atom;
@ -341,9 +342,9 @@ struct rule_tag // 窗口管理器的規則
};
typedef struct rule_tag Rule;
struct move_info_tag /* 定位器舊、新坐標信息 */
struct move_info_tag /* 定位器所點擊的窗口位置每次合理移動或調整尺寸所對應的舊、新坐標信息 */
{
int ox, oy, nx, ny; /* 分別爲定位器舊、新坐標 */
int ox, oy, nx, ny; /* 分別爲舊、新坐標 */
};
typedef struct move_info_tag Move_info;

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* handler.cX事件處理功能
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使
@ -80,7 +80,7 @@ void handle_event(WM *wm, XEvent *e)
[PropertyNotify] = handle_property_notify,
[SelectionNotify] = handle_selection_notify,
};
if(event_handlers[e->type])
if(e->type<ARRAY_NUM(event_handlers) && event_handlers[e->type])
event_handlers[e->type](wm, e);
}
@ -102,7 +102,7 @@ static void handle_button_press(WM *wm, XEvent *e)
}
if(type != CMD_CENTER_ITEM)
XUnmapWindow(wm->display, wm->cmd_center.win);
if(type != RUN_CMD_ENTRY)
if(type!=RUN_CMD_ENTRY && type!=RUN_BUTTON)
XUnmapWindow(wm->display, wm->run_cmd.win);
}

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* handler.hhandler.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* hint.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使
@ -12,19 +12,20 @@
#include "gwm.h"
#include "client.h"
#include "drawable.h"
#include "misc.h"
#include "hint.h"
static bool is_prefer_width_inc(unsigned int w, int dw, XSizeHints *hint);
static bool is_prefer_height_inc(unsigned int h, int dh, XSizeHints *hint);
static int get_fixed_width_inc(unsigned int w, XSizeHints *hint);
static int get_fixed_height_inc(unsigned int h, XSizeHints *hint);
static void fix_limit_size_hint(XSizeHints *h);
static bool is_prefer_width(unsigned int w, XSizeHints *hint);
static bool is_prefer_height(unsigned int h, XSizeHints *hint);
static bool is_prefer_aspect(unsigned int w, unsigned int h, XSizeHints *hint);
unsigned int get_client_col(WM *wm, Client *c)
unsigned int get_client_col(Client *c)
{
return (c->w-c->size_hint.base_width)/c->size_hint.width_inc;
}
unsigned int get_client_row(WM *wm, Client *c)
unsigned int get_client_row(Client *c)
{
return (c->h-c->size_hint.base_height)/c->size_hint.height_inc;
}
@ -55,68 +56,90 @@ void update_size_hint(WM *wm, Client *c)
if(!minh && baseh)
hint.min_height=baseh;
if(!hint.width_inc)
hint.width_inc=MOVE_RESIZE_INC;
hint.width_inc=RESIZE_INC;
if(!hint.height_inc)
hint.height_inc=MOVE_RESIZE_INC;
hint.height_inc=RESIZE_INC;
fix_limit_size_hint(&hint);
c->size_hint=hint;
}
SET_DEF_VAL(c->size_hint.width_inc, MOVE_RESIZE_INC);
SET_DEF_VAL(c->size_hint.height_inc, MOVE_RESIZE_INC);
SET_DEF_VAL(c->size_hint.width_inc, RESIZE_INC);
SET_DEF_VAL(c->size_hint.height_inc, RESIZE_INC);
}
bool is_prefer_resize(WM *wm, Client *c, Delta_rect *d)
// 有的窗口最大、最小尺寸設置不正確需要修正lxterminal
static void fix_limit_size_hint(XSizeHints *h)
{
int minw_incs=base_n_ceil(h->min_width-h->base_width, h->width_inc),
minh_incs=base_n_ceil(h->min_height-h->base_height, h->height_inc),
maxw_incs=base_n_floor(h->max_width-h->base_width, h->width_inc),
maxh_incs=base_n_floor(h->max_height-h->base_height, h->height_inc);
h->min_width=h->base_width+minw_incs;
h->min_height=h->base_height+minh_incs;
h->max_width=h->base_width+maxw_incs;
h->max_height=h->base_height+maxh_incs;
}
void fix_win_size_by_hint(Client *c)
{
XSizeHints *p=&c->size_hint;
long cw=c->w, ch=c->h, dw=d->dw, dh=d->dh, w=cw+dw, h=ch+dh;
return (w>=MOVE_RESIZE_INC && h>=MOVE_RESIZE_INC
&& (is_prefer_width_inc(cw, dw, p) || is_prefer_height_inc(ch, dh, p))
&& is_prefer_size(w, h, p) && is_prefer_aspect(w, h, p));
}
static bool is_prefer_width_inc(unsigned int w, int dw, XSizeHints *hint)
{
return !hint->width_inc || abs(dw)>=abs(get_fixed_width_inc(w, hint));
}
static bool is_prefer_height_inc(unsigned int h, int dh, XSizeHints *hint)
{
return !hint->height_inc || abs(dh)>=abs(get_fixed_height_inc(h, hint));
}
static int get_fixed_width_inc(unsigned int w, XSizeHints *hint)
{
int inc=MOVE_RESIZE_INC;
if(hint->base_width)
inc=(w-hint->base_width)%hint->width_inc;
else if(hint->min_width)
inc=(w-hint->min_width)%hint->width_inc;
return inc ? inc : hint->width_inc;
}
static int get_fixed_height_inc(unsigned int h, XSizeHints *hint)
{
int inc=MOVE_RESIZE_INC;
if(hint->base_height)
inc=(h-hint->base_height)%hint->height_inc;
else if(hint->min_height)
inc=(h-hint->min_height)%hint->height_inc;
return inc ? inc : hint->height_inc;
c->w = (p->flags & USSize) && p->width ?
p->width : p->base_width+get_client_col(c)*p->width_inc;
c->h = (p->flags & USSize) && p->height ?
p->height : p->base_height+get_client_row(c)*p->height_inc;
if((p->flags & PMinSize) && p->min_width)
c->w=MAX(c->w, p->min_width);
if((p->flags & PMinSize) && p->min_height)
c->h=MAX(c->h, p->min_height);
if((p->flags & PMaxSize) && p->max_width)
c->w=MIN(c->w, p->max_width);
if((p->flags & PMaxSize) && p->max_height)
c->h=MIN(c->h, p->max_height);
if( (p->flags & PAspect) && p->min_aspect.x && p->min_aspect.y
&& p->max_aspect.x && p->max_aspect.y)
{
float mina=(float)p->min_aspect.x/p->min_aspect.y,
maxa=(float)p->max_aspect.x/p->max_aspect.y;
if((float)c->w/c->h < mina)
c->h=c->w*mina+0.5;
else if((float)c->w/c->h > maxa)
c->w=c->h*maxa+0.5;
}
}
bool is_prefer_size(unsigned int w, unsigned int h, XSizeHints *hint)
{
return (!hint->min_width || w>=hint->min_width)
&& (!hint->min_height || h>=hint->min_height)
&& (!hint->max_width || w<=hint->max_width)
&& (!hint->max_height || h<=hint->max_height);
return is_prefer_width(w, hint)
&& is_prefer_height(h, hint)
&& is_prefer_aspect(w, h, hint);
}
bool is_prefer_aspect(unsigned int w, unsigned int h, XSizeHints *hint)
static bool is_prefer_width(unsigned int w, XSizeHints *hint)
{
return (!hint->min_aspect.x || !hint->min_aspect.y
long f=0;
return !hint || !(f=hint->flags) ||
( (!(f & PMinSize) || w>=hint->min_width)
&& (!(f & PMaxSize) || w<=hint->max_width)
&& (!(f & PBaseSize) || !(f & PResizeInc) || !hint->width_inc
|| (w-hint->base_width)%hint->width_inc == 0));
}
static bool is_prefer_height(unsigned int h, XSizeHints *hint)
{
long f=0;
return !hint || !(f=hint->flags) ||
( (!(f & PMinSize) || h>=hint->min_height)
&& (!(f & PMaxSize) || h<=hint->max_height)
&& (!(f & PBaseSize) || !(f & PResizeInc) || !hint->height_inc
|| (h-hint->base_height)%hint->height_inc == 0));
}
static bool is_prefer_aspect(unsigned int w, unsigned int h, XSizeHints *hint)
{
return !hint || !(hint->flags & PAspect) || !w || !h
|| !hint->min_aspect.x || !hint->min_aspect.y
|| !hint->max_aspect.x || !hint->max_aspect.y
|| ( (float)w/h >= (float)hint->min_aspect.x/hint->min_aspect.y
&& (float)w/h <= (float)hint->max_aspect.x/hint->max_aspect.y));
|| ( (float)w/h >= (float)hint->min_aspect.x/hint->min_aspect.y
&& (float)w/h <= (float)hint->max_aspect.x/hint->max_aspect.y);
}
void set_input_focus(WM *wm, XWMHints *hint, Window win)

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* hint.hhint.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使
@ -12,12 +12,12 @@
#ifndef HINT_H
#define HINT_H
unsigned int get_client_col(WM *wm, Client *c);
unsigned int get_client_row(WM *wm, Client *c);
unsigned int get_client_col(Client *c);
unsigned int get_client_row(Client *c);
void update_size_hint(WM *wm, Client *c);
void fix_win_size_by_hint(Client *c);
bool is_prefer_resize(WM *wm, Client *c, Delta_rect *d);
bool is_prefer_size(unsigned int w, unsigned int h, XSizeHints *hint);
bool is_prefer_aspect(unsigned int w, unsigned int h, XSizeHints *hint);
void set_input_focus(WM *wm, XWMHints *hint, Window win);
#endif

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* icon.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* icon.hicon.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* init.cgwm的功能
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* init.hinit.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* layout.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使
@ -176,7 +176,7 @@ static void fix_cur_focus_client_rect(WM *wm)
Client *c=DESKTOP(wm).cur_focus_client;
if( DESKTOP(wm).prev_layout==FULL && c->area_type==FLOATING_AREA
&& (DESKTOP(wm).cur_layout==TILE || DESKTOP(wm).cur_layout==STACK))
set_default_rect(wm, c);
set_default_win_rect(wm, c);
}

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* layout.hlayout.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* menu.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* menu.hmenu.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* misc.c
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使
@ -173,8 +173,11 @@ void clear_wm(WM *wm)
for(size_t i=0; i<POINTER_ACT_N; i++)
XFreeCursor(wm->display, wm->cursors[i]);
XSetInputFocus(wm->display, wm->root_win, RevertToPointerRoot, CurrentTime);
XDestroyIC(wm->run_cmd.xic);
XCloseIM(wm->xim);
if(!wm->run_cmd.xic)puts("wtf xic");
if(wm->run_cmd.xic)
XDestroyIC(wm->run_cmd.xic);
if(wm->xim)
XCloseIM(wm->xim);
close_fonts(wm);
free_files(wm->wallpapers);
XClearWindow(wm->display, wm->root_win);
@ -279,3 +282,13 @@ static void create_file_node(File *head, const char *path, char *filename, bool
file->next=head->next;
head->next=file;
}
int base_n_floor(int x, int n)
{
return x/n*n;
}
int base_n_ceil(int x, int n)
{
return base_n_floor(x, n)+(x%n ? n : 0);
}

View File

@ -1,6 +1,6 @@
/* *************************************************************************
* misc.hmisc.c相應的頭文件
* (C) 2020-2022 gsm <406643764@qq.com>
* (C) 2020-2023 gsm <406643764@qq.com>
*
* GNU通用公共許可證重新發布
* 使
@ -28,5 +28,7 @@ char *copy_strings(const char *s, ...);
File *get_files_in_paths(const char *paths, const char *regex, Order order, bool is_fullname, size_t *n);
void free_files(File *head);
bool regcmp(const char *s, const char *regex);
int base_n_floor(int x, int n);
int base_n_ceil(int x, int n);
#endif

View File

@ -1,6 +1,6 @@
# *************************************************************************
# Makefile執行與輔助工具相關的任務。
# 版權 (C) 2020-2022 gsm <406643764@qq.com>
# 版權 (C) 2020-2023 gsm <406643764@qq.com>
# 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
# GNU通用公共許可證重新發布、修改本程序。
# 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特

View File

@ -2,7 +2,7 @@
# *************************************************************************
# startgwmgwm會話。
# 版權 (C) 2020-2022 gsm <406643764@qq.com>
# 版權 (C) 2020-2023 gsm <406643764@qq.com>
# 本程序為自由軟件:你可以依據自由軟件基金會所發布的第三版或更高版本的
# GNU通用公共許可證重新發布、修改本程序。
# 雖然基于使用目的而發布本程序,但不負任何擔保責任,亦不包含適銷性或特