diff options
Diffstat (limited to 'src')
25 files changed, 985 insertions, 257 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 391df3a2..d36b37e5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -38,6 +38,11 @@ LDADD = \ -lnotify $(NULL) +if ENABLE_WAYLAND +LDADD += \ + $(WAYLAND_LIBS) +endif + dbus_freedesktop_built_sources = \ caja-freedesktop-generated.c \ caja-freedesktop-generated.h diff --git a/src/caja-application.c b/src/caja-application.c index 8f920108..b7d8ff81 100644 --- a/src/caja-application.c +++ b/src/caja-application.c @@ -32,6 +32,7 @@ #include <unistd.h> #include <fcntl.h> +#include <libxml/parser.h> #include <libxml/xmlsave.h> #include <glib/gstdio.h> #include <glib/gi18n.h> @@ -283,6 +284,7 @@ open_tabs (CajaApplication *application, CajaApplication *self = CAJA_APPLICATION (application); CajaWindow *window; gchar *uri = NULL; + guint i; /* monitor the preference to use browser or spatial windows */ /* connect before trying to read or this preference won't be read by root or after change */ @@ -307,7 +309,7 @@ open_tabs (CajaApplication *application, g_debug ("Opening new tab at uri %s\n", uri); caja_window_go_to (window, locations[0]); g_free (uri); - for (int i = 1; i< n_files;i++) { + for (i = 1; i < n_files; i++) { /* open tabs in reverse order because each * tab is opened before the previous one */ guint tab = n_files-i; @@ -640,25 +642,34 @@ get_desktop_manager_selection (GdkDisplay *display) g_snprintf (selection_name, sizeof (selection_name), "_NET_DESKTOP_MANAGER_S0"); selection_atom = gdk_atom_intern (selection_name, FALSE); - - selection_owner = XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display), + if (GDK_IS_X11_DISPLAY (display)) + { + selection_owner = XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display), gdk_x11_atom_to_xatom_for_display (display, selection_atom)); - if (selection_owner != None) - { + if (selection_owner != None) + { return NULL; + } } - selection_widget = gtk_invisible_new_for_screen (gdk_display_get_default_screen (display)); /* We need this for gdk_x11_get_server_time() */ gtk_widget_add_events (selection_widget, GDK_PROPERTY_CHANGE_MASK); - if (gtk_selection_owner_set_for_display (display, + if (GDK_IS_X11_DISPLAY (display)) + { + if (gtk_selection_owner_set_for_display (display, selection_widget, selection_atom, gdk_x11_get_server_time (gtk_widget_get_window (selection_widget)))) + { + g_signal_connect (selection_widget, "selection_get", + G_CALLBACK (selection_get_cb), NULL); + return selection_widget; + } + } + else { - g_signal_connect (selection_widget, "selection_get", G_CALLBACK (selection_get_cb), NULL); return selection_widget; @@ -1944,8 +1955,7 @@ caja_application_local_command_line (GApplication *application, { "select", 's', 0, G_OPTION_ARG_NONE, &select_uris, N_("Select specified URI in parent folder."), NULL }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, N_("[URI...]") }, - - { NULL } + { NULL, '\0', 0, G_OPTION_ARG_NONE, NULL, NULL, NULL } }; GOptionContext *context; GError *error = NULL; @@ -2237,8 +2247,6 @@ static void caja_application_startup (GApplication *app) { CajaApplication *self = CAJA_APPLICATION (app); - gboolean exit_with_last_window; - exit_with_last_window = TRUE; /* chain up to the GTK+ implementation early, so gtk_init() * is called for us. @@ -2328,6 +2336,7 @@ caja_application_startup (GApplication *app) if (running_in_mate () && !running_as_root()) { GApplication *instance; + gboolean exit_with_last_window; exit_with_last_window = g_settings_get_boolean (caja_preferences, CAJA_PREFERENCES_EXIT_WITH_LAST_WINDOW); diff --git a/src/caja-bookmarks-sidebar.c b/src/caja-bookmarks-sidebar.c index fdff6e5d..57aa563d 100644 --- a/src/caja-bookmarks-sidebar.c +++ b/src/caja-bookmarks-sidebar.c @@ -328,10 +328,7 @@ loading_uri_callback (CajaWindowInfo *window, gtk_tree_model_get (model, &iter, BOOKMARKS_SIDEBAR_COLUMN_BOOKMARK, &bookmark, -1); - - uri = caja_bookmark_get_uri (bookmark); - - if (uri != NULL) + if (bookmark && ((uri = caja_bookmark_get_uri (bookmark)) != NULL)) { if (strcmp (uri, location) == 0) { diff --git a/src/caja-connect-server-dialog.c b/src/caja-connect-server-dialog.c index d97bcb0a..66b2001a 100644 --- a/src/caja-connect-server-dialog.c +++ b/src/caja-connect-server-dialog.c @@ -92,6 +92,12 @@ enum RESPONSE_CONNECT }; +enum { + COL_TYPE_COMBO_INDEX = 0, + COL_TYPE_COMBO_DESCRIPTION, + COL_TYPE_COMBO_NUM +}; + struct MethodInfo { const char *scheme; @@ -532,7 +538,7 @@ connect_dialog_connect_to_server (CajaConnectServerDialog *dialog) gtk_combo_box_get_active_iter (GTK_COMBO_BOX (dialog->details->type_combo), &iter); gtk_tree_model_get (gtk_combo_box_get_model (GTK_COMBO_BOX (dialog->details->type_combo)), &iter, 0, &index, -1); - g_assert (index < G_N_ELEMENTS (methods) && index >= 0); + g_assert (index >= 0 && ((gsize) index) < G_N_ELEMENTS (methods)); meth = &(methods[index]); server = gtk_editable_get_chars (GTK_EDITABLE (dialog->details->server_entry), 0, -1); @@ -778,7 +784,7 @@ connect_dialog_setup_for_type (CajaConnectServerDialog *dialog) gtk_tree_model_get (gtk_combo_box_get_model (GTK_COMBO_BOX (dialog->details->type_combo)), &iter, 0, &index, -1); - g_assert (index < G_N_ELEMENTS (methods) && index >= 0); + g_assert (index >= 0 && ((gsize) index) < G_N_ELEMENTS (methods)); meth = &(methods[index]); g_object_set (dialog->details->share_entry, @@ -847,7 +853,7 @@ caja_connect_server_dialog_init (CajaConnectServerDialog *dialog) GtkListStore *store; GtkCellRenderer *renderer; gchar *str; - int i; + gsize i; dialog->details = caja_connect_server_dialog_get_instance_private (dialog); @@ -932,13 +938,16 @@ caja_connect_server_dialog_init (CajaConnectServerDialog *dialog) dialog->details->type_combo = combo = gtk_combo_box_new (); /* each row contains: method index, textual description */ - store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING); + store = gtk_list_store_new (COL_TYPE_COMBO_NUM, + G_TYPE_INT, /* COL_TYPE_COMBO_INDEX */ + G_TYPE_STRING); /* COL_TYPE_COMBO_DESCRIPTION */ gtk_combo_box_set_model (GTK_COMBO_BOX (combo), GTK_TREE_MODEL (store)); g_object_unref (store); renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE); - gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo), renderer, "text", 1); + gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo), renderer, "text", + COL_TYPE_COMBO_DESCRIPTION); for (i = 0; i < G_N_ELEMENTS (methods); i++) { @@ -971,8 +980,8 @@ caja_connect_server_dialog_init (CajaConnectServerDialog *dialog) gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, - 0, i, - 1, get_method_description (&(methods[i])), + COL_TYPE_COMBO_INDEX, (int) i, + COL_TYPE_COMBO_DESCRIPTION, get_method_description (&(methods[i])), -1); if (methods[i].flags & DEFAULT_METHOD) diff --git a/src/caja-desktop-window.c b/src/caja-desktop-window.c index 061b11b7..771ddd53 100644 --- a/src/caja-desktop-window.c +++ b/src/caja-desktop-window.c @@ -29,7 +29,10 @@ #include <gtk/gtk.h> #include <gio/gio.h> #include <glib/gi18n.h> - +#ifdef HAVE_WAYLAND +#include <gdk/gdkwayland.h> +#include <gtk-layer-shell/gtk-layer-shell.h> +#endif #include <eel/eel-background.h> #include <eel/eel-vfs-extensions.h> @@ -113,6 +116,7 @@ caja_desktop_window_init (CajaDesktopWindow *window) gtk_widget_hide (CAJA_WINDOW (window)->details->statusbar); gtk_widget_hide (CAJA_WINDOW (window)->details->menubar); + gtk_window_set_decorated (GTK_WINDOW (window), FALSE); /* Don't allow close action on desktop */ G_GNUC_BEGIN_IGNORE_DEPRECATIONS; @@ -155,12 +159,24 @@ caja_desktop_window_screen_size_changed (GdkScreen *screen, CajaDesktopWindow *window) { int width_request, height_request; - int scale; - - scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen)); - width_request = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; - height_request = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; + GdkDisplay *display = gdk_screen_get_display (screen); + if (GDK_IS_X11_DISPLAY (display)) + { + GdkWindow *root_window; + root_window = gdk_screen_get_root_window (screen); + gdk_window_get_geometry (root_window, NULL, NULL, &width_request, &height_request); + } + else + { + /*No root window or primary monitor in wayland unless compositors add it back*/ + GdkRectangle geometry = {0}; + GdkMonitor *monitor; + monitor = gdk_display_get_monitor (display, 0); + gdk_monitor_get_geometry (monitor, &geometry); + width_request = geometry.width; + height_request = geometry.height; + } g_object_set (window, "width_request", width_request, @@ -176,10 +192,27 @@ caja_desktop_window_new (CajaApplication *application, int width_request, height_request; int scale; - scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen)); - - width_request = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; - height_request = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; + GdkDisplay *display = gdk_screen_get_display (screen); + if (GDK_IS_X11_DISPLAY (display)) + { + scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen)); + width_request = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; + height_request = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; + } + else + { + /*FIXME: There is no primary monitor in wayland itself + *compositors can implement this but as this is written + *only a few wayland compositors allow setting a primary monitor + *and they all do it differently. For now, use the first monitor + */ + GdkRectangle geometry = {0}; + GdkMonitor *monitor; + monitor = gdk_display_get_monitor (display, 0); + gdk_monitor_get_geometry (monitor, &geometry); + width_request = geometry.width; + height_request = geometry.height; + } window = CAJA_DESKTOP_WINDOW (gtk_widget_new (caja_desktop_window_get_type(), @@ -193,11 +226,47 @@ caja_desktop_window_new (CajaApplication *application, /* will cause the desktop window to open at the wrong size in gtk 3.20 */ gtk_window_set_default_size (GTK_WINDOW (window), -1, -1); + /*For wayland only + *Code taken from gtk-layer-shell simple-example.c + */ +#ifdef HAVE_WAYLAND + if (GDK_IS_WAYLAND_DISPLAY (display)) + { + GtkWindow *gtkwin; + gtkwin = (GTK_WINDOW(window)); + + /* Before the window is first realized, set it up to be a layer surface */ + gtk_layer_init_for_window (gtkwin); + + /* Order below normal windows */ + gtk_layer_set_layer (gtkwin, GTK_LAYER_SHELL_LAYER_BOTTOM); + + gtk_layer_set_namespace (gtkwin, "desktop"); + + /*Anchor the desktop to all four corners + *This is much simpler than on x11 and + *should always render the desktop across + *all of the screen + */ + gtk_layer_set_anchor (gtkwin, GTK_LAYER_SHELL_EDGE_TOP, TRUE); + gtk_layer_set_anchor (gtkwin, GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE); + gtk_layer_set_anchor (gtkwin, GTK_LAYER_SHELL_EDGE_LEFT, TRUE); + gtk_layer_set_anchor (gtkwin, GTK_LAYER_SHELL_EDGE_RIGHT, TRUE); + + /*Enable keyboard use on the desktop*/ + gtk_layer_set_keyboard_mode (gtkwin, GTK_LAYER_SHELL_KEYBOARD_MODE_ON_DEMAND); + } +#endif /* Special sawmill setting*/ GdkWindow *gdkwin; - gtk_widget_realize (GTK_WIDGET (window)); + if ((GDK_IS_X11_DISPLAY (display))) + gtk_widget_realize (GTK_WIDGET (window)); + else + gtk_widget_show (GTK_WIDGET (window)); + gdkwin = gtk_widget_get_window (GTK_WIDGET (window)); - if (gdk_window_ensure_native (gdkwin)) { + if ((GDK_IS_X11_DISPLAY (display)) && (gdk_window_ensure_native (gdkwin))) + { Display *disp = GDK_DISPLAY_XDISPLAY (gdk_window_get_display (gdkwin)); XClassHint *xch = XAllocClassHint (); xch->res_name = "desktop_window"; @@ -232,15 +301,21 @@ unrealize (GtkWidget *widget) CajaDesktopWindow *window; CajaDesktopWindowPrivate *details; GdkWindow *root_window; + GdkDisplay *display; window = CAJA_DESKTOP_WINDOW (widget); details = window->details; + display = gtk_widget_get_display (widget); - root_window = gdk_screen_get_root_window ( + /*Avoid root window on wayland-it's not supposed to work*/ + if (GDK_IS_X11_DISPLAY (display)) + { + root_window = gdk_screen_get_root_window ( gtk_window_get_screen (GTK_WINDOW (window))); - gdk_property_delete (root_window, - gdk_atom_intern ("CAJA_DESKTOP_WINDOW_ID", TRUE)); + gdk_property_delete (root_window, + gdk_atom_intern ("CAJA_DESKTOP_WINDOW_ID", TRUE)); + } if (details->size_changed_id != 0) { g_signal_handler_disconnect (gtk_window_get_screen (GTK_WINDOW (window)), @@ -251,6 +326,7 @@ unrealize (GtkWidget *widget) GTK_WIDGET_CLASS (caja_desktop_window_parent_class)->unrealize (widget); } +/*This should only be reached in x11*/ static void set_wmspec_desktop_hint (GdkWindow *window) { @@ -264,18 +340,18 @@ set_wmspec_desktop_hint (GdkWindow *window) GDK_PROP_MODE_REPLACE, (guchar *) &atom, 1); } +/*This should only be reached in x11*/ static void set_desktop_window_id (CajaDesktopWindow *window, GdkWindow *gdkwindow) { - /* Tuck the desktop windows xid in the root to indicate we own the desktop. + /* Tuck the desktop windows xid in the root to indicate we own the desktop in on x11 */ Window window_xid; GdkWindow *root_window; root_window = gdk_screen_get_root_window ( gtk_window_get_screen (GTK_WINDOW (window))); - window_xid = GDK_WINDOW_XID (gdkwindow); gdk_property_change (root_window, @@ -291,29 +367,37 @@ realize (GtkWidget *widget) CajaDesktopWindowPrivate *details; window = CAJA_DESKTOP_WINDOW (widget); details = window->details; + GdkDisplay *display; /* Make sure we get keyboard events */ - gtk_widget_set_events (widget, gtk_widget_get_events (widget) - | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); - /* Do the work of realizing. */ - GTK_WIDGET_CLASS (caja_desktop_window_parent_class)->realize (widget); + display = gtk_widget_get_display (widget); + if (GDK_IS_X11_DISPLAY (display)) + gtk_widget_set_events (widget, gtk_widget_get_events (widget) + | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); - /* This is the new way to set up the desktop window */ - set_wmspec_desktop_hint (gtk_widget_get_window (widget)); + /*Do the work of realizing. */ + GTK_WIDGET_CLASS (caja_desktop_window_parent_class)->realize (widget); - set_desktop_window_id (window, gtk_widget_get_window (widget)); + /* This is the new way to set up the desktop window in x11 but not for wayland */ + display = gtk_widget_get_display (widget); + if (GDK_IS_X11_DISPLAY (display)) + { + set_wmspec_desktop_hint (gtk_widget_get_window (widget)); + set_desktop_window_id (window, gtk_widget_get_window (widget)); + } details->size_changed_id = g_signal_connect (gtk_window_get_screen (GTK_WINDOW (window)), "size_changed", G_CALLBACK (caja_desktop_window_screen_size_changed), window); } +/* Should only reached in x11*/ static gboolean draw (GtkWidget *widget, cairo_t *cr) { + g_assert (GDK_IS_X11_DISPLAY (gdk_display_get_default())); eel_background_draw (widget, cr); - return GTK_WIDGET_CLASS (caja_desktop_window_parent_class)->draw (widget, cr); } @@ -334,7 +418,11 @@ caja_desktop_window_class_init (CajaDesktopWindowClass *klass) wclass->realize = realize; wclass->unrealize = unrealize; wclass->map = map; - wclass->draw = draw; + /*Drawing the desktop background from here gives a black background in wayland + *So manage desktop background from the icon container as in navigation windows + */ + if (GDK_IS_X11_DISPLAY (gdk_display_get_default())) + wclass->draw = draw; gtk_widget_class_set_accessible_type (wclass, CAJA_TYPE_DESKTOP_WINDOW_ACCESSIBLE); diff --git a/src/caja-file-management-properties.c b/src/caja-file-management-properties.c index a01e058a..ba76ebda 100644 --- a/src/caja-file-management-properties.c +++ b/src/caja-file-management-properties.c @@ -384,7 +384,7 @@ update_caption_combo_box (GtkBuilder *builder, const char *name) { GtkWidget *combo_box; - int i; + guint i; GPtrArray *column_names; combo_box = GTK_WIDGET (gtk_builder_get_object (builder, combo_box_name)); @@ -401,7 +401,7 @@ update_caption_combo_box (GtkBuilder *builder, { if (!strcmp (name, g_ptr_array_index (column_names, i))) { - gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), i); + gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), (int) i); break; } } @@ -842,7 +842,7 @@ caja_file_management_properties_dialog_setup_extension_page (GtkBuilder *builder gchar *ext_text_info; GList *extensions; - int i; + guint i; extensions = caja_extensions_get_list (); diff --git a/src/caja-image-properties-page.c b/src/caja-image-properties-page.c index afb66c9e..73443657 100644 --- a/src/caja-image-properties-page.c +++ b/src/caja-image-properties-page.c @@ -53,12 +53,14 @@ struct _CajaImagePropertiesPagePrivate GCancellable *cancellable; GtkWidget *vbox; GtkWidget *loading_label; + GtkWidget *grid; GdkPixbufLoader *loader; gboolean got_size; gboolean pixbuf_still_loading; char buffer[LOAD_BUFFER_SIZE]; int width; int height; + int row; #ifdef HAVE_EXIF ExifLoader *exifldr; #endif /*HAVE_EXIF*/ @@ -157,16 +159,33 @@ append_label (GtkWidget *vbox, return label; } -static GtkWidget * -append_label_take_str (GtkWidget *vbox, - char *str) +static void +add_row (CajaImagePropertiesPage *page, + const char *col_name_str, + const char *col_value_str) { - GtkWidget *retval; + GtkWidget *label; + g_autofree char *value = NULL; - retval = append_label (vbox, str); - g_free (str); + value = g_strdup_printf (_("<b>%s:</b>"), col_name_str); + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), value); + gtk_label_set_xalign (GTK_LABEL (label), 0); + gtk_label_set_yalign (GTK_LABEL (label), 0); + gtk_label_set_selectable (GTK_LABEL (label), TRUE); + gtk_widget_set_can_focus (label, FALSE); + + gtk_grid_attach (GTK_GRID (page->details->grid), label, 0, page->details->row, 1, 1); - return retval; + label = gtk_label_new (col_value_str); + gtk_label_set_xalign (GTK_LABEL (label), 0); + gtk_label_set_yalign (GTK_LABEL (label), 0); + gtk_label_set_selectable (GTK_LABEL (label), TRUE); + gtk_widget_set_can_focus (label, FALSE); + + gtk_grid_attach (GTK_GRID (page->details->grid), label, 1, page->details->row, 1, 1); + + page->details->row++; } #ifdef HAVE_EXIF @@ -258,11 +277,7 @@ append_tag_value_pair (CajaImagePropertiesPage *page, return FALSE; } - append_label_take_str - (page->details->vbox, - g_strdup_printf ("<b>%s:</b> %s", - description ? description : utf_attribute, - utf_value)); + add_row (page, description ? description : utf_attribute, utf_value); g_free (utf_attribute); g_free (utf_value); @@ -315,10 +330,7 @@ append_xmp_value_pair (CajaImagePropertiesPage *page, { if (XMP_IS_PROP_SIMPLE (options)) { - append_label_take_str - (page->details->vbox, - g_strdup_printf ("<b>%s:</b> %s", - descr, xmp_string_cstr (value))); + add_row (page, descr, xmp_string_cstr (value)); } else if (XMP_IS_PROP_ARRAY (options)) { @@ -329,11 +341,10 @@ append_xmp_value_pair (CajaImagePropertiesPage *page, { GString *str; gboolean first = TRUE; + char *value_str; str = g_string_new (NULL); - g_string_append_printf (str, "<b>%s:</b> ", - descr); while (xmp_iterator_next (iter, NULL, NULL, value, &options) && !XMP_IS_PROP_QUALIFIER(options)) { @@ -350,8 +361,9 @@ append_xmp_value_pair (CajaImagePropertiesPage *page, xmp_string_cstr(value)); } xmp_iterator_free(iter); - append_label_take_str (page->details->vbox, - g_string_free (str, FALSE)); + value_str = g_string_free (str, FALSE); + add_row (page, descr, value_str); + g_free (value_str); } } } @@ -386,33 +398,38 @@ load_finished (CajaImagePropertiesPage *page) if (page->details->got_size) { GdkPixbufFormat *format; - char *name, *desc; + g_autofree char *name = NULL; + g_autofree char *desc = NULL; + g_autofree char *value = NULL; #ifdef HAVE_EXIF ExifData *exif_data; #endif /*HAVE_EXIF*/ format = gdk_pixbuf_loader_get_format (page->details->loader); - name = gdk_pixbuf_format_get_name (format); desc = gdk_pixbuf_format_get_description (format); - append_label_take_str - (page->details->vbox, - g_strdup_printf ("<b>%s</b> %s (%s)", - _("Image Type:"), name, desc)); - append_label_take_str - (page->details->vbox, - g_strdup_printf (ngettext ("<b>Width:</b> %d pixel", - "<b>Width:</b> %d pixels", - page->details->width), - page->details->width)); - append_label_take_str - (page->details->vbox, - g_strdup_printf (ngettext ("<b>Height:</b> %d pixel", - "<b>Height:</b> %d pixels", - page->details->height), - page->details->height)); - g_free (name); - g_free (desc); + + page->details->grid = gtk_grid_new (); + gtk_grid_set_column_spacing (GTK_GRID (page->details->grid), 12); + gtk_grid_set_row_spacing (GTK_GRID (page->details->grid), 6); + gtk_container_set_border_width (GTK_CONTAINER (page->details->grid), 12); + gtk_box_pack_start (GTK_BOX (page->details->vbox), page->details->grid, TRUE, TRUE, 0); + page->details->row = 0; + + value = g_strdup_printf ("%s (%s)",name, desc); + add_row (page, _("Image Type"), value); + + value = g_strdup_printf (ngettext ("%d pixel", + "%d pixels", + page->details->width), + page->details->width); + add_row (page, _("Width"), value); + + value = g_strdup_printf (ngettext ("%d pixel", + "%d pixels", + page->details->height), + page->details->height); + add_row (page, _("Height"), value); #ifdef HAVE_EXIF exif_data = exif_loader_get_data (page->details->exifldr); @@ -422,6 +439,7 @@ load_finished (CajaImagePropertiesPage *page) #ifdef HAVE_EXEMPI append_xmpdata_string (page->details->xmp, page); #endif /*HAVE_EXEMPI*/ + gtk_widget_show_all (page->details->grid); } else { @@ -472,7 +490,7 @@ file_read_callback (GObject *object, { int exif_still_loading; - g_assert (count_read <= sizeof(page->details->buffer)); + g_assert (((size_t) count_read) <= sizeof (page->details->buffer)); #ifdef HAVE_EXIF exif_still_loading = exif_loader_write (page->details->exifldr, @@ -645,10 +663,9 @@ caja_image_properties_page_init (CajaImagePropertiesPage *page) gtk_orientable_set_orientation (GTK_ORIENTABLE (page), GTK_ORIENTATION_VERTICAL); gtk_box_set_homogeneous (GTK_BOX (page), FALSE); - gtk_box_set_spacing (GTK_BOX (page), 2); - gtk_container_set_border_width (GTK_CONTAINER (page), 6); page->details->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + page->details->loading_label = append_label (page->details->vbox,_("loading...")); gtk_box_pack_start (GTK_BOX (page), @@ -658,14 +675,46 @@ caja_image_properties_page_init (CajaImagePropertiesPage *page) gtk_widget_show_all (GTK_WIDGET (page)); } +static gboolean +is_mime_type_supported (const char *mime_type) +{ + g_autoptr (GSList) formats = NULL; + + if (mime_type == NULL) + { + return FALSE; + } + + formats = gdk_pixbuf_get_formats (); + + for (GSList *l = formats; l != NULL; l = l->next) + { + g_auto (GStrv) mime_types = NULL; + + mime_types = gdk_pixbuf_format_get_mime_types (l->data); + if (mime_types == NULL) + { + continue; + } + + if (g_strv_contains ((const char * const *) mime_types, mime_type)) + { + return TRUE; + } + } + + return FALSE; +} + static GList * get_property_pages (CajaPropertyPageProvider *provider, GList *files) { GList *pages; CajaPropertyPage *real_page; - CajaFileInfo *file; - char *uri; + CajaFileInfo *file_info; + g_autofree char *mime_type = NULL; + g_autofree char *uri = NULL; CajaImagePropertiesPage *page; /* Only show the property page if 1 file is selected */ @@ -674,34 +723,20 @@ get_property_pages (CajaPropertyPageProvider *provider, return NULL; } - file = CAJA_FILE_INFO (files->data); - - if (! - (caja_file_info_is_mime_type (file, "image/x-bmp") || - caja_file_info_is_mime_type (file, "image/x-ico") || - caja_file_info_is_mime_type (file, "image/jpeg") || - caja_file_info_is_mime_type (file, "image/gif") || - caja_file_info_is_mime_type (file, "image/png") || - caja_file_info_is_mime_type (file, "image/pnm") || - caja_file_info_is_mime_type (file, "image/ras") || - caja_file_info_is_mime_type (file, "image/tga") || - caja_file_info_is_mime_type (file, "image/tiff") || - caja_file_info_is_mime_type (file, "image/wbmp") || - caja_file_info_is_mime_type (file, "image/x-xbitmap") || - caja_file_info_is_mime_type (file, "image/x-xpixmap"))) + file_info = CAJA_FILE_INFO (files->data); + mime_type = caja_file_info_get_mime_type (file_info); + if (!is_mime_type_supported (mime_type)) { return NULL; } pages = NULL; - uri = caja_file_info_get_uri (file); + uri = caja_file_info_get_uri (file_info); page = g_object_new (caja_image_properties_page_get_type (), NULL); load_location (page, uri); - g_free (uri); - real_page = caja_property_page_new ("CajaImagePropertiesPage::property_page", gtk_label_new (_("Image")), diff --git a/src/caja-main.c b/src/caja-main.c index 75ccbdf5..11871257 100644 --- a/src/caja-main.c +++ b/src/caja-main.c @@ -250,8 +250,6 @@ main (int argc, char *argv[]) g_set_prgname ("caja"); - gdk_set_allowed_backends ("x11"); - if (g_file_test (DATADIR "/applications/caja.desktop", G_FILE_TEST_EXISTS)) { egg_set_desktop_file (DATADIR "/applications/caja.desktop"); } diff --git a/src/caja-navigation-window.c b/src/caja-navigation-window.c index 0768d326..0cdbb1dd 100644 --- a/src/caja-navigation-window.c +++ b/src/caja-navigation-window.c @@ -519,7 +519,7 @@ caja_navigation_window_key_press_event (GtkWidget *widget, GdkEventKey *event) { CajaNavigationWindow *window; - int i; + gsize i; window = CAJA_NAVIGATION_WINDOW (widget); @@ -604,12 +604,12 @@ caja_navigation_window_button_press_event (GtkWidget *widget, handled = FALSE; window = CAJA_NAVIGATION_WINDOW (widget); - if (mouse_extra_buttons && (event->button == mouse_back_button)) + if (mouse_extra_buttons && (((int) event->button) == mouse_back_button)) { caja_navigation_window_go_back (window); handled = TRUE; } - else if (mouse_extra_buttons && (event->button == mouse_forward_button)) + else if (mouse_extra_buttons && (((int) event->button) == mouse_forward_button)) { caja_navigation_window_go_forward (window); handled = TRUE; @@ -1082,7 +1082,7 @@ gint caja_navigation_window_get_base_page_index (CajaNavigationWindow *window) { CajaNavigationWindowSlot *slot; - gint forward_count; + guint forward_count; slot = CAJA_NAVIGATION_WINDOW_SLOT (CAJA_WINDOW (window)->details->active_pane->active_slot); @@ -1097,7 +1097,7 @@ caja_navigation_window_get_base_page_index (CajaNavigationWindow *window) /* The forward count indicate the relative postion of the base page * in the history list */ - return forward_count; + return (int) forward_count; } /** diff --git a/src/caja-pathbar.c b/src/caja-pathbar.c index 332b6c1e..24f6ee1c 100644 --- a/src/caja-pathbar.c +++ b/src/caja-pathbar.c @@ -1941,7 +1941,7 @@ make_directory_button (CajaPathBar *path_bar, button_data); } - button_data->file_is_hidden = file_is_hidden; + button_data->file_is_hidden = (file_is_hidden != FALSE); gtk_container_add (GTK_CONTAINER (button_data->button), child); gtk_widget_show_all (button_data->button); diff --git a/src/caja-places-sidebar.c b/src/caja-places-sidebar.c index 2cd22148..d0ef6ee8 100644 --- a/src/caja-places-sidebar.c +++ b/src/caja-places-sidebar.c @@ -1461,6 +1461,7 @@ reorder_bookmarks (CajaPlacesSidebar *sidebar, GtkTreeIter iter; PlaceType type; int old_position; + guint list_length; /* Get the selected path */ @@ -1472,12 +1473,12 @@ reorder_bookmarks (CajaPlacesSidebar *sidebar, PLACES_SIDEBAR_COLUMN_INDEX, &old_position, -1); - if (type != PLACES_BOOKMARK || - old_position < 0 || - old_position >= caja_bookmark_list_length (sidebar->bookmarks)) - { + if (type != PLACES_BOOKMARK || old_position < 0) + return; + + list_length = caja_bookmark_list_length (sidebar->bookmarks); + if (((guint) old_position) >= list_length) return; - } caja_bookmark_list_move_item (sidebar->bookmarks, old_position, new_position); diff --git a/src/caja-property-browser.c b/src/caja-property-browser.c index 3351421e..8930cdcf 100644 --- a/src/caja-property-browser.c +++ b/src/caja-property-browser.c @@ -29,6 +29,7 @@ */ #include <config.h> +#include <limits.h> #include <math.h> #include <libxml/parser.h> @@ -615,18 +616,18 @@ caja_property_browser_drag_data_get (GtkWidget *widget, else if (strcmp (property_browser->details->drag_type, "application/x-color") == 0) { - GdkColor color; - guint16 colorArray[4]; - /* handle the "reset" case as an image */ if (g_strcmp0 (property_browser->details->dragged_file, RESET_IMAGE_NAME) != 0) { - gdk_color_parse (property_browser->details->dragged_file, &color); + GdkRGBA color; + guint16 colorArray [4]; + + gdk_rgba_parse (&color, property_browser->details->dragged_file); - colorArray[0] = color.red; - colorArray[1] = color.green; - colorArray[2] = color.blue; - colorArray[3] = 0xffff; + colorArray [0] = (guint16) (color.red * 65535.0); + colorArray [1] = (guint16) (color.green * 65535.0); + colorArray [2] = (guint16) (color.blue * 65535.0); + colorArray [3] = USHRT_MAX; gtk_selection_data_set(selection_data, target, 16, (const char *) &colorArray[0], 8); @@ -803,15 +804,16 @@ make_color_drag_image (CajaPropertyBrowser *property_browser, const char *color_ GdkPixbuf *color_square; GdkPixbuf *ret; int row, col, stride; - char *pixels; - GdkColor color; + guchar *pixels; + GdkRGBA color; + guchar red, green, blue; color_square = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, COLOR_SQUARE_SIZE, COLOR_SQUARE_SIZE); - gdk_color_parse (color_spec, &color); - color.red >>= 8; - color.green >>= 8; - color.blue >>= 8; + gdk_rgba_parse (&color, color_spec); + red = (guchar) (color.red * 255.0); + green = (guchar) (color.green * 255.0); + blue = (guchar) (color.blue * 255.0); pixels = gdk_pixbuf_get_pixels (color_square); stride = gdk_pixbuf_get_rowstride (color_square); @@ -819,16 +821,16 @@ make_color_drag_image (CajaPropertyBrowser *property_browser, const char *color_ /* loop through and set each pixel */ for (row = 0; row < COLOR_SQUARE_SIZE; row++) { - char *row_pixels; + guchar *row_pixels; row_pixels = (pixels + (row * stride)); for (col = 0; col < COLOR_SQUARE_SIZE; col++) { - *row_pixels++ = color.red; - *row_pixels++ = color.green; - *row_pixels++ = color.blue; - *row_pixels++ = 255; + *row_pixels++ = red; + *row_pixels++ = green; + *row_pixels++ = blue; + *row_pixels++ = UCHAR_MAX; } } diff --git a/src/caja-query-editor.c b/src/caja-query-editor.c index 2c600c5d..b4f96179 100644 --- a/src/caja-query-editor.c +++ b/src/caja-query-editor.c @@ -468,7 +468,7 @@ tags_row_add_to_query (CajaQueryEditorRow *row, char **strv = g_strsplit (tags, " ", -1); guint len = g_strv_length (strv); - int i; + guint i; for (i = 0; i < len; ++i) { strv[i] = g_strstrip (strv[i]); @@ -839,7 +839,7 @@ type_row_create_widgets (CajaQueryEditorRow *row) GtkCellRenderer *cell; GtkListStore *store; GtkTreeIter iter; - int i; + gsize i; store = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_BOOLEAN); combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); @@ -993,7 +993,7 @@ type_add_rows_from_query (CajaQueryEditor *editor, char *mime_type; CajaQueryEditorRow *row; GtkTreeIter iter; - int i; + gsize i; GtkTreeModel *model; GList *l; @@ -1017,7 +1017,7 @@ type_add_rows_from_query (CajaQueryEditor *editor, model = gtk_combo_box_get_model (GTK_COMBO_BOX (row->type_widget)); - gtk_tree_model_iter_nth_child (model, &iter, NULL, i + 2); + gtk_tree_model_iter_nth_child (model, &iter, NULL, ((gint) i) + 2); gtk_combo_box_set_active_iter (GTK_COMBO_BOX (row->type_widget), &iter); } diff --git a/src/caja-spatial-window.c b/src/caja-spatial-window.c index 1028383d..df0baf28 100644 --- a/src/caja-spatial-window.c +++ b/src/caja-spatial-window.c @@ -313,6 +313,7 @@ caja_spatial_window_show (GtkWidget *widget) CajaWindow *window; CajaWindowSlot *slot; GFile *location; + GdkDisplay *display; window = CAJA_WINDOW (widget); slot = caja_window_get_active_slot (window); @@ -325,7 +326,17 @@ caja_spatial_window_show (GtkWidget *widget) } location = caja_window_slot_get_location (slot); - g_return_if_fail (location != NULL); + display = gtk_widget_get_display (widget); + + if (GDK_IS_X11_DISPLAY (display)) + g_return_if_fail (location != NULL); + + /*Return silently if this is a wayland desktop + *as the location isn't ready yet on first rendering + *but contents show fine, presumably from an update + */ + else if (location == NULL) + return; while (location != NULL) { CajaFile *file; diff --git a/src/caja-window.c b/src/caja-window.c index a180414c..2191a7ed 100644 --- a/src/caja-window.c +++ b/src/caja-window.c @@ -591,8 +591,7 @@ caja_window_zoom_to_default (CajaWindow *window) static guint get_max_forced_height (GdkScreen *screen) { - gint scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen)); - return (HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale * 90) / 100; + return (gdk_screen_get_height (screen) * 90) / 100; } /* Code should never force the window wider than this size. @@ -601,8 +600,7 @@ get_max_forced_height (GdkScreen *screen) static guint get_max_forced_width (GdkScreen *screen) { - gint scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen)); - return (WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale * 90) / 100; + return (gdk_screen_get_width (screen) * 90) / 100; } /* This must be called when construction of CajaWindow is finished, @@ -634,17 +632,6 @@ caja_window_set_initial_window_geometry (CajaWindow *window) } static void -caja_window_constructed (GObject *self) -{ - CajaWindow *window; - - window = CAJA_WINDOW (self); - - caja_window_initialize_bookmarks_menu (window); - caja_window_set_initial_window_geometry (window); -} - -static void caja_window_set_property (GObject *object, guint arg_id, const GValue *value, @@ -744,6 +731,12 @@ caja_window_constructor (GType type, slot = caja_window_open_slot (window->details->active_pane, 0); caja_window_set_active_slot (window, slot); + /*We can now do this here instead of in a separate constructed function + *and we need to because the separate constructed function causes the + *window to be un-draggable/un-resizable with the mouse in wayland + */ + caja_window_initialize_bookmarks_menu (window); + caja_window_set_initial_window_geometry (window); return object; } @@ -1073,7 +1066,7 @@ caja_window_key_press_event (GtkWidget *widget, return TRUE; CajaWindow *window; - int i; + gsize i; window = CAJA_WINDOW (widget); @@ -2172,7 +2165,6 @@ caja_window_class_init (CajaWindowClass *class) GtkBindingSet *binding_set; G_OBJECT_CLASS (class)->constructor = caja_window_constructor; - G_OBJECT_CLASS (class)->constructed = caja_window_constructed; G_OBJECT_CLASS (class)->get_property = caja_window_get_property; G_OBJECT_CLASS (class)->set_property = caja_window_set_property; G_OBJECT_CLASS (class)->finalize = caja_window_finalize; diff --git a/src/file-manager/Makefile.am b/src/file-manager/Makefile.am index 98173976..3707409c 100644 --- a/src/file-manager/Makefile.am +++ b/src/file-manager/Makefile.am @@ -23,6 +23,8 @@ libcaja_file_manager_la_SOURCES = \ fm-actions.h \ fm-desktop-icon-view.c \ fm-desktop-icon-view.h \ + fm-desktop-wayland-bg-dialog.c \ + fm-desktop-wayland-bg-dialog.h \ fm-directory-view.c \ fm-directory-view.h \ fm-widget-view.c \ diff --git a/src/file-manager/fm-desktop-icon-view.c b/src/file-manager/fm-desktop-icon-view.c index a90f884f..954c26de 100644 --- a/src/file-manager/fm-desktop-icon-view.c +++ b/src/file-manager/fm-desktop-icon-view.c @@ -62,6 +62,12 @@ #include "fm-desktop-icon-view.h" #include "fm-actions.h" +#ifdef HAVE_WAYLAND +#include <gdk/gdkwayland.h> +#include "fm-desktop-wayland-bg-dialog.h" + +#endif + /* Timeout to check the desktop directory for updates */ #define RESCAN_TIMEOUT 4 @@ -120,13 +126,27 @@ icon_container_set_workarea (CajaIconContainer *icon_container, int screen_width, screen_height; int scale; int i; + GdkDisplay *display; left = right = top = bottom = 0; - scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen)); - - screen_width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; - screen_height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; + display = gdk_screen_get_display (screen); + if (GDK_IS_X11_DISPLAY (display)) + { + scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen)); + screen_width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; + screen_height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; + } + else + { + scale = 1; /*wayland handles this for us*/ + GdkRectangle geometry = {0}; + GdkMonitor *monitor; + monitor = gdk_display_get_monitor (display, 0); + gdk_monitor_get_geometry (monitor, &geometry); + screen_width = geometry.width; + screen_height = geometry.height; + } for (i = 0; i < n_items; i += 4) { @@ -148,6 +168,7 @@ icon_container_set_workarea (CajaIconContainer *icon_container, left, right, top, bottom); } +/*This code is only reached when running in x11*/ static void net_workarea_changed (FMDesktopIconView *icon_view, GdkWindow *window) @@ -239,6 +260,7 @@ net_workarea_changed (FMDesktopIconView *icon_view, g_free (workareas); } +/*This code is reached only in x11*/ static GdkFilterReturn desktop_icon_view_property_filter (GdkXEvent *gdk_xevent, GdkEvent *event, @@ -258,7 +280,6 @@ desktop_icon_view_property_filter (GdkXEvent *gdk_xevent, default: break; } - return GDK_FILTER_CONTINUE; } @@ -317,6 +338,7 @@ fm_desktop_icon_view_class_init (FMDesktopIconViewClass *class) FM_ICON_VIEW_CLASS (class)->supports_labels_beside_icons = real_supports_labels_beside_icons; } +/*This code is only reached when running on x11*/ static void fm_desktop_icon_view_handle_middle_click (CajaIconContainer *icon_container, GdkEventButton *event, @@ -373,6 +395,9 @@ fm_desktop_icon_view_handle_middle_click (CajaIconContainer *icon_container, static void unrealized_callback (GtkWidget *widget, FMDesktopIconView *desktop_icon_view) { + if (!GDK_IS_X11_DISPLAY (gdk_display_get_default())) + return; + g_return_if_fail (desktop_icon_view->priv->root_window != NULL); /* Remove the property filter */ @@ -387,13 +412,13 @@ realized_callback (GtkWidget *widget, FMDesktopIconView *desktop_icon_view) { GdkWindow *root_window; GdkScreen *screen; + GdkDisplay *display; GtkAllocation allocation; - gint scale; g_return_if_fail (desktop_icon_view->priv->root_window == NULL); screen = gtk_widget_get_screen (widget); - scale = gtk_widget_get_scale_factor (widget); + display = gdk_screen_get_display (screen); /* Ugly HACK for the problem that the views realize at the * wrong size and then get resized. (This is a problem with @@ -403,24 +428,46 @@ realized_callback (GtkWidget *widget, FMDesktopIconView *desktop_icon_view) */ allocation.x = 0; allocation.y = 0; - allocation.width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; - allocation.height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; + if (GDK_IS_X11_DISPLAY (display)) + { + gint scale; + scale = gtk_widget_get_scale_factor (widget); + allocation.width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; + allocation.height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; + } + else + { + /*No real root window or primary monitor in wayland unless compositors add it back*/ + GdkRectangle geometry = {0}; + GdkMonitor *monitor; + monitor = gdk_display_get_monitor (display, 0); + gdk_monitor_get_geometry (monitor, &geometry); + allocation.width = geometry.width; + allocation.height = geometry.height; + } + gtk_widget_size_allocate (GTK_WIDGET(get_icon_container(desktop_icon_view)), &allocation); - root_window = gdk_screen_get_root_window (screen); - - desktop_icon_view->priv->root_window = root_window; + if (GDK_IS_X11_DISPLAY (display)) + { + root_window = gdk_screen_get_root_window (screen); + desktop_icon_view->priv->root_window = root_window; - /* Read out the workarea geometry and update the icon container accordingly */ - net_workarea_changed (desktop_icon_view, root_window); + /* Read out the workarea geometry and update the icon container accordingly */ + net_workarea_changed (desktop_icon_view, root_window); - /* Setup the property filter */ - gdk_window_set_events (root_window, GDK_PROPERTY_CHANGE_MASK); - gdk_window_add_filter (root_window, - desktop_icon_view_property_filter, - desktop_icon_view); + /* Setup the property filter */ + gdk_window_set_events (root_window, GDK_PROPERTY_CHANGE_MASK); + gdk_window_add_filter (root_window, + desktop_icon_view_property_filter, + desktop_icon_view); + } + else + { + desktop_icon_view->priv->root_window = NULL; + } } static CajaZoomLevel @@ -610,8 +657,13 @@ fm_desktop_icon_view_init (FMDesktopIconView *desktop_icon_view) CAJA_ICON_LAYOUT_T_B_R_L : CAJA_ICON_LAYOUT_T_B_L_R); - g_signal_connect_object (icon_container, "middle_click", - G_CALLBACK (fm_desktop_icon_view_handle_middle_click), desktop_icon_view, 0); + /*Handle the middle click on x11 */ + if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) + { + g_signal_connect_object (desktop_icon_view, "middle_click", + G_CALLBACK (fm_desktop_icon_view_handle_middle_click), desktop_icon_view, 0); + } + g_signal_connect_object (desktop_icon_view, "realize", G_CALLBACK (realized_callback), desktop_icon_view, 0); g_signal_connect_object (desktop_icon_view, "unrealize", @@ -661,12 +713,31 @@ action_change_background_callback (GtkAction *action, gpointer data) { g_assert (FM_DIRECTORY_VIEW (data)); - - caja_launch_application_from_command (gtk_widget_get_screen (GTK_WIDGET (data)), - _("Background"), - "mate-appearance-properties", - FALSE, - "--show-page=background", NULL); +#ifdef HAVE_WAYLAND + /*Get the new background and switch to it in wayland*/ + if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default())) + { + /*We can use the appearance capplet with some versions of mate-control-center + *in which the appearance capplet works in wayland + *Try it first, and fall back to the standalone dialog if it fails + */ + GError *error = NULL; + + g_spawn_command_line_async ("mate-appearance-properties --show-page=background", + &error); + if (error != NULL) + wayland_bg_dialog_new (); + } + else +#endif + /*Get the new background and switch to it in x11*/ + { + caja_launch_application_from_command (gtk_widget_get_screen (GTK_WIDGET (data)), + _("Background"), + "mate-appearance-properties", + FALSE, + "--show-page=background", NULL); + } } static void diff --git a/src/file-manager/fm-desktop-wayland-bg-dialog.c b/src/file-manager/fm-desktop-wayland-bg-dialog.c new file mode 100644 index 00000000..127baff3 --- /dev/null +++ b/src/file-manager/fm-desktop-wayland-bg-dialog.c @@ -0,0 +1,471 @@ + +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + +/* fm-desktop-wayland-bg-dialog.c background changing dialog for wayland + + Copyright (C) 2024 Luke <[email protected]> + + The Mate Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Mate Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Mate Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. + + Author: <[email protected]> +*/ + +#include <config.h> +#include <fcntl.h> +#include <limits.h> +#include <stddef.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +#include <X11/Xatom.h> +#include <gtk/gtk.h> +#include <gdk/gdkx.h> +#include <glib/gi18n.h> +#include <sys/stat.h> +#include <sys/types.h> + +#include <eel/eel-glib-extensions.h> +#include <eel/eel-gtk-extensions.h> +#include <eel/eel-vfs-extensions.h> + +#include <libcaja-private/caja-directory-background.h> +#include <libcaja-private/caja-global-preferences.h> + +#include "fm-desktop-icon-view.h" +#include "fm-desktop-wayland-bg-dialog.h" + + +#ifdef HAVE_WAYLAND + +GSettings *background_settings; + +static void +update_preview (gboolean starting, GtkWidget *box, gchar *filename, + const gchar *shading_type, gchar *primary_color_str, gchar *secondary_color_str) +{ + static GtkWidget *preview_image; + static GtkCssProvider *provider; + gchar *css; + GString *string; + static GdkRectangle geometry = {0}; + + /* setup the preview only once*/ + if (starting == TRUE) + { + static GtkWidget *preview; + + /*Get the size and shape of the desktop*/ + GdkDisplay *display = gdk_screen_get_display (gdk_screen_get_default()); + GdkMonitor *monitor = gdk_display_get_monitor (display, 0); + gdk_monitor_get_geometry (monitor, &geometry); + + preview = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_widget_set_size_request (preview, geometry.width / 5, geometry.height / 5); + gtk_widget_set_name (GTK_WIDGET (preview), "caja-wayland-bg-preview"); + + preview_image = gtk_image_new (); + provider = gtk_css_provider_new (); + gtk_style_context_add_provider (gtk_widget_get_style_context (preview), + GTK_STYLE_PROVIDER (provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + gtk_box_pack_start (GTK_BOX (preview), preview_image, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (box), preview, FALSE, FALSE, 0); + } + + /* No image filename means we are previewing a color or gradient background*/ + if ((!filename) || (strcmp (filename, "") == 0) || (strcmp (filename, " ") == 0)) + { + if (GTK_IS_IMAGE(preview_image)) + gtk_image_clear (GTK_IMAGE(preview_image)); + + /*Build a color preview using a cssprovider due to requirement to handle RBGA values*/ + string = g_string_new(NULL); + g_string_append (string, "#caja-wayland-bg-preview {"); + + if (strcmp (shading_type, "vertical-gradient") == 0) + g_string_append (string, "background-image: linear-gradient(to bottom,"); + + else if (strcmp (shading_type, "horizontal-gradient") == 0) + g_string_append (string, "background-image: linear-gradient(to right,"); + + else + { + g_string_append (string, "background-color:"); + g_string_append (string, primary_color_str); + } + + if ((strcmp (shading_type, "vertical-gradient") == 0) || + (strcmp (shading_type, "horizontal-gradient") == 0)) + { + g_string_append (string, primary_color_str); + g_string_append (string, ","); + g_string_append (string, secondary_color_str); + g_string_append (string, ");"); + } + g_string_append (string, "}"); + + css = g_string_free (string, FALSE); + + gtk_css_provider_load_from_data (provider, css, -1, NULL); + + g_free (css); + } + else + /*Preview a background image*/ + { + GdkPixbuf *pixbuf; + + pixbuf = gdk_pixbuf_new_from_file_at_scale (filename, geometry.width / 5, + geometry.height / 5, TRUE, NULL); + + if (GTK_IS_IMAGE(preview_image)) + gtk_image_set_from_pixbuf (GTK_IMAGE (preview_image), pixbuf); + + /*Clear the color preview*/ + string = g_string_new (NULL); + g_string_append (string, "#caja-wayland-bg-preview {"); + + g_string_append (string, "background-image: none;"); + g_string_append (string, "background-color: transparent;"); + g_string_append (string, "}"); + + css = g_string_free (string, FALSE); + gtk_css_provider_load_from_data (provider, css, -1, NULL); + + g_free (css); + g_object_unref (pixbuf); + } +} + +static void +update_primary_color (GtkWidget *colorbutton1) +{ + gchar *shading_type, *primary_color_str, *secondary_color_str; + GdkRGBA color1; + + shading_type = g_settings_get_string (background_settings, + "color-shading-type"); + + secondary_color_str = g_settings_get_string (background_settings, + "secondary-color"); + + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (colorbutton1), &color1); + primary_color_str = gdk_rgba_to_string (&color1); + + update_preview (FALSE, NULL, "", shading_type, + primary_color_str, secondary_color_str); + + g_settings_set_string (background_settings, + "primary-color", primary_color_str); + + g_settings_set_string (background_settings, + "picture-filename", ""); + + g_free (shading_type); + g_free (primary_color_str); + g_free (secondary_color_str); +} + +static void +update_secondary_color (GtkWidget *colorbutton2) +{ + gchar *shading_type, *primary_color_str, *secondary_color_str; + GdkRGBA color2; + + shading_type = g_settings_get_string (background_settings, + "color-shading-type"); + + primary_color_str = g_settings_get_string (background_settings, + "primary-color"); + + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (colorbutton2), &color2); + secondary_color_str = gdk_rgba_to_string (&color2); + + g_settings_set_string (background_settings, + "secondary-color", secondary_color_str); + + g_settings_set_string (background_settings, + "picture-filename", ""); + + update_preview (FALSE, NULL, "", shading_type, + primary_color_str, secondary_color_str); + + g_free (shading_type); + g_free (primary_color_str); + g_free (secondary_color_str); +} + +static void +update_color_background_options (GtkWidget *colorbox) +{ + gchar *primary_color_str, *secondary_color_str; + const gchar *shading_type; + + primary_color_str = g_settings_get_string (background_settings, + "primary-color"); + + secondary_color_str = g_settings_get_string (background_settings, + "secondary-color"); + + shading_type = gtk_combo_box_get_active_id (GTK_COMBO_BOX (colorbox)); + /*write to gsettings*/ + g_settings_set_string (background_settings, + "color-shading-type", shading_type); + g_settings_set_string (background_settings, + "picture-filename", ""); + + update_preview (FALSE, NULL, "", shading_type, + primary_color_str, secondary_color_str); + + g_free (primary_color_str); + g_free (secondary_color_str); +} + +static void +update_image_background_options(GtkWidget *stylebox) +{ + const gchar *options; + options = gtk_combo_box_get_active_id (GTK_COMBO_BOX(stylebox)); + + /*write to gsettings*/ + g_settings_set_string (background_settings, + "picture-options", options); + + /*Only the image changes here, we are not thumbnailing image options yet*/ +} + +static void +update_background_image (GtkWidget *filebutton) +{ + gchar *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filebutton)); + if (strcmp (filename, " ") == 0) + filename = ""; + + /*write to gsettings*/ + g_settings_set_string (background_settings, + "picture-filename", filename); + + update_preview (FALSE, NULL, filename, NULL, NULL, NULL); + g_free (filename); +} + +void +wayland_bg_dialog_new (void) +{ + GtkWidget *dialog, *box, *vbox1, *vbox2, *hbox1, *hbox2; + GtkWidget *close_button, *colorlabel, *stylelabel; + GtkWidget *filelabel, *stylebox; + GtkWidget *colorbox, *colorbutton1, *colorbutton2; + GtkWidget *filebutton; + GdkRGBA color1, color2; + gchar *filename, *options; + gchar *shading_type, *primary_color_str, *secondary_color_str; + + background_settings = g_settings_new ("org.mate.background"); + + filename = g_settings_get_string (background_settings, + "picture-filename"); + + options = g_settings_get_string (background_settings, + "picture-options"); + + primary_color_str = g_settings_get_string (background_settings, + "primary-color"); + + secondary_color_str = g_settings_get_string (background_settings, + "secondary-color"); + + shading_type = g_settings_get_string (background_settings, + "color-shading-type"); + + dialog = gtk_dialog_new (); + gtk_window_set_title (GTK_WINDOW (dialog), + _("Desktop Background Preferences")); + + gtk_window_set_transient_for (GTK_WINDOW (dialog), NULL); + + /*Image Style Combobox*/ + stylebox = gtk_combo_box_text_new (); + + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (stylebox), + "wallpaper", "Tile" ); + + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (stylebox), + "zoom", "Zoom" ); + + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (stylebox), + "centered", "Center"); + + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (stylebox), + "scaled", "Scale"); + + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (stylebox), + "stretched", "Stretch"); + + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (stylebox), + "spanned", "Span"); + + gtk_combo_box_set_active_id (GTK_COMBO_BOX (stylebox), options); + + g_signal_connect (stylebox, "changed", + G_CALLBACK (update_image_background_options), stylebox); + + gtk_widget_set_tooltip_text (stylebox, "Image Aspect Ratio and Size. \n" + "Changes applied immediately"); + + /*Color Combobox*/ + colorlabel = gtk_label_new ("Colors:"); + colorbox = gtk_combo_box_text_new (); + + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (colorbox), + "solid", "Solid color" ); + + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (colorbox), + "horizontal-gradient", "Horizontal gradient" ); + + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (colorbox), + "vertical-gradient", "Vertical gradient"); + + gtk_combo_box_set_active_id (GTK_COMBO_BOX (colorbox), shading_type); + + g_signal_connect (colorbox, "changed", + G_CALLBACK (update_color_background_options), colorbox); + + gtk_widget_set_tooltip_text (colorbox, "Use gradient or solid color. \n" + "Changes applied immediately"); + + colorbutton1 = gtk_color_button_new (); + colorbutton2 = gtk_color_button_new (); + gtk_widget_set_tooltip_text (colorbutton1, "Color for gradient top/left or solid color \n" + "Applies on selecting any color"); + + gtk_widget_set_tooltip_text (colorbutton2, "Color for gradient bottom/right\n" + "Applies on selecting any color"); + + + if (!(gdk_rgba_parse (&color1, primary_color_str))) + gdk_rgba_parse (&color1, "rgb(88,145,188)"); + + if (!(gdk_rgba_parse (&color2, secondary_color_str))) + gdk_rgba_parse (&color2, "rgb(60,143,37)"); + + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (colorbutton1), &color1); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (colorbutton2), &color2); + + g_signal_connect (colorbutton1, "color-set", + G_CALLBACK (update_primary_color), colorbutton1); + + g_signal_connect (colorbutton2, "color-set", + G_CALLBACK (update_secondary_color), colorbutton1); + + /*file chooser and it's label for the color bg case*/ + filelabel = gtk_label_new ("Image:"); + stylelabel = gtk_label_new ("Style:"); + filebutton = gtk_file_chooser_button_new (_("Select a file"), + GTK_FILE_CHOOSER_ACTION_OPEN); + + gtk_widget_set_tooltip_text (filebutton, "Image for desktop background. \n" + "Applies on opening image"); + + gtk_file_chooser_button_set_width_chars (GTK_FILE_CHOOSER_BUTTON (filebutton), 16); + + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filebutton), + filename); + + gtk_file_chooser_button_set_title (GTK_FILE_CHOOSER_BUTTON (filebutton), + "Select a File"); + + /* If the last background was an image show the user the default background directory*/ + if ((!filename) || (strcmp (filename, "") == 0) || (strcmp (filename, " ") == 0)) + { + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filebutton), "/usr/share/backgrounds/"); + } + + g_signal_connect (filebutton, "file-set", + G_CALLBACK (update_background_image), NULL); + + /*Apply and Cancel buttons */ + close_button = gtk_button_new_with_mnemonic (_("_Close")); + + gtk_button_set_image (GTK_BUTTON (close_button), + gtk_image_new_from_icon_name ("gtk-cancel", GTK_ICON_SIZE_BUTTON)); + + gtk_button_set_use_underline (GTK_BUTTON (close_button), TRUE); + gtk_widget_set_can_default (close_button, TRUE); + + /*Prepare the boxes to pack all this into*/ + box = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); + vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); + vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); + hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + + /*Pack the filechooser and image options*/ + gtk_box_pack_start (GTK_BOX (hbox1), filelabel, FALSE, FALSE, 7); + gtk_box_pack_start (GTK_BOX (hbox1), filebutton, FALSE, FALSE, 3); + gtk_box_pack_end (GTK_BOX (hbox1), stylebox, FALSE, FALSE, 5); + gtk_box_pack_end (GTK_BOX (hbox1), stylelabel, FALSE, FALSE, 2); + + /*Pack the colorpickers and color options*/ + + gtk_box_pack_start (GTK_BOX (hbox2), colorlabel, FALSE, FALSE, 7); + gtk_box_pack_start (GTK_BOX (hbox2), colorbox, FALSE, FALSE, 5); + gtk_box_pack_end (GTK_BOX (hbox2), colorbutton2, FALSE, FALSE, 5); + gtk_box_pack_end (GTK_BOX (hbox2), colorbutton1, FALSE, FALSE, 2); + + /*Get the preview and pack it*/ + update_preview (TRUE, vbox2, filename, shading_type, + primary_color_str, secondary_color_str); + + gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0); + + /*Pack the other boxes into the final vertical box*/ + gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 20); + gtk_box_pack_start (GTK_BOX (vbox1), hbox2, FALSE, FALSE, 5); + + /*Pack the final vertical box into the content area*/ + gtk_box_pack_start (GTK_BOX (box), vbox1, FALSE, FALSE, 0); + + /*Pack the close action area*/ + + gtk_dialog_add_action_widget (GTK_DIALOG (dialog), + close_button, + GTK_RESPONSE_APPLY); + + gtk_widget_show_all (dialog); + + /*Run the dialog*/ + gtk_dialog_run (GTK_DIALOG (dialog)); + + /*cleanup*/ + g_free(filename); + g_free(options); + g_free(shading_type); + g_free(primary_color_str); + g_free(secondary_color_str); + + g_signal_handlers_disconnect_by_func (stylebox, update_image_background_options, stylebox); + g_signal_handlers_disconnect_by_func (colorbox, update_color_background_options, colorbox); + g_signal_handlers_disconnect_by_func (colorbutton1, update_primary_color, colorbutton1); + g_signal_handlers_disconnect_by_func (colorbutton2, update_primary_color, colorbutton2); + g_signal_handlers_disconnect_by_func (filebutton, update_background_image, NULL); + + g_object_unref (background_settings); + gtk_widget_destroy (dialog); +} +#endif + diff --git a/src/file-manager/fm-desktop-wayland-bg-dialog.h b/src/file-manager/fm-desktop-wayland-bg-dialog.h new file mode 100644 index 00000000..7c6b6c5c --- /dev/null +++ b/src/file-manager/fm-desktop-wayland-bg-dialog.h @@ -0,0 +1,28 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + +/* fm-desktop-wayland-bg-dialog.h + + Copyright (C) 2024 Luke <[email protected]> + + The Mate Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Mate Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Mate Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. + + Author: Luke <[email protected]> +*/ +#ifdef HAVE_WAYLAND +#include "fm-desktop-icon-view.h" + +void wayland_bg_dialog_new (void); +#endif diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c index ddaa334c..c76eefba 100644 --- a/src/file-manager/fm-directory-view.c +++ b/src/file-manager/fm-directory-view.c @@ -2351,9 +2351,9 @@ fm_directory_view_display_selection_info (FMDirectoryView *view) char *size_string; if (g_settings_get_boolean (caja_preferences, CAJA_PREFERENCES_USE_IEC_UNITS)) - size_string = g_format_size_full (non_folder_size, G_FORMAT_SIZE_IEC_UNITS); + size_string = g_format_size_full ((guint64) non_folder_size, G_FORMAT_SIZE_IEC_UNITS); else - size_string = g_format_size(non_folder_size); + size_string = g_format_size ((guint64) non_folder_size); /* Translators: This is marked for translation in case a localiser * needs to use something other than parentheses. The diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c index 1843fd2e..83517273 100644 --- a/src/file-manager/fm-icon-view.c +++ b/src/file-manager/fm-icon-view.c @@ -80,8 +80,6 @@ typedef struct const CajaFileSortType sort_type; const char *metadata_text; const char *action; - const char *menu_label; - const char *menu_hint; } SortCriterion; typedef enum @@ -125,65 +123,47 @@ static const SortCriterion sort_criteria[] = { CAJA_FILE_SORT_BY_DISPLAY_NAME, "name", - "Sort by Name", - N_("by _Name"), - N_("Keep icons sorted by name in rows") + "Sort by Name" }, { CAJA_FILE_SORT_BY_SIZE, "size", - "Sort by Size", - N_("by _Size"), - N_("Keep icons sorted by size in rows") + "Sort by Size" }, { CAJA_FILE_SORT_BY_SIZE_ON_DISK, "size_on_disk", - "Sort by Size on Disk", - N_("by S_ize on Disk"), - N_("Keep icons sorted by disk usage in rows") + "Sort by Size on Disk" }, { CAJA_FILE_SORT_BY_TYPE, "type", - "Sort by Type", - N_("by _Type"), - N_("Keep icons sorted by type in rows") + "Sort by Type" }, { CAJA_FILE_SORT_BY_MTIME, "modification date", - "Sort by Modification Date", - N_("by Modification _Date"), - N_("Keep icons sorted by modification date in rows") + "Sort by Modification Date" }, { CAJA_FILE_SORT_BY_BTIME, "creation date", - "Sort by Creation Date", - N_("by _Creation Date"), - N_("Keep icons sorted by creation date in rows") + "Sort by Creation Date" }, { CAJA_FILE_SORT_BY_EMBLEMS, "emblems", - "Sort by Emblems", - N_("by _Emblems"), - N_("Keep icons sorted by emblems in rows") + "Sort by Emblems" }, { CAJA_FILE_SORT_BY_TRASHED_TIME, "trashed", - "Sort by Trash Time", - N_("by T_rash Time"), - N_("Keep icons sorted by trash time in rows") + "Sort by Trash Time" }, { CAJA_FILE_SORT_BY_EXTENSION, "extension", - "Sort by Extension", - N_("by E_xtension"), - N_("Keep icons sorted by reversed extension segments in rows") + "Sort by Extension" } }; @@ -1694,11 +1674,17 @@ action_lock_icons_position_callback (GtkAction *action, FMIconView *icon_view; CajaFile *file; gboolean lock_icons_position; + GtkAction *action_other; icon_view = FM_ICON_VIEW (user_data); lock_icons_position = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); + action_other = gtk_action_group_get_action (icon_view->details->icon_action_group, + FM_ACTION_CLEAN_UP); + gtk_action_set_visible (action_other, !lock_icons_position); + + file = fm_directory_view_get_directory_as_file (FM_DIRECTORY_VIEW (icon_view)); fm_icon_view_set_directory_lock_icons_position (icon_view, file, diff --git a/src/file-manager/fm-list-view.c b/src/file-manager/fm-list-view.c index 921128b0..b5a61459 100644 --- a/src/file-manager/fm-list-view.c +++ b/src/file-manager/fm-list-view.c @@ -179,12 +179,14 @@ get_default_sort_order (CajaFile *file, gboolean *reversed) "name", "uri", "size", - "size_on_disk", "type", "date_modified", + "date_created", "date_accessed", "emblems", "trashed_on", + "size_on_disk", + "extension", NULL }; @@ -1296,11 +1298,11 @@ sort_column_changed_callback (GtkTreeSortable *sortable, if (sort_attr == default_sort_attr) { /* use value from preferences */ - reversed = g_settings_get_boolean (caja_preferences, CAJA_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER); + reversed = (g_settings_get_boolean (caja_preferences, CAJA_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER) != FALSE); } else { - reversed = caja_file_is_date_sort_attribute_q (sort_attr); + reversed = (caja_file_is_date_sort_attribute_q (sort_attr) != FALSE); } if (reversed) diff --git a/src/file-manager/fm-properties-window.c b/src/file-manager/fm-properties-window.c index 0ab2bfc7..e615e1fa 100644 --- a/src/file-manager/fm-properties-window.c +++ b/src/file-manager/fm-properties-window.c @@ -98,7 +98,6 @@ struct _FMPropertiesWindowPrivate { GtkLabel *name_label; GtkWidget *name_field; - unsigned int name_row; char *pending_name; GtkLabel *directory_contents_title_field; @@ -365,11 +364,13 @@ add_prompt_and_separator (GtkWidget *vbox, const char *prompt_text) static void get_image_for_properties_window (FMPropertiesWindow *window, char **icon_name, + char **display_name_, GdkPixbuf **icon_pixbuf) { CajaIconInfo *icon, *new_icon; GList *l; gint icon_scale; + gchar *display_name = NULL; icon = NULL; icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (window->details->notebook)); @@ -383,6 +384,7 @@ get_image_for_properties_window (FMPropertiesWindow *window, icon = caja_file_get_icon (file, CAJA_ICON_SIZE_STANDARD, icon_scale, CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS | CAJA_FILE_ICON_FLAGS_IGNORE_VISITING); + display_name = caja_file_get_string_attribute (file, "type"); } else { new_icon = caja_file_get_icon (file, CAJA_ICON_SIZE_STANDARD, icon_scale, CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS | @@ -391,6 +393,8 @@ get_image_for_properties_window (FMPropertiesWindow *window, g_object_unref (icon); g_object_unref (new_icon); icon = NULL; + g_free (display_name); + display_name = g_strdup (_("Multiple files")); break; } g_object_unref (new_icon); @@ -407,11 +411,23 @@ get_image_for_properties_window (FMPropertiesWindow *window, *icon_name = g_strdup (caja_icon_info_get_used_name (icon)); } + if (display_name_ != NULL) { + if (! display_name) { + display_name = g_strdup (_("No files")); + } else if (! caja_icon_info_get_used_name (icon)) { + g_free (display_name); + display_name = g_strdup (_("User-defined icon")); + } + *display_name_ = display_name; + display_name = NULL; + } + if (icon_pixbuf != NULL) { *icon_pixbuf = caja_icon_info_get_pixbuf_at_size (icon, CAJA_ICON_SIZE_STANDARD); } g_object_unref (icon); + g_free (display_name); } static void @@ -420,8 +436,9 @@ update_properties_window_icon (FMPropertiesWindow *window) GdkPixbuf *pixbuf; cairo_surface_t *surface; char *name; + char *display_name; - get_image_for_properties_window (window, &name, &pixbuf); + get_image_for_properties_window (window, &name, &display_name, &pixbuf); if (name != NULL) { gtk_window_set_icon_name (GTK_WINDOW (window), name); @@ -433,7 +450,10 @@ update_properties_window_icon (FMPropertiesWindow *window) gtk_widget_get_window (GTK_WIDGET (window))); gtk_image_set_from_surface (GTK_IMAGE (window->details->icon_image), surface); + atk_object_set_name (gtk_widget_get_accessible (window->details->icon_image), display_name); + g_free (name); + g_free (display_name); g_object_unref (pixbuf); cairo_surface_destroy (surface); } @@ -548,7 +568,8 @@ create_image_widget (FMPropertiesWindow *window, button = NULL; if (is_customizable) { button = gtk_button_new (); - gtk_container_add (GTK_CONTAINER (button), image); + gtk_widget_set_tooltip_text (button, _("Change associated icon")); + gtk_button_set_image (GTK_BUTTON (button), image); /* prepare the image to receive dropped objects to assign custom images */ gtk_drag_dest_set (GTK_WIDGET (image), @@ -4139,7 +4160,7 @@ permission_combo_update (FMPropertiesWindow *window, int current_perm; gtk_tree_model_get (model, &iter, 1, ¤t_perm, -1); - if (current_perm == all_perm) { + if (((PermissionValue) current_perm) == all_perm) { found = TRUE; break; } @@ -4224,13 +4245,23 @@ add_permissions_combo_box (FMPropertiesWindow *window, GtkGrid *grid, GtkListStore *store; GtkCellRenderer *cell; GtkTreeIter iter; + AtkObject *atk_object; + static const gchar *const descriptions[4][3] = { + { N_("Access:"), N_("Folder access:"), N_("File access:") }, + /* As the UI lacks semantic grouping, provide more context for accessibility */ + { N_("User access:"), N_("User folder access:"), N_("User file access:") }, + { N_("Group access:"), N_("Group folder access:"), N_("Group file access:") }, + { N_("Others access:"), N_("Others folder access:"), N_("Others file access:") } + }; + const guint group = short_label ? 0 : is_folder ? 1 : 2; - if (short_label) { - label = attach_title_field (grid, _("Access:")); - } else if (is_folder) { - label = attach_title_field (grid, _("Folder access:")); - } else { - label = attach_title_field (grid, _("File access:")); + g_return_if_fail (type + 1 < G_N_ELEMENTS (descriptions)); + + label = attach_title_field (grid, _(descriptions[0][group])); + + atk_object = gtk_widget_get_accessible (GTK_WIDGET (label)); + if (GTK_IS_ACCESSIBLE (atk_object)) { + atk_object_set_name (atk_object, _(descriptions[type + 1][group])); } store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); @@ -5675,14 +5706,17 @@ update_preview_callback (GtkFileChooser *icon_chooser, if (gdk_pixbuf_get_width (pixbuf) > PREVIEW_IMAGE_WIDTH) { double scale; + gint height; + gint width; - scale = (double)gdk_pixbuf_get_height (pixbuf) / - gdk_pixbuf_get_width (pixbuf); + height = gdk_pixbuf_get_height (pixbuf); + width = gdk_pixbuf_get_width (pixbuf); + scale = ((double) height) / ((double) width); scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf, PREVIEW_IMAGE_WIDTH, - scale * PREVIEW_IMAGE_WIDTH, + (int) (scale * (double) PREVIEW_IMAGE_WIDTH), GDK_INTERP_HYPER); g_object_unref (pixbuf); pixbuf = scaled_pixbuf; diff --git a/src/file-manager/fm-tree-model.c b/src/file-manager/fm-tree-model.c index 017d9f8c..fba39e1c 100644 --- a/src/file-manager/fm-tree-model.c +++ b/src/file-manager/fm-tree-model.c @@ -119,12 +119,6 @@ struct FMTreeModelRoot TreeNode *root_node; }; -typedef struct -{ - CajaDirectory *directory; - FMTreeModel *model; -} DoneLoadingParameters; - static void fm_tree_model_tree_model_init (GtkTreeModelIface *iface); static void schedule_monitoring_update (FMTreeModel *model); static void destroy_node_without_reporting (FMTreeModel *model, @@ -1101,7 +1095,7 @@ set_done_loading (FMTreeModel *model, TreeNode *node, gboolean done_loading) had_dummy = tree_node_has_dummy_child (node); - node->done_loading = done_loading; + node->done_loading = (done_loading != FALSE); if (tree_node_has_dummy_child (node)) { diff --git a/src/file-manager/fm-tree-view.c b/src/file-manager/fm-tree-view.c index 2e7cfbb5..a01f91e8 100644 --- a/src/file-manager/fm-tree-view.c +++ b/src/file-manager/fm-tree-view.c @@ -101,7 +101,6 @@ struct FMTreeViewDetails GtkWidget *popup_cut; GtkWidget *popup_copy; GtkWidget *popup_paste; - GtkWidget *popup_rename; GtkWidget *popup_trash; GtkWidget *popup_delete; GtkWidget *popup_properties; @@ -114,12 +113,6 @@ struct FMTreeViewDetails guint selection_changed_timer; }; -typedef struct -{ - GList *uris; - FMTreeView *view; -} PrependURIParameters; - static GdkAtom copied_files_atom; static void fm_tree_view_iface_init (CajaSidebarIface *iface); |
