fix broken "tmp = tmp->data"
2001-12-10 Havoc Pennington <hp@pobox.com> * src/screen.c (meta_screen_foreach_window): fix broken "tmp = tmp->data" Implement do-not-pass-thru-click for click-to-focus mode. * src/screen.c (update_focus_mode): when focus mode changes, update all the window grabs * src/display.c (meta_display_grab_unfocused_window_buttons): implement grabbing button 1 on client area of unfocused click-to-focus windows * src/window.c (meta_window_update_unfocused_button_grabs): update whether we're grabbing unmodified button 1 on client area according to focus state and focus mode (meta_window_new): start out with proper grab state
This commit is contained in:
parent
3fa131695b
commit
fa803fd88f
19
ChangeLog
19
ChangeLog
@ -1,3 +1,22 @@
|
|||||||
|
2001-12-10 Havoc Pennington <hp@pobox.com>
|
||||||
|
|
||||||
|
* src/screen.c (meta_screen_foreach_window): fix broken
|
||||||
|
"tmp = tmp->data"
|
||||||
|
|
||||||
|
Implement do-not-pass-thru-click for click-to-focus mode.
|
||||||
|
|
||||||
|
* src/screen.c (update_focus_mode): when focus mode changes,
|
||||||
|
update all the window grabs
|
||||||
|
|
||||||
|
* src/display.c (meta_display_grab_unfocused_window_buttons):
|
||||||
|
implement grabbing button 1 on client area of unfocused
|
||||||
|
click-to-focus windows
|
||||||
|
|
||||||
|
* src/window.c (meta_window_update_unfocused_button_grabs): update
|
||||||
|
whether we're grabbing unmodified button 1 on client area
|
||||||
|
according to focus state and focus mode
|
||||||
|
(meta_window_new): start out with proper grab state
|
||||||
|
|
||||||
2001-12-10 Havoc Pennington <hp@pobox.com>
|
2001-12-10 Havoc Pennington <hp@pobox.com>
|
||||||
|
|
||||||
* src/menu.c (meta_window_menu_new): don't do mnemonics for
|
* src/menu.c (meta_window_menu_new): don't do mnemonics for
|
||||||
|
@ -704,11 +704,13 @@ event_callback (XEvent *event,
|
|||||||
if (g_getenv ("METACITY_DEBUG_BUTTON_GRABS"))
|
if (g_getenv ("METACITY_DEBUG_BUTTON_GRABS"))
|
||||||
grab_mask |= ControlMask;
|
grab_mask |= ControlMask;
|
||||||
|
|
||||||
if ((event->xbutton.state & grab_mask) == 0)
|
if (!window->unfocused_buttons_grabbed &&
|
||||||
|
(event->xbutton.state & grab_mask) == 0)
|
||||||
{
|
{
|
||||||
; /* nothing, not getting event from our button grabs,
|
; /* nothing, not getting event from our button grabs,
|
||||||
* rather from a client that just let button presses
|
* rather from a client that just let button presses
|
||||||
* pass through to our frame
|
* pass through to our frame, and we don't have
|
||||||
|
* the click-to-focus first-click-to-raise grab
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
else if (event->xbutton.button == 1)
|
else if (event->xbutton.button == 1)
|
||||||
@ -716,6 +718,10 @@ event_callback (XEvent *event,
|
|||||||
meta_window_raise (window);
|
meta_window_raise (window);
|
||||||
meta_window_focus (window, event->xbutton.time);
|
meta_window_focus (window, event->xbutton.time);
|
||||||
|
|
||||||
|
/* you can move on alt-click but not on
|
||||||
|
* first-unmodified-click
|
||||||
|
*/
|
||||||
|
if (!window->unfocused_buttons_grabbed)
|
||||||
begin_move = TRUE;
|
begin_move = TRUE;
|
||||||
}
|
}
|
||||||
else if (event->xbutton.button == 2)
|
else if (event->xbutton.button == 2)
|
||||||
@ -1737,6 +1743,50 @@ meta_display_ungrab_window_buttons (MetaDisplay *display,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Grab buttons we only grab while unfocused in click-to-focus mode */
|
||||||
|
void
|
||||||
|
meta_display_grab_unfocused_window_buttons (MetaDisplay *display,
|
||||||
|
Window xwindow)
|
||||||
|
{
|
||||||
|
/* Grab button 1 for activating unfocused windows */
|
||||||
|
meta_verbose ("Grabbing unfocused window buttons for 0x%lx\n", xwindow);
|
||||||
|
|
||||||
|
/* FIXME If we ignored errors here instead of spewing, we could
|
||||||
|
* put one big error trap around the loop and avoid a bunch of
|
||||||
|
* XSync()
|
||||||
|
*/
|
||||||
|
|
||||||
|
{
|
||||||
|
int i = 1;
|
||||||
|
while (i < 2)
|
||||||
|
{
|
||||||
|
meta_change_button_grab (display,
|
||||||
|
xwindow,
|
||||||
|
TRUE, i, 0);
|
||||||
|
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_display_ungrab_unfocused_window_buttons (MetaDisplay *display,
|
||||||
|
Window xwindow)
|
||||||
|
{
|
||||||
|
meta_verbose ("Ungrabbing unfocused window buttons for 0x%lx\n", xwindow);
|
||||||
|
|
||||||
|
{
|
||||||
|
int i = 1;
|
||||||
|
while (i < 2)
|
||||||
|
{
|
||||||
|
meta_change_button_grab (display, xwindow,
|
||||||
|
FALSE, i, 0);
|
||||||
|
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_display_increment_event_serial (MetaDisplay *display)
|
meta_display_increment_event_serial (MetaDisplay *display)
|
||||||
{
|
{
|
||||||
|
@ -195,6 +195,12 @@ void meta_display_grab_window_buttons (MetaDisplay *display,
|
|||||||
void meta_display_ungrab_window_buttons (MetaDisplay *display,
|
void meta_display_ungrab_window_buttons (MetaDisplay *display,
|
||||||
Window xwindow);
|
Window xwindow);
|
||||||
|
|
||||||
|
void meta_display_grab_unfocused_window_buttons (MetaDisplay *display,
|
||||||
|
Window xwindow);
|
||||||
|
void meta_display_ungrab_unfocused_window_buttons (MetaDisplay *display,
|
||||||
|
Window xwindow);
|
||||||
|
|
||||||
|
|
||||||
/* make a request to ensure the event serial has changed */
|
/* make a request to ensure the event serial has changed */
|
||||||
void meta_display_increment_event_serial (MetaDisplay *display);
|
void meta_display_increment_event_serial (MetaDisplay *display);
|
||||||
|
|
||||||
|
21
src/screen.c
21
src/screen.c
@ -38,6 +38,7 @@ static char* get_screen_name (MetaDisplay *display,
|
|||||||
int number);
|
int number);
|
||||||
|
|
||||||
static void update_num_workspaces (MetaScreen *screen);
|
static void update_num_workspaces (MetaScreen *screen);
|
||||||
|
static void update_focus_mode (MetaScreen *screen);
|
||||||
static void prefs_changed_callback (MetaPreference pref,
|
static void prefs_changed_callback (MetaPreference pref,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
|
|
||||||
@ -316,6 +317,10 @@ prefs_changed_callback (MetaPreference pref,
|
|||||||
{
|
{
|
||||||
update_num_workspaces (screen);
|
update_num_workspaces (screen);
|
||||||
}
|
}
|
||||||
|
else if (pref == META_PREF_FOCUS_MODE)
|
||||||
|
{
|
||||||
|
update_focus_mode (screen);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -404,7 +409,7 @@ meta_screen_foreach_window (MetaScreen *screen,
|
|||||||
(* func) (screen, window, data);
|
(* func) (screen, window, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp = tmp->data;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
g_slist_free (winlist);
|
g_slist_free (winlist);
|
||||||
}
|
}
|
||||||
@ -540,6 +545,20 @@ update_num_workspaces (MetaScreen *screen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_grabs_func (MetaScreen *screen, MetaWindow *window,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
meta_window_update_unfocused_button_grabs (window);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_focus_mode (MetaScreen *screen)
|
||||||
|
{
|
||||||
|
meta_screen_foreach_window (screen, update_grabs_func, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_screen_set_cursor (MetaScreen *screen,
|
meta_screen_set_cursor (MetaScreen *screen,
|
||||||
MetaCursor cursor)
|
MetaCursor cursor)
|
||||||
|
52
src/window.c
52
src/window.c
@ -31,6 +31,7 @@
|
|||||||
#include "place.h"
|
#include "place.h"
|
||||||
#include "session.h"
|
#include "session.h"
|
||||||
#include "effects.h"
|
#include "effects.h"
|
||||||
|
#include "prefs.h"
|
||||||
|
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
|
|
||||||
@ -303,6 +304,7 @@ meta_window_new (MetaDisplay *display, Window xwindow,
|
|||||||
window->keys_grabbed = FALSE;
|
window->keys_grabbed = FALSE;
|
||||||
window->grab_on_frame = FALSE;
|
window->grab_on_frame = FALSE;
|
||||||
window->all_keys_grabbed = FALSE;
|
window->all_keys_grabbed = FALSE;
|
||||||
|
window->unfocused_buttons_grabbed = FALSE;
|
||||||
window->withdrawn = FALSE;
|
window->withdrawn = FALSE;
|
||||||
window->initial_workspace_set = FALSE;
|
window->initial_workspace_set = FALSE;
|
||||||
window->calc_placement = FALSE;
|
window->calc_placement = FALSE;
|
||||||
@ -421,6 +423,7 @@ meta_window_new (MetaDisplay *display, Window xwindow,
|
|||||||
|
|
||||||
meta_window_grab_keys (window);
|
meta_window_grab_keys (window);
|
||||||
meta_display_grab_window_buttons (window->display, window->xwindow);
|
meta_display_grab_window_buttons (window->display, window->xwindow);
|
||||||
|
meta_window_update_unfocused_button_grabs (window);
|
||||||
|
|
||||||
/* For the workspace, first honor hints,
|
/* For the workspace, first honor hints,
|
||||||
* if that fails put transients with parents,
|
* if that fails put transients with parents,
|
||||||
@ -2021,6 +2024,53 @@ meta_window_focus (MetaWindow *window,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_window_update_unfocused_button_grabs (MetaWindow *window)
|
||||||
|
{
|
||||||
|
/* Grab buttons if we're unfocused and in click-to-focus mode,
|
||||||
|
* ungrab otherwise
|
||||||
|
*/
|
||||||
|
if (window->unfocused_buttons_grabbed)
|
||||||
|
{
|
||||||
|
if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK)
|
||||||
|
{
|
||||||
|
if (window->has_focus)
|
||||||
|
{
|
||||||
|
/* Focused so undo grab */
|
||||||
|
meta_verbose ("Ungrabbing on focused window %s since mode is click-to-focus\n",
|
||||||
|
window->desc);
|
||||||
|
meta_display_ungrab_unfocused_window_buttons (window->display,
|
||||||
|
window->xwindow);
|
||||||
|
window->unfocused_buttons_grabbed = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Not in click-to-focus so undo grab */
|
||||||
|
meta_verbose ("Ungrabbing on window %s since mode is not click-to-focus\n",
|
||||||
|
window->desc);
|
||||||
|
meta_display_ungrab_unfocused_window_buttons (window->display,
|
||||||
|
window->xwindow);
|
||||||
|
window->unfocused_buttons_grabbed = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK)
|
||||||
|
{
|
||||||
|
if (!window->has_focus)
|
||||||
|
{
|
||||||
|
/* Not focused so grab */
|
||||||
|
meta_verbose ("Grabbing on unfocused window %s since mode is click-to-focus\n",
|
||||||
|
window->desc);
|
||||||
|
meta_display_grab_unfocused_window_buttons (window->display,
|
||||||
|
window->xwindow);
|
||||||
|
window->unfocused_buttons_grabbed = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_window_change_workspace (MetaWindow *window,
|
meta_window_change_workspace (MetaWindow *window,
|
||||||
MetaWorkspace *workspace)
|
MetaWorkspace *workspace)
|
||||||
@ -2609,6 +2659,7 @@ meta_window_notify_focus (MetaWindow *window,
|
|||||||
window->has_focus = TRUE;
|
window->has_focus = TRUE;
|
||||||
if (window->frame)
|
if (window->frame)
|
||||||
meta_frame_queue_draw (window->frame);
|
meta_frame_queue_draw (window->frame);
|
||||||
|
meta_window_update_unfocused_button_grabs (window);
|
||||||
}
|
}
|
||||||
else if (event->type == FocusOut ||
|
else if (event->type == FocusOut ||
|
||||||
event->type == UnmapNotify)
|
event->type == UnmapNotify)
|
||||||
@ -2624,6 +2675,7 @@ meta_window_notify_focus (MetaWindow *window,
|
|||||||
window->has_focus = FALSE;
|
window->has_focus = FALSE;
|
||||||
if (window->frame)
|
if (window->frame)
|
||||||
meta_frame_queue_draw (window->frame);
|
meta_frame_queue_draw (window->frame);
|
||||||
|
meta_window_update_unfocused_button_grabs (window);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now set _NET_ACTIVE_WINDOW hint */
|
/* Now set _NET_ACTIVE_WINDOW hint */
|
||||||
|
@ -174,6 +174,9 @@ struct _MetaWindow
|
|||||||
guint grab_on_frame : 1; /* grabs are on the frame */
|
guint grab_on_frame : 1; /* grabs are on the frame */
|
||||||
guint all_keys_grabbed : 1; /* AnyKey grabbed */
|
guint all_keys_grabbed : 1; /* AnyKey grabbed */
|
||||||
|
|
||||||
|
/* Used by display.c */
|
||||||
|
guint unfocused_buttons_grabbed : 1; /* have the unmodified buttons grabbed */
|
||||||
|
|
||||||
/* Set if the reason for unmanaging the window is that
|
/* Set if the reason for unmanaging the window is that
|
||||||
* it was withdrawn
|
* it was withdrawn
|
||||||
*/
|
*/
|
||||||
@ -303,6 +306,7 @@ void meta_window_focus (MetaWindow *window,
|
|||||||
void meta_window_raise (MetaWindow *window);
|
void meta_window_raise (MetaWindow *window);
|
||||||
void meta_window_lower (MetaWindow *window);
|
void meta_window_lower (MetaWindow *window);
|
||||||
|
|
||||||
|
void meta_window_update_unfocused_button_grabs (MetaWindow *window);
|
||||||
|
|
||||||
/* Sends a client message */
|
/* Sends a client message */
|
||||||
void meta_window_send_icccm_message (MetaWindow *window,
|
void meta_window_send_icccm_message (MetaWindow *window,
|
||||||
|
Loading…
Reference in New Issue
Block a user