Add a raise on click option, basically only because all the major distros

2006-01-10  Elijah Newren  <newren@gmail.com>

	Add a raise on click option, basically only because all the major
	distros are patching it in anyway.  See #326156.

	* src/metacity.schemas.in: add the new gconf key and explanation

	* src/prefs.[ch] (#define KEY_RAISE_ON_CLICK, static gboolean
	  raise_on_click, update_raise_on_click, meta_prefs_init,
	  change_notify, meta_prefs_get_raise_on_click,
	  meta_preference_to_string):
	Add all the normal preference handling stuff for this new
	raise-on-click option.

	* src/core.c (meta_core_show_window_menu):
	* src/display.c (event_callback, meta_display_begin_grab_op):
	* src/window.c (window_activate, meta_window_configure_request, ):
	Only raise the window if in raise_on_click mode.

	* src/display.c (meta_display_begin_grab_op,
	  meta_display_end_grab_op, meta_display_check_threshold_reached):
	* src/display.h (struct MetaDisplay):
	* src/window.c (meta_window_handle_mouse_grab_op_event):
	if not in raise-on-click mode only raise on button release if the
	click didn't start a move or resize operation; needs a few extra
	MetaDisplay fields to handle this

	* src/core.c (meta_core_user_lower_and_unfocus):
	no need to do the MRU shuffling if not maintaining the stacking
	order == MRU order invariant

	* src/frames.c (meta_frames_button_press_event):
	* src/window.c (meta_window_begin_grab_op):
	remove an unneeded window raising that is already handled elsewhere
This commit is contained in:
Elijah Newren 2006-01-10 19:35:03 +00:00 committed by Elijah Newren
parent f6270596de
commit 52df880f32
9 changed files with 189 additions and 25 deletions

View File

@ -1,3 +1,38 @@
2006-01-10 Elijah Newren <newren@gmail.com>
Add a raise on click option, basically only because all the major
distros are patching it in anyway. See #326156.
* src/metacity.schemas.in: add the new gconf key and explanation
* src/prefs.[ch] (#define KEY_RAISE_ON_CLICK, static gboolean
raise_on_click, update_raise_on_click, meta_prefs_init,
change_notify, meta_prefs_get_raise_on_click,
meta_preference_to_string):
Add all the normal preference handling stuff for this new
raise-on-click option.
* src/core.c (meta_core_show_window_menu):
* src/display.c (event_callback, meta_display_begin_grab_op):
* src/window.c (window_activate, meta_window_configure_request, ):
Only raise the window if in raise_on_click mode.
* src/display.c (meta_display_begin_grab_op,
meta_display_end_grab_op, meta_display_check_threshold_reached):
* src/display.h (struct MetaDisplay):
* src/window.c (meta_window_handle_mouse_grab_op_event):
if not in raise-on-click mode only raise on button release if the
click didn't start a move or resize operation; needs a few extra
MetaDisplay fields to handle this
* src/core.c (meta_core_user_lower_and_unfocus):
no need to do the MRU shuffling if not maintaining the stacking
order == MRU order invariant
* src/frames.c (meta_frames_button_press_event):
* src/window.c (meta_window_begin_grab_op):
remove an unneeded window raising that is already handled elsewhere
2006-01-10 Elijah Newren <newren@gmail.com> 2006-01-10 Elijah Newren <newren@gmail.com>
Don't "steal" focus from terminal windows for new window mappings Don't "steal" focus from terminal windows for new window mappings

View File

