summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2013-02-12 20:07:05 -0500
committerKristian Høgsberg <krh@bitplanet.net>2013-02-12 21:55:51 -0500
commitb810eb57503e1cf38aeca45b97ab78e896cbc129 (patch)
treea9300ad8866c00de3c9315461b21b90da6b5ced5
parent088c62e267022bc640185f2f079b73fc420bbfcb (diff)
xwm: Support _NET_WM_STATE_FULLSCREEN
We can now handle fullscreen X windows. X clients request to go fullscreen buy sending a _NET_WM_STATE client message to the root window. When that happens we call into the shell interface and asks the shell to make the surface fullscreen. The shell will then resize the window, which causes the X wm to configure the X window appropriately. Make sure we ignore configure requests from fullscreened clients and send out the synthetic configure notify as required in that case. Finally, inspect _NET_WM_STATE before mapping so we can handle initial fullscreen correctly.
-rw-r--r--src/compositor.h4
-rw-r--r--src/shell.c33
-rw-r--r--src/xwayland/window-manager.c198
3 files changed, 204 insertions, 31 deletions
diff --git a/src/compositor.h b/src/compositor.h
index 544cf33e..004f9312 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -85,6 +85,10 @@ struct weston_shell_interface {
85 void (*set_transient)(struct shell_surface *shsurf, 85 void (*set_transient)(struct shell_surface *shsurf,
86 struct weston_surface *parent, 86 struct weston_surface *parent,
87 int x, int y, uint32_t flags); 87 int x, int y, uint32_t flags);
88 void (*set_fullscreen)(struct shell_surface *shsurf,
89 uint32_t method,
90 uint32_t framerate,
91 struct weston_output *output);
88 int (*move)(struct shell_surface *shsurf, struct weston_seat *ws); 92 int (*move)(struct shell_surface *shsurf, struct weston_seat *ws);
89 int (*resize)(struct shell_surface *shsurf, 93 int (*resize)(struct shell_surface *shsurf,
90 struct weston_seat *ws, uint32_t edges); 94 struct weston_seat *ws, uint32_t edges);
diff --git a/src/shell.c b/src/shell.c
index 368fa5b7..72d2a73f 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -1754,17 +1754,15 @@ shell_map_fullscreen(struct shell_surface *shsurf)
1754} 1754}
1755 1755
1756static void 1756static void
1757shell_surface_set_fullscreen(struct wl_client *client, 1757set_fullscreen(struct shell_surface *shsurf,
1758 struct wl_resource *resource, 1758 uint32_t method,
1759 uint32_t method, 1759 uint32_t framerate,
1760 uint32_t framerate, 1760 struct weston_output *output)
1761 struct wl_resource *output_resource)
1762{ 1761{
1763 struct shell_surface *shsurf = resource->data;
1764 struct weston_surface *es = shsurf->surface; 1762 struct weston_surface *es = shsurf->surface;
1765 1763
1766 if (output_resource) 1764 if (output)
1767 shsurf->output = output_resource->data; 1765 shsurf->output = output;
1768 else if (es->output) 1766 else if (es->output)
1769 shsurf->output = es->output; 1767 shsurf->output = es->output;
1770 else 1768 else
@@ -1781,6 +1779,24 @@ shell_surface_set_fullscreen(struct wl_client *client,
1781} 1779}
1782 1780
1783static void 1781static void
1782shell_surface_set_fullscreen(struct wl_client *client,
1783 struct wl_resource *resource,
1784 uint32_t method,
1785 uint32_t framerate,
1786 struct wl_resource *output_resource)
1787{
1788 struct shell_surface *shsurf = resource->data;
1789 struct weston_output *output;
1790
1791 if (output_resource)
1792 output = output_resource->data;
1793 else
1794 output = NULL;
1795
1796 set_fullscreen(shsurf, method, framerate, output);
1797}
1798
1799static void
1784popup_grab_focus(struct wl_pointer_grab *grab, 1800popup_grab_focus(struct wl_pointer_grab *grab,
1785 struct wl_surface *surface, 1801 struct wl_surface *surface,
1786 wl_fixed_t x, 1802 wl_fixed_t x,
@@ -3832,6 +3848,7 @@ module_init(struct weston_compositor *ec)
3832 ec->shell_interface.create_shell_surface = create_shell_surface; 3848 ec->shell_interface.create_shell_surface = create_shell_surface;
3833 ec->shell_interface.set_toplevel = set_toplevel; 3849 ec->shell_interface.set_toplevel = set_toplevel;
3834 ec->shell_interface.set_transient = set_transient; 3850 ec->shell_interface.set_transient = set_transient;
3851 ec->shell_interface.set_fullscreen = set_fullscreen;
3835 ec->shell_interface.move = surface_move; 3852 ec->shell_interface.move = surface_move;
3836 ec->shell_interface.resize = surface_resize; 3853 ec->shell_interface.resize = surface_resize;
3837 3854
diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
index b6e8e79e..392d05c8 100644
--- a/src/xwayland/window-manager.c
+++ b/src/xwayland/window-manager.c
@@ -89,8 +89,6 @@ struct motif_wm_hints {
89#define _NET_WM_MOVERESIZE_MOVE_KEYBOARD 10 /* move via keyboard */ 89#define _NET_WM_MOVERESIZE_MOVE_KEYBOARD 10 /* move via keyboard */
90#define _NET_WM_MOVERESIZE_CANCEL 11 /* cancel operation */ 90#define _NET_WM_MOVERESIZE_CANCEL 11 /* cancel operation */
91 91
92
93
94struct weston_wm_window { 92struct weston_wm_window {
95 struct weston_wm *wm; 93 struct weston_wm *wm;
96 xcb_window_t id; 94 xcb_window_t id;
@@ -111,8 +109,10 @@ struct weston_wm_window {
111 xcb_atom_t type; 109 xcb_atom_t type;
112 int width, height; 110 int width, height;
113 int x, y; 111 int x, y;
112 int saved_width, saved_height;
114 int decorate; 113 int decorate;
115 int override_redirect; 114 int override_redirect;
115 int fullscreen;
116}; 116};
117 117
118static struct weston_wm_window * 118static struct weston_wm_window *
@@ -287,6 +287,7 @@ read_and_dump_property(struct weston_wm *wm,
287/* We reuse some predefined, but otherwise useles atoms */ 287/* We reuse some predefined, but otherwise useles atoms */
288#define TYPE_WM_PROTOCOLS XCB_ATOM_CUT_BUFFER0 288#define TYPE_WM_PROTOCOLS XCB_ATOM_CUT_BUFFER0
289#define TYPE_MOTIF_WM_HINTS XCB_ATOM_CUT_BUFFER1 289#define TYPE_MOTIF_WM_HINTS XCB_ATOM_CUT_BUFFER1
290#define TYPE_NET_WM_STATE XCB_ATOM_CUT_BUFFER2
290 291
291static void 292static void
292weston_wm_window_read_properties(struct weston_wm_window *window) 293weston_wm_window_read_properties(struct weston_wm_window *window)
@@ -303,6 +304,7 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
303 { XCB_ATOM_WM_NAME, XCB_ATOM_STRING, F(name) }, 304 { XCB_ATOM_WM_NAME, XCB_ATOM_STRING, F(name) },
304 { XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, F(transient_for) }, 305 { XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, F(transient_for) },
305 { wm->atom.wm_protocols, TYPE_WM_PROTOCOLS, F(protocols) }, 306 { wm->atom.wm_protocols, TYPE_WM_PROTOCOLS, F(protocols) },
307 { wm->atom.net_wm_state, TYPE_NET_WM_STATE },
306 { wm->atom.net_wm_window_type, XCB_ATOM_ATOM, F(type) }, 308 { wm->atom.net_wm_window_type, XCB_ATOM_ATOM, F(type) },
307 { wm->atom.net_wm_name, XCB_ATOM_STRING, F(name) }, 309 { wm->atom.net_wm_name, XCB_ATOM_STRING, F(name) },
308 { wm->atom.net_wm_pid, XCB_ATOM_CARDINAL, F(pid) }, 310 { wm->atom.net_wm_pid, XCB_ATOM_CARDINAL, F(pid) },
@@ -368,6 +370,13 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
368 break; 370 break;
369 case TYPE_WM_PROTOCOLS: 371 case TYPE_WM_PROTOCOLS:
370 break; 372 break;
373 case TYPE_NET_WM_STATE:
374 window->fullscreen = 0;
375 atom = xcb_get_property_value(reply);
376 for (i = 0; i < reply->value_len; i++)
377 if (atom[i] == wm->atom.net_wm_state_fullscreen)
378 window->fullscreen = 1;
379 break;
371 case TYPE_MOTIF_WM_HINTS: 380 case TYPE_MOTIF_WM_HINTS:
372 hints = xcb_get_property_value(reply); 381 hints = xcb_get_property_value(reply);
373 if (hints->flags & MWM_HINTS_DECORATIONS) 382 if (hints->flags & MWM_HINTS_DECORATIONS)
@@ -386,7 +395,10 @@ weston_wm_window_get_frame_size(struct weston_wm_window *window,
386{ 395{
387 struct theme *t = window->wm->theme; 396 struct theme *t = window->wm->theme;
388 397
389 if (window->decorate) { 398 if (window->fullscreen) {
399 *width = window->width;
400 *height = window->height;
401 } else if (window->decorate) {
390 *width = window->width + (t->margin + t->width) * 2; 402 *width = window->width + (t->margin + t->width) * 2;
391 *height = window->height + 403 *height = window->height +
392 t->margin * 2 + t->width + t->titlebar_height; 404 t->margin * 2 + t->width + t->titlebar_height;
@@ -402,7 +414,10 @@ weston_wm_window_get_child_position(struct weston_wm_window *window,
402{ 414{
403 struct theme *t = window->wm->theme; 415 struct theme *t = window->wm->theme;
404 416
405 if (window->decorate) { 417 if (window->fullscreen) {
418 *x = 0;
419 *y = 0;
420 } else if (window->decorate) {
406 *x = t->margin + t->width; 421 *x = t->margin + t->width;
407 *y = t->margin + t->titlebar_height; 422 *y = t->margin + t->titlebar_height;
408 } else { 423 } else {
@@ -412,6 +427,32 @@ weston_wm_window_get_child_position(struct weston_wm_window *window,
412} 427}
413 428
414static void 429static void
430weston_wm_window_send_configure_notify(struct weston_wm_window *window)
431{
432 xcb_configure_notify_event_t configure_notify;
433 struct weston_wm *wm = window->wm;
434 int x, y;
435
436 weston_wm_window_get_child_position(window, &x, &y);
437 configure_notify.response_type = XCB_CONFIGURE_NOTIFY;
438 configure_notify.pad0 = 0;
439 configure_notify.event = window->id;
440 configure_notify.window = window->id;
441 configure_notify.above_sibling = XCB_WINDOW_NONE;
442 configure_notify.x = x;
443 configure_notify.y = y;
444 configure_notify.width = window->width;
445 configure_notify.height = window->height;
446 configure_notify.border_width = 0;
447 configure_notify.override_redirect = 0;
448 configure_notify.pad1 = 0;
449
450 xcb_send_event(wm->conn, 0, window->id,
451 XCB_EVENT_MASK_STRUCTURE_NOTIFY,
452 (char *) &configure_notify);
453}
454
455static void
415weston_wm_handle_configure_request(struct weston_wm *wm, xcb_generic_event_t *event) 456weston_wm_handle_configure_request(struct weston_wm *wm, xcb_generic_event_t *event)
416{ 457{
417 xcb_configure_request_event_t *configure_request = 458 xcb_configure_request_event_t *configure_request =
@@ -427,6 +468,11 @@ weston_wm_handle_configure_request(struct weston_wm *wm, xcb_generic_event_t *ev
427 468
428 window = hash_table_lookup(wm->window_hash, configure_request->window); 469 window = hash_table_lookup(wm->window_hash, configure_request->window);
429 470
471 if (window->fullscreen) {
472 weston_wm_window_send_configure_notify(window);
473 return;
474 }
475
430 if (configure_request->value_mask & XCB_CONFIG_WINDOW_WIDTH) 476 if (configure_request->value_mask & XCB_CONFIG_WINDOW_WIDTH)
431 window->width = configure_request->width; 477 window->width = configure_request->width;
432 if (configure_request->value_mask & XCB_CONFIG_WINDOW_HEIGHT) 478 if (configure_request->value_mask & XCB_CONFIG_WINDOW_HEIGHT)
@@ -559,7 +605,7 @@ our_resource(struct weston_wm *wm, uint32_t id)
559#define ICCCM_ICONIC_STATE 3 605#define ICCCM_ICONIC_STATE 3
560 606
561static void 607static void
562weston_wm_window_set_state(struct weston_wm_window *window, int32_t state) 608weston_wm_window_set_wm_state(struct weston_wm_window *window, int32_t state)
563{ 609{
564 struct weston_wm *wm = window->wm; 610 struct weston_wm *wm = window->wm;
565 uint32_t property[2]; 611 uint32_t property[2];
@@ -577,6 +623,26 @@ weston_wm_window_set_state(struct weston_wm_window *window, int32_t state)
577} 623}
578 624
579static void 625static void
626weston_wm_window_set_net_wm_state(struct weston_wm_window *window)
627{
628 struct weston_wm *wm = window->wm;
629 uint32_t property[1];
630 int i;
631
632 i = 0;
633 if (window->fullscreen)
634 property[i++] = wm->atom.net_wm_state_fullscreen;
635
636 xcb_change_property(wm->conn,
637 XCB_PROP_MODE_REPLACE,
638 window->id,
639 wm->atom.net_wm_state,
640 XCB_ATOM_ATOM,
641 32, /* format */
642 i, property);
643}
644
645static void
580weston_wm_handle_map_request(struct weston_wm *wm, xcb_generic_event_t *event) 646weston_wm_handle_map_request(struct weston_wm *wm, xcb_generic_event_t *event)
581{ 647{
582 xcb_map_request_event_t *map_request = 648 xcb_map_request_event_t *map_request =
@@ -632,9 +698,11 @@ weston_wm_handle_map_request(struct weston_wm *wm, xcb_generic_event_t *event)
632 weston_log("XCB_MAP_REQUEST (window %d, %p, frame %d)\n", 698 weston_log("XCB_MAP_REQUEST (window %d, %p, frame %d)\n",
633 window->id, window, window->frame_id); 699 window->id, window, window->frame_id);
634 700
701 weston_wm_window_set_wm_state(window, ICCCM_NORMAL_STATE);
702 weston_wm_window_set_net_wm_state(window);
703
635 xcb_map_window(wm->conn, map_request->window); 704 xcb_map_window(wm->conn, map_request->window);
636 xcb_map_window(wm->conn, window->frame_id); 705 xcb_map_window(wm->conn, window->frame_id);
637 weston_wm_window_set_state(window, ICCCM_NORMAL_STATE);
638 706
639 window->cairo_surface = 707 window->cairo_surface =
640 cairo_xcb_surface_create_with_xrender_format(wm->conn, 708 cairo_xcb_surface_create_with_xrender_format(wm->conn,
@@ -689,7 +757,7 @@ weston_wm_handle_unmap_notify(struct weston_wm *wm, xcb_generic_event_t *event)
689 if (window->frame_id) { 757 if (window->frame_id) {
690 xcb_reparent_window(wm->conn, window->id, wm->wm_window, 0, 0); 758 xcb_reparent_window(wm->conn, window->id, wm->wm_window, 0, 0);
691 xcb_destroy_window(wm->conn, window->frame_id); 759 xcb_destroy_window(wm->conn, window->frame_id);
692 weston_wm_window_set_state(window, ICCCM_WITHDRAWN_STATE); 760 weston_wm_window_set_wm_state(window, ICCCM_WITHDRAWN_STATE);
693 hash_table_remove(wm->window_hash, window->frame_id); 761 hash_table_remove(wm->window_hash, window->frame_id);
694 window->frame_id = XCB_WINDOW_NONE; 762 window->frame_id = XCB_WINDOW_NONE;
695 } 763 }
@@ -722,7 +790,9 @@ weston_wm_window_draw_decoration(void *data)
722 cairo_xcb_surface_set_size(window->cairo_surface, width, height); 790 cairo_xcb_surface_set_size(window->cairo_surface, width, height);
723 cr = cairo_create(window->cairo_surface); 791 cr = cairo_create(window->cairo_surface);
724 792
725 if (window->decorate) { 793 if (window->fullscreen) {
794 /* nothing */
795 } else if (window->decorate) {
726 if (wm->focus_window == window) 796 if (wm->focus_window == window)
727 flags |= THEME_FRAME_ACTIVE; 797 flags |= THEME_FRAME_ACTIVE;
728 798
@@ -965,6 +1035,68 @@ weston_wm_window_handle_moveresize(struct weston_wm_window *window,
965 } 1035 }
966} 1036}
967 1037
1038#define _NET_WM_STATE_REMOVE 0
1039#define _NET_WM_STATE_ADD 1
1040#define _NET_WM_STATE_TOGGLE 2
1041
1042static int
1043update_state(int action, int *state)
1044{
1045 int new_state, changed;
1046
1047 switch (action) {
1048 case _NET_WM_STATE_REMOVE:
1049 new_state = 0;
1050 break;
1051 case _NET_WM_STATE_ADD:
1052 new_state = 1;
1053 break;
1054 case _NET_WM_STATE_TOGGLE:
1055 new_state = !*state;
1056 break;
1057 default:
1058 return 0;
1059 }
1060
1061 changed = (*state != new_state);
1062 *state = new_state;
1063
1064 return changed;
1065}
1066
1067static void
1068weston_wm_window_configure(void *data);
1069
1070static void
1071weston_wm_window_handle_state(struct weston_wm_window *window,
1072 xcb_client_message_event_t *client_message)
1073{
1074 struct weston_wm *wm = window->wm;
1075 struct weston_shell_interface *shell_interface =
1076 &wm->server->compositor->shell_interface;
1077 uint32_t action, property;
1078
1079 action = client_message->data.data32[0];
1080 property = client_message->data.data32[1];
1081
1082 if (property == wm->atom.net_wm_state_fullscreen &&
1083 update_state(action, &window->fullscreen)) {
1084 weston_wm_window_set_net_wm_state(window);
1085 if (window->fullscreen) {
1086 window->saved_width = window->width;
1087 window->saved_height = window->height;
1088 shell_interface->set_fullscreen(window->shsurf,
1089 WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
1090 0, NULL);
1091 } else {
1092 shell_interface->set_toplevel(window->shsurf);
1093 window->width = window->saved_width;
1094 window->height = window->saved_height;
1095 weston_wm_window_configure(window);
1096 }
1097 }
1098}
1099
968static void 1100static void
969weston_wm_handle_client_message(struct weston_wm *wm, 1101weston_wm_handle_client_message(struct weston_wm *wm,
970 xcb_generic_event_t *event) 1102 xcb_generic_event_t *event)
@@ -975,16 +1107,19 @@ weston_wm_handle_client_message(struct weston_wm *wm,
975 1107
976 window = hash_table_lookup(wm->window_hash, client_message->window); 1108 window = hash_table_lookup(wm->window_hash, client_message->window);
977 1109
978 weston_log("XCB_CLIENT_MESSAGE (%s %d %d %d %d %d)\n", 1110 weston_log("XCB_CLIENT_MESSAGE (%s %d %d %d %d %d win %d)\n",
979 get_atom_name(wm->conn, client_message->type), 1111 get_atom_name(wm->conn, client_message->type),
980 client_message->data.data32[0], 1112 client_message->data.data32[0],
981 client_message->data.data32[1], 1113 client_message->data.data32[1],
982 client_message->data.data32[2], 1114 client_message->data.data32[2],
983 client_message->data.data32[3], 1115 client_message->data.data32[3],
984 client_message->data.data32[4]); 1116 client_message->data.data32[4],
1117 client_message->window);
985 1118
986 if (client_message->type == wm->atom.net_wm_moveresize) 1119 if (client_message->type == wm->atom.net_wm_moveresize)
987 weston_wm_window_handle_moveresize(window, client_message); 1120 weston_wm_window_handle_moveresize(window, client_message);
1121 else if (client_message->type == wm->atom.net_wm_state)
1122 weston_wm_window_handle_state(window, client_message);
988} 1123}
989 1124
990enum cursor_type { 1125enum cursor_type {
@@ -1428,7 +1563,7 @@ weston_wm_create(struct weston_xserver *wxs)
1428 xcb_screen_iterator_t s; 1563 xcb_screen_iterator_t s;
1429 uint32_t values[1]; 1564 uint32_t values[1];
1430 int sv[2]; 1565 int sv[2];
1431 xcb_atom_t supported[1]; 1566 xcb_atom_t supported[3];
1432 1567
1433 wm = malloc(sizeof *wm); 1568 wm = malloc(sizeof *wm);
1434 if (wm == NULL) 1569 if (wm == NULL)
@@ -1486,6 +1621,8 @@ weston_wm_create(struct weston_xserver *wxs)
1486 weston_wm_create_wm_window(wm); 1621 weston_wm_create_wm_window(wm);
1487 1622
1488 supported[0] = wm->atom.net_wm_moveresize; 1623 supported[0] = wm->atom.net_wm_moveresize;
1624 supported[1] = wm->atom.net_wm_state;
1625 supported[2] = wm->atom.net_wm_state_fullscreen;
1489 xcb_change_property(wm->conn, 1626 xcb_change_property(wm->conn,
1490 XCB_PROP_MODE_REPLACE, 1627 XCB_PROP_MODE_REPLACE,
1491 wm->screen->root, 1628 wm->screen->root,
@@ -1557,13 +1694,18 @@ weston_wm_window_configure(void *data)
1557{ 1694{
1558 struct weston_wm_window *window = data; 1695 struct weston_wm_window *window = data;
1559 struct weston_wm *wm = window->wm; 1696 struct weston_wm *wm = window->wm;
1560 uint32_t values[2]; 1697 uint32_t values[4];
1561 int width, height; 1698 int x, y, width, height;
1562 1699
1563 values[0] = window->width; 1700 weston_wm_window_get_child_position(window, &x, &y);
1564 values[1] = window->height; 1701 values[0] = x;
1702 values[1] = y;
1703 values[2] = window->width;
1704 values[3] = window->height;
1565 xcb_configure_window(wm->conn, 1705 xcb_configure_window(wm->conn,
1566 window->id, 1706 window->id,
1707 XCB_CONFIG_WINDOW_X |
1708 XCB_CONFIG_WINDOW_Y |
1567 XCB_CONFIG_WINDOW_WIDTH | 1709 XCB_CONFIG_WINDOW_WIDTH |
1568 XCB_CONFIG_WINDOW_HEIGHT, 1710 XCB_CONFIG_WINDOW_HEIGHT,
1569 values); 1711 values);
@@ -1590,7 +1732,10 @@ send_configure(struct weston_surface *surface,
1590 struct weston_wm *wm = window->wm; 1732 struct weston_wm *wm = window->wm;
1591 struct theme *t = window->wm->theme; 1733 struct theme *t = window->wm->theme;
1592 1734
1593 if (window->decorate) { 1735 if (window->fullscreen) {
1736 window->width = width;
1737 window->height = height;
1738 } else if (window->decorate) {
1594 window->width = width - 2 * (t->margin + t->width); 1739 window->width = width - 2 * (t->margin + t->width);
1595 window->height = height - 2 * t->margin - 1740 window->height = height - 2 * t->margin -
1596 t->titlebar_height - t->width; 1741 t->titlebar_height - t->width;
@@ -1629,8 +1774,15 @@ xserver_map_shell_surface(struct weston_wm *wm,
1629 window->surface, 1774 window->surface,
1630 &shell_client); 1775 &shell_client);
1631 1776
1632 /* ICCCM 4.1.1 */ 1777 if (window->fullscreen) {
1633 if (!window->override_redirect) { 1778 window->saved_width = window->width;
1779 window->saved_height = window->height;
1780 shell_interface->set_fullscreen(window->shsurf,
1781 WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
1782 0, NULL);
1783 return;
1784 } else if (!window->override_redirect) {
1785 /* ICCCM 4.1.1 */
1634 shell_interface->set_toplevel(window->shsurf); 1786 shell_interface->set_toplevel(window->shsurf);
1635 return; 1787 return;
1636 } 1788 }