Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <gtk/gtk.h>
- #include <gio/gio.h>
- #include <gdk/gdkx.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define DESKTOP_PATH g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP)
- enum {
- COL_DISPLAY_NAME,
- COL_PIXBUF,
- COL_FILE_PATH,
- NUM_COLS
- };
- typedef struct {
- GtkWidget *window;
- GtkWidget *icon_view;
- GtkWidget *scrolled_window;
- GtkListStore *store;
- } DesktopManager;
- static void set_background_color(GtkWidget *widget) {
- GdkRGBA color;
- GtkStyleContext *context;
- GtkCssProvider *provider;
- provider = gtk_css_provider_new();
- gtk_css_provider_load_from_data(provider,
- "iconview.view { background-color: #316da5; color: #fff }", -1, NULL);
- context = gtk_widget_get_style_context(widget);
- gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
- }
- static void create_desktop_icon(DesktopManager *dm, const char *filename);
- static void on_item_activated(GtkIconView *icon_view, GtkTreePath *path, gpointer user_data);
- static void load_desktop_icons(DesktopManager *dm);
- static GdkPixbuf *load_icon_from_desktop_file(const char *desktop_file_path, int size);
- static char *get_desktop_file_name(const char *desktop_file_path);
- static GdkPixbuf *load_icon_from_desktop_file(const char *desktop_file_path, int size) {
- GKeyFile *key_file;
- GdkPixbuf *pixbuf = NULL;
- char *icon_name;
- GError *error = NULL;
- key_file = g_key_file_new();
- if (!g_key_file_load_from_file(key_file, desktop_file_path, G_KEY_FILE_NONE, &error)) {
- g_print("Error loading .desktop file: %s\n", error->message);
- g_error_free(error);
- g_key_file_free(key_file);
- return NULL;
- }
- icon_name = g_key_file_get_string(key_file, "Desktop Entry", "Icon", NULL);
- if (icon_name) {
- GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
- if (g_path_is_absolute(icon_name)) {
- pixbuf = gdk_pixbuf_new_from_file_at_size(icon_name, size, size, NULL);
- } else {
- pixbuf = gtk_icon_theme_load_icon(icon_theme, icon_name, size, 0, NULL);
- }
- g_free(icon_name);
- }
- g_key_file_free(key_file);
- return pixbuf;
- }
- static char *get_desktop_file_name(const char *desktop_file_path) {
- GKeyFile *key_file;
- char *name = NULL;
- GError *error = NULL;
- key_file = g_key_file_new();
- if (g_key_file_load_from_file(key_file, desktop_file_path, G_KEY_FILE_NONE, &error)) {
- name = g_key_file_get_string(key_file, "Desktop Entry", "Name", NULL);
- }
- if (error) {
- g_error_free(error);
- }
- g_key_file_free(key_file);
- return name ? name : g_strdup(g_filename_display_basename(desktop_file_path));
- }
- static void create_desktop_icon(DesktopManager *dm, const char *filename) {
- GtkTreeIter iter;
- GFile *file;
- GFileInfo *file_info;
- GIcon *gicon;
- GdkPixbuf *pixbuf = NULL;
- char *file_path;
- char *display_name;
- file_path = g_build_filename(DESKTOP_PATH, filename, NULL);
- file = g_file_new_for_path(file_path);
- file_info = g_file_query_info(file, G_FILE_ATTRIBUTE_STANDARD_ICON "," G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, G_FILE_QUERY_INFO_NONE, NULL, NULL);
- gicon = g_file_info_get_icon(file_info);
- display_name = g_strdup(g_file_info_get_display_name(file_info));
- if (g_str_has_suffix(filename, ".desktop")) {
- pixbuf = load_icon_from_desktop_file(file_path, 48);
- char *desktop_name = get_desktop_file_name(file_path);
- if (desktop_name) {
- g_free(display_name);
- display_name = desktop_name;
- } else {
- display_name = g_strndup(display_name, strlen(display_name) - 8); // Remove ".desktop"
- }
- }
- if (!pixbuf) {
- GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
- pixbuf = gtk_icon_theme_load_icon(icon_theme, "text-x-generic", 48, 0, NULL);
- if (G_IS_THEMED_ICON(gicon)) {
- const gchar* const* icon_names = g_themed_icon_get_names(G_THEMED_ICON(gicon));
- if (icon_names) {
- int i;
- for (i = 0; icon_names[i] != NULL; i++) {
- GdkPixbuf *temp_pixbuf = gtk_icon_theme_load_icon(icon_theme, icon_names[i], 48, 0, NULL);
- if (temp_pixbuf) {
- if (pixbuf) g_object_unref(pixbuf);
- pixbuf = temp_pixbuf;
- break;
- }
- }
- }
- }
- }
- gtk_list_store_append(dm->store, &iter);
- gtk_list_store_set(dm->store, &iter,
- COL_DISPLAY_NAME, filename,
- COL_PIXBUF, pixbuf,
- COL_FILE_PATH, file_path,
- -1);
- g_object_unref(file);
- g_object_unref(file_info);
- g_object_unref(pixbuf);
- g_free(file_path);
- }
- static void on_item_activated(GtkIconView *icon_view, GtkTreePath *path, gpointer user_data) {
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *file_path;
- model = gtk_icon_view_get_model(icon_view);
- if (gtk_tree_model_get_iter(model, &iter, path)) {
- gtk_tree_model_get(model, &iter, COL_FILE_PATH, &file_path, -1);
- gchar *file_extension = strrchr(file_path, '.');
- if (file_extension) {
- file_extension = g_ascii_strdown(file_extension, -1);
- if (g_strcmp0(file_extension, ".desktop") == 0) {
- gchar *command = g_strdup_printf("gio launch \"%s\"", file_path);
- system(command);
- g_free(command);
- } else if (g_strcmp0(file_extension, ".jpg") == 0 || g_strcmp0(file_extension, ".jpeg") == 0) {
- gchar *command = g_strdup_printf("eom \"%s\"", file_path);
- system(command);
- g_free(command);
- } else if (g_strcmp0(file_extension, ".html") == 0 || g_strcmp0(file_extension, ".htm") == 0) {
- gchar *command = g_strdup_printf("firefox \"%s\"", file_path);
- system(command);
- g_free(command);
- } else {
- gchar *command = g_strdup_printf("xdg-open \"%s\"", file_path);
- system(command);
- g_free(command);
- }
- g_free(file_extension);
- } else {
- // If no file extension, use xdg-open
- gchar *command = g_strdup_printf("xdg-open \"%s\"", file_path);
- system(command);
- g_free(command);
- }
- g_free(file_path);
- }
- }
- static gint sort_items(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) {
- gchar *name_a, *name_b;
- gint result;
- gtk_tree_model_get(model, a, COL_DISPLAY_NAME, &name_a, -1);
- gtk_tree_model_get(model, b, COL_DISPLAY_NAME, &name_b, -1);
- result = g_utf8_collate(name_a, name_b);
- g_free(name_a);
- g_free(name_b);
- return result;
- }
- static void load_desktop_icons(DesktopManager *dm) {
- GDir *dir;
- const gchar *filename;
- dir = g_dir_open(DESKTOP_PATH, 0, NULL);
- if (dir == NULL) {
- g_print("Failed to open desktop directory\n");
- return;
- }
- while ((filename = g_dir_read_name(dir)) != NULL) {
- char *file_path = g_build_filename(DESKTOP_PATH, filename, NULL);
- if (g_file_test(file_path, G_FILE_TEST_IS_REGULAR)) {
- create_desktop_icon(dm, filename);
- }
- g_free(file_path);
- }
- g_dir_close(dir);
- // Sort the items
- gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(dm->store), COL_DISPLAY_NAME, sort_items, NULL, NULL);
- gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(dm->store), COL_DISPLAY_NAME, GTK_SORT_ASCENDING);
- }
- static void activate(GtkApplication *app, gpointer user_data) {
- DesktopManager *dm = g_new(DesktopManager, 1);
- dm->window = gtk_application_window_new(app);
- gtk_window_set_title(GTK_WINDOW(dm->window), "Desktop Manager");
- gtk_window_maximize(GTK_WINDOW(dm->window));
- gtk_window_set_type_hint(GTK_WINDOW(dm->window), GDK_WINDOW_TYPE_HINT_DESKTOP);
- dm->scrolled_window = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(dm->scrolled_window),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_ALWAYS);
- gtk_container_add(GTK_CONTAINER(dm->window), dm->scrolled_window);
- gtk_widget_show(dm->scrolled_window);
- dm->store = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING);
- dm->icon_view = gtk_icon_view_new_with_model(GTK_TREE_MODEL(dm->store));
- gtk_icon_view_set_text_column(GTK_ICON_VIEW(dm->icon_view), COL_DISPLAY_NAME);
- gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(dm->icon_view), COL_PIXBUF);
- gtk_icon_view_set_item_width(GTK_ICON_VIEW(dm->icon_view), 80);
- gtk_icon_view_set_column_spacing(GTK_ICON_VIEW(dm->icon_view), 20);
- gtk_icon_view_set_row_spacing(GTK_ICON_VIEW(dm->icon_view), 20);
- g_signal_connect(dm->icon_view, "item-activated", G_CALLBACK(on_item_activated), NULL);
- set_background_color(dm->icon_view);
- gtk_container_add(GTK_CONTAINER(dm->scrolled_window), dm->icon_view);
- load_desktop_icons(dm);
- gtk_widget_show_all(dm->window);
- }
- int main(int argc, char **argv) {
- GtkApplication *app;
- int status;
- app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
- g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
- status = g_application_run(G_APPLICATION(app), argc, argv);
- g_object_unref(app);
- return status;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement