#include "geom.h"
#include "stacking.h"
#include "window.h"
-#include "render/color.h"
+#include "obrender/color.h"
#include <glib.h>
#include <X11/Xlib.h>
struct _ObFrame;
struct _ObGroup;
struct _ObSessionState;
+struct _ObPrompt;
typedef struct _ObClient ObClient;
-typedef struct _ObClientIcon ObClientIcon;
-
-/*! Holds an icon in ARGB format */
-struct _ObClientIcon
-{
- gint width;
- gint height;
- RrPixel32 *data;
-};
/*! Possible window types */
typedef enum
{
ObWindow obwin;
Window window;
+ gboolean managed;
+
+ /*! If this client is managing an ObPrompt window, then this is set to the
+ prompt */
+ struct _ObPrompt *prompt;
/*! The window's decorations. NULL while the window is being managed! */
struct _ObFrame *frame;
gchar *title;
/*! Window title when iconified */
gchar *icon_title;
+ /*! The title as requested by the client, without any of our own changes */
+ gchar *original_title;
/*! Hostname of machine running the client */
gchar *client_machine;
/*! The command used to run the program. Pre-XSMP window identification. */
Rect pre_max_area;
/*! Position and size of the window prior to being fullscreened */
Rect pre_fullscreen_area;
+ /*! Remember if the window was maximized before going fullscreen */
+ gboolean pre_fullscreen_max_horz,
+ pre_fullscreen_max_vert;
/*! The window's strut
The strut defines areas of the screen that are marked off-bounds for
/*! Indicates if the client is trying to close but has stopped responding
to pings */
gboolean not_responding;
+ /*! A prompt shown when you are trying to close a client that is not
+ responding. It asks if you want to kill the client */
+ struct _ObPrompt *kill_prompt;
/*! We tried to close the window with a SIGTERM */
- gboolean close_tried_term;
+ gint kill_level;
#ifdef SYNC
/*! The client wants to sync during resizes */
/*! The window uses shape extension to be non-rectangular? */
gboolean shaped;
+ /*! The window uses shape extension to have non-rectangular input? */
+ gboolean shaped_input;
/*! The window is modal, so it must be processed before any windows it is
related to can be focused */
*/
guint functions;
- /*! Icons for the client as specified on the client window */
- ObClientIcon *icons;
- /*! The number of icons in icons */
- guint nicons;
+ /* The window's icon, in a variety of shapes and sizes */
+ RrImage *icon_set;
/*! Where the window should iconify to/from */
Rect icon_geometry;
+
+ /*! A boolean used for algorithms which need to mark clients as visited */
+ gboolean visited;
};
extern GList *client_list;
void client_add_destroy_notify(ObClientCallback func, gpointer data);
void client_remove_destroy_notify(ObClientCallback func);
-/*! Manages all existing windows */
-void client_manage_all();
/*! Manages a given window
+ @param prompt This specifies an ObPrompt which is being managed. It is
+ possible to manage Openbox-owned windows through this.
*/
-void client_manage(Window win);
+void client_manage(Window win, struct _ObPrompt *prompt);
/*! Unmanages all managed windows */
-void client_unmanage_all();
+void client_unmanage_all(void);
/*! Unmanages a given client */
void client_unmanage(ObClient *client);
void client_fake_unmanage(ObClient *self);
/*! Sets the client list on the root window from the client_list */
-void client_set_list();
+void client_set_list(void);
/*! Determines if the client should be shown or hidden currently.
@return TRUE if it should be visible; otherwise, FALSE.
/*! Activates the client for use, focusing, uniconifying it, etc. To be used
when the user deliberately selects a window for use.
- @param here If true, then the client is brought to the current desktop;
- otherwise, the desktop is changed to where the client lives.
+ @param desktop If true, and the window is on another desktop, it will still
+ be activated.
+ @param here If true, and the window is on another desktop, it will be moved
+ to the current desktop, otherwise the desktop will switch to
+ where the window is.
@param raise If true, the client is brought to the front.
@param unshade If true, the client is unshaded (if it is shaded)
@param user If true, then a user action is what requested the activation;
otherwise, it means an application requested it on its own
*/
-void client_activate(ObClient *self, gboolean here, gboolean raise,
- gboolean unshade, gboolean user);
+void client_activate(ObClient *self, gboolean desktop, gboolean here,
+ gboolean raise, gboolean unshade, gboolean user);
/*! Bring all of its helper windows to its desktop. These are the utility and
stuff windows. */
/*! Sets the window's type and transient flag */
void client_get_type_and_transientness(ObClient *self);
+/*! Gets the motif wm hints */
+void client_get_mwm_hints(ObClient *self);
-const ObClientIcon *client_icon(ObClient *self, gint w, gint h);
+/*! Returns a client's icon set, or its parents (recursively) if it doesn't
+ have one
+*/
+RrImage* client_icon(ObClient *self);
/*! Return TRUE if the client is transient for some other window. Return
FALSE if it's not transient or there is no window for it to be
transient for */
gboolean client_has_parent(ObClient *self);
-/*! Searches a client's direct parents for a focused window. The function does
- not check for the passed client, only for *ONE LEVEL* of its parents.
- If no focused parentt is found, NULL is returned.
+/*! Searches a client's immediate parents for a focused window. The function
+ does not check for the passed client, only for *ONE LEVEL* of its parents.
+ If no focused parent is found, NULL is returned.
*/
ObClient *client_search_focus_parent(ObClient *self);
+/*! Searches a client's parents for a focused window. The function
+ does not check for the passed client, but searches through all of its
+ parents. If no focused parent is found, NULL is returned.
+*/
+ObClient *client_search_focus_parent_full(ObClient *self);
+
/*! Searches a client's transients for a focused window. The function does not
check for the passed client, only for its transients.
If no focused transient is found, NULL is returned.
*/
ObClient *client_search_top_direct_parent(ObClient *self);
-/*! Is one client a direct child of another (i.e. not through the group.) */
+/*! Is one client a direct child of another (i.e. not through the group.)
+ This checks more than one level, so there may be another direct child in
+ between */
gboolean client_is_direct_child(ObClient *parent, ObClient *child);
/*! Search for a parent of a client. This only searches up *ONE LEVEL*, and
guint client_monitor(ObClient *self);
-ObClient* client_under_pointer();
+ObClient* client_under_pointer(void);
gboolean client_has_group_siblings(ObClient *self);
+/*! Returns TRUE if the client is running on the same machine as Openbox */
+gboolean client_on_localhost(ObClient *self);
+
#endif