1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- 2 3 frame.h for the Openbox window manager 4 Copyright (c) 2006 Mikael Magnusson 5 Copyright (c) 2003-2007 Dana Jansens 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 See the COPYING file for a copy of the GNU General Public License. 18 */ 19 20 #ifndef __frame_h 21 #define __frame_h 22 23 #include "geom.h" 24 #include "obrender/render.h" 25 26 typedef struct _ObFrame ObFrame; 27 28 struct _ObClient; 29 30 typedef void (*ObFrameIconifyAnimateFunc)(gpointer data); 31 32 typedef enum { 33 OB_FRAME_CONTEXT_NONE, 34 OB_FRAME_CONTEXT_DESKTOP, 35 OB_FRAME_CONTEXT_ROOT, 36 OB_FRAME_CONTEXT_CLIENT, 37 OB_FRAME_CONTEXT_TITLEBAR, 38 OB_FRAME_CONTEXT_FRAME, 39 OB_FRAME_CONTEXT_BLCORNER, 40 OB_FRAME_CONTEXT_BRCORNER, 41 OB_FRAME_CONTEXT_TLCORNER, 42 OB_FRAME_CONTEXT_TRCORNER, 43 OB_FRAME_CONTEXT_TOP, 44 OB_FRAME_CONTEXT_BOTTOM, 45 OB_FRAME_CONTEXT_LEFT, 46 OB_FRAME_CONTEXT_RIGHT, 47 OB_FRAME_CONTEXT_MAXIMIZE, 48 OB_FRAME_CONTEXT_ALLDESKTOPS, 49 OB_FRAME_CONTEXT_SHADE, 50 OB_FRAME_CONTEXT_ICONIFY, 51 OB_FRAME_CONTEXT_ICON, 52 OB_FRAME_CONTEXT_CLOSE, 53 /*! This is a special context, which occurs while dragging a window in 54 a move/resize */ 55 OB_FRAME_CONTEXT_MOVE_RESIZE, 56 OB_FRAME_CONTEXT_DOCK, 57 OB_FRAME_NUM_CONTEXTS 58 } ObFrameContext; 59 60 #define FRAME_CONTEXT(co, cl) ((cl && cl->type != OB_CLIENT_TYPE_DESKTOP) ? \ 61 co == OB_FRAME_CONTEXT_FRAME : FALSE) 62 #define CLIENT_CONTEXT(co, cl) ((cl && cl->type == OB_CLIENT_TYPE_DESKTOP) ? \ 63 co == OB_FRAME_CONTEXT_DESKTOP : \ 64 co == OB_FRAME_CONTEXT_CLIENT) 65 66 /*! The decorations the client window wants to be displayed on it */ 67 typedef enum { 68 OB_FRAME_DECOR_TITLEBAR = 1 << 0, /*!< Display a titlebar */ 69 OB_FRAME_DECOR_HANDLE = 1 << 1, /*!< Display a handle (bottom) */ 70 OB_FRAME_DECOR_GRIPS = 1 << 2, /*!< Display grips in the handle */ 71 OB_FRAME_DECOR_BORDER = 1 << 3, /*!< Display a border */ 72 OB_FRAME_DECOR_ICON = 1 << 4, /*!< Display the window's icon */ 73 OB_FRAME_DECOR_ICONIFY = 1 << 5, /*!< Display an iconify button */ 74 OB_FRAME_DECOR_MAXIMIZE = 1 << 6, /*!< Display a maximize button */ 75 /*! Display a button to toggle the window's placement on 76 all desktops */ 77 OB_FRAME_DECOR_ALLDESKTOPS = 1 << 7, 78 OB_FRAME_DECOR_SHADE = 1 << 8, /*!< Display a shade button */ 79 OB_FRAME_DECOR_CLOSE = 1 << 9 /*!< Display a close button */ 80 } ObFrameDecorations; 81 82 struct _ObFrame 83 { 84 struct _ObClient *client; 85 86 Window window; 87 88 Strut size; /* the size of the frame */ 89 Strut oldsize; /* the size of the frame last told to the client */ 90 Rect area; 91 gboolean visible; 92 93 guint functions; 94 guint decorations; 95 96 Window title; 97 Window label; 98 Window max; 99 Window close; 100 Window desk; 101 Window shade; 102 Window icon; 103 Window iconify; 104 Window handle; 105 Window lgrip; 106 Window rgrip; 107 108 /* These are borders of the frame and its elements */ 109 Window titleleft; 110 Window titletop; 111 Window titletopleft; 112 Window titletopright; 113 Window titleright; 114 Window titlebottom; 115 Window left; 116 Window right; 117 Window handleleft; 118 Window handletop; 119 Window handleright; 120 Window handlebottom; 121 Window lgriptop; 122 Window lgripleft; 123 Window lgripbottom; 124 Window rgriptop; 125 Window rgripright; 126 Window rgripbottom; 127 Window innerleft; /*!< For drawing the inner client border */ 128 Window innertop; /*!< For drawing the inner client border */ 129 Window innerright; /*!< For drawing the inner client border */ 130 Window innerbottom; /*!< For drawing the inner client border */ 131 Window innerblb; 132 Window innerbll; 133 Window innerbrb; 134 Window innerbrr; 135 Window backback; /*!< A colored window shown while resizing */ 136 Window backfront; /*!< An undrawn-in window, to prevent flashing on 137 unmap */ 138 139 /* These are resize handles inside the titlebar */ 140 Window topresize; 141 Window tltresize; 142 Window tllresize; 143 Window trtresize; 144 Window trrresize; 145 146 Colormap colormap; 147 148 gint icon_on; /* if the window icon button is on */ 149 gint label_on; /* if the window title is on */ 150 gint iconify_on; /* if the window iconify button is on */ 151 gint desk_on; /* if the window all-desktops button is on */ 152 gint shade_on; /* if the window shade button is on */ 153 gint max_on; /* if the window maximize button is on */ 154 gint close_on; /* if the window close button is on */ 155 156 gint width; /* width of the titlebar and handle */ 157 gint label_width; /* width of the label in the titlebar */ 158 gint icon_x; /* x-position of the window icon button */ 159 gint label_x; /* x-position of the window title */ 160 gint iconify_x; /* x-position of the window iconify button */ 161 gint desk_x; /* x-position of the window all-desktops button */ 162 gint shade_x; /* x-position of the window shade button */ 163 gint max_x; /* x-position of the window maximize button */ 164 gint close_x; /* x-position of the window close button */ 165 gint bwidth; /* border width */ 166 gint cbwidth_l; /* client border width */ 167 gint cbwidth_t; /* client border width */ 168 gint cbwidth_r; /* client border width */ 169 gint cbwidth_b; /* client border width */ 170 gboolean max_horz; /* when maxed some decorations are hidden */ 171 gboolean max_vert; /* when maxed some decorations are hidden */ 172 gboolean shaded; /* decorations adjust when shaded */ 173 174 /* the leftmost and rightmost elements in the titlebar */ 175 ObFrameContext leftmost; 176 ObFrameContext rightmost; 177 178 gboolean max_press; 179 gboolean close_press; 180 gboolean desk_press; 181 gboolean shade_press; 182 gboolean iconify_press; 183 gboolean max_hover; 184 gboolean close_hover; 185 gboolean desk_hover; 186 gboolean shade_hover; 187 gboolean iconify_hover; 188 189 gboolean focused; 190 gboolean need_render; 191 192 gboolean flashing; 193 gboolean flash_on; 194 GTimeVal flash_end; 195 guint flash_timer; 196 197 /*! Is the frame currently in an animation for iconify or restore. 198 0 means that it is not animating. > 0 means it is animating an iconify. 199 < 0 means it is animating a restore. 200 */ 201 gint iconify_animation_going; 202 guint iconify_animation_timer; 203 GTimeVal iconify_animation_end; 204 }; 205 206 ObFrame *frame_new(struct _ObClient *c); 207 void frame_free(ObFrame *self); 208 209 void frame_show(ObFrame *self); 210 void frame_hide(ObFrame *self); 211 void frame_adjust_theme(ObFrame *self); 212 #ifdef SHAPE 213 void frame_adjust_shape_kind(ObFrame *self, int kind); 214 #endif 215 void frame_adjust_shape(ObFrame *self); 216 void frame_adjust_area(ObFrame *self, gboolean moved, 217 gboolean resized, gboolean fake); 218 void frame_adjust_client_area(ObFrame *self); 219 void frame_adjust_state(ObFrame *self); 220 void frame_adjust_focus(ObFrame *self, gboolean hilite); 221 void frame_adjust_title(ObFrame *self); 222 void frame_adjust_icon(ObFrame *self); 223 void frame_grab_client(ObFrame *self); 224 void frame_release_client(ObFrame *self); 225 226 ObFrameContext frame_context_from_string(const gchar *name); 227 228 /*! Parses a ObFrameContext from a string of space-separated context names. 229 @names The list of context names, the first of which is removed from the 230 string. 231 @cx The ObFrameContext is returned here. If an invalid name is found, this 232 is set to OB_FRAME_CONTEXT_NONE. 233 @return TRUE if there was something to read in @names, FALSE if it was an 234 empty input. 235 */ 236 gboolean frame_next_context_from_string(gchar *names, ObFrameContext *cx); 237 238 ObFrameContext frame_context(struct _ObClient *self, Window win, 239 gint x, gint y); 240 241 /*! Applies gravity to the client's position to find where the frame should 242 be positioned. 243 @return The proper coordinates for the frame, based on the client. 244 */ 245 void frame_client_gravity(ObFrame *self, gint *x, gint *y); 246 247 /*! Reversly applies gravity to the frame's position to find where the client 248 should be positioned. 249 @return The proper coordinates for the client, based on the frame. 250 */ 251 void frame_frame_gravity(ObFrame *self, gint *x, gint *y); 252 253 /*! Convert a rectangle in client coordinates/sizes to what it would be 254 for the frame, given its current decorations sizes */ 255 void frame_rect_to_frame(ObFrame *self, Rect *r); 256 257 /*! Convert a rectangle in frame coordinates/sizes to what it would be for the 258 client, given its current decorations sizes */ 259 void frame_rect_to_client(ObFrame *self, Rect *r); 260 261 void frame_flash_start(ObFrame *self); 262 void frame_flash_stop(ObFrame *self); 263 264 /*! Start an animation for iconifying or restoring a frame. The callback 265 will be called when the animation finishes. But if another animation is 266 started in the meantime, the callback will never get called. */ 267 void frame_begin_iconify_animation(ObFrame *self, gboolean iconifying); 268 void frame_end_iconify_animation(gpointer data); 269 270 #define frame_iconify_animating(f) (f->iconify_animation_going != 0) 271 272 #endif 273