diff options
Diffstat (limited to 'src/terminal-util.c')
-rw-r--r-- | src/terminal-util.c | 1695 |
1 files changed, 853 insertions, 842 deletions
diff --git a/src/terminal-util.c b/src/terminal-util.c index 6bf6618..ea93a98 100644 --- a/src/terminal-util.c +++ b/src/terminal-util.c @@ -48,11 +48,11 @@ void terminal_util_set_unique_role (GtkWindow *window, const char *prefix) { - char *role; + char *role; - role = g_strdup_printf ("%s-%d-%d-%d", prefix, getpid (), g_random_int (), (int) time (NULL)); - gtk_window_set_role (window, role); - g_free (role); + role = g_strdup_printf ("%s-%d-%d-%d", prefix, getpid (), g_random_int (), (int) time (NULL)); + gtk_window_set_role (window, role); + g_free (role); } /** @@ -63,66 +63,66 @@ terminal_util_set_unique_role (GtkWindow *window, const char *prefix) * @message_format: printf() style format string * * Create a #GtkMessageDialog window with the message, and present it, handling its buttons. - * If @weap_ptr is not #NULL, only create the dialog if <literal>*weap_ptr</literal> is #NULL - * (and in that * case, set @weap_ptr to be a weak pointer to the new dialog), otherwise just + * If @weap_ptr is not #NULL, only create the dialog if <literal>*weap_ptr</literal> is #NULL + * (and in that * case, set @weap_ptr to be a weak pointer to the new dialog), otherwise just * present <literal>*weak_ptr</literal>. Note that in this last case, the message <emph>will</emph> * be changed. */ void -terminal_util_show_error_dialog (GtkWindow *transient_parent, +terminal_util_show_error_dialog (GtkWindow *transient_parent, GtkWidget **weak_ptr, GError *error, - const char *message_format, - ...) + const char *message_format, + ...) { - char *message; - va_list args; - - if (message_format) - { - va_start (args, message_format); - message = g_strdup_vprintf (message_format, args); - va_end (args); - } - else message = NULL; - - if (weak_ptr == NULL || *weak_ptr == NULL) - { - GtkWidget *dialog; - dialog = gtk_message_dialog_new (transient_parent, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, - message ? "%s" : NULL, - message); - - if (error != NULL) - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - "%s", error->message); - - g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (gtk_widget_destroy), NULL); - - if (weak_ptr != NULL) - { - *weak_ptr = dialog; - g_object_add_weak_pointer (G_OBJECT (dialog), (void**)weak_ptr); - } - - gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); - - gtk_widget_show_all (dialog); - } - else - { - g_return_if_fail (GTK_IS_MESSAGE_DIALOG (*weak_ptr)); - - /* Sucks that there's no direct accessor for "text" property */ - g_object_set (G_OBJECT (*weak_ptr), "text", message, NULL); - - gtk_window_present (GTK_WINDOW (*weak_ptr)); - } - - g_free (message); + char *message; + va_list args; + + if (message_format) + { + va_start (args, message_format); + message = g_strdup_vprintf (message_format, args); + va_end (args); + } + else message = NULL; + + if (weak_ptr == NULL || *weak_ptr == NULL) + { + GtkWidget *dialog; + dialog = gtk_message_dialog_new (transient_parent, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + message ? "%s" : NULL, + message); + + if (error != NULL) + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + "%s", error->message); + + g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (gtk_widget_destroy), NULL); + + if (weak_ptr != NULL) + { + *weak_ptr = dialog; + g_object_add_weak_pointer (G_OBJECT (dialog), (void**)weak_ptr); + } + + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + + gtk_widget_show_all (dialog); + } + else + { + g_return_if_fail (GTK_IS_MESSAGE_DIALOG (*weak_ptr)); + + /* Sucks that there's no direct accessor for "text" property */ + g_object_set (G_OBJECT (*weak_ptr), "text", message, NULL); + + gtk_window_present (GTK_WINDOW (*weak_ptr)); + } + + g_free (message); } static gboolean @@ -131,66 +131,72 @@ open_url (GtkWindow *parent, guint32 user_time, GError **error) { - GdkScreen *screen; + GdkScreen *screen; - if (parent) - screen = gtk_widget_get_screen (GTK_WIDGET (parent)); - else - screen = gdk_screen_get_default (); + if (parent) + screen = gtk_widget_get_screen (GTK_WIDGET (parent)); + else + screen = gdk_screen_get_default (); - return gtk_show_uri (screen, uri, user_time, error); + return gtk_show_uri (screen, uri, user_time, error); } void -terminal_util_show_help (const char *topic, +terminal_util_show_help (const char *topic, GtkWindow *parent) { - GError *error = NULL; - const char *lang; - char *uri = NULL, *url; - guint i; - - const char * const * langs = g_get_language_names (); - for (i = 0; langs[i]; i++) { - lang = langs[i]; - if (strchr (lang, '.')) { - continue; - } - - uri = g_build_filename (TERM_HELPDIR, - "mate-terminal", /* DOC_MODULE */ - lang, - "mate-terminal.xml", - NULL); - - if (g_file_test (uri, G_FILE_TEST_EXISTS)) { - break; - } - - g_free (uri); - uri = NULL; - } - - if (!uri) - return; - - if (topic) { - url = g_strdup_printf ("ghelp://%s?%s", uri, topic); - } else { - url = g_strdup_printf ("ghelp://%s", uri); - } - - if (!open_url (GTK_WINDOW (parent), url, gtk_get_current_event_time (), &error)) - { - terminal_util_show_error_dialog (GTK_WINDOW (parent), NULL, error, - _("There was an error displaying help")); - g_error_free (error); - } - - g_free (uri); - g_free (url); + GError *error = NULL; + const char *lang; + char *uri = NULL, *url; + guint i; + + const char * const * langs = g_get_language_names (); + for (i = 0; langs[i]; i++) + { + lang = langs[i]; + if (strchr (lang, '.')) + { + continue; + } + + uri = g_build_filename (TERM_HELPDIR, + "mate-terminal", /* DOC_MODULE */ + lang, + "mate-terminal.xml", + NULL); + + if (g_file_test (uri, G_FILE_TEST_EXISTS)) + { + break; + } + + g_free (uri); + uri = NULL; + } + + if (!uri) + return; + + if (topic) + { + url = g_strdup_printf ("ghelp://%s?%s", uri, topic); + } + else + { + url = g_strdup_printf ("ghelp://%s", uri); + } + + if (!open_url (GTK_WINDOW (parent), url, gtk_get_current_event_time (), &error)) + { + terminal_util_show_error_dialog (GTK_WINDOW (parent), NULL, error, + _("There was an error displaying help")); + g_error_free (error); + } + + g_free (uri); + g_free (url); } - + /* sets accessible name and description for the widget */ void @@ -198,26 +204,26 @@ terminal_util_set_atk_name_description (GtkWidget *widget, const char *name, const char *desc) { - AtkObject *obj; - - obj = gtk_widget_get_accessible (widget); - - if (obj == NULL) - { - g_warning ("%s: for some reason widget has no GtkAccessible", - G_STRFUNC); - return; - } - - - if (!GTK_IS_ACCESSIBLE (obj)) - return; /* This means GAIL is not loaded so we have the NoOp accessible */ - - g_return_if_fail (GTK_IS_ACCESSIBLE (obj)); - if (desc) - atk_object_set_description (obj, desc); - if (name) - atk_object_set_name (obj, name); + AtkObject *obj; + + obj = gtk_widget_get_accessible (widget); + + if (obj == NULL) + { + g_warning ("%s: for some reason widget has no GtkAccessible", + G_STRFUNC); + return; + } + + + if (!GTK_IS_ACCESSIBLE (obj)) + return; /* This means GAIL is not loaded so we have the NoOp accessible */ + + g_return_if_fail (GTK_IS_ACCESSIBLE (obj)); + if (desc) + atk_object_set_description (obj, desc); + if (name) + atk_object_set_name (obj, name); } void @@ -226,43 +232,43 @@ terminal_util_open_url (GtkWidget *parent, TerminalURLFlavour flavor, guint32 user_time) { - GError *error = NULL; - char *uri; - - g_return_if_fail (orig_url != NULL); - - switch (flavor) - { - case FLAVOR_DEFAULT_TO_HTTP: - uri = g_strdup_printf ("http:%s", orig_url); - break; - case FLAVOR_EMAIL: - if (g_ascii_strncasecmp ("mailto:", orig_url, 7) != 0) - uri = g_strdup_printf ("mailto:%s", orig_url); - else - uri = g_strdup (orig_url); - break; - case FLAVOR_VOIP_CALL: - case FLAVOR_AS_IS: - uri = g_strdup (orig_url); - break; - case FLAVOR_SKEY: - /* shouldn't get this */ - default: - uri = NULL; - g_assert_not_reached (); - } - - if (!open_url (GTK_WINDOW (parent), uri, user_time, &error)) - { - terminal_util_show_error_dialog (GTK_WINDOW (parent), NULL, error, - _("Could not open the address ā%sā"), - uri); - - g_error_free (error); - } - - g_free (uri); + GError *error = NULL; + char *uri; + + g_return_if_fail (orig_url != NULL); + + switch (flavor) + { + case FLAVOR_DEFAULT_TO_HTTP: + uri = g_strdup_printf ("http:%s", orig_url); + break; + case FLAVOR_EMAIL: + if (g_ascii_strncasecmp ("mailto:", orig_url, 7) != 0) + uri = g_strdup_printf ("mailto:%s", orig_url); + else + uri = g_strdup (orig_url); + break; + case FLAVOR_VOIP_CALL: + case FLAVOR_AS_IS: + uri = g_strdup (orig_url); + break; + case FLAVOR_SKEY: + /* shouldn't get this */ + default: + uri = NULL; + g_assert_not_reached (); + } + + if (!open_url (GTK_WINDOW (parent), uri, user_time, &error)) + { + terminal_util_show_error_dialog (GTK_WINDOW (parent), NULL, error, + _("Could not open the address ā%sā"), + uri); + + g_error_free (error); + } + + g_free (uri); } /** @@ -276,25 +282,25 @@ char * terminal_util_resolve_relative_path (const char *path, const char *relative_path) { - GFile *file, *resolved_file; - char *resolved_path = NULL; + GFile *file, *resolved_file; + char *resolved_path = NULL; - g_return_val_if_fail (relative_path != NULL, NULL); + g_return_val_if_fail (relative_path != NULL, NULL); - if (path == NULL) - return g_strdup (relative_path); + if (path == NULL) + return g_strdup (relative_path); - file = g_file_new_for_path (path); - resolved_file = g_file_resolve_relative_path (file, relative_path); - g_object_unref (file); + file = g_file_new_for_path (path); + resolved_file = g_file_resolve_relative_path (file, relative_path); + g_object_unref (file); - if (resolved_file == NULL) - return NULL; + if (resolved_file == NULL) + return NULL; - resolved_path = g_file_get_path (resolved_file); - g_object_unref (resolved_file); + resolved_path = g_file_get_path (resolved_file); + g_object_unref (resolved_file); - return resolved_path; + return resolved_path; } /** @@ -307,76 +313,77 @@ terminal_util_resolve_relative_path (const char *path, void terminal_util_transform_uris_to_quoted_fuse_paths (char **uris) { - guint i; + guint i; - if (!uris) - return; + if (!uris) + return; - for (i = 0; uris[i]; ++i) - { - GFile *file; - char *path; + for (i = 0; uris[i]; ++i) + { + GFile *file; + char *path; - file = g_file_new_for_uri (uris[i]); + file = g_file_new_for_uri (uris[i]); - if ((path = g_file_get_path (file))) - { - char *quoted; + if ((path = g_file_get_path (file))) + { + char *quoted; - quoted = g_shell_quote (path); - g_free (uris[i]); - g_free (path); + quoted = g_shell_quote (path); + g_free (uris[i]); + g_free (path); - uris[i] = quoted; - } + uris[i] = quoted; + } - g_object_unref (file); - } + g_object_unref (file); + } } char * terminal_util_concat_uris (char **uris, gsize *length) { - GString *string; - gsize len; - guint i; + GString *string; + gsize len; + guint i; - len = 0; - for (i = 0; uris[i]; ++i) - len += strlen (uris[i]) + 1; + len = 0; + for (i = 0; uris[i]; ++i) + len += strlen (uris[i]) + 1; - if (length) - *length = len; + if (length) + *length = len; - string = g_string_sized_new (len + 1); - for (i = 0; uris[i]; ++i) - { - g_string_append (string, uris[i]); - g_string_append_c (string, ' '); - } + string = g_string_sized_new (len + 1); + for (i = 0; uris[i]; ++i) + { + g_string_append (string, uris[i]); + g_string_append_c (string, ' '); + } - return g_string_free (string, FALSE); + return g_string_free (string, FALSE); } char * terminal_util_get_licence_text (void) { - const gchar *license[] = { - N_("MATE Terminal 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 3 of the License, or " - "(at your option) any later version."), - N_("MATE Terminal 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."), - N_("You should have received a copy of the GNU General Public License " - "along with MATE Terminal; if not, write to the Free Software Foundation, " - "Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA") - }; - - return g_strjoin ("\n\n", _(license[0]), _(license[1]), _(license[2]), NULL); + const gchar *license[] = + { + N_("MATE Terminal 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 3 of the License, or " + "(at your option) any later version."), + N_("MATE Terminal 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."), + N_("You should have received a copy of the GNU General Public License " + "along with MATE Terminal; if not, write to the Free Software Foundation, " + "Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA") + }; + + return g_strjoin ("\n\n", _(license[0]), _(license[1]), _(license[2]), NULL); } gboolean @@ -384,48 +391,51 @@ terminal_util_load_builder_file (const char *filename, const char *object_name, ...) { - char *path; - GtkBuilder *builder; - GError *error = NULL; - va_list args; - - path = g_build_filename (TERM_PKGDATADIR, filename, NULL); - builder = gtk_builder_new (); - if (!gtk_builder_add_from_file (builder, path, &error)) { - g_warning ("Failed to load %s: %s\n", filename, error->message); - g_error_free (error); - g_free (path); - g_object_unref (builder); - return FALSE; - } - g_free (path); - - va_start (args, object_name); - - while (object_name) { - GObject **objectptr; - - objectptr = va_arg (args, GObject**); - *objectptr = gtk_builder_get_object (builder, object_name); - if (!*objectptr) { - g_warning ("Failed to fetch object \"%s\"\n", object_name); - break; - } - - object_name = va_arg (args, const char*); - } - - va_end (args); - - g_object_unref (builder); - return object_name == NULL; + char *path; + GtkBuilder *builder; + GError *error = NULL; + va_list args; + + path = g_build_filename (TERM_PKGDATADIR, filename, NULL); + builder = gtk_builder_new (); + if (!gtk_builder_add_from_file (builder, path, &error)) + { + g_warning ("Failed to load %s: %s\n", filename, error->message); + g_error_free (error); + g_free (path); + g_object_unref (builder); + return FALSE; + } + g_free (path); + + va_start (args, object_name); + + while (object_name) + { + GObject **objectptr; + + objectptr = va_arg (args, GObject**); + *objectptr = gtk_builder_get_object (builder, object_name); + if (!*objectptr) + { + g_warning ("Failed to fetch object \"%s\"\n", object_name); + break; + } + + object_name = va_arg (args, const char*); + } + + va_end (args); + + g_object_unref (builder); + return object_name == NULL; } gboolean terminal_util_dialog_response_on_delete (GtkWindow *widget) { - gtk_dialog_response (GTK_DIALOG (widget), GTK_RESPONSE_DELETE_EVENT); - return TRUE; + gtk_dialog_response (GTK_DIALOG (widget), GTK_RESPONSE_DELETE_EVENT); + return TRUE; } /* Like g_key_file_set_string, but escapes characters so that @@ -434,34 +444,34 @@ terminal_util_dialog_response_on_delete (GtkWindow *widget) */ void terminal_util_key_file_set_string_escape (GKeyFile *key_file, - const char *group, - const char *key, - const char *string) + const char *group, + const char *key, + const char *string) { - char *escaped; + char *escaped; - /* FIXMEchpe: be more intelligent and only escape characters that aren't UTF-8 */ - escaped = g_strescape (string, NULL); - g_key_file_set_string (key_file, group, key, escaped); - g_free (escaped); + /* FIXMEchpe: be more intelligent and only escape characters that aren't UTF-8 */ + escaped = g_strescape (string, NULL); + g_key_file_set_string (key_file, group, key, escaped); + g_free (escaped); } char * terminal_util_key_file_get_string_unescape (GKeyFile *key_file, - const char *group, - const char *key, - GError **error) + const char *group, + const char *key, + GError **error) { - char *escaped, *unescaped; + char *escaped, *unescaped; - escaped = g_key_file_get_string (key_file, group, key, error); - if (!escaped) - return NULL; + escaped = g_key_file_get_string (key_file, group, key, error); + if (!escaped) + return NULL; - unescaped = g_strcompress (escaped); - g_free (escaped); + unescaped = g_strcompress (escaped); + g_free (escaped); - return unescaped; + return unescaped; } void @@ -471,23 +481,23 @@ terminal_util_key_file_set_argv (GKeyFile *key_file, int argc, char **argv) { - char **quoted_argv; - char *flat; - int i; + char **quoted_argv; + char *flat; + int i; - if (argc < 0) - argc = g_strv_length (argv); + if (argc < 0) + argc = g_strv_length (argv); - quoted_argv = g_new (char*, argc + 1); - for (i = 0; i < argc; ++i) - quoted_argv[i] = g_shell_quote (argv[i]); - quoted_argv[argc] = NULL; + quoted_argv = g_new (char*, argc + 1); + for (i = 0; i < argc; ++i) + quoted_argv[i] = g_shell_quote (argv[i]); + quoted_argv[argc] = NULL; - flat = g_strjoinv (" ", quoted_argv); - terminal_util_key_file_set_string_escape (key_file, group, key, flat); + flat = g_strjoinv (" ", quoted_argv); + terminal_util_key_file_set_string_escape (key_file, group, key, flat); - g_free (flat); - g_strfreev (quoted_argv); + g_free (flat); + g_strfreev (quoted_argv); } char ** @@ -497,21 +507,21 @@ terminal_util_key_file_get_argv (GKeyFile *key_file, int *argc, GError **error) { - char **argv; - char *flat; - gboolean retval; + char **argv; + char *flat; + gboolean retval; - flat = terminal_util_key_file_get_string_unescape (key_file, group, key, error); - if (!flat) - return NULL; + flat = terminal_util_key_file_get_string_unescape (key_file, group, key, error); + if (!flat) + return NULL; - retval = g_shell_parse_argv (flat, argc, &argv, error); - g_free (flat); + retval = g_shell_parse_argv (flat, argc, &argv, error); + g_free (flat); - if (retval) - return argv; + if (retval) + return argv; - return NULL; + return NULL; } /* Proxy stuff */ @@ -520,14 +530,14 @@ static char * conf_get_string (MateConfClient *conf, const char *key) { - char *value; - value = mateconf_client_get_string (conf, key, NULL); - if (G_UNLIKELY (value && *value == '\0')) - { - g_free (value); - value = NULL; - } - return value; + char *value; + value = mateconf_client_get_string (conf, key, NULL); + if (G_UNLIKELY (value && *value == '\0')) + { + g_free (value); + value = NULL; + } + return value; } /* @@ -544,174 +554,174 @@ set_proxy_env (GHashTable *env_table, const char *key, char *value) { - char *key1 = NULL, *key2 = NULL; - char *value1 = NULL, *value2 = NULL; - - if (!value) - return; - - if (g_hash_table_lookup (env_table, key) == NULL) - key1 = g_strdup (key); - - key2 = g_ascii_strup (key, -1); - if (g_hash_table_lookup (env_table, key) != NULL) - { - g_free (key2); - key2 = NULL; - } - - if (key1 && key2) - { - value1 = value; - value2 = g_strdup (value); - } - else if (key1) - value1 = value; - else if (key2) - value2 = value; - else - g_free (value); - - if (key1) - g_hash_table_replace (env_table, key1, value1); - if (key2) - g_hash_table_replace (env_table, key2, value2); + char *key1 = NULL, *key2 = NULL; + char *value1 = NULL, *value2 = NULL; + + if (!value) + return; + + if (g_hash_table_lookup (env_table, key) == NULL) + key1 = g_strdup (key); + + key2 = g_ascii_strup (key, -1); + if (g_hash_table_lookup (env_table, key) != NULL) + { + g_free (key2); + key2 = NULL; + } + + if (key1 && key2) + { + value1 = value; + value2 = g_strdup (value); + } + else if (key1) + value1 = value; + else if (key2) + value2 = value; + else + g_free (value); + + if (key1) + g_hash_table_replace (env_table, key1, value1); + if (key2) + g_hash_table_replace (env_table, key2, value2); } static void setup_http_proxy_env (GHashTable *env_table, MateConfClient *conf) { - gchar *host; - gint port; - GSList *ignore; + gchar *host; + gint port; + GSList *ignore; - if (!mateconf_client_get_bool (conf, CONF_HTTP_PROXY_PREFIX "/use_http_proxy", NULL)) - return; + if (!mateconf_client_get_bool (conf, CONF_HTTP_PROXY_PREFIX "/use_http_proxy", NULL)) + return; - host = conf_get_string (conf, CONF_HTTP_PROXY_PREFIX "/host"); - port = mateconf_client_get_int (conf, CONF_HTTP_PROXY_PREFIX "/port", NULL); - if (host && port) - { - GString *buf = g_string_sized_new (64); - g_string_append (buf, "http://"); - - if (mateconf_client_get_bool (conf, CONF_HTTP_PROXY_PREFIX "/use_authentication", NULL)) + host = conf_get_string (conf, CONF_HTTP_PROXY_PREFIX "/host"); + port = mateconf_client_get_int (conf, CONF_HTTP_PROXY_PREFIX "/port", NULL); + if (host && port) { - char *user, *password; - user = conf_get_string (conf, CONF_HTTP_PROXY_PREFIX "/authentication_user"); - if (user) - { - g_string_append_uri_escaped (buf, user, NULL, TRUE); - password = conf_get_string (conf, CONF_HTTP_PROXY_PREFIX "/authentication_password"); - if (password) + GString *buf = g_string_sized_new (64); + g_string_append (buf, "http://"); + + if (mateconf_client_get_bool (conf, CONF_HTTP_PROXY_PREFIX "/use_authentication", NULL)) { - g_string_append_c (buf, ':'); - g_string_append_uri_escaped (buf, password, NULL, TRUE); - g_free (password); + char *user, *password; + user = conf_get_string (conf, CONF_HTTP_PROXY_PREFIX "/authentication_user"); + if (user) + { + g_string_append_uri_escaped (buf, user, NULL, TRUE); + password = conf_get_string (conf, CONF_HTTP_PROXY_PREFIX "/authentication_password"); + if (password) + { + g_string_append_c (buf, ':'); + g_string_append_uri_escaped (buf, password, NULL, TRUE); + g_free (password); + } + g_free (user); + g_string_append_c (buf, '@'); + } } - g_free (user); - g_string_append_c (buf, '@'); - } + g_string_append_printf (buf, "%s:%d/", host, port); + set_proxy_env (env_table, "http_proxy", g_string_free (buf, FALSE)); } - g_string_append_printf (buf, "%s:%d/", host, port); - set_proxy_env (env_table, "http_proxy", g_string_free (buf, FALSE)); - } - g_free (host); - - ignore = mateconf_client_get_list (conf, CONF_HTTP_PROXY_PREFIX "/ignore_hosts", MATECONF_VALUE_STRING, NULL); - if (ignore) - { - GString *buf = g_string_sized_new (64); - while (ignore != NULL) + g_free (host); + + ignore = mateconf_client_get_list (conf, CONF_HTTP_PROXY_PREFIX "/ignore_hosts", MATECONF_VALUE_STRING, NULL); + if (ignore) { - GSList *old; + GString *buf = g_string_sized_new (64); + while (ignore != NULL) + { + GSList *old; - if (buf->len) - g_string_append_c (buf, ','); - g_string_append (buf, ignore->data); + if (buf->len) + g_string_append_c (buf, ','); + g_string_append (buf, ignore->data); - old = ignore; - ignore = g_slist_next (ignore); - g_free (old->data); - g_slist_free_1 (old); + old = ignore; + ignore = g_slist_next (ignore); + g_free (old->data); + g_slist_free_1 (old); + } + set_proxy_env (env_table, "no_proxy", g_string_free (buf, FALSE)); } - set_proxy_env (env_table, "no_proxy", g_string_free (buf, FALSE)); - } } static void setup_https_proxy_env (GHashTable *env_table, MateConfClient *conf) { - gchar *host; - gint port; - - host = conf_get_string (conf, CONF_PROXY_PREFIX "/secure_host"); - port = mateconf_client_get_int (conf, CONF_PROXY_PREFIX "/secure_port", NULL); - if (host && port) - { - char *proxy; - /* Even though it's https, the proxy scheme is 'http'. See bug #624440. */ - proxy = g_strdup_printf ("http://%s:%d/", host, port); - set_proxy_env (env_table, "https_proxy", proxy); - } - g_free (host); + gchar *host; + gint port; + + host = conf_get_string (conf, CONF_PROXY_PREFIX "/secure_host"); + port = mateconf_client_get_int (conf, CONF_PROXY_PREFIX "/secure_port", NULL); + if (host && port) + { + char *proxy; + /* Even though it's https, the proxy scheme is 'http'. See bug #624440. */ + proxy = g_strdup_printf ("http://%s:%d/", host, port); + set_proxy_env (env_table, "https_proxy", proxy); + } + g_free (host); } static void setup_ftp_proxy_env (GHashTable *env_table, MateConfClient *conf) { - gchar *host; - gint port; - - host = conf_get_string (conf, CONF_PROXY_PREFIX "/ftp_host"); - port = mateconf_client_get_int (conf, CONF_PROXY_PREFIX "/ftp_port", NULL); - if (host && port) - { - char *proxy; - /* Even though it's ftp, the proxy scheme is 'http'. See bug #624440. */ - proxy = g_strdup_printf ("http://%s:%d/", host, port); - set_proxy_env (env_table, "ftp_proxy", proxy); - } - g_free (host); + gchar *host; + gint port; + + host = conf_get_string (conf, CONF_PROXY_PREFIX "/ftp_host"); + port = mateconf_client_get_int (conf, CONF_PROXY_PREFIX "/ftp_port", NULL); + if (host && port) + { + char *proxy; + /* Even though it's ftp, the proxy scheme is 'http'. See bug #624440. */ + proxy = g_strdup_printf ("http://%s:%d/", host, port); + set_proxy_env (env_table, "ftp_proxy", proxy); + } + g_free (host); } static void setup_socks_proxy_env (GHashTable *env_table, MateConfClient *conf) { - gchar *host; - gint port; - - host = conf_get_string (conf, CONF_PROXY_PREFIX "/socks_host"); - port = mateconf_client_get_int (conf, CONF_PROXY_PREFIX "/socks_port", NULL); - if (host && port) - { - char *proxy; - proxy = g_strdup_printf ("socks://%s:%d/", host, port); - set_proxy_env (env_table, "all_proxy", proxy); - } - g_free (host); + gchar *host; + gint port; + + host = conf_get_string (conf, CONF_PROXY_PREFIX "/socks_host"); + port = mateconf_client_get_int (conf, CONF_PROXY_PREFIX "/socks_port", NULL); + if (host && port) + { + char *proxy; + proxy = g_strdup_printf ("socks://%s:%d/", host, port); + set_proxy_env (env_table, "all_proxy", proxy); + } + g_free (host); } static void setup_autoconfig_proxy_env (GHashTable *env_table, MateConfClient *conf) { - /* XXX Not sure what to do with this. See bug #596688. - gchar *url; - - url = conf_get_string (conf, CONF_PROXY_PREFIX "/autoconfig_url"); - if (url) - { - char *proxy; - proxy = g_strdup_printf ("pac+%s", url); - set_proxy_env (env_table, "http_proxy", proxy); - } - g_free (url); - */ + /* XXX Not sure what to do with this. See bug #596688. + gchar *url; + + url = conf_get_string (conf, CONF_PROXY_PREFIX "/autoconfig_url"); + if (url) + { + char *proxy; + proxy = g_strdup_printf ("pac+%s", url); + set_proxy_env (env_table, "http_proxy", proxy); + } + g_free (url); + */ } /** @@ -723,295 +733,296 @@ setup_autoconfig_proxy_env (GHashTable *env_table, void terminal_util_add_proxy_env (GHashTable *env_table) { - char *proxymode; - - MateConfClient *conf; - conf = mateconf_client_get_default (); - - /* If mode is not manual, nothing to set */ - proxymode = conf_get_string (conf, CONF_PROXY_PREFIX "/mode"); - if (proxymode && 0 == strcmp (proxymode, "manual")) - { - setup_http_proxy_env (env_table, conf); - setup_https_proxy_env (env_table, conf); - setup_ftp_proxy_env (env_table, conf); - setup_socks_proxy_env (env_table, conf); - } - else if (proxymode && 0 == strcmp (proxymode, "auto")) - { - setup_autoconfig_proxy_env (env_table, conf); - } - - g_free (proxymode); - g_object_unref (conf); + char *proxymode; + + MateConfClient *conf; + conf = mateconf_client_get_default (); + + /* If mode is not manual, nothing to set */ + proxymode = conf_get_string (conf, CONF_PROXY_PREFIX "/mode"); + if (proxymode && 0 == strcmp (proxymode, "manual")) + { + setup_http_proxy_env (env_table, conf); + setup_https_proxy_env (env_table, conf); + setup_ftp_proxy_env (env_table, conf); + setup_socks_proxy_env (env_table, conf); + } + else if (proxymode && 0 == strcmp (proxymode, "auto")) + { + setup_autoconfig_proxy_env (env_table, conf); + } + + g_free (proxymode); + g_object_unref (conf); } /* Bidirectional object/widget binding */ -typedef struct { - GObject *object; - const char *object_prop; - GtkWidget *widget; - gulong object_notify_id; - gulong widget_notify_id; - PropertyChangeFlags flags; +typedef struct +{ + GObject *object; + const char *object_prop; + GtkWidget *widget; + gulong object_notify_id; + gulong widget_notify_id; + PropertyChangeFlags flags; } PropertyChange; static void property_change_free (PropertyChange *change) { - g_signal_handler_disconnect (change->object, change->object_notify_id); + g_signal_handler_disconnect (change->object, change->object_notify_id); - g_slice_free (PropertyChange, change); + g_slice_free (PropertyChange, change); } static gboolean transform_boolean (gboolean input, PropertyChangeFlags flags) { - if (flags & FLAG_INVERT_BOOL) - input = !input; + if (flags & FLAG_INVERT_BOOL) + input = !input; - return input; + return input; } static void object_change_notify_cb (PropertyChange *change) { - GObject *object = change->object; - const char *object_prop = change->object_prop; - GtkWidget *widget = change->widget; - - g_signal_handler_block (widget, change->widget_notify_id); - - if (GTK_IS_RADIO_BUTTON (widget)) - { - int ovalue, rvalue; - - g_object_get (object, object_prop, &ovalue, NULL); - rvalue = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "enum-value")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), ovalue == rvalue); - } - else if (GTK_IS_TOGGLE_BUTTON (widget)) - { - gboolean enabled; - - g_object_get (object, object_prop, &enabled, NULL); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), - transform_boolean (enabled, change->flags)); - } - else if (GTK_IS_SPIN_BUTTON (widget)) - { - int value; - - g_object_get (object, object_prop, &value, NULL); - gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), value); - } - else if (GTK_IS_ENTRY (widget)) - { - char *text; - - g_object_get (object, object_prop, &text, NULL); - gtk_entry_set_text (GTK_ENTRY (widget), text ? text : ""); - g_free (text); - } - else if (GTK_IS_COMBO_BOX (widget)) - { - int value; - - g_object_get (object, object_prop, &value, NULL); - gtk_combo_box_set_active (GTK_COMBO_BOX (widget), value); - } - else if (GTK_IS_RANGE (widget)) - { - double value; - - g_object_get (object, object_prop, &value, NULL); - gtk_range_set_value (GTK_RANGE (widget), value); - } - else if (GTK_IS_COLOR_BUTTON (widget)) - { - GdkColor *color; - GdkColor old_color; - - g_object_get (object, object_prop, &color, NULL); - gtk_color_button_get_color (GTK_COLOR_BUTTON (widget), &old_color); - - if (color && !gdk_color_equal (color, &old_color)) - gtk_color_button_set_color (GTK_COLOR_BUTTON (widget), color); - if (color) - gdk_color_free (color); - } - else if (GTK_IS_FONT_BUTTON (widget)) - { - PangoFontDescription *font_desc; - char *font; - - g_object_get (object, object_prop, &font_desc, NULL); - if (!font_desc) - goto out; - - font = pango_font_description_to_string (font_desc); - gtk_font_button_set_font_name (GTK_FONT_BUTTON (widget), font); - g_free (font); - pango_font_description_free (font_desc); - } - else if (GTK_IS_FILE_CHOOSER (widget)) - { - char *name = NULL, *filename = NULL; - - g_object_get (object, object_prop, &name, NULL); - if (name) - filename = g_filename_from_utf8 (name, -1, NULL, NULL, NULL); - - if (filename) - gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), filename); - else - gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER (widget)); - g_free (filename); - g_free (name); - } + GObject *object = change->object; + const char *object_prop = change->object_prop; + GtkWidget *widget = change->widget; + + g_signal_handler_block (widget, change->widget_notify_id); + + if (GTK_IS_RADIO_BUTTON (widget)) + { + int ovalue, rvalue; + + g_object_get (object, object_prop, &ovalue, NULL); + rvalue = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "enum-value")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), ovalue == rvalue); + } + else if (GTK_IS_TOGGLE_BUTTON (widget)) + { + gboolean enabled; + + g_object_get (object, object_prop, &enabled, NULL); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), + transform_boolean (enabled, change->flags)); + } + else if (GTK_IS_SPIN_BUTTON (widget)) + { + int value; + + g_object_get (object, object_prop, &value, NULL); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), value); + } + else if (GTK_IS_ENTRY (widget)) + { + char *text; + + g_object_get (object, object_prop, &text, NULL); + gtk_entry_set_text (GTK_ENTRY (widget), text ? text : ""); + g_free (text); + } + else if (GTK_IS_COMBO_BOX (widget)) + { + int value; + + g_object_get (object, object_prop, &value, NULL); + gtk_combo_box_set_active (GTK_COMBO_BOX (widget), value); + } + else if (GTK_IS_RANGE (widget)) + { + double value; + + g_object_get (object, object_prop, &value, NULL); + gtk_range_set_value (GTK_RANGE (widget), value); + } + else if (GTK_IS_COLOR_BUTTON (widget)) + { + GdkColor *color; + GdkColor old_color; + + g_object_get (object, object_prop, &color, NULL); + gtk_color_button_get_color (GTK_COLOR_BUTTON (widget), &old_color); + + if (color && !gdk_color_equal (color, &old_color)) + gtk_color_button_set_color (GTK_COLOR_BUTTON (widget), color); + if (color) + gdk_color_free (color); + } + else if (GTK_IS_FONT_BUTTON (widget)) + { + PangoFontDescription *font_desc; + char *font; + + g_object_get (object, object_prop, &font_desc, NULL); + if (!font_desc) + goto out; + + font = pango_font_description_to_string (font_desc); + gtk_font_button_set_font_name (GTK_FONT_BUTTON (widget), font); + g_free (font); + pango_font_description_free (font_desc); + } + else if (GTK_IS_FILE_CHOOSER (widget)) + { + char *name = NULL, *filename = NULL; + + g_object_get (object, object_prop, &name, NULL); + if (name) + filename = g_filename_from_utf8 (name, -1, NULL, NULL, NULL); + + if (filename) + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), filename); + else + gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER (widget)); + g_free (filename); + g_free (name); + } out: - g_signal_handler_unblock (widget, change->widget_notify_id); + g_signal_handler_unblock (widget, change->widget_notify_id); } static void widget_change_notify_cb (PropertyChange *change) { - GObject *object = change->object; - const char *object_prop = change->object_prop; - GtkWidget *widget = change->widget; - - g_signal_handler_block (change->object, change->object_notify_id); - - if (GTK_IS_RADIO_BUTTON (widget)) - { - gboolean active; - int value; - - active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); - if (!active) - goto out; - - value = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "enum-value")); - g_object_set (object, object_prop, value, NULL); - } - else if (GTK_IS_TOGGLE_BUTTON (widget)) - { - gboolean enabled; - - enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); - g_object_set (object, object_prop, transform_boolean (enabled, change->flags), NULL); - } - else if (GTK_IS_SPIN_BUTTON (widget)) - { - int value; - - value = (int) gtk_spin_button_get_value (GTK_SPIN_BUTTON (widget)); - g_object_set (object, object_prop, value, NULL); - } - else if (GTK_IS_ENTRY (widget)) - { - const char *text; - - text = gtk_entry_get_text (GTK_ENTRY (widget)); - g_object_set (object, object_prop, text, NULL); - } - else if (GTK_IS_COMBO_BOX (widget)) - { - int value; - - value = gtk_combo_box_get_active (GTK_COMBO_BOX (widget)); - g_object_set (object, object_prop, value, NULL); - } - else if (GTK_IS_COLOR_BUTTON (widget)) - { - GdkColor color; - - gtk_color_button_get_color (GTK_COLOR_BUTTON (widget), &color); - g_object_set (object, object_prop, &color, NULL); - } - else if (GTK_IS_FONT_BUTTON (widget)) - { - PangoFontDescription *font_desc; - const char *font; - - font = gtk_font_button_get_font_name (GTK_FONT_BUTTON (widget)); - font_desc = pango_font_description_from_string (font); - g_object_set (object, object_prop, font_desc, NULL); - pango_font_description_free (font_desc); - } - else if (GTK_IS_RANGE (widget)) - { - double value; - - value = gtk_range_get_value (GTK_RANGE (widget)); - g_object_set (object, object_prop, value, NULL); - } - else if (GTK_IS_FILE_CHOOSER (widget)) - { - char *filename, *name = NULL; - - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget)); - if (filename) - name = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL); - - g_object_set (object, object_prop, name, NULL); - g_free (filename); - g_free (name); - } + GObject *object = change->object; + const char *object_prop = change->object_prop; + GtkWidget *widget = change->widget; + + g_signal_handler_block (change->object, change->object_notify_id); + + if (GTK_IS_RADIO_BUTTON (widget)) + { + gboolean active; + int value; + + active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); + if (!active) + goto out; + + value = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "enum-value")); + g_object_set (object, object_prop, value, NULL); + } + else if (GTK_IS_TOGGLE_BUTTON (widget)) + { + gboolean enabled; + + enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); + g_object_set (object, object_prop, transform_boolean (enabled, change->flags), NULL); + } + else if (GTK_IS_SPIN_BUTTON (widget)) + { + int value; + + value = (int) gtk_spin_button_get_value (GTK_SPIN_BUTTON (widget)); + g_object_set (object, object_prop, value, NULL); + } + else if (GTK_IS_ENTRY (widget)) + { + const char *text; + + text = gtk_entry_get_text (GTK_ENTRY (widget)); + g_object_set (object, object_prop, text, NULL); + } + else if (GTK_IS_COMBO_BOX (widget)) + { + int value; + + value = gtk_combo_box_get_active (GTK_COMBO_BOX (widget)); + g_object_set (object, object_prop, value, NULL); + } + else if (GTK_IS_COLOR_BUTTON (widget)) + { + GdkColor color; + + gtk_color_button_get_color (GTK_COLOR_BUTTON (widget), &color); + g_object_set (object, object_prop, &color, NULL); + } + else if (GTK_IS_FONT_BUTTON (widget)) + { + PangoFontDescription *font_desc; + const char *font; + + font = gtk_font_button_get_font_name (GTK_FONT_BUTTON (widget)); + font_desc = pango_font_description_from_string (font); + g_object_set (object, object_prop, font_desc, NULL); + pango_font_description_free (font_desc); + } + else if (GTK_IS_RANGE (widget)) + { + double value; + + value = gtk_range_get_value (GTK_RANGE (widget)); + g_object_set (object, object_prop, value, NULL); + } + else if (GTK_IS_FILE_CHOOSER (widget)) + { + char *filename, *name = NULL; + + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget)); + if (filename) + name = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL); + + g_object_set (object, object_prop, name, NULL); + g_free (filename); + g_free (name); + } out: - g_signal_handler_unblock (change->object, change->object_notify_id); + g_signal_handler_unblock (change->object, change->object_notify_id); } void terminal_util_bind_object_property_to_widget (GObject *object, - const char *object_prop, - GtkWidget *widget, - PropertyChangeFlags flags) + const char *object_prop, + GtkWidget *widget, + PropertyChangeFlags flags) { - PropertyChange *change; - const char *signal_name; - char notify_signal_name[64]; - - change = g_slice_new0 (PropertyChange); - - change->widget = widget; - g_assert (g_object_get_data (G_OBJECT (widget), "GT:PCD") == NULL); - g_object_set_data_full (G_OBJECT (widget), "GT:PCD", change, (GDestroyNotify) property_change_free); - - if (GTK_IS_TOGGLE_BUTTON (widget)) - signal_name = "notify::active"; - else if (GTK_IS_SPIN_BUTTON (widget)) - signal_name = "notify::value"; - else if (GTK_IS_ENTRY (widget)) - signal_name = "notify::text"; - else if (GTK_IS_COMBO_BOX (widget)) - signal_name = "notify::active"; - else if (GTK_IS_COLOR_BUTTON (widget)) - signal_name = "notify::color"; - else if (GTK_IS_FONT_BUTTON (widget)) - signal_name = "notify::font-name"; - else if (GTK_IS_RANGE (widget)) - signal_name = "value-changed"; - else if (GTK_IS_FILE_CHOOSER_BUTTON (widget)) - signal_name = "file-set"; - else if (GTK_IS_FILE_CHOOSER (widget)) - signal_name = "selection-changed"; - else - g_assert_not_reached (); - - change->widget_notify_id = g_signal_connect_swapped (widget, signal_name, G_CALLBACK (widget_change_notify_cb), change); - - change->object = object; - change->flags = flags; - change->object_prop = object_prop; - - g_snprintf (notify_signal_name, sizeof (notify_signal_name), "notify::%s", object_prop); - object_change_notify_cb (change); - change->object_notify_id = g_signal_connect_swapped (object, notify_signal_name, G_CALLBACK (object_change_notify_cb), change); + PropertyChange *change; + const char *signal_name; + char notify_signal_name[64]; + + change = g_slice_new0 (PropertyChange); + + change->widget = widget; + g_assert (g_object_get_data (G_OBJECT (widget), "GT:PCD") == NULL); + g_object_set_data_full (G_OBJECT (widget), "GT:PCD", change, (GDestroyNotify) property_change_free); + + if (GTK_IS_TOGGLE_BUTTON (widget)) + signal_name = "notify::active"; + else if (GTK_IS_SPIN_BUTTON (widget)) + signal_name = "notify::value"; + else if (GTK_IS_ENTRY (widget)) + signal_name = "notify::text"; + else if (GTK_IS_COMBO_BOX (widget)) + signal_name = "notify::active"; + else if (GTK_IS_COLOR_BUTTON (widget)) + signal_name = "notify::color"; + else if (GTK_IS_FONT_BUTTON (widget)) + signal_name = "notify::font-name"; + else if (GTK_IS_RANGE (widget)) + signal_name = "value-changed"; + else if (GTK_IS_FILE_CHOOSER_BUTTON (widget)) + signal_name = "file-set"; + else if (GTK_IS_FILE_CHOOSER (widget)) + signal_name = "selection-changed"; + else + g_assert_not_reached (); + + change->widget_notify_id = g_signal_connect_swapped (widget, signal_name, G_CALLBACK (widget_change_notify_cb), change); + + change->object = object; + change->flags = flags; + change->object_prop = object_prop; + + g_snprintf (notify_signal_name, sizeof (notify_signal_name), "notify::%s", object_prop); + object_change_notify_cb (change); + change->object_notify_id = g_signal_connect_swapped (object, notify_signal_name, G_CALLBACK (object_change_notify_cb), change); } #ifdef GDK_WINDOWING_X11 @@ -1022,106 +1033,106 @@ terminal_util_bind_object_property_to_widget (GObject *object, */ gboolean terminal_util_x11_get_net_wm_desktop (GdkWindow *window, - guint32 *desktop) + guint32 *desktop) { - GdkDisplay *display = gdk_drawable_get_display (window); - Atom type; - int format; - guchar *data; - gulong n_items, bytes_after; - gboolean result = FALSE; - - if (XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), - GDK_DRAWABLE_XID (window), - gdk_x11_get_xatom_by_name_for_display (display, - "_NET_WM_DESKTOP"), - 0, G_MAXLONG, False, AnyPropertyType, - &type, &format, &n_items, &bytes_after, &data) == Success && - type != None) - { - if (type == XA_CARDINAL && format == 32 && n_items == 1) + GdkDisplay *display = gdk_drawable_get_display (window); + Atom type; + int format; + guchar *data; + gulong n_items, bytes_after; + gboolean result = FALSE; + + if (XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), + GDK_DRAWABLE_XID (window), + gdk_x11_get_xatom_by_name_for_display (display, + "_NET_WM_DESKTOP"), + 0, G_MAXLONG, False, AnyPropertyType, + &type, &format, &n_items, &bytes_after, &data) == Success && + type != None) { - *desktop = *(gulong *)data; - result = TRUE; - } + if (type == XA_CARDINAL && format == 32 && n_items == 1) + { + *desktop = *(gulong *)data; + result = TRUE; + } - XFree (data); - } + XFree (data); + } - return result; + return result; } void terminal_util_x11_set_net_wm_desktop (GdkWindow *window, - guint32 desktop) + guint32 desktop) { - /* We can't change the current desktop before mapping our window, - * because GDK has the annoying habit of clearing _NET_WM_DESKTOP - * before mapping a GdkWindow, So we we have to do it after instead. - * - * However, doing it after is different whether or not we have a - * window manager (if we don't have a window manager, we have to - * set the _NET_WM_DESKTOP property so that it picks it up when - * it starts) - * - * http://bugzilla.mate.org/show_bug.cgi?id=586311 asks for GTK+ - * to just handle everything behind the scenes including the desktop. - */ - GdkScreen *screen = gdk_drawable_get_screen (window); - GdkDisplay *display = gdk_screen_get_display (screen); - Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); - char *wm_selection_name; - Atom wm_selection; - gboolean have_wm; - - wm_selection_name = g_strdup_printf ("WM_S%d", gdk_screen_get_number (screen)); - wm_selection = gdk_x11_get_xatom_by_name_for_display (display, wm_selection_name); - g_free(wm_selection_name); - - XGrabServer (xdisplay); - - have_wm = XGetSelectionOwner (xdisplay, wm_selection) != None; - - if (have_wm) - { - /* code borrowed from GDK - */ - XClientMessageEvent xclient; - - memset (&xclient, 0, sizeof (xclient)); - xclient.type = ClientMessage; - xclient.serial = 0; - xclient.send_event = True; - xclient.window = GDK_WINDOW_XWINDOW (window); - xclient.message_type = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_DESKTOP"); - xclient.format = 32; - - xclient.data.l[0] = desktop; - xclient.data.l[1] = 0; - xclient.data.l[2] = 0; - xclient.data.l[3] = 0; - xclient.data.l[4] = 0; - - XSendEvent (xdisplay, - GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (screen)), - False, - SubstructureRedirectMask | SubstructureNotifyMask, - (XEvent *)&xclient); - } - else - { - gulong long_desktop = desktop; - - XChangeProperty (xdisplay, - GDK_DRAWABLE_XID (window), - gdk_x11_get_xatom_by_name_for_display (display, - "_NET_WM_DESKTOP"), - XA_CARDINAL, 32, PropModeReplace, - (guchar *)&long_desktop, 1); - } - - XUngrabServer (xdisplay); - XFlush (xdisplay); + /* We can't change the current desktop before mapping our window, + * because GDK has the annoying habit of clearing _NET_WM_DESKTOP + * before mapping a GdkWindow, So we we have to do it after instead. + * + * However, doing it after is different whether or not we have a + * window manager (if we don't have a window manager, we have to + * set the _NET_WM_DESKTOP property so that it picks it up when + * it starts) + * + * http://bugzilla.mate.org/show_bug.cgi?id=586311 asks for GTK+ + * to just handle everything behind the scenes including the desktop. + */ + GdkScreen *screen = gdk_drawable_get_screen (window); + GdkDisplay *display = gdk_screen_get_display (screen); + Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); + char *wm_selection_name; + Atom wm_selection; + gboolean have_wm; + + wm_selection_name = g_strdup_printf ("WM_S%d", gdk_screen_get_number (screen)); + wm_selection = gdk_x11_get_xatom_by_name_for_display (display, wm_selection_name); + g_free(wm_selection_name); + + XGrabServer (xdisplay); + + have_wm = XGetSelectionOwner (xdisplay, wm_selection) != None; + + if (have_wm) + { + /* code borrowed from GDK + */ + XClientMessageEvent xclient; + + memset (&xclient, 0, sizeof (xclient)); + xclient.type = ClientMessage; + xclient.serial = 0; + xclient.send_event = True; + xclient.window = GDK_WINDOW_XWINDOW (window); + xclient.message_type = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_DESKTOP"); + xclient.format = 32; + + xclient.data.l[0] = desktop; + xclient.data.l[1] = 0; + xclient.data.l[2] = 0; + xclient.data.l[3] = 0; + xclient.data.l[4] = 0; + + XSendEvent (xdisplay, + GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (screen)), + False, + SubstructureRedirectMask | SubstructureNotifyMask, + (XEvent *)&xclient); + } + else + { + gulong long_desktop = desktop; + + XChangeProperty (xdisplay, + GDK_DRAWABLE_XID (window), + gdk_x11_get_xatom_by_name_for_display (display, + "_NET_WM_DESKTOP"), + XA_CARDINAL, 32, PropModeReplace, + (guchar *)&long_desktop, 1); + } + + XUngrabServer (xdisplay); + XFlush (xdisplay); } /* Asks the window manager to turn off the "demands attention" state on the window. @@ -1133,29 +1144,29 @@ terminal_util_x11_set_net_wm_desktop (GdkWindow *window, void terminal_util_x11_clear_demands_attention (GdkWindow *window) { - GdkScreen *screen = gdk_drawable_get_screen (window); - GdkDisplay *display = gdk_screen_get_display (screen); - XClientMessageEvent xclient; - - memset (&xclient, 0, sizeof (xclient)); - xclient.type = ClientMessage; - xclient.serial = 0; - xclient.send_event = True; - xclient.window = GDK_WINDOW_XWINDOW (window); - xclient.message_type = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE"); - xclient.format = 32; - - xclient.data.l[0] = 0; /* _NET_WM_STATE_REMOVE */ - xclient.data.l[1] = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_DEMANDS_ATTENTION"); - xclient.data.l[2] = 0; - xclient.data.l[3] = 0; - xclient.data.l[4] = 0; - - XSendEvent (GDK_DISPLAY_XDISPLAY (display), - GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (screen)), - False, - SubstructureRedirectMask | SubstructureNotifyMask, - (XEvent *)&xclient); + GdkScreen *screen = gdk_drawable_get_screen (window); + GdkDisplay *display = gdk_screen_get_display (screen); + XClientMessageEvent xclient; + + memset (&xclient, 0, sizeof (xclient)); + xclient.type = ClientMessage; + xclient.serial = 0; + xclient.send_event = True; + xclient.window = GDK_WINDOW_XWINDOW (window); + xclient.message_type = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE"); + xclient.format = 32; + + xclient.data.l[0] = 0; /* _NET_WM_STATE_REMOVE */ + xclient.data.l[1] = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_DEMANDS_ATTENTION"); + xclient.data.l[2] = 0; + xclient.data.l[3] = 0; + xclient.data.l[4] = 0; + + XSendEvent (GDK_DISPLAY_XDISPLAY (display), + GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (screen)), + False, + SubstructureRedirectMask | SubstructureNotifyMask, + (XEvent *)&xclient); } /* Check if a GdkWindow is minimized. This is a workaround for a @@ -1170,44 +1181,44 @@ terminal_util_x11_clear_demands_attention (GdkWindow *window) gboolean terminal_util_x11_window_is_minimized (GdkWindow *window) { - GdkDisplay *display = gdk_drawable_get_display (window); - - Atom type; - gint format; - gulong nitems; - gulong bytes_after; - guchar *data; - Atom *atoms = NULL; - gulong i; - - gboolean minimized = FALSE; - - type = None; - gdk_error_trap_push (); - XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (window), - gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE"), - 0, G_MAXLONG, False, XA_ATOM, &type, &format, &nitems, - &bytes_after, &data); - gdk_error_trap_pop (); - - if (type != None) - { - Atom hidden_atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_HIDDEN"); + GdkDisplay *display = gdk_drawable_get_display (window); + + Atom type; + gint format; + gulong nitems; + gulong bytes_after; + guchar *data; + Atom *atoms = NULL; + gulong i; + + gboolean minimized = FALSE; + + type = None; + gdk_error_trap_push (); + XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (window), + gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE"), + 0, G_MAXLONG, False, XA_ATOM, &type, &format, &nitems, + &bytes_after, &data); + gdk_error_trap_pop (); + + if (type != None) + { + Atom hidden_atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_HIDDEN"); - atoms = (Atom *)data; + atoms = (Atom *)data; - for (i = 0; i < nitems; i++) - { - if (atoms[i] == hidden_atom) - minimized = TRUE; + for (i = 0; i < nitems; i++) + { + if (atoms[i] == hidden_atom) + minimized = TRUE; - ++i; - } + ++i; + } - XFree (atoms); - } + XFree (atoms); + } - return minimized; + return minimized; } #endif /* GDK_WINDOWING_X11 */ |