📄 layout.c
字号:
*w3 = files; layout_location_compute(lw->dir_location, lw->image_location, tools, image, w1, w2); } } else { /* image */ if (layout_location_first(lw->image_location)) { *w1 = image; layout_location_compute(lw->file_location, lw->dir_location, files, tools, w2, w3); } else { *w3 = image; layout_location_compute(lw->file_location, lw->dir_location, files, tools, w1, w2); } }}static void layout_grid_setup(LayoutWindow *lw){ gint priority_location; GtkWidget *h; GtkWidget *v; GtkWidget *w1, *w2, *w3; GtkWidget *image; GtkWidget *tools; GtkWidget *files; layout_actions_setup(lw); layout_actions_add_window(lw, lw->window); lw->group_box = gtk_vbox_new(FALSE, 0); 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); image = layout_image_new(lw, NULL); tools = layout_tools_new(lw); files = layout_list_new(lw); image = layout_bars_prepare(lw, image); if (lw->tools_float || lw->tools_hidden) { gtk_box_pack_start(GTK_BOX(lw->group_box), image, TRUE, TRUE, 0); gtk_widget_show(image); layout_tools_setup(lw, tools, files); gtk_widget_grab_focus(lw->image->widget); return; } else if (lw->tools) { layout_tools_geometry_sync(lw); gtk_widget_destroy(lw->tools); lw->tools = NULL; lw->tools_pane = NULL; } layout_status_setup(lw, lw->group_box, FALSE); layout_grid_compute(lw, image, tools, files, &w1, &w2, &w3); v = lw->v_pane = gtk_vpaned_new(); h = lw->h_pane = gtk_hpaned_new(); if (!layout_location_vertical(priority_location)) { GtkWidget *tmp; tmp = v; v = h; h = tmp; } gtk_box_pack_start(GTK_BOX(lw->group_box), v, TRUE, TRUE, 0); if (!layout_location_first(priority_location)) { gtk_paned_pack1(GTK_PANED(v), h, FALSE, TRUE); gtk_paned_pack2(GTK_PANED(v), w3, TRUE, TRUE); gtk_paned_pack1(GTK_PANED(h), w1, FALSE, TRUE); gtk_paned_pack2(GTK_PANED(h), w2, TRUE, TRUE); } else { gtk_paned_pack1(GTK_PANED(v), w1, FALSE, TRUE); gtk_paned_pack2(GTK_PANED(v), h, TRUE, TRUE); gtk_paned_pack1(GTK_PANED(h), w2, FALSE, TRUE); gtk_paned_pack2(GTK_PANED(h), w3, TRUE, TRUE); } gtk_widget_show(image); gtk_widget_show(tools); gtk_widget_show(files); gtk_widget_show(v); gtk_widget_show(h); /* fix to have image pane visible when it is left and priority widget */ if (lw->div_h == -1 && w1 == image && !layout_location_vertical(priority_location) && layout_location_first(priority_location)) { gtk_widget_set_size_request(image, 200, -1); } gtk_paned_set_position(GTK_PANED(lw->h_pane), lw->div_h); gtk_paned_set_position(GTK_PANED(lw->v_pane), lw->div_v); gtk_widget_grab_focus(lw->image->widget);}void layout_style_set(LayoutWindow *lw, gint style, const gchar *order){ gchar *path; ImageWindow *old_image; if (!layout_valid(&lw)) return; if (style != -1) { LayoutLocation d, f, i; layout_config_parse(style, order, &d, &f, &i); if (lw->dir_location == d && lw->file_location == f && lw->image_location == i) return; lw->dir_location = d; lw->file_location = f; lw->image_location = i; } /* remember state */ layout_image_slideshow_stop(lw); layout_image_full_screen_stop(lw); path = lw->path; lw->path = NULL; old_image = lw->image; lw->image = NULL; lw->utility_box = NULL; layout_geometry_get_dividers(lw, &lw->div_h, &lw->div_v); /* clear it all */ gtk_widget_hide(old_image->widget); gtk_widget_ref(old_image->widget); gtk_container_remove(GTK_CONTAINER(old_image->widget->parent), old_image->widget); lw->h_pane = NULL; lw->v_pane = NULL; lw->toolbar = NULL; lw->thumb_button = NULL; lw->path_entry = NULL; lw->dir_view = NULL; lw->vdl = NULL; lw->vdt = NULL; lw->file_view = NULL; lw->vfl = NULL; lw->vfi = NULL; lw->info_box = NULL; lw->info_progress_bar = NULL; lw->info_sort = NULL; lw->info_status = NULL; lw->info_details = NULL; lw->info_zoom = NULL; if (lw->ui_manager) g_object_unref(lw->ui_manager); lw->ui_manager = NULL; lw->action_group = NULL; gtk_container_remove(GTK_CONTAINER(lw->main_box), lw->group_box); lw->group_box = NULL; /* re-fill */ layout_grid_setup(lw); layout_tools_hide(lw, lw->tools_hidden); layout_list_sync_sort(lw); layout_util_sync(lw); layout_status_update_all(lw); /* sync */ if (image_get_path(old_image)) { layout_set_path(lw, image_get_path(old_image)); } else { layout_set_path(lw, path); } image_change_from_image(lw->image, old_image); image_top_window_set_sync(lw->image, (lw->tools_float || lw->tools_hidden)); /* clean up */ gtk_widget_unref(old_image->widget); g_free(path);}void layout_styles_update(void){ GList *work; work = layout_window_list; while (work) { LayoutWindow *lw = work->data; work = work->next; layout_style_set(lw, layout_style, layout_order); }}void layout_colors_update(void){ GList *work; work = layout_window_list; while (work) { LayoutWindow *lw = work->data; work = work->next; if (lw->image) image_background_set_black(lw->image, black_window_background); }}void layout_tools_float_toggle(LayoutWindow *lw){ gint popped; if (!lw) return; if (!lw->tools_hidden) { popped = !lw->tools_float; } else { popped = TRUE; } if (lw->tools_float == popped) { if (popped && lw->tools_hidden) { layout_tools_float_set(lw, popped, FALSE); } } else { if (lw->tools_float) { layout_tools_float_set(lw, FALSE, FALSE); } else { layout_tools_float_set(lw, TRUE, FALSE); } }}void layout_tools_hide_toggle(LayoutWindow *lw){ if (!lw) return; layout_tools_float_set(lw, lw->tools_float, !lw->tools_hidden);}void layout_tools_float_set(LayoutWindow *lw, gint popped, gint hidden){ if (!layout_valid(&lw)) return; if (lw->tools_float == popped && lw->tools_hidden == hidden) return; if (lw->tools_float == popped && lw->tools_float && lw->tools) { layout_tools_hide(lw, hidden); return; } lw->tools_float = popped; lw->tools_hidden = hidden; layout_style_set(lw, -1, NULL);}gint layout_tools_float_get(LayoutWindow *lw, gint *popped, gint *hidden){ if (!layout_valid(&lw)) return FALSE; *popped = lw->tools_float; *hidden = lw->tools_hidden; return TRUE;}void layout_toolbar_toggle(LayoutWindow *lw){ if (!layout_valid(&lw)) return; if (!lw->toolbar) return; lw->toolbar_hidden = !lw->toolbar_hidden; if (lw->toolbar_hidden) { if (GTK_WIDGET_VISIBLE(lw->toolbar)) gtk_widget_hide(lw->toolbar); } else { if (!GTK_WIDGET_VISIBLE(lw->toolbar)) gtk_widget_show(lw->toolbar); }}gint layout_toolbar_hidden(LayoutWindow *lw){ if (!layout_valid(&lw)) return TRUE; return lw->toolbar_hidden;}/* *----------------------------------------------------------------------------- * base *----------------------------------------------------------------------------- */void layout_close(LayoutWindow *lw){ if (layout_window_list && layout_window_list->next) { layout_free(lw); } else { exit_gqview(); }}void layout_free(LayoutWindow *lw){ if (!lw) return; layout_window_list = g_list_remove(layout_window_list, lw); if (lw->last_time_id != -1) { g_source_remove(lw->last_time_id); } layout_bars_close(lw); gtk_widget_destroy(lw->window); g_free(lw->path); g_free(lw);}static gint layout_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data){ LayoutWindow *lw = data; layout_close(lw); return TRUE;}LayoutWindow *layout_new(const gchar *path, gint popped, gint hidden){ LayoutWindow *lw; GdkGeometry geometry; GdkWindowHints hints; lw = g_new0(LayoutWindow, 1); lw->thumbs_enabled = thumbnails_enabled; lw->sort_method = SORT_NAME; lw->sort_ascend = TRUE; lw->tools_float = popped; lw->tools_hidden = hidden; lw->toolbar_hidden = toolbar_hidden; lw->utility_box = NULL; lw->bar_sort = NULL; lw->bar_sort_enabled = FALSE; lw->bar_exif = NULL; lw->bar_exif_enabled = FALSE; lw->bar_exif_size = -1; lw->bar_exif_advanced = FALSE; lw->full_screen_overlay_id = -1; lw->full_screen_overlay_on = FALSE; /* default layout */ layout_config_parse(layout_style, layout_order, &lw->dir_location, &lw->file_location, &lw->image_location); lw->tree_view = layout_view_tree; lw->icon_view = layout_view_icons; /* divider positions */ if (save_window_positions) { lw->div_h = window_hdivider_pos; lw->div_v = window_vdivider_pos; lw->div_float = float_window_divider; } else { lw->div_h = MAIN_WINDOW_DIV_HPOS; lw->div_v = MAIN_WINDOW_DIV_VPOS; lw->div_float = MAIN_WINDOW_DIV_VPOS; } /* window */ lw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_resizable(GTK_WINDOW(lw->window), TRUE); gtk_window_set_title(GTK_WINDOW(lw->window), "GQview"); gtk_window_set_wmclass(GTK_WINDOW(lw->window), "gqview", "GQview"); gtk_container_set_border_width(GTK_CONTAINER(lw->window), 0); window_set_icon(lw->window, NULL, NULL); if (save_window_positions) { hints = GDK_HINT_USER_POS; } else { hints = 0; } geometry.min_width = 32; geometry.min_height = 32; geometry.base_width = MAINWINDOW_DEF_WIDTH; geometry.base_height = MAINWINDOW_DEF_HEIGHT; gtk_window_set_geometry_hints(GTK_WINDOW(lw->window), NULL, &geometry, GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE | hints); if (save_window_positions) { gtk_window_set_default_size(GTK_WINDOW(lw->window), main_window_w, main_window_h); if (!layout_window_list) { gtk_window_move(GTK_WINDOW(lw->window), main_window_x, main_window_y); if (main_window_maximized) gtk_window_maximize(GTK_WINDOW(lw->window)); } } else { gtk_window_set_default_size(GTK_WINDOW(lw->window), MAINWINDOW_DEF_WIDTH, MAINWINDOW_DEF_HEIGHT); } g_signal_connect(G_OBJECT(lw->window), "delete_event", G_CALLBACK(layout_delete_cb), lw); layout_keyboard_init(lw, lw->window); lw->main_box = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(lw->window), lw->main_box); gtk_widget_show(lw->main_box); layout_grid_setup(lw); image_top_window_set_sync(lw->image, (lw->tools_float || lw->tools_hidden)); layout_util_sync(lw); layout_status_update_all(lw); if (path) { layout_set_path(lw, path); } else { GdkPixbuf *pixbuf; pixbuf = pixbuf_inline(PIXBUF_INLINE_LOGO); image_change_pixbuf(lw->image, pixbuf, 1.0); gdk_pixbuf_unref(pixbuf); } /* set up the time stat timeout */ lw->last_time = 0; lw->last_time_id = g_timeout_add(5000, layout_check_for_update_cb, lw); gtk_widget_show(lw->window); layout_tools_hide(lw, lw->tools_hidden); layout_window_list = g_list_append(layout_window_list, lw); return lw;}/* *----------------------------------------------------------------------------- * maintenance (for rename, move, remove) *----------------------------------------------------------------------------- */static void layout_real_time_update(LayoutWindow *lw){ /* this resets the last time stamp of path so that a refresh does not occur * from an internal file operation. */ if (lw->path) lw->last_time = filetime(lw->path);}static void layout_real_renamed(LayoutWindow *lw, const gchar *source, const gchar *dest){ gint update = FALSE; if (lw->image) layout_image_maint_renamed(lw, source, dest); if (lw->vfl) update |= vflist_maint_renamed(lw->vfl, source, dest); if (lw->vfi) update |= vficon_maint_renamed(lw->vfi, source, dest); if (update) layout_real_time_update(lw);}static void layout_real_removed(LayoutWindow *lw, const gchar *path, GList *ignore_list){ gint update = FALSE; if (lw->image) layout_image_maint_removed(lw, path); if (lw->vfl) update |= vflist_maint_removed(lw->vfl, path, ignore_list); if (lw->vfi) update |= vficon_maint_removed(lw->vfi, path, ignore_list); if (update) layout_real_time_update(lw);}static void layout_real_moved(LayoutWindow *lw, const gchar *source, const gchar *dest, GList *ignore_list){ gint update = FALSE; if (lw->image) layout_image_maint_moved(lw, source, dest); if (lw->vfl) update |= vflist_maint_moved(lw->vfl, source, dest, ignore_list); if (lw->vfi) update |= vficon_maint_moved(lw->vfi, source, dest, ignore_list); if (update) layout_real_time_update(lw);}void layout_maint_renamed(const gchar *source, const gchar *dest){ GList *work = layout_window_list; while (work) { LayoutWindow *lw = work->data; work = work->next; layout_real_renamed(lw, source, dest); }}void layout_maint_removed(const gchar *path, GList *ignore_list){ GList *work = layout_window_list; while (work) { LayoutWindow *lw = work->data; work = work->next; layout_real_removed(lw, path, ignore_list); }}void layout_maint_moved(const gchar *source, const gchar *dest, GList *ignore_list){ GList *work = layout_window_list; while (work) { LayoutWindow *lw = work->data; work = work->next; layout_real_moved(lw, source, dest, ignore_list); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -