mirror of
https://github.com/brl/mutter.git
synced 2024-11-28 19:10:43 -05:00
Add "busy cursor on app startup" support, conditionally - works only if
2002-10-25 Havoc Pennington <hp@pobox.com> Add "busy cursor on app startup" support, conditionally - works only if libstartup-notification is found, and in practice requires a GTK patch that's not in yet. * src/screen.c: monitor startup events and set busy cursor if appropriate * src/display.c (meta_display_open): create SnDisplay * configure.in: check for startup notification, and add the cute "configure summary" at the end
This commit is contained in:
parent
c3a5c4c169
commit
cb27f0c4be
14
ChangeLog
14
ChangeLog
@ -1,3 +1,17 @@
|
|||||||
|
2002-10-25 Havoc Pennington <hp@pobox.com>
|
||||||
|
|
||||||
|
Add "busy cursor on app startup" support, conditionally - works
|
||||||
|
only if libstartup-notification is found, and in practice requires
|
||||||
|
a GTK patch that's not in yet.
|
||||||
|
|
||||||
|
* src/screen.c: monitor startup events and set busy cursor if
|
||||||
|
appropriate
|
||||||
|
|
||||||
|
* src/display.c (meta_display_open): create SnDisplay
|
||||||
|
|
||||||
|
* configure.in: check for startup notification,
|
||||||
|
and add the cute "configure summary" at the end
|
||||||
|
|
||||||
2002-10-24 Havoc Pennington <hp@redhat.com>
|
2002-10-24 Havoc Pennington <hp@redhat.com>
|
||||||
|
|
||||||
* src/theme.c (meta_frame_layout_calc_geometry): if only one
|
* src/theme.c (meta_frame_layout_calc_geometry): if only one
|
||||||
|
@ -15,3 +15,5 @@
|
|||||||
#undef HAVE_XFREE_XINERAMA
|
#undef HAVE_XFREE_XINERAMA
|
||||||
#undef HAVE_SHAPE
|
#undef HAVE_SHAPE
|
||||||
#undef HAVE_RANDR
|
#undef HAVE_RANDR
|
||||||
|
#undef HAVE_STARTUP_NOTIFICATION
|
||||||
|
|
||||||
|
58
configure.in
58
configure.in
@ -91,13 +91,27 @@ ALL_LINGUAS="az ca cs da de el es fr gl hu it ja ko lv ms no pl pt pt_BR ro ru s
|
|||||||
AM_GLIB_GNU_GETTEXT
|
AM_GLIB_GNU_GETTEXT
|
||||||
|
|
||||||
## here we get the flags we'll actually use
|
## here we get the flags we'll actually use
|
||||||
PKG_CHECK_MODULES(METACITY, gtk+-2.0 >= 2.0.0 gconf-2.0 >= 1.1.9)
|
|
||||||
PKG_CHECK_MODULES(METACITY_MESSAGE, gtk+-2.0 >= 2.0.0)
|
PKG_CHECK_MODULES(METACITY_MESSAGE, gtk+-2.0 >= 2.0.0)
|
||||||
PKG_CHECK_MODULES(METACITY_WINDOW_DEMO, gtk+-2.0 >= 2.0.0)
|
PKG_CHECK_MODULES(METACITY_WINDOW_DEMO, gtk+-2.0 >= 2.0.0)
|
||||||
PKG_CHECK_MODULES(METACITY_PROPS, gtk+-2.0 >= 2.0.0 gconf-2.0 >= 1.1.9 libglade-2.0)
|
PKG_CHECK_MODULES(METACITY_PROPS, gtk+-2.0 >= 2.0.0 gconf-2.0 >= 1.1.9 libglade-2.0)
|
||||||
|
|
||||||
|
STARTUP_NOTIFICATION_VERSION=0.2
|
||||||
|
if $PKG_CONFIG --atleast-version $STARTUP_NOTIFICATION_VERSION libstartup-notification-1.0; then
|
||||||
|
echo "Building with libstartup-notification"
|
||||||
|
PKG_CHECK_MODULES(METACITY, gtk+-2.0 >= 2.0.0 gconf-2.0 >= 1.1.9 libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_VERSION)
|
||||||
|
AC_DEFINE(HAVE_STARTUP_NOTIFICATION)
|
||||||
|
with_startup_notification=yes
|
||||||
|
else
|
||||||
|
echo "Building without libstartup-notification"
|
||||||
|
PKG_CHECK_MODULES(METACITY, gtk+-2.0 >= 2.0.0 gconf-2.0 >= 1.1.9)
|
||||||
|
with_startup_notification=no
|
||||||
|
fi
|
||||||
|
|
||||||
if $PKG_CONFIG --atleast-version 2.1.0 gtk+-2.0; then
|
if $PKG_CONFIG --atleast-version 2.1.0 gtk+-2.0; then
|
||||||
AC_DEFINE(HAVE_GTK_MULTIHEAD,,[gtk+ with multihead support found])
|
AC_DEFINE(HAVE_GTK_MULTIHEAD,,[gtk+ with multihead support found])
|
||||||
|
with_multihead=yes
|
||||||
|
else
|
||||||
|
with_multihead=no
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_PATH_XTRA
|
AC_PATH_XTRA
|
||||||
@ -108,6 +122,8 @@ ALL_X_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
|||||||
metacity_save_cppflags="$CPPFLAGS"
|
metacity_save_cppflags="$CPPFLAGS"
|
||||||
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
|
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
|
||||||
|
|
||||||
|
use_solaris_xinerama=no
|
||||||
|
use_xfree_xinerama=no
|
||||||
case "$host" in
|
case "$host" in
|
||||||
*-*-solaris*)
|
*-*-solaris*)
|
||||||
# Check for solaris
|
# Check for solaris
|
||||||
@ -150,25 +166,25 @@ esac
|
|||||||
CPPFLAGS="$metacity_save_cppflags"
|
CPPFLAGS="$metacity_save_cppflags"
|
||||||
|
|
||||||
SHAPE_LIBS=
|
SHAPE_LIBS=
|
||||||
found_shape=false
|
found_shape=no
|
||||||
AC_CHECK_LIB(Xext, XShapeQueryExtension,
|
AC_CHECK_LIB(Xext, XShapeQueryExtension,
|
||||||
[AC_CHECK_HEADERS(X11/extensions/shape.h,
|
[AC_CHECK_HEADERS(X11/extensions/shape.h,
|
||||||
SHAPE_LIBS=-lXext found_shape=true)],
|
SHAPE_LIBS=-lXext found_shape=yes)],
|
||||||
, $ALL_X_LIBS)
|
, $ALL_X_LIBS)
|
||||||
|
|
||||||
if test "$found_shape" = "true"; then
|
if test "$found_shape" = "no"; then
|
||||||
AC_DEFINE(HAVE_SHAPE)
|
AC_DEFINE(HAVE_SHAPE)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RANDR_LIBS=
|
RANDR_LIBS=
|
||||||
found_randr=false
|
found_randr=no
|
||||||
AC_CHECK_LIB(Xrandr, XRRUpdateConfiguration,
|
AC_CHECK_LIB(Xrandr, XRRUpdateConfiguration,
|
||||||
[AC_CHECK_HEADERS(X11/extensions/Xrandr.h,
|
[AC_CHECK_HEADERS(X11/extensions/Xrandr.h,
|
||||||
RANDR_LIBS=-lXrandr, found_randr=true,
|
RANDR_LIBS=-lXrandr, found_randr=yes,
|
||||||
[#include <X11/Xlib.h>])],
|
[#include <X11/Xlib.h>])],
|
||||||
, -lXrender $ALL_X_LIBS)
|
, -lXrender $ALL_X_LIBS)
|
||||||
|
|
||||||
if test "$found_randr" = "true"; then
|
if test "$found_randr" = "yes"; then
|
||||||
AC_DEFINE(HAVE_RANDR)
|
AC_DEFINE(HAVE_RANDR)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -177,24 +193,24 @@ METACITY_MESSAGE_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_MESSAGE
|
|||||||
METACITY_WINDOW_DEMO_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_WINDOW_DEMO_LIBS"
|
METACITY_WINDOW_DEMO_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_WINDOW_DEMO_LIBS"
|
||||||
METACITY_PROPS_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_PROPS_LIBS"
|
METACITY_PROPS_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_PROPS_LIBS"
|
||||||
|
|
||||||
found_sm=false
|
found_sm=no
|
||||||
case "$METACITY_LIBS" in
|
case "$METACITY_LIBS" in
|
||||||
*-lSM*)
|
*-lSM*)
|
||||||
found_sm=true
|
found_sm=yes
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
AC_CHECK_LIB(SM, SmcSaveYourselfDone,
|
AC_CHECK_LIB(SM, SmcSaveYourselfDone,
|
||||||
[AC_CHECK_HEADERS(X11/SM/SMlib.h,
|
[AC_CHECK_HEADERS(X11/SM/SMlib.h,
|
||||||
METACITY_LIBS="-lSM -lICE $METACITY_LIBS" found_sm=true)],
|
METACITY_LIBS="-lSM -lICE $METACITY_LIBS" found_sm=no)],
|
||||||
, $METACITY_LIBS)
|
, $METACITY_LIBS)
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if test "$found_sm" = "true"; then
|
if test "$found_sm" = "yes"; then
|
||||||
AC_DEFINE(HAVE_SM)
|
AC_DEFINE(HAVE_SM)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AM_CONDITIONAL(HAVE_SM, test "$found_sm" = "true")
|
AM_CONDITIONAL(HAVE_SM, test "$found_sm" = "yes")
|
||||||
|
|
||||||
HOST_ALIAS=$host_alias
|
HOST_ALIAS=$host_alias
|
||||||
AC_SUBST(HOST_ALIAS)
|
AC_SUBST(HOST_ALIAS)
|
||||||
@ -230,3 +246,21 @@ src/themes/Makefile
|
|||||||
po/Makefile.in
|
po/Makefile.in
|
||||||
metacity.spec
|
metacity.spec
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl ==========================================================================
|
||||||
|
echo "
|
||||||
|
metacity-$VERSION:
|
||||||
|
|
||||||
|
prefix: ${prefix}
|
||||||
|
source code location: ${srcdir}
|
||||||
|
compiler: ${CC}
|
||||||
|
|
||||||
|
XFree86 Xinerama: ${use_xfree_xinerama}
|
||||||
|
Solaris Xinerama: ${use_solaris_xinerama}
|
||||||
|
Multihead: ${with_multihead}
|
||||||
|
Startup notification: ${with_startup_notification}
|
||||||
|
Session management: ${found_sm}
|
||||||
|
Shape extension: ${found_shape}
|
||||||
|
Resize-and-rotate: ${found_randr}
|
||||||
|
|
||||||
|
"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
SUBDIRS=wm-tester tools themes
|
SUBDIRS=wm-tester tools themes
|
||||||
|
|
||||||
INCLUDES=@METACITY_CFLAGS@ -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMETACITY_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMETACITY_PKGDATADIR=\"$(pkgdatadir)\" -DMETACITY_DATADIR=\"$(datadir)\" -DG_LOG_DOMAIN=\"metacity\"
|
INCLUDES=@METACITY_CFLAGS@ -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMETACITY_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMETACITY_PKGDATADIR=\"$(pkgdatadir)\" -DMETACITY_DATADIR=\"$(datadir)\" -DG_LOG_DOMAIN=\"metacity\" -DSN_API_NOT_YET_FROZEN=1
|
||||||
|
|
||||||
EGGFILES= \
|
EGGFILES= \
|
||||||
eggaccelerators.c \
|
eggaccelerators.c \
|
||||||
|
@ -129,7 +129,8 @@ typedef enum
|
|||||||
META_CURSOR_NE_RESIZE,
|
META_CURSOR_NE_RESIZE,
|
||||||
META_CURSOR_NW_RESIZE,
|
META_CURSOR_NW_RESIZE,
|
||||||
META_CURSOR_MOVE_WINDOW,
|
META_CURSOR_MOVE_WINDOW,
|
||||||
META_CURSOR_RESIZE_WINDOW
|
META_CURSOR_RESIZE_WINDOW,
|
||||||
|
META_CURSOR_BUSY
|
||||||
|
|
||||||
} MetaCursor;
|
} MetaCursor;
|
||||||
|
|
||||||
|
@ -138,6 +138,27 @@ remove_pending_pings_for_window (MetaDisplay *display, Window xwindow)
|
|||||||
g_slist_free (dead);
|
g_slist_free (dead);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
sn_error_trap_push (SnDisplay *sn_display,
|
||||||
|
Display *xdisplay)
|
||||||
|
{
|
||||||
|
MetaDisplay *display;
|
||||||
|
display = meta_display_for_x_display (xdisplay);
|
||||||
|
if (display != NULL)
|
||||||
|
meta_error_trap_push (display);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sn_error_trap_pop (SnDisplay *sn_display,
|
||||||
|
Display *xdisplay)
|
||||||
|
{
|
||||||
|
MetaDisplay *display;
|
||||||
|
display = meta_display_for_x_display (xdisplay);
|
||||||
|
if (display != NULL)
|
||||||
|
meta_error_trap_pop (display, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_display_open (const char *name)
|
meta_display_open (const char *name)
|
||||||
{
|
{
|
||||||
@ -373,6 +394,12 @@ meta_display_open (const char *name)
|
|||||||
|
|
||||||
display->screens = NULL;
|
display->screens = NULL;
|
||||||
|
|
||||||
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
|
display->sn_display = sn_display_new (display->xdisplay,
|
||||||
|
sn_error_trap_push,
|
||||||
|
sn_error_trap_pop);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef USE_GDK_DISPLAY
|
#ifdef USE_GDK_DISPLAY
|
||||||
display->events = NULL;
|
display->events = NULL;
|
||||||
|
|
||||||
@ -614,6 +641,14 @@ meta_display_close (MetaDisplay *display)
|
|||||||
g_slist_free (display->screens);
|
g_slist_free (display->screens);
|
||||||
display->screens = NULL;
|
display->screens = NULL;
|
||||||
|
|
||||||
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
|
if (display->sn_display)
|
||||||
|
{
|
||||||
|
sn_display_unref (display->sn_display);
|
||||||
|
display->sn_display = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Must be after all calls to meta_window_free() since they
|
/* Must be after all calls to meta_window_free() since they
|
||||||
* unregister windows
|
* unregister windows
|
||||||
*/
|
*/
|
||||||
@ -968,6 +1003,10 @@ event_callback (XEvent *event,
|
|||||||
if (dump_events)
|
if (dump_events)
|
||||||
meta_spew_event (display, event);
|
meta_spew_event (display, event);
|
||||||
|
|
||||||
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
|
sn_display_process_event (display->sn_display, event);
|
||||||
|
#endif
|
||||||
|
|
||||||
filter_out_event = FALSE;
|
filter_out_event = FALSE;
|
||||||
display->current_time = event_get_time (display, event);
|
display->current_time = event_get_time (display, event);
|
||||||
display->xinerama_cache_invalidated = TRUE;
|
display->xinerama_cache_invalidated = TRUE;
|
||||||
@ -2192,6 +2231,9 @@ meta_display_create_x_cursor (MetaDisplay *display,
|
|||||||
case META_CURSOR_RESIZE_WINDOW:
|
case META_CURSOR_RESIZE_WINDOW:
|
||||||
glyph = XC_fleur;
|
glyph = XC_fleur;
|
||||||
break;
|
break;
|
||||||
|
case META_CURSOR_BUSY:
|
||||||
|
glyph = XC_watch;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
|
@ -27,6 +27,10 @@
|
|||||||
#include "eventqueue.h"
|
#include "eventqueue.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
|
#include <libsn/sn.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define meta_XFree(p) do { if ((p)) XFree ((p)); } while (0)
|
#define meta_XFree(p) do { if ((p)) XFree ((p)); } while (0)
|
||||||
|
|
||||||
/* this doesn't really belong here, oh well. */
|
/* this doesn't really belong here, oh well. */
|
||||||
@ -150,6 +154,10 @@ struct _MetaDisplay
|
|||||||
Atom atom_net_wm_state_above;
|
Atom atom_net_wm_state_above;
|
||||||
Atom atom_net_wm_state_below;
|
Atom atom_net_wm_state_below;
|
||||||
|
|
||||||
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
|
SnDisplay *sn_display;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 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
|
||||||
*/
|
*/
|
||||||
|
218
src/screen.c
218
src/screen.c
@ -54,6 +54,11 @@ 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);
|
||||||
|
|
||||||
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
|
static void meta_screen_sn_event (SnMonitorEvent *event,
|
||||||
|
void *user_data);
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
set_wm_check_hint (MetaScreen *screen)
|
set_wm_check_hint (MetaScreen *screen)
|
||||||
{
|
{
|
||||||
@ -581,6 +586,17 @@ meta_screen_new (MetaDisplay *display,
|
|||||||
|
|
||||||
meta_prefs_add_listener (prefs_changed_callback, screen);
|
meta_prefs_add_listener (prefs_changed_callback, screen);
|
||||||
|
|
||||||
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
|
screen->sn_context =
|
||||||
|
sn_monitor_context_new (screen->display->sn_display,
|
||||||
|
screen->number,
|
||||||
|
meta_screen_sn_event,
|
||||||
|
screen,
|
||||||
|
NULL);
|
||||||
|
screen->startup_sequences = NULL;
|
||||||
|
screen->startup_sequence_timeout = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
meta_verbose ("Added screen %d ('%s') root 0x%lx\n",
|
meta_verbose ("Added screen %d ('%s') root 0x%lx\n",
|
||||||
screen->number, screen->screen_name, screen->xroot);
|
screen->number, screen->screen_name, screen->xroot);
|
||||||
|
|
||||||
@ -604,6 +620,24 @@ meta_screen_free (MetaScreen *screen)
|
|||||||
|
|
||||||
meta_screen_ungrab_keys (screen);
|
meta_screen_ungrab_keys (screen);
|
||||||
|
|
||||||
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
|
g_slist_foreach (screen->startup_sequences,
|
||||||
|
(GFunc) sn_startup_sequence_unref, NULL);
|
||||||
|
g_slist_free (screen->startup_sequences);
|
||||||
|
screen->startup_sequences = NULL;
|
||||||
|
|
||||||
|
if (screen->startup_sequence_timeout != 0)
|
||||||
|
{
|
||||||
|
g_source_remove (screen->startup_sequence_timeout);
|
||||||
|
screen->startup_sequence_timeout = 0;
|
||||||
|
}
|
||||||
|
if (screen->sn_context)
|
||||||
|
{
|
||||||
|
sn_monitor_context_unref (screen->sn_context);
|
||||||
|
screen->sn_context = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
meta_ui_free (screen->ui);
|
meta_ui_free (screen->ui);
|
||||||
|
|
||||||
meta_stack_free (screen->stack);
|
meta_stack_free (screen->stack);
|
||||||
@ -1619,3 +1653,187 @@ meta_screen_unshow_desktop (MetaScreen *screen)
|
|||||||
|
|
||||||
meta_screen_focus_top_window (screen, NULL);
|
meta_screen_focus_top_window (screen, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
|
static gboolean startup_sequence_timeout (void *data);
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_startup_feedback (MetaScreen *screen)
|
||||||
|
{
|
||||||
|
if (screen->startup_sequences != NULL)
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_STARTUP,
|
||||||
|
"Setting busy cursor\n");
|
||||||
|
meta_screen_set_cursor (screen, META_CURSOR_BUSY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_STARTUP,
|
||||||
|
"Setting default cursor\n");
|
||||||
|
meta_screen_set_cursor (screen, META_CURSOR_DEFAULT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_sequence (MetaScreen *screen,
|
||||||
|
SnStartupSequence *sequence)
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_STARTUP,
|
||||||
|
"Adding sequence %s\n",
|
||||||
|
sn_startup_sequence_get_id (sequence));
|
||||||
|
sn_startup_sequence_ref (sequence);
|
||||||
|
screen->startup_sequences = g_slist_prepend (screen->startup_sequences,
|
||||||
|
sequence);
|
||||||
|
|
||||||
|
/* our timeout just polls every second, instead of bothering
|
||||||
|
* to compute exactly when we may next time out
|
||||||
|
*/
|
||||||
|
if (screen->startup_sequence_timeout == 0)
|
||||||
|
screen->startup_sequence_timeout = g_timeout_add (1000,
|
||||||
|
startup_sequence_timeout,
|
||||||
|
screen);
|
||||||
|
|
||||||
|
update_startup_feedback (screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
remove_sequence (MetaScreen *screen,
|
||||||
|
SnStartupSequence *sequence)
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_STARTUP,
|
||||||
|
"Removing sequence %s\n",
|
||||||
|
sn_startup_sequence_get_id (sequence));
|
||||||
|
|
||||||
|
screen->startup_sequences = g_slist_remove (screen->startup_sequences,
|
||||||
|
sequence);
|
||||||
|
sn_startup_sequence_unref (sequence);
|
||||||
|
|
||||||
|
if (screen->startup_sequences == NULL &&
|
||||||
|
screen->startup_sequence_timeout != 0)
|
||||||
|
{
|
||||||
|
g_source_remove (screen->startup_sequence_timeout);
|
||||||
|
screen->startup_sequence_timeout = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
update_startup_feedback (screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GSList *list;
|
||||||
|
GTimeVal now;
|
||||||
|
} CollectTimedOutData;
|
||||||
|
|
||||||
|
#define STARTUP_TIMEOUT 5000
|
||||||
|
|
||||||
|
static void
|
||||||
|
collect_timed_out_foreach (void *element,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
CollectTimedOutData *ctod = data;
|
||||||
|
SnStartupSequence *sequence = element;
|
||||||
|
long tv_sec, tv_usec;
|
||||||
|
double elapsed;
|
||||||
|
|
||||||
|
sn_startup_sequence_get_last_active_time (sequence, &tv_sec, &tv_usec);
|
||||||
|
|
||||||
|
elapsed =
|
||||||
|
((((double)ctod->now.tv_sec - tv_sec) * G_USEC_PER_SEC +
|
||||||
|
(ctod->now.tv_usec - tv_usec))) / 1000.0;
|
||||||
|
|
||||||
|
meta_topic (META_DEBUG_STARTUP,
|
||||||
|
"Sequence used %g seconds vs. %g max: %s\n",
|
||||||
|
elapsed, (double) STARTUP_TIMEOUT,
|
||||||
|
sn_startup_sequence_get_id (sequence));
|
||||||
|
|
||||||
|
if (elapsed > STARTUP_TIMEOUT)
|
||||||
|
ctod->list = g_slist_prepend (ctod->list, sequence);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
startup_sequence_timeout (void *data)
|
||||||
|
{
|
||||||
|
MetaScreen *screen = data;
|
||||||
|
CollectTimedOutData ctod;
|
||||||
|
GSList *tmp;
|
||||||
|
|
||||||
|
ctod.list = NULL;
|
||||||
|
g_get_current_time (&ctod.now);
|
||||||
|
g_slist_foreach (screen->startup_sequences,
|
||||||
|
collect_timed_out_foreach,
|
||||||
|
&ctod);
|
||||||
|
|
||||||
|
tmp = ctod.list;
|
||||||
|
while (tmp != NULL)
|
||||||
|
{
|
||||||
|
SnStartupSequence *sequence = tmp->data;
|
||||||
|
|
||||||
|
meta_topic (META_DEBUG_STARTUP,
|
||||||
|
"Timed out sequence %s\n",
|
||||||
|
sn_startup_sequence_get_id (sequence));
|
||||||
|
|
||||||
|
remove_sequence (screen, sequence);
|
||||||
|
|
||||||
|
tmp = tmp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_slist_free (ctod.list);
|
||||||
|
|
||||||
|
if (screen->startup_sequences != NULL)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* remove */
|
||||||
|
screen->startup_sequence_timeout = 0;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_screen_sn_event (SnMonitorEvent *event,
|
||||||
|
void *user_data)
|
||||||
|
{
|
||||||
|
MetaScreen *screen;
|
||||||
|
SnStartupSequence *sequence;
|
||||||
|
|
||||||
|
screen = user_data;
|
||||||
|
|
||||||
|
sequence = sn_monitor_event_get_startup_sequence (event);
|
||||||
|
|
||||||
|
switch (sn_monitor_event_get_type (event))
|
||||||
|
{
|
||||||
|
case SN_MONITOR_EVENT_INITIATED:
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_STARTUP,
|
||||||
|
"Received startup initiated for %s\n",
|
||||||
|
sn_startup_sequence_get_id (sequence));
|
||||||
|
add_sequence (screen, sequence);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SN_MONITOR_EVENT_COMPLETED:
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_STARTUP,
|
||||||
|
"Received startup completed for %s\n",
|
||||||
|
sn_startup_sequence_get_id (sequence));
|
||||||
|
remove_sequence (screen,
|
||||||
|
sn_monitor_event_get_startup_sequence (event));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SN_MONITOR_EVENT_CHANGED:
|
||||||
|
meta_topic (META_DEBUG_STARTUP,
|
||||||
|
"Received startup changed for %s\n",
|
||||||
|
sn_startup_sequence_get_id (sequence));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SN_MONITOR_EVENT_CANCELED:
|
||||||
|
meta_topic (META_DEBUG_STARTUP,
|
||||||
|
"Received startup canceled for %s\n",
|
||||||
|
sn_startup_sequence_get_id (sequence));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -80,6 +80,12 @@ struct _MetaScreen
|
|||||||
/* Cache the current Xinerama */
|
/* Cache the current Xinerama */
|
||||||
int last_xinerama_index;
|
int last_xinerama_index;
|
||||||
|
|
||||||
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
|
SnMonitorContext *sn_context;
|
||||||
|
GSList *startup_sequences;
|
||||||
|
guint startup_sequence_timeout;
|
||||||
|
#endif
|
||||||
|
|
||||||
guint work_area_idle;
|
guint work_area_idle;
|
||||||
|
|
||||||
int rows_of_workspaces;
|
int rows_of_workspaces;
|
||||||
|
@ -258,6 +258,8 @@ topic_name (MetaDebugTopic topic)
|
|||||||
return "SYNC";
|
return "SYNC";
|
||||||
case META_DEBUG_ERRORS:
|
case META_DEBUG_ERRORS:
|
||||||
return "ERRORS";
|
return "ERRORS";
|
||||||
|
case META_DEBUG_STARTUP:
|
||||||
|
return "STARTUP";
|
||||||
}
|
}
|
||||||
|
|
||||||
return "Window manager";
|
return "Window manager";
|
||||||
|
@ -60,7 +60,8 @@ typedef enum
|
|||||||
META_DEBUG_XINERAMA = 1 << 11,
|
META_DEBUG_XINERAMA = 1 << 11,
|
||||||
META_DEBUG_KEYBINDINGS = 1 << 12,
|
META_DEBUG_KEYBINDINGS = 1 << 12,
|
||||||
META_DEBUG_SYNC = 1 << 13,
|
META_DEBUG_SYNC = 1 << 13,
|
||||||
META_DEBUG_ERRORS = 1 << 14
|
META_DEBUG_ERRORS = 1 << 14,
|
||||||
|
META_DEBUG_STARTUP = 1 << 15
|
||||||
|
|
||||||
} MetaDebugTopic;
|
} MetaDebugTopic;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user