555 lines
17 KiB
C
555 lines
17 KiB
C
/*****************************************************************************/
|
|
/* Enlightenment - The Window Manager that dares to do what others don't */
|
|
/*****************************************************************************/
|
|
/*
|
|
* Copyright (C) 2000-2007 Carsten Haitzler, Geoff Harrison and various contributors
|
|
* Copyright (C) 2004-2022 Kim Woelders
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to
|
|
* deal in the Software without restriction, including without limitation the
|
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
* sell copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies of the Software, its documentation and marketing & publicity
|
|
* materials, and acknowledgment shall be given in the documentation, materials
|
|
* and software packages that this Software was used.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
#include "config.h"
|
|
|
|
#include "alert.h"
|
|
#include "edebug.h"
|
|
#include "lang.h"
|
|
#include "sounds.h"
|
|
#include "util.h"
|
|
#include "xtypes.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
|
|
#define FILEPATH_LEN_MAX 4096
|
|
|
|
#ifndef MAX
|
|
#define MAX(a,b) ((a)>(b)?(a):(b))
|
|
#endif
|
|
#ifndef MIN
|
|
#define MIN(a,b) ((a)<(b)?(a):(b))
|
|
#endif
|
|
|
|
#define IN_RANGE(a, b, range) \
|
|
((((a) > (b)) && ((a) - (b) <= (range))) || \
|
|
(((a) <= (b)) && ((b) - (a) <= (range))))
|
|
|
|
#define IN_ABOVE(a, b, range) \
|
|
(((a) >= (b)) && ((a) - (b) <= (range)))
|
|
|
|
#define IN_BELOW(a, b, range) \
|
|
(((a) <= (b)) && ((b) - (a) <= (range)))
|
|
|
|
#define SPANS_COMMON(x1, w1, x2, w2) \
|
|
(!((((x2) + (w2)) <= (x1)) || ((x2) >= ((x1) + (w1)))))
|
|
|
|
#define STATE_NORMAL 0
|
|
#define STATE_HILITED 1
|
|
#define STATE_CLICKED 2
|
|
#define STATE_DISABLED 3
|
|
|
|
#define FLAG_BUTTON 0
|
|
#define FLAG_TITLE 1
|
|
#define FLAG_MINIICON 2
|
|
#define FLAG_FIXED 4
|
|
#define FLAG_FIXED_HORIZ 8
|
|
#define FLAG_FIXED_VERT 16
|
|
|
|
#define MODE_FOCUS_POINTER 0
|
|
#define MODE_FOCUS_SLOPPY 1
|
|
#define MODE_FOCUS_CLICK 2
|
|
|
|
#define EDGE_FLIP_OFF 0
|
|
#define EDGE_FLIP_ON 1
|
|
#define EDGE_FLIP_MOVE 2
|
|
|
|
#define DOCK_LEFT 0
|
|
#define DOCK_RIGHT 1
|
|
#define DOCK_UP 2
|
|
#define DOCK_DOWN 3
|
|
|
|
#define ICON_LEFT 0
|
|
#define ICON_RIGHT 1
|
|
#define ICON_UP 2
|
|
#define ICON_DOWN 3
|
|
|
|
#define MODE_NONE 0
|
|
#define MODE_MOVE_PENDING 1
|
|
#define MODE_MOVE 2
|
|
#define MODE_RESIZE 3
|
|
#define MODE_RESIZE_H 4
|
|
#define MODE_RESIZE_V 5
|
|
#define MODE_DESKDRAG 6
|
|
#define MODE_BUTTONDRAG 7
|
|
#define MODE_DESKRAY 8
|
|
#define MODE_PAGER_DRAG_PENDING 9
|
|
#define MODE_PAGER_DRAG 10
|
|
|
|
#define EVENT_MOUSE_DOWN 0
|
|
#define EVENT_MOUSE_UP 1
|
|
#define EVENT_MOUSE_ENTER 2
|
|
#define EVENT_MOUSE_LEAVE 3
|
|
#define EVENT_KEY_DOWN 4
|
|
#define EVENT_KEY_UP 5
|
|
#define EVENT_DOUBLE_DOWN 6
|
|
#define EVENT_FOCUS_IN 7
|
|
#define EVENT_FOCUS_OUT 8
|
|
|
|
/* Server extensions */
|
|
#define XEXT_SHAPE 0
|
|
#define XEXT_XINERAMA 1
|
|
#define XEXT_SYNC 2
|
|
#define XEXT_SCRSAVER 3
|
|
#define XEXT_RANDR 4
|
|
#define XEXT_COMPOSITE 5
|
|
#define XEXT_DAMAGE 6
|
|
#define XEXT_FIXES 7
|
|
#define XEXT_RENDER 8
|
|
#define XEXT_GLX 9
|
|
#define XEXT_XI 10
|
|
#define XEXT_PRESENT 11
|
|
|
|
#define XEXT_CM_ALL 16
|
|
|
|
#define XEXT_AVAILABLE(ext) (Mode.server.extensions & (1 << ext))
|
|
|
|
int ExtVersion(int ext_ix);
|
|
|
|
/*
|
|
* Types
|
|
*/
|
|
#include "etypes.h"
|
|
|
|
/* Configuration parameters */
|
|
typedef struct {
|
|
struct {
|
|
unsigned int step; /* Animation time step, ms */
|
|
} animation;
|
|
struct {
|
|
char enable;
|
|
int delay; /* milliseconds */
|
|
} autoraise;
|
|
struct {
|
|
char hiquality;
|
|
char user;
|
|
char no_scan;
|
|
int timeout;
|
|
} backgrounds;
|
|
struct {
|
|
int move_resistance;
|
|
} buttons;
|
|
struct {
|
|
unsigned int num;
|
|
int dragdir;
|
|
int dragbar_width;
|
|
int dragbar_length;
|
|
int dragbar_ordering;
|
|
char desks_wraparound;
|
|
char slidein;
|
|
int slidespeed;
|
|
int areas_nx;
|
|
int areas_ny;
|
|
char areas_wraparound;
|
|
int edge_flip_mode;
|
|
int edge_flip_resistance;
|
|
} desks;
|
|
struct {
|
|
char headers;
|
|
char button_image;
|
|
} dialogs;
|
|
struct {
|
|
char enable; /* wmdockapp only */
|
|
char sticky; /* Make dockapps sticky by default */
|
|
int dirmode;
|
|
int startx;
|
|
int starty;
|
|
} dock;
|
|
struct {
|
|
int mode;
|
|
int clickraises;
|
|
char transientsfollowleader;
|
|
char switchfortransientmap;
|
|
char all_new_windows_get_focus;
|
|
char new_windows_get_focus_if_group_focused;
|
|
char new_transients_get_focus;
|
|
char new_transients_get_focus_if_group_focused;
|
|
char raise_on_next;
|
|
char warp_on_next;
|
|
char warp_always;
|
|
} focus;
|
|
struct {
|
|
char set_xroot_info_on_root_window;
|
|
} hints;
|
|
struct {
|
|
char dest;
|
|
char difftime;
|
|
} log;
|
|
struct {
|
|
int zoom_res;
|
|
} magwin;
|
|
struct {
|
|
char animate;
|
|
char onscreen;
|
|
char warp;
|
|
char show_icons;
|
|
int icon_size;
|
|
struct {
|
|
EX_KeySym left, right, up, down, escape, ret;
|
|
} key;
|
|
} menus;
|
|
struct {
|
|
int mode_move;
|
|
int mode_resize;
|
|
int mode_info;
|
|
int mode_maximize_default;
|
|
unsigned int color;
|
|
char avoid_server_grab;
|
|
char update_while_moving;
|
|
char enable_sync_request;
|
|
char dragbar_nocover;
|
|
char enable_smart_max_hv;
|
|
char maximize_animate;
|
|
int maximize_speed;
|
|
} movres;
|
|
struct {
|
|
int movres;
|
|
int menus;
|
|
int tooltips;
|
|
int focused;
|
|
int unfocused;
|
|
} opacity;
|
|
struct {
|
|
char manual;
|
|
char manual_mouse_pointer;
|
|
char center_if_desk_full;
|
|
char ignore_struts;
|
|
char ignore_struts_fullscreen;
|
|
char ignore_struts_maximize;
|
|
char raise_fullscreen;
|
|
char slidein;
|
|
char cleanupslide;
|
|
int slidemode;
|
|
int slidespeedmap;
|
|
int slidespeedcleanup;
|
|
#ifdef USE_XINERAMA_no /* Not implemented */
|
|
char extra_head; /* Not used */
|
|
#endif
|
|
} place;
|
|
struct {
|
|
char enable_script;
|
|
char *script;
|
|
char enable_logout_dialog;
|
|
char enable_reboot_halt;
|
|
char *cmd_reboot;
|
|
char *cmd_halt;
|
|
} session;
|
|
struct {
|
|
char animate;
|
|
int speed;
|
|
} shading;
|
|
struct {
|
|
char enable;
|
|
int edge_snap_dist;
|
|
int screen_snap_dist;
|
|
} snap;
|
|
struct {
|
|
char firsttime;
|
|
char animate;
|
|
} startup;
|
|
struct {
|
|
char use_theme_font_cfg;
|
|
char use_alt_font_cfg;
|
|
char *name;
|
|
char *extra_path;
|
|
char *font_cfg;
|
|
} theme;
|
|
struct {
|
|
char enable;
|
|
char showsticky;
|
|
char showshaded;
|
|
char showiconified;
|
|
char showalldesks;
|
|
char warpfocused;
|
|
char raise_on_select;
|
|
char warp_on_select;
|
|
char show_shape;
|
|
int icon_mode;
|
|
} warplist;
|
|
|
|
struct {
|
|
char argb_internal_objects;
|
|
char argb_internal_clients;
|
|
char argb_clients;
|
|
char argb_clients_inherit_attr;
|
|
int image_cache_size;
|
|
int ximage_cache_count;
|
|
int mask_alpha_threshold;
|
|
char enable_startup_id;
|
|
char use_render_for_scaling;
|
|
char bindings_reload;
|
|
unsigned int no_sync_mask;
|
|
} testing;
|
|
|
|
char autosave;
|
|
char memory_paranoia;
|
|
char save_under;
|
|
} EConf;
|
|
|
|
typedef struct {
|
|
struct {
|
|
unsigned int startup_id;
|
|
} apps;
|
|
struct {
|
|
char force_scan;
|
|
unsigned int mini_w, mini_h;
|
|
} backgrounds;
|
|
struct {
|
|
char *name;
|
|
char *prefix;
|
|
char *dir;
|
|
char *cache_dir;
|
|
} conf;
|
|
struct {
|
|
char dummy; /* Prevent empty struct */
|
|
#if USE_XSYNC
|
|
EX_ID server_time;
|
|
#endif
|
|
} display;
|
|
struct {
|
|
unsigned int seqn; /* Event run sequence number */
|
|
unsigned int time_ms; /* Local ms time */
|
|
EX_Time time; /* Latest X event time */
|
|
int cx, cy; /* Any detected pointer movement */
|
|
int mx, my; /* Motion event */
|
|
int px, py; /* Previous motion event */
|
|
EX_Time last_btime;
|
|
EX_Window last_bpress;
|
|
EX_Window last_bpress2;
|
|
unsigned int last_button;
|
|
unsigned int last_keycode;
|
|
unsigned int last_keystate;
|
|
unsigned int serial;
|
|
char block;
|
|
char double_click;
|
|
char on_screen;
|
|
#if USE_COMPOSITE
|
|
unsigned int damage_count;
|
|
#endif
|
|
#if USE_XI2
|
|
unsigned char xi2_ptr;
|
|
unsigned char xi2_kbd;
|
|
#endif
|
|
} events;
|
|
struct {
|
|
char pointer_grab_active;
|
|
EX_Window pointer_grab_window;
|
|
} grabs;
|
|
struct {
|
|
const char *lang;
|
|
char utf8_int; /* Use UTF-8 internally */
|
|
char utf8_loc; /* Locale is UTF-8 */
|
|
} locale;
|
|
struct {
|
|
unsigned int mod_key_mask;
|
|
unsigned int mod_combos[8];
|
|
} masks;
|
|
struct {
|
|
signed char enable_features;
|
|
EWin *doing_manual;
|
|
} place;
|
|
struct {
|
|
int w_old;
|
|
int h_old;
|
|
short fps;
|
|
#ifdef USE_XRANDR
|
|
unsigned short rotation;
|
|
#endif
|
|
} screen;
|
|
struct {
|
|
unsigned int extensions;
|
|
} server;
|
|
struct {
|
|
EX_Pixmap ext_pmap;
|
|
char ext_pmap_valid;
|
|
} root;
|
|
struct {
|
|
char *paths;
|
|
char *path;
|
|
char *variant;
|
|
} theme;
|
|
struct {
|
|
char *exec_name; /* argv[0] */
|
|
char master; /* We are the master E */
|
|
char single; /* No slaves */
|
|
char window; /* Running in virtual root window */
|
|
pid_t pid;
|
|
int master_screen;
|
|
char session_start;
|
|
char startup;
|
|
char restart;
|
|
char exiting;
|
|
char in_signal_handler;
|
|
char exit_now;
|
|
char save_ok;
|
|
char coredump;
|
|
int win_x, win_y, win_w, win_h;
|
|
int exit_mode;
|
|
char *exit_param;
|
|
int child_count;
|
|
pid_t *children;
|
|
char *machine_name;
|
|
} wm;
|
|
int mode;
|
|
int op_source;
|
|
EWin *focuswin;
|
|
EWin *mouse_over_ewin;
|
|
EWin *context_ewin;
|
|
EX_Colormap current_cmap;
|
|
Win context_win;
|
|
char constrained;
|
|
char nogroup;
|
|
char showing_desktop;
|
|
EX_Window button_proxy_win;
|
|
char firsttime;
|
|
char debug_exit;
|
|
} EMode;
|
|
|
|
/*
|
|
* Function prototypes
|
|
*/
|
|
|
|
/* about.c */
|
|
void About(void);
|
|
|
|
/* config.c */
|
|
#define FILE_TYPE_CONFIG 0
|
|
#define FILE_TYPE_BACKGROUND 1
|
|
#define FILE_TYPE_IMAGE 1
|
|
#define FILE_TYPE_CURSOR 1
|
|
#define FILE_TYPE_SOUND 1
|
|
#define FILE_TYPE_MENU 2
|
|
#define FILE_TYPE_ICON 3
|
|
void SkipTillEnd(FILE * ConfigFile);
|
|
char *GetLine(char *s, int size, FILE * f);
|
|
int ConfigParseline1(char *str, char *s2, char **p2, char **p3);
|
|
void ConfigParseError(const char *where, const char *line);
|
|
void ConfigAlertLoad(const char *txt);
|
|
char *FindFile(const char *file, const char *themepath, int type);
|
|
char *ThemeFileFind(const char *file, int type);
|
|
int ConfigFileLoad(const char *name, const char *themepath,
|
|
int (*parse)(FILE * fs), int preparse);
|
|
int ConfigFileRead(FILE * fs);
|
|
int ThemeConfigLoad(void);
|
|
|
|
/* dialog.c */
|
|
#if ENABLE_DIALOGS
|
|
void __PRINTF_2__ DialogOK(const char *title, const char *fmt, ...);
|
|
void DialogOKstr(const char *title, const char *txt);
|
|
#else
|
|
#define DialogOK(title, fmt, ...) do {} while(0)
|
|
#define DialogOKstr(title, fmt) do {} while(0)
|
|
#endif /* ENABLE_DIALOGS */
|
|
|
|
/* draw.c (move to moveresize.h?) */
|
|
/* Move/resize modes */
|
|
#define MR_OPAQUE 0
|
|
#define MR_TECHNICAL 1
|
|
#define MR_BOX 2
|
|
#if 0 /* Obsolete */
|
|
#define MR_SHADED 3
|
|
#define MR_SEMI_SOLID 4
|
|
#define MR_TRANSLUCENT 5
|
|
#endif
|
|
#define MR_TECH_OPAQUE 6
|
|
|
|
int MoveResizeModeValidateMove(int md);
|
|
int MoveResizeModeValidateResize(int md);
|
|
|
|
/* econfig.c */
|
|
void ConfigurationLoad(void);
|
|
void ConfigurationSave(void);
|
|
void ConfigurationSet(const char *params);
|
|
void ConfigurationShow(const char *params);
|
|
|
|
/* edge.c */
|
|
void EdgeCheckMotion(int x, int y);
|
|
void EdgeWindowsShow(void);
|
|
void EdgeWindowsHide(void);
|
|
|
|
/* extinitwin.c */
|
|
EX_Window ExtInitWinCreate(void);
|
|
void ExtInitWinSet(EX_Window win);
|
|
EX_Window ExtInitWinGet(void);
|
|
void ExtInitWinKill(void);
|
|
|
|
/* fonts.c */
|
|
void FontConfigLoad(void);
|
|
void FontConfigUnload(void);
|
|
const char *FontLookup(const char *name);
|
|
|
|
/* handlers.c */
|
|
void SignalsSetup(void);
|
|
void SignalsRestore(void);
|
|
|
|
/* main.c */
|
|
__NORETURN__ void EExit(int exitcode);
|
|
|
|
#define EDirRoot() ENLIGHTENMENT_ROOT
|
|
#define EDirBin() ENLIGHTENMENT_BIN
|
|
#define EDirLib() ENLIGHTENMENT_LIB
|
|
#define EDirUserConf() Mode.conf.dir
|
|
#define EDirUserCache() Mode.conf.cache_dir
|
|
#define EGetSavePrefix() Mode.conf.prefix
|
|
|
|
void Etmp(char *s);
|
|
|
|
/* mod-misc.c */
|
|
void autosave(void);
|
|
|
|
/* regex.c */
|
|
int matchregexp(const char *rx, const char *s);
|
|
|
|
/* setup.c */
|
|
void SetupX(const char *dstr);
|
|
|
|
/* slideouts.c */
|
|
int SlideoutsConfigLoad(FILE * fs);
|
|
|
|
/* startup.c */
|
|
void StartupWindowsCreate(void);
|
|
void StartupWindowsOpen(void);
|
|
void StartupBackgroundsDestroy(void);
|
|
|
|
/* theme.c */
|
|
char *ThemePathFind(const char *theme);
|
|
char *ThemePathName(const char *path);
|
|
void ThemeFind(const char *theme);
|
|
char **ThemesList(int *num);
|
|
|
|
/*
|
|
* Global vars
|
|
*/
|
|
extern const char e_wm_name[];
|
|
extern const char e_wm_version[];
|
|
extern EConf Conf;
|
|
extern EMode Mode;
|