@ -269,7 +269,8 @@ meta_core_user_lower_and_unfocus (Display *xdisplay,
meta_window_lower (window); meta_window_lower (window);
if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK) if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK &&
meta_prefs_get_raise_on_click ())
{ {
/* Move window to the back of the focusing workspace's MRU list. /* Move window to the back of the focusing workspace's MRU list.
* Do extra sanity checks to avoid possible race conditions. * Do extra sanity checks to avoid possible race conditions.
@ -611,7 +612,8 @@ meta_core_show_window_menu (Display *xdisplay,
if (window == NULL || window->frame == NULL) if (window == NULL || window->frame == NULL)
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow); meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
meta_window_raise (window); if (meta_prefs_get_raise_on_click ())
meta_window_raise (window);
meta_window_focus (window, timestamp); meta_window_focus (window, timestamp);
meta_window_show_menu (window, root_x, root_y, button, timestamp); meta_window_show_menu (window, root_x, root_y, button, timestamp);

View File

@ -1656,15 +1656,11 @@ event_callback (XEvent *event,
*/ */
if (!frame_was_receiver) if (!frame_was_receiver)
{ {
/* Raise on clicking the client area always or only if (meta_prefs_get_raise_on_click ())
* in click to focus mode? The debate rages.
* Feel free to change TRUE to FALSE or vice versa
*/
if (TRUE /* meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK */)
meta_window_raise (window); meta_window_raise (window);
else else
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"Not raising window on click due to mouse/sloppy focus mode\n"); "Not raising window on click due to don't-raise-on-click option\n");
/* Don't focus panels--they must explicitly request focus. /* Don't focus panels--they must explicitly request focus.
* See bug 160470 * See bug 160470
@ -1735,6 +1731,8 @@ event_callback (XEvent *event,
} }
else if (event->xbutton.button == 3) else if (event->xbutton.button == 3)
{ {
if (meta_prefs_get_raise_on_click ())
meta_window_raise (window);
meta_window_show_menu (window, meta_window_show_menu (window,
event->xbutton.x_root, event->xbutton.x_root,
event->xbutton.y_root, event->xbutton.y_root,
@ -3227,6 +3225,19 @@ meta_display_begin_grab_op (MetaDisplay *display,
return FALSE; return FALSE;
} }
if (window &&
(meta_grab_op_is_moving (op) || meta_grab_op_is_resizing (op)))
{
if (meta_prefs_get_raise_on_click ())
meta_window_raise (window);
else
{
display->grab_initial_x = root_x;
display->grab_initial_y = root_y;
display->grab_threshold_movement_reached = FALSE;
}
}
/* We'll ignore any events < this serial. */ /* We'll ignore any events < this serial. */
if (pointer_already_grabbed) if (pointer_already_grabbed)
display->grab_start_serial = event_serial; display->grab_start_serial = event_serial;
@ -3470,6 +3481,21 @@ meta_display_end_grab_op (MetaDisplay *display,
if (display->grab_window != NULL) if (display->grab_window != NULL)
display->grab_window->shaken_loose = FALSE; display->grab_window->shaken_loose = FALSE;
if (display->grab_window != NULL &&
!meta_prefs_get_raise_on_click () &&
(meta_grab_op_is_moving (display->grab_op) ||
meta_grab_op_is_resizing (display->grab_op)))
{
/* Only raise the window in orthogonal raise
* ('do-not-raise-on-click') mode if the user didn't try to move
* or resize the given window by at least a threshold amount.
* For raise on click mode, the window was raised at the
* beginning of the grab_op.
*/
if (!display->grab_threshold_movement_reached)
meta_window_raise (display->grab_window);
}
if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op) || if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op) ||
display->grab_op == META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING) display->grab_op == META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING)
{ {
@ -3574,6 +3600,20 @@ meta_display_end_grab_op (MetaDisplay *display,
} }
} }
void
meta_display_check_threshold_reached (MetaDisplay *display,
int x,
int y)
{
/* Don't bother doing the check again if we've already reached the threshold */
if (display->grab_threshold_movement_reached)
return;
if (ABS (display->grab_initial_x - x) >= 8 ||
ABS (display->grab_initial_y - y) >= 8)
display->grab_threshold_movement_reached = TRUE;
}
static void static void
meta_change_button_grab (MetaDisplay *display, meta_change_button_grab (MetaDisplay *display,
Window xwindow, Window xwindow,

View File

@ -261,6 +261,8 @@ struct _MetaDisplay
MetaRectangle grab_wireframe_rect; MetaRectangle grab_wireframe_rect;
MetaRectangle grab_wireframe_last_xor_rect; MetaRectangle grab_wireframe_last_xor_rect;
MetaRectangle grab_initial_window_pos; MetaRectangle grab_initial_window_pos;
int grab_initial_x, grab_initial_y;
gboolean grab_threshold_movement_reached;
MetaResizePopup *grab_resize_popup; MetaResizePopup *grab_resize_popup;
GTimeVal grab_last_moveresize_time; GTimeVal grab_last_moveresize_time;
Time grab_motion_notify_time; Time grab_motion_notify_time;
@ -441,6 +443,9 @@ gboolean meta_display_begin_grab_op (MetaDisplay *display,
void meta_display_end_grab_op (MetaDisplay *display, void meta_display_end_grab_op (MetaDisplay *display,
Time timestamp); Time timestamp);
void meta_display_check_threshold_reached (MetaDisplay *display,
int x,
int y);
void meta_display_grab_window_buttons (MetaDisplay *display, void meta_display_grab_window_buttons (MetaDisplay *display,
Window xwindow); Window xwindow);
void meta_display_ungrab_window_buttons (MetaDisplay *display, void meta_display_ungrab_window_buttons (MetaDisplay *display,

View File

@ -1261,13 +1261,11 @@ meta_frames_button_press_event (GtkWidget *widget,
control = get_control (frames, frame, event->x, event->y); control = get_control (frames, frame, event->x, event->y);
/* raise/focus on click, even if click was on client area */ /* focus on click, even if click was on client area */
if (event->button == 1 && if (event->button == 1 &&
!(control == META_FRAME_CONTROL_MINIMIZE || !(control == META_FRAME_CONTROL_MINIMIZE ||
control == META_FRAME_CONTROL_DELETE)) control == META_FRAME_CONTROL_DELETE))
{ {
meta_core_user_raise (gdk_display,
frame->xwindow);
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"Focusing window with frame 0x%lx due to button 1 press\n", "Focusing window with frame 0x%lx due to button 1 press\n",
frame->xwindow); frame->xwindow);

View File

@ -61,6 +61,30 @@
</locale> </locale>
</schema> </schema>
<schema>
<key>/schemas/apps/metacity/general/raise_on_click</key>
<applyto>/apps/metacity/general/raise_on_click</applyto>
<owner>metacity</owner>
<type>bool</type>
<default>true</default>
<locale name="C">
<short>Whether raising should be a side-effect of other user
interactions</short>
<long>
Many actions (e.g. clicking in the client area, moving or
resizing the window) normally raise the window as a side-effect.
Set this option to false to decouple raising from other user
interactions. When false, windows can still be raised by an
alt-left-click anywhere on the window or a normal click on the
window decorations (assuming such clicks aren't used to start a
move or resize operation). Special messages, such as activation
requests from pagers, may also raise windows when this option is
false. This option is currently disabled in click-to-focus
mode.
</long>
</locale>
</schema>
<schema> <schema>
<key>/schemas/apps/metacity/general/action_double_click_titlebar</key> <key>/schemas/apps/metacity/general/action_double_click_titlebar</key>
<applyto>/apps/metacity/general/action_double_click_titlebar</applyto> <applyto>/apps/metacity/general/action_double_click_titlebar</applyto>

View File

@ -41,6 +41,7 @@
*/ */
#define KEY_MOUSE_BUTTON_MODS "/apps/metacity/general/mouse_button_modifier" #define KEY_MOUSE_BUTTON_MODS "/apps/metacity/general/mouse_button_modifier"
#define KEY_FOCUS_MODE "/apps/metacity/general/focus_mode" #define KEY_FOCUS_MODE "/apps/metacity/general/focus_mode"
#define KEY_RAISE_ON_CLICK "/apps/metacity/general/raise_on_click"
#define KEY_ACTION_DOUBLE_CLICK_TITLEBAR "/apps/metacity/general/action_double_click_titlebar" #define KEY_ACTION_DOUBLE_CLICK_TITLEBAR "/apps/metacity/general/action_double_click_titlebar"
#define KEY_AUTO_RAISE "/apps/metacity/general/auto_raise" #define KEY_AUTO_RAISE "/apps/metacity/general/auto_raise"
#define KEY_AUTO_RAISE_DELAY "/apps/metacity/general/auto_raise_delay" #define KEY_AUTO_RAISE_DELAY "/apps/metacity/general/auto_raise_delay"
@ -80,6 +81,7 @@ static gboolean use_system_font = TRUE;
static PangoFontDescription *titlebar_font = NULL; static PangoFontDescription *titlebar_font = NULL;
static MetaVirtualModifier mouse_button_mods = Mod1Mask; static MetaVirtualModifier mouse_button_mods = Mod1Mask;
static MetaFocusMode focus_mode = META_FOCUS_MODE_CLICK; static MetaFocusMode focus_mode = META_FOCUS_MODE_CLICK;
static gboolean raise_on_click = TRUE;
static char* current_theme = NULL; static char* current_theme = NULL;
static int num_workspaces = 4; static int num_workspaces = 4;
static MetaActionDoubleClickTitlebar action_double_click_titlebar = static MetaActionDoubleClickTitlebar action_double_click_titlebar =
@ -123,6 +125,7 @@ static gboolean update_use_system_font (gboolean value);
static gboolean update_titlebar_font (const char *value); static gboolean update_titlebar_font (const char *value);
static gboolean update_mouse_button_mods (const char *value); static gboolean update_mouse_button_mods (const char *value);
static gboolean update_focus_mode (const char *value); static gboolean update_focus_mode (const char *value);
static gboolean update_raise_on_click (gboolean value);
static gboolean update_theme (const char *value); static gboolean update_theme (const char *value);
static gboolean update_visual_bell (gboolean v1, gboolean v2); static gboolean update_visual_bell (gboolean v1, gboolean v2);
static gboolean update_visual_bell_type (const char *value); static gboolean update_visual_bell_type (const char *value);
@ -346,6 +349,11 @@ meta_prefs_init (void)
update_focus_mode (str_val); update_focus_mode (str_val);
g_free (str_val); g_free (str_val);
bool_val = gconf_client_get_bool (default_client, KEY_RAISE_ON_CLICK,
&err);
cleanup_error (&err);
update_raise_on_click (bool_val);
str_val = gconf_client_get_string (default_client, str_val = gconf_client_get_string (default_client,
KEY_ACTION_DOUBLE_CLICK_TITLEBAR, KEY_ACTION_DOUBLE_CLICK_TITLEBAR,
&err); &err);
@ -551,6 +559,22 @@ change_notify (GConfClient *client,
if (update_focus_mode (str)) if (update_focus_mode (str))
queue_changed (META_PREF_FOCUS_MODE); queue_changed (META_PREF_FOCUS_MODE);
} }
else if (strcmp (key, KEY_RAISE_ON_CLICK) == 0)
{
gboolean b;
if (value && value->type != GCONF_VALUE_BOOL)
{
meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
KEY_RAISE_ON_CLICK);
goto out;
}
b = value ? gconf_value_get_bool (value) : TRUE;
if (update_raise_on_click (b))
queue_changed (META_PREF_RAISE_ON_CLICK);
}
else if (strcmp (key, KEY_THEME) == 0) else if (strcmp (key, KEY_THEME) == 0)
{ {
const char *str; const char *str;
@ -972,6 +996,18 @@ update_focus_mode (const char *value)
} }
#endif /* HAVE_GCONF */ #endif /* HAVE_GCONF */
#ifdef HAVE_GCONF
static gboolean
update_raise_on_click (gboolean value)
{
gboolean old = raise_on_click;
raise_on_click = value;
return old != value;
}
#endif /* HAVE_GCONF */
#ifdef HAVE_GCONF #ifdef HAVE_GCONF
static gboolean static gboolean
update_theme (const char *value) update_theme (const char *value)
@ -1018,6 +1054,15 @@ meta_prefs_get_focus_mode (void)
return focus_mode; return focus_mode;
} }
gboolean
meta_prefs_get_raise_on_click (void)
{
/* Force raise_on_click on for click-to-focus, as requested by Havoc
* in #326156.
*/
return raise_on_click || focus_mode == META_FOCUS_MODE_CLICK;
}
const char* const char*
meta_prefs_get_theme (void) meta_prefs_get_theme (void)
{ {
@ -1496,6 +1541,9 @@ meta_preference_to_string (MetaPreference pref)
case META_PREF_FOCUS_MODE: case META_PREF_FOCUS_MODE:
return "FOCUS_MODE"; return "FOCUS_MODE";
case META_PREF_RAISE_ON_CLICK:
return "RAISE_ON_CLICK";
case META_PREF_THEME: case META_PREF_THEME:
return "THEME"; return "THEME";

View File

@ -30,6 +30,7 @@ typedef enum
{ {
META_PREF_MOUSE_BUTTON_MODS, META_PREF_MOUSE_BUTTON_MODS,
META_PREF_FOCUS_MODE, META_PREF_FOCUS_MODE,
META_PREF_RAISE_ON_CLICK,
META_PREF_ACTION_DOUBLE_CLICK_TITLEBAR, META_PREF_ACTION_DOUBLE_CLICK_TITLEBAR,
META_PREF_AUTO_RAISE, META_PREF_AUTO_RAISE,
META_PREF_AUTO_RAISE_DELAY, META_PREF_AUTO_RAISE_DELAY,
@ -66,6 +67,7 @@ const char* meta_preference_to_string (MetaPreference pref);
MetaVirtualModifier meta_prefs_get_mouse_button_mods (void); MetaVirtualModifier meta_prefs_get_mouse_button_mods (void);
MetaFocusMode meta_prefs_get_focus_mode (void); MetaFocusMode meta_prefs_get_focus_mode (void);
gboolean meta_prefs_get_raise_on_click (void);
const char* meta_prefs_get_theme (void); const char* meta_prefs_get_theme (void);
/* returns NULL if GTK default should be used */ /* returns NULL if GTK default should be used */
const PangoFontDescription* meta_prefs_get_titlebar_font (void); const PangoFontDescription* meta_prefs_get_titlebar_font (void);

View File

@ -1953,17 +1953,19 @@ meta_window_show (MetaWindow *window)
ensure_mru_position_after (window, focus_window); ensure_mru_position_after (window, focus_window);
/* We don't want the denied-focus window to obscure the focus /* We don't want the denied-focus window to obscure the focus
* window, and in click-to-focus-mode we want to maintain the * window, and if we're in both click-to-focus mode and
* invariant that MRU order == stacking order. The need for * raise-on-click mode then we want to maintain the invariant
* this if comes from the fact that in sloppy/mouse focus the * that MRU order == stacking order. The need for this if
* focus window may not overlap other windows and also can be * comes from the fact that in sloppy/mouse focus the focus
* considered "below" them; this combination means that placing * window may not overlap other windows and also can be
* the denied-focus window "below" the focus window in the * considered "below" them; this combination means that
* stack when it doesn't overlap it confusingly places that new * placing the denied-focus window "below" the focus window
* window below a lot of other windows. * in the stack when it doesn't overlap it confusingly places
* that new window below a lot of other windows.
*/ */
if (overlap || if (overlap ||
meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK) (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK &&
meta_prefs_get_raise_on_click ()))
meta_window_stack_just_below (window, focus_window); meta_window_stack_just_below (window, focus_window);
/* If the window will be obscured by the focus window, then the /* If the window will be obscured by the focus window, then the
@ -2466,8 +2468,11 @@ window_activate (MetaWindow *window,
meta_window_unshade (window); meta_window_unshade (window);
unminimize_window_and_all_transient_parents (window); unminimize_window_and_all_transient_parents (window);
meta_window_raise (window); if (meta_prefs_get_raise_on_click () ||
source_indication == META_CLIENT_TYPE_PAGER)
meta_window_raise (window);
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"Focusing window %s due to activation\n", "Focusing window %s due to activation\n",
window->desc); window->desc);
@ -4217,7 +4222,8 @@ meta_window_configure_request (MetaWindow *window,
{ {
MetaWindow *active_window; MetaWindow *active_window;
active_window = window->display->expected_focus_window; active_window = window->display->expected_focus_window;
if (meta_prefs_get_disable_workarounds ()) if (meta_prefs_get_disable_workarounds () ||
!meta_prefs_get_raise_on_click ())
{ {
meta_topic (META_DEBUG_STACK, meta_topic (META_DEBUG_STACK,
"%s sent an xconfigure stacking request; this is " "%s sent an xconfigure stacking request; this is "
@ -7156,6 +7162,9 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window,
switch (event->type) switch (event->type)
{ {
case ButtonRelease: case ButtonRelease:
meta_display_check_threshold_reached (window->display,
event->xbutton.x_root,
event->xbutton.y_root);
/* If the user was snap moving then ignore the button release /* If the user was snap moving then ignore the button release
* because they may have let go of shift before releasing the * because they may have let go of shift before releasing the
* mouse button and they almost certainly do not want a * mouse button and they almost certainly do not want a
@ -7184,6 +7193,9 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window,
break; break;
case MotionNotify: case MotionNotify:
meta_display_check_threshold_reached (window->display,
event->xmotion.x_root,
event->xmotion.y_root);
if (meta_grab_op_is_moving (window->display->grab_op)) if (meta_grab_op_is_moving (window->display->grab_op))
{ {
if (event->xmotion.root == window->screen->xroot) if (event->xmotion.root == window->screen->xroot)
@ -7680,8 +7692,6 @@ meta_window_begin_grab_op (MetaWindow *window,
grab_start_serial = XNextRequest (window->display->xdisplay); grab_start_serial = XNextRequest (window->display->xdisplay);
meta_window_raise (window);
warp_grab_pointer (window, warp_grab_pointer (window,
op, &x, &y); op, &x, &y);