diff options
| author | infirit <[email protected]> | 2014-10-24 12:51:12 +0200 | 
|---|---|---|
| committer | infirit <[email protected]> | 2014-10-24 15:40:43 +0200 | 
| commit | bcbc109d2801e2c8898ebb558febe99945358d53 (patch) | |
| tree | 522610e98ac400a155030ddbda9f7045495dc47e | |
| parent | 0ee6f6db3f405c13c88f75760f88296560cf9fd6 (diff) | |
| download | marco-bcbc109d2801e2c8898ebb558febe99945358d53.tar.bz2 marco-bcbc109d2801e2c8898ebb558febe99945358d53.tar.xz  | |
add support for _GTK_FRAME_EXTENTS
Support for _GTK_FRAME_EXTENTS are based on mutter.
Based on metacity commit: e132e2a700c4b50c93eae064d8fd1769b67baf06
By: Alberts Muktupāvels <[email protected]>
| -rw-r--r-- | src/core/atomnames.h | 2 | ||||
| -rw-r--r-- | src/core/window-private.h | 3 | ||||
| -rw-r--r-- | src/core/window-props.c | 56 | ||||
| -rw-r--r-- | src/core/window.c | 13 | 
4 files changed, 71 insertions, 3 deletions
diff --git a/src/core/atomnames.h b/src/core/atomnames.h index 20edcd2b..2775d3db 100644 --- a/src/core/atomnames.h +++ b/src/core/atomnames.h @@ -58,6 +58,7 @@ item(_MARCO_RESTART_MESSAGE)  item(_MARCO_RELOAD_THEME_MESSAGE)  item(_MARCO_SET_KEYBINDINGS_MESSAGE)  item(_MARCO_TOGGLE_VERBOSE) +item(_GTK_FRAME_EXTENTS)  item(_MATE_PANEL_ACTION)  item(_MATE_PANEL_ACTION_MAIN_MENU)  item(_MATE_PANEL_ACTION_RUN_DIALOG) @@ -70,7 +71,6 @@ item(MULTIPLE)  item(TIMESTAMP)  item(VERSION)  item(ATOM_PAIR) -item(_GTK_FRAME_EXTENTS)  /* Oddities: These are used, and we need atoms for them,   * but when we need all _NET_WM hints (i.e. when we're making diff --git a/src/core/window-private.h b/src/core/window-private.h index 65359e15..e81fd7ac 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -355,6 +355,9 @@ struct _MetaWindow     */    MetaRectangle rect; +  gboolean has_custom_frame_extents; +  GtkBorder custom_frame_extents; +    /* The geometry to restore when we unmaximize.  The position is in     * root window coords, even if there's a frame, which contrasts with     * window->rect above.  Note that this gives the position and size diff --git a/src/core/window-props.c b/src/core/window-props.c index 3e870bc6..9aab46ea 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -215,12 +215,66 @@ reload_kwm_win_icon (MetaWindow    *window,    reload_icon (window, window->display->atom__KWM_WIN_ICON);  } +static gboolean +gtk_border_equal (GtkBorder *a, +                  GtkBorder *b) +{ +  return (a->left == b->left && +          a->right == b->right && +          a->top == b->top && +          a->bottom == b->bottom); +} + +static void +meta_window_set_custom_frame_extents (MetaWindow *window, +                                      GtkBorder  *extents) +{ +  if (extents) +    { +      if (window->has_custom_frame_extents && gtk_border_equal (&window->custom_frame_extents, extents)) +        return; + +      window->has_custom_frame_extents = TRUE; +      window->custom_frame_extents = *extents; +    } +  else +    { +      if (!window->has_custom_frame_extents) +        return; + +      window->has_custom_frame_extents = FALSE; +      memset (&window->custom_frame_extents, 0, sizeof (window->custom_frame_extents)); +    } + +  meta_window_queue (window, META_QUEUE_MOVE_RESIZE); +} +  static void  reload_gtk_frame_extents (MetaWindow    *window,                            MetaPropValue *value,                            gboolean       initial)  { -  return; +  if (value->type != META_PROP_VALUE_INVALID) +    { +      if (value->v.cardinal_list.n_cardinals != 4) +        { +          meta_verbose ("_GTK_FRAME_EXTENTS on %s has %d values instead of 4\n", +                        window->desc, value->v.cardinal_list.n_cardinals); +        } +      else +        { +          GtkBorder extents; +          extents.left   = (int)value->v.cardinal_list.cardinals[0]; +          extents.right  = (int)value->v.cardinal_list.cardinals[1]; +          extents.top    = (int)value->v.cardinal_list.cardinals[2]; +          extents.bottom = (int)value->v.cardinal_list.cardinals[3]; +          meta_window_set_custom_frame_extents (window, &extents); +        } +    } +  else +    { +      meta_window_set_custom_frame_extents (window, NULL); +    }  }  static void diff --git a/src/core/window.c b/src/core/window.c index 694ba99e..75923e29 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -4042,7 +4042,18 @@ meta_window_get_outer_rect (const MetaWindow *window,    if (window->frame)      *rect = window->frame->rect;    else -    *rect = window->rect; +    { +        *rect = window->rect; + +	if (window->has_custom_frame_extents) +	  { +	    const GtkBorder *extents = &window->custom_frame_extents; +	    rect->x += extents->left; +	    rect->y += extents->top; +	    rect->width -= extents->left + extents->right; +	    rect->height -= extents->top + extents->bottom; +	  } +    }  }  void  | 
