| // 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 <math.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <X11/Xlib.h> |
| #include <X11/Xutil.h> |
| |
| #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; |
| } |