// Copyright 2018 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include #include #include #include #include "base/command_line.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "brillo/syslog_logging.h" constexpr char kBgColorFlag[] = "bgcolor"; constexpr char kWidthFlag[] = "width"; constexpr char kHeightFlag[] = "height"; constexpr char kTitleFlag[] = "title"; // Creates an X window the same size as the display and fills its background // with a solid color that can be specified as the only parameter (in hex or // base 10). Closes on any keypress. int main(int argc, char* argv[]) { brillo::InitLog(brillo::kLogToSyslog); LOG(INFO) << "Starting x11_demo application"; base::CommandLine::Init(argc, argv); base::CommandLine* cl = base::CommandLine::ForCurrentProcess(); uint32_t bgcolor = 0x99EE44; if (cl->HasSwitch(kBgColorFlag)) { bgcolor = strtoul(cl->GetSwitchValueASCII(kBgColorFlag).c_str(), nullptr, 0); } std::string title = "x11_demo"; if (cl->HasSwitch(kTitleFlag)) { title = cl->GetSwitchValueASCII(kTitleFlag); } Display* dpy = XOpenDisplay(nullptr); if (!dpy) { LOG(ERROR) << "Failed opening display"; return -1; } int screen = DefaultScreen(dpy); Window win; int x, y; unsigned int width, height, border, depth; if (XGetGeometry(dpy, RootWindow(dpy, screen), &win, &x, &y, &width, &height, &border, &depth) == 0) { LOG(ERROR) << "Failed getting screen geometry"; return -1; } if (cl->HasSwitch(kWidthFlag)) { if (!base::StringToUint(cl->GetSwitchValueASCII(kWidthFlag), &width)) { LOG(ERROR) << "Invalid width parameter passed"; return -1; } } if (cl->HasSwitch(kHeightFlag)) { if (!base::StringToUint(cl->GetSwitchValueASCII(kHeightFlag), &height)) { LOG(ERROR) << "Invalid height parameter passed"; return -1; } } win = XCreateSimpleWindow(dpy, RootWindow(dpy, screen), x, y, width, height, 0, 0 /* black */, bgcolor); XClassHint* wmclass_hint = XAllocClassHint(); wmclass_hint->res_name = wmclass_hint->res_class = strdup(title.c_str()); XSetClassHint(dpy, win, wmclass_hint); XSelectInput(dpy, win, KeyPressMask); XMapWindow(dpy, win); XStoreName(dpy, win, title.c_str()); LOG(INFO) << "x11_demo application displaying, waiting for keypress"; XEvent evt; for (;;) { XNextEvent(dpy, &evt); if (evt.type == KeyPress) { LOG(INFO) << "x11_demo application detected keypress"; break; } } XCloseDisplay(dpy); LOG(INFO) << "x11_demo application exiting"; return 0; }