mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
Copying wm from old ede
This commit is contained in:
313
edewm/Frame.h
Normal file
313
edewm/Frame.h
Normal file
@ -0,0 +1,313 @@
|
||||
// Frame.H
|
||||
|
||||
// Each X window being managed by fltk has one of these
|
||||
|
||||
#ifndef Frame_H
|
||||
#define Frame_H
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "Mwm.h"
|
||||
#include "Icccm.h"
|
||||
|
||||
#include <efltk/Fl.h>
|
||||
#include <efltk/Fl_Window.h>
|
||||
#include <efltk/Fl_Button.h>
|
||||
#include <efltk/Fl_Bitmap.h>
|
||||
#include <efltk/x.h>
|
||||
|
||||
#ifdef SHAPE
|
||||
#include <X11/extensions/shape.h>
|
||||
#endif
|
||||
|
||||
#include <efltk/Fl_Image.h>
|
||||
|
||||
// The state is an enumeration of reasons why the window may be invisible.
|
||||
// Only if it is NORMAL is the window visible.
|
||||
enum {
|
||||
UNMAPPED = 0, // unmap command from app (X calls this WithdrawnState)
|
||||
NORMAL = 1, // window is visible
|
||||
SHADED = 2, // acts like NORMAL
|
||||
ICONIC = 3, // hidden/iconized
|
||||
OTHER_DESKTOP = 4 // normal but on another desktop
|
||||
};
|
||||
|
||||
// values for frame flags:
|
||||
// The flags are constant and are turned on by information learned
|
||||
// from the Gnome, NETWM, and/or Motif window manager hints. edewm will
|
||||
// ignore attempts to change these hints after the window is mapped.
|
||||
enum {
|
||||
NO_FOCUS = 0x00000001, // does not take focus
|
||||
CLICK_TO_FOCUS = 0x00000002, // must click on window to give it focus
|
||||
KEEP_ASPECT = 0x00000004, // aspect ratio from sizeHints
|
||||
|
||||
MODAL = 0x00000008, // grabs focus from transient_for window
|
||||
|
||||
TAKE_FOCUS_PRT = 0x00000010, // send junk when giving window focus
|
||||
DELETE_WIN_PRT = 0x00000020, // close box sends a message
|
||||
|
||||
MAX_VERT = 0x00000100,
|
||||
MAX_HORZ = 0x00000200,
|
||||
STICKY = 0x00000400, // Everyone knows sticky
|
||||
OWNER_HIDDEN = 0x00000800, // Owner of transient is hidden
|
||||
FIXED_POSITION = 0x00001000, // Window is fixed in position even
|
||||
|
||||
SKIP_LIST = 0x00002000, // Not in window list
|
||||
SKIP_FOCUS = 0x00004000 // Skip "Alt+Tab"
|
||||
};
|
||||
|
||||
// values for func and decor flags:
|
||||
enum {
|
||||
// DECOR only:
|
||||
BORDER = 1, // Draw border
|
||||
THIN_BORDER = 2, // Draw thin border
|
||||
TITLEBAR = 4, // Show titlebar
|
||||
SYSMENU = 8, // Show system menu (left on titlebar)
|
||||
|
||||
//FUNC only:
|
||||
MOVE = 16, // Add move action to system menu
|
||||
CLOSE = 32, // Add close action to system menu
|
||||
|
||||
//Common flags:
|
||||
MINIMIZE = 64, // Minimize button and minimize action
|
||||
MAXIMIZE = 128, // Maximize button and maximize action
|
||||
RESIZE = 256 // Resize allowed and resize action
|
||||
};
|
||||
|
||||
// NETWM types
|
||||
enum {
|
||||
TYPE_DESKTOP = 1,
|
||||
TYPE_DOCK,
|
||||
TYPE_TOOLBAR,
|
||||
TYPE_MENU,
|
||||
TYPE_UTIL,
|
||||
TYPE_SPLASH,
|
||||
TYPE_DIALOG,
|
||||
TYPE_NORMAL
|
||||
};
|
||||
|
||||
// values for state_flags:
|
||||
// These change over time
|
||||
enum {
|
||||
IGNORE_UNMAP = 0x01, // we did something that echos an UnmapNotify
|
||||
};
|
||||
|
||||
class Icon;
|
||||
class Desktop;
|
||||
#include "Titlebar.h"
|
||||
|
||||
class Frame : public Fl_Window {
|
||||
friend class Titlebar;
|
||||
friend class ICCCM;
|
||||
friend class MWM;
|
||||
friend class NETWM;
|
||||
|
||||
Titlebar *title;
|
||||
Window window_;
|
||||
|
||||
|
||||
|
||||
|
||||
int wintype; //Type of window (see NETWM types)
|
||||
|
||||
int frame_flags_; // above constant flags
|
||||
short state_; // X server state: iconic, withdrawn, normal
|
||||
short state_flags_; // above state flags
|
||||
short decor_flags_; // Decoration flags from MWM
|
||||
short func_flags_; // Functions flags from MWM
|
||||
|
||||
int restore_x, restore_w; // saved size when min/max width is set
|
||||
int restore_y, restore_h; // saved size when max height is set
|
||||
|
||||
double aspect_min, aspect_max;
|
||||
|
||||
Fl_Rect *strut_;
|
||||
|
||||
MwmHints *mwm_hints;
|
||||
XWMHints *wm_hints;
|
||||
XSizeHints *size_hints;
|
||||
long win_hints;
|
||||
|
||||
Window transient_for_xid; // value from X
|
||||
Frame* transient_for_; // the frame for that xid, if found
|
||||
|
||||
Frame* revert_to; // probably the xterm this was run from
|
||||
|
||||
Colormap colormap; // this window's colormap
|
||||
int colormapWinCount; // list of other windows to install colormaps for
|
||||
Window *colormapWindows;
|
||||
Colormap *window_Colormaps; // their colormaps
|
||||
|
||||
// These are filled if window has icon
|
||||
Icon *icon_;
|
||||
|
||||
Desktop* desktop_;
|
||||
|
||||
int maximize_width();
|
||||
int maximize_height();
|
||||
int force_x_onscreen(int X, int W);
|
||||
int force_y_onscreen(int Y, int H);
|
||||
|
||||
void sendMessage(Atom, Atom) const;
|
||||
|
||||
void send_desktop();
|
||||
void send_configurenotify();
|
||||
void send_state_property();
|
||||
|
||||
void* getProperty(Atom, Atom = AnyPropertyType, unsigned long *length = 0, int *ret=0) const;
|
||||
int getIntProperty(Atom, Atom = AnyPropertyType, int deflt = 0, int *ret = 0) const;
|
||||
void setProperty(Atom, Atom, int) const;
|
||||
void getLabel(bool del = false, Atom from_atom=0);
|
||||
void getColormaps();
|
||||
int getDesktop();
|
||||
|
||||
void updateBorder();
|
||||
void fix_transient_for(); // called when transient_for_xid changes
|
||||
|
||||
void get_protocols();
|
||||
|
||||
void get_wm_hints();
|
||||
void update_wm_hints();
|
||||
|
||||
void get_funcs_from_type();
|
||||
|
||||
void installColormap() const;
|
||||
|
||||
void set_cursor(int);
|
||||
int mouse_location();
|
||||
|
||||
void layout() { Fl_Widget::layout(); }
|
||||
void draw();
|
||||
|
||||
static Frame* active_;
|
||||
void _desktop(Desktop*);
|
||||
|
||||
bool configure_event(const XConfigureRequestEvent *e);
|
||||
bool map_event(const XMapRequestEvent *e);
|
||||
bool unmap_event(const XUnmapEvent *e);
|
||||
bool destroy_event(const XDestroyWindowEvent *e);
|
||||
bool reparent_event(const XReparentEvent *e);
|
||||
bool clientmsg_event(const XClientMessageEvent *e);
|
||||
bool colormap_event(const XColormapEvent *e);
|
||||
bool property_event(const XPropertyEvent *e);
|
||||
bool visibility_event(const XVisibilityEvent *e);
|
||||
bool shape_event(const XShapeEvent *e);
|
||||
|
||||
public:
|
||||
bool shaped;
|
||||
bool get_shape();
|
||||
|
||||
int offset_x, offset_y, offset_w, offset_h;
|
||||
void set_size(int x, int y, int w, int h);
|
||||
|
||||
int frame_flags() const { return frame_flags_; }
|
||||
short decor_flags() const { return decor_flags_; }
|
||||
short func_flags() const { return func_flags_; }
|
||||
short state_flags() const { return state_flags_; }
|
||||
|
||||
bool frame_flag(int i) { return ((frame_flags_&i)==i) ? true : false; }
|
||||
void set_frame_flag(int i) { frame_flags_ |= i; }
|
||||
void clear_frame_flag(int i) { frame_flags_ &=~i; }
|
||||
void clear_frame_flags() { frame_flags_ = 0; }
|
||||
|
||||
bool decor_flag(short i) { return ((decor_flags_&i)==i) ? true : false; }
|
||||
void set_decor_flag(short i) { decor_flags_ |= i; }
|
||||
void clear_decor_flag(short i) { decor_flags_ &=~i; }
|
||||
void clear_decor_flags() { decor_flags_ = 0; }
|
||||
|
||||
bool func_flag(short i) { return ((func_flags_&i)==i) ? true : false; }
|
||||
void set_func_flag(short i) { func_flags_ |= i; }
|
||||
void clear_func_flag(short i) { func_flags_ &=~i; }
|
||||
void clear_func_flags() { func_flags_ = 0; }
|
||||
|
||||
bool state_flag(short i) { return ((state_flags_&i)==i) ? true : false; }
|
||||
void set_state_flag(short i) { state_flags_ |= i; }
|
||||
void clear_state_flag(short i) { state_flags_ &=~i; }
|
||||
void clear_state_flags() { state_flags_ = 0; }
|
||||
|
||||
void cb_button_close(Fl_Button*);
|
||||
void cb_button_kill(Fl_Button*);
|
||||
void cb_button_max(Fl_Button*);
|
||||
void cb_button_min(Fl_Button*);
|
||||
|
||||
int handle(int e); // handle fltk events
|
||||
int handle(const XEvent *e);
|
||||
void handle_move(int &nx, int &ny);
|
||||
|
||||
void window_type(int t) { wintype=t; }
|
||||
int window_type() { return wintype; }
|
||||
|
||||
Frame(Window, XWindowAttributes* = 0);
|
||||
~Frame();
|
||||
|
||||
void destroy_frame();
|
||||
|
||||
void settings_changed();
|
||||
static void settings_changed_all();
|
||||
|
||||
Fl_Rect *strut() { return strut_; }
|
||||
Icon *icon() { return icon_; }
|
||||
|
||||
Window window() const {return window_;}
|
||||
Frame* transient_for() const {return transient_for_;}
|
||||
int is_transient_for(const Frame*) const;
|
||||
|
||||
Desktop* desktop() const {return desktop_;}
|
||||
void desktop(Desktop*);
|
||||
static void desktop(Window wid, int desktop);
|
||||
|
||||
// Wm calls this, when user clicks inside frames
|
||||
void content_click();
|
||||
|
||||
// Raises and put window top of stack
|
||||
void raise();
|
||||
static void raise(Window wid);
|
||||
|
||||
// Lowers and put window back of stack
|
||||
void lower();
|
||||
|
||||
void iconize();
|
||||
void maximize();
|
||||
void restore();
|
||||
|
||||
void throw_focus(int destructor = 0);
|
||||
|
||||
// Closes window with given protocol, if theres no protocol we just kill it
|
||||
static void close(Window wid);
|
||||
void close();
|
||||
void kill();
|
||||
|
||||
// returns true if it actually sets active state(focus)
|
||||
bool activate();
|
||||
bool activate_if_transient();
|
||||
void deactivate();
|
||||
|
||||
// Get or set new state, handles iconizing, mapping and unmapping!
|
||||
short state() const {return state_;}
|
||||
void state(short newstate); // don't call this unless you know what you are doing!
|
||||
|
||||
int active() const {return active_==this;}
|
||||
static Frame* activeFrame() {return active_;}
|
||||
|
||||
static bool do_opaque;
|
||||
static bool focus_follows_mouse;
|
||||
|
||||
static bool animate;
|
||||
static int animate_speed;
|
||||
|
||||
bool maximized;
|
||||
};
|
||||
|
||||
// handy wrappers for those ugly X routines:
|
||||
extern void* getProperty(Window, Atom, Atom = AnyPropertyType, unsigned long* length = 0, int *ret=0);
|
||||
extern int getIntProperty(Window, Atom, Atom = AnyPropertyType, int deflt = 0, int *ret=0);
|
||||
extern void setProperty(Window, Atom, Atom, int);
|
||||
|
||||
extern void draw_overlay(int x, int y, int w, int h);
|
||||
void clear_overlay();
|
||||
|
||||
static inline int max(int a, int b) {return a > b ? a : b;}
|
||||
static inline int min(int a, int b) {return a < b ? a : b;}
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user