在Linux中,哪个组件决定在gedit中打开一个新的window?

In Linux, Which component decides to open a new window in gedit?

假设我使用命令 gedit toto1.txt 打开一个文件,一个新的 window 显示 toto1.txt 的内容。这听起来很熟悉也很常见,但是以下两种情况并不是那么容易理解:(1) 一个新命令(比方说 gedit toto2.txt)在之前的 window 中打开一个新选项卡和 (2)新命令(假设 gedit toto3.txt)将在新 window.

中打开一个新选项卡

我的问题是:which 组件决定在情况 (2) 中打开新的 window,这样做的条件是什么?为什么它没有在情况(1)中打开一个新的 window ?

有什么想法吗?

看起来这是由 gedit 自己完成的:) 但是,如果你想在 new window 中打开文档,你可以使用 --new-window 开关。尝试从命令行使用 --help 调用 gedit。 如果您需要关于问题 "How gedit determine is it can use existing window or must open a new one?" 的直接答案,我认为您必须在 https://github.com/GNOME/gedit

上查看 gedit 源代码

是 gedit 自己做出了这个决定。让我们看一下源代码。函数 open_files 将在找不到活动的 window 时打开一个新的 window (或者当明确指定标志 --new-window 时)。

static void
open_files (GApplication            *application,
            gboolean                 new_window,
            ...)
{
        GeditWindow *window = NULL;

        if (!new_window)
        {
                window = get_active_window (GTK_APPLICATION (application));
        }

        if (window == NULL)
        {
                gedit_debug_message (DEBUG_APP, "Create main window");
                window = gedit_app_create_window (GEDIT_APP (application), NULL);

                gedit_debug_message (DEBUG_APP, "Show window");
                gtk_widget_show (GTK_WIDGET (window));
        }

        ...
}

那么什么是 "active window"?让我们看看 get_active_window:

static GeditWindow *
get_active_window (GtkApplication *app)
{
    GdkScreen *screen;
    guint workspace;
    gint viewport_x, viewport_y;
    GList *windows, *l;

    screen = gdk_screen_get_default ();

    workspace = gedit_utils_get_current_workspace (screen);
    gedit_utils_get_current_viewport (screen, &viewport_x, &viewport_y);

    /* Gtk documentation says the window list is always in MRU order */
    windows = gtk_application_get_windows (app);
    for (l = windows; l != NULL; l = l->next)
    {
        GtkWindow *window = l->data;

        if (GEDIT_IS_WINDOW (window) && is_in_viewport (window, screen, workspace, viewport_x, viewport_y))
        {
            return GEDIT_WINDOW (window);
        }
    }

    return NULL;
}

所以,答案是:如果屏幕上还没有 gedit window,gedit 将打开一个新的 window。

(好吧,这里当然可能有错误。我没有仔细看。那个 viewport_x/y 东西看起来有点可疑,因为视口应该有四个坐标:top/bottom/left/right。多显示器设置可能会混淆代码。