X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.h;h=f1b8c885b182efd15c9d9132bdbe1b36584aa12f;hb=56b01b73a808ccf51991a0aeb5362d5eb6bbfaaa;hp=f9a194831a3b4da8666d81d83960ff3f4da0aff5;hpb=cdb108c76d20e8272bfbd15919e32e609d685322;p=chaz%2Fopenbox diff --git a/openbox/client.h b/openbox/client.h index f9a19483..f1b8c885 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -35,7 +35,6 @@ struct _ObSessionState; typedef struct _ObClient ObClient; typedef struct _ObClientIcon ObClientIcon; -typedef struct _ObAppSettings ObAppSettings; /* The value in client.transient_for indicating it is a transient for its group instead of for a single window */ @@ -71,13 +70,15 @@ typedef enum OB_CLIENT_FUNC_MAXIMIZE = 1 << 3, /*!< Allow to be maximized */ OB_CLIENT_FUNC_SHADE = 1 << 4, /*!< Allow to be shaded */ OB_CLIENT_FUNC_FULLSCREEN = 1 << 5, /*!< Allow to be made fullscreen */ - OB_CLIENT_FUNC_CLOSE = 1 << 6 /*!< Allow to be closed */ + OB_CLIENT_FUNC_CLOSE = 1 << 6, /*!< Allow to be closed */ + OB_CLIENT_FUNC_ABOVE = 1 << 7, /*!< Allow to be put in lower layer */ + OB_CLIENT_FUNC_BELOW = 1 << 8, /*!< Allow to be put in higher layer */ + OB_CLIENT_FUNC_UNDECORATE = 1 << 9 /*!< Allow to be undecorated */ } ObFunctions; struct _ObClient { ObWindow obwin; - Window window; /*! The window's decorations. NULL while the window is being managed! */ @@ -166,7 +167,7 @@ struct _ObClient The window manager will set this to 0 while the window is being managed, but needs to restore it afterwards, so it is saved here. */ - guint border_width; + gint border_width; /*! The minimum aspect ratio the client window can be sized to. A value of 0 means this is ignored. @@ -215,6 +216,10 @@ struct _ObClient we only force it if it tries to go completely offscreen, if neither, we should place the window ourselves when it first appears */ guint positioned; + + /*! Was the window's size requested by the application or the user? + If by the application we don't let it go outside the available area */ + guint sized; /*! Can the window receive input focus? */ gboolean can_focus; @@ -309,18 +314,27 @@ typedef void (*ObClientCallback)(ObClient *client, gpointer data); /* Callback functions */ /*! Get notified when the client is unmanaged */ -void client_add_destructor(ObClientCallback func, gpointer data); -void client_remove_destructor(ObClientCallback func); +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 */ +/*! Manages a given window +*/ void client_manage(Window win); /*! Unmanages all managed windows */ void client_unmanage_all(); /*! Unmanages a given client */ void client_unmanage(ObClient *client); +/*! This manages a window only so far as is needed to get it's decorations. + This is used when you want to determine a window's decorations before it + is mapped. Call client_fake_unmanage() with the returned client when you + are done with it. */ +ObClient *client_fake_manage(Window win); +/*! Free the stuff created by client_fake_manage() */ +void client_fake_unmanage(ObClient *self); + /*! Sets the client list on the root window from the client_list */ void client_set_list(); @@ -352,21 +366,33 @@ gboolean client_enter_focusable(ObClient *self); /* Returns if the window is focused */ gboolean client_focused(ObClient *self); -/*! Convery a position/size from a given gravity to the client's true gravity +/*! When the client is resized but not moved, figure out the new position + for it based on its gravity: + http://standards.freedesktop.org/wm-spec/wm-spec-1.4.html#id2512541 +*/ +void client_gravity_resize_w(ObClient *self, gint *x, gint oldw, gint neww); + +/*! When the client is resized but not moved, figure out the new position + for it based on its gravity: + http://standards.freedesktop.org/wm-spec/wm-spec-1.4.html#id2512541 +*/ +void client_gravity_resize_h(ObClient *self, gint *y, gint oldh, gint newh); + +/*! Convert a position/size from a given gravity to the client's true gravity, + when the client is only resizing (the reference point doesn't move) */ -void client_convert_gravity(ObClient *client, gint gravity, gint *x, gint *y, - gint w, gint h); +void client_convert_gravity_resize(ObClient *self, gint gravity, + gint *x, gint *y, + gint w, gint h); #define client_move(self, x, y) \ client_configure(self, x, y, self->area.width, self->area.height, \ - TRUE, TRUE) + self->border_width, TRUE, TRUE) #define client_resize(self, w, h) \ - client_configure(self, self->area.x, self->area.y, w, h, TRUE, TRUE) + client_configure(self, self->area.x, self->area.y, w, h, \ + self->border_width, TRUE, TRUE) #define client_move_resize(self, x, y, w, h) \ - client_configure(self, x, y, w, h, TRUE, TRUE) - -#define client_configure(self, x, y, w, h, user, final) \ - client_configure_full(self, x, y, w, h, user, final, FALSE) + client_configure(self, x, y, w, h, self->border_width, TRUE, TRUE) /*! Figure out where a window will end up and what size it will be if you told it to move/resize to these coordinates. @@ -407,9 +433,8 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h, @param force_reply Send a ConfigureNotify to the client regardless of if the position changed. */ -void client_configure_full(ObClient *self, gint x, gint y, gint w, gint h, - gboolean user, gboolean final, - gboolean force_reply); +void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gint b, + gboolean user, gboolean final); void client_reconfigure(ObClient *self); @@ -449,7 +474,8 @@ void client_fullscreen(ObClient *self, gboolean fs); be uniconified to the current viewable desktop (true) or to its previous desktop (false) */ -void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk); +void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk, + gboolean hide_animation); /*! Maximize or unmaximize the client window @param max true if the window should be maximized; false if it should be @@ -482,11 +508,11 @@ void client_kill(ObClient *self); */ void client_set_desktop(ObClient *self, guint target, gboolean donthide); -/*! Show the client if it should be shown. */ -void client_show(ObClient *self); +/*! Show the client if it should be shown. Returns if the window is shown. */ +gboolean client_show(ObClient *self); -/*! Show the client if it should be shown. */ -void client_hide(ObClient *self); +/*! Show the client if it should be shown. Returns if the window is hidden. */ +gboolean client_hide(ObClient *self); /*! Show the client if it should be shown, and hide it if it should be hidden. This is for example, when switching desktops. @@ -520,9 +546,7 @@ ObClient *client_focus_target(ObClient *self); without focusing it or modifying the focus order lists. */ gboolean client_can_focus(ObClient *self); -/*! Attempt to focus the client window - NOTE: You should validate the client before calling this !! (client_validate) -*/ +/*! Attempt to focus the client window */ gboolean client_focus(ObClient *self); /*! Activates the client for use, focusing, uniconifying it, etc. To be used @@ -536,31 +560,14 @@ void client_activate(ObClient *self, gboolean here, gboolean user); /*! Bring all of its helper windows to its desktop. These are the utility and stuff windows. */ -void client_bring_helper_windows(ObClient *client); +void client_bring_helper_windows(ObClient *self); + +/*! Bring all of its modal windows to its desktop. */ +void client_bring_modal_windows(ObClient *self); /*! Calculates the stacking layer for the client window */ void client_calc_layer(ObClient *self); -/*! Raises the client to the top of its stacking layer - Normally actions call to the client_* functions to make stuff go, but this - one is an exception. It just fires off an action, which will be queued. - This is because stacking order rules can be changed by focus state, and so - any time focus changes you have to wait for it to complete before you can - properly restart windows. As such, this only queues an action for later - execution, once the focus change has gone through. -*/ -void client_raise(ObClient *self); - -/*! Lowers the client to the bottom of its stacking layer - Normally actions call to the client_* functions to make stuff go, but this - one is an exception. It just fires off an action, which will be queued. - This is because stacking order rules can be changed by focus state, and so - any time focus changes you have to wait for it to complete before you can - properly restart windows. As such, this only queues an action for later - execution, once the focus change has gone through. -*/ -void client_lower(ObClient *self); - /*! Updates the window's transient status, and any parents of it */ void client_update_transient_for(ObClient *self); /*! Update the protocols that the window supports and adjusts things if they @@ -597,14 +604,21 @@ void client_update_icon_geometry(ObClient *self); /*! Set up what decor should be shown on the window and what functions should be allowed (ObClient::decorations and ObClient::functions). This also updates the NET_WM_ALLOWED_ACTIONS hint. + @param reconfig When TRUE, the window will be reconfigured to show the + changes */ -void client_setup_decor_and_functions(ObClient *self); +void client_setup_decor_and_functions(ObClient *self, gboolean reconfig); -/*! Retrieves the window's type and sets ObClient->type */ -void client_get_type(ObClient *self); +/*! Sets the window's type and transient flag */ +void client_get_type_and_transientness(ObClient *self); const ObClientIcon *client_icon(ObClient *self, gint w, gint h); +/*! 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.