summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am5
-rw-r--r--src/caja-application.c33
-rw-r--r--src/caja-bookmarks-sidebar.c5
-rw-r--r--src/caja-connect-server-dialog.c23
-rw-r--r--src/caja-desktop-window.c140
-rw-r--r--src/caja-file-management-properties.c6
-rw-r--r--src/caja-image-properties-page.c161
-rw-r--r--src/caja-main.c2
-rw-r--r--src/caja-navigation-window.c10
-rw-r--r--src/caja-pathbar.c2
-rw-r--r--src/caja-places-sidebar.c11
-rw-r--r--src/caja-property-browser.c40
-rw-r--r--src/caja-query-editor.c8
-rw-r--r--src/caja-spatial-window.c13
-rw-r--r--src/caja-window.c26
-rw-r--r--src/file-manager/Makefile.am2
-rw-r--r--src/file-manager/fm-desktop-icon-view.c125
-rw-r--r--src/file-manager/fm-desktop-wayland-bg-dialog.c471
-rw-r--r--src/file-manager/fm-desktop-wayland-bg-dialog.h28
-rw-r--r--src/file-manager/fm-directory-view.c4
-rw-r--r--src/file-manager/fm-icon-view.c44
-rw-r--r--src/file-manager/fm-list-view.c8
-rw-r--r--src/file-manager/fm-properties-window.c60
-rw-r--r--src/file-manager/fm-tree-model.c8
-rw-r--r--src/file-manager/fm-tree-view.c7
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, &current_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);