UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2016 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <stdio.h> 30 #include <stdlib.h> 31 32 #include "range.h" 33 #include "container.h" 34 #include <ucx/mempool.h> 35 #include "../common/context.h" 36 #include "../common/object.h" 37 38 39 static UIWIDGET ui_scrollbar(UiObject *obj, UiOrientation orientation, UiRange *range, ui_callback f, void *userdata) { 40 UiContainer *ct = uic_get_current_container(obj); 41 42 int n = 0; 43 Arg args[16]; 44 XtSetArg(args[n], XmNorientation, orientation == UI_HORIZONTAL ? XmHORIZONTAL : XmVERTICAL); 45 n++; 46 XtSetArg (args[n], XmNmaximum, 10); 47 n++; 48 XtSetArg (args[n], XmNsliderSize, 1); 49 n++; 50 Widget parent = ct->prepare(ct, args, &n, FALSE); 51 Widget scrollbar = XmCreateScrollBar(parent, "scrollbar", args, n); 52 XtManageChild(scrollbar); 53 ct->add(ct, scrollbar); 54 55 if(range) { 56 range->get = ui_scrollbar_get; 57 range->set = ui_scrollbar_set; 58 range->setrange = ui_scrollbar_setrange; 59 range->setextent = ui_scrollbar_setextent; 60 range->obj = scrollbar; 61 } 62 63 if(f) { 64 UiEventData *event = ucx_mempool_malloc( 65 obj->ctx->mempool, 66 sizeof(UiEventData)); 67 event->obj = obj; 68 event->userdata = userdata; 69 event->callback = f; 70 event->value = 0; 71 XtAddCallback( 72 scrollbar, 73 XmNvalueChangedCallback, 74 (XtCallbackProc)ui_scrollbar_callback, 75 event); 76 } 77 78 return scrollbar; 79 } 80 81 UIWIDGET ui_hscrollbar(UiObject *obj, UiRange *range, ui_callback f, void *userdata) { 82 return ui_scrollbar(obj, UI_HORIZONTAL, range, f, userdata); 83 } 84 85 UIWIDGET ui_vscrollbar(UiObject *obj, UiRange *range, ui_callback f, void *userdata) { 86 return ui_scrollbar(obj, UI_VERTICAL, range, f, userdata); 87 } 88 89 void ui_scrollbar_callback(Widget scrollbar, UiEventData *event, XtPointer cdata) { 90 UiEvent e; 91 e.obj = event->obj; 92 e.window = event->obj->window; 93 e.document = event->obj->ctx->document; 94 e.intval = event->value; 95 event->callback(&e, event->userdata); 96 } 97 98 double ui_scrollbar_get(UiRange *range) { 99 int intval; 100 XtVaGetValues( 101 range->obj, 102 XmNvalue, 103 &intval, 104 NULL); 105 double value = (double)intval / 10; 106 range->value = value; 107 return value; 108 } 109 110 void ui_scrollbar_set(UiRange *range, double value) { 111 XtVaSetValues( 112 range->obj, 113 XmNvalue, 114 (int)(value * 10), 115 NULL); 116 range->value = value; 117 } 118 119 void ui_scrollbar_setrange(UiRange *range, double min, double max) { 120 XtVaSetValues( 121 range->obj, 122 XmNminimum, 123 (int)(min * 10), 124 XmNmaximum, 125 (int)(max * 10), 126 NULL); 127 range->min = min; 128 range->max = max; 129 } 130 131 void ui_scrollbar_setextent(UiRange *range, double extent) { 132 XtVaSetValues( 133 range->obj, 134 XmNsliderSize, 135 (int)(extent * 10), 136 NULL); 137 range->extent = extent; 138 } 139