mirror of https://github.com/GNOME/gimp.git
app: pass the startup monitor to displays opened from the copmmand line
Change gimp_get_display_name() to also return the screen, and its implementation in the GUI to return the initial monitor during startup. Retrieve that information in app.c using a weird callback construct and pass the monitor to file_open_from_command_line(). Half-related, add screen and monitor parameters to GimpDisplayShell and use these initial values for calculating the canvas's initial extents. The image windows still don't position themselves correctly though because we have no mechanism for that whatsoever just yet, but we now at least pass the needed monitor information to the right objects.
This commit is contained in:
parent
7cdede6dec
commit
8356003fa2
32
app/app.c
32
app/app.c
|
@ -73,11 +73,19 @@
|
|||
static void app_init_update_noop (const gchar *text1,
|
||||
const gchar *text2,
|
||||
gdouble percentage);
|
||||
static void app_restore_after_callback (Gimp *gimp,
|
||||
GimpInitStatusFunc status_callback);
|
||||
static gboolean app_exit_after_callback (Gimp *gimp,
|
||||
gboolean kill_it,
|
||||
GMainLoop **loop);
|
||||
|
||||
|
||||
/* local variables */
|
||||
|
||||
static GObject *initial_screen = NULL;
|
||||
static gint initial_monitor = 0;
|
||||
|
||||
|
||||
/* public functions */
|
||||
|
||||
void
|
||||
|
@ -224,6 +232,14 @@ app_run (const gchar *full_prog_name,
|
|||
/* initialize lowlevel stuff */
|
||||
gimp_gegl_init (gimp);
|
||||
|
||||
/* Connect our restore_after callback before gui_init() connects
|
||||
* theirs, so ours runs first and can grab the initial monitor
|
||||
* before the GUI's restore_after callback resets it.
|
||||
*/
|
||||
g_signal_connect_after (gimp, "restore",
|
||||
G_CALLBACK (app_restore_after_callback),
|
||||
NULL);
|
||||
|
||||
#ifndef GIMP_CONSOLE_COMPILATION
|
||||
if (! no_interface)
|
||||
update_status_func = gui_init (gimp, no_splash);
|
||||
|
@ -262,8 +278,8 @@ app_run (const gchar *full_prog_name,
|
|||
{
|
||||
if (run_loop)
|
||||
file_open_from_command_line (gimp, filenames[i], as_new,
|
||||
NULL, /* FIXME monitor */
|
||||
0 /* FIXME monitor */);
|
||||
initial_screen,
|
||||
initial_monitor);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -298,6 +314,18 @@ app_init_update_noop (const gchar *text1,
|
|||
/* deliberately do nothing */
|
||||
}
|
||||
|
||||
static void
|
||||
app_restore_after_callback (Gimp *gimp,
|
||||
GimpInitStatusFunc status_callback)
|
||||
{
|
||||
/* Getting the display name for a -1 display returns the initial
|
||||
* monitor during startup. Need to call this from a restore_after
|
||||
* callback, because before restore(), the GUI can't return anything,
|
||||
* after after restore() the initial monitor gets reset.
|
||||
*/
|
||||
g_free (gimp_get_display_name (gimp, -1, &initial_screen, &initial_monitor));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
app_exit_after_callback (Gimp *gimp,
|
||||
gboolean kill_it,
|
||||
|
|
|
@ -216,15 +216,18 @@ gimp_get_program_class (Gimp *gimp)
|
|||
gchar *
|
||||
gimp_get_display_name (Gimp *gimp,
|
||||
gint display_ID,
|
||||
gint *monitor_number)
|
||||
GObject **screen,
|
||||
gint *monitor)
|
||||
{
|
||||
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
|
||||
g_return_val_if_fail (monitor_number != NULL, NULL);
|
||||
g_return_val_if_fail (screen != NULL, NULL);
|
||||
g_return_val_if_fail (monitor != NULL, NULL);
|
||||
|
||||
if (gimp->gui.get_display_name)
|
||||
return gimp->gui.get_display_name (gimp, display_ID, monitor_number);
|
||||
return gimp->gui.get_display_name (gimp, display_ID, screen, monitor);
|
||||
|
||||
*monitor_number = 0;
|
||||
*screen = NULL;
|
||||
*monitor = 0;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -44,7 +44,8 @@ struct _GimpGui
|
|||
const gchar * (* get_program_class) (Gimp *gimp);
|
||||
gchar * (* get_display_name) (Gimp *gimp,
|
||||
gint display_ID,
|
||||
gint *monitor_number);
|
||||
GObject **screen,
|
||||
gint *monitor);
|
||||
guint32 (* get_user_time) (Gimp *gimp);
|
||||
|
||||
const gchar * (* get_theme_dir) (Gimp *gimp);
|
||||
|
@ -144,7 +145,8 @@ void gimp_free_progress (Gimp *gimp,
|
|||
const gchar * gimp_get_program_class (Gimp *gimp);
|
||||
gchar * gimp_get_display_name (Gimp *gimp,
|
||||
gint display_ID,
|
||||
gint *monitor_number);
|
||||
GObject **screen,
|
||||
gint *monitor);
|
||||
guint32 gimp_get_user_time (Gimp *gimp);
|
||||
const gchar * gimp_get_theme_dir (Gimp *gimp);
|
||||
|
||||
|
|
|
@ -453,7 +453,9 @@ gimp_display_new (Gimp *gimp,
|
|||
|
||||
/* create the shell for the image */
|
||||
private->shell = gimp_display_shell_new (display, unit, scale,
|
||||
popup_manager);
|
||||
popup_manager,
|
||||
screen,
|
||||
monitor);
|
||||
|
||||
shell = gimp_display_get_shell (display);
|
||||
|
||||
|
|
|
@ -96,6 +96,8 @@ enum
|
|||
{
|
||||
PROP_0,
|
||||
PROP_POPUP_MANAGER,
|
||||
PROP_INITIAL_SCREEN,
|
||||
PROP_INITIAL_MONITOR,
|
||||
PROP_DISPLAY,
|
||||
PROP_UNIT,
|
||||
PROP_TITLE,
|
||||
|
@ -257,6 +259,20 @@ gimp_display_shell_class_init (GimpDisplayShellClass *klass)
|
|||
GIMP_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
g_object_class_install_property (object_class, PROP_INITIAL_SCREEN,
|
||||
g_param_spec_object ("initial-screen",
|
||||
NULL, NULL,
|
||||
GDK_TYPE_SCREEN,
|
||||
GIMP_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
g_object_class_install_property (object_class, PROP_INITIAL_MONITOR,
|
||||
g_param_spec_int ("initial-monitor",
|
||||
NULL, NULL,
|
||||
0, 16, 0,
|
||||
GIMP_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
g_object_class_install_property (object_class, PROP_DISPLAY,
|
||||
g_param_spec_object ("display", NULL, NULL,
|
||||
GIMP_TYPE_DISPLAY,
|
||||
|
@ -370,7 +386,6 @@ gimp_display_shell_constructed (GObject *object)
|
|||
GtkWidget *lower_hbox;
|
||||
GtkWidget *inner_table;
|
||||
GtkWidget *gtk_image;
|
||||
GdkScreen *screen;
|
||||
GtkAction *action;
|
||||
gint image_width;
|
||||
gint image_height;
|
||||
|
@ -402,12 +417,10 @@ gimp_display_shell_constructed (GObject *object)
|
|||
|
||||
shell->dot_for_dot = config->default_dot_for_dot;
|
||||
|
||||
screen = gtk_widget_get_screen (GTK_WIDGET (shell));
|
||||
|
||||
if (config->monitor_res_from_gdk)
|
||||
{
|
||||
gimp_get_monitor_resolution (screen, /* FIXME monitor */
|
||||
0, /* FIXME monitor */
|
||||
gimp_get_monitor_resolution (shell->initial_screen,
|
||||
shell->initial_monitor,
|
||||
&shell->monitor_xres, &shell->monitor_yres);
|
||||
}
|
||||
else
|
||||
|
@ -908,6 +921,12 @@ gimp_display_shell_set_property (GObject *object,
|
|||
case PROP_POPUP_MANAGER:
|
||||
shell->popup_manager = g_value_get_object (value);
|
||||
break;
|
||||
case PROP_INITIAL_SCREEN:
|
||||
shell->initial_screen = g_value_get_object (value);
|
||||
break;
|
||||
case PROP_INITIAL_MONITOR:
|
||||
shell->initial_monitor = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_DISPLAY:
|
||||
shell->display = g_value_get_object (value);
|
||||
break;
|
||||
|
@ -947,6 +966,12 @@ gimp_display_shell_get_property (GObject *object,
|
|||
case PROP_POPUP_MANAGER:
|
||||
g_value_set_object (value, shell->popup_manager);
|
||||
break;
|
||||
case PROP_INITIAL_SCREEN:
|
||||
g_value_set_object (value, shell->initial_screen);
|
||||
break;
|
||||
case PROP_INITIAL_MONITOR:
|
||||
g_value_set_int (value, shell->initial_monitor);
|
||||
break;
|
||||
case PROP_DISPLAY:
|
||||
g_value_set_object (value, shell->display);
|
||||
break;
|
||||
|
@ -1179,13 +1204,18 @@ GtkWidget *
|
|||
gimp_display_shell_new (GimpDisplay *display,
|
||||
GimpUnit unit,
|
||||
gdouble scale,
|
||||
GimpUIManager *popup_manager)
|
||||
GimpUIManager *popup_manager,
|
||||
GdkScreen *screen,
|
||||
gint monitor)
|
||||
{
|
||||
g_return_val_if_fail (GIMP_IS_DISPLAY (display), NULL);
|
||||
g_return_val_if_fail (GIMP_IS_UI_MANAGER (popup_manager), NULL);
|
||||
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
|
||||
|
||||
return g_object_new (GIMP_TYPE_DISPLAY_SHELL,
|
||||
"popup-manager", popup_manager,
|
||||
"initial-screen", screen,
|
||||
"initial-monitor", monitor,
|
||||
"display", display,
|
||||
"unit", unit,
|
||||
NULL);
|
||||
|
|
|
@ -52,6 +52,8 @@ struct _GimpDisplayShell
|
|||
GimpDisplay *display;
|
||||
|
||||
GimpUIManager *popup_manager;
|
||||
GdkScreen *initial_screen;
|
||||
gint initial_monitor;
|
||||
|
||||
GimpDisplayOptions *options;
|
||||
GimpDisplayOptions *fullscreen_options;
|
||||
|
@ -214,7 +216,9 @@ GType gimp_display_shell_get_type (void) G_GNUC_CONST;
|
|||
GtkWidget * gimp_display_shell_new (GimpDisplay *display,
|
||||
GimpUnit unit,
|
||||
gdouble scale,
|
||||
GimpUIManager *popup_manager);
|
||||
GimpUIManager *popup_manager,
|
||||
GdkScreen *screen,
|
||||
gint monitor);
|
||||
|
||||
void gimp_display_shell_add_overlay (GimpDisplayShell *shell,
|
||||
GtkWidget *child,
|
||||
|
|
|
@ -72,6 +72,7 @@
|
|||
|
||||
#include "menus/menus.h"
|
||||
|
||||
#include "gui.h"
|
||||
#include "gui-message.h"
|
||||
#include "gui-vtable.h"
|
||||
#include "themes.h"
|
||||
|
@ -92,7 +93,8 @@ static void gui_help (Gimp *gimp,
|
|||
static const gchar * gui_get_program_class (Gimp *gimp);
|
||||
static gchar * gui_get_display_name (Gimp *gimp,
|
||||
gint display_ID,
|
||||
gint *monitor_number);
|
||||
GObject **screen,
|
||||
gint *monitor);
|
||||
static guint32 gui_get_user_time (Gimp *gimp);
|
||||
static const gchar * gui_get_theme_dir (Gimp *gimp);
|
||||
static GimpObject * gui_get_window_strategy (Gimp *gimp);
|
||||
|
@ -235,11 +237,11 @@ gui_get_program_class (Gimp *gimp)
|
|||
static gchar *
|
||||
gui_get_display_name (Gimp *gimp,
|
||||
gint display_ID,
|
||||
gint *monitor_number)
|
||||
GObject **screen,
|
||||
gint *monitor)
|
||||
{
|
||||
GimpDisplay *display = NULL;
|
||||
GdkScreen *screen;
|
||||
gint monitor;
|
||||
GdkScreen *my_screen = NULL;
|
||||
|
||||
if (display_ID > 0)
|
||||
display = gimp_display_get_by_ID (gimp, display_ID);
|
||||
|
@ -249,18 +251,21 @@ gui_get_display_name (Gimp *gimp,
|
|||
GimpDisplayShell *shell = gimp_display_get_shell (display);
|
||||
GdkWindow *window = gtk_widget_get_window (GTK_WIDGET (shell));
|
||||
|
||||
screen = gtk_widget_get_screen (GTK_WIDGET (shell));
|
||||
monitor = gdk_screen_get_monitor_at_window (screen, window);
|
||||
my_screen = gtk_widget_get_screen (GTK_WIDGET (shell));
|
||||
*monitor = gdk_screen_get_monitor_at_window (my_screen, window);
|
||||
}
|
||||
else
|
||||
{
|
||||
monitor = gimp_get_monitor_at_pointer (&screen);
|
||||
*monitor = gui_get_initial_monitor (gimp, &my_screen);
|
||||
|
||||
if (*monitor == -1)
|
||||
*monitor = gimp_get_monitor_at_pointer (&my_screen);
|
||||
}
|
||||
|
||||
*monitor_number = monitor;
|
||||
*screen = G_OBJECT (my_screen);
|
||||
|
||||
if (screen)
|
||||
return gdk_screen_make_display_name (screen);
|
||||
if (my_screen)
|
||||
return gdk_screen_make_display_name (my_screen);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -21,5 +21,11 @@
|
|||
|
||||
void gui_vtable_init (Gimp *gimp);
|
||||
|
||||
/* this function lives in gui.c but must only be used from gui-vtable.c;
|
||||
* also, gui.h can't contain any Gdk types.
|
||||
*/
|
||||
gint gui_get_initial_monitor (Gimp *gimp,
|
||||
GdkScreen **screen);
|
||||
|
||||
|
||||
#endif /* __GUI_VTABLE_H__ */
|
||||
|
|
|
@ -141,7 +141,7 @@ static Gimp *the_gui_gimp = NULL;
|
|||
static GimpUIManager *image_ui_manager = NULL;
|
||||
static GimpUIConfigurer *ui_configurer = NULL;
|
||||
static GdkScreen *initial_screen = NULL;
|
||||
static gint initial_monitor = 0;
|
||||
static gint initial_monitor = -1;
|
||||
|
||||
|
||||
/* public functions */
|
||||
|
@ -264,6 +264,18 @@ gui_init (Gimp *gimp,
|
|||
return status_callback;
|
||||
}
|
||||
|
||||
gint
|
||||
gui_get_initial_monitor (Gimp *gimp,
|
||||
GdkScreen **screen)
|
||||
{
|
||||
g_return_val_if_fail (GIMP_IS_GIMP (gimp), 0);
|
||||
g_return_val_if_fail (screen != NULL, 0);
|
||||
|
||||
*screen = initial_screen;
|
||||
|
||||
return initial_monitor;
|
||||
}
|
||||
|
||||
|
||||
/* private functions */
|
||||
|
||||
|
@ -300,7 +312,6 @@ gui_sanity_check (void)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gui_help_func (const gchar *help_id,
|
||||
gpointer help_data)
|
||||
|
@ -595,6 +606,10 @@ gui_restore_after_callback (Gimp *gimp,
|
|||
|
||||
/* indicate that the application has finished loading */
|
||||
gdk_notify_startup_complete ();
|
||||
|
||||
/* clear startup monitor variables */
|
||||
initial_screen = NULL;
|
||||
initial_monitor = -1;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
|
@ -161,6 +161,7 @@ gimp_plug_in_manager_call_run (GimpPlugInManager *manager,
|
|||
GPConfig config;
|
||||
GPProcRun proc_run;
|
||||
gint display_ID;
|
||||
GObject *screen;
|
||||
gint monitor;
|
||||
|
||||
if (! gimp_plug_in_open (plug_in, GIMP_PLUG_IN_CALL_RUN, FALSE))
|
||||
|
@ -203,7 +204,8 @@ gimp_plug_in_manager_call_run (GimpPlugInManager *manager,
|
|||
config.app_name = (gchar *) g_get_application_name ();
|
||||
config.wm_class = (gchar *) gimp_get_program_class (manager->gimp);
|
||||
config.display_name = gimp_get_display_name (manager->gimp,
|
||||
display_ID, &monitor);
|
||||
display_ID,
|
||||
&screen, &monitor);
|
||||
config.monitor_number = monitor;
|
||||
config.timestamp = gimp_get_user_time (manager->gimp);
|
||||
|
||||
|
|
Loading…
Reference in New Issue