mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
Add _NET_FRAME_EXTENTS and _NET_REQUEST_FRAME_EXTENTS.
2004-01-09 Thomas Fitzsimmons <fitzsim@redhat.com> Add _NET_FRAME_EXTENTS and _NET_REQUEST_FRAME_EXTENTS. * src/display.c: include xprops.h (process_request_frame_extents): new function (meta_display_open): add _NET_FRAME_EXTENTS and _NET_REQUEST_FRAME_EXTENTS atoms (event_callback): handle frame extents message * src/display.h (struct _MetaDisplay): add atom_net_frame_extents and atom_net_request_frame_extents * src/theme.c (meta_pango_font_desc_get_text_height): make font_desc parameter const * src/ui.c: include prefs.h (meta_ui_theme_get_frame_borders): new function * src/window.c (update_net_frame_extents): new function (meta_window_move_resize_internal): update frame extents property when frame geometry changes * src/screen.c (set_supported_hint): add atom_net_frame_extents and atom_net_request_frame_extents
This commit is contained in:
parent
cc7195547a
commit
a605da04c1
26
ChangeLog
26
ChangeLog
@ -1,3 +1,29 @@
|
|||||||
|
2004-01-09 Thomas Fitzsimmons <fitzsim@redhat.com>
|
||||||
|
|
||||||
|
Add _NET_FRAME_EXTENTS and _NET_REQUEST_FRAME_EXTENTS.
|
||||||
|
|
||||||
|
* src/display.c: include xprops.h
|
||||||
|
(process_request_frame_extents): new function
|
||||||
|
(meta_display_open): add _NET_FRAME_EXTENTS and
|
||||||
|
_NET_REQUEST_FRAME_EXTENTS atoms
|
||||||
|
(event_callback): handle frame extents message
|
||||||
|
|
||||||
|
* src/display.h (struct _MetaDisplay): add atom_net_frame_extents
|
||||||
|
and atom_net_request_frame_extents
|
||||||
|
|
||||||
|
* src/theme.c (meta_pango_font_desc_get_text_height): make font_desc
|
||||||
|
parameter const
|
||||||
|
|
||||||
|
* src/ui.c: include prefs.h
|
||||||
|
(meta_ui_theme_get_frame_borders): new function
|
||||||
|
|
||||||
|
* src/window.c (update_net_frame_extents): new function
|
||||||
|
(meta_window_move_resize_internal): update frame extents
|
||||||
|
property when frame geometry changes
|
||||||
|
|
||||||
|
* src/screen.c (set_supported_hint): add atom_net_frame_extents
|
||||||
|
and atom_net_request_frame_extents
|
||||||
|
|
||||||
2004-01-09 Calum Benson <calum.benson@sun.com>
|
2004-01-09 Calum Benson <calum.benson@sun.com>
|
||||||
|
|
||||||
* src/themes/Atlanta/metacity-theme-1.xml:
|
* src/themes/Atlanta/metacity-theme-1.xml:
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "keybindings.h"
|
#include "keybindings.h"
|
||||||
#include "prefs.h"
|
#include "prefs.h"
|
||||||
#include "resizepopup.h"
|
#include "resizepopup.h"
|
||||||
|
#include "xprops.h"
|
||||||
#include "workspace.h"
|
#include "workspace.h"
|
||||||
#include "bell.h"
|
#include "bell.h"
|
||||||
#include "effects.h"
|
#include "effects.h"
|
||||||
@ -90,6 +91,8 @@ static Window event_get_modified_window (MetaDisplay *display,
|
|||||||
XEvent *event);
|
XEvent *event);
|
||||||
static guint32 event_get_time (MetaDisplay *display,
|
static guint32 event_get_time (MetaDisplay *display,
|
||||||
XEvent *event);
|
XEvent *event);
|
||||||
|
static void process_request_frame_extents (MetaDisplay *display,
|
||||||
|
XEvent *event);
|
||||||
static void process_pong_message (MetaDisplay *display,
|
static void process_pong_message (MetaDisplay *display,
|
||||||
XEvent *event);
|
XEvent *event);
|
||||||
static void process_selection_request (MetaDisplay *display,
|
static void process_selection_request (MetaDisplay *display,
|
||||||
@ -274,7 +277,9 @@ meta_display_open (const char *name)
|
|||||||
"_METACITY_SENTINEL",
|
"_METACITY_SENTINEL",
|
||||||
"_NET_WM_STRUT_PARTIAL",
|
"_NET_WM_STRUT_PARTIAL",
|
||||||
"_NET_WM_ACTION_FULLSCREEN",
|
"_NET_WM_ACTION_FULLSCREEN",
|
||||||
"_NET_WM_ACTION_MINIMIZE"
|
"_NET_WM_ACTION_MINIMIZE",
|
||||||
|
"_NET_FRAME_EXTENTS",
|
||||||
|
"_NET_REQUEST_FRAME_EXTENTS",
|
||||||
};
|
};
|
||||||
Atom atoms[G_N_ELEMENTS(atom_names)];
|
Atom atoms[G_N_ELEMENTS(atom_names)];
|
||||||
|
|
||||||
@ -419,7 +424,9 @@ meta_display_open (const char *name)
|
|||||||
display->atom_net_wm_strut_partial = atoms[80];
|
display->atom_net_wm_strut_partial = atoms[80];
|
||||||
display->atom_net_wm_action_fullscreen = atoms[81];
|
display->atom_net_wm_action_fullscreen = atoms[81];
|
||||||
display->atom_net_wm_action_minimize = atoms[82];
|
display->atom_net_wm_action_minimize = atoms[82];
|
||||||
|
display->atom_net_frame_extents = atoms[83];
|
||||||
|
display->atom_net_request_frame_extents = atoms[84];
|
||||||
|
|
||||||
display->prop_hooks = NULL;
|
display->prop_hooks = NULL;
|
||||||
meta_display_init_window_prop_hooks (display);
|
meta_display_init_window_prop_hooks (display);
|
||||||
display->group_prop_hooks = NULL;
|
display->group_prop_hooks = NULL;
|
||||||
@ -1990,6 +1997,13 @@ event_callback (XEvent *event,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (event->xclient.message_type ==
|
||||||
|
display->atom_net_request_frame_extents)
|
||||||
|
{
|
||||||
|
meta_verbose ("Received _NET_REQUEST_FRAME_EXTENTS message\n");
|
||||||
|
process_request_frame_extents (display, event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MappingNotify:
|
case MappingNotify:
|
||||||
@ -3543,6 +3557,74 @@ meta_display_ping_window (MetaDisplay *display,
|
|||||||
timestamp);
|
timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_request_frame_extents (MetaDisplay *display,
|
||||||
|
XEvent *event)
|
||||||
|
{
|
||||||
|
/* The X window whose frame extents will be set. */
|
||||||
|
Window xwindow = event->xclient.window;
|
||||||
|
unsigned long data[4] = { 0, 0, 0, 0 };
|
||||||
|
|
||||||
|
MotifWmHints *hints = NULL;
|
||||||
|
gboolean hints_set = FALSE;
|
||||||
|
|
||||||
|
meta_verbose ("Setting frame extents for 0x%lx\n", xwindow);
|
||||||
|
|
||||||
|
/* See if the window is decorated. */
|
||||||
|
hints_set = meta_prop_get_motif_hints (display,
|
||||||
|
xwindow,
|
||||||
|
display->atom_motif_wm_hints,
|
||||||
|
&hints);
|
||||||
|
if ((hints_set && hints->decorations) || !hints_set)
|
||||||
|
{
|
||||||
|
int top = 0;
|
||||||
|
int bottom = 0;
|
||||||
|
int left = 0;
|
||||||
|
int right = 0;
|
||||||
|
|
||||||
|
MetaScreen *screen;
|
||||||
|
|
||||||
|
screen = meta_display_screen_for_xwindow (display,
|
||||||
|
event->xclient.window);
|
||||||
|
if (screen == NULL)
|
||||||
|
{
|
||||||
|
meta_warning ("Received request to set _NET_FRAME_EXTENTS "
|
||||||
|
"on 0x%lx which is on a screen we are not managing\n",
|
||||||
|
event->xclient.window);
|
||||||
|
meta_XFree (hints);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return estimated frame extents for a normal window. */
|
||||||
|
meta_ui_theme_get_frame_borders (screen->ui,
|
||||||
|
META_FRAME_TYPE_NORMAL,
|
||||||
|
0,
|
||||||
|
&top,
|
||||||
|
&bottom,
|
||||||
|
&left,
|
||||||
|
&right);
|
||||||
|
|
||||||
|
data[0] = left;
|
||||||
|
data[1] = right;
|
||||||
|
data[2] = top;
|
||||||
|
data[3] = bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_topic (META_DEBUG_GEOMETRY,
|
||||||
|
"Setting _NET_FRAME_EXTENTS on unmanaged window 0x%lx "
|
||||||
|
"to top = %ld, left = %ld, bottom = %ld, right = %ld\n",
|
||||||
|
xwindow, data[0], data[1], data[2], data[3]);
|
||||||
|
|
||||||
|
meta_error_trap_push (display);
|
||||||
|
XChangeProperty (display->xdisplay, xwindow,
|
||||||
|
display->atom_net_frame_extents,
|
||||||
|
XA_CARDINAL,
|
||||||
|
32, PropModeReplace, (guchar*) data, 4);
|
||||||
|
meta_error_trap_pop (display, FALSE);
|
||||||
|
|
||||||
|
meta_XFree (hints);
|
||||||
|
}
|
||||||
|
|
||||||
/* process the pong from our ping */
|
/* process the pong from our ping */
|
||||||
static void
|
static void
|
||||||
process_pong_message (MetaDisplay *display,
|
process_pong_message (MetaDisplay *display,
|
||||||
|
@ -172,7 +172,9 @@ struct _MetaDisplay
|
|||||||
Atom atom_gnome_panel_action_run_dialog;
|
Atom atom_gnome_panel_action_run_dialog;
|
||||||
Atom atom_metacity_sentinel;
|
Atom atom_metacity_sentinel;
|
||||||
Atom atom_net_wm_strut_partial;
|
Atom atom_net_wm_strut_partial;
|
||||||
|
Atom atom_net_frame_extents;
|
||||||
|
Atom atom_net_request_frame_extents;
|
||||||
|
|
||||||
/* This is the actual window from focus events,
|
/* This is the actual window from focus events,
|
||||||
* not the one we last set
|
* not the one we last set
|
||||||
*/
|
*/
|
||||||
|
@ -82,7 +82,7 @@ set_wm_check_hint (MetaScreen *screen)
|
|||||||
static int
|
static int
|
||||||
set_supported_hint (MetaScreen *screen)
|
set_supported_hint (MetaScreen *screen)
|
||||||
{
|
{
|
||||||
#define N_SUPPORTED 68
|
#define N_SUPPORTED 70
|
||||||
Atom atoms[N_SUPPORTED];
|
Atom atoms[N_SUPPORTED];
|
||||||
|
|
||||||
atoms[0] = screen->display->atom_net_wm_name;
|
atoms[0] = screen->display->atom_net_wm_name;
|
||||||
@ -153,6 +153,8 @@ set_supported_hint (MetaScreen *screen)
|
|||||||
atoms[65] = screen->display->atom_net_wm_strut_partial;
|
atoms[65] = screen->display->atom_net_wm_strut_partial;
|
||||||
atoms[66] = screen->display->atom_net_wm_action_fullscreen;
|
atoms[66] = screen->display->atom_net_wm_action_fullscreen;
|
||||||
atoms[67] = screen->display->atom_net_wm_action_minimize;
|
atoms[67] = screen->display->atom_net_wm_action_minimize;
|
||||||
|
atoms[68] = screen->display->atom_net_frame_extents;
|
||||||
|
atoms[69] = screen->display->atom_net_request_frame_extents;
|
||||||
|
|
||||||
XChangeProperty (screen->display->xdisplay, screen->xroot,
|
XChangeProperty (screen->display->xdisplay, screen->xroot,
|
||||||
screen->display->atom_net_supported,
|
screen->display->atom_net_supported,
|
||||||
|
@ -5168,7 +5168,7 @@ meta_gtk_widget_get_font_desc (GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
meta_pango_font_desc_get_text_height (PangoFontDescription *font_desc,
|
meta_pango_font_desc_get_text_height (const PangoFontDescription *font_desc,
|
||||||
PangoContext *context)
|
PangoContext *context)
|
||||||
{
|
{
|
||||||
PangoFontMetrics *metrics;
|
PangoFontMetrics *metrics;
|
||||||
|
@ -815,7 +815,7 @@ char* meta_theme_replace_constants (MetaTheme *theme,
|
|||||||
PangoFontDescription* meta_gtk_widget_get_font_desc (GtkWidget *widget,
|
PangoFontDescription* meta_gtk_widget_get_font_desc (GtkWidget *widget,
|
||||||
double scale,
|
double scale,
|
||||||
const PangoFontDescription *override);
|
const PangoFontDescription *override);
|
||||||
int meta_pango_font_desc_get_text_height (PangoFontDescription *font_desc,
|
int meta_pango_font_desc_get_text_height (const PangoFontDescription *font_desc,
|
||||||
PangoContext *context);
|
PangoContext *context);
|
||||||
|
|
||||||
|
|
||||||
|
39
src/ui.c
39
src/ui.c
@ -21,6 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
#include "prefs.h"
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
#include "frames.h"
|
#include "frames.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
@ -684,6 +685,44 @@ meta_text_property_to_utf8 (Display *xdisplay,
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_ui_theme_get_frame_borders (MetaUI *ui,
|
||||||
|
MetaFrameType type,
|
||||||
|
MetaFrameFlags flags,
|
||||||
|
int *top_height,
|
||||||
|
int *bottom_height,
|
||||||
|
int *left_width,
|
||||||
|
int *right_width)
|
||||||
|
{
|
||||||
|
int text_height;
|
||||||
|
PangoContext *context;
|
||||||
|
const PangoFontDescription *font_desc;
|
||||||
|
GtkStyle *default_style;
|
||||||
|
|
||||||
|
if (meta_ui_have_a_theme ())
|
||||||
|
{
|
||||||
|
context = gtk_widget_get_pango_context (GTK_WIDGET (ui->frames));
|
||||||
|
font_desc = meta_prefs_get_titlebar_font ();
|
||||||
|
|
||||||
|
if (!font_desc)
|
||||||
|
{
|
||||||
|
default_style = gtk_widget_get_default_style ();
|
||||||
|
font_desc = default_style->font_desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
text_height = meta_pango_font_desc_get_text_height (font_desc, context);
|
||||||
|
|
||||||
|
meta_theme_get_frame_borders (meta_theme_get_current (),
|
||||||
|
type, text_height, flags,
|
||||||
|
top_height, bottom_height,
|
||||||
|
left_width, right_width);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*top_height = *bottom_height = *left_width = *right_width = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_ui_set_current_theme (const char *name,
|
meta_ui_set_current_theme (const char *name,
|
||||||
gboolean force_reload)
|
gboolean force_reload)
|
||||||
|
7
src/ui.h
7
src/ui.h
@ -55,6 +55,13 @@ MetaUI* meta_ui_new (Display *xdisplay,
|
|||||||
Screen *screen);
|
Screen *screen);
|
||||||
void meta_ui_free (MetaUI *ui);
|
void meta_ui_free (MetaUI *ui);
|
||||||
|
|
||||||
|
void meta_ui_theme_get_frame_borders (MetaUI *ui,
|
||||||
|
MetaFrameType type,
|
||||||
|
MetaFrameFlags flags,
|
||||||
|
int *top_height,
|
||||||
|
int *bottom_height,
|
||||||
|
int *left_width,
|
||||||
|
int *right_width);
|
||||||
void meta_ui_get_frame_geometry (MetaUI *ui,
|
void meta_ui_get_frame_geometry (MetaUI *ui,
|
||||||
Window frame_xwindow,
|
Window frame_xwindow,
|
||||||
int *top_height, int *bottom_height,
|
int *top_height, int *bottom_height,
|
||||||
|
45
src/window.c
45
src/window.c
@ -64,12 +64,14 @@ static void update_transient_for (MetaWindow *window);
|
|||||||
static void update_sm_hints (MetaWindow *window);
|
static void update_sm_hints (MetaWindow *window);
|
||||||
static void update_role (MetaWindow *window);
|
static void update_role (MetaWindow *window);
|
||||||
static void update_net_wm_type (MetaWindow *window);
|
static void update_net_wm_type (MetaWindow *window);
|
||||||
|
static void update_net_frame_extents (MetaWindow *window);
|
||||||
static void recalc_window_type (MetaWindow *window);
|
static void recalc_window_type (MetaWindow *window);
|
||||||
static void recalc_window_features (MetaWindow *window);
|
static void recalc_window_features (MetaWindow *window);
|
||||||
static void invalidate_work_areas (MetaWindow *window);
|
static void invalidate_work_areas (MetaWindow *window);
|
||||||
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 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,
|
||||||
XPropertyEvent *event);
|
XPropertyEvent *event);
|
||||||
@ -2541,15 +2543,22 @@ meta_window_move_resize_internal (MetaWindow *window,
|
|||||||
use_static_gravity = FALSE;
|
use_static_gravity = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fill in other frame member variables */
|
/* If frame extents have changed, fill in other frame fields and
|
||||||
if (window->frame)
|
change frame's extents property. */
|
||||||
|
if (window->frame &&
|
||||||
|
(window->frame->child_x != fgeom.left_width ||
|
||||||
|
window->frame->child_y != fgeom.top_height ||
|
||||||
|
window->frame->right_width != fgeom.right_width ||
|
||||||
|
window->frame->bottom_height != fgeom.bottom_height))
|
||||||
{
|
{
|
||||||
window->frame->child_x = fgeom.left_width;
|
window->frame->child_x = fgeom.left_width;
|
||||||
window->frame->child_y = fgeom.top_height;
|
window->frame->child_y = fgeom.top_height;
|
||||||
window->frame->right_width = fgeom.right_width;
|
window->frame->right_width = fgeom.right_width;
|
||||||
window->frame->bottom_height = fgeom.bottom_height;
|
window->frame->bottom_height = fgeom.bottom_height;
|
||||||
|
|
||||||
|
update_net_frame_extents (window);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See ICCCM 4.1.5 for when to send ConfigureNotify */
|
/* See ICCCM 4.1.5 for when to send ConfigureNotify */
|
||||||
|
|
||||||
need_configure_notify = FALSE;
|
need_configure_notify = FALSE;
|
||||||
@ -3319,6 +3328,36 @@ meta_window_get_net_wm_desktop (MetaWindow *window)
|
|||||||
return meta_workspace_index (window->workspaces->data);
|
return meta_workspace_index (window->workspaces->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_net_frame_extents (MetaWindow *window)
|
||||||
|
{
|
||||||
|
unsigned long data[4] = { 0, 0, 0, 0 };
|
||||||
|
|
||||||
|
if (window->frame)
|
||||||
|
{
|
||||||
|
/* Left */
|
||||||
|
data[0] = window->frame->child_x;
|
||||||
|
/* Right */
|
||||||
|
data[1] = window->frame->right_width;
|
||||||
|
/* Top */
|
||||||
|
data[2] = window->frame->child_y;
|
||||||
|
/* Bottom */
|
||||||
|
data[3] = window->frame->bottom_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_topic (META_DEBUG_GEOMETRY,
|
||||||
|
"Setting _NET_FRAME_EXTENTS on managed window 0x%lx "
|
||||||
|
"to top = %ld, left = %ld, bottom = %ld, right = %ld\n",
|
||||||
|
window->xwindow, data[0], data[1], data[2], data[3]);
|
||||||
|
|
||||||
|
meta_error_trap_push (window->display);
|
||||||
|
XChangeProperty (window->display->xdisplay, window->xwindow,
|
||||||
|
window->display->atom_net_frame_extents,
|
||||||
|
XA_CARDINAL,
|
||||||
|
32, PropModeReplace, (guchar*) data, 4);
|
||||||
|
meta_error_trap_pop (window->display, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_window_set_current_workspace_hint (MetaWindow *window)
|
meta_window_set_current_workspace_hint (MetaWindow *window)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user