Merge branch 'master' into blender2.8
[blender.git] / source / blender / windowmanager / intern / wm_operators.c
index 4438bd1595fb709f2098823e94dbdf919423f6d7..dfe2a5407b195533c793795cda6701c98917f24f 100644 (file)
@@ -54,6 +54,7 @@
 #include "DNA_scene_types.h"
 #include "DNA_userdef_types.h"
 #include "DNA_windowmanager_types.h"
+#include "DNA_workspace_types.h"
 
 #include "BLT_translation.h"
 
@@ -72,7 +73,6 @@
 #include "BKE_blender_version.h"
 #include "BKE_brush.h"
 #include "BKE_context.h"
-#include "BKE_depsgraph.h"
 #include "BKE_icons.h"
 #include "BKE_idprop.h"
 #include "BKE_image.h"
 
 #include "BKE_idcode.h"
 
-#include "BIF_glutil.h" /* for paint cursor */
 #include "BLF_api.h"
 
+#include "GPU_immediate.h"
+#include "GPU_immediate_util.h"
+#include "GPU_matrix.h"
+
 #include "IMB_imbuf_types.h"
 #include "IMB_imbuf.h"
 
 #include "ED_undo.h"
 #include "ED_view3d.h"
 
-#include "GPU_basic_shader.h"
-
 #include "RNA_access.h"
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
@@ -336,7 +337,7 @@ bool WM_operator_pystring_abbreviate(char *str, int str_len_max)
 
 /* return NULL if no match is found */
 #if 0
-static const char *wm_context_member_from_ptr(bContext *C, PointerRNA *ptr)
+static const char *wm_context_member_from_ptr(bContext *C, const PointerRNA *ptr)
 {
        /* loop over all context items and do 2 checks
         *
@@ -391,7 +392,7 @@ static const char *wm_context_member_from_ptr(bContext *C, PointerRNA *ptr)
 
 /* use hard coded checks for now */
 
-static const char *wm_context_member_from_ptr(bContext *C, PointerRNA *ptr)
+static const char *wm_context_member_from_ptr(bContext *C, const PointerRNA *ptr)
 {
        const char *member_id = NULL;
 
@@ -439,7 +440,7 @@ static const char *wm_context_member_from_ptr(bContext *C, PointerRNA *ptr)
                switch (GS(((ID *)ptr->id.data)->name)) {
                        case ID_SCE:
                        {
-                               CTX_TEST_PTR_DATA_TYPE(C, "active_gpencil_brush", RNA_GPencilBrush, ptr, CTX_data_active_gpencil_brush(C));
+                               CTX_TEST_PTR_DATA_TYPE(C, "active_gpencil_brush", RNA_Brush, ptr, CTX_data_active_gpencil_brush(C));
                                CTX_TEST_PTR_ID(C, "scene", ptr->id.data);
                                break;
                        }
@@ -477,6 +478,8 @@ static const char *wm_context_member_from_ptr(bContext *C, PointerRNA *ptr)
                                SpaceLink *space_data = CTX_wm_space_data(C);
 
                                CTX_TEST_PTR_DATA_TYPE(C, "space_data", RNA_Space, ptr, space_data);
+                               CTX_TEST_PTR_DATA_TYPE(C, "space_data", RNA_View3DOverlay, ptr, space_data);
+                               CTX_TEST_PTR_DATA_TYPE(C, "space_data", RNA_View3DShading, ptr, space_data);
                                CTX_TEST_PTR_DATA_TYPE(C, "area", RNA_Area, ptr, CTX_wm_area(C));
                                CTX_TEST_PTR_DATA_TYPE(C, "region", RNA_Region, ptr, CTX_wm_region(C));
 
@@ -514,6 +517,11 @@ static char *wm_prop_pystring_from_context(bContext *C, PointerRNA *ptr, Propert
        return ret;
 }
 
+const char *WM_context_member_from_ptr(bContext *C, const PointerRNA *ptr)
+{
+       return wm_context_member_from_ptr(C, ptr);
+}
+
 char *WM_prop_pystring_assign(bContext *C, PointerRNA *ptr, PropertyRNA *prop, int index)
 {
        char *lhs, *rhs, *ret;
@@ -755,47 +763,71 @@ int WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
        return WM_menu_invoke_ex(C, op, WM_OP_INVOKE_REGION_WIN);
 }
 
+struct EnumSearchMenu {
+       wmOperator *op; /* the operator that will be executed when selecting an item */
+
+       bool use_previews;
+       short prv_cols, prv_rows;
+};
 
 /* generic enum search invoke popup */
-static uiBlock *wm_enum_search_menu(bContext *C, ARegion *ar, void *arg_op)
+static uiBlock *wm_enum_search_menu(bContext *C, ARegion *ar, void *arg)
 {
-       static char search[256] = "";
-       wmEvent event;
+       struct EnumSearchMenu *search_menu = arg;
        wmWindow *win = CTX_wm_window(C);
+       wmOperator *op = search_menu->op;
+       /* template_ID uses 4 * widget_unit for width, we use a bit more, some items may have a suffix to show */
+       const int width = search_menu->use_previews ? 5 * U.widget_unit * search_menu->prv_cols : UI_searchbox_size_x();
+       const int height = search_menu->use_previews ? 5 * U.widget_unit * search_menu->prv_rows : UI_searchbox_size_y();
+       static char search[256] = "";
        uiBlock *block;
        uiBut *but;
-       wmOperator *op = (wmOperator *)arg_op;
 
        block = UI_block_begin(C, ar, "_popup", UI_EMBOSS);
        UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_MOVEMOUSE_QUIT | UI_BLOCK_SEARCH_MENU);
        UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
 
        search[0] = '\0';
+       BLI_assert(search_menu->use_previews || (search_menu->prv_cols == 0 && search_menu->prv_rows == 0));
 #if 0 /* ok, this isn't so easy... */
        uiDefBut(block, UI_BTYPE_LABEL, 0, RNA_struct_ui_name(op->type->srna), 10, 10, UI_searchbox_size_x(), UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
 #endif
        but = uiDefSearchButO_ptr(block, op->type, op->ptr->data, search, 0, ICON_VIEWZOOM, sizeof(search),
-                                 10, 10, UI_searchbox_size_x(), UI_UNIT_Y, 0, 0, "");
+                                 10, 10, width, UI_UNIT_Y, search_menu->prv_rows, search_menu->prv_cols, "");
 
        /* fake button, it holds space for search items */
-       uiDefBut(block, UI_BTYPE_LABEL, 0, "", 10, 10 - UI_searchbox_size_y(), UI_searchbox_size_x(), UI_searchbox_size_y(), NULL, 0, 0, 0, 0, NULL);
+       uiDefBut(block, UI_BTYPE_LABEL, 0, "", 10, 10 - UI_searchbox_size_y(), width, height, NULL, 0, 0, 0, 0, NULL);
 
        UI_block_bounds_set_popup(block, 6, 0, -UI_UNIT_Y); /* move it downwards, mouse over button */
-
-       wm_event_init_from_window(win, &event);
-       event.type = EVT_BUT_OPEN;
-       event.val = KM_PRESS;
-       event.customdata = but;
-       event.customdatafree = false;
-       wm_event_add(win, &event);
+       UI_but_focus_on_enter_event(win, but);
 
        return block;
 }
 
+/**
+ * Similar to #WM_enum_search_invoke, but draws previews. Also, this can't
+ * be used as invoke callback directly since it needs additional info.
+ */
+int WM_enum_search_invoke_previews(
+        bContext *C, wmOperator *op, short prv_cols, short prv_rows)
+{
+       static struct EnumSearchMenu search_menu;
+
+       search_menu.op = op;
+       search_menu.use_previews = true;
+       search_menu.prv_cols = prv_cols;
+       search_menu.prv_rows = prv_rows;
+
+       UI_popup_block_invoke(C, wm_enum_search_menu, &search_menu);
+
+       return OPERATOR_INTERFACE;
+}
 
 int WM_enum_search_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
 {
-       UI_popup_block_invoke(C, wm_enum_search_menu, op);
+       static struct EnumSearchMenu search_menu;
+       search_menu.op = op;
+       UI_popup_block_invoke(C, wm_enum_search_menu, &search_menu);
        return OPERATOR_INTERFACE;
 }
 
@@ -888,6 +920,21 @@ wmOperator *WM_operator_last_redo(const bContext *C)
        return op;
 }
 
+IDProperty *WM_operator_last_properties_ensure_idprops(wmOperatorType *ot)
+{
+       if (ot->last_properties == NULL) {
+               IDPropertyTemplate val = {0};
+               ot->last_properties = IDP_New(IDP_GROUP, &val, "wmOperatorProperties");
+       }
+       return ot->last_properties;
+}
+
+void WM_operator_last_properties_ensure(wmOperatorType *ot, PointerRNA *ptr)
+{
+       IDProperty *props = WM_operator_last_properties_ensure_idprops(ot);
+       RNA_pointer_create(NULL, ot->srna, props, ptr);
+}
+
 /**
  * Use for drag & drop a path or name with operators invoke() function.
  */
@@ -999,13 +1046,17 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
 
        if (op->type->flag & OPTYPE_MACRO) {
                for (op = op->macro.first; op; op = op->next) {
-                       uiTemplateOperatorPropertyButs(C, layout, op, 'H', UI_TEMPLATE_OP_PROPS_SHOW_TITLE);
+                       uiTemplateOperatorPropertyButs(
+                               C, layout, op, UI_BUT_LABEL_ALIGN_SPLIT_COLUMN,
+                               UI_TEMPLATE_OP_PROPS_SHOW_TITLE);
                        if (op->next)
                                uiItemS(layout);
                }
        }
        else {
-               uiTemplateOperatorPropertyButs(C, layout, op, 'H', UI_TEMPLATE_OP_PROPS_SHOW_TITLE);
+               uiTemplateOperatorPropertyButs(
+                       C, layout, op, UI_BUT_LABEL_ALIGN_SPLIT_COLUMN,
+                       UI_TEMPLATE_OP_PROPS_SHOW_TITLE);
        }
 
        UI_block_bounds_set_popup(block, 4, 0, 0);
@@ -1075,7 +1126,9 @@ static uiBlock *wm_block_dialog_create(bContext *C, ARegion *ar, void *userData)
 
        layout = UI_block_layout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, data->width, data->height, 0, style);
 
