static void xfce_keyboard_layout_helper_process_xmodmap (void) { const gchar *xmodmap_path; xmodmap_path = g_build_filename (xfce_get_homedir (), ".Xmodmap", NULL); if (g_file_test (xmodmap_path, G_FILE_TEST_EXISTS)) { /* There is a .Xmodmap file, try to use it */ const gchar *xmodmap_command; GError *error = NULL; xmodmap_command = g_strconcat ("xmodmap ", xmodmap_path, NULL); xfsettings_dbg (XFSD_DEBUG_KEYBOARD_LAYOUT, "spawning \"%s\"", xmodmap_command); /* Launch the xmodmap command and only print errors when in debugging mode */ if (!g_spawn_command_line_async (xmodmap_command, &error)) { DBG ("Xmodmap call failed: %s", error->message); g_error_free (error); } } g_free ((gchar*) xmodmap_path); }
/* mark the window_counter as having a main window */ window_counter = -42; } #if 0 /* INITIAL_DIRECTORY_OPTION */ const gchar * xfburn_main_get_initial_dir () { if (initial_dir) return initial_dir; else return xfce_get_homedir (); }
/** * xfce_get_homefile_r: * @buffer : pointer to a user provided destination buffer. * @length : size of @buffer in bytes. * @format : printf style format string. * @Varargs : the arguments to substitute in the output. * * Similar in functionality to #xfce_get_homefile, but uses a user * defined @buffer instead of allocating a new buffer. * * xfce_get_homefile_r uses safe string operations, that says, it garanties * that the resulting string is always zero terminated, as long as the * @length is greater than zero. * * Return value: pointer to @buffer. **/ gchar* xfce_get_homefile_r (gchar *buffer, size_t len, const gchar *format, ...) { gchar *ptr; va_list ap; va_start (ap, format); ptr = internal_get_file_r (xfce_get_homedir (), buffer, len, format, ap); va_end (ap); return ptr; }
/** * xfce_expand_variables: * @command : Input string or %NULL. * @envp : Addition environment variables to take into account. These * variables have higher priority than the ones in the process's * environment. * * Expands shell like environment variables and tilde (~/ and ~user/ are both supported) * in @command. * * Return value: %NULL on error, else the string, which should be freed using * g_free() when no longer needed. * * Since: 4.2 **/ gchar * xfce_expand_variables (const gchar *command, gchar **envp) { GString *buf; const gchar *start; gchar *variable; const gchar *p; const gchar *value; gchar **ep; guint len; #ifdef HAVE_GETPWNAM struct passwd *pw; gchar *username; #endif if (G_UNLIKELY (command == NULL)) return NULL; buf = g_string_sized_new (strlen (command)); for (p = command; *p != '\0'; ++p) { continue_without_increase: if (*p == '~' && (p == command || xfce_is_valid_tilde_prefix (p - 1))) { /* walk to the end of the string or to a directory separator */ for (start = ++p; *p != '\0' && *p != G_DIR_SEPARATOR; ++p); if (G_LIKELY (start == p)) { /* add the current user directory */ buf = g_string_append (buf, xfce_get_homedir ()); } else { #ifdef HAVE_GETPWNAM username = g_strndup (start, p - start); pw = getpwnam (username); g_free (username); /* add the users' home directory if found, fallback to the * not-expanded string */ if (pw != NULL && pw->pw_dir != NULL) buf = g_string_append (buf, pw->pw_dir); else #endif buf = g_string_append_len (buf, start - 1, p - start + 1); } /* we are either at the end of the string or *p is a separator, * so continue to add it to the result buffer */ } else if (*p == '$') { /* walk to the end of a valid variable name */ for (start = ++p; *p != '\0' && (g_ascii_isalnum (*p) || *p == '_'); ++p); if (start < p) { value = NULL; len = p - start; /* lookup the variable in the environment supplied by the user */ if (envp != NULL) { /* format is NAME=VALUE */ for (ep = envp; *ep != NULL; ++ep) if (strncmp (*ep, start, len) == 0 && (*ep)[len] == '=') { value = (*ep) + len + 1; break; } } /* fallback to the environment */ if (value == NULL) { variable = g_strndup (start, len); value = g_getenv (variable); g_free (variable); } if (G_LIKELY (value != NULL)) { buf = g_string_append (buf, value); } else { /* the variable name was valid, but no value was * found, insert nothing and continue */ } /* *p is at the start of the charater after the variable, * so continue scanning without advancing the string offset * so two variables are replaced properly */ goto continue_without_increase; } else { /* invalid variable format, add the * $ character and continue */ --p; } } buf = g_string_append_c (buf, *p); } return g_string_free (buf, FALSE); }
/** * thunar_vfs_expand_filename: * @filename : a local filename. * @error : return location for errors or %NULL. * * Takes a user-typed @filename and expands a tilde at the * beginning of the @filename. * * The caller is responsible to free the returned string using * g_free() when no longer needed. * * Return value: the expanded @filename or %NULL on error. **/ gchar* thunar_vfs_expand_filename (const gchar *filename, GError **error) { struct passwd *passwd; const gchar *replacement; const gchar *remainder; const gchar *slash; gchar *username; g_return_val_if_fail (filename != NULL, NULL); /* check if we have a valid (non-empty!) filename */ if (G_UNLIKELY (*filename == '\0')) { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("Invalid path")); return NULL; } /* check if we start with a '~' */ if (G_LIKELY (*filename != '~')) return g_strdup (filename); /* examine the remainder of the filename */ remainder = filename + 1; /* if we have only the slash, then we want the home dir */ if (G_UNLIKELY (*remainder == '\0')) return g_strdup (xfce_get_homedir ()); /* lookup the slash */ for (slash = remainder; *slash != '\0' && *slash != G_DIR_SEPARATOR; ++slash) ; /* check if a username was given after the '~' */ if (G_LIKELY (slash == remainder)) { /* replace the tilde with the home dir */ replacement = xfce_get_homedir (); } else { /* lookup the pwd entry for the username */ username = g_strndup (remainder, slash - remainder); passwd = getpwnam (username); g_free (username); /* check if we have a valid entry */ if (G_UNLIKELY (passwd == NULL)) { username = g_strndup (remainder, slash - remainder); g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("Unknown user \"%s\""), username); g_free (username); return NULL; } /* use the homedir of the specified user */ replacement = passwd->pw_dir; } /* generate the filename */ return g_build_filename (replacement, slash + 1, NULL); }
/** * thunar_util_expand_filename: * @filename : a local filename. * @working_directory : #GFile of the current working directory. * @error : return location for errors or %NULL. * * Takes a user-typed @filename and expands a tilde at the * beginning of the @filename. It also resolves paths prefixed with * '.' using the current working directory. * * The caller is responsible to free the returned string using * g_free() when no longer needed. * * Return value: the expanded @filename or %NULL on error. **/ gchar * thunar_util_expand_filename (const gchar *filename, GFile *working_directory, GError **error) { struct passwd *passwd; const gchar *replacement; const gchar *remainder; const gchar *slash; gchar *username; gchar *pwd; gchar *result = NULL; g_return_val_if_fail (filename != NULL, NULL); /* check if we have a valid (non-empty!) filename */ if (G_UNLIKELY (*filename == '\0')) { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("Invalid path")); return NULL; } /* check if we start with a '~' */ if (*filename == '~') { /* examine the remainder of the filename */ remainder = filename + 1; /* if we have only the slash, then we want the home dir */ if (G_UNLIKELY (*remainder == '\0')) return g_strdup (xfce_get_homedir ()); /* lookup the slash */ for (slash = remainder; *slash != '\0' && *slash != G_DIR_SEPARATOR; ++slash); /* check if a username was given after the '~' */ if (G_LIKELY (slash == remainder)) { /* replace the tilde with the home dir */ replacement = xfce_get_homedir (); } else { /* lookup the pwd entry for the username */ username = g_strndup (remainder, slash - remainder); passwd = getpwnam (username); g_free (username); /* check if we have a valid entry */ if (G_UNLIKELY (passwd == NULL)) { username = g_strndup (remainder, slash - remainder); g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("Unknown user \"%s\""), username); g_free (username); return NULL; } /* use the homedir of the specified user */ replacement = passwd->pw_dir; } /* generate the filename */ return g_build_filename (replacement, slash, NULL); } else if (*filename == '.') { /* examine the remainder of the filename */ remainder = filename + 1; /* transform working directory into a filename string */ if (G_LIKELY (working_directory != NULL)) { pwd = g_file_get_path (working_directory); /* if we only have the slash then we want the working directory only */ if (G_UNLIKELY (*remainder == '\0')) return pwd; /* concatenate working directory and remainder */ result = g_build_filename (pwd, remainder, G_DIR_SEPARATOR_S, NULL); /* free the working directory string */ g_free (pwd); } else result = g_strdup (filename); /* return the resulting path string */ return result; } return g_strdup (filename); }
XfdesktopSpecialFileIcon * xfdesktop_special_file_icon_new(XfdesktopSpecialFileIconType type, GdkScreen *screen) { XfdesktopSpecialFileIcon *special_file_icon; GFile *file = NULL; switch(type) { case XFDESKTOP_SPECIAL_FILE_ICON_FILESYSTEM: file = g_file_new_for_uri("file:///"); break; case XFDESKTOP_SPECIAL_FILE_ICON_HOME: file = g_file_new_for_path(xfce_get_homedir()); break; case XFDESKTOP_SPECIAL_FILE_ICON_TRASH: file = g_file_new_for_uri("trash:///"); break; default: g_return_val_if_reached(NULL); } special_file_icon = g_object_new(XFDESKTOP_TYPE_SPECIAL_FILE_ICON, NULL); special_file_icon->priv->type = type; special_file_icon->priv->gscreen = screen; special_file_icon->priv->file = file; special_file_icon->priv->file_info = g_file_query_info(file, XFDESKTOP_FILE_INFO_NAMESPACE, G_FILE_QUERY_INFO_NONE, NULL, NULL); if(!special_file_icon->priv->file_info) { g_object_unref(special_file_icon); return NULL; } /* query file system information from GIO */ special_file_icon->priv->filesystem_info = g_file_query_filesystem_info(special_file_icon->priv->file, XFDESKTOP_FILESYSTEM_INFO_NAMESPACE, NULL, NULL); /* update the trash full state */ if(type == XFDESKTOP_SPECIAL_FILE_ICON_TRASH) xfdesktop_special_file_icon_update_trash_count(special_file_icon); g_signal_connect_swapped(G_OBJECT(gtk_icon_theme_get_for_screen(screen)), "changed", G_CALLBACK(xfdesktop_icon_invalidate_pixbuf), special_file_icon); special_file_icon->priv->monitor = g_file_monitor(special_file_icon->priv->file, G_FILE_MONITOR_NONE, NULL, NULL); if(special_file_icon->priv->monitor) { g_signal_connect(special_file_icon->priv->monitor, "changed", G_CALLBACK(xfdesktop_special_file_icon_changed), special_file_icon); } return special_file_icon; }