Gtk2::Gdk::Window(3)
πΈ Gtk2::Gdk::Window πΈ
okay so bestie π you just pulled up the Gtk2::Gdk::Window(3) manual page β User Contributed Perl Documentation. This is part 1, and it's giving low-level window-system realness, so let's get into it. No cap. π¦
β¨ NAME β¨
Gtk2::Gdk::Window β wrapper for GdkWindow. That's the whole vibe. π
π DESCRIPTION π
Gtk2::Gdk::Window is a low-level window-system window. One of these is created when a widget is "realized". It's literally the window behind the window, iykyk. πͺ
As of Gtk 2.22 a window can only be created by Gtk2::Gdk::Window->new(), foreign_new(), etc. Glib::Object::new() doesn't work (segfaults on using the resulting window object). π It's not possible to subclass Gtk2::Gdk::Window with Glib::Object::Subclass and the Glib::Type system, since only gdk_window_new() does the actual window creation, and that function always makes a GdkWindow. (The Perl-Gtk Gtk2::Gdk::Window->new() wrapper ignores the class name argument.) So don't try to be clever there, bestie. π
It may work to create a Perl level subclass and re-bless a Gtk2::Gdk::Window->new() into that. But like any such re-blessing it's not preserved when the object is returned from a Gtk function etc (that just gives the base Gtk class). So lowkey don't count on it. π
π¦ HIERARCHY π¦
Glib::Object
+----Gtk2::Gdk::Drawable
+----Gtk2::Gdk::Window
π METHODS π
Okay so here's every method, every arg, every Since:, all of it. Periodt. β¨
window = Gtk2::Gdk::Window->new ($parent, $attributes_ref)β Create and return a new window.$parent(Gtk2::Gdk::Windowor undef)$attributes_ref(scalar)
parent can be undef to mean the root window of the default screen. attributes_ref is a hashref containing some of the following keys:
title string
event_mask Gtk2::Gdk::EventMask flags
x integer
y integer
width integer
height integer
wclass Gtk2::Gdk::WindowClass enum
visual Gtk2::Gdk::Visual
colormap Gtk2::Gdk::Colormap
window_type Gtk2::Gdk::WindowType enum
cursor Gtk2::Gdk::Cursor
wmclass_name string
wmclass_class string
override_redirect boolean (integer 0 or 1)
window_type is mandatory because it defaults to "root" but of course it's not possible to create a new root window. The other fields get default values zero, empty, unset, etc.
Example:
my $win = Gtk2::Gdk::Window->new
(undef, { window_type => 'toplevel,
wclass => 'GDK_INPUT_OUTPUT',
x => 0,
y => 0,
width => 200,
height => 100 });
Incidentally, the nicknames for wclass Gtk2::Gdk::WindowClass really are "output" for input-output and "only" for input-only. Those names are a bit odd, but that's what Gtk has. You can, as for any enum, give the full names like GDK_INPUT_OUTPUT if desired, for some clarity. π
boolean = $window->get_accept_focusβ Since: gtk+ 2.22$window->set_accept_focus ($accept_focus)β$accept_focus(boolean). Since: gtk+ 2.4(window, win_x, win_y) = Gtk2::Gdk::Window->at_pointerβ Returnswindow, aGtk2::Gdk::Windowandwin_xandwin_y, integers.$window->set_back_pixmap ($pixmap, $parent_relative=0)β$pixmap(Gtk2::Gdk::Pixmapor undef);$parent_relative(boolean).pattern = $window->get_background_patternβ Since: gtk+ 2.22$window->set_background ($color)β$color(Gtk2::Gdk::Color).$window->beepβ Since: gtk+ 2.12$window->begin_move_drag ($button, $root_x, $root_y, $timestamp)β$button(integer),$root_x(integer),$root_y(integer),$timestamp(unsigned).$window->begin_paint_rect ($rectangle)β$rectangle(Gtk2::Gdk::Rectangle).$window->begin_paint_region ($region)β$region(Gtk2::Gdk::Region).$window->begin_resize_drag ($edge, $button, $root_x, $root_y, $timestamp)β$edge(Gtk2::Gdk::WindowEdge),$button(integer),$root_x(integer),$root_y(integer),$timestamp(unsigned).$window->set_child_input_shapesβ Since: gtk+ 2.10$window->set_child_shapesβ no extra deets.list = $window->get_childrenβ Returns the list of children (Gtk2::Gdk::Window's) known to gdk.$window->clearβ no extra deets.$window->clear_area ($x, $y, $width, $height)β$x(integer),$y(integer),$width(integer),$height(integer).$window->clear_area_e ($x, $y, $width, $height)β$x(integer),$y(integer),$width(integer),$height(integer).boolean = $window->get_compositedβ Since: gtk+ 2.22$window->set_composited ($composited)β$composited(boolean). Since: gtk+ 2.12$window->configure_finishedβ Since: gtk+ 2.6(x, y) = $window->coords_from_parent ($parent_x, $parent_y)β$parent_x(double),$parent_y(double). Since: gtk+ 2.22(parent_x, parent_y) = $window->coords_to_parent ($x, $y)β$x(double),$y(double). Since: gtk+ 2.22surface = $window->create_similar_surface ($content, $width, $height)β$content(Cairo::Content),$width(integer),$height(integer). Since: gtk+ 2.22cursor or undef = $window->get_cursorβ Since: gtk+ 2.18$window->set_cursor ($cursor)β$cursor(Gtk2::Gdk::Cursoror undef).Gtk2::Gdk::Window->set_debug_updates ($enable)/$window->set_debug_updates ($enable)β$enable(boolean).list = $window->get_decorationsβ returns a list.$window->set_decorations ($decorations)β$decorations(Gtk2::Gdk::WMDecoration).$window->deiconifyβ no extra deets.$window->destroyβ no extra deets.window = $window->get_effective_parentβ Since: gtk+ 2.22window = $window->get_effective_toplevelβ Since: gtk+ 2.22window or undef = $offscreen_window->get_embedderβ Only for offscreenGtk2::Gdk::Windows. Since: gtk+ 2.18$offscreen_window->set_embedder ($embedder)β$embedder(Gtk2::Gdk::Window). Only for offscreenGtk2::Gdk::Windows. Since: gtk+ 2.18$window->enable_synchronized_configureβ Since: gtk+ 2.6$window->end_paintβ no extra deets.boolean = $window->ensure_nativeβ Since: gtk+ 2.18eventmask = $window->get_eventsβ returns eventmask.$window->set_events ($event_mask)β$event_mask(Gtk2::Gdk::EventMask).$window->flushβ Since: gtk+ 2.18$window->focus ($timestamp)β$timestamp(unsigned).boolean = $window->get_focus_on_mapβ Since: gtk+ 2.22$window->set_focus_on_map ($focus_on_map)β$focus_on_map(boolean). Since: gtk+ 2.6window = Gtk2::Gdk::Window->foreign_new ($anid)β$anid(Gtk2::Gdk::NativeWindow).window = Gtk2::Gdk::Window->foreign_new_for_display ($display, $anid)β$display(Gtk2::Gdk::Display),$anid(Gtk2::Gdk::NativeWindow). Since: gtk+ 2.2rectangle = $window->get_frame_extentsβ returns rectangle.$window->freeze_updatesβ no extra deets.$window->fullscreenβ Since: gtk+ 2.2$window->set_functions ($functions)β$functions(Gtk2::Gdk::WMFunction).$sm_client_id->gdk_set_sm_client_idβ exactly that, bestie.$window->geometry_changedβ Only useful for offscreenGtk2::Gdk::Windows. Since: gtk+ 2.18(x, y, width, height, depth) = $window->get_geometryβ returns all the geometry deets.$window->set_geometry_hints ($geometry)β sets hints from$geometry.$window->set_geometry_hints ($geometry, $geom_mask)β$geom_mask(Gtk2::Gdk::WindowHints) optional, usually inferred from$geometry;$geometry(scalar)Gtk2::Gdk::Geometryor hashref.$geometryis either aGtk2::Gdk::Geometryobject, or a hashref with the following keys and values,
min_width integer \ 'min-size' mask
min_height integer /
max_width integer \ 'max-size' mask
max_height integer /
base_width integer \ 'base-size' mask
base_height integer /
width_inc integer \ 'resize-inc' mask
height_inc integer /
min_aspect float \ 'aspect' mask
max_aspect float /
win_gravity Gtk2::Gdk::Gravity enum, 'win-gravity' mask
- Optional
$geom_maskis which fields of$geometryare used. If$geometryis a hashref then$geom_maskdefaults to the keys supplied in the hash, so for example
$win->set_geometry_hints ({ min_width => 20, min_height => 10});
- If
$geometryis aGtk2::Gdk::Geometryobject then you must give$geom_maskexplicitly. - The 'pos', 'user-pos' and 'user-size' flags in
$geom_maskhave no data fields, so cannot be inferred from a$geometryhashref. If you want those flags you must pass$geom_maskexplicitly.
window = $window->get_groupβ Since: gtk+ 2.4$window->set_group ($leader)β$leader(Gtk2::Gdk::Windowor undef).boolean = $window->has_nativeβ Since: gtk+ 2.22$window->hideβ no extra deets.$window->set_icon_list (...)β...(list) ofGdkPixbuf's.$window->set_icon_name ($name)β$name(string or undef).$window->set_icon ($icon_window, $pixmap, $mask)β$icon_window(Gtk2::Gdk::Windowor undef),$pixmap(Gtk2::Gdk::Pixmapor undef),$mask(Gtk2::Gdk::Bitmapor undef).$window->iconifyβ no extra deets.$window->input_shape_combine_mask ($mask, $x, $y)β$mask(Gtk2::Gdk::Bitmapor undef),$x(integer),$y(integer). Since: gtk+ 2.10$window->input_shape_combine_region ($shape, $offset_x, $offset_y)β$shape(Gtk2::Gdk::Regionor undef),$offset_x(integer),$offset_y(integer). Since: gtk+ 2.10list = $window->get_internal_paint_infoβ returns a list.$window->invalidate_maybe_recurse ($region, $func, $data=undef)β$region(Gtk2::Gdk::Region),$func(scalar),$data(scalar).$window->invalidate_rect ($rectangle, $invalidate_children)β$rectangle(Gtk2::Gdk::Rectangleor undef),$invalidate_children(boolean).$window->invalidate_region ($region, $invalidate_children)β$region(Gtk2::Gdk::Region),$invalidate_children(boolean).boolean = $window->is_destroyedβ Since: gtk+ 2.18boolean = $window->is_input_onlyβ Since: gtk+ 2.22boolean = $window->is_shapedβ Since: gtk+ 2.22boolean = $window->is_viewableβ no extra.boolean = $window->is_visibleβ no extra.$window->set_keep_above ($setting)β$setting(boolean). Since: gtk+ 2.4$window->set_keep_below ($setting)β$setting(boolean). Since: gtk+ 2.4window = Gtk2::Gdk::Window->lookup ($anid)β$anid(Gtk2::Gdk::NativeWindow).window = Gtk2::Gdk::Window->lookup_for_display ($display, $anid)β$display(Gtk2::Gdk::Display),$anid(Gtk2::Gdk::NativeWindow). Since: gtk+ 2.2$window->lowerβ no extra deets.$window->maximizeβ no extra deets.$window->merge_child_input_shapesβ Since: gtk+ 2.10$window->merge_child_shapesβ no extra deets.boolean = $window->get_modal_hintβ Since: gtk+ 2.22$window->set_modal_hint ($modal)β$modal(boolean).$window->move ($x, $y)β$x(integer),$y(integer).$window->move_region ($region, $dx, $dy)β$region(Gtk2::Gdk::Region),$dx(integer),$dy(integer). Since: gtk+ 2.8$window->move_resize ($x, $y, $width, $height)β$x(integer),$y(integer),$width(integer).$height(integer) β yes bestie we're still finishing the arg list from the method above, picking up mid-sentence like nothing happened π$window->move_to_current_desktopβ shoves the window onto the current desktop.- Since: gtk+ 2.8
$window->set_opacity ($opacity)β sets how see-through the window is.$opacity(double) β the opacity value.- Since: gtk+ 2.12
(x, y) = $window->get_originβ hands you back the origin coords, that's the whole thing β¨$window->set_override_redirect ($override_redirect)β toggles override-redirect mode.$override_redirect(boolean) β the flag.
window = $window->get_parentβ returns the parent window.list = $window->peek_childrenβ an alias forget_children. literally the same thing, no cap.pixmap or undef = $offscreen_window->get_pixmapβ only for offscreenGtk2::Gdk::Windows.- Since: gtk+ 2.18
(window_at_pointer, x, y, mask) = $window->get_pointerβ returnswindow_at_pointer, aGtk2::Gdk::Windoworundef, plusxandy, integers, plusmask, aGtk2::Gdk::ModifierType. four things, one call, slay.(x, y) = $window->get_positionβ returns the position coords.Gtk2::Gdk::Window->process_all_updates$window->process_all_updates
Gtk2::Gdk::Window->process_all_updates
$window->process_all_updates
$window->process_updates ($update_children)β processes pending updates.$update_children(boolean) β whether the children get processed too.
$window->property_change ($property, $type, $format, $mode, ...)β changes a window property.$property(Gtk2::Gdk::Atom)$type(Gtk2::Gdk::Atom)$format(integer)$mode(Gtk2::Gdk::PropMode)...(list) β property value(s)
Depending on the value of format, the property value(s) can be:
Gtk2::Gdk::CHARSβ a stringGtk2::Gdk::USHORTSβ one or more unsigned short numbersGtk2::Gdk::ULONGSβ one or more unsigned long numbers
$window->property_delete ($property)β deletes the property.$property(Gtk2::Gdk::Atom)
(property_type, format, data) = $window->property_get ($property, $type, $offset, $length, $pdelete)β reads a property back out.$property(Gtk2::Gdk::Atom)$type(Gtk2::Gdk::Atom)$offset(unsigned)$length(unsigned)$pdelete(integer)
See property_change for an explanation of the meaning of format. π«Ά
$window->raiseβ raises the window.$window->redirect_to_drawable ($drawable, $src_x, $src_y, $dest_x, $dest_y, $width, $height)β redirects the window's contents into a drawable.$drawable(Gtk2::Gdk::Drawable)$src_x(integer)$src_y(integer)$dest_x(integer)$dest_y(integer)$width(integer)$height(integer)- Since: gtk+ 2.14
$window->register_dndβ registers the window for drag-and-drop.$window->remove_redirectionβ undoes the redirection.- Since: gtk+ 2.14
$window->reparent ($new_parent, $x, $y)β moves the window under a new parent.$new_parent(Gtk2::Gdk::Window)$x(integer)$y(integer)
$window->resize ($width, $height)β resizes the window.$width(integer)$height(integer)
$window->restack ($sibling, $above)β restacks the window relative to a sibling.$sibling(Gtk2::Gdk::Window or `undef*)$above(boolean)- Since: gtk+ 2.18
$window->set_role ($role)β sets the window's role.$role(string)
(root_x, root_y) = $window->get_root_coords ($x, $y)β translates coords into root window coords.$x(integer)$y(integer)- Since: gtk+ 2.18
(x, y) = $window->get_root_originβ returns the origin relative to the root window.$window->scroll ($dx, $dy)β scrolls the window by a delta.$dx(integer)$dy(integer)
$window->shape_combine_mask ($mask, $x, $y)β combines a shape mask onto the window.$mask(Gtk2::Gdk::Bitmap or `undef*)$x(integer)$y(integer)
$window->shape_combine_region ($shape_region, $offset_x, $offset_y)β combines a shape region onto the window.$shape_region(Gtk2::Gdk::Region or `undef*)$offset_x(integer)$offset_y(integer)
$window->showβ shows the window.$window->show_unraisedβ shows the window without raising it. subtle queen behaviour πΈ$window->set_skip_pager_hint ($skips_pager)β sets the skip-pager hint.$skips_pager(boolean)- Since: gtk+ 2.2
$window->set_skip_taskbar_hint ($skips_taskbar)β sets the skip-taskbar hint.$skips_taskbar(boolean)- Since: gtk+ 2.2
$window->set_startup_id ($startup_id)β sets the startup notification id.$startup_id(string)- Since: gtk+ 2.12
windowstate = $window->get_stateβ returns the window state.boolean = $window->set_static_gravities ($use_static)β sets static gravities, and returns a boolean.$use_static(boolean)
$window->stickβ sticks the window.$window->thaw_updatesβ thaws updates back on (the counterpart to freezing them).$window->set_title ($title)β sets the window title.$title(string)
window = $window->get_toplevelβ returns the toplevel window.list = Gtk2::Gdk::Window->get_toplevelsβ returns a list of top level windows (Gtk2::Gdk::Window's) known to gdk, on the default screen. A toplevel window is a child of the root window. β¨$window->set_transient_for ($parent)β marks the window as transient for a parent.$parent(Gtk2::Gdk::Window)
windowtypehint = $window->get_type_hintβ returns the type hint.- Since: gtk+ 2.10
$window->set_type_hint ($hint)β sets the type hint.$hint(Gtk2::Gdk::WindowTypeHint)
$window->unfullscreenβ takes the window out of fullscreen.- Since: gtk+ 2.2
$window->unmaximizeβ un-maximizes the window.$window->unstickβ un-sticks the window.region or undef = $window->get_update_areaβ returns the update area, a region orundef.$window->set_urgency_hint ($urgent)β sets the urgency hint. (urgent!! π)$urgent(boolean)- Since: gtk+ 2.8
unsigned = $window->get_user_dataβ returns the user data, an unsigned.$window->set_user_data ($user_data)β sets the user data.$user_data(unsigned)
$window->set_user_time ($timestamp)β sets the user time timestamp.$timestamp(unsigned)- Since: gtk+ 2.6
windowtype = $window->get_window_typeβ returns the window type.$window->withdrawβ withdraws the window.
β¨ PROPERTIES β¨
'cursor'(Gtk2::Gdk::Cursor : defaultundef: readable / writable) β Cursor
π SIGNALS π
from-embedder(Gtk2::Gdk::Window, double, double, gpointer, gpointer)Gtk2::Gdk::Window=pick-embedded-child(Gtk2::Gdk::Window, double, double)to-embedder(Gtk2::Gdk::Window, double, double, gpointer, gpointer)
from-embedder, to-embedder and pick-embedded-child signals are for offscreen windows only. iykyk π«Ά
from-embedder and to-embedder receive the x and y coordinates to translate, and must return the translated x and y coordinate.
π ENUMS AND FLAGS π
flags Gtk2::Gdk::EventMask
'exposure-mask'/'GDK_EXPOSURE_MASK''pointer-motion-mask'/'GDK_POINTER_MOTION_MASK''pointer-motion-hint-mask'/'GDK_POINTER_MOTION_HINT_MASK''button-motion-mask'/'GDK_BUTTON_MOTION_MASK''button1-motion-mask'/'GDK_BUTTON1_MOTION_MASK''button2-motion-mask'/'GDK_BUTTON2_MOTION_MASK''button3-motion-mask'/'GDK_BUTTON3_MOTION_MASK''button-press-mask'/'GDK_BUTTON_PRESS_MASK''button-release-mask'/'GDK_BUTTON_RELEASE_MASK''key-press-mask'/'GDK_KEY_PRESS_MASK''key-release-mask'/'GDK_KEY_RELEASE_MASK''enter-notify-mask'/'GDK_ENTER_NOTIFY_MASK''leave-notify-mask'/'GDK_LEAVE_NOTIFY_MASK''focus-change-mask'/'GDK_FOCUS_CHANGE_MASK''structure-mask'/'GDK_STRUCTURE_MASK''property-change-mask'/'GDK_PROPERTY_CHANGE_MASK''visibility-notify-mask'/'GDK_VISIBILITY_NOTIFY_MASK''proximity-in-mask'/'GDK_PROXIMITY_IN_MASK''proximity-out-mask'/'GDK_PROXIMITY_OUT_MASK''substructure-mask'/'GDK_SUBSTRUCTURE_MASK''scroll-mask'/'GDK_SCROLL_MASK''all-events-mask'/'GDK_ALL_EVENTS_MASK'
enum Gtk2::Gdk::PropMode
'replace'/'GDK_PROP_MODE_REPLACE''prepend'/'GDK_PROP_MODE_PREPEND''append'/'GDK_PROP_MODE_APPEND'
flags Gtk2::Gdk::WMDecoration
'all'/'GDK_DECOR_ALL''border'/'GDK_DECOR_BORDER''resizeh'/'GDK_DECOR_RESIZEH''title'/'GDK_DECOR_TITLE''menu'/'GDK_DECOR_MENU''minimize'/'GDK_DECOR_MINIMIZE''maximize'/'GDK_DECOR_MAXIMIZE'
flags Gtk2::Gdk::WMFunction
'all'/'GDK_FUNC_ALL''resize'/'GDK_FUNC_RESIZE''move'/'GDK_FUNC_MOVE''minimize'/'GDK_FUNC_MINIMIZE''maximize'/'GDK_FUNC_MAXIMIZE''close'/'GDK_FUNC_CLOSE'
enum Gtk2::Gdk::WindowEdge
'north-west'/'GDK_WINDOW_EDGE_NORTH_WEST''north'/'GDK_WINDOW_EDGE_NORTH''north-east'/'GDK_WINDOW_EDGE_NORTH_EAST''west'/'GDK_WINDOW_EDGE_WEST''east'/'GDK_WINDOW_EDGE_EAST''south-west'/'GDK_WINDOW_EDGE_SOUTH_WEST''south'/'GDK_WINDOW_EDGE_SOUTH''south-east'/'GDK_WINDOW_EDGE_SOUTH_EAST'
flags Gtk2::Gdk::WindowHints
'pos'/'GDK_HINT_POS''min-size'/'GDK_HINT_MIN_SIZE''max-size'/'GDK_HINT_MAX_SIZE''base-size'/'GDK_HINT_BASE_SIZE''aspect'/'GDK_HINT_ASPECT''resize-inc'/'GDK_HINT_RESIZE_INC''win-gravity'/'GDK_HINT_WIN_GRAVITY''user-pos'/'GDK_HINT_USER_POS''user-size'/'GDK_HINT_USER_SIZE'
flags Gtk2::Gdk::WindowState
'withdrawn'/'GDK_WINDOW_STATE_WITHDRAWN''iconified'/'GDK_WINDOW_STATE_ICONIFIED''maximized'/'GDK_WINDOW_STATE_MAXIMIZED''sticky'/'GDK_WINDOW_STATE_STICKY''fullscreen'/'GDK_WINDOW_STATE_FULLSCREEN''above'/'GDK_WINDOW_STATE_ABOVE''below'/'GDK_WINDOW_STATE_BELOW'
enum Gtk2::Gdk::WindowType
'root'/'GDK_WINDOW_ROOT''toplevel'/'GDK_WINDOW_TOPLEVEL''child'/'GDK_WINDOW_CHILD''dialog'/'GDK_WINDOW_DIALOG''temp'/'GDK_WINDOW_TEMP''foreign'/'GDK_WINDOW_FOREIGN''offscreen'/'GDK_WINDOW_OFFSCREEN'
enum Gtk2::Gdk::WindowTypeHint
'normal'/'GDK_WINDOW_TYPE_HINT_NORMAL''dialog'/'GDK_WINDOW_TYPE_HINT_DIALOG''menu'/'GDK_WINDOW_TYPE_HINT_MENU''toolbar'/'GDK_WINDOW_TYPE_HINT_TOOLBAR''splashscreen'/'GDK_WINDOW_TYPE_HINT_SPLASHSCREEN''utility'/'GDK_WINDOW_TYPE_HINT_UTILITY''dock'/'GDK_WINDOW_TYPE_HINT_DOCK''desktop'/'GDK_WINDOW_TYPE_HINT_DESKTOP''dropdown-menu'/'GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU''popup-menu'/'GDK_WINDOW_TYPE_HINT_POPUP_MENU''tooltip'/'GDK_WINDOW_TYPE_HINT_TOOLTIP''notification'/'GDK_WINDOW_TYPE_HINT_NOTIFICATION''combo'/'GDK_WINDOW_TYPE_HINT_COMBO''dnd'/'GDK_WINDOW_TYPE_HINT_DND'
π SEE ALSO π
Gtk2, Glib::Object, Gtk2::Gdk::Drawable
π COPYRIGHT π
Copyright (C) 2003-2011 by the gtk2-perl team.
This software is licensed under the LGPL. See Gtk2 for a full notice.
and that's a wrap bestie!! π this whole thing came out of perl v5.42.0, dated 2025-07-25, and it lives in the manpage Gtk2::Gdk::Window(3) β go forth and window, you absolute icon πβ¨
π¦ where this page comes from
- fedora 43: perl-Gtk2 1.24993-23.fc43 Β· LicenseRef-Callaway-LGPLv2+
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms