Commit 6981a819 authored by Havoc Pennington's avatar Havoc Pennington Committed by Havoc Pennington
Browse files

move SM init a bit later in the process, and init prefs

2001-12-09  Havoc Pennington  <hp@pobox.com>

	* src/main.c (main): move SM init a bit later in the process, and
	init prefs

	* src/session.c: fix no SM case (though I hardly know why I'm
	bothering)

	* src/main.c (main): call bindtextdomain

	* src/util.h (_): actually call gettext

	* configure.in: put in AM_GLIB_GNU_GETTEXT and gconf stuff

	* src/prefs.c: Preferences - this marks the beginning of our doom.
	None of them are actually implemented yet, but we monitor
	some stuff from gconf.
parent b3778e44
2001-12-09 Havoc Pennington <hp@pobox.com>
* src/main.c (main): move SM init a bit later in the process, and
init prefs
* src/session.c: fix no SM case (though I hardly know why I'm
bothering)
* src/main.c (main): call bindtextdomain
* src/util.h (_): actually call gettext
* configure.in: put in AM_GLIB_GNU_GETTEXT and gconf stuff
* src/prefs.c: Preferences - this marks the beginning of our doom.
None of them are actually implemented yet, but we monitor
some stuff from gconf.
2001-12-07 Havoc Pennington <hp@pobox.com>
* src/window.c (meta_window_unminimize): when unminimizing an app,
......
......@@ -38,11 +38,11 @@ fi
changequote([,])dnl
ALL_LINGUAS="es gl ru sv uk"
dnl AM_GNU_GETTEXT
AM_GLIB_GNU_GETTEXT
## here we get the flags we'll actually use
PKG_CHECK_MODULES(METACITY, gtk+-2.0 >= 1.3.10)
PKG_CHECK_MODULES(METACITY_RESTART, gtk+-2.0 >= 1.3.10)
PKG_CHECK_MODULES(METACITY, gtk+-2.0 >= 1.3.11 gconf-2.0 >= 1.1.5)
PKG_CHECK_MODULES(METACITY_RESTART, gtk+-2.0 >= 1.3.11)
CFLAGS="$METACITY_CFLAGS $CFLAGS"
......@@ -82,6 +82,14 @@ LDFLAGS="$METACITY_LIBS $LDFLAGS"
AC_CHECK_FUNCS(gdk_pixbuf_new_from_stream)
LDFLAGS=$save_LDFLAGS
AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
if test x"$GCONFTOOL" = xno; then
AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf])
fi
AM_GCONF_SOURCE_2
AC_OUTPUT([
Makefile
src/Makefile
......
SUBDIRS=wm-tester tools
INCLUDES=@METACITY_CFLAGS@ -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\"
INCLUDES=@METACITY_CFLAGS@ -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMETACITY_LOCALEDIR=\"$(datadir)/locale\"
metacity_SOURCES= \
common.h \
......@@ -30,6 +30,8 @@ metacity_SOURCES= \
menu.h \
place.c \
place.h \
prefs.c \
prefs.h \
screen.c \
screen.h \
session.c \
......@@ -54,6 +56,12 @@ metacity_LDADD= @METACITY_LIBS@
desktopfilesdir=$(datadir)/gnome/wm-properties
desktopfiles_DATA=metacity.desktop
schemadir = @GCONF_SCHEMA_FILE_DIR@
schema_DATA = metacity.schemas
install-data-local:
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(schema_DATA)
IMAGES=default_icon.png
VARIABLES=default_icon_data $(srcdir)/default_icon.png
......@@ -63,4 +71,4 @@ CLEANFILES += inlinepixbufs.h
inlinepixbufs.h: $(IMAGES)
$(GDK_PIXBUF_CSOURCE) --raw --build-list $(VARIABLES) >$(srcdir)/inlinepixbufs.h
EXTRA_DIST=$(desktopfiles_DATA) $(IMAGES)
EXTRA_DIST=$(desktopfiles_DATA) $(IMAGES) $(schema_DATA)
......@@ -123,6 +123,13 @@ typedef enum
} MetaCursor;
typedef enum
{
META_FOCUS_MODE_CLICK,
META_FOCUS_MODE_SLOPPY,
META_FOCUS_MODE_MOUSE
} MetaFocusMode;
/* should investigate changing these to whatever most apps use */
#define META_ICON_WIDTH 32
#define META_ICON_HEIGHT 32
......
......@@ -19,6 +19,7 @@
* 02111-1307, USA.
*/
#include <config.h>
#include "display.h"
#include "util.h"
#include "main.h"
......
......@@ -20,6 +20,7 @@
* 02111-1307, USA.
*/
#include <config.h>
#include "errors.h"
#include <errno.h>
#include <stdlib.h>
......
......@@ -19,6 +19,7 @@
* 02111-1307, USA.
*/
#include <config.h>
#include "frames.h"
#include "util.h"
#include "core.h"
......
......@@ -19,6 +19,7 @@
* 02111-1307, USA.
*/
#include <config.h>
#include "keybindings.h"
#include "workspace.h"
#include "errors.h"
......
......@@ -19,12 +19,14 @@
* 02111-1307, USA.
*/
#include <config.h>
#include "main.h"
#include "util.h"
#include "display.h"
#include "errors.h"
#include "ui.h"
#include "session.h"
#include "prefs.h"
#include <glib-object.h>
......@@ -74,7 +76,9 @@ main (int argc, char **argv)
act.sa_flags = 0;
sigaction (SIGPIPE, &act, 0);
g_set_prgname (PACKAGE);
g_set_prgname (argv[0]);
bindtextdomain (GETTEXT_PACKAGE, METACITY_LOCALEDIR);
meta_set_verbose (TRUE);
meta_set_debugging (TRUE);
......@@ -169,8 +173,8 @@ main (int argc, char **argv)
g_type_init ();
if (!disable_sm)
meta_session_init (client_id); /* client_id == NULL is fine */
/* Load prefs */
meta_prefs_init ();
meta_ui_init (&argc, &argv);
......@@ -181,6 +185,13 @@ main (int argc, char **argv)
G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
log_handler, NULL);
g_log_set_always_fatal (G_LOG_LEVEL_MASK);
/* Connect to SM as late as possible - but before managing display,
* or we might try to manage a window before we have the session
* info
*/
if (!disable_sm)
meta_session_init (client_id); /* client_id == NULL is fine */
if (!meta_display_open (NULL))
meta_exit (META_EXIT_ERROR);
......
......@@ -19,6 +19,7 @@
* 02111-1307, USA.
*/
#include <config.h>
#include "menu.h"
#include "main.h"
#include "util.h"
......
......@@ -4,7 +4,8 @@
<!-- General preferences -->
<schema>
<key>/apps/metacity/general/focus_mode</key>
<key>/schemas/apps/metacity/general/focus_mode</key>
<applyto>/apps/metacity/general/focus_mode</applyto>
<owner>metacity</owner>
<type>string</type>
<default>click</default>
......@@ -22,7 +23,8 @@
</schema>
<schema>
<key>/apps/metacity/general/titlebar_uses_desktop_font</key>
<key>/schemas/apps/metacity/general/titlebar_uses_desktop_font</key>
<applyto>/apps/metacity/general/titlebar_uses_desktop_font</applyto>
<owner>metacity</owner>
<type>bool</type>
<default>true</default>
......@@ -37,7 +39,8 @@
</schema>
<schema>
<key>/apps/metacity/general/titlebar_font</key>
<key>/schemas/apps/metacity/general/titlebar_font</key>
<applyto>/apps/metacity/general/titlebar_font</applyto>
<owner>metacity</owner>
<type>string</type>
<!-- no default is deliberate - we want to be unset by default -->
......@@ -57,7 +60,8 @@
</schema>
<schema>
<key>/apps/metacity/general/titlebar_font_size</key>
<key>/schemas/apps/metacity/general/titlebar_font_size</key>
<applyto>/apps/metacity/general/titlebar_font_size</applyto>
<owner>metacity</owner>
<type>int</type>
<default>0</default>
......@@ -75,18 +79,19 @@
<!-- Keybindings -->
<schema>
<key>/apps/metacity/keybindings/activate_window_menu</key>
<key>/schemas/apps/metacity/keybindings/activate_window_menu</key>
<applyto>/apps/metacity/keybindings/activate_window_menu</applyto>
<owner>metacity</owner>
<type>string</type>
<default>
<default>&lt;Alt&gt;space</default>
<locale name="C">
<short>Activate window menu</short>
<long>
The keybinding used to activate the window menu.
The format looks like "<Control>a" or "<Shift><Alt>F1" or
"<Release>z" (the last one is for key release). The parser is
The format looks like "&lt;Control&gt;a" or "&lt;Shift&gt;&lt;Alt&gt;F1" or
"&lt;Release&gt;z" (the last one is for key release). The parser is
fairly liberal and allows lower or upper case, and also
abbreviations such as "<Ctl>" and "<Ctrl>". This option can be
abbreviations such as "&lt;Ctl&gt;" and "&lt;Ctrl&gt;". This option can be
set to a single string, or a list of strings; if a list,
all of the given keybindings will be present. If you set
the option to the special string "disabled", then there
......
/* Metacity preferences */
/*
* 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 <config.h>
#include "prefs.h"
#include "util.h"
#include <gconf/gconf-client.h>
#include <string.h>
/* If you add a key, it needs updating in init() and in the gconf
* notify listener and of course in the .schemas file
*/
#define KEY_FOCUS_MODE "/apps/metacity/general/focus_mode"
#define KEY_USE_DESKTOP_FONT "/apps/metacity/general/titlebar_uses_desktop_font"
#define KEY_TITLEBAR_FONT "/apps/metacity/general/titlebar_font"
#define KEY_TITLEBAR_FONT_SIZE "/apps/metacity/general/titlebar_font_size"
static GConfClient *client = NULL;
static GList *listeners = NULL;
static GList *changes = NULL;
static guint changed_idle;
static gboolean use_desktop_font = TRUE;
static PangoFontDescription *titlebar_font = NULL;
static int titlebar_font_size = 0;
static MetaFocusMode focus_mode = META_FOCUS_MODE_CLICK;
static gboolean update_use_desktop_font (gboolean value);
static gboolean update_titlebar_font (const char *value);
static gboolean update_titlebar_font_size (int value);
static gboolean update_focus_mode (const char *value);
static void queue_changed (MetaPreference pref);
static void change_notify (GConfClient *client,
guint cnxn_id,
GConfEntry *entry,
gpointer user_data);
typedef struct
{
MetaPrefsChangedFunc func;
gpointer data;
} MetaPrefsListener;
void
meta_prefs_add_listener (MetaPrefsChangedFunc func,
gpointer data)
{
MetaPrefsListener *l;
l = g_new (MetaPrefsListener, 1);
l->func = func;
l->data = data;
listeners = g_list_prepend (listeners, l);
}
void
meta_prefs_remove_listener (MetaPrefsChangedFunc func,
gpointer data)
{
GList *tmp;
tmp = listeners;
while (tmp != NULL)
{
MetaPrefsListener *l = tmp->data;
if (l->func == func &&
l->data == data)
{
g_free (l);
listeners = g_list_delete_link (listeners, tmp);
return;
}
tmp = tmp->next;
}
meta_bug ("Did not find listener to remove\n");
}
static void
emit_changed (MetaPreference pref)
{
GList *tmp;
GList *copy;
meta_verbose ("Notifying listeners that pref %s changed\n",
meta_preference_to_string (pref));
copy = g_list_copy (listeners);
tmp = copy;
while (tmp != NULL)
{
MetaPrefsListener *l = tmp->data;
(* l->func) (pref, l->data);
tmp = tmp->next;
}
g_list_free (copy);
}
static gboolean
changed_idle_handler (gpointer data)
{
GList *tmp;
GList *copy;
changed_idle = 0;
copy = g_list_copy (changes); /* reentrancy paranoia */
g_list_free (changes);
changes = NULL;
tmp = copy;
while (tmp != NULL)
{
MetaPreference pref = GPOINTER_TO_INT (tmp->data);
emit_changed (pref);
tmp = tmp->next;
}
g_list_free (copy);
return FALSE;
}
static void
queue_changed (MetaPreference pref)
{
meta_verbose ("Queueing change of pref %s\n",
meta_preference_to_string (pref));
if (g_list_find (changes, GINT_TO_POINTER (pref)) == NULL)
changes = g_list_prepend (changes, GINT_TO_POINTER (pref));
else
meta_verbose ("Change of pref %s was already pending\n",
meta_preference_to_string (pref));
if (changed_idle == 0)
changed_idle = g_idle_add (changed_idle_handler, NULL);
}
static void
cleanup_error (GError **error)
{
if (*error)
{
meta_warning ("%s", (*error)->message);
g_error_free (*error);
*error = NULL;
}
}
void
meta_prefs_init (void)
{
GError *err = NULL;
char *str_val;
int int_val;
gboolean bool_val;
if (client != NULL)
return;
/* returns a reference which we hold forever */
client = gconf_client_get_default ();
gconf_client_add_dir (client, "/apps/metacity",
GCONF_CLIENT_PRELOAD_RECURSIVE,
&err);
cleanup_error (&err);
str_val = gconf_client_get_string (client, KEY_FOCUS_MODE,
&err);
cleanup_error (&err);
update_focus_mode (str_val);
g_free (str_val);
bool_val = gconf_client_get_bool (client, KEY_USE_DESKTOP_FONT,
&err);
cleanup_error (&err);
update_use_desktop_font (bool_val);
int_val = gconf_client_get_int (client, KEY_TITLEBAR_FONT_SIZE,
&err);
cleanup_error (&err);
update_titlebar_font_size (int_val);
str_val = gconf_client_get_string (client, KEY_TITLEBAR_FONT,
&err);
cleanup_error (&err);
update_titlebar_font (str_val);
g_free (str_val);
gconf_client_notify_add (client, "/apps/metacity",
change_notify,
NULL,
NULL,
&err);
cleanup_error (&err);
}
static void
change_notify (GConfClient *client,
guint cnxn_id,
GConfEntry *entry,
gpointer user_data)
{
const char *key;
GConfValue *value;
key = gconf_entry_get_key (entry);
value = gconf_entry_get_value (entry);
if (strcmp (key, KEY_FOCUS_MODE) == 0)
{
const char *str;
if (value && value->type != GCONF_VALUE_STRING)
{
meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
KEY_FOCUS_MODE);
goto out;
}
str = value ? gconf_value_get_string (value) : NULL;
if (update_focus_mode (str))
queue_changed (META_PREF_FOCUS_MODE);
}
else if (strcmp (key, KEY_TITLEBAR_FONT) == 0)
{
const char *str;
if (value && value->type != GCONF_VALUE_STRING)
{
meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
KEY_TITLEBAR_FONT);
goto out;
}
str = value ? gconf_value_get_string (value) : NULL;
if (update_titlebar_font (str))
queue_changed (META_PREF_TITLEBAR_FONT);
}
else if (strcmp (key, KEY_TITLEBAR_FONT_SIZE) == 0)
{
int d;
if (value && value->type != GCONF_VALUE_INT)
{
meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
KEY_TITLEBAR_FONT_SIZE);
goto out;
}
d = value ? gconf_value_get_int (value) : 0;
if (update_titlebar_font_size (d))
queue_changed (META_PREF_TITLEBAR_FONT_SIZE);
}
else if (strcmp (key, KEY_USE_DESKTOP_FONT) == 0)
{
gboolean b;
if (value && value->type != GCONF_VALUE_BOOL)
{
meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
KEY_USE_DESKTOP_FONT);
goto out;
}
b = value ? gconf_value_get_bool (value) : TRUE;
/* There's no external pref for this, it just affects whether
* get_titlebar_font returns NULL, so that's what we queue
* the change on
*/
if (update_use_desktop_font (b))
queue_changed (META_PREF_TITLEBAR_FONT);
}
else
meta_verbose ("Key %s doesn't mean anything to Metacity\n",
key);
out:
/* nothing */
}
static gboolean
update_focus_mode (const char *value)
{
MetaFocusMode old_mode = focus_mode;
if (value != NULL)
{
if (g_ascii_strcasecmp (value, "click") == 0)
focus_mode = META_FOCUS_MODE_CLICK;
else if (g_ascii_strcasecmp (value, "sloppy") == 0)
focus_mode = META_FOCUS_MODE_SLOPPY;
else if (g_ascii_strcasecmp (value, "mouse") == 0)
focus_mode = META_FOCUS_MODE_MOUSE;
else
meta_warning (_("GConf key '%s' is set to an invalid value"),
KEY_FOCUS_MODE);
}
return (old_mode != focus_mode);
}
MetaFocusMode
meta_prefs_get_focus_mode (void)
{
return focus_mode;
}
static gboolean
update_use_desktop_font (gboolean value)
{
gboolean old = use_desktop_font;
use_desktop_font = value;
return old != value;
}
static gboolean
update_titlebar_font (const char *value)
{
PangoFontDescription *new_desc;
new_desc = NULL;
if (value)
{
new_desc = pango_font_description_from_string (value);
if (new_desc == NULL)
meta_warning (_("Could not parse font description \"%s\" from GConf key %s\n"),
value, KEY_TITLEBAR_FONT);
}
if (new_desc && titlebar_font &&
pango_font_description_equal (new_desc, titlebar_font))
{