492
seat_unity_create_greeter_session (Seat *seat)
494
XGreeter *greeter_session;
496
greeter_session = xgreeter_new ();
497
session_set_env (SESSION (greeter_session), "XDG_SEAT", "seat0");
499
return GREETER (greeter_session);
478
seat_unity_create_session (Seat *seat, Display *display)
503
seat_unity_create_session (Seat *seat)
480
XServerLocal *xserver;
481
505
XSession *session;
485
xserver = XSERVER_LOCAL (display_get_display_server (display));
487
if (SEAT_UNITY (seat)->priv->use_vt_switching)
488
vt_number = xserver_local_get_vt (xserver);
490
vt_number = SEAT_UNITY (seat)->priv->vt;
492
507
session = xsession_new ();
493
t = g_strdup_printf ("/dev/tty%d", vt_number);
494
session_set_tty (SESSION (session), t);
497
/* Set variables for logind */
498
508
session_set_env (SESSION (session), "XDG_SEAT", "seat0");
499
t = g_strdup_printf ("%d", vt_number);
500
session_set_env (SESSION (session), "XDG_VTNR", t);
503
510
return SESSION (session);
507
seat_unity_set_active_display (Seat *seat, Display *display)
514
seat_unity_set_active_session (Seat *seat, Session *session)
509
XServerLocal *xserver;
516
DisplayServer *display_server;
512
518
/* If no compositor, have to use VT switching */
513
519
if (SEAT_UNITY (seat)->priv->use_vt_switching)
515
gint vt = xserver_local_get_vt (XSERVER_LOCAL (display_get_display_server (display)));
521
gint vt = display_server_get_vt (session_get_display_server (session));
517
523
vt_set_active (vt);
519
SEAT_CLASS (seat_unity_parent_class)->set_active_display (seat, display);
523
if (display == SEAT_UNITY (seat)->priv->active_display)
525
SEAT_UNITY (seat)->priv->active_display = display;
527
xserver = XSERVER_LOCAL (display_get_display_server (display));
528
id = xserver_local_get_mir_id (xserver);
530
g_debug ("Switching to Mir session %s", id);
531
write_message (SEAT_UNITY (seat), USC_MESSAGE_SET_ACTIVE_SESSION, id, strlen (id));
533
SEAT_CLASS (seat_unity_parent_class)->set_active_display (seat, display);
525
SEAT_CLASS (seat_unity_parent_class)->set_active_session (seat, session);
529
if (session == SEAT_UNITY (seat)->priv->active_session)
531
SEAT_UNITY (seat)->priv->active_session = g_object_ref (session);
533
display_server = session_get_display_server (session);
534
if (SEAT_UNITY (seat)->priv->active_display_server != display_server)
538
SEAT_UNITY (seat)->priv->active_display_server = g_object_ref (display_server);
539
id = xserver_local_get_mir_id (XSERVER_LOCAL (display_server));
541
g_debug ("Switching to Mir session %s", id);
542
write_message (SEAT_UNITY (seat), USC_MESSAGE_SET_ACTIVE_SESSION, (const guint8 *) id, strlen (id));
545
SEAT_CLASS (seat_unity_parent_class)->set_active_session (seat, session);
537
seat_unity_get_active_display (Seat *seat)
549
seat_unity_get_active_session (Seat *seat)
539
551
if (SEAT_UNITY (seat)->priv->use_vt_switching)
547
for (link = seat_get_displays (seat); link; link = link->next)
559
for (link = seat_get_sessions (seat); link; link = link->next)
549
Display *display = link->data;
550
XServerLocal *xserver;
552
xserver = XSERVER_LOCAL (display_get_display_server (display));
553
if (xserver_local_get_vt (xserver) == vt)
561
Session *session = link->data;
562
if (display_server_get_vt (session_get_display_server (session)) == vt)
560
return SEAT_UNITY (seat)->priv->active_display;
569
return SEAT_UNITY (seat)->priv->active_session;
564
seat_unity_run_script (Seat *seat, Display *display, Process *script)
573
seat_unity_run_script (Seat *seat, DisplayServer *display_server, Process *script)
566
575
const gchar *path;
567
576
XServerLocal *xserver;
569
xserver = XSERVER_LOCAL (display_get_display_server (display));
578
xserver = XSERVER_LOCAL (display_server);
570
579
path = xserver_local_get_authority_file_path (xserver);
571
580
process_set_env (script, "DISPLAY", xserver_get_address (XSERVER (xserver)));
572
581
process_set_env (script, "XAUTHORITY", path);
574
SEAT_CLASS (seat_unity_parent_class)->run_script (seat, display, script);
583
SEAT_CLASS (seat_unity_parent_class)->run_script (seat, display_server, script);
591
seat_unity_display_removed (Seat *seat, Display *display)
593
if (seat_get_is_stopping (seat))
596
/* If this is the only display and it failed to start then stop this seat */
597
if (g_list_length (seat_get_displays (seat)) == 0 && !display_get_is_ready (display))
599
g_debug ("Stopping Unity seat, failed to start a display");
604
/* Show a new greeter */
605
if (display == seat_get_active_display (seat))
607
g_debug ("Active display stopped, switching to greeter");
608
seat_switch_to_greeter (seat);
613
600
seat_unity_init (SeatUnity *seat)
615
602
seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_UNITY_TYPE, SeatUnityPrivate);
647
638
seat_class->setup = seat_unity_setup;
648
639
seat_class->start = seat_unity_start;
649
640
seat_class->create_display_server = seat_unity_create_display_server;
641
seat_class->create_greeter_session = seat_unity_create_greeter_session;
650
642
seat_class->create_session = seat_unity_create_session;
651
seat_class->set_active_display = seat_unity_set_active_display;
652
seat_class->get_active_display = seat_unity_get_active_display;
643
seat_class->set_active_session = seat_unity_set_active_session;
644
seat_class->get_active_session = seat_unity_get_active_session;
653
645
seat_class->run_script = seat_unity_run_script;
654
646
seat_class->stop = seat_unity_stop;
655
seat_class->display_removed = seat_unity_display_removed;
657
648
g_type_class_add_private (klass, sizeof (SeatUnityPrivate));