#ifdef HAVE_LIRC
#include "lirc.h"
#endif
+#ifdef GDK_WINDOWING_X11
+#if GTK_CHECK_VERSION(3,10,0)
+#include <gdk/gdkx.h>
+#endif
+#endif
#define MAINWINDOW_DEF_WIDTH 700
#define MAINWINDOW_DEF_HEIGHT 500
g_free(lw->options.id);
lw->options.id = NULL;
- if (!layout_find_by_layout_id("main"))
- {
- lw->options.id = g_strdup("main");
- return;
- }
-
i = 1;
while (TRUE)
{
LayoutWindow *lw;
GList *work;
-/* FIXME: this is probably not the correct way to implement this */
+/** @FIXME this is probably not the correct way to implement this */
work = layout_window_list;
while (work)
{
static gboolean path_entry_tooltip_cb(GtkWidget *widget, gpointer data)
{
- LayoutWindow *lw = data;
GList *box_child_list;
GtkComboBox *path_entry;
gchar *current_path;
return FALSE;
}
+void show_menu_scrollbar_cb(GtkWidget *widget, GdkRectangle *allocation, gpointer data)
+{
+ GtkRequisition requisition;
+
+ gtk_widget_size_request(widget, &requisition);
+
+ if (allocation->width <= requisition.width)
+ {
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(data), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
+ }
+ else
+ {
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(data), GTK_POLICY_NEVER, GTK_POLICY_NEVER);
+ }
+}
+
static GtkWidget *layout_tool_setup(LayoutWindow *lw)
{
GtkWidget *box;
GtkWidget *scd;
GtkWidget *menu_tool_bar;
GtkWidget *tabcomp;
+ GtkWidget *menu_bar;
+ GtkWidget *toolbar;
+ GtkWidget *scroll_window;
box = gtk_vbox_new(FALSE, 0);
- menu_tool_bar = layout_actions_menu_tool_bar(lw);
- DEBUG_NAME(menu_tool_bar);
- gtk_widget_show(menu_tool_bar);
- gtk_box_pack_start(GTK_BOX(lw->main_box), lw->menu_tool_bar, FALSE, FALSE, 0);
- if (lw->options.toolbar_hidden) gtk_widget_hide(lw->toolbar[TOOLBAR_MAIN]);
+ if (!options->expand_menu_toolbar)
+ {
+ menu_bar = layout_actions_menu_bar(lw);
+
+ toolbar = layout_actions_toolbar(lw, TOOLBAR_MAIN);
+ scroll_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll_window), menu_bar);
+ g_signal_connect(G_OBJECT(menu_bar), "size-allocate", G_CALLBACK(show_menu_scrollbar_cb), scroll_window);
+
+ gtk_widget_show(scroll_window);
+ gtk_widget_show(menu_bar);
+ if (lw->options.toolbar_hidden) gtk_widget_hide(toolbar);
+
+ gtk_box_pack_start(GTK_BOX(box), scroll_window, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(box), toolbar, FALSE, FALSE, 0);
+ }
+ else
+ {
+ menu_tool_bar = layout_actions_menu_tool_bar(lw);
+ DEBUG_NAME(menu_tool_bar);
+ gtk_widget_show(menu_tool_bar);
+ gtk_box_pack_start(GTK_BOX(lw->main_box), lw->menu_tool_bar, FALSE, FALSE, 0);
+ if (lw->options.toolbar_hidden) gtk_widget_hide(lw->toolbar[TOOLBAR_MAIN]);
+ }
tabcomp = tab_completion_new_with_history(&lw->path_entry, NULL, "path_list", -1,
layout_path_entry_cb, lw);
void layout_status_update_progress(LayoutWindow *lw, gdouble val, const gchar *text)
{
- static gdouble thumb = 0;
static gdouble meta = 0;
if (!layout_valid(&lw)) return;
*/
if(!g_strcmp0(text, "Loading thumbs..."))
{
- thumb = val;
if (meta)
{
return;
void layout_status_update_info(LayoutWindow *lw, const gchar *text)
{
gchar *buf = NULL;
+ gint hrs;
+ gint min;
+ gdouble sec;
+ GString *delay;
if (!layout_valid(&lw)) return;
{
guint s;
gint64 s_bytes = 0;
- const gchar *ss;
+ gchar *ss;
if (layout_image_slideshow_active(lw))
{
+
if (!layout_image_slideshow_paused(lw))
{
- ss = _(" Slideshow");
+ delay = g_string_new(_(" Slideshow ["));
}
else
{
- ss = _(" Paused");
+ delay = g_string_new(_(" Paused ["));
+ }
+ hrs = options->slideshow.delay / (36000);
+ min = (options->slideshow.delay -(36000 * hrs))/600;
+ sec = (gdouble)(options->slideshow.delay -(36000 * hrs)-(min * 600)) / 10;
+
+ if (hrs > 0)
+ {
+ g_string_append_printf(delay, "%dh ", hrs);
}
+ if (min > 0)
+ {
+ g_string_append_printf(delay, "%dm ", min);
+ }
+ g_string_append_printf(delay, "%.1fs]", sec);
+
+ ss = g_strdup(delay->str);
+
+ g_string_free(delay, TRUE);
}
else
{
- ss = "";
+ ss = g_strdup("");
}
s = layout_selection_count(lw, &s_bytes);
buf = g_strdup_printf(_("%s, %d files (%s, %d)%s"), b, n, sb, s, ss);
g_free(b);
g_free(sb);
+ g_free(ss);
}
else if (n > 0)
{
gchar *b = text_from_size_abrev(n_bytes);
buf = g_strdup_printf(_("%s, %d files%s"), b, n, ss);
g_free(b);
+ g_free(ss);
}
else
{
buf = g_strdup_printf(_("%d files%s"), n, ss);
+ g_free(ss);
}
text = buf;
lw->info_status = layout_status_label(NULL, lw->info_box, TRUE, 0, (!small_format));
DEBUG_NAME(lw->info_status);
- gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_status), _("Folder contents (files selected)"));
+ gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_status), _("Folder contents (files selected)\nSlideshow [time interval]"));
if (small_format)
{
if (lw->vf) vf_select_invert(lw->vf);
}
+void layout_select_list(LayoutWindow *lw, GList *list)
+{
+ if (!layout_valid(&lw)) return;
+
+ if (lw->vf)
+ {
+ vf_select_list(lw->vf, list);
+ }
+}
+
void layout_mark_to_selection(LayoutWindow *lw, gint mark, MarkToSelectionMode mode)
{
if (!layout_valid(&lw)) return;
gtk_window_set_resizable(GTK_WINDOW(lw->tools), TRUE);
gtk_container_set_border_width(GTK_CONTAINER(lw->tools), 0);
- gtk_container_remove(GTK_CONTAINER(lw->main_box), lw->menu_tool_bar);
+ if (options->expand_menu_toolbar) gtk_container_remove(GTK_CONTAINER(lw->main_box), lw->menu_tool_bar);
new_window = TRUE;
}
vbox = gtk_vbox_new(FALSE, 0);
DEBUG_NAME(vbox);
gtk_container_add(GTK_CONTAINER(lw->tools), vbox);
- gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(lw->menu_tool_bar), FALSE, FALSE, 0);
+ if (options->expand_menu_toolbar) gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(lw->menu_tool_bar), FALSE, FALSE, 0);
gtk_widget_show(vbox);
layout_status_setup(lw, vbox, TRUE);
lw->group_box = gtk_vbox_new(FALSE, 0);
DEBUG_NAME(lw->group_box);
- gtk_box_pack_end(GTK_BOX(lw->main_box), lw->group_box, TRUE, TRUE, 0);
+ if (options->expand_menu_toolbar)
+ {
+ gtk_box_pack_end(GTK_BOX(lw->main_box), lw->group_box, TRUE, TRUE, 0);
+ }
+ else
+ {
+ gtk_box_pack_start(GTK_BOX(lw->main_box), lw->group_box, TRUE, TRUE, 0);
+ }
gtk_widget_show(lw->group_box);
priority_location = layout_grid_compass(lw);
/* lw->image is preserved together with lw->utility_box */
if (lw->utility_box) gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(lw->utility_box)), lw->utility_box);
- if (lw->toolbar[TOOLBAR_STATUS]) gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(lw->toolbar[TOOLBAR_STATUS])), lw->toolbar[TOOLBAR_STATUS]);
+ if (options->expand_menu_toolbar)
+ {
+ if (lw->toolbar[TOOLBAR_STATUS]) gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(lw->toolbar[TOOLBAR_STATUS])), lw->toolbar[TOOLBAR_STATUS]);
- if (lw->menu_tool_bar) gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(lw->menu_tool_bar)), lw->menu_tool_bar);
+ if (lw->menu_tool_bar) gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(lw->menu_tool_bar)), lw->menu_tool_bar);
+ }
+ else
+ {
+ if (lw->menu_bar) gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(lw->menu_bar)), lw->menu_bar);
+ for (i = 0; i < TOOLBAR_COUNT; i++)
+ if (lw->toolbar[i]) gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(lw->toolbar[i])), lw->toolbar[i]);
+ }
/* clear it all */
void layout_sync_options_with_current_state(LayoutWindow *lw)
{
Histogram *histogram;
+#ifdef GDK_WINDOWING_X11
+#if GTK_CHECK_VERSION(3,10,0)
+ GdkWindow *window;
+#endif
+#endif
+
if (!layout_valid(&lw)) return;
lw->options.main_window.maximized = window_maximized(lw->window);
layout_geometry_get_log_window(lw, &lw->options.log_window.x, &lw->options.log_window.y,
&lw->options.log_window.w, &lw->options.log_window.h);
+#ifdef GDK_WINDOWING_X11
+#if GTK_CHECK_VERSION(3,10,0)
+ GdkDisplay *display;
+
+ if (options->save_window_workspace)
+ {
+ display = gdk_display_get_default();
+
+ if (GDK_IS_X11_DISPLAY(display))
+ {
+ window = gtk_widget_get_window(GTK_WIDGET(lw->window));
+ lw->options.workspace = gdk_x11_window_get_desktop(window);
+ }
+ }
+#endif
+#endif
+ return;
}
void layout_apply_options(LayoutWindow *lw, LayoutOptions *lop)
gboolean refresh_lists;
if (!layout_valid(&lw)) return;
-/* FIXME: add other options too */
+/** @FIXME add other options too */
refresh_style = (lop->style != lw->options.style || strcmp(lop->order, lw->options.order) != 0);
refresh_lists = (lop->show_directory_date != lw->options.show_directory_date);
gchar *path;
gchar *xml_name;
- if (!g_str_has_prefix(lw->options.id, "lw") && !g_str_equal(lw->options.id, "main"))
+ if (!g_str_has_prefix(lw->options.id, "lw"))
{
xml_name = g_strdup_printf("%s.xml", lw->options.id);
path = g_build_filename(get_window_layouts_dir(), xml_name, NULL);
if (layout_window_list && layout_window_list->next)
{
- if (g_strcmp0(lw->options.id, "main") == 0)
- {
- while (layout_window_list && layout_window_list->next)
- {
- list = layout_window_list;
- while (list)
- {
- tmp_lw = list->data;
- if (g_strcmp0(tmp_lw->options.id, "main") != 0)
- {
- save_layout(list->data);
- layout_free(list->data);
- break;
- }
- list = list->next;
- }
- }
- exit_program();
- }
- else
- {
- save_layout(lw);
- layout_free(lw);
- }
+ save_layout(lw);
+ layout_free(lw);
}
else
{
return defined_mouse_buttons(widget, event, data);
}
+static gboolean move_window_to_workspace_cb(gpointer data)
+{
+#ifdef GDK_WINDOWING_X11
+#if GTK_CHECK_VERSION(3,10,0)
+ LayoutWindow *lw = data;
+ GdkWindow *window;
+ GdkDisplay *display;
+
+ if (options->save_window_workspace)
+ {
+ display = gdk_display_get_default();
+
+ if (GDK_IS_X11_DISPLAY(display))
+ {
+ if (lw->options.workspace != -1)
+ {
+ window = gtk_widget_get_window(GTK_WIDGET(lw->window));
+ gdk_x11_window_move_to_desktop(window, lw->options.workspace);
+ }
+ }
+ }
+#endif
+#endif
+ return FALSE;
+}
+
LayoutWindow *layout_new_with_geometry(FileData *dir_fd, LayoutOptions *lop,
const gchar *geometry)
{
gtk_window_move(GTK_WINDOW(lw->window), lw->options.main_window.x, lw->options.main_window.y);
if (lw->options.main_window.maximized) gtk_window_maximize(GTK_WINDOW(lw->window));
// }
+
+ g_idle_add(move_window_to_workspace_cb, lw);
}
else
{
pixbuf = pixbuf_inline(PIXBUF_INLINE_LOGO);
- /* FIXME: the zoom value set here is the value, which is then copied again and again
+ /** @FIXME the zoom value set here is the value, which is then copied again and again
in "Leave Zoom at previous setting" mode. This is not ideal. */
image_change_pixbuf(lw->image, pixbuf, 0.0, FALSE);
g_object_unref(pixbuf);
WRITE_NL(); WRITE_BOOL(*layout, show_thumbnails);
WRITE_NL(); WRITE_BOOL(*layout, show_directory_date);
WRITE_NL(); WRITE_CHAR(*layout, home_path);
- WRITE_NL(); WRITE_CHAR(*layout, last_path);
WRITE_NL(); WRITE_UINT(*layout, startup_path);
WRITE_SEPARATOR();
WRITE_NL(); WRITE_BOOL(*layout, main_window.maximized);
WRITE_NL(); WRITE_INT(*layout, main_window.hdivider_pos);
WRITE_NL(); WRITE_INT(*layout, main_window.vdivider_pos);
+ WRITE_NL(); WRITE_INT(*layout, workspace);
WRITE_SEPARATOR();
WRITE_NL(); WRITE_INT(*layout, folder_window.vdivider_pos);
WRITE_NL(); WRITE_BOOL(*layout, toolbar_hidden);
WRITE_NL(); WRITE_BOOL(*layout, show_info_pixel);
+ WRITE_NL(); WRITE_BOOL(*layout, ignore_alpha);
WRITE_SEPARATOR();
WRITE_NL(); WRITE_BOOL(*layout, bars_state.info);
WRITE_NL(); WRITE_INT(*layout, log_window.y);
WRITE_NL(); WRITE_INT(*layout, log_window.w);
WRITE_NL(); WRITE_INT(*layout, log_window.h);
+
+ WRITE_NL(); WRITE_INT(*layout, preferences_window.x);
+ WRITE_NL(); WRITE_INT(*layout, preferences_window.y);
+ WRITE_NL(); WRITE_INT(*layout, preferences_window.w);
+ WRITE_NL(); WRITE_INT(*layout, preferences_window.h);
+ WRITE_NL(); WRITE_INT(*layout, preferences_window.page_number);
+
+ WRITE_NL(); WRITE_INT(*layout, search_window.x);
+ WRITE_NL(); WRITE_INT(*layout, search_window.y);
+ WRITE_NL(); WRITE_INT(*layout, search_window.w);
+ WRITE_NL(); WRITE_INT(*layout, search_window.h);
+
+ WRITE_NL(); WRITE_INT(*layout, dupe_window.x);
+ WRITE_NL(); WRITE_INT(*layout, dupe_window.y);
+ WRITE_NL(); WRITE_INT(*layout, dupe_window.w);
+ WRITE_NL(); WRITE_INT(*layout, dupe_window.h);
WRITE_SEPARATOR();
WRITE_NL(); WRITE_BOOL(*layout, animate);
if (READ_BOOL(*layout, show_thumbnails)) continue;
if (READ_BOOL(*layout, show_directory_date)) continue;
if (READ_CHAR(*layout, home_path)) continue;
- if (READ_CHAR(*layout, last_path)) continue;
if (READ_UINT_CLAMP(*layout, startup_path, 0, STARTUP_PATH_HOME)) continue;
/* window positions */
if (READ_BOOL(*layout, tools_hidden)) continue;
if (READ_BOOL(*layout, toolbar_hidden)) continue;
if (READ_BOOL(*layout, show_info_pixel)) continue;
+ if (READ_BOOL(*layout, ignore_alpha)) continue;
if (READ_BOOL(*layout, bars_state.info)) continue;
if (READ_BOOL(*layout, bars_state.sort)) continue;
if (READ_INT(*layout, log_window.w)) continue;
if (READ_INT(*layout, log_window.h)) continue;
+ if (READ_INT(*layout, preferences_window.x)) continue;
+ if (READ_INT(*layout, preferences_window.y)) continue;
+ if (READ_INT(*layout, preferences_window.w)) continue;
+ if (READ_INT(*layout, preferences_window.h)) continue;
+ if (READ_INT(*layout, preferences_window.page_number)) continue;
+
+ if (READ_INT(*layout, search_window.x)) continue;
+ if (READ_INT(*layout, search_window.y)) continue;
+ if (READ_INT(*layout, search_window.w)) continue;
+ if (READ_INT(*layout, search_window.h)) continue;
+
+ if (READ_INT(*layout, dupe_window.x)) continue;
+ if (READ_INT(*layout, dupe_window.y)) continue;
+ if (READ_INT(*layout, dupe_window.w)) continue;
+ if (READ_INT(*layout, dupe_window.h)) continue;
+
if (READ_BOOL(*layout, animate)) continue;
+ if (READ_INT(*layout, workspace)) continue;
log_printf("unknown attribute %s = %s\n", option, value);
}
switch (lop->startup_path)
{
case STARTUP_PATH_LAST:
- *path = (lop->last_path && isdir(lop->last_path)) ? g_strdup(lop->last_path) : get_current_dir();
+ *path = (history_list_find_last_path_by_key("path_list") && isdir(history_list_find_last_path_by_key("path_list"))) ? g_strdup(history_list_find_last_path_by_key("path_list")) : get_current_dir();
break;
case STARTUP_PATH_HOME:
*path = (lop->home_path && isdir(lop->home_path)) ? g_strdup(lop->home_path) : g_strdup(homedir());
}
}
+static gboolean first_found = FALSE;
+
LayoutWindow *layout_new_from_config(const gchar **attribute_names, const gchar **attribute_values, gboolean use_commandline)
{
LayoutOptions lop;
if (attribute_names) layout_load_attributes(&lop, attribute_names, attribute_values);
- if (use_commandline)
+ /* If multiple windows are specified in the config. file,
+ * use the command line options only in the main window.
+ */
+ if (use_commandline && !first_found)
{
+ first_found = TRUE;
layout_config_commandline(&lop, &path);
}
else