在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。多显示器设置可能会混淆代码。
假设我使用命令 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。多显示器设置可能会混淆代码。