Index: wp-includes/widgets.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- wp-includes/widgets.php	(revision 1bad16273e06d8506bb7b9ecfadc9f35c9d030e4)
+++ wp-includes/widgets.php	(revision )
@@ -23,7 +23,7 @@
 //
 
 /** @ignore */
-global $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates;
+global $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates, $wp_current_widget;
 
 /**
  * Stores the sidebars, since many themes can have more than one.
@@ -54,6 +54,13 @@
 $wp_registered_widget_updates = array();
 
 /**
+ * @since 4.5.0
+ *
+ * @global array $wp_current_widget
+ */
+$wp_current_widget = array();
+
+/**
  * Private
  *
  * @global array $_wp_sidebars_widgets
@@ -95,6 +102,47 @@
 //
 
 /**
+ * Get option from current widget array
+ *
+ * @since 4.5.0
+ *
+ * @param string $option Option to get from current widget
+ *
+ * @return bool|string
+ */
+function _get_current_widget_option( $option ) {
+	global $wp_current_widget;
+
+	if ( isset( $wp_current_widget[ $option ] ) ) {
+		return $wp_current_widget[ $option ];
+	}
+
+	return false;
+}
+
+/**
+ * Get current widget id
+ *
+ * @since 4.5.0
+ *
+ * @return bool|string
+ */
+function current_widget_id() {
+	return _get_current_widget_option( 'widget_id' );
+}
+
+/**
+ * Get current widget id base
+ *
+ * @since 4.5.0
+ *
+ * @return bool|string
+ */
+function current_widget() {
+	return _get_current_widget_option( 'id_base' );
+}
+
+/**
  * Register a widget
  *
  * Registers a WP_Widget widget
@@ -1017,6 +1065,7 @@
  * @since 2.8.0
  *
  * @global WP_Widget_Factory $wp_widget_factory
+ * @global array $wp_current_widget
  *
  * @param string $widget   The widget's PHP class name (see class-wp-widget.php).
  * @param array  $instance Optional. The widget's instance settings. Default empty array.
@@ -1034,7 +1083,7 @@
  * }
  */
 function the_widget( $widget, $instance = array(), $args = array() ) {
-	global $wp_widget_factory;
+	global $wp_widget_factory, $wp_current_widget;
 
 	$widget_obj = $wp_widget_factory->widgets[$widget];
 	if ( ! ( $widget_obj instanceof WP_Widget ) ) {
@@ -1064,7 +1113,12 @@
 	do_action( 'the_widget', $widget, $instance, $args );
 
 	$widget_obj->_set(-1);
+
+	$wp_current_widget = array( 'id_base' => $this->id_base, 'widget_id' => $args['widget_id'] );
+
 	$widget_obj->widget($args, $instance);
+
+	$wp_current_widget = array();
 }
 
 /**
Index: wp-includes/class-wp-widget.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- wp-includes/class-wp-widget.php	(revision 1bad16273e06d8506bb7b9ecfadc9f35c9d030e4)
+++ wp-includes/class-wp-widget.php	(revision )
@@ -315,6 +315,8 @@
 	 * @since 2.8.0
 	 * @access public
 	 *
+	 * @global array $wp_current_widget
+	 *
 	 * @param array     $args        Display arguments. See {@see WP_Widget::widget()} for information
 	 *                               on accepted arguments.
 	 * @param int|array $widget_args {
@@ -325,6 +327,8 @@
 	 * }
 	 */
 	public function display_callback( $args, $widget_args = 1 ) {
+		global $wp_current_widget;
+
 		if ( is_numeric( $widget_args ) ) {
 			$widget_args = array( 'number' => $widget_args );
 		}
@@ -358,7 +362,11 @@
 				wp_suspend_cache_addition( true );
 			}
 
+			$wp_current_widget = array( 'id_base' => $this->id_base, 'widget_id' => $args['widget_id'] );
+
 			$this->widget( $args, $instance );
+
+			$wp_current_widget = array();
 
 			if ( $this->is_preview() ) {
 				wp_suspend_cache_addition( $was_cache_addition_suspended );
