📄 wlist.c
字号:
/*
* NanoWM - Window Manager for Nano-X
*
* Copyright (C) 2000 Greg Haerr <greg@censoft.com>
* Copyright (C) 2000 Alex Holden <alex@linuxhacker.org>
*/
#include <stdio.h>
#include <stdlib.h>
#define MWINCLUDECOLORS
#include "nano-X.h"
/* Uncomment this to get debugging output from this file */
/*#define DEBUG*/
#include "nanowm.h"
static win *windows = NULL;
/*
* Find the windowlist entry for the specified window ID and return a pointer
* to it, or NULL if it isn't in the list.
*/
win *find_window(GR_WINDOW_ID wid)
{
win *w = windows;
Dprintf("Looking for window %d... ", wid);
while(w) {
Dprintf("%d ", w->wid);
if(w->wid == wid) {
Dprintf("found it!\n");
return w;
}
w = w->next;
}
Dprintf("Nope, %d is not in the list\n", wid);
return NULL;
}
/*
* Add a new entry to the front of the windowlist.
* Returns -1 on failure or 0 on success.
*/
int add_window(win *window)
{
win *w;
Dprintf("Adding window %d\n", window->wid);
if(!(w = malloc(sizeof(win)))) return -1;
w->wid = window->wid;
w->pid = window->pid;
w->type = window->type;
w->sizing = GR_FALSE; /* window->sizing*/
w->active = window->active;
w->clientid = window->clientid;
w->data = window->data;
w->next = windows;
windows = w;
return 0;
}
/*
* Remove an entry from the windowlist.
* We must search through the list for it so that we can find the previous
* entry in the list and fix the next pointer. The alternative is to add a
* prev pointer to the structure which would increase the memory usage.
* Returns -1 on failure or 0 on success.
*/
int remove_window(win *window)
{
win *w = windows;
win *prev = NULL;
while(w) {
if(w == window) {
if(!prev) windows = w->next;
else prev->next = w->next;
if(w->data) free(w->data);
free(w);
return 0;
}
prev = w;
w = w->next;
}
return -1;
}
/*
* Remove an entry and all it's children from the windowlist.
* Returns -1 on failure or 0 on success.
*/
int remove_window_and_children(win *window)
{
win *t, *w = windows;
win *prev = NULL;
GR_WINDOW_ID pid = window->wid;
Dprintf("Removing window %d and children\n", window->wid);
while(w) {
Dprintf("Examining window %d (pid %d)\n", w->wid, w->pid);
if((w->pid == pid) || (w == window)) {
Dprintf("Removing window %d (pid %d)\n", w->wid,
w->pid);
if(prev) prev->next = w->next;
else windows = w->next;
t = w->next;
if(w->data) free(w->data);
free(w);
w = t;
continue;
}
prev = w;
w = w->next;
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -