MetaWindow: Add :resizable and :above properties
Allow libmutter users to treat windows different based on these attributes and to watch for changes. https://bugzilla.gnome.org/show_bug.cgi?id=653858
This commit is contained in:
parent
9c493ab56a
commit
f76372dd7d
@ -70,6 +70,8 @@ static void set_wm_state_on_xwindow (MetaDisplay *display,
|
|||||||
static void set_wm_state (MetaWindow *window,
|
static void set_wm_state (MetaWindow *window,
|
||||||
int state);
|
int state);
|
||||||
static void set_net_wm_state (MetaWindow *window);
|
static void set_net_wm_state (MetaWindow *window);
|
||||||
|
static void meta_window_set_above (MetaWindow *window,
|
||||||
|
gboolean new_value);
|
||||||
|
|
||||||
static void send_configure_notify (MetaWindow *window);
|
static void send_configure_notify (MetaWindow *window);
|
||||||
static gboolean process_property_notify (MetaWindow *window,
|
static gboolean process_property_notify (MetaWindow *window,
|
||||||
@ -157,6 +159,8 @@ enum {
|
|||||||
PROP_URGENT,
|
PROP_URGENT,
|
||||||
PROP_MUTTER_HINTS,
|
PROP_MUTTER_HINTS,
|
||||||
PROP_APPEARS_FOCUSED,
|
PROP_APPEARS_FOCUSED,
|
||||||
|
PROP_RESIZEABLE,
|
||||||
|
PROP_ABOVE,
|
||||||
PROP_WM_CLASS
|
PROP_WM_CLASS
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -255,6 +259,12 @@ meta_window_get_property(GObject *object,
|
|||||||
case PROP_WM_CLASS:
|
case PROP_WM_CLASS:
|
||||||
g_value_set_string (value, win->res_class);
|
g_value_set_string (value, win->res_class);
|
||||||
break;
|
break;
|
||||||
|
case PROP_RESIZEABLE:
|
||||||
|
g_value_set_boolean (value, win->has_resize_func);
|
||||||
|
break;
|
||||||
|
case PROP_ABOVE:
|
||||||
|
g_value_set_boolean (value, win->wm_state_above);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -397,6 +407,22 @@ meta_window_class_init (MetaWindowClass *klass)
|
|||||||
FALSE,
|
FALSE,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
|
g_object_class_install_property (object_class,
|
||||||
|
PROP_RESIZEABLE,
|
||||||
|
g_param_spec_boolean ("resizeable",
|
||||||
|
"Resizeable",
|
||||||
|
"Whether the window can be resized",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
|
g_object_class_install_property (object_class,
|
||||||
|
PROP_ABOVE,
|
||||||
|
g_param_spec_boolean ("above",
|
||||||
|
"Above",
|
||||||
|
"Whether the window is shown as always-on-top",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
g_object_class_install_property (object_class,
|
g_object_class_install_property (object_class,
|
||||||
PROP_WM_CLASS,
|
PROP_WM_CLASS,
|
||||||
g_param_spec_string ("wm-class",
|
g_param_spec_string ("wm-class",
|
||||||
@ -3722,10 +3748,8 @@ meta_window_make_above (MetaWindow *window)
|
|||||||
{
|
{
|
||||||
g_return_if_fail (!window->override_redirect);
|
g_return_if_fail (!window->override_redirect);
|
||||||
|
|
||||||
window->wm_state_above = TRUE;
|
meta_window_set_above (window, TRUE);
|
||||||
meta_window_update_layer (window);
|
|
||||||
meta_window_raise (window);
|
meta_window_raise (window);
|
||||||
set_net_wm_state (window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -3733,10 +3757,22 @@ meta_window_unmake_above (MetaWindow *window)
|
|||||||
{
|
{
|
||||||
g_return_if_fail (!window->override_redirect);
|
g_return_if_fail (!window->override_redirect);
|
||||||
|
|
||||||
window->wm_state_above = FALSE;
|
meta_window_set_above (window, FALSE);
|
||||||
meta_window_raise (window);
|
meta_window_raise (window);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_window_set_above (MetaWindow *window,
|
||||||
|
gboolean new_value)
|
||||||
|
{
|
||||||
|
new_value = new_value != FALSE;
|
||||||
|
if (new_value == window->wm_state_above)
|
||||||
|
return;
|
||||||
|
|
||||||
|
window->wm_state_above = new_value;
|
||||||
meta_window_update_layer (window);
|
meta_window_update_layer (window);
|
||||||
set_net_wm_state (window);
|
set_net_wm_state (window);
|
||||||
|
g_object_notify (G_OBJECT (window), "above");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -6154,12 +6190,9 @@ meta_window_client_message (MetaWindow *window,
|
|||||||
if (first == display->atom__NET_WM_STATE_ABOVE ||
|
if (first == display->atom__NET_WM_STATE_ABOVE ||
|
||||||
second == display->atom__NET_WM_STATE_ABOVE)
|
second == display->atom__NET_WM_STATE_ABOVE)
|
||||||
{
|
{
|
||||||
window->wm_state_above =
|
meta_window_set_above(window,
|
||||||
(action == _NET_WM_STATE_ADD) ||
|
(action == _NET_WM_STATE_ADD) ||
|
||||||
(action == _NET_WM_STATE_TOGGLE && !window->wm_state_above);
|
(action == _NET_WM_STATE_TOGGLE && !window->wm_state_above));
|
||||||
|
|
||||||
meta_window_update_layer (window);
|
|
||||||
set_net_wm_state (window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (first == display->atom__NET_WM_STATE_BELOW ||
|
if (first == display->atom__NET_WM_STATE_BELOW ||
|
||||||
@ -7734,6 +7767,9 @@ recalc_window_features (MetaWindow *window)
|
|||||||
old_always_sticky != window->always_sticky)
|
old_always_sticky != window->always_sticky)
|
||||||
set_allowed_actions_hint (window);
|
set_allowed_actions_hint (window);
|
||||||
|
|
||||||
|
if (window->has_resize_func != old_has_resize_func)
|
||||||
|
g_object_notify (G_OBJECT (window), "resizeable");
|
||||||
|
|
||||||
/* FIXME perhaps should ensure if we don't have a shade func,
|
/* FIXME perhaps should ensure if we don't have a shade func,
|
||||||
* we aren't shaded, etc.
|
* we aren't shaded, etc.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user