374 lines
8.3 KiB
C
374 lines
8.3 KiB
C
|
#include "config.h"
|
||
|
|
||
|
#include <assert.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#include <sys/time.h>
|
||
|
|
||
|
#include <X11/Xlib.h>
|
||
|
#include <X11/Intrinsic.h>
|
||
|
|
||
|
#ifndef FVWM_VERSION
|
||
|
#define FVWM_VERSION 2
|
||
|
#endif
|
||
|
|
||
|
#ifdef COMPILE_STANDALONE
|
||
|
#include "fvwmlib.h"
|
||
|
#else
|
||
|
#include "../../libs/fvwmlib.h"
|
||
|
#endif
|
||
|
|
||
|
#if HAVE_SYS_SELECT_H
|
||
|
#include <sys/select.h>
|
||
|
#endif
|
||
|
|
||
|
#include "debug.h"
|
||
|
|
||
|
#ifndef DEFAULT_ACTION
|
||
|
#define DEFAULT_ACTION "Iconify"
|
||
|
#endif
|
||
|
|
||
|
#define RECTANGLES_INTERSECT(x1,y1,w1,h1,x2,y2,w2,h2) \
|
||
|
(((x1) + (w1) > (x2) && (x1) < (x2) + (w2)) && \
|
||
|
((y1) + (h1) > (y2) && (y1) < (y2) + (h2)))
|
||
|
|
||
|
#define MAX_ARGS 3
|
||
|
|
||
|
#ifdef TRACE_MEMUSE
|
||
|
|
||
|
#define MALLOC_MAGIC 0xdeadbeaf
|
||
|
|
||
|
#define SET_BIT(field,bit) ((field) |= (bit))
|
||
|
#define CLEAR_BIT(field,bit) ((field) &= ~(bit))
|
||
|
|
||
|
#define SET_BIT_TO_VAL(field,bit,val) ((val) ? SET_BIT (field,bit) : CLEAR_BIT (field, bit))
|
||
|
|
||
|
extern long MemUsed;
|
||
|
|
||
|
struct malloc_header {
|
||
|
unsigned long magic, len;
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#ifdef DMALLOC
|
||
|
/* What the heck is this?? */
|
||
|
#include <dmalloc.h>
|
||
|
#endif
|
||
|
|
||
|
extern void PrintMemuse (void);
|
||
|
|
||
|
typedef unsigned long Ulong;
|
||
|
typedef unsigned char Uchar;
|
||
|
|
||
|
typedef signed char Schar;
|
||
|
|
||
|
typedef enum {
|
||
|
SHOW_GLOBAL = 0,
|
||
|
SHOW_DESKTOP = 1,
|
||
|
SHOW_PAGE = 2
|
||
|
} Resolution;
|
||
|
|
||
|
typedef enum {
|
||
|
BUTTON_FLAT,
|
||
|
BUTTON_UP,
|
||
|
BUTTON_DOWN,
|
||
|
BUTTON_EDGEUP,
|
||
|
BUTTON_EDGEDOWN
|
||
|
} ButtonState;
|
||
|
|
||
|
/* The clicks must be the first three elements in this type, X callbacks
|
||
|
depend on it! */
|
||
|
typedef enum {
|
||
|
SELECT,
|
||
|
MOUSE,
|
||
|
KEYPRESS,
|
||
|
NUM_ACTIONS
|
||
|
} Action;
|
||
|
|
||
|
typedef enum {
|
||
|
PLAIN_CONTEXT = 0,
|
||
|
FOCUS_CONTEXT = 1,
|
||
|
SELECT_CONTEXT = 2,
|
||
|
FOCUS_SELECT_CONTEXT = 3, /* had better be FOCUS_CONTEXT | SELECT_CONTEXT */
|
||
|
TITLE_CONTEXT = 4,
|
||
|
NUM_CONTEXTS
|
||
|
} Contexts;
|
||
|
|
||
|
typedef enum {
|
||
|
NO_NAME = 0,
|
||
|
TITLE_NAME = 1,
|
||
|
ICON_NAME = 2,
|
||
|
RESOURCE_NAME = 4,
|
||
|
CLASS_NAME = 8,
|
||
|
ALL_NAME = 15
|
||
|
} NameType;
|
||
|
|
||
|
typedef struct win_list {
|
||
|
int n;
|
||
|
struct win_data *head, *tail;
|
||
|
} WinList;
|
||
|
|
||
|
typedef struct string_list {
|
||
|
NameType type;
|
||
|
char *string;
|
||
|
struct string_list *next;
|
||
|
} StringEl;
|
||
|
|
||
|
typedef struct {
|
||
|
Uchar mask;
|
||
|
StringEl *list;
|
||
|
} StringList;
|
||
|
|
||
|
typedef enum {
|
||
|
NoArg,
|
||
|
IntArg,
|
||
|
StringArg,
|
||
|
ButtonArg,
|
||
|
WindowArg,
|
||
|
ManagerArg,
|
||
|
JmpArg
|
||
|
} BuiltinArgType;
|
||
|
|
||
|
typedef enum {
|
||
|
NoButton,
|
||
|
SelectButton,
|
||
|
FocusButton,
|
||
|
AbsoluteButton,
|
||
|
UpButton,
|
||
|
DownButton,
|
||
|
LeftButton,
|
||
|
RightButton,
|
||
|
NextButton,
|
||
|
PrevButton
|
||
|
} ButtonType; /* doubles for manager too */
|
||
|
|
||
|
typedef struct {
|
||
|
int offset;
|
||
|
ButtonType base;
|
||
|
} ButtonValue;
|
||
|
|
||
|
typedef struct builtin_arg {
|
||
|
BuiltinArgType type;
|
||
|
union {
|
||
|
char *string_value;
|
||
|
ButtonValue button_value;
|
||
|
int int_value;
|
||
|
} value;
|
||
|
} BuiltinArg;
|
||
|
|
||
|
typedef struct Function {
|
||
|
int (*func)(int numargs, BuiltinArg *args);
|
||
|
int numargs;
|
||
|
BuiltinArg args[MAX_ARGS];
|
||
|
struct Function *next;
|
||
|
struct Function *prev;
|
||
|
} Function;
|
||
|
|
||
|
typedef struct Binding
|
||
|
{
|
||
|
char IsMouse; /* Is it a mouse or key binding 1= mouse; */
|
||
|
int Button_Key; /* Mouse Button number of Keycode */
|
||
|
char *key_name; /* In case of keycode, give the key_name too */
|
||
|
int Modifier; /* Modifiers for keyboard state */
|
||
|
char *Action; /* What to do? */
|
||
|
Function *Function;
|
||
|
struct Binding *NextBinding, *LastBinding;
|
||
|
} Binding;
|
||
|
|
||
|
typedef struct win_data {
|
||
|
struct button *button;
|
||
|
/* stuff shadowed in the Button structure */
|
||
|
#ifdef MINI_ICONS
|
||
|
Picture pic;
|
||
|
#endif
|
||
|
char *display_string; /* what gets shown in the manager window */
|
||
|
Uchar iconified, state;
|
||
|
|
||
|
Ulong desknum;
|
||
|
long x, y, width, height;
|
||
|
Ulong app_id;
|
||
|
Ulong fvwm_flags;
|
||
|
char *resname;
|
||
|
char *classname;
|
||
|
char *titlename;
|
||
|
char *iconname;
|
||
|
struct win_data *win_prev, *win_next;
|
||
|
struct win_manager *manager;
|
||
|
int app_id_set : 1;
|
||
|
int geometry_set : 1;
|
||
|
Uchar complete;
|
||
|
} WinData;
|
||
|
|
||
|
typedef struct button {
|
||
|
int index; /* index into button array */
|
||
|
int x, y, w, h; /* current coords of button */
|
||
|
struct {
|
||
|
int dirty_flags;
|
||
|
#ifdef MINI_ICONS
|
||
|
Picture pic;
|
||
|
#endif
|
||
|
WinData *win;
|
||
|
char *display_string;
|
||
|
int x, y, w, h;
|
||
|
Uchar iconified, state;
|
||
|
} drawn_state;
|
||
|
} Button;
|
||
|
|
||
|
typedef struct button_array {
|
||
|
int dirty_flags;
|
||
|
int num_buttons, drawn_num_buttons; /* size of buttons array */
|
||
|
int num_windows, drawn_num_windows; /* number of windows with buttons */
|
||
|
Button **buttons;
|
||
|
} ButtonArray;
|
||
|
|
||
|
typedef enum {
|
||
|
GROW_HORIZ = 1,
|
||
|
GROW_VERT = 2,
|
||
|
GROW_UP = 4,
|
||
|
GROW_DOWN = 8,
|
||
|
GROW_LEFT = 16,
|
||
|
GROW_RIGHT = 32,
|
||
|
GROW_FIXED = 64
|
||
|
} GrowDirection;
|
||
|
|
||
|
typedef struct {
|
||
|
/* Things which we can change go in here.
|
||
|
This like border width go in WinManager */
|
||
|
int x, y, width, height;
|
||
|
int gravity_x, gravity_y; /* anchor point for window's gravity */
|
||
|
int rows, cols;
|
||
|
int boxheight, boxwidth;
|
||
|
GrowDirection dir;
|
||
|
} ManGeometry;
|
||
|
|
||
|
typedef struct {
|
||
|
int num_rects;
|
||
|
XRectangle rects[2];
|
||
|
} ShapeState;
|
||
|
|
||
|
typedef enum {
|
||
|
SortNone, /* no sorting */
|
||
|
SortId, /* sort by window id */
|
||
|
SortName, /* case insensitive name sorting */
|
||
|
SortNameCase /* case sensitive name sorting */
|
||
|
} SortType;
|
||
|
|
||
|
typedef struct win_manager {
|
||
|
unsigned int magic;
|
||
|
int index;
|
||
|
|
||
|
/* .fvwm2rc options or things set as a result of options */
|
||
|
Resolution res;
|
||
|
Pixel backcolor[NUM_CONTEXTS], forecolor[NUM_CONTEXTS];
|
||
|
Pixel hicolor[NUM_CONTEXTS], shadowcolor[NUM_CONTEXTS];
|
||
|
GC hiContext[NUM_CONTEXTS], backContext[NUM_CONTEXTS],
|
||
|
reliefContext[NUM_CONTEXTS];
|
||
|
GC shadowContext[NUM_CONTEXTS], flatContext[NUM_CONTEXTS];
|
||
|
XFontStruct *ButtonFont;
|
||
|
#ifdef MINI_ICONS
|
||
|
int draw_icons;
|
||
|
#endif
|
||
|
int shaped;
|
||
|
StringList show;
|
||
|
StringList dontshow;
|
||
|
Binding *bindings[NUM_ACTIONS];
|
||
|
char *fontname;
|
||
|
char *backColorName[NUM_CONTEXTS];
|
||
|
char *foreColorName[NUM_CONTEXTS];
|
||
|
ButtonState buttonState[NUM_CONTEXTS];
|
||
|
char *geometry_str, *button_geometry_str;
|
||
|
char *titlename, *iconname;
|
||
|
char *formatstring;
|
||
|
NameType format_depend;
|
||
|
Uchar followFocus;
|
||
|
Uchar usewinlist;
|
||
|
SortType sort;
|
||
|
|
||
|
/* X11 state */
|
||
|
Window theWindow, theFrame;
|
||
|
long sizehints_flags;
|
||
|
int gravity;
|
||
|
int fontheight, fontwidth;
|
||
|
int win_title, win_border;
|
||
|
int off_x, off_y;
|
||
|
Uchar cursor_in_window;
|
||
|
Uchar window_up;
|
||
|
Uchar can_draw; /* = 0 until we get our first ConfigureNotify */
|
||
|
|
||
|
/* button state */
|
||
|
int dirty_flags;
|
||
|
ManGeometry geometry, drawn_geometry;
|
||
|
Button *select_button, *focus_button;
|
||
|
Uchar window_mapped, drawn_mapping;
|
||
|
#ifdef SHAPE
|
||
|
ShapeState shape, drawn_shape;
|
||
|
#endif
|
||
|
ButtonArray buttons;
|
||
|
|
||
|
/* Fvwm state */
|
||
|
int we_are_drawing, configures_expected;
|
||
|
} WinManager;
|
||
|
|
||
|
#define MANAGER_EMPTY(man) ((man)->buttons.num_windows == 0)
|
||
|
|
||
|
typedef struct {
|
||
|
Ulong desknum;
|
||
|
Ulong x, y; /* of the view window */
|
||
|
long screenx, screeny; /* screen dimensions */
|
||
|
WinManager *managers;
|
||
|
int num_managers;
|
||
|
int transient;
|
||
|
WinData *focus_win;
|
||
|
WinData *select_win;
|
||
|
int shapes_supported;
|
||
|
int got_window_list;
|
||
|
} GlobalData;
|
||
|
|
||
|
typedef struct {
|
||
|
char *name;
|
||
|
ButtonState state;
|
||
|
char *forecolor[2]; /* 0 is mono, 1 is color */
|
||
|
char *backcolor[2]; /* 0 is mono, 1 is color */
|
||
|
} ContextDefaults;
|
||
|
|
||
|
|
||
|
extern char *contextNames[NUM_CONTEXTS];
|
||
|
|
||
|
extern GlobalData globals;
|
||
|
extern int Fvwm_fd[2];
|
||
|
extern int x_fd;
|
||
|
extern Display *theDisplay;
|
||
|
extern char *Module;
|
||
|
extern int ModuleLen;
|
||
|
extern ContextDefaults contextDefaults[];
|
||
|
|
||
|
extern void ReadFvwmPipe(void);
|
||
|
extern void *Malloc (size_t size);
|
||
|
extern void Free (void *p);
|
||
|
extern void ShutMeDown (int flag) __attribute__ ((__noreturn__));
|
||
|
extern void DeadPipe (int nothing) __attribute__ ((__noreturn__));
|
||
|
extern void SendFvwmPipe(char *message, unsigned long window);
|
||
|
extern char *copy_string (char **target, char *src);
|
||
|
|
||
|
extern void init_globals (void);
|
||
|
extern int allocate_managers (int num);
|
||
|
|
||
|
extern WinData *new_windata (void);
|
||
|
extern void free_windata (WinData *p);
|
||
|
extern int check_win_complete (WinData *p);
|
||
|
extern WinManager *figure_win_manager (WinData *win, Uchar mask);
|
||
|
extern void init_winlists (void);
|
||
|
extern void delete_win_hashtab (WinData *win);
|
||
|
extern void insert_win_hashtab (WinData *win);
|
||
|
extern WinData *find_win_hashtab (Ulong id);
|
||
|
extern void walk_hashtab (void (*func)(void *));
|
||
|
extern int accumulate_walk_hashtab (int (*func)(void *));
|
||
|
extern void print_stringlist (StringList *list);
|
||
|
extern void add_to_stringlist (StringList *list, char *s);
|
||
|
extern void update_window_stuff (WinManager *man);
|
||
|
extern void print_managers (void);
|
||
|
|
||
|
extern WinManager *find_windows_manager (Window win);
|
||
|
extern int win_in_viewport (WinData *win);
|