-       uiTemplateOperatorPropertyButs(C, layout, op, 'H', UI_TEMPLATE_OP_PROPS_SHOW_TITLE);
+       uiTemplateOperatorPropertyButs(
+               C, layout, op, UI_BUT_LABEL_ALIGN_SPLIT_COLUMN,
+               UI_TEMPLATE_OP_PROPS_SHOW_TITLE);
 
        /* clear so the OK button is left alone */
        UI_block_func_set(block, NULL, NULL, NULL);
@@ -1115,7 +1168,7 @@ static uiBlock *wm_operator_ui_create(bContext *C, ARegion *ar, void *userData)
        layout = UI_block_layout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, data->width, data->height, 0, style);
 
        /* since ui is defined the auto-layout args are not used */
-       uiTemplateOperatorPropertyButs(C, layout, op, 'V', 0);
+       uiTemplateOperatorPropertyButs(C, layout, op, UI_BUT_LABEL_ALIGN_COLUMN, 0);
 
        UI_block_func_set(block, NULL, NULL, NULL);
 
@@ -1416,7 +1469,7 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
                        ibuf_template = IMB_loadiffname(splash_filepath, IB_rect, NULL);
                        if (ibuf_template) {
                                const int x_expect = ibuf->x;
-                               const int y_expect = 230 * (int)U.pixelsize;
+                               const int y_expect = 282 * (int)U.pixelsize;
                                /* don't cover the header text */
                                if (ibuf_template->x == x_expect && ibuf_template->y == y_expect) {
                                        memcpy(ibuf->rect, ibuf_template->rect, ibuf_template->x * ibuf_template->y * sizeof(char[4]));
@@ -1446,8 +1499,14 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
        UI_block_func_set(block, wm_block_splash_refreshmenu, block, NULL);
 
        /* label for 'a' bugfix releases, or 'Release Candidate 1'...
-        *  avoids recreating splash for version updates */
-       if (STREQ(STRINGIFY(BLENDER_VERSION_CYCLE), "rc")) {
+        * avoids recreating splash for version updates */
+       if (STREQ(STRINGIFY(BLENDER_VERSION_CYCLE), "alpha")) {
+               version_suffix = "Alpha 2";
+       }
+       else if (STREQ(STRINGIFY(BLENDER_VERSION_CYCLE), "beta")) {
+               version_suffix = "Beta";
+       }
+       else if (STREQ(STRINGIFY(BLENDER_VERSION_CYCLE), "rc")) {
                version_suffix = "Release Candidate";
        }
        else if (STREQ(STRINGIFY(BLENDER_VERSION_CYCLE), "release")) {
@@ -1456,8 +1515,8 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
        if (version_suffix != NULL && version_suffix[0]) {
                /* placed after the version number in the image,
                 * placing y is tricky to match baseline */
-               int x = 260 * U.pixelsize - (2 * UI_DPI_FAC);
-               int y = 242 * U.pixelsize + (4 * UI_DPI_FAC);
+               int x = 236 * U.pixelsize - (2 * UI_DPI_FAC);
+               int y = 231 * U.pixelsize + (4 * UI_DPI_FAC);
                int w = 240 * U.pixelsize;
 
                /* hack to have text draw 'text_sel' */
@@ -1470,17 +1529,32 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
 
 #ifdef WITH_BUILDINFO
        if (build_commit_timestamp != 0) {
-               uiDefBut(block, UI_BTYPE_LABEL, 0, date_buf, U.pixelsize * 494 - date_width, U.pixelsize * 270, date_width, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
+               but = uiDefBut(
+                         block, UI_BTYPE_LABEL, 0, date_buf,
+                         U.pixelsize * 502 - date_width, U.pixelsize * 267,
+                         date_width, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
+               /* XXX, set internal flag - UI_SELECT */
+               UI_but_flag_enable(but, 1);
                label_delta = 12;
        }
-       uiDefBut(block, UI_BTYPE_LABEL, 0, hash_buf, U.pixelsize * 494 - hash_width, U.pixelsize * (270 - label_delta), hash_width, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
+       but = uiDefBut(
+                 block, UI_BTYPE_LABEL, 0, hash_buf,
+                 U.pixelsize * 502 - hash_width, U.pixelsize * (267 - label_delta),
+                 hash_width, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
+       /* XXX, set internal flag - UI_SELECT */
+       UI_but_flag_enable(but, 1);
 
        if (!STREQ(build_branch, "master")) {
                char branch_buf[128] = "\0";
                int branch_width;
                BLI_snprintf(branch_buf, sizeof(branch_buf), "Branch: %s", build_branch);
                branch_width = (int)BLF_width(style->widgetlabel.uifont_id, branch_buf, sizeof(branch_buf)) + U.widget_unit;
-               uiDefBut(block, UI_BTYPE_LABEL, 0, branch_buf, U.pixelsize * 494 - branch_width, U.pixelsize * (258 - label_delta), branch_width, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
+               but = uiDefBut(
+                         block, UI_BTYPE_LABEL, 0, branch_buf,
+                         U.pixelsize * 502 - branch_width, U.pixelsize * (255 - label_delta),
+                         branch_width, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
+               /* XXX, set internal flag - UI_SELECT */
+               UI_but_flag_enable(but, 1);
        }
 #endif  /* WITH_BUILDINFO */
 
@@ -1500,28 +1574,19 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
        split = uiLayoutSplit(layout, 0.0f, false);
        col = uiLayoutColumn(split, false);
        uiItemL(col, IFACE_("Links"), ICON_NONE);
-#if 0
-       uiItemStringO(col, IFACE_("Support an Open Animation Movie"), ICON_URL, "WM_OT_url_open", "url",
-                     "https://cloud.blender.org/join");
-#endif
-       uiItemStringO(col, IFACE_("Donations"), ICON_URL, "WM_OT_url_open", "url",
-                     "http://www.blender.org/foundation/donation-payment/");
-       uiItemStringO(col, IFACE_("Credits"), ICON_URL, "WM_OT_url_open", "url",
-                     "http://www.blender.org/about/credits/");
-       BLI_snprintf(url, sizeof(url), "http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/%d.%d",
-                    BLENDER_VERSION / 100, BLENDER_VERSION % 100);
-       uiItemStringO(col, IFACE_("Release Log"), ICON_URL, "WM_OT_url_open", "url", url);
+       uiItemStringO(col, IFACE_("Join the Development Fund"), ICON_URL, "WM_OT_url_open", "url",
+                     "https://www.blender.org/foundation/development-fund/");
+       uiItemStringO(col, IFACE_("Donate"), ICON_URL, "WM_OT_url_open", "url",
+                     "https://www.blender.org/foundation/donation-payment/");
+       uiItemS(col);
        uiItemStringO(col, IFACE_("Manual"), ICON_URL, "WM_OT_url_open", "url",
                      "https://docs.blender.org/manual/en/dev/");
-       uiItemStringO(col, IFACE_("Blender Website"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org");
-       if (STREQ(STRINGIFY(BLENDER_VERSION_CYCLE), "release")) {
-               BLI_snprintf(url, sizeof(url), "https://docs.blender.org/api/%d.%d"STRINGIFY(BLENDER_VERSION_CHAR),
-                            BLENDER_VERSION / 100, BLENDER_VERSION % 100);
-       }
-       else {
-               BLI_snprintf(url, sizeof(url), "https://docs.blender.org/api/master");
-       }
-       uiItemStringO(col, IFACE_("Python API Reference"), ICON_URL, "WM_OT_url_open", "url", url);
+       BLI_snprintf(url, sizeof(url), "https://wiki.blender.org/wiki/Reference/Release_Notes/%d.%d",
+                    BLENDER_VERSION / 100, BLENDER_VERSION % 100);
+       uiItemStringO(col, IFACE_("Release Notes"), ICON_URL, "WM_OT_url_open", "url", url);
+       uiItemStringO(col, IFACE_("Blender Website"), ICON_URL, "WM_OT_url_open", "url", "https://www.blender.org");
+       uiItemStringO(col, IFACE_("Credits"), ICON_URL, "WM_OT_url_open", "url",
+                     "https://www.blender.org/about/credits/");
        uiItemL(col, "", ICON_NONE);
 
        col = uiLayoutColumn(split, false);
@@ -1712,6 +1777,34 @@ static void WM_OT_call_menu_pie(wmOperatorType *ot)
        RNA_def_string(ot->srna, "name", NULL, BKE_ST_MAXNAME, "Name", "Name of the pie menu");
 }
 
+static int wm_call_panel_exec(bContext *C, wmOperator *op)
+{
+       char idname[BKE_ST_MAXNAME];
+       RNA_string_get(op->ptr, "name", idname);
+       const bool keep_open = RNA_boolean_get(op->ptr, "keep_open");
+
+       return UI_popover_panel_invoke(C, idname, keep_open, op->reports);
+}
+
+static void WM_OT_call_panel(wmOperatorType *ot)
+{
+       ot->name = "Call Panel";
+       ot->idname = "WM_OT_call_panel";
+       ot->description = "Call (draw) a pre-defined panel";
+
+       ot->exec = wm_call_panel_exec;
+       ot->poll = WM_operator_winactive;
+
+       ot->flag = OPTYPE_INTERNAL;
+
+       PropertyRNA *prop;
+
+       prop = RNA_def_string(ot->srna, "name", NULL, BKE_ST_MAXNAME, "Name", "Name of the menu");
+       RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+       prop = RNA_def_boolean(ot->srna, "keep_open", true, "Keep Open", "");
+       RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+}
+
 /* ************ window / screen operator definitions ************** */
 
 /* this poll functions is needed in place of WM_operator_winactive
@@ -1719,8 +1812,11 @@ static void WM_OT_call_menu_pie(wmOperatorType *ot)
 static bool wm_operator_winactive_normal(bContext *C)
 {
        wmWindow *win = CTX_wm_window(C);
+       bScreen *screen;
 
-       if (win == NULL || win->screen == NULL || win->screen->state != SCREENNORMAL)
+       if (win == NULL)
+               return 0;
+       if (!((screen = WM_window_get_active_screen(win)) && (screen->state == SCREENNORMAL)))
                return 0;
 
        return 1;
@@ -1731,19 +1827,29 @@ static void WM_OT_window_close(wmOperatorType *ot)
 {
        ot->name = "Close Window";
        ot->idname = "WM_OT_window_close";
-       ot->description = "Close the current Blender window";
+       ot->description = "Close the current window";
 
        ot->exec = wm_window_close_exec;
        ot->poll = WM_operator_winactive;
 }
 
-static void WM_OT_window_duplicate(wmOperatorType *ot)
+static void WM_OT_window_new(wmOperatorType *ot)
+{
+       ot->name = "New Window";
+       ot->idname = "WM_OT_window_new";
+       ot->description = "Create a new window";
+
+       ot->exec = wm_window_new_exec;
+       ot->poll = wm_operator_winactive_normal;
+}
+
+static void WM_OT_window_new_main(wmOperatorType *ot)
 {
-       ot->name = "Duplicate Window";
-       ot->idname = "WM_OT_window_duplicate";
-       ot->description = "Duplicate the current Blender window";
+       ot->name = "New Main Window";
+       ot->idname = "WM_OT_window_new_main";
+       ot->description = "Create a new main window with its own workspace and scene selection";
 
-       ot->exec = wm_window_duplicate_exec;
+       ot->exec = wm_window_new_main_exec;
        ot->poll = wm_operator_winactive_normal;
 }
 
@@ -1875,38 +1981,37 @@ static void radial_control_update_header(wmOperator *op, bContext *C)
        ScrArea *sa = CTX_wm_area(C);
        Scene *scene = CTX_data_scene(C);
 
-       if (sa) {
-               if (hasNumInput(&rc->num_input)) {
-                       char num_str[NUM_STR_REP_LEN];
-                       outputNumInput(&rc->num_input, num_str, &scene->unit);
-                       BLI_snprintf(msg, sizeof(msg), "%s: %s", RNA_property_ui_name(rc->prop), num_str);
-               }
-               else {
-                       const char *ui_name = RNA_property_ui_name(rc->prop);
-                       switch (rc->subtype) {
-                               case PROP_NONE:
-                               case PROP_DISTANCE:
-                                       BLI_snprintf(msg, sizeof(msg), "%s: %0.4f", ui_name, rc->current_value);
-                                       break;
-                               case PROP_PIXEL:
-                                       BLI_snprintf(msg, sizeof(msg), "%s: %d", ui_name, (int)rc->current_value); /* XXX: round to nearest? */
-                                       break;
-                               case PROP_PERCENTAGE:
-                                       BLI_snprintf(msg, sizeof(msg), "%s: %3.1f%%", ui_name, rc->current_value);
-                                       break;
-                               case PROP_FACTOR:
-                                       BLI_snprintf(msg, sizeof(msg), "%s: %1.3f", ui_name, rc->current_value);
-                                       break;
-                               case PROP_ANGLE:
-                                       BLI_snprintf(msg, sizeof(msg), "%s: %3.2f", ui_name, RAD2DEGF(rc->current_value));
-                                       break;
-                               default:
-                                       BLI_snprintf(msg, sizeof(msg), "%s", ui_name); /* XXX: No value? */
-                                       break;
-                       }
+       if (hasNumInput(&rc->num_input)) {
+               char num_str[NUM_STR_REP_LEN];
+               outputNumInput(&rc->num_input, num_str, &scene->unit);
+               BLI_snprintf(msg, sizeof(msg), "%s: %s", RNA_property_ui_name(rc->prop), num_str);
+       }
+       else {
+               const char *ui_name = RNA_property_ui_name(rc->prop);
+               switch (rc->subtype) {
+                       case PROP_NONE:
+                       case PROP_DISTANCE:
+                               BLI_snprintf(msg, sizeof(msg), "%s: %0.4f", ui_name, rc->current_value);
+                               break;
+                       case PROP_PIXEL:
+                               BLI_snprintf(msg, sizeof(msg), "%s: %d", ui_name, (int)rc->current_value); /* XXX: round to nearest? */
+                               break;
+                       case PROP_PERCENTAGE:
+                               BLI_snprintf(msg, sizeof(msg), "%s: %3.1f%%", ui_name, rc->current_value);
+                               break;
+                       case PROP_FACTOR:
+                               BLI_snprintf(msg, sizeof(msg), "%s: %1.3f", ui_name, rc->current_value);
+                               break;
+                       case PROP_ANGLE:
+                               BLI_snprintf(msg, sizeof(msg), "%s: %3.2f", ui_name, RAD2DEGF(rc->current_value));
+                               break;
+                       default:
+                               BLI_snprintf(msg, sizeof(msg), "%s", ui_name); /* XXX: No value? */
+                               break;
                }
-               ED_area_headerprint(sa, msg);
        }
+
+       ED_area_status_text(sa, msg);
 }
 
 static void radial_control_set_initial_mouse(RadialControl *rc, const wmEvent *event)
@@ -1956,8 +2061,9 @@ static void radial_control_set_tex(RadialControl *rc)
                        if ((ibuf = BKE_brush_gen_radial_control_imbuf(rc->image_id_ptr.data, rc->use_secondary_tex))) {
                                glGenTextures(1, &rc->gltex);
                                glBindTexture(GL_TEXTURE_2D, rc->gltex);
-                               glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA8, ibuf->x, ibuf->y, 0,
-                                            GL_ALPHA, GL_FLOAT, ibuf->rect_float);
+                               glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, ibuf->x, ibuf->y, 0,
+                                            GL_RED, GL_FLOAT, ibuf->rect_float);
+                               glBindTexture(GL_TEXTURE_2D, 0);
                                MEM_freeN(ibuf->rect_float);
                                MEM_freeN(ibuf);
                        }
@@ -1990,49 +2096,69 @@ static void radial_control_paint_tex(RadialControl *rc, float radius, float alph
 
                RNA_property_float_get_array(fill_ptr, fill_prop, col);
        }
-       glColor4f(col[0], col[1], col[2], alpha);
+
+       GPUVertFormat *format = immVertexFormat();
+       uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
 
        if (rc->gltex) {
+
+               uint texCoord = GPU_vertformat_attr_add(format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+
+               glActiveTexture(GL_TEXTURE0);
                glBindTexture(GL_TEXTURE_2D, rc->gltex);
 
-               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+               GLint swizzleMask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED};
+               glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
+
+               immBindBuiltinProgram(GPU_SHADER_2D_IMAGE_MASK_UNIFORM_COLOR);
+
+               immUniformColor3fvAlpha(col, alpha);
+               immUniform1i("image", 0);
 
                /* set up rotation if available */
                if (rc->rot_prop) {
                        rot = RNA_property_float_get(&rc->rot_ptr, rc->rot_prop);
-                       glPushMatrix();
-                       glRotatef(RAD2DEGF(rot), 0, 0, 1);
+                       GPU_matrix_push();
+                       GPU_matrix_rotate_2d(RAD2DEGF(rot));
                }
 
                /* draw textured quad */
-               GPU_basic_shader_bind(GPU_SHADER_TEXTURE_2D | GPU_SHADER_USE_COLOR);
-               glBegin(GL_QUADS);
-               glTexCoord2f(0, 0);
-               glVertex2f(-radius, -radius);
-               glTexCoord2f(1, 0);
-               glVertex2f(radius, -radius);
-               glTexCoord2f(1, 1);
-               glVertex2f(radius, radius);
-               glTexCoord2f(0, 1);
-               glVertex2f(-radius, radius);
-               glEnd();
-               GPU_basic_shader_bind(GPU_SHADER_USE_COLOR);
+               immBegin(GPU_PRIM_TRI_FAN, 4);
+
+               immAttrib2f(texCoord, 0, 0);
+               immVertex2f(pos, -radius, -radius);
+
+               immAttrib2f(texCoord, 1, 0);
+               immVertex2f(pos, radius, -radius);
+
+               immAttrib2f(texCoord, 1, 1);
+               immVertex2f(pos, radius, radius);
+
+               immAttrib2f(texCoord, 0, 1);
+               immVertex2f(pos, -radius, radius);
+
+               immEnd();
 
                /* undo rotation */
                if (rc->rot_prop)
-                       glPopMatrix();
+                       GPU_matrix_pop();
        }
        else {
                /* flat color if no texture available */
-               glutil_draw_filled_arc(0, M_PI * 2, radius, 40);
+               immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+               immUniformColor3fvAlpha(col, alpha);
+               imm_draw_circle_fill_2d(pos, 0.0f, 0.0f, radius, 40);
        }
+
+       immUnbindProgram();
 }
 
-static void radial_control_paint_cursor(bContext *C, int x, int y, void *customdata)
+static void radial_control_paint_cursor(bContext *UNUSED(C), int x, int y, void *customdata)
 {
        RadialControl *rc = customdata;
-       ARegion *ar = CTX_wm_region(C);
        uiStyle *style = UI_style_get();
        const uiFontStyle *fstyle = &style->widget;
        const int fontid = fstyle->uifont_id;
@@ -2083,9 +2209,9 @@ static void radial_control_paint_cursor(bContext *C, int x, int y, void *customd
        }
 
        /* Keep cursor in the original place */
-       x = rc->initial_mouse[0] - ar->winrct.xmin;
-       y = rc->initial_mouse[1] - ar->winrct.ymin;
-       glTranslatef((float)x, (float)y, 0.0f);
+       x = rc->initial_mouse[0];
+       y = rc->initial_mouse[1];
+       GPU_matrix_translate_2f((float)x, (float)y);
 
        glEnable(GL_BLEND);
        glEnable(GL_LINE_SMOOTH);
@@ -2093,7 +2219,7 @@ static void radial_control_paint_cursor(bContext *C, int x, int y, void *customd
        /* apply zoom if available */
        if (rc->zoom_prop) {
                RNA_property_float_get_array(&rc->zoom_ptr, rc->zoom_prop, zoom);
-               glScalef(zoom[0], zoom[1], 1);
+               GPU_matrix_scale_2fv(zoom);
        }
 
        /* draw rotated texture */
@@ -2102,24 +2228,39 @@ static void radial_control_paint_cursor(bContext *C, int x, int y, void *customd
        /* set line color */
        if (rc->col_prop)
                RNA_property_float_get_array(&rc->col_ptr, rc->col_prop, col);
-       glColor4f(col[0], col[1], col[2], 0.5);
+
+       GPUVertFormat *format = immVertexFormat();
+       uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+
+       immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+       immUniformColor3fvAlpha(col, 0.5f);
 
        if (rc->subtype == PROP_ANGLE) {
-               glPushMatrix();
+               GPU_matrix_push();
+
                /* draw original angle line */
-               glRotatef(RAD2DEGF(rc->initial_value), 0, 0, 1);
-               fdrawline((float)WM_RADIAL_CONTROL_DISPLAY_MIN_SIZE, 0.0f, (float)WM_RADIAL_CONTROL_DISPLAY_SIZE, 0.0f);
+               GPU_matrix_rotate_2d(RAD2DEGF(rc->initial_value));
+               immBegin(GPU_PRIM_LINES, 2);
+               immVertex2f(pos, (float)WM_RADIAL_CONTROL_DISPLAY_MIN_SIZE, 0.0f);
+               immVertex2f(pos, (float)WM_RADIAL_CONTROL_DISPLAY_SIZE, 0.0f);
+               immEnd();
+
                /* draw new angle line */
-               glRotatef(RAD2DEGF(rc->current_value - rc->initial_value), 0, 0, 1);
-               fdrawline((float)WM_RADIAL_CONTROL_DISPLAY_MIN_SIZE, 0.0f, (float)WM_RADIAL_CONTROL_DISPLAY_SIZE, 0.0f);
-               glPopMatrix();
+               GPU_matrix_rotate_2d(RAD2DEGF(rc->current_value - rc->initial_value));
+               immBegin(GPU_PRIM_LINES, 2);
+               immVertex2f(pos, (float)WM_RADIAL_CONTROL_DISPLAY_MIN_SIZE, 0.0f);
+               immVertex2f(pos, (float)WM_RADIAL_CONTROL_DISPLAY_SIZE, 0.0f);
+               immEnd();
+
+               GPU_matrix_pop();
        }
 
        /* draw circles on top */
-       glutil_draw_lined_arc(0.0, (float)(M_PI * 2.0), r1, 40);
-       glutil_draw_lined_arc(0.0, (float)(M_PI * 2.0), r2, 40);
+       imm_draw_circle_wire_2d(pos, 0.0f, 0.0f, r1, 40);
+       imm_draw_circle_wire_2d(pos, 0.0f, 0.0f, r2, 40);
        if (rmin > 0.0f)
-               glutil_draw_lined_arc(0.0, (float)(M_PI * 2.0), rmin, 40);
+               imm_draw_circle_wire_2d(pos, 0.0, 0.0f, rmin, 40);
+       immUnbindProgram();
 
        BLF_size(fontid, 1.5 * fstyle_points * U.pixelsize, U.dpi);
        BLF_enable(fontid, BLF_SHADOW);
@@ -2135,6 +2276,7 @@ static void radial_control_paint_cursor(bContext *C, int x, int y, void *customd
 
        glDisable(GL_BLEND);
        glDisable(GL_LINE_SMOOTH);
+
 }
 
 typedef enum {
@@ -2403,9 +2545,7 @@ static void radial_control_cancel(bContext *C, wmOperator *op)
                rc->dial = NULL;
        }
 
-       if (sa) {
-               ED_area_headerprint(sa, NULL);
-       }
+       ED_area_status_text(sa, NULL);
 
        WM_paint_cursor_end(wm, rc->cursor);
 
@@ -2707,6 +2847,7 @@ static const EnumPropertyItem redraw_timer_type_items[] = {
 
 static void redraw_timer_step(
         bContext *C, Main *bmain, Scene *scene,
+        struct Depsgraph *depsgraph,
         wmWindow *win, ScrArea *sa, ARegion *ar,
         const int type, const int cfra)
 {
@@ -2725,16 +2866,17 @@ static void redraw_timer_step(
                CTX_wm_window_set(C, win);  /* XXX context manipulation warning! */
        }
        else if (type == eRTDrawWindow) {
+               bScreen *screen = WM_window_get_active_screen(win);
                ScrArea *sa_iter;
 
                CTX_wm_menu_set(C, NULL);
 
-               for (sa_iter = win->screen->areabase.first; sa_iter; sa_iter = sa_iter->next) {
+               for (sa_iter = screen->areabase.first; sa_iter; sa_iter = sa_iter->next) {
                        ARegion *ar_iter;
                        CTX_wm_area_set(C, sa_iter);
 
                        for (ar_iter = sa_iter->regionbase.first; ar_iter; ar_iter = ar_iter->next) {
-                               if (ar_iter->swinid) {
+                               if (ar_iter->visible) {
                                        CTX_wm_region_set(C, ar_iter);
                                        ED_region_do_draw(C, ar_iter);
                                        ar_iter->do_draw = false;
@@ -2752,7 +2894,7 @@ static void redraw_timer_step(
        }
        else if (type == eRTAnimationStep) {
                scene->r.cfra += (cfra == scene->r.cfra) ? 1 : -1;
-               BKE_scene_update_for_newframe(bmain->eval_ctx, bmain, scene, scene->lay);
+               BKE_scene_graph_update_for_newframe(depsgraph, bmain);
        }
        else if (type == eRTAnimationPlay) {
                /* play anim, return on same frame as started with */
@@ -2764,7 +2906,7 @@ static void redraw_timer_step(
                        if (scene->r.cfra > scene->r.efra)
                                scene->r.cfra = scene->r.sfra;
 
-                       BKE_scene_update_for_newframe(bmain->eval_ctx, bmain, scene, scene->lay);
+                       BKE_scene_graph_update_for_newframe(depsgraph, bmain);
                        redraw_timer_window_swap(C);
                }
        }
@@ -2788,13 +2930,14 @@ static int redraw_timer_exec(bContext *C, wmOperator *op)
        const int cfra = scene->r.cfra;
        int a, iter_steps = 0;
        const char *infostr = "";
+       struct Depsgraph *depsgraph = CTX_data_depsgraph(C);
 
        WM_cursor_wait(1);
 
        time_start = PIL_check_seconds_timer();
 
        for (a = 0; a < iter; a++) {
-               redraw_timer_step(C, bmain, scene, win, sa, ar, type, cfra);
+               redraw_timer_step(C, bmain, scene, depsgraph, win, sa, ar, type, cfra);
                iter_steps += 1;
 
                if (time_limit != 0.0) {
@@ -2852,28 +2995,6 @@ static void WM_OT_memory_statistics(wmOperatorType *ot)
        ot->exec = memory_statistics_exec;
 }
 
-/* ************************** memory statistics for testing ***************** */
-
-static int dependency_relations_exec(bContext *C, wmOperator *UNUSED(op))
-{
-       Main *bmain = CTX_data_main(C);
-       Scene *scene = CTX_data_scene(C);
-       Object *ob = CTX_data_active_object(C);
-
-       DAG_print_dependencies(bmain, scene, ob);
-
-       return OPERATOR_FINISHED;
-}
-
-static void WM_OT_dependency_relations(wmOperatorType *ot)
-{
-       ot->name = "Dependency Relations";
-       ot->idname = "WM_OT_dependency_relations";
-       ot->description = "Print dependency graph relations to the console";
-
-       ot->exec = dependency_relations_exec;
-}
-
 /* *************************** Mat/tex/etc. previews generation ************* */
 
 typedef struct PreviewsIDEnsureData {
@@ -2966,7 +3087,7 @@ static const EnumPropertyItem preview_id_type_items[] = {
     {FILTER_ID_GR, "GROUP", 0, "Groups", ""},
     {FILTER_ID_OB, "OBJECT", 0, "Objects", ""},
     {FILTER_ID_MA, "MATERIAL", 0, "Materials", ""},
-    {FILTER_ID_LA, "LAMP", 0, "Lamps", ""},
+    {FILTER_ID_LA, "LIGHT", 0, "Lights", ""},
     {FILTER_ID_WO, "WORLD", 0, "Worlds", ""},
     {FILTER_ID_TE, "TEXTURE", 0, "Textures", ""},
     {FILTER_ID_IM, "IMAGE", 0, "Images", ""},
@@ -2979,7 +3100,7 @@ static const EnumPropertyItem preview_id_type_items[] = {
 static int previews_clear_exec(bContext *C, wmOperator *op)
 {
        Main *bmain = CTX_data_main(C);
-       ListBase *lb[] = {&bmain->object, &bmain->group,
+       ListBase *lb[] = {&bmain->object, &bmain->collection,
                          &bmain->mat, &bmain->world, &bmain->lamp, &bmain->tex, &bmain->image, NULL};
        int i;
 
@@ -3056,8 +3177,6 @@ static void WM_OT_doc_view_manual_ui_context(wmOperatorType *ot)
        ot->exec = doc_view_manual_ui_context_exec;
 }
 
-/* ******************************************************* */
-
 /* ******************************************************* */
 /* toggle 3D for current window, turning it fullscreen if needed */
 static void WM_OT_stereo3d_set(wmOperatorType *ot)
@@ -3092,7 +3211,8 @@ static void WM_OT_stereo3d_set(wmOperatorType *ot)
 void wm_operatortypes_register(void)
 {
        WM_operatortype_append(WM_OT_window_close);
-       WM_operatortype_append(WM_OT_window_duplicate);
+       WM_operatortype_append(WM_OT_window_new);
+       WM_operatortype_append(WM_OT_window_new_main);
        WM_operatortype_append(WM_OT_read_history);
        WM_operatortype_append(WM_OT_read_homefile);
        WM_operatortype_append(WM_OT_read_factory_settings);
@@ -3114,13 +3234,13 @@ void wm_operatortypes_register(void)
        WM_operatortype_append(WM_OT_save_mainfile);
        WM_operatortype_append(WM_OT_redraw_timer);
        WM_operatortype_append(WM_OT_memory_statistics);
-       WM_operatortype_append(WM_OT_dependency_relations);
        WM_operatortype_append(WM_OT_debug_menu);
        WM_operatortype_append(WM_OT_operator_defaults);
        WM_operatortype_append(WM_OT_splash);
        WM_operatortype_append(WM_OT_search_menu);
        WM_operatortype_append(WM_OT_call_menu);
        WM_operatortype_append(WM_OT_call_menu_pie);
+       WM_operatortype_append(WM_OT_call_panel);
        WM_operatortype_append(WM_OT_radial_control);
        WM_operatortype_append(WM_OT_stereo3d_set);
 #if defined(WIN32)
@@ -3129,6 +3249,10 @@ void wm_operatortypes_register(void)
        WM_operatortype_append(WM_OT_previews_ensure);
        WM_operatortype_append(WM_OT_previews_clear);
        WM_operatortype_append(WM_OT_doc_view_manual_ui_context);
+
+       /* gizmos */
+       WM_operatortype_append(GIZMOGROUP_OT_gizmo_select);
+       WM_operatortype_append(GIZMOGROUP_OT_gizmo_tweak);
 }
 
 /* circleselect-like modal operators */
@@ -3331,50 +3455,73 @@ void wm_window_keymap(wmKeyConfig *keyconf)
        wmKeyMapItem *kmi;
 
        /* note, this doesn't replace existing keymap items */
-       WM_keymap_verify_item(keymap, "WM_OT_window_duplicate", WKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
+#ifdef USE_WM_KEYMAP_27X
+       WM_keymap_verify_item(keymap, "WM_OT_window_new", WKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
+#endif
+
 #ifdef __APPLE__
        WM_keymap_add_item(keymap, "WM_OT_read_homefile", NKEY, KM_PRESS, KM_OSKEY, 0);
-       WM_keymap_add_menu(keymap, "INFO_MT_file_open_recent", OKEY, KM_PRESS, KM_SHIFT | KM_OSKEY, 0);
+       WM_keymap_add_menu(keymap, "TOPBAR_MT_file_open_recent", OKEY, KM_PRESS, KM_SHIFT | KM_OSKEY, 0);
        WM_keymap_add_item(keymap, "WM_OT_open_mainfile", OKEY, KM_PRESS, KM_OSKEY, 0);
        WM_keymap_add_item(keymap, "WM_OT_save_mainfile", SKEY, KM_PRESS, KM_OSKEY, 0);
        WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", SKEY, KM_PRESS, KM_SHIFT | KM_OSKEY, 0);
        WM_keymap_add_item(keymap, "WM_OT_quit_blender", QKEY, KM_PRESS, KM_OSKEY, 0);
 #endif
        WM_keymap_add_item(keymap, "WM_OT_read_homefile", NKEY, KM_PRESS, KM_CTRL, 0);
+#ifdef USE_WM_KEYMAP_27X
        WM_keymap_add_item(keymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0);
-       WM_keymap_add_menu(keymap, "INFO_MT_file_open_recent", OKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
+#endif
+       WM_keymap_add_menu(keymap, "TOPBAR_MT_file_open_recent", OKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
        WM_keymap_add_item(keymap, "WM_OT_open_mainfile", OKEY, KM_PRESS, KM_CTRL, 0);
+#ifdef USE_WM_KEYMAP_27X
        WM_keymap_add_item(keymap, "WM_OT_open_mainfile", F1KEY, KM_PRESS, 0, 0);
        WM_keymap_add_item(keymap, "WM_OT_link", OKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
        WM_keymap_add_item(keymap, "WM_OT_append", F1KEY, KM_PRESS, KM_SHIFT, 0);
+#endif
 
        WM_keymap_add_item(keymap, "WM_OT_save_mainfile", SKEY, KM_PRESS, KM_CTRL, 0);
+#ifdef USE_WM_KEYMAP_27X
        WM_keymap_add_item(keymap, "WM_OT_save_mainfile", WKEY, KM_PRESS, KM_CTRL, 0);
+#endif
        WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", SKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
+#ifdef USE_WM_KEYMAP_27X
        WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", F2KEY, KM_PRESS, 0, 0);
        kmi = WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", SKEY, KM_PRESS, KM_ALT | KM_CTRL, 0);
        RNA_boolean_set(kmi->ptr, "copy", true);
 
        WM_keymap_verify_item(keymap, "WM_OT_window_fullscreen_toggle", F11KEY, KM_PRESS, KM_ALT, 0);
+#endif
+
        WM_keymap_add_item(keymap, "WM_OT_quit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
 
+       /* F-Keys are a hassle on some macos systems. */
+#ifdef __APPLE__
+       WM_keymap_add_item(keymap, "WM_OT_search_menu", FKEY, KM_PRESS, KM_OSKEY, 0);
+#endif
+
+#ifdef USE_WM_KEYMAP_27X
        WM_keymap_add_item(keymap, "WM_OT_doc_view_manual_ui_context", F1KEY, KM_PRESS, KM_ALT, 0);
 
        /* debug/testing */
        WM_keymap_verify_item(keymap, "WM_OT_redraw_timer", TKEY, KM_PRESS, KM_ALT | KM_CTRL, 0);
        WM_keymap_verify_item(keymap, "WM_OT_debug_menu", DKEY, KM_PRESS, KM_ALT | KM_CTRL, 0);
+#else
+       WM_keymap_add_item(keymap, "WM_OT_doc_view_manual_ui_context", F1KEY, KM_PRESS, 0, 0);
+       WM_keymap_add_menu(keymap, "TOPBAR_MT_file_specials", F2KEY, KM_PRESS, 0, 0);
+       WM_keymap_add_item(keymap, "WM_OT_search_menu", F3KEY, KM_PRESS, 0, 0);
+       WM_keymap_add_menu(keymap, "TOPBAR_MT_window_specials", F4KEY, KM_PRESS, 0, 0);
+#endif
 
        /* menus that can be accessed anywhere in blender */
-       WM_keymap_verify_item(keymap, "WM_OT_search_menu", SPACEKEY, KM_PRESS, 0, 0);
+       WM_keymap_add_menu(keymap, "SCREEN_MT_user_menu", QKEY, KM_PRESS, 0, 0);
+
 #ifdef WITH_INPUT_NDOF
        WM_keymap_add_menu(keymap, "USERPREF_MT_ndof_settings", NDOF_BUTTON_MENU, KM_PRESS, 0, 0);
 #endif
 
-       /* Space switching */
-       kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F2KEY, KM_PRESS, KM_SHIFT, 0); /* new in 2.5x, was DXF export */
-       RNA_string_set(kmi->ptr, "data_path", "area.type");
-       RNA_string_set(kmi->ptr, "value", "LOGIC_EDITOR");
+       WM_keymap_add_item(keymap, "WM_OT_toolbar", SPACEKEY, KM_PRESS, 0, 0);
 
+       /* Space switching */
        kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F3KEY, KM_PRESS, KM_SHIFT, 0);
        RNA_string_set(kmi->ptr, "data_path", "area.type");
        RNA_string_set(kmi->ptr, "value", "NODE_EDITOR");
@@ -3435,6 +3582,7 @@ void wm_window_keymap(wmKeyConfig *keyconf)
        RNA_float_set(kmi->ptr, "value", 1.0f / 1.5f);
 #endif /* WITH_INPUT_NDOF */
 
+       wm_gizmos_keymap(keyconf);
        gesture_circle_modal_keymap(keyconf);
        gesture_border_modal_keymap(keyconf);
        gesture_zoom_border_modal_keymap(keyconf);
@@ -3490,13 +3638,13 @@ const EnumPropertyItem *RNA_action_local_itemf(bContext *C, PointerRNA *ptr, Pro
 }
 #endif
 
-const EnumPropertyItem *RNA_group_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
+const EnumPropertyItem *RNA_collection_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
 {
-       return rna_id_itemf(C, ptr, r_free, C ? (ID *)CTX_data_main(C)->group.first : NULL, false, NULL, NULL);
+       return rna_id_itemf(C, ptr, r_free, C ? (ID *)CTX_data_main(C)->collection.first : NULL, false, NULL, NULL);
 }
-const EnumPropertyItem *RNA_group_local_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
+const EnumPropertyItem *RNA_collection_local_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
 {
-       return rna_id_itemf(C, ptr, r_free, C ? (ID *)CTX_data_main(C)->group.first : NULL, true, NULL, NULL);
+       return rna_id_itemf(C, ptr, r_free, C ? (ID *)CTX_data_main(C)->collection.first : NULL, true, NULL, NULL);
 }
 
 const EnumPropertyItem *RNA_image_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)