From 8c1c77482db263a7dcc04051a9694f30a852b702 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Wed, 17 Jul 2013 23:15:02 -0400 Subject: [PATCH] Remove old, deprecated utilities that nobody has used in a million years https://bugzilla.gnome.org/show_bug.cgi?id=704437 --- configure.ac | 8 - src/Makefile.am | 12 +- src/core/display.c | 21 - src/core/keybindings-private.h | 1 - src/core/keybindings.c | 25 - src/core/main.c | 8 +- src/meta/atomnames.h | 3 - src/meta/preview-widget.h | 87 -- src/meta/theme.h | 3 +- src/tools/.cvsignore | 8 - src/tools/Makefile.am | 34 - src/tools/mutter-grayscale.c | 107 --- src/tools/mutter-mag.c | 299 ------- src/tools/mutter-message.c | 160 ---- src/tools/mutter-window-demo.c | 1049 ----------------------- src/tools/mutter-window-demo.png | Bin 3453 -> 0 bytes src/ui/preview-widget.c | 496 ----------- src/ui/theme-viewer.c | 1365 ------------------------------ src/ui/theme.c | 3 +- src/ui/ui.c | 5 +- src/ui/ui.h | 3 +- src/wm-tester/.cvsignore | 7 - src/wm-tester/Makefile.am | 33 - src/wm-tester/focus-window.c | 37 - src/wm-tester/main.c | 245 ------ src/wm-tester/test-attached.c | 100 --- src/wm-tester/test-focus.c | 362 -------- src/wm-tester/test-gravity.c | 308 ------- src/wm-tester/test-resizing.c | 257 ------ src/wm-tester/test-size-hints.c | 136 --- 30 files changed, 10 insertions(+), 5172 deletions(-) delete mode 100644 src/meta/preview-widget.h delete mode 100644 src/tools/.cvsignore delete mode 100644 src/tools/Makefile.am delete mode 100644 src/tools/mutter-grayscale.c delete mode 100644 src/tools/mutter-mag.c delete mode 100644 src/tools/mutter-message.c delete mode 100644 src/tools/mutter-window-demo.c delete mode 100644 src/tools/mutter-window-demo.png delete mode 100644 src/ui/preview-widget.c delete mode 100644 src/ui/theme-viewer.c delete mode 100644 src/wm-tester/.cvsignore delete mode 100644 src/wm-tester/Makefile.am delete mode 100644 src/wm-tester/focus-window.c delete mode 100644 src/wm-tester/main.c delete mode 100644 src/wm-tester/test-attached.c delete mode 100644 src/wm-tester/test-focus.c delete mode 100644 src/wm-tester/test-gravity.c delete mode 100644 src/wm-tester/test-resizing.c delete mode 100644 src/wm-tester/test-size-hints.c diff --git a/configure.ac b/configure.ac index dbb3acae2..9baf35bf1 100644 --- a/configure.ac +++ b/configure.ac @@ -118,9 +118,6 @@ AM_GLIB_GNU_GETTEXT ## here we get the flags we'll actually use # GRegex requires Glib-2.14.0 PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0) -# gtk_window_set_icon_name requires gtk2+-2.6.0 -PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-3.0) -PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-3.0) # Unconditionally use this dir to avoid a circular dep with gnomecc GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings" @@ -307,9 +304,6 @@ if test "x$found_xsync" = "xyes"; then fi MUTTER_LIBS="$MUTTER_LIBS $XSYNC_LIBS $RANDR_LIBS $SHAPE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm" -MUTTER_MESSAGE_LIBS="$MUTTER_MESSAGE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" -MUTTER_WINDOW_DEMO_LIBS="$MUTTER_WINDOW_DEMO_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm" -MUTTER_PROPS_LIBS="$MUTTER_PROPS_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" found_sm=no case "$MUTTER_LIBS" in @@ -439,10 +433,8 @@ doc/man/Makefile doc/reference/Makefile doc/reference/meta-docs.sgml src/Makefile -src/wm-tester/Makefile src/libmutter.pc src/mutter-plugins.pc -src/tools/Makefile src/compositor/plugins/Makefile po/Makefile.in ]) diff --git a/src/Makefile.am b/src/Makefile.am index 22cce625a..c936a7290 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,7 +3,7 @@ lib_LTLIBRARIES = libmutter.la -SUBDIRS=wm-tester tools compositor/plugins +SUBDIRS=compositor/plugins INCLUDES= \ -DCLUTTER_ENABLE_EXPERIMENTAL_API \ @@ -156,8 +156,6 @@ libmutter_la_SOURCES = \ meta/theme.h \ ui/theme-private.h \ ui/ui.c \ - meta/preview-widget.h \ - ui/preview-widget.c \ $(mutter_built_sources) libmutter_la_LDFLAGS = -no-undefined @@ -195,7 +193,6 @@ libmutterinclude_base_headers = \ # Excluded from scanning for introspection but installed # atomnames.h: macros cause problems for scanning process libmutterinclude_extra_headers = \ - meta/preview-widget.h \ meta/atomnames.h libmutterincludedir = $(includedir)/mutter/meta @@ -204,11 +201,6 @@ libmutterinclude_HEADERS = \ $(libmutterinclude_base_headers) \ $(libmutterinclude_extra_headers) -mutter_theme_viewer_SOURCES= \ - ui/theme-viewer.c - -bin_PROGRAMS=mutter mutter-theme-viewer - mutter_SOURCES = core/mutter.c mutter_LDADD = $(MUTTER_LIBS) libmutter.la @@ -245,8 +237,6 @@ Meta-$(api_version).gir: libmutter.la endif -mutter_theme_viewer_LDADD= $(MUTTER_LIBS) libmutter.la - testboxes_SOURCES = core/testboxes.c testgradient_SOURCES = ui/testgradient.c testasyncgetprop_SOURCES = core/testasyncgetprop.c diff --git a/src/core/display.c b/src/core/display.c index 9d5a87cb0..e39361e83 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -3042,27 +3042,6 @@ event_callback (XEvent *event, meta_workspace_focus_default_window (screen->active_workspace, NULL, timestamp); } } - else if (event->xclient.message_type == - display->atom__MUTTER_RELOAD_THEME_MESSAGE) - { - meta_verbose ("Received reload theme request\n"); - meta_ui_set_current_theme (meta_prefs_get_theme (), - TRUE); - meta_display_retheme_all (); - } - else if (event->xclient.message_type == - display->atom__MUTTER_SET_KEYBINDINGS_MESSAGE) - { - meta_verbose ("Received set keybindings request = %d\n", - (int) event->xclient.data.l[0]); - meta_set_keybindings_disabled (!event->xclient.data.l[0]); - } - else if (event->xclient.message_type == - display->atom__MUTTER_TOGGLE_VERBOSE) - { - meta_verbose ("Received toggle verbose message\n"); - meta_set_verbose (!meta_is_verbose ()); - } else if (event->xclient.message_type == display->atom_WM_PROTOCOLS) { diff --git a/src/core/keybindings-private.h b/src/core/keybindings-private.h index c8a12b1ef..c47aacdc4 100644 --- a/src/core/keybindings-private.h +++ b/src/core/keybindings-private.h @@ -69,7 +69,6 @@ void meta_window_ungrab_all_keys (MetaWindow *window, gboolean meta_display_process_key_event (MetaDisplay *display, MetaWindow *window, XIDeviceEvent *event); -void meta_set_keybindings_disabled (gboolean setting); void meta_display_process_mapping_event (MetaDisplay *display, XEvent *event); diff --git a/src/core/keybindings.c b/src/core/keybindings.c index 135dac5ad..8439ea830 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -56,8 +56,6 @@ #define SCHEMA_COMMON_KEYBINDINGS "org.gnome.desktop.wm.keybindings" #define SCHEMA_MUTTER_KEYBINDINGS "org.gnome.mutter.keybindings" -static gboolean all_bindings_disabled = FALSE; - static gboolean add_builtin_keybinding (MetaDisplay *display, const char *name, GSettings *settings, @@ -2046,21 +2044,6 @@ meta_display_process_key_event (MetaDisplay *display, const char *str; MetaScreen *screen; - if (all_bindings_disabled) - { - /* In this mode, we try to pretend we don't have grabs, so we - * immediately replay events and drop the grab. (This still - * messes up global passive grabs from other clients.) The - * FALSE return here is a little suspect, but we don't really - * know if we'll see the event again or not, and it's pretty - * poorly defined how this mode is supposed to interact with - * plugins. - */ - XIAllowEvents (display->xdisplay, event->deviceid, - XIReplayDevice, event->time); - return FALSE; - } - /* if key event was on root window, we have a shortcut */ screen = meta_display_screen_for_root (display, event->event); @@ -4098,14 +4081,6 @@ handle_set_spew_mark (MetaDisplay *display, meta_verbose ("-- MARK MARK MARK MARK --\n"); } -void -meta_set_keybindings_disabled (gboolean setting) -{ - all_bindings_disabled = setting; - meta_topic (META_DEBUG_KEYBINDINGS, - "Keybindings %s\n", all_bindings_disabled ? "disabled" : "enabled"); -} - /** * meta_keybindings_set_custom_handler: * @name: The name of the keybinding to set diff --git a/src/core/main.c b/src/core/main.c index 4bec3d260..767a8b843 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -514,14 +514,14 @@ meta_run (void) if (g_getenv ("MUTTER_G_FATAL_WARNINGS") != NULL) g_log_set_always_fatal (G_LOG_LEVEL_MASK); - meta_ui_set_current_theme (meta_prefs_get_theme (), FALSE); + meta_ui_set_current_theme (meta_prefs_get_theme ()); /* Try to find some theme that'll work if the theme preference * doesn't exist. First try Simple (the default theme) then just * try anything in the themes directory. */ if (!meta_ui_have_a_theme ()) - meta_ui_set_current_theme ("Simple", FALSE); + meta_ui_set_current_theme ("Simple"); if (!meta_ui_have_a_theme ()) { @@ -539,7 +539,7 @@ meta_run (void) while (((dir_entry = g_dir_read_name (themes_dir)) != NULL) && (!meta_ui_have_a_theme ())) { - meta_ui_set_current_theme (dir_entry, FALSE); + meta_ui_set_current_theme (dir_entry); } g_dir_close (themes_dir); @@ -598,7 +598,7 @@ prefs_changed_callback (MetaPreference pref, { case META_PREF_THEME: case META_PREF_DRAGGABLE_BORDER_WIDTH: - meta_ui_set_current_theme (meta_prefs_get_theme (), FALSE); + meta_ui_set_current_theme (meta_prefs_get_theme ()); meta_display_retheme_all (); break; diff --git a/src/meta/atomnames.h b/src/meta/atomnames.h index 122315153..2a62873be 100644 --- a/src/meta/atomnames.h +++ b/src/meta/atomnames.h @@ -54,9 +54,6 @@ item(WM_WINDOW_ROLE) item(UTF8_STRING) item(WM_ICON_SIZE) item(_KWM_WIN_ICON) -item(_MUTTER_RELOAD_THEME_MESSAGE) -item(_MUTTER_SET_KEYBINDINGS_MESSAGE) -item(_MUTTER_TOGGLE_VERBOSE) item(_MUTTER_HINTS) item(_GTK_THEME_VARIANT) item(_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED) diff --git a/src/meta/preview-widget.h b/src/meta/preview-widget.h deleted file mode 100644 index 2a7919485..000000000 --- a/src/meta/preview-widget.h +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ - -/* Metacity theme preview widget */ - -/* - * Copyright (C) 2002 Havoc Pennington - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#include - -#include -#include -#include - -#ifndef META_PREVIEW_WIDGET_H -#define META_PREVIEW_WIDGET_H - -#define META_TYPE_PREVIEW (meta_preview_get_type ()) -#define META_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_PREVIEW, MetaPreview)) -#define META_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_PREVIEW, MetaPreviewClass)) -#define META_IS_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_PREVIEW)) -#define META_IS_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_PREVIEW)) -#define META_PREVIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_PREVIEW, MetaPreviewClass)) - -typedef struct _MetaPreview MetaPreview; -typedef struct _MetaPreviewClass MetaPreviewClass; - -struct _MetaPreview -{ - GtkBin bin; - - GtkStyleContext *style_context; - - MetaTheme *theme; - char *title; - MetaFrameType type; - MetaFrameFlags flags; - - PangoLayout *layout; - int text_height; - - MetaFrameBorders borders; - guint borders_cached : 1; - - MetaButtonLayout button_layout; -}; - -struct _MetaPreviewClass -{ - /*< private >*/ - GtkBinClass parent_class; -}; - - -GType meta_preview_get_type (void) G_GNUC_CONST; -GtkWidget* meta_preview_new (void); - -void meta_preview_set_theme (MetaPreview *preview, - MetaTheme *theme); -void meta_preview_set_title (MetaPreview *preview, - const char *title); -void meta_preview_set_frame_type (MetaPreview *preview, - MetaFrameType type); -void meta_preview_set_frame_flags (MetaPreview *preview, - MetaFrameFlags flags); -void meta_preview_set_button_layout (MetaPreview *preview, - const MetaButtonLayout *button_layout); - -GdkPixbuf* meta_preview_get_icon (void); -GdkPixbuf* meta_preview_get_mini_icon (void); - -#endif diff --git a/src/meta/theme.h b/src/meta/theme.h index a6aa5d835..5ecb76c3f 100644 --- a/src/meta/theme.h +++ b/src/meta/theme.h @@ -33,8 +33,7 @@ typedef struct _MetaTheme MetaTheme; MetaTheme* meta_theme_get_current (void); -void meta_theme_set_current (const char *name, - gboolean force_reload); +void meta_theme_set_current (const char *name); MetaTheme* meta_theme_new (void); void meta_theme_free (MetaTheme *theme); diff --git a/src/tools/.cvsignore b/src/tools/.cvsignore deleted file mode 100644 index 8ecc6b5e3..000000000 --- a/src/tools/.cvsignore +++ /dev/null @@ -1,8 +0,0 @@ -Makefile -Makefile.in -metacity-grayscale -metacity-message -metacity-mag -metacity-properties -metacity-properties.desktop -metacity-window-demo diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am deleted file mode 100644 index c9a47a7f0..000000000 --- a/src/tools/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -@INTLTOOL_DESKTOP_RULE@ - -icondir=$(pkgdatadir)/icons -icon_DATA=mutter-window-demo.png - -INCLUDES=@MUTTER_WINDOW_DEMO_CFLAGS@ @MUTTER_MESSAGE_CFLAGS@ \ - -I$(top_srcdir)/src \ - -DMUTTER_ICON_DIR=\"$(pkgdatadir)/icons\" \ - -DMUTTER_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" - -mutter_message_SOURCES= \ - mutter-message.c - -mutter_window_demo_SOURCES= \ - mutter-window-demo.c - -mutter_mag_SOURCES= \ - mutter-mag.c - -mutter_grayscale_SOURCES= \ - mutter-grayscale.c - -bin_PROGRAMS=mutter-message mutter-window-demo - -## cheesy hacks I use, don't really have any business existing. ;-) -noinst_PROGRAMS=mutter-mag mutter-grayscale - -mutter_message_LDADD= @MUTTER_MESSAGE_LIBS@ -mutter_window_demo_LDADD= @MUTTER_WINDOW_DEMO_LIBS@ -mutter_mag_LDADD= @MUTTER_WINDOW_DEMO_LIBS@ -mutter_grayscale_LDADD = @MUTTER_WINDOW_DEMO_LIBS@ - -EXTRA_DIST=$(icon_DATA) - diff --git a/src/tools/mutter-grayscale.c b/src/tools/mutter-grayscale.c deleted file mode 100644 index ce73f45b5..000000000 --- a/src/tools/mutter-grayscale.c +++ /dev/null @@ -1,107 +0,0 @@ -/* Hack for grayscaling an image */ - -/* - * Copyright (C) 2002 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#include -#include -#include -#include - -#define INTENSITY(r, g, b) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11) - -static GdkPixbuf* -grayscale_pixbuf (GdkPixbuf *pixbuf) -{ - GdkPixbuf *gray; - guchar *pixels; - int rowstride; - int pixstride; - int row; - int n_rows; - int width; - - gray = gdk_pixbuf_copy (pixbuf); - rowstride = gdk_pixbuf_get_rowstride (gray); - pixstride = gdk_pixbuf_get_has_alpha (gray) ? 4 : 3; - - pixels = gdk_pixbuf_get_pixels (gray); - n_rows = gdk_pixbuf_get_height (gray); - width = gdk_pixbuf_get_width (gray); - - row = 0; - while (row < n_rows) - { - guchar *p = pixels + row * rowstride; - guchar *end = p + (pixstride * width); - - while (p != end) - { - double v = INTENSITY (p[0], p[1], p[2]); - - p[0] = (guchar) v; - p[1] = (guchar) v; - p[2] = (guchar) v; - - p += pixstride; - } - - ++row; - } - - return gray; -} - -int -main (int argc, char **argv) -{ - GdkPixbuf *pixbuf; - GdkPixbuf *gray; - GError *err; - - if (argc != 2) - { - g_printerr ("specify a single image on the command line\n"); - return 1; - } - - err = NULL; - pixbuf = gdk_pixbuf_new_from_file (argv[1], &err); - if (err != NULL) - { - g_printerr ("failed to load image: %s\n", err->message); - g_error_free (err); - return 1; - } - - gray = grayscale_pixbuf (pixbuf); - - err = NULL; - gdk_pixbuf_save (gray, "grayscale.png", "png", &err, NULL); - if (err != NULL) - { - g_printerr ("failed to save image: %s\n", err->message); - g_error_free (err); - return 1; - } - - g_print ("wrote grayscale.png\n"); - - return 0; -} diff --git a/src/tools/mutter-mag.c b/src/tools/mutter-mag.c deleted file mode 100644 index b85fc5698..000000000 --- a/src/tools/mutter-mag.c +++ /dev/null @@ -1,299 +0,0 @@ -/* Hack for use instead of xmag */ - -/* - * Copyright (C) 2002 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#define _GNU_SOURCE -#define _XOPEN_SOURCE 600 /* C99 -- for rint() */ - -#include -#include -#include -#include -#include -#include - -static GtkWidget *grab_widget = NULL; -static GtkWidget *display_window = NULL; -static int last_grab_x = 0; -static int last_grab_y = 0; -static int last_grab_width = 150; -static int last_grab_height = 150; -static GtkAllocation last_grab_allocation; -static double width_factor = 4.0; -static double height_factor = 4.0; -static GdkInterpType interp_mode = GDK_INTERP_NEAREST; -static guint regrab_idle_id = 0; - -static GdkPixbuf* -get_pixbuf (void) -{ - GdkPixbuf *screenshot; - GdkPixbuf *magnified; - -#if 0 - g_print ("Size %d x %d\n", - last_grab_width, last_grab_height); -#endif - - screenshot = gdk_pixbuf_get_from_window (gdk_get_default_root_window (), - last_grab_x, last_grab_y, - last_grab_width, last_grab_height); - - if (screenshot == NULL) - { - g_printerr ("Screenshot failed\n"); - exit (1); - } - - magnified = gdk_pixbuf_scale_simple (screenshot, last_grab_width * width_factor, - last_grab_height * height_factor, - interp_mode); - - - g_object_unref (G_OBJECT (screenshot)); - - return magnified; -} - -static gboolean -regrab_idle (GtkWidget *image) -{ - GtkAllocation allocation; - GdkPixbuf *magnified; - - gtk_widget_get_allocation (image, &allocation); - - if (allocation.width != last_grab_allocation.width || - allocation.height != last_grab_allocation.height) - { - last_grab_width = rint (allocation.width / width_factor); - last_grab_height = rint (allocation.height / height_factor); - last_grab_allocation = allocation; - - magnified = get_pixbuf (); - - gtk_image_set_from_pixbuf (GTK_IMAGE (image), magnified); - - g_object_unref (G_OBJECT (magnified)); - } - - regrab_idle_id = 0; - - return FALSE; -} - -static void -image_resized (GtkWidget *image) -{ - if (regrab_idle_id == 0) - regrab_idle_id = g_idle_add_full (G_PRIORITY_LOW + 100, (GSourceFunc) regrab_idle, - image, NULL); -} - -static void -grab_area_at_mouse (GtkWidget *invisible, - int x_root, - int y_root) -{ - GdkPixbuf *magnified; - int width, height; - GtkWidget *widget; - - width = last_grab_width; - height = last_grab_height; - - last_grab_x = x_root; - last_grab_y = y_root; - last_grab_width = width; - last_grab_height = height; - - magnified = get_pixbuf (); - - display_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size (GTK_WINDOW (display_window), - last_grab_width, last_grab_height); - widget = gtk_image_new_from_pixbuf (magnified); - gtk_widget_set_size_request (widget, 40, 40); - gtk_container_add (GTK_CONTAINER (display_window), widget); - g_object_unref (G_OBJECT (magnified)); - - g_object_add_weak_pointer (G_OBJECT (display_window), - (gpointer) &display_window); - - g_signal_connect (G_OBJECT (display_window), "destroy", - G_CALLBACK (gtk_main_quit), NULL); - - g_signal_connect_after (G_OBJECT (widget), "size_allocate", G_CALLBACK (image_resized), NULL); - - gtk_widget_show_all (display_window); -} - -static void -shutdown_grab (void) -{ - GdkDeviceManager *manager; - GdkDevice *device; - - manager = gdk_display_get_device_manager (gdk_display_get_default ()); - device = gdk_device_manager_get_client_pointer (manager); - - gdk_device_ungrab (device, gtk_get_current_event_time ()); - gdk_device_ungrab (gdk_device_get_associated_device (device), - gtk_get_current_event_time ()); - gtk_grab_remove (grab_widget); -} - -static void -mouse_motion (GtkWidget *invisible, - GdkEventMotion *event, - gpointer data) -{ - -} - -static gboolean -mouse_release (GtkWidget *invisible, - GdkEventButton *event, - gpointer data) -{ - if (event->button != 1) - return FALSE; - - grab_area_at_mouse (invisible, event->x_root, event->y_root); - - shutdown_grab (); - - g_signal_handlers_disconnect_by_func (invisible, mouse_motion, NULL); - g_signal_handlers_disconnect_by_func (invisible, mouse_release, NULL); - - return TRUE; -} - -/* Helper Functions */ - -static gboolean mouse_press (GtkWidget *invisible, - GdkEventButton *event, - gpointer data); - -static gboolean -key_press (GtkWidget *invisible, - GdkEventKey *event, - gpointer data) -{ - if (event->keyval == GDK_KEY_Escape) - { - shutdown_grab (); - - g_signal_handlers_disconnect_by_func (invisible, mouse_press, NULL); - g_signal_handlers_disconnect_by_func (invisible, key_press, NULL); - - gtk_main_quit (); - - return TRUE; - } - - return FALSE; -} - -static gboolean -mouse_press (GtkWidget *invisible, - GdkEventButton *event, - gpointer data) -{ - if (event->type == GDK_BUTTON_PRESS && - event->button == 1) - { - g_signal_connect (invisible, "motion_notify_event", - G_CALLBACK (mouse_motion), NULL); - g_signal_connect (invisible, "button_release_event", - G_CALLBACK (mouse_release), NULL); - g_signal_handlers_disconnect_by_func (invisible, mouse_press, NULL); - g_signal_handlers_disconnect_by_func (invisible, key_press, NULL); - return TRUE; - } - - return FALSE; -} - -static void -begin_area_grab (void) -{ - GdkWindow *window; - GdkDeviceManager *manager; - GdkDevice *device; - - if (grab_widget == NULL) - { - grab_widget = gtk_invisible_new (); - - gtk_widget_add_events (grab_widget, - GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK); - - gtk_widget_show (grab_widget); - } - - window = gtk_widget_get_window (grab_widget); - manager = gdk_display_get_device_manager (gdk_display_get_default ()); - device = gdk_device_manager_get_client_pointer (manager); - - if (gdk_device_grab (device, - window, - GDK_OWNERSHIP_NONE, - FALSE, - GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK, - NULL, - gtk_get_current_event_time ()) != GDK_GRAB_SUCCESS) - { - g_warning ("Failed to grab pointer to do eyedropper"); - return; - } - - if (gdk_device_grab (gdk_device_get_associated_device (device), - window, - GDK_OWNERSHIP_NONE, - FALSE, - GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK, - NULL, - gtk_get_current_event_time ()) != GDK_GRAB_SUCCESS) - { - gdk_device_ungrab (device, gtk_get_current_event_time ()); - g_warning ("Failed to grab keyboard to do eyedropper"); - return; - } - - gtk_grab_add (grab_widget); - - g_signal_connect (grab_widget, "button_press_event", - G_CALLBACK (mouse_press), NULL); - g_signal_connect (grab_widget, "key_press_event", - G_CALLBACK (key_press), NULL); -} - -int -main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - begin_area_grab (); - - gtk_main (); - - return 0; -} diff --git a/src/tools/mutter-message.c b/src/tools/mutter-message.c deleted file mode 100644 index 5b93597bc..000000000 --- a/src/tools/mutter-message.c +++ /dev/null @@ -1,160 +0,0 @@ -/* Mutter send-magic-messages app */ - -/* - * Copyright (C) 2002 Havoc Pennington - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#include -#include -#include -#include -#include - -#include -#define _(x) dgettext (GETTEXT_PACKAGE, x) -#define N_(x) x - -static Display *display; - -static void -send_reload_theme (void) -{ - XEvent xev; - - xev.xclient.type = ClientMessage; - xev.xclient.serial = 0; - xev.xclient.send_event = True; - xev.xclient.display = display; - xev.xclient.window = gdk_x11_get_default_root_xwindow (); - xev.xclient.message_type = XInternAtom (display, - "_MUTTER_RELOAD_THEME_MESSAGE", - False); - xev.xclient.format = 32; - xev.xclient.data.l[0] = 0; - xev.xclient.data.l[1] = 0; - xev.xclient.data.l[2] = 0; - - XSendEvent (display, - gdk_x11_get_default_root_xwindow (), - False, - SubstructureRedirectMask | SubstructureNotifyMask, - &xev); - - XFlush (display); - XSync (display, False); -} - -static void -send_set_keybindings (gboolean enabled) -{ - XEvent xev; - - xev.xclient.type = ClientMessage; - xev.xclient.serial = 0; - xev.xclient.send_event = True; - xev.xclient.display = display; - xev.xclient.window = gdk_x11_get_default_root_xwindow (); - xev.xclient.message_type = XInternAtom (display, - "_MUTTER_SET_KEYBINDINGS_MESSAGE", - False); - xev.xclient.format = 32; - xev.xclient.data.l[0] = enabled; - xev.xclient.data.l[1] = 0; - xev.xclient.data.l[2] = 0; - - XSendEvent (display, - gdk_x11_get_default_root_xwindow (), - False, - SubstructureRedirectMask | SubstructureNotifyMask, - &xev); - - XFlush (display); - XSync (display, False); -} - -#ifdef WITH_VERBOSE_MODE -static void -send_toggle_verbose (void) -{ - XEvent xev; - - xev.xclient.type = ClientMessage; - xev.xclient.serial = 0; - xev.xclient.send_event = True; - xev.xclient.display = display; - xev.xclient.window = gdk_x11_get_default_root_xwindow (); - xev.xclient.message_type = XInternAtom (display, - "_MUTTER_TOGGLE_VERBOSE", - False); - xev.xclient.format = 32; - xev.xclient.data.l[0] = 0; - xev.xclient.data.l[1] = 0; - xev.xclient.data.l[2] = 0; - - XSendEvent (display, - gdk_x11_get_default_root_xwindow (), - False, - SubstructureRedirectMask | SubstructureNotifyMask, - &xev); - - XFlush (display); - XSync (display, False); -} -#endif - -static void -usage (void) -{ - g_printerr (_("Usage: %s\n"), - "mutter-message (reload-theme|enable-keybindings|disable-keybindings|toggle-verbose)"); - exit (1); -} - -int -main (int argc, char **argv) -{ - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - - gtk_init (&argc, &argv); - - if (argc < 2) - usage (); - - display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); - - if (strcmp (argv[1], "reload-theme") == 0) - send_reload_theme (); - else if (strcmp (argv[1], "enable-keybindings") == 0) - send_set_keybindings (TRUE); - else if (strcmp (argv[1], "disable-keybindings") == 0) - send_set_keybindings (FALSE); - else if (strcmp (argv[1], "toggle-verbose") == 0) - { -#ifndef WITH_VERBOSE_MODE - g_printerr (_("Mutter was compiled without support for verbose mode\n")); - return 1; -#else - send_toggle_verbose (); -#endif - } - else - usage (); - - return 0; -} - diff --git a/src/tools/mutter-window-demo.c b/src/tools/mutter-window-demo.c deleted file mode 100644 index 2a3247724..000000000 --- a/src/tools/mutter-window-demo.c +++ /dev/null @@ -1,1049 +0,0 @@ -/* Mutter window types/properties demo app */ - -/* - * Copyright (C) 2002 Havoc Pennington - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#include -#include -#include -#include - -static GtkWidget* do_appwindow (void); - -static gboolean aspect_on; - -static void -set_gdk_window_struts (GdkWindow *window, - int left, - int right, - int top, - int bottom) -{ - long vals[12]; - - vals[0] = left; - vals[1] = right; - vals[2] = top; - vals[3] = bottom; - vals[4] = 000; - vals[5] = 400; - vals[6] = 200; - vals[7] = 600; - vals[8] = 76; - vals[9] = 676; - vals[10] = 200; - vals[11] = 800; - - XChangeProperty (GDK_WINDOW_XDISPLAY (window), - GDK_WINDOW_XID (window), - XInternAtom (GDK_WINDOW_XDISPLAY (window), - "_NET_WM_STRUT_PARTIAL", False), - XA_CARDINAL, 32, PropModeReplace, - (guchar *)vals, 12); -} - -static void -on_realize_set_struts (GtkWindow *window, - gpointer data) -{ - GtkWidget *widget; - int left; - int right; - int top; - int bottom; - - widget = GTK_WIDGET (window); - - g_return_if_fail (gtk_widget_get_realized (widget)); - - left = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-left")); - right = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-right")); - top = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-top")); - bottom = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-bottom")); - - set_gdk_window_struts (gtk_widget_get_window (widget), - left, right, top, bottom); -} - -static void -set_gtk_window_struts (GtkWidget *window, - int left, - int right, - int top, - int bottom) -{ - GtkWidget *widget; - - widget = GTK_WIDGET (window); - - g_object_set_data (G_OBJECT (window), "meta-strut-left", - GINT_TO_POINTER (left)); - g_object_set_data (G_OBJECT (window), "meta-strut-right", - GINT_TO_POINTER (right)); - g_object_set_data (G_OBJECT (window), "meta-strut-top", - GINT_TO_POINTER (top)); - g_object_set_data (G_OBJECT (window), "meta-strut-bottom", - GINT_TO_POINTER (bottom)); - - g_signal_handlers_disconnect_by_func (G_OBJECT (window), - on_realize_set_struts, - NULL); - - g_signal_connect_after (G_OBJECT (window), - "realize", - G_CALLBACK (on_realize_set_struts), - NULL); - - if (gtk_widget_get_realized (widget)) - set_gdk_window_struts (gtk_widget_get_window (widget), - left, right, top, bottom); -} - -static void -set_gdk_window_type (GdkWindow *window, - const char *type) -{ - Atom atoms[2] = { None, None }; - - atoms[0] = XInternAtom (GDK_WINDOW_XDISPLAY (window), - type, False); - - XChangeProperty (GDK_WINDOW_XDISPLAY (window), - GDK_WINDOW_XID (window), - XInternAtom (GDK_WINDOW_XDISPLAY (window), "_NET_WM_WINDOW_TYPE", False), - XA_ATOM, 32, PropModeReplace, - (guchar *)atoms, - 1); -} - -static void -on_realize_set_type (GtkWindow *window, - gpointer data) -{ - GtkWidget *widget; - const char *type; - - widget = GTK_WIDGET (window); - - g_return_if_fail (gtk_widget_get_realized (widget)); - - type = g_object_get_data (G_OBJECT (window), "meta-window-type"); - - g_return_if_fail (type != NULL); - - set_gdk_window_type (gtk_widget_get_window (widget), - type); -} - -static void -set_gtk_window_type (GtkWindow *window, - const char *type) -{ - GtkWidget *widget; - - widget = GTK_WIDGET (window); - - g_object_set_data (G_OBJECT (window), "meta-window-type", (char*) type); - - g_signal_handlers_disconnect_by_func (G_OBJECT (window), - on_realize_set_type, - NULL); - - g_signal_connect_after (G_OBJECT (window), - "realize", - G_CALLBACK (on_realize_set_type), - NULL); - - if (gtk_widget_get_realized (widget)) - set_gdk_window_type (gtk_widget_get_window (widget), - type); -} - -static void -set_gdk_window_border_only (GdkWindow *window) -{ - gdk_window_set_decorations (window, GDK_DECOR_BORDER); -} - -static void -on_realize_set_border_only (GtkWindow *window, - gpointer data) -{ - GtkWidget *widget; - - widget = GTK_WIDGET (window); - - g_return_if_fail (gtk_widget_get_realized (widget)); - - set_gdk_window_border_only (gtk_widget_get_window (widget)); -} - -static void -set_gtk_window_border_only (GtkWindow *window) -{ - GtkWidget *widget; - - widget = GTK_WIDGET (window); - - g_signal_handlers_disconnect_by_func (G_OBJECT (window), - on_realize_set_border_only, - NULL); - - g_signal_connect_after (G_OBJECT (window), - "realize", - G_CALLBACK (on_realize_set_border_only), - NULL); - - if (gtk_widget_get_realized (widget)) - set_gdk_window_border_only (gtk_widget_get_window (widget)); -} - -int -main (int argc, char **argv) -{ - GList *list; - GdkPixbuf *pixbuf; - GError *err; - - gtk_init (&argc, &argv); - - err = NULL; - pixbuf = gdk_pixbuf_new_from_file (MUTTER_ICON_DIR"/mutter-window-demo.png", - &err); - if (pixbuf) - { - list = g_list_prepend (NULL, pixbuf); - - gtk_window_set_default_icon_list (list); - g_list_free (list); - g_object_unref (G_OBJECT (pixbuf)); - } - else - { - g_printerr ("Could not load icon: %s\n", err->message); - g_error_free (err); - } - - do_appwindow (); - - gtk_main (); - - return 0; -} - -static void -response_cb (GtkDialog *dialog, - int response_id, - void *data); - -static void -make_dialog (GtkWidget *parent, - int depth) -{ - GtkWidget *dialog; - char *str; - - dialog = gtk_message_dialog_new (parent ? GTK_WINDOW (parent) : NULL, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_INFO, - GTK_BUTTONS_CLOSE, - parent ? "Here is a dialog %d" : - "Here is a dialog %d with no transient parent", - depth); - - str = g_strdup_printf ("%d dialog", depth); - gtk_window_set_title (GTK_WINDOW (dialog), str); - g_free (str); - - gtk_dialog_add_button (GTK_DIALOG (dialog), - "Open child dialog", - GTK_RESPONSE_ACCEPT); - - /* Close dialog on user response */ - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (response_cb), - NULL); - - g_object_set_data (G_OBJECT (dialog), "depth", - GINT_TO_POINTER (depth)); - - gtk_widget_show (dialog); -} - -static void -response_cb (GtkDialog *dialog, - int response_id, - void *data) -{ - switch (response_id) - { - case GTK_RESPONSE_ACCEPT: - make_dialog (GTK_WIDGET (dialog), - GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog), - "depth")) + 1); - break; - - default: - gtk_widget_destroy (GTK_WIDGET (dialog)); - break; - } -} - -static void -dialog_cb (GtkAction *action, - gpointer callback_data) -{ - make_dialog (GTK_WIDGET (callback_data), 1); -} - -static void -modal_dialog_cb (GtkAction *action, - gpointer callback_data) -{ - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (GTK_WINDOW (callback_data), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_INFO, - GTK_BUTTONS_CLOSE, - "Here is a MODAL dialog"); - - set_gtk_window_type (GTK_WINDOW (dialog), "_NET_WM_WINDOW_TYPE_MODAL_DIALOG"); - - gtk_dialog_run (GTK_DIALOG (dialog)); - - gtk_widget_destroy (dialog); -} - -static void -no_parent_dialog_cb (GtkAction *action, - gpointer callback_data) -{ - make_dialog (NULL, 1); -} - -static void -utility_cb (GtkAction *action, - gpointer callback_data) -{ - GtkWidget *window; - GtkWidget *vbox; - GtkWidget *button; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_UTILITY"); - gtk_window_set_title (GTK_WINDOW (window), "Utility"); - - gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data)); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - - gtk_container_add (GTK_CONTAINER (window), vbox); - - button = gtk_button_new_with_mnemonic ("_A button"); - gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); - - button = gtk_button_new_with_mnemonic ("_B button"); - gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); - - button = gtk_button_new_with_mnemonic ("_C button"); - gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); - - button = gtk_button_new_with_mnemonic ("_D button"); - gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); - - gtk_widget_show_all (window); -} - -static void -toolbar_cb (GtkAction *action, - gpointer callback_data) -{ - GtkWidget *window; - GtkWidget *vbox; - GtkWidget *label; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_TOOLBAR"); - gtk_window_set_title (GTK_WINDOW (window), "Toolbar"); - - gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data)); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - - gtk_container_add (GTK_CONTAINER (window), vbox); - - label = gtk_label_new ("FIXME this needs a resize grip, etc."); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - - gtk_widget_show_all (window); -} - -static void -menu_cb (GtkAction *action, - gpointer callback_data) -{ - GtkWidget *window; - GtkWidget *vbox; - GtkWidget *label; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_MENU"); - gtk_window_set_title (GTK_WINDOW (window), "Menu"); - - gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data)); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - - gtk_container_add (GTK_CONTAINER (window), vbox); - - label = gtk_label_new ("FIXME this isn't a menu."); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - - gtk_widget_show_all (window); -} - -static void -override_redirect_cb (GtkAction *action, - gpointer callback_data) -{ - GtkWidget *window; - GtkWidget *vbox; - GtkWidget *label; - - window = gtk_window_new (GTK_WINDOW_POPUP); - gtk_window_set_title (GTK_WINDOW (window), "Override Redirect"); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - - gtk_container_add (GTK_CONTAINER (window), vbox); - - label = gtk_label_new ("This is an override\nredirect window\nand should not be managed"); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - - gtk_widget_show_all (window); -} - -static void -border_only_cb (GtkAction *action, - gpointer callback_data) -{ - GtkWidget *window; - GtkWidget *vbox; - GtkWidget *label; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - set_gtk_window_border_only (GTK_WINDOW (window)); - gtk_window_set_title (GTK_WINDOW (window), "Border only"); - - gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data)); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - - gtk_container_add (GTK_CONTAINER (window), vbox); - - label = gtk_label_new ("This window is supposed to have a border but no titlebar."); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - - gtk_widget_show_all (window); -} - -#if 0 -static void -changing_icon_cb (GtkAction *action, - gpointer callback_data) -{ - GtkWidget *window; - GtkWidget *vbox; - GtkWidget *label; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Changing Icon"); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - - gtk_container_add (GTK_CONTAINER (window), vbox); - - label = gtk_label_new ("This window has an icon that changes over time"); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - - gtk_widget_show_all (window); -} -#endif - -static gboolean -focus_in_event_cb (GtkWidget *window, - GdkEvent *event, - gpointer data) -{ - GtkWidget *widget; - - widget = GTK_WIDGET (data); - - gtk_label_set_text (GTK_LABEL (widget), "Has focus"); - - return TRUE; -} - - -static gboolean -focus_out_event_cb (GtkWidget *window, - GdkEvent *event, - gpointer data) -{ - GtkWidget *widget; - - widget = GTK_WIDGET (data); - - gtk_label_set_text (GTK_LABEL (widget), "Not focused"); - - return TRUE; -} - -static GtkWidget* -focus_label (GtkWidget *window) -{ - GtkWidget *label; - - label = gtk_label_new ("Not focused"); - - g_signal_connect (G_OBJECT (window), "focus_in_event", - G_CALLBACK (focus_in_event_cb), label); - - g_signal_connect (G_OBJECT (window), "focus_out_event", - G_CALLBACK (focus_out_event_cb), label); - - return label; -} - -static void -splashscreen_cb (GtkAction *action, - gpointer callback_data) -{ - GtkWidget *window; - GtkWidget *image; - GtkWidget *vbox; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_SPLASHSCREEN"); - gtk_window_set_title (GTK_WINDOW (window), "Splashscreen"); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - - image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); - gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), focus_label (window), FALSE, FALSE, 0); - - gtk_container_add (GTK_CONTAINER (window), vbox); - - gtk_widget_show_all (window); -} - -enum -{ - DOCK_TOP = 1, - DOCK_BOTTOM = 2, - DOCK_LEFT = 3, - DOCK_RIGHT = 4, - DOCK_ALL = 5 -}; - -static void -make_dock (int type) -{ - GtkWidget *window; - GtkWidget *image; - GtkWidget *box; - GtkWidget *button; - - g_return_if_fail (type != DOCK_ALL); - - box = NULL; - switch (type) - { - case DOCK_LEFT: - case DOCK_RIGHT: - box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - break; - case DOCK_TOP: - case DOCK_BOTTOM: - box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); - break; - case DOCK_ALL: - break; - } - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_DOCK"); - - image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); - gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (box), focus_label (window), FALSE, FALSE, 0); - - button = gtk_button_new_with_label ("Close"); - gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); - - g_signal_connect_swapped (G_OBJECT (button), "clicked", - G_CALLBACK (gtk_widget_destroy), window); - - gtk_container_add (GTK_CONTAINER (window), box); - -#define DOCK_SIZE 48 - switch (type) - { - case DOCK_LEFT: - gtk_widget_set_size_request (window, DOCK_SIZE, 400); - gtk_window_move (GTK_WINDOW (window), 0, 000); - set_gtk_window_struts (window, DOCK_SIZE, 0, 0, 0); - gtk_window_set_title (GTK_WINDOW (window), "LeftDock"); - break; - case DOCK_RIGHT: - gtk_widget_set_size_request (window, DOCK_SIZE, 400); - gtk_window_move (GTK_WINDOW (window), gdk_screen_width () - DOCK_SIZE, 200); - set_gtk_window_struts (window, 0, DOCK_SIZE, 0, 0); - gtk_window_set_title (GTK_WINDOW (window), "RightDock"); - break; - case DOCK_TOP: - gtk_widget_set_size_request (window, 600, DOCK_SIZE); - gtk_window_move (GTK_WINDOW (window), 76, 0); - set_gtk_window_struts (window, 0, 0, DOCK_SIZE, 0); - gtk_window_set_title (GTK_WINDOW (window), "TopDock"); - break; - case DOCK_BOTTOM: - gtk_widget_set_size_request (window, 600, DOCK_SIZE); - gtk_window_move (GTK_WINDOW (window), 200, gdk_screen_height () - DOCK_SIZE); - set_gtk_window_struts (window, 0, 0, 0, DOCK_SIZE); - gtk_window_set_title (GTK_WINDOW (window), "BottomDock"); - break; - case DOCK_ALL: - break; - } - - gtk_widget_show_all (window); -} - -static void -dock_cb (GtkAction *action, - gpointer callback_data) -{ - guint callback_action; - const gchar *name; - - name = gtk_action_get_name (action); - - if (!g_strcmp0 (name, "Top dock")) - callback_action = DOCK_TOP; - else if (!g_strcmp0 (name, "Bottom dock")) - callback_action = DOCK_BOTTOM; - else if (!g_strcmp0 (name, "Left dock")) - callback_action = DOCK_LEFT; - else if (!g_strcmp0 (name, "Right dock")) - callback_action = DOCK_RIGHT; - else if (!g_strcmp0 (name, "All docks")) - callback_action = DOCK_ALL; - else - return; - - if (callback_action == DOCK_ALL) - { - make_dock (DOCK_TOP); - make_dock (DOCK_BOTTOM); - make_dock (DOCK_LEFT); - make_dock (DOCK_RIGHT); - } - else - { - make_dock (callback_action); - } -} - -static void -desktop_cb (GtkAction *action, - gpointer callback_data) -{ - GtkWidget *window; - GtkWidget *label; - GdkRGBA desktop_color; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_DESKTOP"); - gtk_window_set_title (GTK_WINDOW (window), "Desktop"); - gtk_widget_set_size_request (window, - gdk_screen_width (), gdk_screen_height ()); - gtk_window_move (GTK_WINDOW (window), 0, 0); - - desktop_color.red = 0.32; - desktop_color.green = 0.46; - desktop_color.blue = 0.65; - desktop_color.alpha = 1.0; - - gtk_widget_override_background_color (window, 0, &desktop_color); - - label = focus_label (window); - - gtk_container_add (GTK_CONTAINER (window), label); - - gtk_widget_show_all (window); -} - -static void -sleep_cb (GtkAction *action, - gpointer data) -{ - sleep (1000); -} - -static void -toggle_aspect_ratio (GtkAction *action, - gpointer data) -{ - GtkWidget *window; - GdkGeometry geom; - GtkWidget *widget = GTK_WIDGET (data); - - if (aspect_on) - { - geom.min_aspect = 0; - geom.max_aspect = 65535; - } - else - { - geom.min_aspect = 1.777778; - geom.max_aspect = 1.777778; - } - - aspect_on = !aspect_on; - - window = gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW); - if (window) - gtk_window_set_geometry_hints (GTK_WINDOW (window), - widget, - &geom, - GDK_HINT_ASPECT); - -} - -static void -toggle_decorated_cb (GtkWidget *button, - gpointer data) -{ - GtkWidget *window; - window = gtk_widget_get_ancestor (data, GTK_TYPE_WINDOW); - if (window) - gtk_window_set_decorated (GTK_WINDOW (window), - !gtk_window_get_decorated (GTK_WINDOW (window))); -} - -static void -clicked_toolbar_cb (GtkWidget *button, - gpointer data) -{ - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (GTK_WINDOW (data), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_INFO, - GTK_BUTTONS_CLOSE, - "Clicking the toolbar buttons doesn't do anything"); - - /* Close dialog on user response */ - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (gtk_widget_destroy), - NULL); - - gtk_widget_show (dialog); -} - -static void -update_statusbar (GtkTextBuffer *buffer, - GtkStatusbar *statusbar) -{ - gchar *msg; - gint row, col; - gint count; - GtkTextIter iter; - - gtk_statusbar_pop (statusbar, 0); /* clear any previous message, underflow is allowed */ - - count = gtk_text_buffer_get_char_count (buffer); - - gtk_text_buffer_get_iter_at_mark (buffer, - &iter, - gtk_text_buffer_get_insert (buffer)); - - row = gtk_text_iter_get_line (&iter); - col = gtk_text_iter_get_line_offset (&iter); - - msg = g_strdup_printf ("Cursor at row %d column %d - %d chars in document", - row, col, count); - - gtk_statusbar_push (statusbar, 0, msg); - - g_free (msg); -} - -static void -mark_set_callback (GtkTextBuffer *buffer, - const GtkTextIter *new_location, - GtkTextMark *mark, - gpointer data) -{ - update_statusbar (buffer, GTK_STATUSBAR (data)); -} - -static int window_count = 0; - -static void -destroy_cb (GtkWidget *w, gpointer data) -{ - --window_count; - if (window_count == 0) - gtk_main_quit (); -} - -static const gchar *menu_item_string = - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n"; - -static const GtkActionEntry menu_items[] = -{ - { "Windows", NULL, "_Windows", NULL, - NULL, NULL }, - { "Dialog", NULL, "_Dialog", "d", - NULL, G_CALLBACK (dialog_cb) }, - { "Modal dialog", NULL, "_Modal dialog", NULL, - NULL, G_CALLBACK (modal_dialog_cb) }, - { "Parentless dialog", NULL, "_Parentless dialog", NULL, - NULL, G_CALLBACK (no_parent_dialog_cb) }, - { "Utility", NULL, "_Utility", "u", - NULL, G_CALLBACK (utility_cb) }, - { "Splashscreen", NULL, "_Splashscreen", "s", - NULL, G_CALLBACK (splashscreen_cb) }, - { "Top dock", NULL, "_Top dock", NULL, - NULL, G_CALLBACK (dock_cb) }, - { "Bottom dock", NULL, "_Bottom dock", NULL, - NULL, G_CALLBACK (dock_cb) }, - { "Left dock", NULL, "_Left dock", NULL, - NULL, G_CALLBACK (dock_cb) }, - { "Right dock", NULL, "_Right dock", NULL, - NULL, G_CALLBACK (dock_cb) }, - { "All docks", NULL, "_All docks", NULL, - NULL, G_CALLBACK (dock_cb) }, - { "Desktop", NULL, "Des_ktop", NULL, - NULL, G_CALLBACK (desktop_cb) }, - { "Menu", NULL, "Me_nu", NULL, - NULL, G_CALLBACK (menu_cb) }, - { "Toolbar", NULL, "Tool_bar", NULL, - NULL, G_CALLBACK (toolbar_cb) }, - { "Override Redirect", NULL, "Override Redirect", NULL, - NULL, G_CALLBACK (override_redirect_cb) }, - { "Border Only", NULL, "Border Only", NULL, - NULL, G_CALLBACK (border_only_cb) } -}; - -static const GtkActionEntry tool_items[] = -{ - { "New", GTK_STOCK_NEW, NULL, NULL, - "Open another one of these windows", G_CALLBACK (do_appwindow) }, - { "Lock", GTK_STOCK_OPEN, NULL, NULL, - "This is a demo button that" - " locks up the demo", G_CALLBACK (sleep_cb) }, - { "Decorations", GTK_STOCK_OPEN, NULL, NULL, - "This is a demo button that " - "toggles window decorations", G_CALLBACK (toggle_decorated_cb) }, - { "Quit", GTK_STOCK_QUIT, NULL, NULL, - "This is a demo button with " - " a 'quit' icon", G_CALLBACK (clicked_toolbar_cb) }, - { "Ratio", GTK_STOCK_OPEN, NULL, NULL, - "This is a demo button that locks the aspect ratio " - "using a hint", G_CALLBACK (toggle_aspect_ratio) } -}; - -static GtkWidget * -do_appwindow (void) -{ - GtkWidget *window; - GtkWidget *grid; - GtkWidget *statusbar; - GtkWidget *contents; - GtkWidget *sw; - GtkTextBuffer *buffer; - GtkActionGroup *action_group; - GtkUIManager *ui_manager; - - /* Create the toplevel window - */ - - ++window_count; - - aspect_on = FALSE; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Application Window"); - - g_signal_connect (G_OBJECT (window), "destroy", - G_CALLBACK (destroy_cb), NULL); - - grid = gtk_grid_new (); - - gtk_widget_set_vexpand (grid, TRUE); - gtk_widget_set_hexpand (grid, TRUE); - - gtk_container_add (GTK_CONTAINER (window), grid); - - /* Create the menubar - */ - - contents = gtk_text_view_new (); - - action_group = gtk_action_group_new ("mainmenu"); - gtk_action_group_add_actions (action_group, - menu_items, - G_N_ELEMENTS (menu_items), - window); - gtk_action_group_add_actions (action_group, - tool_items, - G_N_ELEMENTS (tool_items), - window); - - ui_manager = gtk_ui_manager_new (); - - gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); - - /* create menu items */ - - gtk_ui_manager_add_ui_from_string (ui_manager, menu_item_string, -1, NULL); - - gtk_grid_attach (GTK_GRID (grid), - gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"), - 0, 0, 1, 1); - - gtk_widget_set_hexpand (gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"), - TRUE); - - /* Create document - */ - - sw = gtk_scrolled_window_new (NULL, NULL); - - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), - GTK_SHADOW_IN); - - gtk_grid_attach (GTK_GRID (grid), - sw, - 0, 2, 1, 1); - - gtk_widget_set_hexpand (sw, TRUE); - gtk_widget_set_vexpand (sw, TRUE); - - gtk_window_set_default_size (GTK_WINDOW (window), - 200, 200); - - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (contents), - PANGO_WRAP_WORD); - - gtk_container_add (GTK_CONTAINER (sw), - contents); - - /* Create the toolbar - */ - - gtk_grid_attach (GTK_GRID (grid), - gtk_ui_manager_get_widget (ui_manager, "/ui/toolbar"), - 0, 1, 1, 1); - - gtk_widget_set_hexpand (gtk_ui_manager_get_widget (ui_manager, "/ui/toolbar"), - TRUE); - - /* Create statusbar */ - - statusbar = gtk_statusbar_new (); - gtk_grid_attach (GTK_GRID (grid), - statusbar, - 0, 3, 1, 1); - - gtk_widget_set_hexpand (statusbar, - TRUE); - - /* Show text widget info in the statusbar */ - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (contents)); - - gtk_text_buffer_set_text (buffer, - "This demo demonstrates various kinds of windows that " - "window managers and window manager themes should handle. " - "Be sure to tear off the menu and toolbar, those are also " - "a special kind of window.", - -1); - - g_signal_connect_object (buffer, - "changed", - G_CALLBACK (update_statusbar), - statusbar, - 0); - - g_signal_connect_object (buffer, - "mark_set", /* cursor moved */ - G_CALLBACK (mark_set_callback), - statusbar, - 0); - - update_statusbar (buffer, GTK_STATUSBAR (statusbar)); - - gtk_widget_show_all (window); - - g_object_unref (ui_manager); - - return window; -} - - diff --git a/src/tools/mutter-window-demo.png b/src/tools/mutter-window-demo.png deleted file mode 100644 index d87f8296e7666871e3d2662c18601aaf23017049..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3453 zcmV-@4TAECP)XmBbur3#T!8a1d@t3>Jt8jxC5RM1DDMW|}2TOLYC112%GNic~+!pp%9 z5BomPIeX8{TB{%SHg+68xFmdIq^)z#J~Mm%|5dk1AOnbB5(o=_>wjLZiJ+pAu{6aMX{_J>@@7#KW?A&_8 zD~iKowWAKcYReVpOW?k>>n43>y3P}m-R`m#{n>qc7A8VrG1j>^KO0d6ksu-jK+N(Z zx88L7=3m;p@qvf7?_LhP{ope%{J^I3C&#;Q&N-b;NugWys%KkdX%$Bh!A#*_>CciZK`R7yZvbh ze{k6)-EQZfC#SlWv(B$vwPfkuJ#&Nk+2PkiD91#?10wRp zTW-85;mzAR^mE!slbUi>NB4Z{iSPgT2a6)G<+E3PzU&mAE=m^mzc89KvjNEeiiGR` z;cx!&@%Nqg*3&Qil}-QF?{?1ajdkdhfubys5KxRDp}7iy5Gcxk0HG+!$;dIGn#nOD z7pDkbIy6?5}L2E#})eg43U3s>HM@8kb{JOV!v1HFFv(V6Mt{uHfn=lY^3 z|LK++Z+jl#o#&jf?!)ij^o@SMzh=o;k50c!rwH^Xrs$M?2E!T3P#}c?0TF@Vm;)k| zrBR6?$q+hNj&yom`UYl@)G0!s-|G-#A`Wcz@|BZYKX~!kpS=679XFkjz?IircG2{K zp`@r^xb>#5{QZ#~FS+R42PY>d){IXqVcD`(tX#F0Ri|vE8qVOZ9C+~=7UrKv1VRX? zIiYCeC99DwA*CP=qTmRHIGs*OUyM3N%241ID9REJ-)^FIv>a}lWY-}l2HH(Bm9L8Kmv1aI6bSb<8wi;R>3&5o1-kAbob^gA8uULxi|(GAD|M1)l*FTE3Z>(L0jTuOX< z`>x&J-oER*M|SwVkNxubXKq+?t*njD|A|M*A7eJ&yz3&NwDU z2!eN$7BCOi9dEM-Hc0Rl9NPH(O z=H9aLlrQ$WUB>$3tT<^MWv4^dioyH~6lI5MZ~#KV(q(HPGy&~6gaA11;5hCX_Xdz- z7@&7OW{$fYii>QxJF1GB;sumN7j;3TL_#2& zW0q0#jf*C*Vg2eq3ZbAVOHNvKIt0NiBc{yE?4>_G2?#M|QoVp9@bZdVGqF0V8OJd* zn!3STYdGpoGEfsdIaw7EqZA<&P9cG$nVj=cF&?*0@AWz#?)17y5s*%gx*AXhp{f?> zlpW^gUH}5_2{pr|)x?9V?iqJ&R@@8`!Q4OsCZO3lR5v&(;Ns-$SOC+2iQp-a3tJq4 z3qP>w^r9OG0wEN1%RV`c7*=x-3bbyLQlpCjQv)}0t32k0Y8#ZA+SPCFrI>IB5hp67 zthhB~%)v#l91(GF!*Jvn71A*YocWeh&J)1gaWhh?$=QiHzU}sZ*kk z0~Ut!Bps48GKy6LNE50`${AI~X#8HS$*_))^&nUyr6!Y>Au=RVAxXRhbmqz}G~s8fg|2ie7p9u`nJtkv+F}`b%}KWXp`|A%oF8 z!)nN2RFN%`t+7DLhc0y^YZJ_lQ^iEgjWrqzWwI(cgR7BJW>k-;>zY(21`9P+N~jv< zf(vvya`USq@OOWE-+f8*^Hm+G>qu1%sp}y*kErWNOwIk2YqC1#N=%8Ajg*xb6K0B8 zCTVV6MNvR4Q$=mE_%M^QGfWwyAghs*;%fBAy8pTL&Ye4sh4F+ZW^;3+%euYtzD8LB zT~$IMltsV@jZPOr5foQPBs6lUt#4O~xsh@vre;HL*+|K#>PQ@AqGn=L%tGT{QC=P}r}%(M+wr;eGNjhHiaQbxmws*z*eth6fGjBHL$N}ars**cL^#tpLD z@Q2^sd*}RYH3hr@m;!n&0jE`sS43dvj;9Ztx$)$?y4~KfJDSfoy**u+H~MPh17g~1@>rf7nsO*xfvq^^uuXIzZEdk&P({_v%9fp-F@04srI zz&MTUIgnow0f3$V_w@8TesSHSL5lZh)d|l=Rwvh)QOx9&$m(b^szD}>Dylj%8pbxe z8dZ+uq-a*EXoL`Ohe{K%b}UEKl-b#e$9L|L)TtM9r31}9Ib|$rElkXz9*~{5@-`;5+dGLe>aSnV7*aEV&xLX#(Q+Sf+LJ7W%`9# zcJJE9?DPrWKrI0G(yaXVf$svl7fV2Bg6K`aS-@uCf|ksZQ`W9Tfamt?U*uzt*__5* z9&7=>2t3(d&j2sInwJX&FbSMYqY9@1Zv@V!A+nN2uV3wp3#VD_r-9wTv%m|$b1mrS zf&IV?&B@HGYJny@PPTwgrb#w$JnVBVu#|?#!FeWV$dxpD9%xi$&;on51$O{Q?Y(`6 zeI980znqbOrq??yfTAU{v;}xDbFMfHY-|A?oKFtBS97R57`6YU_L`6y0QPo1s& ztOSmHR;Rs6npo+zzf()}U -#include -#include -#include "theme-private.h" - -static void meta_preview_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural); -static void meta_preview_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural); -static void meta_preview_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static gboolean meta_preview_draw (GtkWidget *widget, - cairo_t *cr); -static void meta_preview_realize (GtkWidget *widget); -static void meta_preview_dispose (GObject *object); -static void meta_preview_finalize (GObject *object); - -G_DEFINE_TYPE (MetaPreview, meta_preview, GTK_TYPE_BIN); - -static void -meta_preview_class_init (MetaPreviewClass *class) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (class); - GtkWidgetClass *widget_class; - - widget_class = (GtkWidgetClass*) class; - - gobject_class->dispose = meta_preview_dispose; - gobject_class->finalize = meta_preview_finalize; - - widget_class->realize = meta_preview_realize; - widget_class->draw = meta_preview_draw; - widget_class->get_preferred_width = meta_preview_get_preferred_width; - widget_class->get_preferred_height = meta_preview_get_preferred_height; - widget_class->size_allocate = meta_preview_size_allocate; - - gtk_container_class_handle_border_width (GTK_CONTAINER_CLASS (class)); -} - -static void -meta_preview_init (MetaPreview *preview) -{ - int i; - - gtk_widget_set_has_window (GTK_WIDGET (preview), FALSE); - - i = 0; - while (i < MAX_BUTTONS_PER_CORNER) - { - preview->button_layout.left_buttons[i] = META_BUTTON_FUNCTION_LAST; - preview->button_layout.right_buttons[i] = META_BUTTON_FUNCTION_LAST; - ++i; - } - - preview->button_layout.left_buttons[0] = META_BUTTON_FUNCTION_MENU; - - preview->button_layout.right_buttons[0] = META_BUTTON_FUNCTION_MINIMIZE; - preview->button_layout.right_buttons[1] = META_BUTTON_FUNCTION_MAXIMIZE; - preview->button_layout.right_buttons[2] = META_BUTTON_FUNCTION_CLOSE; - - preview->type = META_FRAME_TYPE_NORMAL; - preview->flags = - META_FRAME_ALLOWS_DELETE | - META_FRAME_ALLOWS_MENU | - META_FRAME_ALLOWS_MINIMIZE | - META_FRAME_ALLOWS_MAXIMIZE | - META_FRAME_ALLOWS_VERTICAL_RESIZE | - META_FRAME_ALLOWS_HORIZONTAL_RESIZE | - META_FRAME_HAS_FOCUS | - META_FRAME_ALLOWS_SHADE | - META_FRAME_ALLOWS_MOVE; - - preview->borders_cached = FALSE; -} - -GtkWidget* -meta_preview_new (void) -{ - MetaPreview *preview; - - preview = g_object_new (META_TYPE_PREVIEW, NULL); - - return GTK_WIDGET (preview); -} - -static void -meta_preview_dispose (GObject *object) -{ - MetaPreview *preview = META_PREVIEW (object); - - g_clear_object (&preview->style_context); - - G_OBJECT_CLASS (meta_preview_parent_class)->dispose (object); -} - -static void -meta_preview_finalize (GObject *object) -{ - MetaPreview *preview; - - preview = META_PREVIEW (object); - - g_free (preview->title); - preview->title = NULL; - - G_OBJECT_CLASS (meta_preview_parent_class)->finalize (object); -} - -static void -ensure_info (MetaPreview *preview) -{ - GtkWidget *widget; - - widget = GTK_WIDGET (preview); - - if (preview->layout == NULL) - { - PangoFontDescription *font_desc; - double scale; - PangoAttrList *attrs; - PangoAttribute *attr; - - if (preview->theme) - scale = meta_theme_get_title_scale (preview->theme, - preview->type, - preview->flags); - else - scale = 1.0; - - preview->layout = gtk_widget_create_pango_layout (widget, - preview->title); - - font_desc = meta_gtk_widget_get_font_desc (widget, scale, NULL); - - preview->text_height = - meta_pango_font_desc_get_text_height (font_desc, - gtk_widget_get_pango_context (widget)); - - attrs = pango_attr_list_new (); - - attr = pango_attr_size_new (pango_font_description_get_size (font_desc)); - attr->start_index = 0; - attr->end_index = G_MAXINT; - - pango_attr_list_insert (attrs, attr); - - pango_layout_set_attributes (preview->layout, attrs); - - pango_attr_list_unref (attrs); - - pango_font_description_free (font_desc); - } - - if (!preview->borders_cached) - { - if (preview->theme) - meta_theme_get_frame_borders (preview->theme, - preview->type, - preview->text_height, - preview->flags, - &preview->borders); - else - meta_frame_borders_clear (&preview->borders); - preview->borders_cached = TRUE; - } -} - -static gboolean -meta_preview_draw (GtkWidget *widget, - cairo_t *cr) -{ - MetaPreview *preview = META_PREVIEW (widget); - GtkAllocation allocation; - - gtk_widget_get_allocation (widget, &allocation); - - if (preview->theme) - { - int client_width; - int client_height; - MetaButtonState button_states[META_BUTTON_TYPE_LAST] = - { - META_BUTTON_STATE_NORMAL, - META_BUTTON_STATE_NORMAL, - META_BUTTON_STATE_NORMAL, - META_BUTTON_STATE_NORMAL - }; - - ensure_info (preview); - cairo_save (cr); - - client_width = allocation.width - preview->borders.total.left - preview->borders.total.right; - client_height = allocation.height - preview->borders.total.top - preview->borders.total.bottom; - - if (client_width < 0) - client_width = 1; - if (client_height < 0) - client_height = 1; - - meta_theme_draw_frame (preview->theme, - preview->style_context, - cr, - preview->type, - preview->flags, - client_width, client_height, - preview->layout, - preview->text_height, - &preview->button_layout, - button_states, - meta_preview_get_mini_icon (), - meta_preview_get_icon ()); - - cairo_restore (cr); - } - - /* draw child */ - return GTK_WIDGET_CLASS (meta_preview_parent_class)->draw (widget, cr); -} - -static void -meta_preview_realize (GtkWidget *widget) -{ - MetaPreview *preview = META_PREVIEW (widget); - - GTK_WIDGET_CLASS (meta_preview_parent_class)->realize (widget); - - preview->style_context = meta_theme_create_style_context (gtk_widget_get_screen (widget), - NULL); -} - -#define NO_CHILD_WIDTH 80 -#define NO_CHILD_HEIGHT 20 - -static void -meta_preview_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - MetaPreview *preview; - GtkWidget *child; - - preview = META_PREVIEW (widget); - - ensure_info (preview); - - *minimum = *natural = preview->borders.total.left + preview->borders.total.right; - - child = gtk_bin_get_child (GTK_BIN (preview)); - if (child && gtk_widget_get_visible (child)) - { - gint child_min, child_nat; - - gtk_widget_get_preferred_width (child, &child_min, &child_nat); - - *minimum += child_min; - *natural += child_nat; - } - else - { - *minimum += NO_CHILD_WIDTH; - *natural += NO_CHILD_WIDTH; - } -} - -static void -meta_preview_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - MetaPreview *preview; - GtkWidget *child; - - preview = META_PREVIEW (widget); - - ensure_info (preview); - - *minimum = *natural = preview->borders.total.top + preview->borders.total.bottom; - - child = gtk_bin_get_child (GTK_BIN (preview)); - if (child && gtk_widget_get_visible (child)) - { - gint child_min, child_nat; - - gtk_widget_get_preferred_height (child, &child_min, &child_nat); - - *minimum += child_min; - *natural += child_nat; - } - else - { - *minimum += NO_CHILD_HEIGHT; - *natural += NO_CHILD_HEIGHT; - } -} - -static void -meta_preview_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - MetaPreview *preview; - GtkAllocation widget_allocation, child_allocation; - GtkWidget *child; - - preview = META_PREVIEW (widget); - - ensure_info (preview); - - gtk_widget_set_allocation (widget, allocation); - - child = gtk_bin_get_child (GTK_BIN (widget)); - if (child && gtk_widget_get_visible (child)) - { - gtk_widget_get_allocation (widget, &widget_allocation); - child_allocation.x = widget_allocation.x + preview->borders.total.left; - child_allocation.y = widget_allocation.y + preview->borders.total.top; - - child_allocation.width = MAX (1, widget_allocation.width - preview->borders.total.left - preview->borders.total.right); - child_allocation.height = MAX (1, widget_allocation.height - preview->borders.total.top - preview->borders.total.bottom); - - gtk_widget_size_allocate (child, &child_allocation); - } -} - -static void -clear_cache (MetaPreview *preview) -{ - if (preview->layout) - { - g_object_unref (G_OBJECT (preview->layout)); - preview->layout = NULL; - } - - preview->borders_cached = FALSE; -} - -void -meta_preview_set_theme (MetaPreview *preview, - MetaTheme *theme) -{ - g_return_if_fail (META_IS_PREVIEW (preview)); - - preview->theme = theme; - - clear_cache (preview); - - gtk_widget_queue_resize (GTK_WIDGET (preview)); -} - -void -meta_preview_set_title (MetaPreview *preview, - const char *title) -{ - g_return_if_fail (META_IS_PREVIEW (preview)); - - g_free (preview->title); - preview->title = g_strdup (title); - - clear_cache (preview); - - gtk_widget_queue_resize (GTK_WIDGET (preview)); -} - -void -meta_preview_set_frame_type (MetaPreview *preview, - MetaFrameType type) -{ - g_return_if_fail (META_IS_PREVIEW (preview)); - - preview->type = type; - - clear_cache (preview); - - gtk_widget_queue_resize (GTK_WIDGET (preview)); -} - -void -meta_preview_set_frame_flags (MetaPreview *preview, - MetaFrameFlags flags) -{ - g_return_if_fail (META_IS_PREVIEW (preview)); - - preview->flags = flags; - - clear_cache (preview); - - gtk_widget_queue_resize (GTK_WIDGET (preview)); -} - -void -meta_preview_set_button_layout (MetaPreview *preview, - const MetaButtonLayout *button_layout) -{ - g_return_if_fail (META_IS_PREVIEW (preview)); - - preview->button_layout = *button_layout; - - gtk_widget_queue_draw (GTK_WIDGET (preview)); -} - -GdkPixbuf* -meta_preview_get_icon (void) -{ - static GdkPixbuf *default_icon = NULL; - - if (default_icon == NULL) - { - GtkIconTheme *theme; - gboolean icon_exists; - - theme = gtk_icon_theme_get_default (); - - icon_exists = gtk_icon_theme_has_icon (theme, META_DEFAULT_ICON_NAME); - - if (icon_exists) - default_icon = gtk_icon_theme_load_icon (theme, - META_DEFAULT_ICON_NAME, - META_ICON_WIDTH, - 0, - NULL); - else - default_icon = gtk_icon_theme_load_icon (theme, - "gtk-missing-image", - META_ICON_WIDTH, - 0, - NULL); - - g_assert (default_icon); - } - - return default_icon; -} - -GdkPixbuf* -meta_preview_get_mini_icon (void) -{ - static GdkPixbuf *default_icon = NULL; - - if (default_icon == NULL) - { - GtkIconTheme *theme; - gboolean icon_exists; - - theme = gtk_icon_theme_get_default (); - - icon_exists = gtk_icon_theme_has_icon (theme, META_DEFAULT_ICON_NAME); - - if (icon_exists) - default_icon = gtk_icon_theme_load_icon (theme, - META_DEFAULT_ICON_NAME, - META_MINI_ICON_WIDTH, - 0, - NULL); - else - default_icon = gtk_icon_theme_load_icon (theme, - "gtk-missing-image", - META_MINI_ICON_WIDTH, - 0, - NULL); - - g_assert (default_icon); - } - - return default_icon; -} diff --git a/src/ui/theme-viewer.c b/src/ui/theme-viewer.c deleted file mode 100644 index 8d2808152..000000000 --- a/src/ui/theme-viewer.c +++ /dev/null @@ -1,1365 +0,0 @@ -/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ - -/* Metacity theme viewer and test app main() */ - -/* - * Copyright (C) 2002 Havoc Pennington - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#include -#include -#include -#include "theme-private.h" -#include -#include -#include -#include -#include - -#include -#define _(x) dgettext (GETTEXT_PACKAGE, x) -#define N_(x) x - -/* We need to compute all different button arrangements - * in terms of button location. We don't care about - * different arrangements in terms of button function. - * - * So if dups are allowed, from 0-4 buttons on the left, from 0-4 on - * the right, 5x5=25 combinations. - * - * If no dups, 0-4 on left determines the number on the right plus - * we have a special case for the "no buttons on either side" case. - */ -#ifndef ALLOW_DUPLICATE_BUTTONS -#define BUTTON_LAYOUT_COMBINATIONS (MAX_BUTTONS_PER_CORNER + 1 + 1) -#else -#define BUTTON_LAYOUT_COMBINATIONS ((MAX_BUTTONS_PER_CORNER+1)*(MAX_BUTTONS_PER_CORNER+1)) -#endif - -enum -{ - FONT_SIZE_SMALL, - FONT_SIZE_NORMAL, - FONT_SIZE_LARGE, - FONT_SIZE_LAST -}; - -static MetaTheme *global_theme = NULL; -static GtkWidget *previews[META_FRAME_TYPE_LAST*FONT_SIZE_LAST + BUTTON_LAYOUT_COMBINATIONS] = { NULL, }; -static double milliseconds_to_draw_frame = 0.0; - -static void run_position_expression_tests (void); -#if 0 -static void run_position_expression_timings (void); -#endif -static void run_theme_benchmark (void); - - -static const gchar *menu_item_string = - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n"; - -static GtkActionEntry menu_items[] = -{ - { "Windows", NULL, N_("_Windows"), NULL, NULL, NULL }, - { "Dialog", NULL, N_("_Dialog"), "d", NULL, NULL }, - { "Modal dialog", NULL, N_("_Modal dialog"), NULL, NULL, NULL }, - { "Utility", NULL, N_("_Utility"), "u", NULL, NULL }, - { "Splashscreen", NULL, N_("_Splashscreen"), "s", NULL, NULL }, - { "Top dock", NULL, N_("_Top dock"), NULL, NULL, NULL }, - { "Bottom dock", NULL, N_("_Bottom dock"), NULL, NULL, NULL }, - { "Left dock", NULL, N_("_Left dock"), NULL, NULL, NULL }, - { "Right dock", NULL, N_("_Right dock"), NULL, NULL, NULL }, - { "All docks", NULL, N_("_All docks"), NULL, NULL, NULL }, - { "Desktop", NULL, N_("Des_ktop"), NULL, NULL, NULL } -}; - -static GtkActionEntry tool_items[] = -{ - { "New", GTK_STOCK_NEW, NULL, NULL, - N_("Open another one of these windows"), NULL }, - { "Open", GTK_STOCK_OPEN, NULL, NULL, - N_("This is a demo button with an 'open' icon"), NULL }, - { "Quit", GTK_STOCK_QUIT, NULL, NULL, - N_("This is a demo button with a 'quit' icon"), NULL } -}; - -static GtkWidget * -normal_contents (void) -{ - GtkWidget *grid; - GtkWidget *statusbar; - GtkWidget *contents; - GtkWidget *sw; - GtkActionGroup *action_group; - GtkUIManager *ui_manager; - - grid = gtk_grid_new (); - - /* Create the menubar - */ - - action_group = gtk_action_group_new ("mainmenu"); - gtk_action_group_add_actions (action_group, - menu_items, - G_N_ELEMENTS (menu_items), - NULL); - gtk_action_group_add_actions (action_group, - tool_items, - G_N_ELEMENTS (tool_items), - NULL); - - ui_manager = gtk_ui_manager_new (); - - gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); - - /* create menu items */ - gtk_ui_manager_add_ui_from_string (ui_manager, menu_item_string, -1, NULL); - - gtk_grid_attach (GTK_GRID (grid), - gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"), - 0, 0, 1, 1); - - gtk_widget_set_hexpand (gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"), - TRUE); - - /* Create the toolbar - */ - gtk_grid_attach (GTK_GRID (grid), - gtk_ui_manager_get_widget (ui_manager, "/ui/toolbar"), - 0, 1, 1, 1); - - gtk_widget_set_hexpand (gtk_ui_manager_get_widget (ui_manager, "/ui/toolbar"), - TRUE); - - /* Create document - */ - - sw = gtk_scrolled_window_new (NULL, NULL); - - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), - GTK_SHADOW_IN); - - gtk_grid_attach (GTK_GRID (grid), - sw, - 0, 2, 1, 1); - - gtk_widget_set_hexpand (sw, TRUE); - gtk_widget_set_vexpand (sw, TRUE); - - contents = gtk_text_view_new (); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (contents), - PANGO_WRAP_WORD); - - gtk_container_add (GTK_CONTAINER (sw), - contents); - - /* Create statusbar */ - - statusbar = gtk_statusbar_new (); - gtk_grid_attach (GTK_GRID (grid), - statusbar, - 0, 3, 1, 1); - - gtk_widget_set_hexpand (statusbar, TRUE); - - gtk_widget_show_all (grid); - - g_object_unref (ui_manager); - - return grid; -} - -static void -update_spacings (GtkWidget *vbox, - GtkWidget *action_area) -{ - gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); - gtk_box_set_spacing (GTK_BOX (action_area), 10); - gtk_container_set_border_width (GTK_CONTAINER (action_area), 5); -} - -static GtkWidget* -dialog_contents (void) -{ - GtkWidget *vbox; - GtkWidget *hbox; - GtkWidget *action_area; - GtkWidget *label; - GtkWidget *image; - GtkWidget *button; - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - - action_area = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL); - - gtk_button_box_set_layout (GTK_BUTTON_BOX (action_area), - GTK_BUTTONBOX_END); - - button = gtk_button_new_from_stock (GTK_STOCK_OK); - gtk_box_pack_end (GTK_BOX (action_area), - button, - FALSE, TRUE, 0); - - gtk_box_pack_end (GTK_BOX (vbox), action_area, - FALSE, TRUE, 0); - - update_spacings (vbox, action_area); - - label = gtk_label_new (_("This is a sample message in a sample dialog")); - image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, - GTK_ICON_SIZE_DIALOG); - gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0); - - gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); - gtk_label_set_selectable (GTK_LABEL (label), TRUE); - - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); - - gtk_box_pack_start (GTK_BOX (hbox), image, - FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (hbox), label, - TRUE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), - hbox, - FALSE, FALSE, 0); - - gtk_widget_show_all (vbox); - - return vbox; -} - -static GtkWidget* -utility_contents (void) -{ - GtkWidget *grid; - GtkWidget *button; - int i, j; - - grid = gtk_grid_new (); - - i = 0; - while (i < 3) - { - j = 0; - while (j < 4) - { - char *str; - - str = g_strdup_printf ("_%c", (char) ('A' + 4*i + j)); - - button = gtk_button_new_with_mnemonic (str); - - g_free (str); - - gtk_grid_attach (GTK_GRID (grid), - button, - i, j, 1, 1); - - ++j; - } - - ++i; - } - - gtk_widget_show_all (grid); - - return grid; -} - -static GtkWidget* -menu_contents (void) -{ - GtkWidget *vbox; - GtkWidget *mi; - int i; - GtkWidget *frame; - - frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame), - GTK_SHADOW_OUT); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - - i = 0; - while (i < 10) - { - char *str = g_strdup_printf (_("Fake menu item %d\n"), i + 1); - mi = gtk_label_new (str); - gtk_misc_set_alignment (GTK_MISC (mi), 0.0, 0.5); - g_free (str); - gtk_box_pack_start (GTK_BOX (vbox), mi, FALSE, FALSE, 0); - - ++i; - } - - gtk_container_add (GTK_CONTAINER (frame), vbox); - - gtk_widget_show_all (frame); - - return frame; -} - -static GtkWidget* -border_only_contents (void) -{ - GtkWidget *event_box; - GtkWidget *vbox; - GtkWidget *w; - GdkRGBA color; - - event_box = gtk_event_box_new (); - - color.red = 0.6; - color.green = 0; - color.blue = 0.6; - color.alpha = 1.0; - gtk_widget_override_background_color (event_box, 0, &color); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); - - w = gtk_label_new (_("Border-only window")); - gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); - w = gtk_button_new_with_label (_("Bar")); - gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); - - gtk_container_add (GTK_CONTAINER (event_box), vbox); - - gtk_widget_show_all (event_box); - - return event_box; -} - -static GtkWidget* -get_window_contents (MetaFrameType type, - const char **title) -{ - switch (type) - { - case META_FRAME_TYPE_NORMAL: - *title = _("Normal Application Window"); - return normal_contents (); - - case META_FRAME_TYPE_DIALOG: - *title = _("Dialog Box"); - return dialog_contents (); - - case META_FRAME_TYPE_MODAL_DIALOG: - *title = _("Modal Dialog Box"); - return dialog_contents (); - - case META_FRAME_TYPE_UTILITY: - *title = _("Utility Palette"); - return utility_contents (); - - case META_FRAME_TYPE_MENU: - *title = _("Torn-off Menu"); - return menu_contents (); - - case META_FRAME_TYPE_BORDER: - *title = _("Border"); - return border_only_contents (); - - case META_FRAME_TYPE_ATTACHED: - *title = _("Attached Modal Dialog"); - return dialog_contents (); - - case META_FRAME_TYPE_LAST: - g_assert_not_reached (); - break; - } - - return NULL; -} - -static MetaFrameFlags -get_window_flags (MetaFrameType type) -{ - MetaFrameFlags flags; - - flags = META_FRAME_ALLOWS_DELETE | - META_FRAME_ALLOWS_MENU | - META_FRAME_ALLOWS_MINIMIZE | - META_FRAME_ALLOWS_MAXIMIZE | - META_FRAME_ALLOWS_VERTICAL_RESIZE | - META_FRAME_ALLOWS_HORIZONTAL_RESIZE | - META_FRAME_HAS_FOCUS | - META_FRAME_ALLOWS_SHADE | - META_FRAME_ALLOWS_MOVE; - - switch (type) - { - case META_FRAME_TYPE_NORMAL: - break; - - case META_FRAME_TYPE_DIALOG: - case META_FRAME_TYPE_MODAL_DIALOG: - flags &= ~(META_FRAME_ALLOWS_MINIMIZE | - META_FRAME_ALLOWS_MAXIMIZE); - break; - - case META_FRAME_TYPE_UTILITY: - flags &= ~(META_FRAME_ALLOWS_MINIMIZE | - META_FRAME_ALLOWS_MAXIMIZE); - break; - - case META_FRAME_TYPE_MENU: - flags &= ~(META_FRAME_ALLOWS_MINIMIZE | - META_FRAME_ALLOWS_MAXIMIZE); - break; - - case META_FRAME_TYPE_BORDER: - break; - - case META_FRAME_TYPE_ATTACHED: - break; - - case META_FRAME_TYPE_LAST: - g_assert_not_reached (); - break; - } - - return flags; -} - -static GtkWidget* -preview_collection (int font_size, - const PangoFontDescription *base_desc) -{ - GtkWidget *box; - GtkWidget *sw; - GdkRGBA desktop_color; - int i; - GtkWidget *eventbox; - - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - - box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_box_set_spacing (GTK_BOX (box), 20); - gtk_container_set_border_width (GTK_CONTAINER (box), 20); - - eventbox = gtk_event_box_new (); - gtk_container_add (GTK_CONTAINER (eventbox), box); - gtk_container_add (GTK_CONTAINER (sw), eventbox); - - desktop_color.red = 0.32; - desktop_color.green = 0.46; - desktop_color.blue = 0.65; - desktop_color.alpha = 1.0; - - gtk_widget_override_background_color (eventbox, 0, &desktop_color); - - i = 0; - while (i < META_FRAME_TYPE_LAST) - { - const char *title = NULL; - GtkWidget *contents; - GtkWidget *align; - double xalign, yalign; - GtkWidget *eventbox2; - GtkWidget *preview; - PangoFontDescription *font_desc; - double scale; - - eventbox2 = gtk_event_box_new (); - - preview = meta_preview_new (); - - gtk_container_add (GTK_CONTAINER (eventbox2), preview); - - meta_preview_set_frame_type (META_PREVIEW (preview), i); - meta_preview_set_frame_flags (META_PREVIEW (preview), - get_window_flags (i)); - - meta_preview_set_theme (META_PREVIEW (preview), global_theme); - - contents = get_window_contents (i, &title); - - meta_preview_set_title (META_PREVIEW (preview), title); - - gtk_container_add (GTK_CONTAINER (preview), contents); - - if (i == META_FRAME_TYPE_MENU) - { - xalign = 0.0; - yalign = 0.0; - } - else - { - xalign = 0.5; - yalign = 0.5; - } - - align = gtk_alignment_new (0.0, 0.0, xalign, yalign); - gtk_container_add (GTK_CONTAINER (align), eventbox2); - - gtk_box_pack_start (GTK_BOX (box), align, TRUE, TRUE, 0); - - switch (font_size) - { - case FONT_SIZE_SMALL: - scale = PANGO_SCALE_XX_SMALL; - break; - case FONT_SIZE_LARGE: - scale = PANGO_SCALE_XX_LARGE; - break; - default: - scale = 1.0; - break; - } - - if (scale != 1.0) - { - font_desc = pango_font_description_new (); - - pango_font_description_set_size (font_desc, - MAX (pango_font_description_get_size (base_desc) * scale, 1)); - - gtk_widget_modify_font (preview, font_desc); - - pango_font_description_free (font_desc); - } - - previews[font_size*META_FRAME_TYPE_LAST + i] = preview; - - ++i; - } - - return sw; -} - -static MetaButtonLayout different_layouts[BUTTON_LAYOUT_COMBINATIONS]; - -static void -init_layouts (void) -{ - int i; - - /* Blank out all the layouts */ - i = 0; - while (i < (int) G_N_ELEMENTS (different_layouts)) - { - int j; - - j = 0; - while (j < MAX_BUTTONS_PER_CORNER) - { - different_layouts[i].left_buttons[j] = META_BUTTON_FUNCTION_LAST; - different_layouts[i].right_buttons[j] = META_BUTTON_FUNCTION_LAST; - ++j; - } - ++i; - } - -#ifndef ALLOW_DUPLICATE_BUTTONS - i = 0; - while (i <= MAX_BUTTONS_PER_CORNER) - { - int j; - - j = 0; - while (j < i) - { - different_layouts[i].right_buttons[j] = (MetaButtonFunction) j; - ++j; - } - while (j < MAX_BUTTONS_PER_CORNER) - { - different_layouts[i].left_buttons[j-i] = (MetaButtonFunction) j; - ++j; - } - - ++i; - } - - /* Special extra case for no buttons on either side */ - different_layouts[i].left_buttons[0] = META_BUTTON_FUNCTION_LAST; - different_layouts[i].right_buttons[0] = META_BUTTON_FUNCTION_LAST; - -#else - /* FIXME this code is if we allow duplicate buttons, - * which we currently do not - */ - int left; - int i; - - left = 0; - i = 0; - - while (left < MAX_BUTTONS_PER_CORNER) - { - int right; - - right = 0; - - while (right < MAX_BUTTONS_PER_CORNER) - { - int j; - - static MetaButtonFunction left_functions[MAX_BUTTONS_PER_CORNER] = { - META_BUTTON_FUNCTION_MENU, - META_BUTTON_FUNCTION_MINIMIZE, - META_BUTTON_FUNCTION_MAXIMIZE, - META_BUTTON_FUNCTION_CLOSE - }; - static MetaButtonFunction right_functions[MAX_BUTTONS_PER_CORNER] = { - META_BUTTON_FUNCTION_MINIMIZE, - META_BUTTON_FUNCTION_MAXIMIZE, - META_BUTTON_FUNCTION_CLOSE, - META_BUTTON_FUNCTION_MENU - }; - - g_assert (i < BUTTON_LAYOUT_COMBINATIONS); - - j = 0; - while (j <= left) - { - different_layouts[i].left_buttons[j] = left_functions[j]; - ++j; - } - - j = 0; - while (j <= right) - { - different_layouts[i].right_buttons[j] = right_functions[j]; - ++j; - } - - ++i; - - ++right; - } - - ++left; - } -#endif -} - - -static GtkWidget* -previews_of_button_layouts (void) -{ - static gboolean initted = FALSE; - GtkWidget *box; - GtkWidget *sw; - GdkRGBA desktop_color; - int i; - GtkWidget *eventbox; - - if (!initted) - { - init_layouts (); - initted = TRUE; - } - - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - - box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_box_set_spacing (GTK_BOX (box), 20); - gtk_container_set_border_width (GTK_CONTAINER (box), 20); - - eventbox = gtk_event_box_new (); - gtk_container_add (GTK_CONTAINER (eventbox), box); - gtk_container_add (GTK_CONTAINER (sw), eventbox); - - desktop_color.red = 0.32; - desktop_color.green = 0.46; - desktop_color.blue = 0.65; - desktop_color.alpha = 1.0; - - gtk_widget_override_background_color (eventbox, 0, &desktop_color); - - i = 0; - while (i < BUTTON_LAYOUT_COMBINATIONS) - { - GtkWidget *align; - double xalign, yalign; - GtkWidget *eventbox2; - GtkWidget *preview; - char *title; - - eventbox2 = gtk_event_box_new (); - - preview = meta_preview_new (); - - gtk_container_add (GTK_CONTAINER (eventbox2), preview); - - meta_preview_set_theme (META_PREVIEW (preview), global_theme); - - title = g_strdup_printf (_("Button layout test %d"), i+1); - meta_preview_set_title (META_PREVIEW (preview), title); - g_free (title); - - meta_preview_set_button_layout (META_PREVIEW (preview), - &different_layouts[i]); - - xalign = 0.5; - yalign = 0.5; - - align = gtk_alignment_new (0.0, 0.0, xalign, yalign); - gtk_container_add (GTK_CONTAINER (align), eventbox2); - - gtk_box_pack_start (GTK_BOX (box), align, TRUE, TRUE, 0); - - previews[META_FRAME_TYPE_LAST*FONT_SIZE_LAST + i] = preview; - - ++i; - } - - return sw; -} - -static GtkWidget* -benchmark_summary (void) -{ - char *msg; - GtkWidget *label; - - msg = g_strdup_printf (_("%g milliseconds to draw one window frame"), - milliseconds_to_draw_frame); - label = gtk_label_new (msg); - g_free (msg); - - return label; -} - -int -main (int argc, char **argv) -{ - GtkStyleContext *style; - PangoFontDescription *font_desc; - GtkWidget *window; - GtkWidget *collection; - GError *err; - clock_t start, end; - GtkWidget *notebook; - int i; - - bindtextdomain (GETTEXT_PACKAGE, MUTTER_LOCALEDIR); - textdomain(GETTEXT_PACKAGE); - bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); - - run_position_expression_tests (); -#if 0 - run_position_expression_timings (); -#endif - - gtk_init (&argc, &argv); - - if (g_getenv ("MUTTER_DEBUG") != NULL) - { - meta_set_debugging (TRUE); - meta_set_verbose (TRUE); - } - - start = clock (); - err = NULL; - if (argc == 1) - global_theme = meta_theme_load ("Atlanta", &err); - else if (argc == 2) - global_theme = meta_theme_load (argv[1], &err); - else - { - g_printerr (_("Usage: metacity-theme-viewer [THEMENAME]\n")); - exit (1); - } - end = clock (); - - if (global_theme == NULL) - { - g_printerr (_("Error loading theme: %s\n"), - err->message); - g_error_free (err); - exit (1); - } - - g_print (_("Loaded theme \"%s\" in %g seconds\n"), - global_theme->name, - (end - start) / (double) CLOCKS_PER_SEC); - - run_theme_benchmark (); - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size (GTK_WINDOW (window), 350, 350); - - if (strcmp (global_theme->name, global_theme->readable_name)==0) - gtk_window_set_title (GTK_WINDOW (window), - global_theme->readable_name); - else - { - /* The theme directory name is different from the name the theme - * gives itself within its file. Display both, directory name first. - */ - gchar *title = g_strconcat (global_theme->name, " - ", - global_theme->readable_name, - NULL); - - gtk_window_set_title (GTK_WINDOW (window), - title); - - g_free (title); - } - - g_signal_connect (G_OBJECT (window), "destroy", - G_CALLBACK (gtk_main_quit), NULL); - - gtk_widget_realize (window); - - style = meta_theme_create_style_context (gtk_widget_get_screen (window), NULL); - gtk_style_context_get (style, GTK_STATE_FLAG_NORMAL, "font", &font_desc, NULL); - - g_assert (style); - g_assert (font_desc); - - notebook = gtk_notebook_new (); - gtk_container_add (GTK_CONTAINER (window), notebook); - - collection = preview_collection (FONT_SIZE_NORMAL, - font_desc); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - collection, - gtk_label_new (_("Normal Title Font"))); - - collection = preview_collection (FONT_SIZE_SMALL, - font_desc); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - collection, - gtk_label_new (_("Small Title Font"))); - - collection = preview_collection (FONT_SIZE_LARGE, - font_desc); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - collection, - gtk_label_new (_("Large Title Font"))); - - collection = previews_of_button_layouts (); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - collection, - gtk_label_new (_("Button Layouts"))); - - collection = benchmark_summary (); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - collection, - gtk_label_new (_("Benchmark"))); - - pango_font_description_free (font_desc); - - i = 0; - while (i < (int) G_N_ELEMENTS (previews)) - { - /* preview widget likes to be realized before its size request. - * it's lame that way. - */ - gtk_widget_realize (previews[i]); - - ++i; - } - - gtk_widget_show_all (window); - - gtk_main (); - - return 0; -} - - -static MetaFrameFlags -get_flags (GtkWidget *widget) -{ - return META_FRAME_ALLOWS_DELETE | - META_FRAME_ALLOWS_MENU | - META_FRAME_ALLOWS_MINIMIZE | - META_FRAME_ALLOWS_MAXIMIZE | - META_FRAME_ALLOWS_VERTICAL_RESIZE | - META_FRAME_ALLOWS_HORIZONTAL_RESIZE | - META_FRAME_HAS_FOCUS | - META_FRAME_ALLOWS_SHADE | - META_FRAME_ALLOWS_MOVE; -} - -static int -get_text_height (GtkWidget *widget, - GtkStyleContext *style) -{ - PangoFontDescription *font_desc; - int text_height; - - gtk_style_context_get (style, GTK_STATE_FLAG_NORMAL, "font", &font_desc, NULL); - text_height = meta_pango_font_desc_get_text_height (font_desc, - gtk_widget_get_pango_context (widget)); - pango_font_description_free (font_desc); - return text_height; -} - -static PangoLayout* -create_title_layout (GtkWidget *widget) -{ - PangoLayout *layout; - - layout = gtk_widget_create_pango_layout (widget, _("Window Title Goes Here")); - - return layout; -} - -static void -run_theme_benchmark (void) -{ - GtkWidget* widget; - GtkStyleContext *style_context; - cairo_surface_t *pixmap; - MetaFrameBorders borders; - MetaButtonState button_states[META_BUTTON_TYPE_LAST] = - { - META_BUTTON_STATE_NORMAL, - META_BUTTON_STATE_NORMAL, - META_BUTTON_STATE_NORMAL, - META_BUTTON_STATE_NORMAL - }; - PangoLayout *layout; - clock_t start; - clock_t end; - GTimer *timer; - int i; - MetaButtonLayout button_layout; -#define ITERATIONS 100 - int client_width; - int client_height; - cairo_t *cr; - int inc; - - widget = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_realize (widget); - - style_context = meta_theme_create_style_context (gtk_widget_get_screen (widget), NULL); - - meta_theme_get_frame_borders (global_theme, - META_FRAME_TYPE_NORMAL, - get_text_height (widget, style_context), - get_flags (widget), - &borders); - - layout = create_title_layout (widget); - - i = 0; - while (i < MAX_BUTTONS_PER_CORNER) - { - button_layout.left_buttons[i] = META_BUTTON_FUNCTION_LAST; - button_layout.right_buttons[i] = META_BUTTON_FUNCTION_LAST; - ++i; - } - - button_layout.left_buttons[0] = META_BUTTON_FUNCTION_MENU; - - button_layout.right_buttons[0] = META_BUTTON_FUNCTION_MINIMIZE; - button_layout.right_buttons[1] = META_BUTTON_FUNCTION_MAXIMIZE; - button_layout.right_buttons[2] = META_BUTTON_FUNCTION_CLOSE; - - timer = g_timer_new (); - start = clock (); - - client_width = 50; - client_height = 50; - inc = 1000 / ITERATIONS; /* Increment to grow width/height, - * eliminates caching effects. - */ - - i = 0; - while (i < ITERATIONS) - { - /* Creating the pixmap in the loop is right, since - * GDK does the same with its double buffering. - */ - pixmap = gdk_window_create_similar_surface (gtk_widget_get_window (widget), - CAIRO_CONTENT_COLOR, - client_width + borders.total.left + borders.total.right, - client_height + borders.total.top + borders.total.bottom); - - cr = cairo_create (pixmap); - - meta_theme_draw_frame (global_theme, - style_context, - cr, - META_FRAME_TYPE_NORMAL, - get_flags (widget), - client_width, client_height, - layout, - get_text_height (widget, style_context), - &button_layout, - button_states, - meta_preview_get_mini_icon (), - meta_preview_get_icon ()); - - cairo_destroy (cr); - cairo_surface_destroy (pixmap); - - ++i; - client_width += inc; - client_height += inc; - } - - end = clock (); - g_timer_stop (timer); - - milliseconds_to_draw_frame = (g_timer_elapsed (timer, NULL) / (double) ITERATIONS) * 1000; - - g_print (_("Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g seconds wall clock time including X server resources (%g milliseconds per frame)\n"), - ITERATIONS, - ((double)end - (double)start) / CLOCKS_PER_SEC, - (((double)end - (double)start) / CLOCKS_PER_SEC / (double) ITERATIONS) * 1000, - g_timer_elapsed (timer, NULL), - milliseconds_to_draw_frame); - - g_timer_destroy (timer); - g_object_unref (G_OBJECT (layout)); - g_object_unref (style_context); - gtk_widget_destroy (widget); - -#undef ITERATIONS -} - -typedef struct -{ - GdkRectangle rect; - const char *expr; - int expected_x; - int expected_y; - MetaThemeError expected_error; -} PositionExpressionTest; - -#define NO_ERROR -1 - -static const PositionExpressionTest position_expression_tests[] = { - /* Just numbers */ - { { 10, 20, 40, 50 }, - "10", 20, 30, NO_ERROR }, - { { 10, 20, 40, 50 }, - "14.37", 24, 34, NO_ERROR }, - /* Binary expressions with 2 ints */ - { { 10, 20, 40, 50 }, - "14 * 10", 150, 160, NO_ERROR }, - { { 10, 20, 40, 50 }, - "14 + 10", 34, 44, NO_ERROR }, - { { 10, 20, 40, 50 }, - "14 - 10", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "8 / 2", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "8 % 3", 12, 22, NO_ERROR }, - /* Binary expressions with floats and mixed float/ints */ - { { 10, 20, 40, 50 }, - "7.0 / 3.5", 12, 22, NO_ERROR }, - { { 10, 20, 40, 50 }, - "12.1 / 3", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "12 / 2.95", 14, 24, NO_ERROR }, - /* Binary expressions without whitespace after first number */ - { { 10, 20, 40, 50 }, - "14* 10", 150, 160, NO_ERROR }, - { { 10, 20, 40, 50 }, - "14+ 10", 34, 44, NO_ERROR }, - { { 10, 20, 40, 50 }, - "14- 10", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "8/ 2", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "7.0/ 3.5", 12, 22, NO_ERROR }, - { { 10, 20, 40, 50 }, - "12.1/ 3", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "12/ 2.95", 14, 24, NO_ERROR }, - /* Binary expressions without whitespace before second number */ - { { 10, 20, 40, 50 }, - "14 *10", 150, 160, NO_ERROR }, - { { 10, 20, 40, 50 }, - "14 +10", 34, 44, NO_ERROR }, - { { 10, 20, 40, 50 }, - "14 -10", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "8 /2", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "7.0 /3.5", 12, 22, NO_ERROR }, - { { 10, 20, 40, 50 }, - "12.1 /3", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "12 /2.95", 14, 24, NO_ERROR }, - /* Binary expressions without any whitespace */ - { { 10, 20, 40, 50 }, - "14*10", 150, 160, NO_ERROR }, - { { 10, 20, 40, 50 }, - "14+10", 34, 44, NO_ERROR }, - { { 10, 20, 40, 50 }, - "14-10", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "8/2", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "7.0/3.5", 12, 22, NO_ERROR }, - { { 10, 20, 40, 50 }, - "12.1/3", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "12/2.95", 14, 24, NO_ERROR }, - /* Binary expressions with parentheses */ - { { 10, 20, 40, 50 }, - "(14) * (10)", 150, 160, NO_ERROR }, - { { 10, 20, 40, 50 }, - "(14) + (10)", 34, 44, NO_ERROR }, - { { 10, 20, 40, 50 }, - "(14) - (10)", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "(8) / (2)", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "(7.0) / (3.5)", 12, 22, NO_ERROR }, - { { 10, 20, 40, 50 }, - "(12.1) / (3)", 14, 24, NO_ERROR }, - { { 10, 20, 40, 50 }, - "(12) / (2.95)", 14, 24, NO_ERROR }, - /* Lots of extra parentheses */ - { { 10, 20, 40, 50 }, - "(((14)) * ((10)))", 150, 160, NO_ERROR }, - { { 10, 20, 40, 50 }, - "((((14)))) + ((((((((10))))))))", 34, 44, NO_ERROR }, - { { 10, 20, 40, 50 }, - "((((((((((14 - 10))))))))))", 14, 24, NO_ERROR }, - /* Binary expressions with variables */ - { { 10, 20, 40, 50 }, - "2 * width", 90, 100, NO_ERROR }, - { { 10, 20, 40, 50 }, - "2 * height", 110, 120, NO_ERROR }, - { { 10, 20, 40, 50 }, - "width - 10", 40, 50, NO_ERROR }, - { { 10, 20, 40, 50 }, - "height / 2", 35, 45, NO_ERROR }, - /* More than two operands */ - { { 10, 20, 40, 50 }, - "8 / 2 + 5", 19, 29, NO_ERROR }, - { { 10, 20, 40, 50 }, - "8 * 2 + 5", 31, 41, NO_ERROR }, - { { 10, 20, 40, 50 }, - "8 + 2 * 5", 28, 38, NO_ERROR }, - { { 10, 20, 40, 50 }, - "8 + 8 / 2", 22, 32, NO_ERROR }, - { { 10, 20, 40, 50 }, - "14 / (2 + 5)", 12, 22, NO_ERROR }, - { { 10, 20, 40, 50 }, - "8 * (2 + 5)", 66, 76, NO_ERROR }, - { { 10, 20, 40, 50 }, - "(8 + 2) * 5", 60, 70, NO_ERROR }, - { { 10, 20, 40, 50 }, - "(8 + 8) / 2", 18, 28, NO_ERROR }, - /* Errors */ - { { 10, 20, 40, 50 }, - "2 * foo", 0, 0, META_THEME_ERROR_UNKNOWN_VARIABLE }, - { { 10, 20, 40, 50 }, - "2 *", 0, 0, META_THEME_ERROR_FAILED }, - { { 10, 20, 40, 50 }, - "- width", 0, 0, META_THEME_ERROR_FAILED }, - { { 10, 20, 40, 50 }, - "5 % 1.0", 0, 0, META_THEME_ERROR_MOD_ON_FLOAT }, - { { 10, 20, 40, 50 }, - "1.0 % 5", 0, 0, META_THEME_ERROR_MOD_ON_FLOAT }, - { { 10, 20, 40, 50 }, - "! * 2", 0, 0, META_THEME_ERROR_BAD_CHARACTER }, - { { 10, 20, 40, 50 }, - " ", 0, 0, META_THEME_ERROR_FAILED }, - { { 10, 20, 40, 50 }, - "() () (( ) ()) ((()))", 0, 0, META_THEME_ERROR_FAILED }, - { { 10, 20, 40, 50 }, - "(*) () ((/) ()) ((()))", 0, 0, META_THEME_ERROR_FAILED }, - { { 10, 20, 40, 50 }, - "2 * 5 /", 0, 0, META_THEME_ERROR_FAILED }, - { { 10, 20, 40, 50 }, - "+ 2 * 5", 0, 0, META_THEME_ERROR_FAILED }, - { { 10, 20, 40, 50 }, - "+ 2 * 5", 0, 0, META_THEME_ERROR_FAILED } -}; - -static void -run_position_expression_tests (void) -{ -#if 0 - int i; - MetaPositionExprEnv env; - - i = 0; - while (i < (int) G_N_ELEMENTS (position_expression_tests)) - { - GError *err; - gboolean retval; - const PositionExpressionTest *test; - PosToken *tokens; - int n_tokens; - int x, y; - - test = &position_expression_tests[i]; - - if (g_getenv ("META_PRINT_TESTS") != NULL) - g_print ("Test expression: \"%s\" expecting x = %d y = %d", - test->expr, test->expected_x, test->expected_y); - - err = NULL; - - env.rect = meta_rect (test->rect.x, test->rect.y, - test->rect.width, test->rect.height); - env.object_width = -1; - env.object_height = -1; - env.left_width = 0; - env.right_width = 0; - env.top_height = 0; - env.bottom_height = 0; - env.title_width = 5; - env.title_height = 5; - env.icon_width = 32; - env.icon_height = 32; - env.mini_icon_width = 16; - env.mini_icon_height = 16; - env.theme = NULL; - - if (err == NULL) - { - retval = meta_parse_position_expression (tokens, n_tokens, - &env, - &x, &y, - &err); - } - - if (retval && err) - g_error (_("position expression test returned TRUE but set error")); - if (!retval && err == NULL) - g_error (_("position expression test returned FALSE but didn't set error")); - if (((int) test->expected_error) != NO_ERROR) - { - if (err == NULL) - g_error (_("Error was expected but none given")); - if (err->code != (int) test->expected_error) - g_error (_("Error %d was expected but %d given"), - test->expected_error, err->code); - } - else - { - if (err) - g_error (_("Error not expected but one was returned: %s"), - err->message); - - if (x != test->expected_x) - g_error (_("x value was %d, %d was expected"), x, test->expected_x); - - if (y != test->expected_y) - g_error (_("y value was %d, %d was expected"), y, test->expected_y); - } - - if (err) - g_error_free (err); - - meta_pos_tokens_free (tokens, n_tokens); - ++i; - } -#endif -} - -#if 0 -static void -run_position_expression_timings (void) -{ - int i; - int iters; - clock_t start; - clock_t end; - MetaPositionExprEnv env; - -#define ITERATIONS 100000 - - start = clock (); - - iters = 0; - i = 0; - while (iters < ITERATIONS) - { - const PositionExpressionTest *test; - int x, y; - - test = &position_expression_tests[i]; - - env.x = test->rect.x; - env.y = test->rect.y; - env.width = test->rect.width; - env.height = test->rect.height; - env.object_width = -1; - env.object_height = -1; - env.left_width = 0; - env.right_width = 0; - env.top_height = 0; - env.bottom_height = 0; - env.title_width = 5; - env.title_height = 5; - env.icon_width = 32; - env.icon_height = 32; - env.mini_icon_width = 16; - env.mini_icon_height = 16; - env.theme = NULL; - - meta_parse_position_expression (test->expr, - &env, - &x, &y, NULL); - - ++iters; - ++i; - if (i == G_N_ELEMENTS (position_expression_tests)) - i = 0; - } - - end = clock (); - - g_print (_("%d coordinate expressions parsed in %g seconds (%g seconds average)\n"), - ITERATIONS, - ((double)end - (double)start) / CLOCKS_PER_SEC, - ((double)end - (double)start) / CLOCKS_PER_SEC / (double) ITERATIONS); - -} -#endif diff --git a/src/ui/theme.c b/src/ui/theme.c index c841a0c35..fb11f0d54 100644 --- a/src/ui/theme.c +++ b/src/ui/theme.c @@ -5071,8 +5071,7 @@ meta_theme_set_current (const char *name, meta_topic (META_DEBUG_THEMES, "Setting current theme to \"%s\"\n", name); - if (!force_reload && - meta_current_theme && + if (meta_current_theme && strcmp (name, meta_current_theme->name) == 0) return; diff --git a/src/ui/ui.c b/src/ui/ui.c index 265ecfcca..fc6fb4dc2 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -769,10 +769,9 @@ meta_ui_theme_get_frame_borders (MetaUI *ui, } void -meta_ui_set_current_theme (const char *name, - gboolean force_reload) +meta_ui_set_current_theme (const char *name) { - meta_theme_set_current (name, force_reload); + meta_theme_set_current (name); meta_invalidate_default_icons (); } diff --git a/src/ui/ui.h b/src/ui/ui.h index 2ea3ca12c..e397c43d0 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -154,8 +154,7 @@ gboolean meta_ui_window_should_not_cause_focus (Display *xdisplay, char* meta_text_property_to_utf8 (Display *xdisplay, const XTextProperty *prop); -void meta_ui_set_current_theme (const char *name, - gboolean force_reload); +void meta_ui_set_current_theme (const char *name); gboolean meta_ui_have_a_theme (void); /* Not a real key symbol but means "key above the tab key"; this is diff --git a/src/wm-tester/.cvsignore b/src/wm-tester/.cvsignore deleted file mode 100644 index 0bca29e86..000000000 --- a/src/wm-tester/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -Makefile -Makefile.in -focus-window -test-gravity -test-resizing -wm-tester -test-size-hints diff --git a/src/wm-tester/Makefile.am b/src/wm-tester/Makefile.am deleted file mode 100644 index 2bb29d96e..000000000 --- a/src/wm-tester/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ - -INCLUDES=@MUTTER_CFLAGS@ - -wm_tester_SOURCES= \ - main.c - -test_gravity_SOURCES= \ - test-gravity.c - -focus_window_SOURCES= \ - focus-window.c - -test_resizing_SOURCES= \ - test-resizing.c - -test_size_hints_SOURCES= \ - test-size-hints.c - -test_attached_SOURCES= \ - test-attached.c - -test_focus_SOURCES= \ - test-focus.c - -noinst_PROGRAMS=wm-tester test-gravity test-resizing focus-window test-size-hints test-attached test-focus - -wm_tester_LDADD= @MUTTER_LIBS@ -test_gravity_LDADD= @MUTTER_LIBS@ -test_resizing_LDADD= @MUTTER_LIBS@ -test_size_hints_LDADD= @MUTTER_LIBS@ -focus_window_LDADD= @MUTTER_LIBS@ -test_attached_LDADD= @MUTTER_LIBS@ -test_focus_LDADD= @MUTTER_LIBS@ diff --git a/src/wm-tester/focus-window.c b/src/wm-tester/focus-window.c deleted file mode 100644 index dc33bd25d..000000000 --- a/src/wm-tester/focus-window.c +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include -#include - -int main (int argc, char **argv) -{ - Display *d; - Window w; - const char *w_str; - char *end; - - if (argc != 2) - { - fprintf (stderr, "Usage: focus-window WINDOWID\n"); - exit (1); - } - - d = XOpenDisplay (NULL); - - w_str = argv[1]; - end = NULL; - - w = strtoul (w_str, &end, 16); - if (end == w_str) - { - fprintf (stderr, "Usage: focus-window WINDOWID\n"); - exit (1); - } - - printf ("Setting input focus to 0x%lx\n", w); - XSetInputFocus (d, w, RevertToPointerRoot, CurrentTime); - XFlush (d); - - return 0; -} - diff --git a/src/wm-tester/main.c b/src/wm-tester/main.c deleted file mode 100644 index d9b27b4d3..000000000 --- a/src/wm-tester/main.c +++ /dev/null @@ -1,245 +0,0 @@ -/* WM tester main() */ - -/* - * Copyright (C) 2001 Havoc Pennington - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#include - -#include -#include -#include -#include -#include - -static void set_up_the_evil (void); -static void set_up_icon_windows (void); - -static void -usage (void) -{ - g_print ("wm-tester [--evil] [--icon-windows]\n"); - exit (0); -} - -int -main (int argc, char **argv) -{ - int i; - gboolean do_evil; - gboolean do_icon_windows; - - gtk_init (&argc, &argv); - - do_evil = FALSE; - do_icon_windows = FALSE; - - i = 1; - while (i < argc) - { - const char *arg = argv[i]; - - if (strcmp (arg, "--help") == 0 || - strcmp (arg, "-h") == 0 || - strcmp (arg, "-?") == 0) - usage (); - else if (strcmp (arg, "--evil") == 0) - do_evil = TRUE; - else if (strcmp (arg, "--icon-windows") == 0) - do_icon_windows = TRUE; - else - usage (); - - ++i; - } - - /* Be sure some option was provided */ - if (! (do_evil || do_icon_windows)) - return 1; - - if (do_evil) - set_up_the_evil (); - - if (do_icon_windows) - set_up_icon_windows (); - - gtk_main (); - - return 0; -} - -static GSList *evil_windows = NULL; - -static gint -evil_timeout (gpointer data) -{ - int i; - int n_windows; - int len; - int create_count; - int destroy_count; - - len = g_slist_length (evil_windows); - - if (len > 35) - { - create_count = 2; - destroy_count = 5; - } - else - { - create_count = 5; - destroy_count = 5; - } - - /* Create some windows */ - n_windows = g_random_int_range (0, create_count); - - i = 0; - while (i < n_windows) - { - GtkWidget *w; - GtkWidget *c; - int t; - GtkWidget *parent; - - w = gtk_window_new (GTK_WINDOW_TOPLEVEL); - - gtk_window_move (GTK_WINDOW (w), - g_random_int_range (0, - gdk_screen_width ()), - g_random_int_range (0, - gdk_screen_height ())); - - parent = NULL; - - /* set transient for random window (may create all kinds of weird cycles) */ - if (len > 0) - { - t = g_random_int_range (- (len / 3), len); - if (t >= 0) - { - parent = g_slist_nth_data (evil_windows, t); - - if (parent != NULL) - gtk_window_set_transient_for (GTK_WINDOW (w), GTK_WINDOW (parent)); - } - } - - if (parent != NULL) - c = gtk_button_new_with_label ("Evil Transient!"); - else - c = gtk_button_new_with_label ("Evil Window!"); - gtk_container_add (GTK_CONTAINER (w), c); - - gtk_widget_show_all (w); - - evil_windows = g_slist_prepend (evil_windows, w); - - ++i; - } - - /* Destroy some windows */ - if (len > destroy_count) - { - n_windows = g_random_int_range (0, destroy_count); - i = 0; - while (i < n_windows) - { - GtkWidget *w; - - w = g_slist_nth_data (evil_windows, - g_random_int_range (0, len)); - if (w) - { - --len; - evil_windows = g_slist_remove (evil_windows, w); - gtk_widget_destroy (w); - } - - ++i; - } - } - - return TRUE; -} - -static void -set_up_the_evil (void) -{ - g_timeout_add (400, evil_timeout, NULL); -} - -static void -set_up_icon_windows (void) -{ - int i; - int n_windows; - - /* Create some windows */ - n_windows = 9; - - i = 0; - while (i < n_windows) - { - GtkWidget *w; - GtkWidget *c; - GList *icons; - GdkPixbuf *pix; - - w = gtk_window_new (GTK_WINDOW_TOPLEVEL); - c = gtk_button_new_with_label ("Icon window"); - gtk_container_add (GTK_CONTAINER (w), c); - - icons = NULL; - - pix = gtk_widget_render_icon (w, - GTK_STOCK_SAVE, - GTK_ICON_SIZE_LARGE_TOOLBAR, - NULL); - - icons = g_list_append (icons, pix); - - if (i % 2) - { - pix = gtk_widget_render_icon (w, - GTK_STOCK_SAVE, - GTK_ICON_SIZE_DIALOG, - NULL); - icons = g_list_append (icons, pix); - } - - if (i % 3) - { - pix = gtk_widget_render_icon (w, - GTK_STOCK_SAVE, - GTK_ICON_SIZE_MENU, - NULL); - icons = g_list_append (icons, pix); - } - - gtk_window_set_icon_list (GTK_WINDOW (w), icons); - - g_list_foreach (icons, (GFunc) g_object_unref, NULL); - g_list_free (icons); - - gtk_widget_show_all (w); - - ++i; - } -} diff --git a/src/wm-tester/test-attached.c b/src/wm-tester/test-attached.c deleted file mode 100644 index c27036b55..000000000 --- a/src/wm-tester/test-attached.c +++ /dev/null @@ -1,100 +0,0 @@ -#include - -enum { - DESTROY_PARENT, - DETACH, - ATTACH_1, - ATTACH_2 -}; - -GtkWidget *window1, *window2; - -static void -dialog_response (GtkDialog *dialog, int response, gpointer user_data) -{ - if (response == DESTROY_PARENT) - { - GtkWidget *window = GTK_WIDGET (gtk_window_get_transient_for (GTK_WINDOW (dialog))); - - if (window == window1) - { - gtk_dialog_set_response_sensitive (dialog, ATTACH_1, FALSE); - window1 = NULL; - } - else - { - gtk_dialog_set_response_sensitive (dialog, ATTACH_2, FALSE); - window2 = NULL; - } - - gtk_dialog_set_response_sensitive (dialog, DESTROY_PARENT, FALSE); - gtk_dialog_set_response_sensitive (dialog, DETACH, FALSE); - gtk_widget_destroy (window); - } - else if (response == DETACH) - { - gtk_window_set_transient_for (GTK_WINDOW (dialog), NULL); - gtk_dialog_set_response_sensitive (dialog, DESTROY_PARENT, FALSE); - gtk_dialog_set_response_sensitive (dialog, DETACH, FALSE); - gtk_dialog_set_response_sensitive (dialog, ATTACH_1, window1 != NULL); - gtk_dialog_set_response_sensitive (dialog, ATTACH_2, window2 != NULL); - } - else if (response == ATTACH_1) - { - gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window1)); - gtk_dialog_set_response_sensitive (dialog, DESTROY_PARENT, TRUE); - gtk_dialog_set_response_sensitive (dialog, DETACH, TRUE); - gtk_dialog_set_response_sensitive (dialog, ATTACH_1, FALSE); - gtk_dialog_set_response_sensitive (dialog, ATTACH_2, window2 != NULL); - } - else if (response == ATTACH_2) - { - gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window2)); - gtk_dialog_set_response_sensitive (dialog, DESTROY_PARENT, TRUE); - gtk_dialog_set_response_sensitive (dialog, DETACH, TRUE); - gtk_dialog_set_response_sensitive (dialog, ATTACH_1, window1 != NULL); - gtk_dialog_set_response_sensitive (dialog, ATTACH_2, FALSE); - } - else if (response == GTK_RESPONSE_CLOSE) - gtk_main_quit (); -} - -int -main (int argc, char **argv) -{ - GtkWidget *dialog; - - gtk_init (&argc, &argv); - - window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window1), "Parent 1"); - gtk_widget_show (window1); - - window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window2), "Parent 2"); - gtk_widget_show (window2); - - dialog = gtk_dialog_new_with_buttons ("Child", - NULL, - GTK_DIALOG_MODAL, - "Destroy Parent", - DESTROY_PARENT, - "Detach", - DETACH, - "Attach to 1", - ATTACH_1, - "Attach to 2", - ATTACH_2, - GTK_STOCK_QUIT, - GTK_RESPONSE_CLOSE, - NULL); - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), DESTROY_PARENT, FALSE); - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), DETACH, FALSE); - - g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), NULL); - gtk_widget_show (dialog); - - gtk_main (); - - return 0; -} diff --git a/src/wm-tester/test-focus.c b/src/wm-tester/test-focus.c deleted file mode 100644 index 2ff59c5a5..000000000 --- a/src/wm-tester/test-focus.c +++ /dev/null @@ -1,362 +0,0 @@ -#include -#include -#include - -GtkWidget *main_window; -GtkWidget *noinput_window, *passive_window, *local_window; -GtkWidget *global_window, *lame_window, *grabby_window, *dying_window; - -static void -clear_on_destroy (GtkWidget *widget, gpointer user_data) -{ - GtkWidget **widget_pointer = user_data; - - *widget_pointer = NULL; -} - -static void -disable_take_focus (GtkWidget *window) -{ - GdkDisplay *display; - GdkWindow *gdkwindow; - Atom *protocols, wm_take_focus; - int n_protocols, i; - - gtk_widget_realize (window); - gdkwindow = gtk_widget_get_window (window); - display = gdk_window_get_display (gdkwindow); - - wm_take_focus = gdk_x11_get_xatom_by_name_for_display (display, "WM_TAKE_FOCUS"); - XGetWMProtocols (GDK_DISPLAY_XDISPLAY (display), - GDK_WINDOW_XID (gdkwindow), - &protocols, &n_protocols); - for (i = 0; i < n_protocols; i++) - { - if (protocols[i] == wm_take_focus) - { - protocols[i] = protocols[n_protocols - 1]; - n_protocols--; - break; - } - } - XSetWMProtocols (GDK_DISPLAY_XDISPLAY (display), - GDK_WINDOW_XID (gdkwindow), - protocols, n_protocols); - XFree (protocols); -} - -static void -clear_input_hint (GtkWidget *window) -{ - /* This needs to be called after gtk_widget_show, otherwise - * GTK+ will overwrite it. */ - GdkWindow *gdkwindow = gtk_widget_get_window (window); - XWMHints *wm_hints; - - wm_hints = XGetWMHints (GDK_DISPLAY_XDISPLAY (gdk_window_get_display (gdkwindow)), - GDK_WINDOW_XID (gdkwindow)); - - wm_hints->flags |= InputHint; - wm_hints->input = False; - - XSetWMHints (GDK_DISPLAY_XDISPLAY (gdk_window_get_display (gdkwindow)), - GDK_WINDOW_XID (gdkwindow), - wm_hints); - - XFree (wm_hints); -} - -static void -active_notify (GObject *obj, - GParamSpec *pspec, - gpointer user_data) -{ - GtkLabel *label = user_data; - - if (gtk_window_is_active (GTK_WINDOW (obj))) - gtk_label_set_text (label, "Focused"); - else - gtk_label_set_text (label, "Not focused"); -} - -static void -make_focused_label (GtkWidget *toplevel, - GtkWidget *parent) -{ - GtkWidget *label; - - label = gtk_label_new (""); - gtk_widget_show (label); - - gtk_container_add (GTK_CONTAINER (parent), label); - - g_signal_connect (toplevel, "notify::is-active", - G_CALLBACK (active_notify), label); - active_notify (G_OBJECT (toplevel), NULL, label); -} - -static void -setup_test_dialog (GtkWidget *toplevel) -{ - make_focused_label (toplevel, toplevel); - gtk_widget_set_size_request (toplevel, 200, 200); -} - -static void -noinput_clicked (GtkButton *button, gpointer user_data) -{ - if (noinput_window) - gtk_window_present_with_time (GTK_WINDOW (noinput_window), gtk_get_current_event_time ()); - else - { - noinput_window = g_object_new (GTK_TYPE_WINDOW, - "type", GTK_WINDOW_TOPLEVEL, - "title", "No Input", - "accept-focus", FALSE, - NULL); - setup_test_dialog (noinput_window); - g_signal_connect (noinput_window, "destroy", - G_CALLBACK (clear_on_destroy), &noinput_window); - disable_take_focus (noinput_window); - gtk_widget_show (noinput_window); - } -} - -static void -passive_clicked (GtkButton *button, gpointer user_data) -{ - if (passive_window) - gtk_window_present_with_time (GTK_WINDOW (passive_window), gtk_get_current_event_time ()); - else - { - passive_window = g_object_new (GTK_TYPE_WINDOW, - "type", GTK_WINDOW_TOPLEVEL, - "title", "Passive Input", - "accept-focus", TRUE, - NULL); - setup_test_dialog (passive_window); - g_signal_connect (passive_window, "destroy", - G_CALLBACK (clear_on_destroy), &passive_window); - disable_take_focus (passive_window); - gtk_widget_show (passive_window); - } -} - -static void -local_clicked (GtkButton *button, gpointer user_data) -{ - if (local_window) - gtk_window_present_with_time (GTK_WINDOW (local_window), gtk_get_current_event_time ()); - else - { - local_window = g_object_new (GTK_TYPE_WINDOW, - "type", GTK_WINDOW_TOPLEVEL, - "title", "Locally Active Input", - "accept-focus", TRUE, - NULL); - setup_test_dialog (local_window); - g_signal_connect (local_window, "destroy", - G_CALLBACK (clear_on_destroy), &local_window); - gtk_widget_show (local_window); - } -} - -static void -global_clicked (GtkButton *button, gpointer user_data) -{ - if (global_window) - gtk_window_present_with_time (GTK_WINDOW (global_window), gtk_get_current_event_time ()); - else - { - /* gtk will only process WM_TAKE_FOCUS messages if accept-focus - * is TRUE. So we set that property and then manually clear the - * Input WMHint. - */ - global_window = g_object_new (GTK_TYPE_WINDOW, - "type", GTK_WINDOW_TOPLEVEL, - "title", "Globally Active Input", - "accept-focus", TRUE, - NULL); - setup_test_dialog (global_window); - g_signal_connect (global_window, "destroy", - G_CALLBACK (clear_on_destroy), &global_window); - gtk_widget_show (global_window); - clear_input_hint (global_window); - } -} - -static void -lame_clicked (GtkButton *button, gpointer user_data) -{ - if (lame_window) - gtk_window_present_with_time (GTK_WINDOW (lame_window), gtk_get_current_event_time ()); - else - { - lame_window = g_object_new (GTK_TYPE_WINDOW, - "type", GTK_WINDOW_TOPLEVEL, - "title", "Lame Globally Active Input", - "accept-focus", FALSE, - NULL); - setup_test_dialog (lame_window); - g_signal_connect (lame_window, "destroy", - G_CALLBACK (clear_on_destroy), &lame_window); - gtk_widget_show (lame_window); - } -} - -static void -grabby_active_changed (GObject *object, GParamSpec *param, gpointer user_data) -{ - if (gtk_window_is_active (GTK_WINDOW (grabby_window))) - { - GdkWindow *gdkwindow = gtk_widget_get_window (grabby_window); - guint32 now = gdk_x11_get_server_time (gdkwindow); - - gtk_window_present_with_time (GTK_WINDOW (main_window), now - 1); - XSetInputFocus (GDK_DISPLAY_XDISPLAY (gdk_window_get_display (gdkwindow)), - GDK_WINDOW_XID (gdkwindow), - RevertToParent, - now); - } -} - -static void -grabby_clicked (GtkButton *button, gpointer user_data) -{ - if (grabby_window) - gtk_window_present_with_time (GTK_WINDOW (grabby_window), gtk_get_current_event_time ()); - else - { - grabby_window = g_object_new (GTK_TYPE_WINDOW, - "type", GTK_WINDOW_TOPLEVEL, - "title", "Focus-grabbing Window", - "accept-focus", TRUE, - /* Because mutter maps windows - * asynchronously, our trick won't - * work if we try to do it when the - * window is first mapped. - */ - "focus-on-map", FALSE, - NULL); - setup_test_dialog (grabby_window); - g_signal_connect (grabby_window, "destroy", - G_CALLBACK (clear_on_destroy), &grabby_window); - g_signal_connect (grabby_window, "notify::is-active", - G_CALLBACK (grabby_active_changed), NULL); - gtk_widget_show (grabby_window); - } -} - -static void -dying_clicked (GtkButton *button, gpointer user_data) -{ - if (dying_window) - { - gtk_window_present_with_time (GTK_WINDOW (dying_window), gtk_get_current_event_time ()); - gtk_widget_destroy (dying_window); - } - else - { - GtkWidget *label; - - dying_window = g_object_new (GTK_TYPE_WINDOW, - "type", GTK_WINDOW_TOPLEVEL, - "title", "Dying Window", - "accept-focus", TRUE, - /* As with grabby window */ - "focus-on-map", FALSE, - NULL); - setup_test_dialog (dying_window); - g_signal_connect (dying_window, "destroy", - G_CALLBACK (clear_on_destroy), &dying_window); - - label = gtk_label_new ("Click button again to test"); - gtk_container_add (GTK_CONTAINER (dying_window), label); - gtk_widget_set_size_request (dying_window, 200, 200); - - gtk_widget_show_all (dying_window); - } -} - -static void -main_window_destroyed (GtkWidget *widget, gpointer user_data) -{ - gtk_main_quit (); -} - -int -main (int argc, char **argv) -{ - GtkWidget *vbox, *button; - - gtk_init (&argc, &argv); - - main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (main_window), "Focus Tester"); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8); - gtk_box_set_homogeneous (GTK_BOX (vbox), 8); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_container_add (GTK_CONTAINER (main_window), vbox); - - make_focused_label (main_window, vbox); - - /* ICCCM "No Input" mode; Input hint False, WM_TAKE_FOCUS absent */ - button = gtk_button_new_with_label ("No Input Window"); - g_signal_connect (button, "clicked", G_CALLBACK (noinput_clicked), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - /* ICCCM "Passive" mode; Input hint True, WM_TAKE_FOCUS absent */ - button = gtk_button_new_with_label ("Passive Input Window"); - g_signal_connect (button, "clicked", G_CALLBACK (passive_clicked), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - /* ICCCM "Locally Active" mode; Input hint True, WM_TAKE_FOCUS present. - * This is the behavior of GtkWindows with accept_focus==TRUE. - */ - button = gtk_button_new_with_label ("Locally Active Window"); - g_signal_connect (button, "clicked", G_CALLBACK (local_clicked), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - /* ICCCM "Globally Active" mode; Input hint False, WM_TAKE_FOCUS present, - * and the window responds to WM_TAKE_FOCUS by calling XSetInputFocus. - */ - button = gtk_button_new_with_label ("Globally Active Window"); - g_signal_connect (button, "clicked", G_CALLBACK (global_clicked), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - /* "Lame" Globally Active mode; like "Globally Active", except that - * the window does not respond to WM_TAKE_FOCUS. This is the - * behavior of GtkWindows with accept_focus==FALSE. - */ - button = gtk_button_new_with_label ("Globally Lame Window"); - g_signal_connect (button, "clicked", G_CALLBACK (lame_clicked), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - /* "Grabby" window; when you activate the window, it asks the wm to - * focus the main window, but then forcibly grabs focus back with - * a newer timestamp, causing the wm to be temporarily confused - * about what window is focused and triggering the "Earlier attempt - * to focus ... failed" codepath. - */ - button = gtk_button_new_with_label ("Grabby Window"); - g_signal_connect (button, "clicked", G_CALLBACK (grabby_clicked), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - /* "Dying" window; we create the window on the first click, then - * activate it and destroy it on the second click, causing mutter to - * do an XSetInputFocus but not receive the corresponding FocusIn. - */ - button = gtk_button_new_with_label ("Dying Window"); - g_signal_connect (button, "clicked", G_CALLBACK (dying_clicked), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - gtk_widget_show_all (main_window); - - g_signal_connect (main_window, "destroy", - G_CALLBACK (main_window_destroyed), NULL); - - gtk_main (); - - return 0; -} diff --git a/src/wm-tester/test-gravity.c b/src/wm-tester/test-gravity.c deleted file mode 100644 index 8e5b581c7..000000000 --- a/src/wm-tester/test-gravity.c +++ /dev/null @@ -1,308 +0,0 @@ -#include -#include -#include -#include - -static int gravities[10] = { - NorthWestGravity, - NorthGravity, - NorthEastGravity, - WestGravity, - CenterGravity, - EastGravity, - SouthWestGravity, - SouthGravity, - SouthEastGravity, - StaticGravity -}; - -typedef struct -{ - int x, y, width, height; -} Rectangle; - -static Window windows[10]; -static int doubled[10] = { 0, }; -static Rectangle window_rects[10]; - -#define WINDOW_WIDTH 100 -#define WINDOW_HEIGHT 100 - -static int x_offset[3] = { 0, - WINDOW_WIDTH/2, -WINDOW_WIDTH }; -static int y_offset[3] = { 0, - WINDOW_HEIGHT/2, -WINDOW_HEIGHT }; -static double screen_x_fraction[3] = { 0, 0.5, 1.0 }; -static double screen_y_fraction[3] = { 0, 0.5, 1.0 }; -static int screen_width; -static int screen_height; - -static const char* -window_gravity_to_string (int gravity) -{ - switch (gravity) - { - case NorthWestGravity: - return "NorthWestGravity"; - case NorthGravity: - return "NorthGravity"; - case NorthEastGravity: - return "NorthEastGravity"; - case WestGravity: - return "WestGravity"; - case CenterGravity: - return "CenterGravity"; - case EastGravity: - return "EastGravity"; - case SouthWestGravity: - return "SouthWestGravity"; - case SouthGravity: - return "SouthGravity"; - case SouthEastGravity: - return "SouthEastGravity"; - case StaticGravity: - return "StaticGravity"; - default: - return "NorthWestGravity"; - } -} - -static void -calculate_position (int i, int doubled, int *x, int *y) -{ - if (i == 9) - { - *x = 150; - *y = 150; - } - else - { - int xoff = x_offset[i % 3]; - int yoff = y_offset[i / 3]; - if (doubled) - { - xoff *= 2; - yoff *= 2; - } - - *x = screen_x_fraction[i % 3] * screen_width + xoff; - *y = screen_y_fraction[i / 3] * screen_height + yoff; - } -} - -static int -find_window (Window window) -{ - int i; - for (i=0; i<10; i++) - { - if (windows[i] == window) - return i; - } - - return -1; -} - -typedef struct { - unsigned long flags; - unsigned long functions; - unsigned long decorations; - long input_mode; - unsigned long status; -} MotifWmHints, MwmHints; - -#define MWM_HINTS_FUNCTIONS (1L << 0) -#define MWM_HINTS_DECORATIONS (1L << 1) -#define MWM_HINTS_INPUT_MODE (1L << 2) -#define MWM_HINTS_STATUS (1L << 3) - -int main (int argc, char **argv) -{ - Display *d; - Window w; - XSizeHints hints; - int i; - int screen; - XEvent ev; - int noframes; - - if (argc > 1 && strcmp (argv[1], "--noframes") == 0) - noframes = 1; - else - noframes = 0; - - d = XOpenDisplay (NULL); - - screen = DefaultScreen (d); - screen_width = DisplayWidth (d, screen); - screen_height = DisplayHeight (d, screen); - - for (i=0; i<10; i++) - { - int x, y; - - calculate_position (i, doubled[i], &x, &y); - - w = XCreateSimpleWindow (d, RootWindow (d, screen), - x, y, WINDOW_WIDTH, WINDOW_HEIGHT, 0, - WhitePixel (d, screen), WhitePixel (d, screen)); - - windows[i] = w; - window_rects[i].x = x; - window_rects[i].y = y; - window_rects[i].width = WINDOW_WIDTH; - window_rects[i].height = WINDOW_HEIGHT; - - XSelectInput (d, w, ButtonPressMask | ExposureMask | StructureNotifyMask); - - hints.flags = USPosition | PMinSize | PMaxSize | PWinGravity; - - hints.min_width = WINDOW_WIDTH / 2; - hints.min_height = WINDOW_HEIGHT / 2; - -#if 1 - /* we constrain max size below the "doubled" size so that - * the WM will have to deal with constraints - * at the same time it's dealing with configure request - */ - hints.max_width = WINDOW_WIDTH * 2 - WINDOW_WIDTH / 2; - hints.max_height = WINDOW_HEIGHT * 2 - WINDOW_HEIGHT / 2; -#else - hints.max_width = WINDOW_WIDTH * 2 + WINDOW_WIDTH / 2; - hints.max_height = WINDOW_HEIGHT * 2 + WINDOW_HEIGHT / 2; -#endif - hints.win_gravity = gravities[i]; - - XSetWMNormalHints (d, w, &hints); - - XStoreName (d, w, window_gravity_to_string (hints.win_gravity)); - - if (noframes) - { - MotifWmHints mwm; - Atom mwm_atom; - - mwm.decorations = 0; - mwm.flags = MWM_HINTS_DECORATIONS; - - mwm_atom = XInternAtom (d, "_MOTIF_WM_HINTS", False); - - XChangeProperty (d, w, mwm_atom, mwm_atom, - 32, PropModeReplace, - (unsigned char *)&mwm, - sizeof (MotifWmHints)/sizeof (long)); - } - - XMapWindow (d, w); - } - - while (1) - { - XNextEvent (d, &ev); - - if (ev.xany.type == ConfigureNotify) - { - i = find_window (ev.xconfigure.window); - - if (i >= 0) - { - Window ignored; - - window_rects[i].width = ev.xconfigure.width; - window_rects[i].height = ev.xconfigure.height; - - XClearArea (d, windows[i], 0, 0, - ev.xconfigure.width, - ev.xconfigure.height, - True); - - if (!ev.xconfigure.send_event) - XTranslateCoordinates (d, windows[i], DefaultRootWindow (d), - 0, 0, - &window_rects[i].x, &window_rects[i].y, - &ignored); - else - { - window_rects[i].x = ev.xconfigure.x; - window_rects[i].y = ev.xconfigure.y; - } - } - } - else if (ev.xany.type == Expose) - { - i = find_window (ev.xexpose.window); - - if (i >= 0) - { - GC gc; - XGCValues values; - char buf[256]; - - values.foreground = BlackPixel (d, screen); - - gc = XCreateGC (d, windows[i], - GCForeground, &values); - - sprintf (buf, - "%d,%d", - window_rects[i].x, - window_rects[i].y); - - XDrawString (d, windows[i], gc, 10, 15, - buf, strlen (buf)); - - sprintf (buf, - "%dx%d", - window_rects[i].width, - window_rects[i].height); - - XDrawString (d, windows[i], gc, 10, 35, - buf, strlen (buf)); - - XFreeGC (d, gc); - } - } - else if (ev.xany.type == ButtonPress) - { - i = find_window (ev.xbutton.window); - - if (i >= 0) - { - /* Button 1 = move, 2 = resize, 3 = both at once */ - - if (ev.xbutton.button == Button1) - { - int x, y; - - calculate_position (i, doubled[i], &x, &y); - XMoveWindow (d, windows[i], x, y); - } - else if (ev.xbutton.button == Button2) - { - if (doubled[i]) - XResizeWindow (d, windows[i], WINDOW_WIDTH, WINDOW_HEIGHT); - else - XResizeWindow (d, windows[i], WINDOW_WIDTH*2, WINDOW_HEIGHT*2); - - doubled[i] = !doubled[i]; - } - else if (ev.xbutton.button == Button3) - { - int x, y; - - calculate_position (i, !doubled[i], &x, &y); - - if (doubled[i]) - XMoveResizeWindow (d, windows[i], x, y, WINDOW_WIDTH, WINDOW_HEIGHT); - else - XMoveResizeWindow (d, windows[i], x, y, WINDOW_WIDTH*2, WINDOW_HEIGHT*2); - - doubled[i] = !doubled[i]; - } - } - } - } - - /* This program has an infinite loop above so a return statement would - * just cause compiler warnings. - */ -} - diff --git a/src/wm-tester/test-resizing.c b/src/wm-tester/test-resizing.c deleted file mode 100644 index 616786fea..000000000 --- a/src/wm-tester/test-resizing.c +++ /dev/null @@ -1,257 +0,0 @@ -#include -#include -#include -#include - -static void -calc_rects (XRectangle *rects, int width, int height) -{ - int w = (width - 21) / 3; - int h = (height - 21) / 3; - int i; - - i = 0; - while (i < 9) - { - rects[i].width = w; - rects[i].height = h; - ++i; - } - - /* NW */ - rects[0].x = 0; - rects[0].y = 0; - - /* N */ - rects[1].x = width / 2 - w / 2; - rects[1].y = 0; - - /* NE */ - rects[2].x = width - w; - rects[2].y = 0; - - /* E */ - rects[3].x = width - w; - rects[3].y = height / 2 - h / 2; - - /* SE */ - rects[4].x = width - w; - rects[4].y = height - h; - - /* S */ - rects[5].x = width / 2 - w / 2; - rects[5].y = height - h; - - /* SW */ - rects[6].x = 0; - rects[6].y = height - h; - - /* W */ - rects[7].x = 0; - rects[7].y = height / 2 - h / 2; - - /* Center */ - rects[8].x = width / 2 - w / 2; - rects[8].y = height / 2 - h / 2; -} - -static Bool -all_events (Display *display, - XEvent *event, - XPointer arg) -{ - return True; -} - -static void -get_size (Display *d, Drawable draw, - int *xp, int *yp, int *widthp, int *heightp) -{ - int x, y; - unsigned int width=0, height=0, border=0, depth=0; - Window root; - - XGetGeometry (d, draw, &root, &x, &y, &width, &height, &border, &depth); - - if (xp) - *xp = x; - if (yp) - *yp = y; - if (widthp) - *widthp = width; - if (heightp) - *heightp = height; -} - -int -main (int argc, char **argv) -{ - Display *d; - Window w, cw; - XSizeHints hints; - int screen; - XEvent ev; - int x, y, width, height; - Pixmap pix; - GC gc; - XGCValues gc_vals; - XSetWindowAttributes set_attrs; - XWindowChanges changes; - XRectangle rects[9]; - gboolean redraw_pending; - unsigned int mask; - - d = XOpenDisplay (NULL); - - screen = DefaultScreen (d); - - /* Print some debug spew to show how StaticGravity works */ - w = XCreateSimpleWindow (d, RootWindow (d, screen), - 0, 0, 100, 100, 0, - WhitePixel (d, screen), - WhitePixel (d, screen)); - cw = XCreateSimpleWindow (d, w, - 0, 0, 100, 100, 0, - WhitePixel (d, screen), - WhitePixel (d, screen)); - set_attrs.win_gravity = StaticGravity; - - XChangeWindowAttributes (d, cw, - CWWinGravity, - &set_attrs); - - get_size (d, w, &x, &y, &width, &height); - - g_print ("Parent is %d,%d %d x %d before configuring parent\n", - x, y, width, height); - - get_size (d, cw, &x, &y, &width, &height); - - g_print ("Child is %d,%d %d x %d before configuring parent\n", - x, y, width, height); - - changes.x = 10; - changes.y = 10; - changes.width = 110; - changes.height = 110; - /* last mask wins */ - mask = CWX | CWY; - mask = CWWidth | CWHeight; - mask = CWX | CWY | CWWidth | CWHeight; - - XConfigureWindow (d, w, mask, &changes); - XSync (d, False); - - get_size (d, w, &x, &y, &width, &height); - - g_print ("Parent is %d,%d %d x %d after configuring parent\n", - x, y, width, height); - - get_size (d, cw, &x, &y, &width, &height); - - g_print ("Child is %d,%d %d x %d after configuring parent\n", - x, y, width, height); - - XDestroyWindow (d, w); - - /* The window that gets displayed */ - - x = 20; - y = 20; - width = 100; - height = 100; - - calc_rects (rects, width, height); - - w = XCreateSimpleWindow (d, RootWindow (d, screen), - x, y, width, height, 0, - WhitePixel (d, screen), - WhitePixel (d, screen)); - - set_attrs.bit_gravity = StaticGravity; - - XChangeWindowAttributes (d, w, - CWBitGravity, - &set_attrs); - - XSelectInput (d, w, - ButtonPressMask | ExposureMask | StructureNotifyMask); - - hints.flags = PMinSize; - - hints.min_width = 100; - hints.min_height = 100; - - XSetWMNormalHints (d, w, &hints); - XMapWindow (d, w); - - redraw_pending = FALSE; - while (1) - { - XNextEvent (d, &ev); - - switch (ev.xany.type) - { - case ButtonPress: - if (ev.xbutton.button == 3) - { - g_print ("Exiting on button 3 press\n"); - exit (0); - } - break; - - case ConfigureNotify: - x = ev.xconfigure.x; - y = ev.xconfigure.y; - width = ev.xconfigure.width; - height = ev.xconfigure.height; - - redraw_pending = TRUE; - break; - - case Expose: - redraw_pending = TRUE; - break; - - default: - break; - } - - /* Primitive event compression */ - if (XCheckIfEvent (d, &ev, all_events, NULL)) - { - XPutBackEvent (d, &ev); - } - else if (redraw_pending) - { - calc_rects (rects, width, height); - - pix = XCreatePixmap (d, w, width, height, - DefaultDepth (d, screen)); - - gc_vals.foreground = WhitePixel (d, screen); - - gc = XCreateGC (d, pix, GCForeground, &gc_vals); - - XFillRectangle (d, pix, gc, 0, 0, width, height); - - /* Draw rectangles at each gravity point */ - gc_vals.foreground = BlackPixel (d, screen); - XChangeGC (d, gc, GCForeground, &gc_vals); - - XFillRectangles (d, pix, gc, rects, G_N_ELEMENTS (rects)); - - XCopyArea (d, pix, w, gc, 0, 0, width, height, 0, 0); - - XFreePixmap (d, pix); - XFreeGC (d, gc); - - redraw_pending = FALSE; - } - } - - /* This program has an infinite loop above so a return statement would - * just cause compiler warnings. - */ -} - diff --git a/src/wm-tester/test-size-hints.c b/src/wm-tester/test-size-hints.c deleted file mode 100644 index 72f1b4868..000000000 --- a/src/wm-tester/test-size-hints.c +++ /dev/null @@ -1,136 +0,0 @@ -#include -#include -#include -#include - -static Bool -all_events (Display *display, - XEvent *event, - XPointer arg) -{ - return True; -} - -#if 0 -static void -get_size (Display *d, Drawable draw, - int *xp, int *yp, int *widthp, int *heightp) -{ - int x, y; - unsigned int width, height, border, depth; - Window root; - - XGetGeometry (d, draw, &root, &x, &y, &width, &height, &border, &depth); - - if (xp) - *xp = x; - if (yp) - *yp = y; - if (widthp) - *widthp = width; - if (*heightp) - *heightp = height; -} -#endif - -int -main (int argc, char **argv) -{ - Display *d; - Window zero_min_size; - XSizeHints hints; - int screen; - XEvent ev; - int x, y, width, height; - Pixmap pix; - GC gc; - XGCValues gc_vals; - gboolean redraw_pending; - - d = XOpenDisplay (NULL); - - screen = DefaultScreen (d); - - x = 0; - y = 0; - width = 100; - height = 100; - - zero_min_size = XCreateSimpleWindow (d, RootWindow (d, screen), - x, y, width, height, 0, - WhitePixel (d, screen), - WhitePixel (d, screen)); - - XSelectInput (d, zero_min_size, - ButtonPressMask | ExposureMask | StructureNotifyMask); - - hints.flags = PMinSize; - - hints.min_width = 0; - hints.min_height = 0; - - XSetWMNormalHints (d, zero_min_size, &hints); - XMapWindow (d, zero_min_size); - - redraw_pending = FALSE; - while (1) - { - XNextEvent (d, &ev); - - switch (ev.xany.type) - { - case ButtonPress: - if (ev.xbutton.button == 1) - { - g_print ("Exiting on button 1 press\n"); - exit (0); - } - break; - - case ConfigureNotify: - x = ev.xconfigure.x; - y = ev.xconfigure.y; - width = ev.xconfigure.width; - height = ev.xconfigure.height; - - redraw_pending = TRUE; - break; - - case Expose: - redraw_pending = TRUE; - break; - - default: - break; - } - - /* Primitive event compression */ - if (XCheckIfEvent (d, &ev, all_events, NULL)) - { - XPutBackEvent (d, &ev); - } - else if (redraw_pending) - { - pix = XCreatePixmap (d, zero_min_size, width, height, - DefaultDepth (d, screen)); - - gc_vals.foreground = WhitePixel (d, screen); - - gc = XCreateGC (d, pix, GCForeground, &gc_vals); - - XFillRectangle (d, pix, gc, 0, 0, width, height); - - XCopyArea (d, pix, zero_min_size, gc, 0, 0, width, height, 0, 0); - - XFreePixmap (d, pix); - XFreeGC (d, gc); - - redraw_pending = FALSE; - } - } - - /* This program has an infinite loop above so a return statement would - * just cause compiler warnings. - */ -} -